Phase 5: Update all content paths to SX expression URLs

- Update ~sx-doc :path values in docs.sx from old-style paths to SX
  expression URLs (fixes client-side rendered page nav resolution)
- Fix stale hrefs in content/pages.py code examples
- Fix tabs push-url in examples.sx
- Add self-defining-medium + sx-urls + sx-protocol to essay/plan cases

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-12 16:39:13 +00:00
parent 9f2f4377b9
commit 7a1d1e9ea2
3 changed files with 64 additions and 60 deletions

View File

@@ -539,7 +539,7 @@ HEADER_DETAILS: dict[str, dict] = {
';; SX-Location: /docs/introduction\n'
';;\n'
';; With options:\n'
';; SX-Location: {"path": "/language/docs/intro", "target": "#sidebar", "swap": "innerHTML"}'
';; SX-Location: {"path": "/(language.(doc.intro))", "target": "#sidebar", "swap": "innerHTML"}'
),
},
"SX-Replace-Url": {
@@ -676,8 +676,8 @@ EVENT_DETAILS: dict[str, dict] = {
';; sx-boost containers try client routing first.\n'
';; On success, sx:clientRoute fires on the swap target.\n'
'(nav :sx-boost "#main-panel"\n'
' (a :href "/etc/essays/" "Essays")\n'
' (a :href "/etc/plans/" "Plans"))\n'
' (a :href "/(etc.(essay))" "Essays")\n'
' (a :href "/(etc.(plan))" "Plans"))\n'
'\n'
';; Listen in body.js:\n'
';; document.body.addEventListener("sx:clientRoute",\n'
@@ -983,8 +983,8 @@ ATTR_DETAILS: dict[str, dict] = {
),
"demo": "ref-pushurl-demo",
"example": (
'(a :href "/geography/hypermedia/reference/attributes/sx-get"\n'
' :sx-get "/geography/hypermedia/reference/attributes/sx-get"\n'
'(a :href "/(geography.(hypermedia.(reference-detail.attributes.sx-get)))"\n'
' :sx-get "/(geography.(hypermedia.(reference-detail.attributes.sx-get)))"\n'
' :sx-target "#main-panel"\n'
' :sx-select "#main-panel"\n'
' :sx-swap "outerHTML"\n'
@@ -1112,8 +1112,8 @@ ATTR_DETAILS: dict[str, dict] = {
),
"demo": "ref-media-demo",
"example": (
'(a :href "/geography/hypermedia/reference/attributes/sx-get"\n'
' :sx-get "/geography/hypermedia/reference/attributes/sx-get"\n'
'(a :href "/(geography.(hypermedia.(reference-detail.attributes.sx-get)))"\n'
' :sx-get "/(geography.(hypermedia.(reference-detail.attributes.sx-get)))"\n'
' :sx-target "#main-panel"\n'
' :sx-select "#main-panel"\n'
' :sx-swap "outerHTML"\n'
@@ -1221,9 +1221,9 @@ ATTR_DETAILS: dict[str, dict] = {
"example": (
';; Boost with configurable target\n'
'(nav :sx-boost "#main-panel"\n'
' (a :href "/language/docs/introduction" "Introduction")\n'
' (a :href "/language/docs/components" "Components")\n'
' (a :href "/language/docs/evaluator" "Evaluator"))\n'
' (a :href "/(language.(doc.introduction))" "Introduction")\n'
' (a :href "/(language.(doc.components))" "Components")\n'
' (a :href "/(language.(doc.evaluator))" "Evaluator"))\n'
'\n'
';; All links swap into #main-panel automatically.\n'
';; Pure pages render client-side (no server request).'

View File

@@ -508,7 +508,7 @@
:sx-get (str "/(geography.(hypermedia.(example.(api.(tabs." tab ")))))")
:sx-target "#tab-content"
:sx-swap "innerHTML"
:sx-push-url (str "/geography/hypermedia/examples/tabs?tab=" tab)
:sx-push-url (str "/(geography.(hypermedia.(example.tabs)))?tab=" tab)
:class (str "px-4 py-2 text-sm font-medium border-b-2 -mb-px transition-colors "
(if (= active "true")
"border-violet-600 text-violet-600"

View File

@@ -1,6 +1,7 @@
;; SX docs app — declarative page definitions
;; All content dispatched via case + direct component references.
;; Navigation is in-page via (~sx-doc :path "..." content...).
;; SX docs app — page definitions (metadata for client routing registry)
;; Routing is handled by page-functions.sx + sx_router.py catch-all.
;; These defpages provide: path patterns, content expressions, data flags,
;; and component deps for the client-side page registry.
;; ---------------------------------------------------------------------------
;; Home page
@@ -20,7 +21,7 @@
:path "/language/"
:auth :public
:layout :sx-docs
:content (~sx-doc :path "/language/"))
:content (~sx-doc :path "/(language)"))
;; ---------------------------------------------------------------------------
;; Docs section (under Language)
@@ -30,13 +31,13 @@
:path "/language/docs/"
:auth :public
:layout :sx-docs
:content (~sx-doc :path "/language/docs/" (~docs-introduction-content)))
:content (~sx-doc :path "/(language.(doc))" (~docs-introduction-content)))
(defpage docs-page
:path "/language/docs/<slug>"
:auth :public
:layout :sx-docs
:content (~sx-doc :path (str "/language/docs/" slug)
:content (~sx-doc :path (str "/(language.(doc." slug "))")
(case slug
"introduction" (~docs-introduction-content)
"getting-started" (~docs-getting-started-content)
@@ -57,20 +58,20 @@
:path "/geography/hypermedia/"
:auth :public
:layout :sx-docs
:content (~sx-doc :path "/geography/hypermedia/"))
:content (~sx-doc :path "/(geography.(hypermedia))"))
(defpage reference-index
:path "/geography/hypermedia/reference/"
:auth :public
:layout :sx-docs
:content (~sx-doc :path "/geography/hypermedia/reference/" (~reference-index-content)))
:content (~sx-doc :path "/(geography.(hypermedia.(reference)))" (~reference-index-content)))
(defpage reference-page
:path "/geography/hypermedia/reference/<slug>"
:auth :public
:layout :sx-docs
:data (reference-data slug)
:content (~sx-doc :path (str "/geography/hypermedia/reference/" slug)
:content (~sx-doc :path (str "/(geography.(hypermedia.(reference." slug ")))")
(case slug
"attributes" (~reference-attrs-content
:req-table (~doc-attr-table-from-data :title "Request Attributes" :attrs req-attrs)
@@ -97,7 +98,7 @@
:auth :public
:layout :sx-docs
:data (attr-detail-data slug)
:content (~sx-doc :path "/geography/hypermedia/reference/attributes"
:content (~sx-doc :path (str "/(geography.(hypermedia.(reference-detail.attributes." slug ")))")
(if attr-not-found
(~reference-attr-not-found :slug slug)
(~reference-attr-detail-content
@@ -113,7 +114,7 @@
:auth :public
:layout :sx-docs
:data (header-detail-data slug)
:content (~sx-doc :path "/geography/hypermedia/reference/headers"
:content (~sx-doc :path (str "/(geography.(hypermedia.(reference-detail.headers." slug ")))")
(if header-not-found
(~reference-attr-not-found :slug slug)
(~reference-header-detail-content
@@ -128,7 +129,7 @@
:auth :public
:layout :sx-docs
:data (event-detail-data slug)
:content (~sx-doc :path "/geography/hypermedia/reference/events"
:content (~sx-doc :path (str "/(geography.(hypermedia.(reference-detail.events." slug ")))")
(if event-not-found
(~reference-attr-not-found :slug slug)
(~reference-event-detail-content
@@ -145,7 +146,7 @@
:path "/applications/"
:auth :public
:layout :sx-docs
:content (~sx-doc :path "/applications/"))
:content (~sx-doc :path "/(applications)"))
;; ---------------------------------------------------------------------------
;; Protocols section (under Applications)
@@ -155,13 +156,13 @@
:path "/applications/protocols/"
:auth :public
:layout :sx-docs
:content (~sx-doc :path "/applications/protocols/" (~protocol-wire-format-content)))
:content (~sx-doc :path "/(applications.(protocol))" (~protocol-wire-format-content)))
(defpage protocol-page
:path "/applications/protocols/<slug>"
:auth :public
:layout :sx-docs
:content (~sx-doc :path (str "/applications/protocols/" slug)
:content (~sx-doc :path (str "/(applications.(protocol." slug "))")
(case slug
"wire-format" (~protocol-wire-format-content)
"fragments" (~protocol-fragments-content)
@@ -179,13 +180,13 @@
:path "/geography/hypermedia/examples/"
:auth :public
:layout :sx-docs
:content (~sx-doc :path "/geography/hypermedia/examples/"))
:content (~sx-doc :path "/(geography.(hypermedia.(example)))"))
(defpage examples-page
:path "/geography/hypermedia/examples/<slug>"
:auth :public
:layout :sx-docs
:content (~sx-doc :path (str "/geography/hypermedia/examples/" slug)
:content (~sx-doc :path (str "/(geography.(hypermedia.(example." slug ")))")
(case slug
"click-to-load" (~example-click-to-load)
"form-submission" (~example-form-submission)
@@ -224,7 +225,7 @@
:path "/etc/"
:auth :public
:layout :sx-docs
:content (~sx-doc :path "/etc/"))
:content (~sx-doc :path "/(etc)"))
;; ---------------------------------------------------------------------------
;; Essays section (under Etc)
@@ -234,13 +235,13 @@
:path "/etc/essays/"
:auth :public
:layout :sx-docs
:content (~sx-doc :path "/etc/essays/" (~essays-index-content)))
:content (~sx-doc :path "/(etc.(essay))" (~essays-index-content)))
(defpage essay-page
:path "/etc/essays/<slug>"
:auth :public
:layout :sx-docs
:content (~sx-doc :path (str "/etc/essays/" slug)
:content (~sx-doc :path (str "/(etc.(essay." slug "))")
(case slug
"sx-sucks" (~essay-sx-sucks)
"why-sexps" (~essay-why-sexps)
@@ -259,6 +260,7 @@
"react-is-hypermedia" (~essay-react-is-hypermedia)
"hegelian-synthesis" (~essay-hegelian-synthesis)
"the-art-chain" (~essay-the-art-chain)
"self-defining-medium" (~essay-self-defining-medium)
:else (~essays-index-content))))
;; ---------------------------------------------------------------------------
@@ -269,13 +271,13 @@
:path "/etc/philosophy/"
:auth :public
:layout :sx-docs
:content (~sx-doc :path "/etc/philosophy/" (~philosophy-index-content)))
:content (~sx-doc :path "/(etc.(philosophy))" (~philosophy-index-content)))
(defpage philosophy-page
:path "/etc/philosophy/<slug>"
:auth :public
:layout :sx-docs
:content (~sx-doc :path (str "/etc/philosophy/" slug)
:content (~sx-doc :path (str "/(etc.(philosophy." slug "))")
(case slug
"sx-manifesto" (~essay-sx-manifesto)
"godel-escher-bach" (~essay-godel-escher-bach)
@@ -292,13 +294,13 @@
:path "/applications/cssx/"
:auth :public
:layout :sx-docs
:content (~sx-doc :path "/applications/cssx/" (~cssx-overview-content)))
:content (~sx-doc :path "/(applications.(cssx))" (~cssx-overview-content)))
(defpage cssx-page
:path "/applications/cssx/<slug>"
:auth :public
:layout :sx-docs
:content (~sx-doc :path (str "/applications/cssx/" slug)
:content (~sx-doc :path (str "/(applications.(cssx." slug "))")
(case slug
"patterns" (~cssx-patterns-content)
"delivery" (~cssx-delivery-content)
@@ -316,18 +318,18 @@
:path "/language/specs/"
:auth :public
:layout :sx-docs
:content (~sx-doc :path "/language/specs/" (~spec-architecture-content)))
:content (~sx-doc :path "/(language.(spec))" (~spec-architecture-content)))
(defpage specs-page
:path "/language/specs/<slug>"
:auth :public
:layout :sx-docs
:content (~sx-doc :path (str "/language/specs/" slug)
:content (~sx-doc :path (str "/(language.(spec." slug "))")
(let ((make-spec-files (fn (items)
(map (fn (item)
(dict :title (get item "title") :desc (get item "desc")
:prose (get item "prose")
:filename (get item "filename") :href (str "/language/specs/" (get item "slug"))
:filename (get item "filename") :href (str "/(language.(spec." (get item "slug") "))")
:source (read-spec-file (get item "filename"))))
items))))
(case slug
@@ -367,7 +369,7 @@
:path "/language/specs/explore/<slug>"
:auth :public
:layout :sx-docs
:content (~sx-doc :path (str "/language/specs/explore/" slug)
:content (~sx-doc :path (str "/(language.(spec.(explore." slug ")))")
(let ((spec (find-spec slug)))
(if spec
(let ((data (spec-explorer-data
@@ -387,14 +389,14 @@
:path "/language/bootstrappers/"
:auth :public
:layout :sx-docs
:content (~sx-doc :path "/language/bootstrappers/" (~bootstrappers-index-content)))
:content (~sx-doc :path "/(language.(bootstrapper))" (~bootstrappers-index-content)))
(defpage bootstrapper-page
:path "/language/bootstrappers/<slug>"
:auth :public
:layout :sx-docs
:data (bootstrapper-data slug)
:content (~sx-doc :path (str "/language/bootstrappers/" slug)
:content (~sx-doc :path (str "/(language.(bootstrapper." slug "))")
(if bootstrapper-not-found
(~spec-not-found :slug slug)
(case slug
@@ -432,14 +434,14 @@
:path "/geography/isomorphism/"
:auth :public
:layout :sx-docs
:content (~sx-doc :path "/geography/isomorphism/" (~plan-isomorphic-content)))
:content (~sx-doc :path "/(geography.(isomorphism))" (~plan-isomorphic-content)))
(defpage bundle-analyzer
:path "/geography/isomorphism/bundle-analyzer"
:auth :public
:layout :sx-docs
:data (bundle-analyzer-data)
:content (~sx-doc :path "/geography/isomorphism/bundle-analyzer"
:content (~sx-doc :path "/(geography.(isomorphism.bundle-analyzer))"
(~bundle-analyzer-content
:pages pages :total-components total-components :total-macros total-macros
:pure-count pure-count :io-count io-count)))
@@ -449,7 +451,7 @@
:auth :public
:layout :sx-docs
:data (routing-analyzer-data)
:content (~sx-doc :path "/geography/isomorphism/routing-analyzer"
:content (~sx-doc :path "/(geography.(isomorphism.routing-analyzer))"
(~routing-analyzer-content
:pages pages :total-pages total-pages :client-count client-count
:server-count server-count :registry-sample registry-sample)))
@@ -459,7 +461,7 @@
:auth :public
:layout :sx-docs
:data (data-test-data)
:content (~sx-doc :path "/geography/isomorphism/data-test"
:content (~sx-doc :path "/(geography.(isomorphism.data-test))"
(~data-test-content
:server-time server-time :items items
:phase phase :transport transport)))
@@ -468,14 +470,14 @@
:path "/geography/isomorphism/async-io"
:auth :public
:layout :sx-docs
:content (~sx-doc :path "/geography/isomorphism/async-io" (~async-io-demo-content)))
:content (~sx-doc :path "/(geography.(isomorphism.async-io))" (~async-io-demo-content)))
(defpage streaming-demo
:path "/geography/isomorphism/streaming"
:auth :public
:stream true
:layout :sx-docs
:shell (~sx-doc :path "/geography/isomorphism/streaming"
:shell (~sx-doc :path "/(geography.(isomorphism.streaming))"
(~streaming-demo-layout
(~suspense :id "stream-fast" :fallback (~stream-skeleton))
(~suspense :id "stream-medium" :fallback (~stream-skeleton))
@@ -492,7 +494,7 @@
:auth :public
:layout :sx-docs
:data (affinity-demo-data)
:content (~sx-doc :path "/geography/isomorphism/affinity"
:content (~sx-doc :path "/(geography.(isomorphism.affinity))"
(~affinity-demo-content :components components :page-plans page-plans)))
(defpage optimistic-demo
@@ -500,7 +502,7 @@
:auth :public
:layout :sx-docs
:data (optimistic-demo-data)
:content (~sx-doc :path "/geography/isomorphism/optimistic"
:content (~sx-doc :path "/(geography.(isomorphism.optimistic))"
(~optimistic-demo-content :items items :server-time server-time)))
(defpage offline-demo
@@ -508,7 +510,7 @@
:auth :public
:layout :sx-docs
:data (offline-demo-data)
:content (~sx-doc :path "/geography/isomorphism/offline"
:content (~sx-doc :path "/(geography.(isomorphism.offline))"
(~offline-demo-content :notes notes :server-time server-time)))
;; Wildcard must come AFTER specific routes (first-match routing)
@@ -516,7 +518,7 @@
:path "/geography/isomorphism/<slug>"
:auth :public
:layout :sx-docs
:content (~sx-doc :path (str "/geography/isomorphism/" slug)
:content (~sx-doc :path (str "/(geography.(isomorphism." slug "))")
(case slug
"bundle-analyzer" (~bundle-analyzer-content
:pages pages :total-components total-components :total-macros total-macros
@@ -534,7 +536,7 @@
:path "/etc/plans/"
:auth :public
:layout :sx-docs
:content (~sx-doc :path "/etc/plans/" (~plans-index-content)))
:content (~sx-doc :path "/(etc.(plan))" (~plans-index-content)))
(defpage plan-page
:path "/etc/plans/<slug>"
@@ -543,7 +545,7 @@
:data (case slug
"theorem-prover" (prove-data)
:else nil)
:content (~sx-doc :path (str "/etc/plans/" slug)
:content (~sx-doc :path (str "/(etc.(plan." slug "))")
(case slug
"status" (~plan-status-content)
"reader-macros" (~plan-reader-macros-content)
@@ -572,6 +574,8 @@
"generative-sx" (~plan-generative-sx-content)
"art-dag-sx" (~plan-art-dag-sx-content)
"spec-explorer" (~plan-spec-explorer-content)
"sx-urls" (~plan-sx-urls-content)
"sx-protocol" (~plan-sx-protocol-content)
:else (~plans-index-content))))
;; ---------------------------------------------------------------------------
@@ -582,7 +586,7 @@
:path "/geography/"
:auth :public
:layout :sx-docs
:content (~sx-doc :path "/geography/"))
:content (~sx-doc :path "/(geography)"))
;; ---------------------------------------------------------------------------
;; Reactive Islands section (under Geography)
@@ -592,13 +596,13 @@
:path "/geography/reactive/"
:auth :public
:layout :sx-docs
:content (~sx-doc :path "/geography/reactive/" (~reactive-islands-index-content)))
:content (~sx-doc :path "/(geography.(reactive))" (~reactive-islands-index-content)))
(defpage reactive-islands-page
:path "/geography/reactive/<slug>"
:auth :public
:layout :sx-docs
:content (~sx-doc :path (str "/geography/reactive/" slug)
:content (~sx-doc :path (str "/(geography.(reactive." slug "))")
(case slug
"demo" (~reactive-islands-demo-content)
"event-bridge" (~reactive-islands-event-bridge-content)
@@ -615,7 +619,7 @@
:path "/geography/marshes/"
:auth :public
:layout :sx-docs
:content (~sx-doc :path "/geography/marshes/" (~reactive-islands-marshes-content)))
:content (~sx-doc :path "/(geography.(marshes))" (~reactive-islands-marshes-content)))
;; ---------------------------------------------------------------------------
;; Bootstrapped page helpers demo
@@ -626,7 +630,7 @@
:auth :public
:layout :sx-docs
:data (page-helpers-demo-data)
:content (~sx-doc :path "/language/bootstrappers/page-helpers"
:content (~sx-doc :path "/(language.(bootstrapper.page-helpers))"
(~page-helpers-demo-content
:sf-categories sf-categories :sf-total sf-total :sf-ms sf-ms
:ref-sample ref-sample :ref-ms ref-ms
@@ -648,7 +652,7 @@
:auth :public
:layout :sx-docs
:data (run-modular-tests "all")
:content (~sx-doc :path "/language/testing/"
:content (~sx-doc :path "/(language.(test))"
(~testing-overview-content
:server-results server-results
:framework-source framework-source
@@ -672,7 +676,7 @@
"engine" (run-modular-tests "engine")
"orchestration" (run-modular-tests "orchestration")
:else (dict))
:content (~sx-doc :path (str "/language/testing/" slug)
:content (~sx-doc :path (str "/(language.(test." slug "))")
(case slug
"eval" (~testing-spec-content
:spec-name "eval"