- Fix highlight() returning SxExpr so syntax-highlighted code renders as DOM elements instead of leaking SX source text into the page - Add Specs section that reads and displays canonical SX spec files from shared/sx/ref/ with syntax highlighting - Add "The Reflexive Web" essay on SX becoming a complete LISP with AI as native participant - Change logo from (<x>) to (<sx>) everywhere - Unify all backgrounds to bg-stone-100, center code blocks - Skip component/style cookie cache in dev mode so .sx edits are visible immediately on refresh without clearing localStorage Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
282 lines
10 KiB
Plaintext
282 lines
10 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)))
|
|
"css" (~docs-css-content)
|
|
"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)))
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; 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/sx-sucks"
|
|
:sub-nav (~section-nav :items essays-nav-items :current "sx sucks")
|
|
:selected "sx sucks")
|
|
:content (~essay-sx-sucks))
|
|
|
|
(defpage essay-page
|
|
:path "/essays/<slug>"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Essays"
|
|
:sub-label "Essays"
|
|
:sub-href "/essays/sx-sucks"
|
|
: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)
|
|
"sx-manifesto" (~essay-sx-manifesto)
|
|
"tail-call-optimization" (~essay-tail-call-optimization)
|
|
"continuations" (~essay-continuations)
|
|
"godel-escher-bach" (~essay-godel-escher-bach)
|
|
"reflexive-web" (~essay-reflexive-web)
|
|
:else (~essay-sx-sucks)))
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; Specs section
|
|
;; ---------------------------------------------------------------------------
|
|
|
|
(defpage specs-index
|
|
:path "/specs/"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Specs"
|
|
:sub-label "Specs"
|
|
:sub-href "/specs/core"
|
|
:sub-nav (~section-nav :items specs-nav-items :current "Core")
|
|
:selected "Core")
|
|
:data (spec-data "core")
|
|
:content (~spec-core-content :spec-files spec-files))
|
|
|
|
(defpage specs-page
|
|
:path "/specs/<slug>"
|
|
:auth :public
|
|
:layout (:sx-section
|
|
:section "Specs"
|
|
:sub-label "Specs"
|
|
:sub-href "/specs/core"
|
|
:sub-nav (~section-nav :items specs-nav-items
|
|
:current (find-current specs-nav-items slug))
|
|
:selected (or (find-current specs-nav-items slug) ""))
|
|
:data (spec-data slug)
|
|
:content (if spec-not-found
|
|
(~spec-not-found :slug slug)
|
|
(case slug
|
|
"core" (~spec-core-content :spec-files spec-files)
|
|
:else (~spec-detail-content
|
|
:spec-title spec-title
|
|
:spec-desc spec-desc
|
|
:spec-filename spec-filename
|
|
:spec-source spec-source))))
|