Phase 4: Client-side rendering of :data pages via abstract resolve-page-data
Spec layer (orchestration.sx): - try-client-route now handles :data pages instead of falling back to server - New abstract primitive resolve-page-data(name, params, callback) — platform decides transport (HTTP, IPC, cache, etc) - Extracted swap-rendered-content and resolve-route-target helpers Platform layer (bootstrap_js.py): - resolvePageData() browser implementation: fetches /sx/data/<name>, parses SX response, calls callback. Other hosts provide their own transport. Server layer (pages.py): - evaluate_page_data() evaluates :data expr, serializes result as SX - auto_mount_page_data() mounts /sx/data/ endpoint with per-page auth - _build_pages_sx now computes component deps for all pages (not just pure) Test page at /isomorphism/data-test exercises the full pipeline. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
52
sx/sx/data-test.sx
Normal file
52
sx/sx/data-test.sx
Normal file
@@ -0,0 +1,52 @@
|
||||
;; Data test page — exercises Phase 4 client-side data rendering.
|
||||
;;
|
||||
;; This page has a :data expression. When navigated to:
|
||||
;; - Full page load: server evaluates data + renders content (normal path)
|
||||
;; - Client route: client fetches /sx/data/data-test, parses SX, renders locally
|
||||
;;
|
||||
;; Open browser console and look for "sx:route client+data" to confirm
|
||||
;; client-side rendering happened.
|
||||
|
||||
(defcomp ~data-test-content (&key server-time items phase transport)
|
||||
(div :class "space-y-8"
|
||||
(div :class "border-b border-stone-200 pb-6"
|
||||
(h1 :class "text-2xl font-bold text-stone-900" "Data Test")
|
||||
(p :class "mt-2 text-stone-600"
|
||||
"This page tests the Phase 4 data endpoint. The content you see was "
|
||||
"rendered using data from the server, but the rendering itself may have "
|
||||
"happened client-side."))
|
||||
|
||||
;; Server-provided metadata
|
||||
(div :class "rounded-lg border border-stone-200 bg-white p-6 space-y-3"
|
||||
(h2 :class "text-lg font-semibold text-stone-800" "Data from server")
|
||||
(dl :class "grid grid-cols-2 gap-2 text-sm"
|
||||
(dt :class "font-medium text-stone-600" "Phase")
|
||||
(dd :class "text-stone-900" phase)
|
||||
(dt :class "font-medium text-stone-600" "Transport")
|
||||
(dd :class "text-stone-900" transport)
|
||||
(dt :class "font-medium text-stone-600" "Server time")
|
||||
(dd :class "font-mono text-stone-900" server-time)))
|
||||
|
||||
;; Pipeline steps from data
|
||||
(div :class "space-y-3"
|
||||
(h2 :class "text-lg font-semibold text-stone-800" "Pipeline steps")
|
||||
(div :class "space-y-2"
|
||||
(map-indexed
|
||||
(fn (i item)
|
||||
(div :class "flex items-start gap-3 rounded border border-stone-100 bg-white p-3"
|
||||
(span :class "flex-none rounded-full bg-violet-100 text-violet-700 w-6 h-6 flex items-center justify-center text-xs font-bold"
|
||||
(str (+ i 1)))
|
||||
(div
|
||||
(div :class "font-medium text-stone-900" (get item "label"))
|
||||
(div :class "text-sm text-stone-500" (get item "detail")))))
|
||||
items)))
|
||||
|
||||
;; How to verify
|
||||
(div :class "rounded-lg border border-amber-200 bg-amber-50 p-4 text-sm space-y-2"
|
||||
(p :class "font-semibold text-amber-800" "How to verify client-side rendering")
|
||||
(ol :class "list-decimal list-inside text-amber-700 space-y-1"
|
||||
(li "Open the browser console (F12)")
|
||||
(li "Navigate to this page from another page using a link")
|
||||
(li "Look for: " (code :class "bg-amber-100 px-1 rounded" "sx:route client+data /isomorphism/data-test"))
|
||||
(li "That log line means the data was fetched and rendered client-side")
|
||||
(li "A full page reload will show server-side rendering instead")))))
|
||||
Reference in New Issue
Block a user