Fix aser server-affinity expansion: keyword values, OOB wrapper, page helpers

Three bugs in aser-expand-component (adapter-sx.sx):
- Keyword values were eval'd (eval-expr can't handle <>, HTML tags);
  now asered, matching the aser's rendering capabilities
- Missing default nil binding for unset &key params (caused
  "Undefined symbol" errors for optional params like header-rows)
- aserCall string-quoted keyword values that were already serialized
  SX — now inlines values starting with "(" directly

Server-affinity annotations for layout/nav shells:
- ~shared:layout/app-body, ~shared:layout/oob-sx — page structure
- ~layouts/nav-sibling-row, ~layouts/nav-children — server-side data
- ~layouts/doc already had :affinity :server
- ~cssx/flush marked :affinity :client (browser-only state)

Navigation fix: restore oob_page_sx wrapper for HTMX responses
so #main-panel section exists for sx-select/sx-swap targeting.

OCaml bridge: lazy page helper injection into kernel via IO proxy
(define name (fn (...) (helper "name" ...))) — enables aser_slot
to evaluate highlight/component-source etc. via coroutine bridge.

Playwright tests: added pageerror listener to test_no_console_errors,
new test_navigate_from_home_to_geography for HTMX nav regression.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-19 12:06:24 +00:00
parent 171c18d3be
commit 109ca7c70b
10 changed files with 201 additions and 31 deletions

View File

@@ -493,7 +493,7 @@
;; (~cssx/flush)
;; =========================================================================
(defcomp ~cssx/flush ()
(defcomp ~cssx/flush () :affinity :client
(let ((rules (collected "cssx")))
(clear-collected! "cssx")
(when (not (empty? rules))

View File

@@ -1,4 +1,4 @@
(defcomp ~shared:layout/app-body (&key header-rows filter aside menu content)
(defcomp ~shared:layout/app-body (&key header-rows filter aside menu content) :affinity :server
(div :class "max-w-screen-2xl mx-auto py-1 px-1"
(when header-rows
(div :class "w-full"
@@ -24,7 +24,7 @@
(when content content)
(div :class "pb-8")))))))
(defcomp ~shared:layout/oob-sx (&key oobs filter aside menu content)
(defcomp ~shared:layout/oob-sx (&key oobs filter aside menu content) :affinity :server
(<>
(when oobs oobs)
(div :id "filter" :sx-swap-oob "outerHTML"