Prefix all SX URLs with /sx/ for WhatsApp-safe sharing

All routes moved under /sx/ prefix:
- / redirects to /sx/
- /sx/ serves home page
- /sx/<path:expr> is the catch-all for SX expression URLs
- Bare /(...) and /~... redirect to /sx/(...) and /sx/~...
- All ~600 hrefs, sx-get attrs, defhandler paths, redirect
  targets, and blueprint routes updated across 44 files

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-12 19:07:09 +00:00
parent acd2fa6541
commit de80d921e9
44 changed files with 701 additions and 687 deletions

View File

@@ -32,36 +32,36 @@
(tbody
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(spec.parser))" :class "hover:underline"
:sx-get "/(language.(spec.parser))" :sx-target "#main-panel" :sx-select "#main-panel"
(a :href "/sx/(language.(spec.parser))" :class "hover:underline"
:sx-get "/sx/(language.(spec.parser))" :sx-target "#main-panel" :sx-select "#main-panel"
:sx-swap "outerHTML" :sx-push-url "true"
"parser.sx"))
(td :class "px-3 py-2 text-stone-700" "Tokenization and parsing of SX source text into AST"))
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(spec.evaluator))" :class "hover:underline"
:sx-get "/(language.(spec.evaluator))" :sx-target "#main-panel" :sx-select "#main-panel"
(a :href "/sx/(language.(spec.evaluator))" :class "hover:underline"
:sx-get "/sx/(language.(spec.evaluator))" :sx-target "#main-panel" :sx-select "#main-panel"
:sx-swap "outerHTML" :sx-push-url "true"
"eval.sx"))
(td :class "px-3 py-2 text-stone-700" "Tree-walking evaluation of SX expressions"))
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(spec.primitives))" :class "hover:underline"
:sx-get "/(language.(spec.primitives))" :sx-target "#main-panel" :sx-select "#main-panel"
(a :href "/sx/(language.(spec.primitives))" :class "hover:underline"
:sx-get "/sx/(language.(spec.primitives))" :sx-target "#main-panel" :sx-select "#main-panel"
:sx-swap "outerHTML" :sx-push-url "true"
"primitives.sx"))
(td :class "px-3 py-2 text-stone-700" "All built-in pure functions and their signatures"))
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(spec.special-forms))" :class "hover:underline"
:sx-get "/(language.(spec.special-forms))" :sx-target "#main-panel" :sx-select "#main-panel"
(a :href "/sx/(language.(spec.special-forms))" :class "hover:underline"
:sx-get "/sx/(language.(spec.special-forms))" :sx-target "#main-panel" :sx-select "#main-panel"
:sx-swap "outerHTML" :sx-push-url "true"
"special-forms.sx"))
(td :class "px-3 py-2 text-stone-700" "All special forms — syntactic constructs with custom evaluation rules"))
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(spec.renderer))" :class "hover:underline"
:sx-get "/(language.(spec.renderer))" :sx-target "#main-panel" :sx-select "#main-panel"
(a :href "/sx/(language.(spec.renderer))" :class "hover:underline"
:sx-get "/sx/(language.(spec.renderer))" :sx-target "#main-panel" :sx-select "#main-panel"
:sx-swap "outerHTML" :sx-push-url "true"
"render.sx"))
(td :class "px-3 py-2 text-stone-700" "Shared rendering registries and utilities used by all adapters"))))))
@@ -79,32 +79,32 @@
(tbody
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(spec.adapter-dom))" :class "hover:underline"
:sx-get "/(language.(spec.adapter-dom))" :sx-target "#main-panel" :sx-select "#main-panel"
(a :href "/sx/(language.(spec.adapter-dom))" :class "hover:underline"
:sx-get "/sx/(language.(spec.adapter-dom))" :sx-target "#main-panel" :sx-select "#main-panel"
:sx-swap "outerHTML" :sx-push-url "true"
"adapter-dom.sx"))
(td :class "px-3 py-2 text-stone-700" "Live DOM nodes")
(td :class "px-3 py-2 text-stone-500" "Browser"))
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(spec.adapter-html))" :class "hover:underline"
:sx-get "/(language.(spec.adapter-html))" :sx-target "#main-panel" :sx-select "#main-panel"
(a :href "/sx/(language.(spec.adapter-html))" :class "hover:underline"
:sx-get "/sx/(language.(spec.adapter-html))" :sx-target "#main-panel" :sx-select "#main-panel"
:sx-swap "outerHTML" :sx-push-url "true"
"adapter-html.sx"))
(td :class "px-3 py-2 text-stone-700" "HTML strings")
(td :class "px-3 py-2 text-stone-500" "Server"))
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(spec.adapter-sx))" :class "hover:underline"
:sx-get "/(language.(spec.adapter-sx))" :sx-target "#main-panel" :sx-select "#main-panel"
(a :href "/sx/(language.(spec.adapter-sx))" :class "hover:underline"
:sx-get "/sx/(language.(spec.adapter-sx))" :sx-target "#main-panel" :sx-select "#main-panel"
:sx-swap "outerHTML" :sx-push-url "true"
"adapter-sx.sx"))
(td :class "px-3 py-2 text-stone-700" "SX wire format")
(td :class "px-3 py-2 text-stone-500" "Server to client"))
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(spec.adapter-async))" :class "hover:underline"
:sx-get "/(language.(spec.adapter-async))" :sx-target "#main-panel" :sx-select "#main-panel"
(a :href "/sx/(language.(spec.adapter-async))" :class "hover:underline"
:sx-get "/sx/(language.(spec.adapter-async))" :sx-target "#main-panel" :sx-select "#main-panel"
:sx-swap "outerHTML" :sx-push-url "true"
"adapter-async.sx"))
(td :class "px-3 py-2 text-stone-700" "HTML/SX with awaited I/O")
@@ -122,29 +122,29 @@
(tbody
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(spec.engine))" :class "hover:underline"
:sx-get "/(language.(spec.engine))" :sx-target "#main-panel" :sx-select "#main-panel"
(a :href "/sx/(language.(spec.engine))" :class "hover:underline"
:sx-get "/sx/(language.(spec.engine))" :sx-target "#main-panel" :sx-select "#main-panel"
:sx-swap "outerHTML" :sx-push-url "true"
"engine.sx"))
(td :class "px-3 py-2 text-stone-700" "Pure logic — trigger parsing, swap algorithms, morph, history, SSE, indicators"))
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(spec.orchestration))" :class "hover:underline"
:sx-get "/(language.(spec.orchestration))" :sx-target "#main-panel" :sx-select "#main-panel"
(a :href "/sx/(language.(spec.orchestration))" :class "hover:underline"
:sx-get "/sx/(language.(spec.orchestration))" :sx-target "#main-panel" :sx-select "#main-panel"
:sx-swap "outerHTML" :sx-push-url "true"
"orchestration.sx"))
(td :class "px-3 py-2 text-stone-700" "Browser wiring — binds engine to DOM events, fetch, request lifecycle"))
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(spec.boot))" :class "hover:underline"
:sx-get "/(language.(spec.boot))" :sx-target "#main-panel" :sx-select "#main-panel"
(a :href "/sx/(language.(spec.boot))" :class "hover:underline"
:sx-get "/sx/(language.(spec.boot))" :sx-target "#main-panel" :sx-select "#main-panel"
:sx-swap "outerHTML" :sx-push-url "true"
"boot.sx"))
(td :class "px-3 py-2 text-stone-700" "Browser startup — mount, hydrate, script processing, head hoisting"))
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(spec.router))" :class "hover:underline"
:sx-get "/(language.(spec.router))" :sx-target "#main-panel" :sx-select "#main-panel"
(a :href "/sx/(language.(spec.router))" :class "hover:underline"
:sx-get "/sx/(language.(spec.router))" :sx-target "#main-panel" :sx-select "#main-panel"
:sx-swap "outerHTML" :sx-push-url "true"
"router.sx"))
(td :class "px-3 py-2 text-stone-700" "Client-side route matching — Flask-style patterns, param extraction"))))))
@@ -161,8 +161,8 @@
(tbody
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(spec.signals))" :class "hover:underline"
:sx-get "/(language.(spec.signals))" :sx-target "#main-panel" :sx-select "#main-panel"
(a :href "/sx/(language.(spec.signals))" :class "hover:underline"
:sx-get "/sx/(language.(spec.signals))" :sx-target "#main-panel" :sx-select "#main-panel"
:sx-swap "outerHTML" :sx-push-url "true"
"signals.sx"))
(td :class "px-3 py-2 text-stone-700" "Signal runtime — signal, deref, reset!, swap!, computed, effect, batch, island scope"))))))
@@ -179,22 +179,22 @@
(tbody
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(spec.boundary))" :class "hover:underline"
:sx-get "/(language.(spec.boundary))" :sx-target "#main-panel" :sx-select "#main-panel"
(a :href "/sx/(language.(spec.boundary))" :class "hover:underline"
:sx-get "/sx/(language.(spec.boundary))" :sx-target "#main-panel" :sx-select "#main-panel"
:sx-swap "outerHTML" :sx-push-url "true"
"boundary.sx"))
(td :class "px-3 py-2 text-stone-700" "Language boundary — I/O primitives, page helpers, tier declarations"))
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(spec.forms))" :class "hover:underline"
:sx-get "/(language.(spec.forms))" :sx-target "#main-panel" :sx-select "#main-panel"
(a :href "/sx/(language.(spec.forms))" :class "hover:underline"
:sx-get "/sx/(language.(spec.forms))" :sx-target "#main-panel" :sx-select "#main-panel"
:sx-swap "outerHTML" :sx-push-url "true"
"forms.sx"))
(td :class "px-3 py-2 text-stone-700" "Definition forms — defhandler, defquery, defaction, defpage"))
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(spec.page-helpers))" :class "hover:underline"
:sx-get "/(language.(spec.page-helpers))" :sx-target "#main-panel" :sx-select "#main-panel"
(a :href "/sx/(language.(spec.page-helpers))" :class "hover:underline"
:sx-get "/sx/(language.(spec.page-helpers))" :sx-target "#main-panel" :sx-select "#main-panel"
:sx-swap "outerHTML" :sx-push-url "true"
"page-helpers.sx"))
(td :class "px-3 py-2 text-stone-700" "Pure data-transformation helpers for page rendering"))))))
@@ -248,29 +248,29 @@ deps.sx depends on: eval")))
(tbody
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(spec.continuations))" :class "hover:underline"
:sx-get "/(language.(spec.continuations))" :sx-target "#main-panel" :sx-select "#main-panel"
(a :href "/sx/(language.(spec.continuations))" :class "hover:underline"
:sx-get "/sx/(language.(spec.continuations))" :sx-target "#main-panel" :sx-select "#main-panel"
:sx-swap "outerHTML" :sx-push-url "true"
"continuations.sx"))
(td :class "px-3 py-2 text-stone-700" "Delimited continuations — shift/reset"))
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(spec.callcc))" :class "hover:underline"
:sx-get "/(language.(spec.callcc))" :sx-target "#main-panel" :sx-select "#main-panel"
(a :href "/sx/(language.(spec.callcc))" :class "hover:underline"
:sx-get "/sx/(language.(spec.callcc))" :sx-target "#main-panel" :sx-select "#main-panel"
:sx-swap "outerHTML" :sx-push-url "true"
"callcc.sx"))
(td :class "px-3 py-2 text-stone-700" "Full first-class continuations — call/cc"))
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(spec.types))" :class "hover:underline"
:sx-get "/(language.(spec.types))" :sx-target "#main-panel" :sx-select "#main-panel"
(a :href "/sx/(language.(spec.types))" :class "hover:underline"
:sx-get "/sx/(language.(spec.types))" :sx-target "#main-panel" :sx-select "#main-panel"
:sx-swap "outerHTML" :sx-push-url "true"
"types.sx"))
(td :class "px-3 py-2 text-stone-700" "Gradual type system — registration-time checking, zero runtime cost"))
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(spec.deps))" :class "hover:underline"
:sx-get "/(language.(spec.deps))" :sx-target "#main-panel" :sx-select "#main-panel"
(a :href "/sx/(language.(spec.deps))" :class "hover:underline"
:sx-get "/sx/(language.(spec.deps))" :sx-target "#main-panel" :sx-select "#main-panel"
:sx-swap "outerHTML" :sx-push-url "true"
"deps.sx"))
(td :class "px-3 py-2 text-stone-700" "Component dependency analysis — bundling, IO detection, CSS scoping"))))))
@@ -337,8 +337,8 @@ deps.sx depends on: eval")))
(div :class "flex items-center gap-3 mb-4"
(span :class "text-sm text-stone-400 font-mono" spec-filename)
(span :class "text-sm text-stone-500 flex-1" spec-desc)
(a :href (str "/(language.(spec.(explore." (replace spec-filename ".sx" "") ")))")
:sx-get (str "/(language.(spec.(explore." (replace spec-filename ".sx" "") ")))")
(a :href (str "/sx/(language.(spec.(explore." (replace spec-filename ".sx" "") ")))")
:sx-get (str "/sx/(language.(spec.(explore." (replace spec-filename ".sx" "") ")))")
:sx-target "#main-panel" :sx-select "#main-panel"
:sx-swap "outerHTML" :sx-push-url "true"
:class "text-sm text-violet-600 hover:text-violet-800 font-medium whitespace-nowrap"
@@ -380,21 +380,21 @@ deps.sx depends on: eval")))
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 text-stone-700" "JavaScript")
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(bootstrapper.javascript))" :class "hover:underline"
(a :href "/sx/(language.(bootstrapper.javascript))" :class "hover:underline"
"bootstrap_js.py"))
(td :class "px-3 py-2 font-mono text-sm text-stone-500" "sx-browser.js")
(td :class "px-3 py-2 text-green-600" "Live"))
(tr :class "border-b border-stone-100"
(td :class "px-3 py-2 text-stone-700" "Python")
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(bootstrapper.python))" :class "hover:underline"
(a :href "/sx/(language.(bootstrapper.python))" :class "hover:underline"
"bootstrap_py.py"))
(td :class "px-3 py-2 font-mono text-sm text-stone-500" "sx_ref.py")
(td :class "px-3 py-2 text-green-600" "Live"))
(tr :class "border-b border-stone-100 bg-green-50"
(td :class "px-3 py-2 text-stone-700" "Python (self-hosting)")
(td :class "px-3 py-2 font-mono text-sm text-violet-700"
(a :href "/(language.(bootstrapper.self-hosting))" :class "hover:underline"
(a :href "/sx/(language.(bootstrapper.self-hosting))" :class "hover:underline"
"py.sx"))
(td :class "px-3 py-2 font-mono text-sm text-stone-500" "sx_ref.py")
(td :class "px-3 py-2 text-green-600" "G0 == G1"))