diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml
index 20062064f..0eedbc712 100644
--- a/.github/workflows/gh-pages.yml
+++ b/.github/workflows/gh-pages.yml
@@ -44,7 +44,7 @@ env:
# ----------------------------------------------------------------------------
# Specify the deployment environment: staging or production
HUGO_ENVIRONMENT: ${{ vars.HUGO_ENVIRONMENT || 'staging' }}
- HUGO_VERSION: 0.144.2
+ HUGO_VERSION: 0.155.3
jobs:
# ----------------------------------------------------------------------------
diff --git a/static/css/prism.css b/assets/css/prism.css
similarity index 100%
rename from static/css/prism.css
rename to assets/css/prism.css
diff --git a/static/icons/logo.svg b/assets/icons/logo.svg
similarity index 100%
rename from static/icons/logo.svg
rename to assets/icons/logo.svg
diff --git a/static/js/prism.js b/assets/js/prism.js
similarity index 100%
rename from static/js/prism.js
rename to assets/js/prism.js
diff --git a/assets/js/search-text-fragment.js b/assets/js/search-text-fragment.js
new file mode 100644
index 000000000..12c8bf3f9
--- /dev/null
+++ b/assets/js/search-text-fragment.js
@@ -0,0 +1,81 @@
+/**
+ * Text Fragment Enhancement for Google Programmable Search Engine
+ *
+ * This script intercepts clicks on GCSE search result links and adds
+ * text fragment highlighting (#:~:text=...) to navigate users directly
+ * to the relevant content on the target page.
+ *
+ * Text fragments are supported in Chrome 80+, Edge 80+, and other
+ * Chromium-based browsers. Firefox and Safari have limited support.
+ */
+
+(function() {
+ 'use strict';
+
+ // Get the search query from the URL
+ function getSearchQuery() {
+ const params = new URLSearchParams(window.location.search);
+ return params.get('q') || '';
+ }
+
+ // Create a text fragment from search terms
+ function createTextFragment(query) {
+ if (!query) return '';
+
+ // Clean and encode the query for use in text fragment
+ // Use the first few significant words (avoid very long fragments)
+ const words = query.trim().split(/\s+/).slice(0, 5);
+ const fragment = words.join(' ');
+
+ return '#:~:text=' + encodeURIComponent(fragment);
+ }
+
+ // Check if browser supports text fragments
+ function supportsTextFragments() {
+ return 'fragmentDirective' in document ||
+ // Chrome/Edge support detection
+ (navigator.userAgent.includes('Chrome') || navigator.userAgent.includes('Edg'));
+ }
+
+ // Intercept clicks on GCSE result links
+ function setupLinkInterception() {
+ const query = getSearchQuery();
+ if (!query || !supportsTextFragments()) return;
+
+ const textFragment = createTextFragment(query);
+
+ // Use event delegation since GCSE results are loaded dynamically
+ document.addEventListener('click', function(event) {
+ // Find if click was on a GCSE result link
+ const link = event.target.closest('.gs-title a, a.gs-title');
+ if (!link) return;
+
+ const href = link.getAttribute('href');
+ if (!href) return;
+
+ // Only modify links to our own site
+ const currentHost = window.location.hostname;
+ try {
+ const linkUrl = new URL(href, window.location.origin);
+ if (linkUrl.hostname !== currentHost) return;
+
+ // Don't add fragment if one already exists
+ if (linkUrl.hash && !linkUrl.hash.startsWith('#:~:text=')) return;
+
+ // Modify the link to include text fragment
+ event.preventDefault();
+ const newUrl = href.split('#')[0] + textFragment;
+ window.location.href = newUrl;
+ } catch (e) {
+ // Invalid URL, let it proceed normally
+ }
+ }, true);
+ }
+
+ // Initialize when DOM is ready
+ if (document.readyState === 'loading') {
+ document.addEventListener('DOMContentLoaded', setupLinkInterception);
+ } else {
+ setupLinkInterception();
+ }
+})();
diff --git a/static/js/vendor/dompurify/purify.min.js b/assets/js/vendor/dompurify/purify.min.js
similarity index 100%
rename from static/js/vendor/dompurify/purify.min.js
rename to assets/js/vendor/dompurify/purify.min.js
diff --git a/static/js/vendor/prettier/plugins/html.js b/assets/js/vendor/prettier/plugins/html.js
similarity index 100%
rename from static/js/vendor/prettier/plugins/html.js
rename to assets/js/vendor/prettier/plugins/html.js
diff --git a/static/js/vendor/prettier/standalone.js b/assets/js/vendor/prettier/standalone.js
similarity index 100%
rename from static/js/vendor/prettier/standalone.js
rename to assets/js/vendor/prettier/standalone.js
diff --git a/assets/scss/_styles_project.scss b/assets/scss/_styles_project.scss
index ae5ffc2e1..50d08a58e 100644
--- a/assets/scss/_styles_project.scss
+++ b/assets/scss/_styles_project.scss
@@ -5,3 +5,77 @@
.td-page-meta {
display: none;
}
+
+.td-navbar .navbar-brand__name {
+ display: none;
+}
+
+// Image gallery shortcode styles
+.image-gallery {
+ overflow: auto;
+ margin-left: -1% !important;
+
+ li {
+ float: left;
+ display: block;
+ margin: 0 0 1% 1%;
+ width: 19%;
+
+ a {
+ text-align: center;
+ text-decoration: none !important;
+ color: #777;
+
+ span {
+ display: block;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+ padding: 3px 0;
+ }
+
+ img {
+ width: 100%;
+ display: block;
+ }
+ }
+ }
+}
+
+// Custom styles used by home page
+.hero-content-column {
+ background-position: -2px 0;
+ background-repeat: no-repeat;
+ background-size: 26em 28em;
+
+ .text-center {
+ h1, p {
+ text-shadow: 2px 3px 0 #333;
+ }
+
+ .display-1,
+ .display-3 {
+ font-weight: 700;
+ }
+ }
+
+ .top-summary {
+ background: rgba(0, 0, 0, 0.3);
+ padding: 7px;
+ border-radius: 11px;
+ }
+}
+
+// Keep search visible on mobile, wrap to second row
+@media (max-width: 991.98px) {
+ .td-navbar-container {
+ flex-wrap: wrap;
+ }
+ // Override Bootstrap d-none with higher specificity
+ nav.td-navbar .td-navbar__search.d-none.d-lg-block {
+ display: block !important;
+ width: 100%;
+ order: 99;
+ padding: 0.5rem 0;
+ }
+}
diff --git a/assets/scss/_variables_project.scss b/assets/scss/_variables_project.scss
index 9e0e4eb79..3f773776a 100644
--- a/assets/scss/_variables_project.scss
+++ b/assets/scss/_variables_project.scss
@@ -1,3 +1,9 @@
-//$primary: #390040;
-#$primary: #c80000;
-$secondary: #A23B72;
+$primary: #30638e; // rgb(48, 99, 142)
+$secondary: #f08073;
+
+$td-enable-google-fonts: true;
+
+// Set the navbar background color to match the primary color
+$td-navbar-bg-color: #30638e;
+
+// $enable-dark-mode: false;
diff --git a/config/_default/hugo.yaml b/config/_default/hugo.yaml
index 7db922ece..c36849e5a 100644
--- a/config/_default/hugo.yaml
+++ b/config/_default/hugo.yaml
@@ -26,7 +26,7 @@ canonifyURLs: false
enableRobotsTXT: false
# assetDir: Location where Hugo looks for assets
-assetDir: static
+#assetDir: static
# Enable .GitInfo object for each page. This will give values to .Lastmod etc.
enableGitInfo: true
diff --git a/config/_default/module.yaml b/config/_default/module.yaml
index d6c27e0b3..fc98f3889 100644
--- a/config/_default/module.yaml
+++ b/config/_default/module.yaml
@@ -3,7 +3,7 @@
# replacements = "github.com/google/docsy -> ../../docsy"
hugoVersion:
extended: true
- min: "0.73.0"
+ min: "0.155.2"
imports:
- path: "github.com/google/docsy"
disable: false
diff --git a/config/_default/params.yaml b/config/_default/params.yaml
index f6cc05f26..71838a717 100644
--- a/config/_default/params.yaml
+++ b/config/_default/params.yaml
@@ -41,17 +41,17 @@ copyright:
from_year: 2024
license: MIT
-# github information
+# github information - disabled, only needed if feedback is enabled.
# github_repo: url to repo of web site
# github_branch: main branch of repo
# github_subdir: unused by Interlisp.org
# github_project_repo: added by Interlisp.org points to repo used
# for issue reporting
#
-github_repo: https://github.com/interlisp/Interlisp.github.io
-github_branch: main
-github_subdir:
-github_project_repo: https://github.com/interlisp/medley
+#github_repo: https://github.com/interlisp/Interlisp.github.io
+#github_branch: main
+#github_subdir:
+#github_project_repo: https://github.com/interlisp/medley
# Google custom search engine configuration
# gcs_engine_id: search engine
@@ -136,24 +136,11 @@ taxonomy:
# User Interface Configuration options
#
-# feedback:
-# Adds a H2 section titled "Feedback" to the bottom of each doc. The responses
-# are sent to Google Analytics as events. This feature depends
-# on [services.googleAnalytics] and will be disabled if
-# "services.googleAnalytics.id" is not set.
-#
-# If you want this feature, but occasionally need to remove the
-# "Feedback" section from a single page,
-# add "hide_feedback: true" to the page's front matter.
-# enable: boolean Turn feedback
-# yes: text to display with yes is selected
-# no: text to display when no is selected
-
ui:
+ # Adds a H2 section titled "Feedback" to the bottom of each doc. The responses
+ # are sent to Google Analytics as events.
feedback:
- enable: true
- 'yes': 'Glad to hear it! Please tell us how we can improve.'
- 'no': 'Sorry to hear that. Please tell us how we can improve.'
+ enable: false
# Adds a reading time to the top of each doc.
# If you want this feature, but occasionally need to remove the Reading time from a single page,
@@ -187,7 +174,8 @@ ui:
ul_show: 3
-# Identify the custom css files
-custom_css:
- - "css/custom.css"
+ # Set the navbar to dark mode, This keeps the fonts white, which works better with the blue background.
+ navbar_theme: dark
+ # Set to false to disable dark mode menu
+ showLightDarkModeMenu: true
diff --git a/content/en/_index.html b/content/en/_index.html
deleted file mode 100644
index 87d260715..000000000
--- a/content/en/_index.html
+++ /dev/null
@@ -1,83 +0,0 @@
----
-title: Medley Interlisp Project
-aliases:
- - /hugo
----
-
-{{< blocks/cover title="The Medley Interlisp Project" subtitle="a retrofuturistic software system" image_anchor="smart" color="primary" height="min">}}
-
- What did we leave behind on the path to developing today's computer systems? Could there be lessons for the future of computing hidden in the past? Enter the Medley software environment to explore these questions.
-
Welcome to the start of a new chapter in software preservation and computing. We're a group of researchers, software developers, and friends working to make the Medley Interlisp system available for use on modern computer systems.
-
-
The Medley system was created at Xerox's Palo Alto Research Center (PARC). PARC was the cradle of the modern graphical user interface and its design thinking continued with the development of Medley Interlisp, an extensible graphical operating system with nearly limitless possibilities for customization. Whatever the task, using Medley you can design a custom workflow to help accomplish it.
-
-
Interlisp had its beginnings as a DARPA sponsored Lisp environment for researchers. Interlisp was then ported and expanded into Interlisp-D, first released by Xerox and distributed commercially until its development tapered off in the 1990s. Now this classic software system is running again on your favorite operating system. The project is more than a trip down memory lane: our mission is to expand the scope of what Medley can do, fulfilling its promise of software tools limited only by the user's imagination. Dive in and explore the language, the tools, and the myriad applications, experiments, and playful creations that were crafted in and for Interlisp.
We encourage you to read the Medley primer and try out the Interlisp environment. The primer, designed for modern users, assumes no prior knowledge of Lisp and will ease you into the system.
-
-
Feeling confused by the jargon? Don't worry, we've got you covered. Check out our glossary to learn the terms associated with our project.
-
-
Most software in this project is licensed under the terms of the MIT license.
+ What did we leave behind on the path to developing today's computer systems? Could there be lessons for the future of computing hidden in the past? Enter the Medley software environment to explore these questions.
+
+
+ {{% blocks/link-down color="white" %}}
+
+{{% /blocks/cover %}}
+
+{{% blocks/section color="white" %}}
+
+# The Interlisp Revival
+
+The Medley system was created at Xerox's Palo Alto Research Center (PARC). PARC was the cradle of the modern graphical user interface and its design thinking continued with the development of Medley Interlisp, an extensible graphical operating system with nearly limitless possibilities for customization. Whatever the task, using Medley you can design a custom workflow to help accomplish it.
+
+Interlisp had its beginnings as a DARPA sponsored Lisp environment for researchers. Interlisp was then ported and expanded into Interlisp-D, first released by Xerox and distributed commercially until its development tapered off in the 1990s. Now this classic software system is running again on your favorite operating system. The project is more than a trip down memory lane: our mission is to expand the scope of what Medley can do, fulfilling its promise of software tools limited only by the user's imagination. Dive in and explore the language, the tools, and the myriad applications, experiments, and playful creations that were crafted in and for Interlisp.
+
+The [2025 Medley Interlisp Annual Report](project/status/2025medleyannualreport/) describes our recent activities.
+
+We encourage you to read the [Medley primer](https://primer.interlisp.org) and try out the Interlisp environment. The primer, designed for modern users, assumes no prior knowledge of Lisp and will ease you into the system.
+
+Feeling confused by the jargon? Don't worry, we've got you covered. [Check out our glossary](history/glossary/) to learn the terms associated with our project.
+
+Most software in this project is licensed under the terms of the [MIT license](https://github.com/Interlisp/medley/blob/master/LICENSE).
+
+
+{{% /blocks/section %}}
+
+{{% blocks/section color="primary" type="row" %}}
+
+{{% blocks/feature icon="fas fa-feather" title="History of Interlisp" %}}
+
+ The history of Interlisp and Medley development, and applications written in
+ and for it.
+
+
+{{% /blocks/feature %}}
+
+{{% blocks/feature icon="fas fa-medal" title="Try Medley" %}}
+How to run Medley "in the cloud" (on our servers), install
+it on popular platforms or build it for new ones.
+
+
-type: {{ range $i, $t := .Params.types -}}
-{{- if $i }} | {{ end -}}
-{{$t}}
-{{- end -}}
-{{- range $i, $d := .Params.defaults }}
- {{- if eq $i 0 }}, default: {{ end }}
- {{- if $i }}, {{ end -}}
- {{- if reflect.IsMap $d -}}
- {{ $d.default }} {{$d.for}} {{$d.suffix}}
- {{- else -}}
- {{ $d }}
- {{- end -}}
-{{- end -}}
-{{- range $i, $minimum := .Params.minimums -}}
- {{- if eq $i 0 }}, minimum: {{ end }}
- {{- if $i }}, {{ end -}}
- {{- $minimum -}}
-{{- end -}}
-
-
-
-{{ .Content }}
-
-Valid on:
-
-{{- if in .Params.used_by "C" }}
Clusters
{{ end -}}
-{{- if in .Params.used_by "E" }}
Edges
{{ end -}}
-{{- if in .Params.used_by "G" }}
Graphs
{{ end -}}
-{{- if in .Params.used_by "N" }}
Nodes
{{ end -}}
-{{- if in .Params.used_by "S" }}
Subgraphs
{{ end -}}
-
-
-{{- if .Params.flags -}}
- Note:
- {{ if eq (index .Params.flags 0) "notdot" }}
- not dot
- {{ else }}
- {{ range $i, $flag := .Params.flags -}}
- {{- if $i }}, {{ end -}}
- {{ $flag }}
- {{- end }} only
- {{ end }}
-{{- end -}}
-
diff --git a/layouts/attrs/list.html b/layouts/attrs/list.html
deleted file mode 100644
index 67ea14d3f..000000000
--- a/layouts/attrs/list.html
+++ /dev/null
@@ -1,107 +0,0 @@
-{{ define "main" }}
-
-
{{ .Title }}
- {{ with .Params.description }}
{{ . | markdownify }}
{{ end }}
- {{ if (and (not .Params.hide_readingtime) (.Site.Params.ui.readingtime.enable)) }}
- {{ partial "reading-time.html" . }}
- {{ end }}
-
-{{/*
-`used_by` is a string consisting of `G`,`C`,`N`,`E`, indicating that the attribute
- applies to graphs, clusters, nodes and edges, respectively.
-
-`types` is a list: Types can be `int`, `bool`, `string`, `double`, or a
-special type. We assume there is an entry for the type in the `_attr_types/`
-collection.
-
-`defaults` is a list: gives a description of the default values of the
-attribute.
-
-`minimums` is a list: gives a description of the minimum values of the
-attribute. It can contain arbitrary text.
-
-`flags`, if present, is a list of:
-
-- `bitmap` `cmap` `map` `postscript` `svg` - attribute limited to specified output formats
-- `dot` `neato` `twopi` `circo` `fdp` `sfdp` - attribute limited to specified layouts
-- `notdot` - attribute use in all layouts but dot
-- `write` - attribute is write-only
-
-In the summary table, attributes are anchored with `#a:`.
-In the description list, attributes are anchored with `#d:`.
-The attributes are alphabetized on output.
-*/}}
-
-{{ .Content }}
-
-