SPA navigation, page component refactors, WASM rebuild

Refactor page components (docs, examples, specs, reference, layouts)
and adapters (adapter-sx, boot-helpers, orchestration) across sx/ and
web/ directories. Add Playwright SPA navigation tests. Rebuild WASM
kernel with updated bytecode. Add OCaml primitives for request handling.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-01 11:00:51 +00:00
parent 9f097026f8
commit 584445a843
38 changed files with 5854 additions and 3695 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -508,18 +508,17 @@
boost-el
(let
((attr (dom-get-attr boost-el "sx-boost")))
(if (and attr (not (= attr "true"))) attr "#main-panel"))
"#main-panel")))
(if (and attr (not (= attr "true"))) attr "#sx-content"))
"#sx-content")))
(if
(try-client-route (url-pathname href) target-sel)
(do (browser-push-state nil "" href) (browser-scroll-to 0 0))
(do
(when
(not (dom-has-attr? link "sx-get"))
(dom-set-attr link "sx-get" href))
(when
(not (dom-has-attr? link "sx-push-url"))
(dom-set-attr link "sx-push-url" "true"))
(log-info (str "sx:route server fetch " href))
(dom-set-attr link "sx-get" href)
(dom-set-attr link "sx-target" target-sel)
(dom-set-attr link "sx-select" target-sel)
(dom-set-attr link "sx-push-url" "true")
(execute-request link nil nil)))))))))
(define sw-post-message (fn (msg) nil))
@@ -604,7 +603,7 @@
(fn
(expr)
(let
((result (render-to-dom expr (get-render-env nil) nil)))
((result (try-catch (fn () (render-to-dom expr (get-render-env nil) nil)) (fn (err) (log-error (str "sx-render: " err)) (let ((el (dom-create-element "div" nil))) (dom-set-attr el "class" "sx-render-error") (dom-set-attr el "style" "color:red;font-size:0.875rem;padding:0.5rem;border:1px solid red;border-radius:4px;margin:0.25rem 0;") (dom-set-text-content el (str "Render error: " err)) el)))))
(when result (dom-append frag result))))
exprs)
(scope-pop! "sx-render-markers")
@@ -630,7 +629,15 @@
(and text (> (len text) 0))
(let
((exprs (sx-parse text)))
(for-each (fn (expr) (cek-eval expr)) exprs))))))
(for-each
(fn
(expr)
(try-catch
(fn () (cek-eval expr))
(fn
(err)
(log-error (str "sx-process-scripts: " err)))))
exprs))))))
scripts))))
(define
@@ -641,7 +648,10 @@
selector
(let
((selected (dom-query container selector)))
(if selected selected (children-to-fragment container)))
(if
selected
(children-to-fragment selected)
(children-to-fragment container)))
(children-to-fragment container))))
(define

File diff suppressed because one or more lines are too long

View File

@@ -282,9 +282,11 @@
(fn
(t oob (s :as string))
(dispose-islands-in t)
(swap-dom-nodes t oob s)
(sx-hydrate t)
(process-elements t)))
(swap-dom-nodes
t
(if (= s "innerHTML") (children-to-fragment oob) oob)
s)
(post-swap t)))
(let
((select-sel (dom-get-attr el "sx-select"))
(content
@@ -324,20 +326,31 @@
(if
select-sel
(let
((html (select-html-from-doc doc select-sel)))
(with-transition
use-transition
((container (dom-create-element "div" nil)))
(dom-set-inner-html container (dom-body-inner-html doc))
(process-oob-swaps
container
(fn
()
(let
((swap-root (swap-html-string target html swap-style)))
(log-info
(str
"swap-root: "
(if swap-root (dom-tag-name swap-root) "nil")
" target: "
(dom-tag-name target)))
(post-swap (or swap-root target))))))
(t oob (s :as string))
(dispose-islands-in t)
(swap-dom-nodes t oob s)
(post-swap t)))
(hoist-head-elements container)
(let
((html (select-from-container container select-sel)))
(with-transition
use-transition
(fn
()
(let
((swap-root (swap-dom-nodes target html swap-style)))
(log-info
(str
"swap-root: "
(if swap-root (dom-tag-name swap-root) "nil")
" target: "
(dom-tag-name target)))
(post-swap (or swap-root target)))))))
(let
((container (dom-create-element "div" nil)))
(dom-set-inner-html container (dom-body-inner-html doc))

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1792,7 +1792,7 @@
blake2_js_for_wasm_create: blake2_js_for_wasm_create};
}
(globalThis))
({"link":[["runtime-0db9b496",0],["prelude-d7e4b000",0],["stdlib-23ce0836",[]],["sx-80621fb4",[2]],["jsoo_runtime-f96b44a8",[2]],["js_of_ocaml-651f6707",[2,4]],["dune__exe__Sx_browser-8ae21d0a",[2,3,5]],["std_exit-10fb8830",[2]],["start-80fdb768",0]],"generated":(b=>{var
({"link":[["runtime-0db9b496",0],["prelude-d7e4b000",0],["stdlib-23ce0836",[]],["sx-afdcb8e8",[2]],["jsoo_runtime-f96b44a8",[2]],["js_of_ocaml-651f6707",[2,4]],["dune__exe__Sx_browser-8ae21d0a",[2,3,5]],["std_exit-10fb8830",[2]],["start-80fdb768",0]],"generated":(b=>{var
c=b,a=b?.module?.export||b;return{"env":{"caml_ba_kind_of_typed_array":()=>{throw new
Error("caml_ba_kind_of_typed_array not implemented")},"caml_exn_with_js_backtrace":()=>{throw new
Error("caml_exn_with_js_backtrace not implemented")},"caml_int64_create_lo_mi_hi":()=>{throw new