- Effect and computed auto-register disposers with island scope via register-in-scope; dispose-islands-in called before every swap point (orchestration.sx) to clean up intervals/subscriptions on navigation. - Map + deref inside islands auto-upgrades to reactive-list for signal- bound list rendering. Demo island with add/remove items. - New :bind attribute for two-way signal-input binding (text, checkbox, radio, textarea, select). bind-input in adapter-dom.sx handles both signal→element (effect) and element→signal (event listener). - Phase 2 plan page at /reactive-islands/phase2 covering input binding, keyed reconciliation, reactive class/style, refs, portals, error boundaries, suspense, and transitions. - Updated status tables in overview and plan pages. - Fixed stopwatch reset (fn body needs do wrapper for multiple exprs). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
770 lines
28 KiB
Plaintext
770 lines
28 KiB
Plaintext
;; SX docs app — declarative page definitions
|
|
;; All content dispatched via case + direct component references.
|
|
;; Navigation built from SX data (nav-data.sx), no Python intermediaries.
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; Home page
|
|
;; ---------------------------------------------------------------------------
|
|
|
|
(defpage home
|
|
:path "/"
|
|
:auth :public
|
|
:layout :sx
|
|
:content (~sx-home-content))
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; Docs section
|
|
;; ---------------------------------------------------------------------------
|
|
|
|
(defpage docs-index
|
|
:path "/docs/"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Docs"
|
|
:sub-label "Docs"
|
|
:sub-href "/docs/introduction"
|
|
:sub-nav (~section-nav :items docs-nav-items :current "Introduction")
|
|
:selected "Introduction")
|
|
:content (~docs-introduction-content))
|
|
|
|
(defpage docs-page
|
|
:path "/docs/<slug>"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Docs"
|
|
:sub-label "Docs"
|
|
:sub-href "/docs/introduction"
|
|
:sub-nav (~section-nav :items docs-nav-items
|
|
:current (find-current docs-nav-items slug))
|
|
:selected (or (find-current docs-nav-items slug) ""))
|
|
:content (case slug
|
|
"introduction" (~docs-introduction-content)
|
|
"getting-started" (~docs-getting-started-content)
|
|
"components" (~docs-components-content)
|
|
"evaluator" (~docs-evaluator-content)
|
|
"primitives" (~docs-primitives-content
|
|
:prims (~doc-primitives-tables :primitives (primitives-data)))
|
|
"special-forms" (~docs-special-forms-content
|
|
:forms (~doc-special-forms-tables :forms (special-forms-data)))
|
|
"server-rendering" (~docs-server-rendering-content)
|
|
:else (~docs-introduction-content)))
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; Reference section
|
|
;; ---------------------------------------------------------------------------
|
|
|
|
(defpage reference-index
|
|
:path "/reference/"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Reference"
|
|
:sub-label "Reference"
|
|
:sub-href "/reference/"
|
|
:sub-nav (~section-nav :items reference-nav-items :current "")
|
|
:selected "")
|
|
:content (~reference-index-content))
|
|
|
|
(defpage reference-page
|
|
:path "/reference/<slug>"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Reference"
|
|
:sub-label "Reference"
|
|
:sub-href "/reference/"
|
|
:sub-nav (~section-nav :items reference-nav-items
|
|
:current (find-current reference-nav-items slug))
|
|
:selected (or (find-current reference-nav-items slug) ""))
|
|
:data (reference-data slug)
|
|
:content (case slug
|
|
"attributes" (~reference-attrs-content
|
|
:req-table (~doc-attr-table-from-data :title "Request Attributes" :attrs req-attrs)
|
|
:beh-table (~doc-attr-table-from-data :title "Behavior Attributes" :attrs beh-attrs)
|
|
:uniq-table (~doc-attr-table-from-data :title "Unique to sx" :attrs uniq-attrs))
|
|
"headers" (~reference-headers-content
|
|
:req-table (~doc-headers-table-from-data :title "Request Headers" :headers req-headers)
|
|
:resp-table (~doc-headers-table-from-data :title "Response Headers" :headers resp-headers))
|
|
"events" (~reference-events-content
|
|
:table (~doc-two-col-table-from-data
|
|
:intro "sx fires custom DOM events at various points in the request lifecycle."
|
|
:col1 "Event" :col2 "Description" :items events-list))
|
|
"js-api" (~reference-js-api-content
|
|
:table (~doc-two-col-table-from-data
|
|
:intro "The client-side sx.js library exposes a public API for programmatic use."
|
|
:col1 "Method" :col2 "Description" :items js-api-list))
|
|
:else (~reference-attrs-content
|
|
:req-table (~doc-attr-table-from-data :title "Request Attributes" :attrs req-attrs)
|
|
:beh-table (~doc-attr-table-from-data :title "Behavior Attributes" :attrs beh-attrs)
|
|
:uniq-table (~doc-attr-table-from-data :title "Unique to sx" :attrs uniq-attrs))))
|
|
|
|
(defpage reference-attr-detail
|
|
:path "/reference/attributes/<slug>"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Reference"
|
|
:sub-label "Reference"
|
|
:sub-href "/reference/"
|
|
:sub-nav (~section-nav :items reference-nav-items :current "Attributes")
|
|
:selected "Attributes")
|
|
:data (attr-detail-data slug)
|
|
:content (if attr-not-found
|
|
(~reference-attr-not-found :slug slug)
|
|
(~reference-attr-detail-content
|
|
:title attr-title
|
|
:description attr-description
|
|
:demo attr-demo
|
|
:example-code attr-example
|
|
:handler-code attr-handler
|
|
:wire-placeholder-id attr-wire-id)))
|
|
|
|
(defpage reference-header-detail
|
|
:path "/reference/headers/<slug>"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Reference"
|
|
:sub-label "Reference"
|
|
:sub-href "/reference/"
|
|
:sub-nav (~section-nav :items reference-nav-items :current "Headers")
|
|
:selected "Headers")
|
|
:data (header-detail-data slug)
|
|
:content (if header-not-found
|
|
(~reference-attr-not-found :slug slug)
|
|
(~reference-header-detail-content
|
|
:title header-title
|
|
:direction header-direction
|
|
:description header-description
|
|
:example-code header-example
|
|
:demo header-demo)))
|
|
|
|
(defpage reference-event-detail
|
|
:path "/reference/events/<slug>"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Reference"
|
|
:sub-label "Reference"
|
|
:sub-href "/reference/"
|
|
:sub-nav (~section-nav :items reference-nav-items :current "Events")
|
|
:selected "Events")
|
|
:data (event-detail-data slug)
|
|
:content (if event-not-found
|
|
(~reference-attr-not-found :slug slug)
|
|
(~reference-event-detail-content
|
|
:title event-title
|
|
:description event-description
|
|
:example-code event-example
|
|
:demo event-demo)))
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; Protocols section
|
|
;; ---------------------------------------------------------------------------
|
|
|
|
(defpage protocols-index
|
|
:path "/protocols/"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Protocols"
|
|
:sub-label "Protocols"
|
|
:sub-href "/protocols/wire-format"
|
|
:sub-nav (~section-nav :items protocols-nav-items :current "Wire Format")
|
|
:selected "Wire Format")
|
|
:content (~protocol-wire-format-content))
|
|
|
|
(defpage protocol-page
|
|
:path "/protocols/<slug>"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Protocols"
|
|
:sub-label "Protocols"
|
|
:sub-href "/protocols/wire-format"
|
|
:sub-nav (~section-nav :items protocols-nav-items
|
|
:current (find-current protocols-nav-items slug))
|
|
:selected (or (find-current protocols-nav-items slug) ""))
|
|
:content (case slug
|
|
"wire-format" (~protocol-wire-format-content)
|
|
"fragments" (~protocol-fragments-content)
|
|
"resolver-io" (~protocol-resolver-io-content)
|
|
"internal-services" (~protocol-internal-services-content)
|
|
"activitypub" (~protocol-activitypub-content)
|
|
"future" (~protocol-future-content)
|
|
:else (~protocol-wire-format-content)))
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; Examples section
|
|
;; ---------------------------------------------------------------------------
|
|
|
|
(defpage examples-index
|
|
:path "/examples/"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Examples"
|
|
:sub-label "Examples"
|
|
:sub-href "/examples/click-to-load"
|
|
:sub-nav (~section-nav :items examples-nav-items :current "Click to Load")
|
|
:selected "Click to Load")
|
|
:content (~example-click-to-load))
|
|
|
|
(defpage examples-page
|
|
:path "/examples/<slug>"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Examples"
|
|
:sub-label "Examples"
|
|
:sub-href "/examples/click-to-load"
|
|
:sub-nav (~section-nav :items examples-nav-items
|
|
:current (find-current examples-nav-items slug))
|
|
:selected (or (find-current examples-nav-items slug) ""))
|
|
:content (case slug
|
|
"click-to-load" (~example-click-to-load)
|
|
"form-submission" (~example-form-submission)
|
|
"polling" (~example-polling)
|
|
"delete-row" (~example-delete-row)
|
|
"inline-edit" (~example-inline-edit)
|
|
"oob-swaps" (~example-oob-swaps)
|
|
"lazy-loading" (~example-lazy-loading)
|
|
"infinite-scroll" (~example-infinite-scroll)
|
|
"progress-bar" (~example-progress-bar)
|
|
"active-search" (~example-active-search)
|
|
"inline-validation" (~example-inline-validation)
|
|
"value-select" (~example-value-select)
|
|
"reset-on-submit" (~example-reset-on-submit)
|
|
"edit-row" (~example-edit-row)
|
|
"bulk-update" (~example-bulk-update)
|
|
"swap-positions" (~example-swap-positions)
|
|
"select-filter" (~example-select-filter)
|
|
"tabs" (~example-tabs)
|
|
"animations" (~example-animations)
|
|
"dialogs" (~example-dialogs)
|
|
"keyboard-shortcuts" (~example-keyboard-shortcuts)
|
|
"put-patch" (~example-put-patch)
|
|
"json-encoding" (~example-json-encoding)
|
|
"vals-and-headers" (~example-vals-and-headers)
|
|
"loading-states" (~example-loading-states)
|
|
"sync-replace" (~example-sync-replace)
|
|
"retry" (~example-retry)
|
|
:else (~example-click-to-load)))
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; Essays section
|
|
;; ---------------------------------------------------------------------------
|
|
|
|
(defpage essays-index
|
|
:path "/essays/"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Essays"
|
|
:sub-label "Essays"
|
|
:sub-href "/essays/"
|
|
:sub-nav (~section-nav :items essays-nav-items :current "")
|
|
:selected "")
|
|
:content (~essays-index-content))
|
|
|
|
(defpage essay-page
|
|
:path "/essays/<slug>"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Essays"
|
|
:sub-label "Essays"
|
|
:sub-href "/essays/"
|
|
:sub-nav (~section-nav :items essays-nav-items
|
|
:current (find-current essays-nav-items slug))
|
|
:selected (or (find-current essays-nav-items slug) ""))
|
|
:content (case slug
|
|
"sx-sucks" (~essay-sx-sucks)
|
|
"why-sexps" (~essay-why-sexps)
|
|
"htmx-react-hybrid" (~essay-htmx-react-hybrid)
|
|
"on-demand-css" (~essay-on-demand-css)
|
|
"client-reactivity" (~essay-client-reactivity)
|
|
"sx-native" (~essay-sx-native)
|
|
"tail-call-optimization" (~essay-tail-call-optimization)
|
|
"continuations" (~essay-continuations)
|
|
"reflexive-web" (~essay-reflexive-web)
|
|
"server-architecture" (~essay-server-architecture)
|
|
"separation-of-concerns" (~essay-separation-of-concerns)
|
|
"sx-and-ai" (~essay-sx-and-ai)
|
|
"no-alternative" (~essay-no-alternative)
|
|
"zero-tooling" (~essay-zero-tooling)
|
|
:else (~essays-index-content)))
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; Philosophy section
|
|
;; ---------------------------------------------------------------------------
|
|
|
|
(defpage philosophy-index
|
|
:path "/philosophy/"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Philosophy"
|
|
:sub-label "Philosophy"
|
|
:sub-href "/philosophy/"
|
|
:sub-nav (~section-nav :items philosophy-nav-items :current "")
|
|
:selected "")
|
|
:content (~philosophy-index-content))
|
|
|
|
(defpage philosophy-page
|
|
:path "/philosophy/<slug>"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Philosophy"
|
|
:sub-label "Philosophy"
|
|
:sub-href "/philosophy/"
|
|
:sub-nav (~section-nav :items philosophy-nav-items
|
|
:current (find-current philosophy-nav-items slug))
|
|
:selected (or (find-current philosophy-nav-items slug) ""))
|
|
:content (case slug
|
|
"sx-manifesto" (~essay-sx-manifesto)
|
|
"godel-escher-bach" (~essay-godel-escher-bach)
|
|
"wittgenstein" (~essay-sx-and-wittgenstein)
|
|
"dennett" (~essay-sx-and-dennett)
|
|
"existentialism" (~essay-s-existentialism)
|
|
:else (~philosophy-index-content)))
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; CSSX section
|
|
;; ---------------------------------------------------------------------------
|
|
|
|
(defpage cssx-index
|
|
:path "/cssx/"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "CSSX"
|
|
:sub-label "CSSX"
|
|
:sub-href "/cssx/"
|
|
:sub-nav (~section-nav :items cssx-nav-items :current "Overview")
|
|
:selected "Overview")
|
|
:content (~cssx-overview-content))
|
|
|
|
(defpage cssx-page
|
|
:path "/cssx/<slug>"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "CSSX"
|
|
:sub-label "CSSX"
|
|
:sub-href "/cssx/"
|
|
:sub-nav (~section-nav :items cssx-nav-items
|
|
:current (find-current cssx-nav-items slug))
|
|
:selected (or (find-current cssx-nav-items slug) ""))
|
|
:content (case slug
|
|
"patterns" (~cssx-patterns-content)
|
|
"delivery" (~cssx-delivery-content)
|
|
"async" (~cssx-async-content)
|
|
"live" (~cssx-live-content)
|
|
"comparisons" (~cssx-comparison-content)
|
|
"philosophy" (~cssx-philosophy-content)
|
|
:else (~cssx-overview-content)))
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; Specs section
|
|
;; ---------------------------------------------------------------------------
|
|
|
|
(defpage specs-index
|
|
:path "/specs/"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Specs"
|
|
:sub-label "Specs"
|
|
:sub-href "/specs/"
|
|
:sub-nav (~section-nav :items specs-nav-items :current "Architecture")
|
|
:selected "Architecture")
|
|
:content (~spec-architecture-content))
|
|
|
|
(defpage specs-page
|
|
:path "/specs/<slug>"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Specs"
|
|
:sub-label "Specs"
|
|
:sub-href "/specs/"
|
|
:sub-nav (~section-nav :items specs-nav-items
|
|
:current (find-current specs-nav-items slug))
|
|
:selected (or (find-current specs-nav-items slug) ""))
|
|
:content (case slug
|
|
"core" (~spec-overview-content
|
|
:spec-title "Core Language"
|
|
:spec-files (map (fn (item)
|
|
(dict :title (get item "title") :desc (get item "desc")
|
|
:prose (get item "prose")
|
|
:filename (get item "filename") :href (str "/specs/" (get item "slug"))
|
|
:source (read-spec-file (get item "filename"))))
|
|
core-spec-items))
|
|
"adapters" (~spec-overview-content
|
|
:spec-title "Adapters & Engine"
|
|
:spec-files (map (fn (item)
|
|
(dict :title (get item "title") :desc (get item "desc")
|
|
:prose (get item "prose")
|
|
:filename (get item "filename") :href (str "/specs/" (get item "slug"))
|
|
:source (read-spec-file (get item "filename"))))
|
|
adapter-spec-items))
|
|
"browser" (~spec-overview-content
|
|
:spec-title "Browser"
|
|
:spec-files (map (fn (item)
|
|
(dict :title (get item "title") :desc (get item "desc")
|
|
:prose (get item "prose")
|
|
:filename (get item "filename") :href (str "/specs/" (get item "slug"))
|
|
:source (read-spec-file (get item "filename"))))
|
|
browser-spec-items))
|
|
"extensions" (~spec-overview-content
|
|
:spec-title "Extensions"
|
|
:spec-files (map (fn (item)
|
|
(dict :title (get item "title") :desc (get item "desc")
|
|
:prose (get item "prose")
|
|
:filename (get item "filename") :href (str "/specs/" (get item "slug"))
|
|
:source (read-spec-file (get item "filename"))))
|
|
extension-spec-items))
|
|
:else (let ((spec (find-spec slug)))
|
|
(if spec
|
|
(~spec-detail-content
|
|
:spec-title (get spec "title")
|
|
:spec-desc (get spec "desc")
|
|
:spec-filename (get spec "filename")
|
|
:spec-source (read-spec-file (get spec "filename"))
|
|
:spec-prose (get spec "prose"))
|
|
(~spec-not-found :slug slug)))))
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; Bootstrappers section
|
|
;; ---------------------------------------------------------------------------
|
|
|
|
(defpage bootstrappers-index
|
|
:path "/bootstrappers/"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Bootstrappers"
|
|
:sub-label "Bootstrappers"
|
|
:sub-href "/bootstrappers/"
|
|
:sub-nav (~section-nav :items bootstrappers-nav-items :current "Overview")
|
|
:selected "Overview")
|
|
:content (~bootstrappers-index-content))
|
|
|
|
(defpage bootstrapper-page
|
|
:path "/bootstrappers/<slug>"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Bootstrappers"
|
|
:sub-label "Bootstrappers"
|
|
:sub-href "/bootstrappers/"
|
|
:sub-nav (~section-nav :items bootstrappers-nav-items
|
|
:current (find-current bootstrappers-nav-items slug))
|
|
:selected (or (find-current bootstrappers-nav-items slug) ""))
|
|
:data (bootstrapper-data slug)
|
|
:content (if bootstrapper-not-found
|
|
(~spec-not-found :slug slug)
|
|
(if (= slug "python")
|
|
(~bootstrapper-py-content
|
|
:bootstrapper-source bootstrapper-source
|
|
:bootstrapped-output bootstrapped-output)
|
|
(~bootstrapper-js-content
|
|
:bootstrapper-source bootstrapper-source
|
|
:bootstrapped-output bootstrapped-output))))
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; Isomorphism section
|
|
;; ---------------------------------------------------------------------------
|
|
|
|
(defpage isomorphism-index
|
|
:path "/isomorphism/"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Isomorphism"
|
|
:sub-label "Isomorphism"
|
|
:sub-href "/isomorphism/"
|
|
:sub-nav (~section-nav :items isomorphism-nav-items :current "Roadmap")
|
|
:selected "Roadmap")
|
|
:content (~plan-isomorphic-content))
|
|
|
|
(defpage bundle-analyzer
|
|
:path "/isomorphism/bundle-analyzer"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Isomorphism"
|
|
:sub-label "Isomorphism"
|
|
:sub-href "/isomorphism/"
|
|
:sub-nav (~section-nav :items isomorphism-nav-items :current "Bundle Analyzer")
|
|
:selected "Bundle Analyzer")
|
|
:data (bundle-analyzer-data)
|
|
:content (~bundle-analyzer-content
|
|
:pages pages :total-components total-components :total-macros total-macros
|
|
:pure-count pure-count :io-count io-count))
|
|
|
|
(defpage routing-analyzer
|
|
:path "/isomorphism/routing-analyzer"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Isomorphism"
|
|
:sub-label "Isomorphism"
|
|
:sub-href "/isomorphism/"
|
|
:sub-nav (~section-nav :items isomorphism-nav-items :current "Routing Analyzer")
|
|
:selected "Routing Analyzer")
|
|
:data (routing-analyzer-data)
|
|
:content (~routing-analyzer-content
|
|
:pages pages :total-pages total-pages :client-count client-count
|
|
:server-count server-count :registry-sample registry-sample))
|
|
|
|
(defpage data-test
|
|
:path "/isomorphism/data-test"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Isomorphism"
|
|
:sub-label "Isomorphism"
|
|
:sub-href "/isomorphism/"
|
|
:sub-nav (~section-nav :items isomorphism-nav-items :current "Data Test")
|
|
:selected "Data Test")
|
|
:data (data-test-data)
|
|
:content (~data-test-content
|
|
:server-time server-time :items items
|
|
:phase phase :transport transport))
|
|
|
|
(defpage async-io-demo
|
|
:path "/isomorphism/async-io"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Isomorphism"
|
|
:sub-label "Isomorphism"
|
|
:sub-href "/isomorphism/"
|
|
:sub-nav (~section-nav :items isomorphism-nav-items :current "Async IO")
|
|
:selected "Async IO")
|
|
:content (~async-io-demo-content))
|
|
|
|
(defpage streaming-demo
|
|
:path "/isomorphism/streaming"
|
|
:auth :public
|
|
:stream true
|
|
:layout (:sx-section
|
|
:section "Isomorphism"
|
|
:sub-label "Isomorphism"
|
|
:sub-href "/isomorphism/"
|
|
:sub-nav (~section-nav :items isomorphism-nav-items :current "Streaming")
|
|
:selected "Streaming")
|
|
:shell (~streaming-demo-layout
|
|
(~suspense :id "stream-fast" :fallback (~stream-skeleton))
|
|
(~suspense :id "stream-medium" :fallback (~stream-skeleton))
|
|
(~suspense :id "stream-slow" :fallback (~stream-skeleton)))
|
|
:data (streaming-demo-data)
|
|
:content (~streaming-demo-chunk
|
|
:stream-label stream-label
|
|
:stream-color stream-color
|
|
:stream-message stream-message
|
|
:stream-time stream-time))
|
|
|
|
(defpage affinity-demo
|
|
:path "/isomorphism/affinity"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Isomorphism"
|
|
:sub-label "Isomorphism"
|
|
:sub-href "/isomorphism/"
|
|
:sub-nav (~section-nav :items isomorphism-nav-items :current "Affinity")
|
|
:selected "Affinity")
|
|
:data (affinity-demo-data)
|
|
:content (~affinity-demo-content :components components :page-plans page-plans))
|
|
|
|
(defpage optimistic-demo
|
|
:path "/isomorphism/optimistic"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Isomorphism"
|
|
:sub-label "Isomorphism"
|
|
:sub-href "/isomorphism/"
|
|
:sub-nav (~section-nav :items isomorphism-nav-items :current "Optimistic")
|
|
:selected "Optimistic")
|
|
:data (optimistic-demo-data)
|
|
:content (~optimistic-demo-content :items items :server-time server-time))
|
|
|
|
(defpage offline-demo
|
|
:path "/isomorphism/offline"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Isomorphism"
|
|
:sub-label "Isomorphism"
|
|
:sub-href "/isomorphism/"
|
|
:sub-nav (~section-nav :items isomorphism-nav-items :current "Offline")
|
|
:selected "Offline")
|
|
:data (offline-demo-data)
|
|
:content (~offline-demo-content :notes notes :server-time server-time))
|
|
|
|
;; Wildcard must come AFTER specific routes (first-match routing)
|
|
(defpage isomorphism-page
|
|
:path "/isomorphism/<slug>"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Isomorphism"
|
|
:sub-label "Isomorphism"
|
|
:sub-href "/isomorphism/"
|
|
:sub-nav (~section-nav :items isomorphism-nav-items
|
|
:current (find-current isomorphism-nav-items slug))
|
|
:selected (or (find-current isomorphism-nav-items slug) ""))
|
|
:content (case slug
|
|
"bundle-analyzer" (~bundle-analyzer-content
|
|
:pages pages :total-components total-components :total-macros total-macros
|
|
:pure-count pure-count :io-count io-count)
|
|
"routing-analyzer" (~routing-analyzer-content
|
|
:pages pages :total-pages total-pages :client-count client-count
|
|
:server-count server-count :registry-sample registry-sample)
|
|
:else (~plan-isomorphic-content)))
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; Plans section
|
|
;; ---------------------------------------------------------------------------
|
|
|
|
(defpage plans-index
|
|
:path "/plans/"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Plans"
|
|
:sub-label "Plans"
|
|
:sub-href "/plans/"
|
|
:sub-nav (~section-nav :items plans-nav-items :current "")
|
|
:selected "")
|
|
:content (~plans-index-content))
|
|
|
|
(defpage plan-page
|
|
:path "/plans/<slug>"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Plans"
|
|
:sub-label "Plans"
|
|
:sub-href "/plans/"
|
|
:sub-nav (~section-nav :items plans-nav-items
|
|
:current (find-current plans-nav-items slug))
|
|
:selected (or (find-current plans-nav-items slug) ""))
|
|
:content (case slug
|
|
"status" (~plan-status-content)
|
|
"reader-macros" (~plan-reader-macros-content)
|
|
"sx-activity" (~plan-sx-activity-content)
|
|
"predictive-prefetch" (~plan-predictive-prefetch-content)
|
|
"content-addressed-components" (~plan-content-addressed-components-content)
|
|
"fragment-protocol" (~plan-fragment-protocol-content)
|
|
"glue-decoupling" (~plan-glue-decoupling-content)
|
|
"social-sharing" (~plan-social-sharing-content)
|
|
"sx-ci" (~plan-sx-ci-content)
|
|
"live-streaming" (~plan-live-streaming-content)
|
|
:else (~plans-index-content)))
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; Reactive Islands section
|
|
;; ---------------------------------------------------------------------------
|
|
|
|
(defpage reactive-islands-index
|
|
:path "/reactive-islands/"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Reactive Islands"
|
|
:sub-label "Reactive Islands"
|
|
:sub-href "/reactive-islands/"
|
|
:sub-nav (~section-nav :items reactive-islands-nav-items :current "Overview")
|
|
:selected "Overview")
|
|
:content (~reactive-islands-index-content))
|
|
|
|
(defpage reactive-islands-page
|
|
:path "/reactive-islands/<slug>"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Reactive Islands"
|
|
:sub-label "Reactive Islands"
|
|
:sub-href "/reactive-islands/"
|
|
:sub-nav (~section-nav :items reactive-islands-nav-items
|
|
:current (find-current reactive-islands-nav-items slug))
|
|
:selected (or (find-current reactive-islands-nav-items slug) ""))
|
|
:content (case slug
|
|
"demo" (~reactive-islands-demo-content)
|
|
"event-bridge" (~reactive-islands-event-bridge-content)
|
|
"named-stores" (~reactive-islands-named-stores-content)
|
|
"plan" (~reactive-islands-plan-content)
|
|
"phase2" (~reactive-islands-phase2-content)
|
|
:else (~reactive-islands-index-content)))
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; Testing section
|
|
;; ---------------------------------------------------------------------------
|
|
|
|
(defpage testing-index
|
|
:path "/testing/"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Testing"
|
|
:sub-label "Testing"
|
|
:sub-href "/testing/"
|
|
:sub-nav (~section-nav :items testing-nav-items :current "Overview")
|
|
:selected "Overview")
|
|
:data (run-modular-tests "all")
|
|
:content (~testing-overview-content
|
|
:server-results server-results
|
|
:framework-source framework-source
|
|
:eval-source eval-source
|
|
:parser-source parser-source
|
|
:router-source router-source
|
|
:render-source render-source
|
|
:deps-source deps-source
|
|
:engine-source engine-source))
|
|
|
|
(defpage testing-page
|
|
:path "/testing/<slug>"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Testing"
|
|
:sub-label "Testing"
|
|
:sub-href "/testing/"
|
|
:sub-nav (~section-nav :items testing-nav-items
|
|
:current (find-current testing-nav-items slug))
|
|
:selected (or (find-current testing-nav-items slug) ""))
|
|
:data (case slug
|
|
"eval" (run-modular-tests "eval")
|
|
"parser" (run-modular-tests "parser")
|
|
"router" (run-modular-tests "router")
|
|
"render" (run-modular-tests "render")
|
|
"deps" (run-modular-tests "deps")
|
|
"engine" (run-modular-tests "engine")
|
|
"orchestration" (run-modular-tests "orchestration")
|
|
:else (dict))
|
|
:content (case slug
|
|
"eval" (~testing-spec-content
|
|
:spec-name "eval"
|
|
:spec-title "Evaluator Tests"
|
|
:spec-desc "81 tests covering the core evaluator and all primitives — literals, arithmetic, comparison, strings, lists, dicts, predicates, special forms, lambdas, higher-order functions, components, macros, threading, and edge cases."
|
|
:spec-source spec-source
|
|
:framework-source framework-source
|
|
:server-results server-results)
|
|
"parser" (~testing-spec-content
|
|
:spec-name "parser"
|
|
:spec-title "Parser Tests"
|
|
:spec-desc "39 tests covering tokenization and parsing — integers, floats, strings, escape sequences, booleans, nil, keywords, symbols, lists, dicts, whitespace, comments, quote sugar, serialization, and round-trips."
|
|
:spec-source spec-source
|
|
:framework-source framework-source
|
|
:server-results server-results)
|
|
"router" (~testing-spec-content
|
|
:spec-name "router"
|
|
:spec-title "Router Tests"
|
|
:spec-desc "18 tests covering client-side route matching — path splitting, pattern parsing, segment matching, parameter extraction, and route table search."
|
|
:spec-source spec-source
|
|
:framework-source framework-source
|
|
:server-results server-results)
|
|
"render" (~testing-spec-content
|
|
:spec-name "render"
|
|
:spec-title "Renderer Tests"
|
|
:spec-desc "23 tests covering HTML rendering — elements, attributes, void elements, boolean attributes, fragments, escaping, control flow, and component rendering."
|
|
:spec-source spec-source
|
|
:framework-source framework-source
|
|
:server-results server-results)
|
|
"deps" (~testing-spec-content
|
|
:spec-name "deps"
|
|
:spec-title "Dependency Analysis Tests"
|
|
:spec-desc "33 tests covering component dependency analysis — scan-refs, scan-components-from-source, transitive-deps, components-needed, scan-io-refs, and component-pure? classification."
|
|
:spec-source spec-source
|
|
:framework-source framework-source
|
|
:server-results server-results)
|
|
"engine" (~testing-spec-content
|
|
:spec-name "engine"
|
|
:spec-title "Engine Tests"
|
|
:spec-desc "37 tests covering engine pure functions — parse-time, parse-trigger-spec, default-trigger, parse-swap-spec, parse-retry-spec, next-retry-ms, and filter-params."
|
|
:spec-source spec-source
|
|
:framework-source framework-source
|
|
:server-results server-results)
|
|
"orchestration" (~testing-spec-content
|
|
:spec-name "orchestration"
|
|
:spec-title "Orchestration Tests"
|
|
:spec-desc "17 tests covering Phase 7c+7d orchestration — page data cache, optimistic cache update/revert/confirm, offline connectivity, offline queue mutation, and offline-aware routing."
|
|
:spec-source spec-source
|
|
:framework-source framework-source
|
|
:server-results server-results)
|
|
"runners" (~testing-runners-content)
|
|
:else (~testing-overview-content
|
|
:server-results server-results)))
|