Fix navigation: outerHTML swap, island markers, host handle equality, dispose
Navigation pipeline now works end-to-end: - outerHTML swap uses dom-replace-child instead of morph-node (morph has a CEK continuation issue with nested for-each that needs separate fix) - swap-dom-nodes returns the new element for outerHTML so post-swap hydrates the correct (new) DOM, not the detached old element - sx-render uses marker mode: islands rendered as empty span[data-sx-island] markers, hydrated by post-swap. Prevents duplicate content from island body expansion + SX response nav rows. - dispose-island (singular) called on old island before morph, not just dispose-islands-in (which only disposes sub-islands) OCaml runtime: - safe_eq: Dict equality checks __host_handle for DOM node identity (js_to_value creates new Dict wrappers per call, breaking physical ==) - contains?: same host handle check - to_string: trampoline thunks (fixes <thunk> display) - as_number: trampoline thunks (fixes arithmetic on leaked thunks) DOM platform: - dom-remove, dom-attr-list (name/value pairs), dom-child-list (SX list), dom-is-active-element?, dom-is-input-element?, dom-is-child-of?, dom-on All 5 reactive-nav Playwright tests pass. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -151,7 +151,14 @@
|
||||
(and (starts-with? name "~")
|
||||
(env-has? env name)
|
||||
(island? (env-get env name)))
|
||||
(render-dom-island (env-get env name) args env ns)
|
||||
;; In marker mode (sx-render for swap), create empty marker span
|
||||
;; that post-swap will hydrate. Otherwise, full render.
|
||||
(if (scope-peek "sx-render-markers")
|
||||
(let ((island (env-get env name))
|
||||
(marker (dom-create-element "span" nil)))
|
||||
(dom-set-attr marker "data-sx-island" (component-name island))
|
||||
marker)
|
||||
(render-dom-island (env-get env name) args env ns))
|
||||
|
||||
;; Component (~name)
|
||||
(starts-with? name "~")
|
||||
|
||||
Reference in New Issue
Block a user