URL restructure, 404 page, trailing slash normalization, layout fixes

- Rename /reactive-islands/ → /reactive/, /reference/ → /hypermedia/reference/,
  /examples/ → /hypermedia/examples/ across all .sx and .py files
- Add 404 error page (not-found.sx) working on both server refresh and
  client-side SX navigation via orchestration.sx error response handling
- Add trailing slash redirect (GET only, excludes /api/, /static/, /internal/)
- Remove blue sky-500 header bar from SX docs layout (conditional on header-rows)
- Fix 405 on API endpoints from trailing slash redirect hitting POST/PUT/DELETE
- Fix client-side 404: orchestration.sx now swaps error response content
  instead of silently dropping it
- Add new plan files and home page component

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-10 21:30:18 +00:00
parent e149dfe968
commit 1341c144da
35 changed files with 2305 additions and 438 deletions

View File

@@ -12,10 +12,10 @@
(dict :label "Server Rendering" :href "/docs/server-rendering")))
(define reference-nav-items (list
(dict :label "Attributes" :href "/reference/attributes")
(dict :label "Headers" :href "/reference/headers")
(dict :label "Events" :href "/reference/events")
(dict :label "JS API" :href "/reference/js-api")))
(dict :label "Attributes" :href "/hypermedia/reference/attributes")
(dict :label "Headers" :href "/hypermedia/reference/headers")
(dict :label "Events" :href "/hypermedia/reference/events")
(dict :label "JS API" :href "/hypermedia/reference/js-api")))
(define protocols-nav-items (list
(dict :label "Wire Format" :href "/protocols/wire-format")
@@ -26,33 +26,33 @@
(dict :label "Future" :href "/protocols/future")))
(define examples-nav-items (list
(dict :label "Click to Load" :href "/examples/click-to-load")
(dict :label "Form Submission" :href "/examples/form-submission")
(dict :label "Polling" :href "/examples/polling")
(dict :label "Delete Row" :href "/examples/delete-row")
(dict :label "Inline Edit" :href "/examples/inline-edit")
(dict :label "OOB Swaps" :href "/examples/oob-swaps")
(dict :label "Lazy Loading" :href "/examples/lazy-loading")
(dict :label "Infinite Scroll" :href "/examples/infinite-scroll")
(dict :label "Progress Bar" :href "/examples/progress-bar")
(dict :label "Active Search" :href "/examples/active-search")
(dict :label "Inline Validation" :href "/examples/inline-validation")
(dict :label "Value Select" :href "/examples/value-select")
(dict :label "Reset on Submit" :href "/examples/reset-on-submit")
(dict :label "Edit Row" :href "/examples/edit-row")
(dict :label "Bulk Update" :href "/examples/bulk-update")
(dict :label "Swap Positions" :href "/examples/swap-positions")
(dict :label "Select Filter" :href "/examples/select-filter")
(dict :label "Tabs" :href "/examples/tabs")
(dict :label "Animations" :href "/examples/animations")
(dict :label "Dialogs" :href "/examples/dialogs")
(dict :label "Keyboard Shortcuts" :href "/examples/keyboard-shortcuts")
(dict :label "PUT / PATCH" :href "/examples/put-patch")
(dict :label "JSON Encoding" :href "/examples/json-encoding")
(dict :label "Vals & Headers" :href "/examples/vals-and-headers")
(dict :label "Loading States" :href "/examples/loading-states")
(dict :label "Request Abort" :href "/examples/sync-replace")
(dict :label "Retry" :href "/examples/retry")))
(dict :label "Click to Load" :href "/hypermedia/examples/click-to-load")
(dict :label "Form Submission" :href "/hypermedia/examples/form-submission")
(dict :label "Polling" :href "/hypermedia/examples/polling")
(dict :label "Delete Row" :href "/hypermedia/examples/delete-row")
(dict :label "Inline Edit" :href "/hypermedia/examples/inline-edit")
(dict :label "OOB Swaps" :href "/hypermedia/examples/oob-swaps")
(dict :label "Lazy Loading" :href "/hypermedia/examples/lazy-loading")
(dict :label "Infinite Scroll" :href "/hypermedia/examples/infinite-scroll")
(dict :label "Progress Bar" :href "/hypermedia/examples/progress-bar")
(dict :label "Active Search" :href "/hypermedia/examples/active-search")
(dict :label "Inline Validation" :href "/hypermedia/examples/inline-validation")
(dict :label "Value Select" :href "/hypermedia/examples/value-select")
(dict :label "Reset on Submit" :href "/hypermedia/examples/reset-on-submit")
(dict :label "Edit Row" :href "/hypermedia/examples/edit-row")
(dict :label "Bulk Update" :href "/hypermedia/examples/bulk-update")
(dict :label "Swap Positions" :href "/hypermedia/examples/swap-positions")
(dict :label "Select Filter" :href "/hypermedia/examples/select-filter")
(dict :label "Tabs" :href "/hypermedia/examples/tabs")
(dict :label "Animations" :href "/hypermedia/examples/animations")
(dict :label "Dialogs" :href "/hypermedia/examples/dialogs")
(dict :label "Keyboard Shortcuts" :href "/hypermedia/examples/keyboard-shortcuts")
(dict :label "PUT / PATCH" :href "/hypermedia/examples/put-patch")
(dict :label "JSON Encoding" :href "/hypermedia/examples/json-encoding")
(dict :label "Vals & Headers" :href "/hypermedia/examples/vals-and-headers")
(dict :label "Loading States" :href "/hypermedia/examples/loading-states")
(dict :label "Request Abort" :href "/hypermedia/examples/sync-replace")
(dict :label "Retry" :href "/hypermedia/examples/retry")))
(define cssx-nav-items (list
(dict :label "Overview" :href "/cssx/")
@@ -200,22 +200,26 @@
(dict :label "Async Eval Convergence" :href "/plans/async-eval-convergence"
:summary "Eliminate hand-written evaluators — bootstrap async_eval.py from the spec via an async adapter layer. One spec, one truth, zero divergence.")
(dict :label "WASM Bytecode VM" :href "/plans/wasm-bytecode-vm"
:summary "Compile SX to bytecode, run in a Rust/WASM VM. Compact wire format, no parse overhead, near-native speed, DOM via JS bindings.")))
:summary "Compile SX to bytecode, run in a Rust/WASM VM. Compact wire format, no parse overhead, near-native speed, DOM via JS bindings.")
(dict :label "Generative SX" :href "/plans/generative-sx"
:summary "Programs that write themselves as they run — self-compiling specs, runtime self-extension, generative testing, seed networks.")
(dict :label "Art DAG on SX" :href "/plans/art-dag-sx"
:summary "SX endpoints as portals into media processing environments — recipes as programs, split execution across GPU/cache/live boundaries, streaming AV output.")))
(define reactive-islands-nav-items (list
(dict :label "Overview" :href "/reactive-islands/"
(dict :label "Overview" :href "/reactive/"
:summary "Architecture, four levels (L0-L3), and current implementation status.")
(dict :label "Demo" :href "/reactive-islands/demo"
(dict :label "Demo" :href "/reactive/demo"
:summary "Live demonstration of signals, computed, effects, batch, and defisland — all transpiled from spec.")
(dict :label "Event Bridge" :href "/reactive-islands/event-bridge"
(dict :label "Event Bridge" :href "/reactive/event-bridge"
:summary "DOM events for htmx lake → island communication. Server-rendered buttons dispatch custom events that island effects listen for.")
(dict :label "Named Stores" :href "/reactive-islands/named-stores"
(dict :label "Named Stores" :href "/reactive/named-stores"
:summary "Page-level signal containers via def-store/use-store — persist across island destruction/recreation.")
(dict :label "Plan" :href "/reactive-islands/plan"
(dict :label "Plan" :href "/reactive/plan"
:summary "The full design document — rendering boundary, state flow, signal primitives, island lifecycle.")
(dict :label "Marshes" :href "/reactive-islands/marshes"
(dict :label "Marshes" :href "/reactive/marshes"
:summary "Where reactivity and hypermedia interpenetrate — server writes to signals, reactive transforms reshape server content, client state modifies how hypermedia is interpreted.")
(dict :label "Phase 2" :href "/reactive-islands/phase2"
(dict :label "Phase 2" :href "/reactive/phase2"
:summary "Input binding, keyed lists, reactive class/style, refs, portals, error boundaries, suspense, transitions.")))
(define bootstrappers-nav-items (list
@@ -322,19 +326,21 @@
(define sx-nav-tree
{:label "sx" :href "/"
:children (list
{:label "Reactive" :href "/reactive/" :children reactive-islands-nav-items}
{:label "Hypermedia" :href "/hypermedia/"
:children (list
{:label "Reference" :href "/hypermedia/reference/" :children reference-nav-items}
{:label "Examples" :href "/hypermedia/examples/" :children examples-nav-items})}
{:label "Docs" :href "/docs/" :children docs-nav-items}
{:label "CSSX" :href "/cssx/" :children cssx-nav-items}
{:label "Reference" :href "/reference/" :children reference-nav-items}
{:label "Protocols" :href "/protocols/" :children protocols-nav-items}
{:label "Examples" :href "/examples/" :children examples-nav-items}
{:label "Essays" :href "/essays/" :children essays-nav-items}
{:label "Philosophy" :href "/philosophy/" :children philosophy-nav-items}
{:label "Specs" :href "/specs/" :children specs-nav-items}
{:label "Bootstrappers" :href "/bootstrappers/" :children bootstrappers-nav-items}
{:label "Testing" :href "/testing/" :children testing-nav-items}
{:label "Isomorphism" :href "/isomorphism/" :children isomorphism-nav-items}
{:label "Plans" :href "/plans/" :children plans-nav-items}
{:label "Reactive Islands" :href "/reactive-islands/" :children reactive-islands-nav-items})})
{:label "Plans" :href "/plans/" :children plans-nav-items})})
;; Resolve a URL path to a nav trail + children.
;; Returns {:trail [{:node N :siblings S} ...] :children [...] :depth N}