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 it is too large Load Diff

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

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))