Fix DOM adapter: filter spread values from dom-append calls
Spread values returned by components like ~cssx/tw are not DOM nodes and cannot be passed to appendChild. Filter them in fragment, let, begin/do, component children, and data list rendering paths — matching the HTML adapter's existing spread filtering. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -160,7 +160,11 @@
|
||||
;; Data list
|
||||
:else
|
||||
(let ((frag (create-fragment)))
|
||||
(for-each (fn (x) (dom-append frag (render-to-dom x env ns))) expr)
|
||||
(for-each (fn (x)
|
||||
(let ((result (render-to-dom x env ns)))
|
||||
(when (not (spread? result))
|
||||
(dom-append frag result))))
|
||||
expr)
|
||||
frag)))))
|
||||
|
||||
|
||||
@@ -296,10 +300,14 @@
|
||||
(component-params comp))
|
||||
|
||||
;; If component accepts children, pre-render them to a fragment
|
||||
;; Spread values are filtered out (no parent element to merge onto)
|
||||
(when (component-has-children? comp)
|
||||
(let ((child-frag (create-fragment)))
|
||||
(for-each
|
||||
(fn (c) (dom-append child-frag (render-to-dom c env ns)))
|
||||
(fn (c)
|
||||
(let ((result (render-to-dom c env ns)))
|
||||
(when (not (spread? result))
|
||||
(dom-append child-frag result))))
|
||||
children)
|
||||
(env-set! local "children" child-frag)))
|
||||
|
||||
@@ -314,7 +322,10 @@
|
||||
(fn ((args :as list) (env :as dict) (ns :as string))
|
||||
(let ((frag (create-fragment)))
|
||||
(for-each
|
||||
(fn (x) (dom-append frag (render-to-dom x env ns)))
|
||||
(fn (x)
|
||||
(let ((result (render-to-dom x env ns)))
|
||||
(when (not (spread? result))
|
||||
(dom-append frag result))))
|
||||
args)
|
||||
frag)))
|
||||
|
||||
@@ -498,24 +509,32 @@
|
||||
(= name "case")
|
||||
(render-to-dom (trampoline (eval-expr expr env)) env ns)
|
||||
|
||||
;; let / let*
|
||||
;; let / let* — single body: pass through (spread propagates). Multi: fragment.
|
||||
(or (= name "let") (= name "let*"))
|
||||
(let ((local (process-bindings (nth expr 1) env))
|
||||
(frag (create-fragment)))
|
||||
(for-each
|
||||
(fn (i)
|
||||
(dom-append frag (render-to-dom (nth expr i) local ns)))
|
||||
(range 2 (len expr)))
|
||||
frag)
|
||||
(let ((local (process-bindings (nth expr 1) env)))
|
||||
(if (= (len expr) 3)
|
||||
(render-to-dom (nth expr 2) local ns)
|
||||
(let ((frag (create-fragment)))
|
||||
(for-each
|
||||
(fn (i)
|
||||
(let ((result (render-to-dom (nth expr i) local ns)))
|
||||
(when (not (spread? result))
|
||||
(dom-append frag result))))
|
||||
(range 2 (len expr)))
|
||||
frag)))
|
||||
|
||||
;; begin / do
|
||||
;; begin / do — single body: pass through. Multi: fragment.
|
||||
(or (= name "begin") (= name "do"))
|
||||
(let ((frag (create-fragment)))
|
||||
(for-each
|
||||
(fn (i)
|
||||
(dom-append frag (render-to-dom (nth expr i) env ns)))
|
||||
(range 1 (len expr)))
|
||||
frag)
|
||||
(if (= (len expr) 2)
|
||||
(render-to-dom (nth expr 1) env ns)
|
||||
(let ((frag (create-fragment)))
|
||||
(for-each
|
||||
(fn (i)
|
||||
(let ((result (render-to-dom (nth expr i) env ns)))
|
||||
(when (not (spread? result))
|
||||
(dom-append frag result))))
|
||||
(range 1 (len expr)))
|
||||
frag))
|
||||
|
||||
;; Definition forms — eval for side effects
|
||||
(definition-form? name)
|
||||
|
||||
Reference in New Issue
Block a user