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

@@ -55,7 +55,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-click
:path "/(geography.(hypermedia.(example.(api.click))))"
:path "/sx/(geography.(hypermedia.(example.(api.click))))"
:method :get
:returns "element"
(&key)
@@ -73,7 +73,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-form
:path "/(geography.(hypermedia.(example.(api.form))))"
:path "/sx/(geography.(hypermedia.(example.(api.form))))"
:method :post
:csrf false
:returns "element"
@@ -92,7 +92,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-poll
:path "/(geography.(hypermedia.(example.(api.poll))))"
:path "/sx/(geography.(hypermedia.(example.(api.poll))))"
:method :get
:returns "element"
(&key)
@@ -113,7 +113,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-delete
:path "/(geography.(hypermedia.(example.(api.(delete.<sx:item_id>)))))"
:path "/sx/(geography.(hypermedia.(example.(api.(delete.<sx:item_id>)))))"
:method :delete
:csrf false
:returns "element"
@@ -130,7 +130,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-edit-form
:path "/(geography.(hypermedia.(example.(api.edit))))"
:path "/sx/(geography.(hypermedia.(example.(api.edit))))"
:method :get
:returns "element"
(&key)
@@ -143,7 +143,7 @@
:text (str "(~inline-edit-form :value \"" value "\")")))))
(defhandler ex-edit-save
:path "/(geography.(hypermedia.(example.(api.edit))))"
:path "/sx/(geography.(hypermedia.(example.(api.edit))))"
:method :post
:csrf false
:returns "element"
@@ -157,7 +157,7 @@
:text (str "(~inline-view :value \"" value "\")")))))
(defhandler ex-edit-cancel
:path "/(geography.(hypermedia.(example.(api.edit-cancel))))"
:path "/sx/(geography.(hypermedia.(example.(api.edit-cancel))))"
:method :get
:returns "element"
(&key)
@@ -175,7 +175,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-oob
:path "/(geography.(hypermedia.(example.(api.oob))))"
:path "/sx/(geography.(hypermedia.(example.(api.oob))))"
:method :get
:returns "element"
(&key)
@@ -195,7 +195,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-lazy
:path "/(geography.(hypermedia.(example.(api.lazy))))"
:path "/sx/(geography.(hypermedia.(example.(api.lazy))))"
:method :get
:returns "element"
(&key)
@@ -213,7 +213,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-scroll
:path "/(geography.(hypermedia.(example.(api.scroll))))"
:path "/sx/(geography.(hypermedia.(example.(api.scroll))))"
:method :get
:returns "element"
(&key)
@@ -227,7 +227,7 @@
(range start (+ start 5)))
(if (<= (+ pg 1) 6)
(div :id "scroll-sentinel"
:sx-get (str "/(geography.(hypermedia.(example.(api.scroll))))?page=" (+ pg 1))
:sx-get (str "/sx/(geography.(hypermedia.(example.(api.scroll))))?page=" (+ pg 1))
:sx-trigger "intersect once"
:sx-target "#scroll-items"
:sx-swap "beforeend"
@@ -244,7 +244,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-progress-start
:path "/(geography.(hypermedia.(example.(api.progress-start))))"
:path "/sx/(geography.(hypermedia.(example.(api.progress-start))))"
:method :post
:csrf false
:returns "element"
@@ -261,7 +261,7 @@
:text (str "(~progress-status :percent 0 :job-id \"" job-id "\")"))))))
(defhandler ex-progress-status
:path "/(geography.(hypermedia.(example.(api.progress-status))))"
:path "/sx/(geography.(hypermedia.(example.(api.progress-status))))"
:method :get
:returns "element"
(&key)
@@ -282,7 +282,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-search
:path "/(geography.(hypermedia.(example.(api.search))))"
:path "/sx/(geography.(hypermedia.(example.(api.search))))"
:method :get
:returns "element"
(&key)
@@ -304,7 +304,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-validate
:path "/(geography.(hypermedia.(example.(api.validate))))"
:path "/sx/(geography.(hypermedia.(example.(api.validate))))"
:method :get
:returns "element"
(&key)
@@ -331,7 +331,7 @@
:text (nth result 1))))))
(defhandler ex-validate-submit
:path "/(geography.(hypermedia.(example.(api.validate-submit))))"
:path "/sx/(geography.(hypermedia.(example.(api.validate-submit))))"
:method :post
:csrf false
:returns "element"
@@ -347,7 +347,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-values
:path "/(geography.(hypermedia.(example.(api.values))))"
:path "/sx/(geography.(hypermedia.(example.(api.values))))"
:method :get
:returns "element"
(&key)
@@ -367,7 +367,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-reset-submit
:path "/(geography.(hypermedia.(example.(api.reset-submit))))"
:path "/sx/(geography.(hypermedia.(example.(api.reset-submit))))"
:method :post
:csrf false
:returns "element"
@@ -387,7 +387,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-editrow-form
:path "/(geography.(hypermedia.(example.(api.(editrow.<sx:row_id>)))))"
:path "/sx/(geography.(hypermedia.(example.(api.(editrow.<sx:row_id>)))))"
:method :get
:returns "element"
(&key row-id)
@@ -402,7 +402,7 @@
:text (str "(~edit-row-form :id \"" (get row "id") "\" ...)"))))))
(defhandler ex-editrow-save
:path "/(geography.(hypermedia.(example.(api.(editrow.<sx:row_id>)))))"
:path "/sx/(geography.(hypermedia.(example.(api.(editrow.<sx:row_id>)))))"
:method :post
:csrf false
:returns "element"
@@ -420,7 +420,7 @@
:text (str "(~edit-row-view :id \"" row-id "\" ...)")))))
(defhandler ex-editrow-cancel
:path "/(geography.(hypermedia.(example.(api.(editrow-cancel.<sx:row_id>)))))"
:path "/sx/(geography.(hypermedia.(example.(api.(editrow-cancel.<sx:row_id>)))))"
:method :get
:returns "element"
(&key row-id)
@@ -439,7 +439,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-bulk
:path "/(geography.(hypermedia.(example.(api.bulk))))"
:path "/sx/(geography.(hypermedia.(example.(api.bulk))))"
:method :post
:csrf false
:returns "element"
@@ -476,7 +476,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-swap-log
:path "/(geography.(hypermedia.(example.(api.swap-log))))"
:path "/sx/(geography.(hypermedia.(example.(api.swap-log))))"
:method :post
:csrf false
:returns "element"
@@ -500,7 +500,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-dashboard
:path "/(geography.(hypermedia.(example.(api.dashboard))))"
:path "/sx/(geography.(hypermedia.(example.(api.dashboard))))"
:method :get
:returns "element"
(&key)
@@ -530,7 +530,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-tabs
:path "/(geography.(hypermedia.(example.(api.(tabs.<sx:tab>)))))"
:path "/sx/(geography.(hypermedia.(example.(api.(tabs.<sx:tab>)))))"
:method :get
:returns "element"
(&key tab)
@@ -551,7 +551,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-animate
:path "/(geography.(hypermedia.(example.(api.animate))))"
:path "/sx/(geography.(hypermedia.(example.(api.animate))))"
:method :get
:returns "element"
(&key)
@@ -571,7 +571,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-dialog
:path "/(geography.(hypermedia.(example.(api.dialog))))"
:path "/sx/(geography.(hypermedia.(example.(api.dialog))))"
:method :get
:returns "element"
(&key)
@@ -584,7 +584,7 @@
:text "(~dialog-modal :title \"Confirm Action\" :message \"...\")")))
(defhandler ex-dialog-close
:path "/(geography.(hypermedia.(example.(api.dialog-close))))"
:path "/sx/(geography.(hypermedia.(example.(api.dialog-close))))"
:method :get
:returns "element"
(&key)
@@ -598,7 +598,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-keyboard
:path "/(geography.(hypermedia.(example.(api.keyboard))))"
:path "/sx/(geography.(hypermedia.(example.(api.keyboard))))"
:method :get
:returns "element"
(&key)
@@ -617,7 +617,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-pp-edit-all
:path "/(geography.(hypermedia.(example.(api.putpatch-edit-all))))"
:path "/sx/(geography.(hypermedia.(example.(api.putpatch-edit-all))))"
:method :get
:returns "element"
(&key)
@@ -631,7 +631,7 @@
:text (str "(~pp-form-full :name \"" (get p "name") "\" ...)")))))
(defhandler ex-pp-put
:path "/(geography.(hypermedia.(example.(api.putpatch))))"
:path "/sx/(geography.(hypermedia.(example.(api.putpatch))))"
:method :put
:csrf false
:returns "element"
@@ -648,7 +648,7 @@
:text (str "(~pp-view :name \"" name "\" ...)")))))
(defhandler ex-pp-cancel
:path "/(geography.(hypermedia.(example.(api.putpatch-cancel))))"
:path "/sx/(geography.(hypermedia.(example.(api.putpatch-cancel))))"
:method :get
:returns "element"
(&key)
@@ -667,7 +667,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-json-echo
:path "/(geography.(hypermedia.(example.(api.json-echo))))"
:path "/sx/(geography.(hypermedia.(example.(api.json-echo))))"
:method :post
:csrf false
:returns "element"
@@ -688,7 +688,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-echo-vals
:path "/(geography.(hypermedia.(example.(api.echo-vals))))"
:path "/sx/(geography.(hypermedia.(example.(api.echo-vals))))"
:method :get
:returns "element"
(&key)
@@ -705,7 +705,7 @@
:text (str "(~echo-result :label \"values\" :items (list ...))")))))))
(defhandler ex-echo-headers
:path "/(geography.(hypermedia.(example.(api.echo-headers))))"
:path "/sx/(geography.(hypermedia.(example.(api.echo-headers))))"
:method :get
:returns "element"
(&key)
@@ -725,7 +725,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-slow
:path "/(geography.(hypermedia.(example.(api.slow))))"
:path "/sx/(geography.(hypermedia.(example.(api.slow))))"
:method :get
:returns "element"
(&key)
@@ -744,7 +744,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-slow-search
:path "/(geography.(hypermedia.(example.(api.slow-search))))"
:path "/sx/(geography.(hypermedia.(example.(api.slow-search))))"
:method :get
:returns "element"
(&key)
@@ -764,7 +764,7 @@
;; --------------------------------------------------------------------------
(defhandler ex-flaky
:path "/(geography.(hypermedia.(example.(api.flaky))))"
:path "/sx/(geography.(hypermedia.(example.(api.flaky))))"
:method :get
:returns "element"
(&key)

View File

@@ -6,7 +6,7 @@
;; --- sx-get demo: server time ---
(defhandler ref-time
:path "/(geography.(hypermedia.(reference.(api.time))))"
:path "/sx/(geography.(hypermedia.(reference.(api.time))))"
:method :get
:returns "element"
(&key)
@@ -19,7 +19,7 @@
;; --- sx-post demo: greet ---
(defhandler ref-greet
:path "/(geography.(hypermedia.(reference.(api.greet))))"
:path "/sx/(geography.(hypermedia.(reference.(api.greet))))"
:method :post
:csrf false
:returns "element"
@@ -33,7 +33,7 @@
;; --- sx-put demo: status update ---
(defhandler ref-status
:path "/(geography.(hypermedia.(reference.(api.status))))"
:path "/sx/(geography.(hypermedia.(reference.(api.status))))"
:method :put
:csrf false
:returns "element"
@@ -47,7 +47,7 @@
;; --- sx-patch demo: theme ---
(defhandler ref-theme
:path "/(geography.(hypermedia.(reference.(api.theme))))"
:path "/sx/(geography.(hypermedia.(reference.(api.theme))))"
:method :patch
:csrf false
:returns "element"
@@ -61,7 +61,7 @@
;; --- sx-delete demo ---
(defhandler ref-delete-item
:path "/(geography.(hypermedia.(reference.(api.(item.<sx:item_id>)))))"
:path "/sx/(geography.(hypermedia.(reference.(api.(item.<sx:item_id>)))))"
:method :delete
:csrf false
:returns "element"
@@ -72,7 +72,7 @@
;; --- sx-trigger demo: search ---
(defhandler ref-trigger-search
:path "/(geography.(hypermedia.(reference.(api.trigger-search))))"
:path "/sx/(geography.(hypermedia.(reference.(api.trigger-search))))"
:method :get
:returns "element"
(&key)
@@ -89,7 +89,7 @@
;; --- sx-swap demo ---
(defhandler ref-swap-item
:path "/(geography.(hypermedia.(reference.(api.swap-item))))"
:path "/sx/(geography.(hypermedia.(reference.(api.swap-item))))"
:method :get
:returns "element"
(&key)
@@ -102,7 +102,7 @@
;; --- sx-swap-oob demo ---
(defhandler ref-oob
:path "/(geography.(hypermedia.(reference.(api.oob))))"
:path "/sx/(geography.(hypermedia.(reference.(api.oob))))"
:method :get
:returns "element"
(&key)
@@ -117,7 +117,7 @@
;; --- sx-select demo ---
(defhandler ref-select-page
:path "/(geography.(hypermedia.(reference.(api.select-page))))"
:path "/sx/(geography.(hypermedia.(reference.(api.select-page))))"
:method :get
:returns "element"
(&key)
@@ -134,7 +134,7 @@
;; --- sx-sync demo: slow echo ---
(defhandler ref-slow-echo
:path "/(geography.(hypermedia.(reference.(api.slow-echo))))"
:path "/sx/(geography.(hypermedia.(reference.(api.slow-echo))))"
:method :get
:returns "element"
(&key)
@@ -148,7 +148,7 @@
;; --- sx-prompt demo ---
(defhandler ref-prompt-echo
:path "/(geography.(hypermedia.(reference.(api.prompt-echo))))"
:path "/sx/(geography.(hypermedia.(reference.(api.prompt-echo))))"
:method :get
:returns "element"
(&key)
@@ -161,7 +161,7 @@
;; --- Error demo ---
(defhandler ref-error-500
:path "/(geography.(hypermedia.(reference.(api.error-500))))"
:path "/sx/(geography.(hypermedia.(reference.(api.error-500))))"
:method :get
:returns "nil"
(&key)
@@ -175,7 +175,7 @@
;; --- sx-encoding demo: file upload name ---
(defhandler ref-upload-name
:path "/(geography.(hypermedia.(reference.(api.upload-name))))"
:path "/sx/(geography.(hypermedia.(reference.(api.upload-name))))"
:method :post
:csrf false
:returns "element"
@@ -190,7 +190,7 @@
;; --- sx-headers demo: echo custom headers ---
(defhandler ref-echo-headers
:path "/(geography.(hypermedia.(reference.(api.echo-headers))))"
:path "/sx/(geography.(hypermedia.(reference.(api.echo-headers))))"
:method :get
:returns "element"
(&key)
@@ -214,7 +214,7 @@
;; --- sx-include demo: echo GET query params ---
(defhandler ref-echo-vals-get
:path "/(geography.(hypermedia.(reference.(api.echo-vals))))"
:path "/sx/(geography.(hypermedia.(reference.(api.echo-vals))))"
:method :get
:returns "element"
(&key)
@@ -235,7 +235,7 @@
;; --- sx-vals demo: echo POST form values ---
(defhandler ref-echo-vals-post
:path "/(geography.(hypermedia.(reference.(api.echo-vals))))"
:path "/sx/(geography.(hypermedia.(reference.(api.echo-vals))))"
:method :post
:csrf false
:returns "element"
@@ -257,7 +257,7 @@
;; --- sx-retry demo: flaky endpoint (fails 2/3 times) ---
(defhandler ref-flaky
:path "/(geography.(hypermedia.(reference.(api.flaky))))"
:path "/sx/(geography.(hypermedia.(reference.(api.flaky))))"
:method :get
:returns "element"
(&key)
@@ -275,7 +275,7 @@
;; --- sx-trigger-event demo: response header triggers ---
(defhandler ref-trigger-event
:path "/(geography.(hypermedia.(reference.(api.trigger-event))))"
:path "/sx/(geography.(hypermedia.(reference.(api.trigger-event))))"
:method :get
:returns "element"
(&key)
@@ -287,7 +287,7 @@
;; --- sx-retarget demo: response header retargets ---
(defhandler ref-retarget
:path "/(geography.(hypermedia.(reference.(api.retarget))))"
:path "/sx/(geography.(hypermedia.(reference.(api.retarget))))"
:method :get
:returns "element"
(&key)