diff --git a/sx/content/pages.py b/sx/content/pages.py index 6508ef2..f0c52c3 100644 --- a/sx/content/pages.py +++ b/sx/content/pages.py @@ -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).' diff --git a/sx/sxc/examples.sx b/sx/sxc/examples.sx index 5682afd..91bac12 100644 --- a/sx/sxc/examples.sx +++ b/sx/sxc/examples.sx @@ -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" diff --git a/sx/sxc/pages/docs.sx b/sx/sxc/pages/docs.sx index 43c8ed3..f895d10 100644 --- a/sx/sxc/pages/docs.sx +++ b/sx/sxc/pages/docs.sx @@ -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/" :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/" :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/" :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/" :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/" :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/" :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/" :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/" :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/" :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/" :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/" :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/" @@ -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/" :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"