Fix infinite scroll and all sx-trigger/sx-get element binding

Root cause: process-elements during WASM boot-init marks elements as
processed but process-one silently fails (effect functions don't execute
in WASM boot context). Deferred process-elements then skips them.

Fixes:
- boot-init: defer process-elements via set-timeout 0
- hydrate-island: defer process-elements via set-timeout 0
- process-elements: move mark-processed! after process-one so failed
  boot-context calls don't poison the flag
- observe-intersection: native JS platform function (K.registerNative)
  to avoid bytecode callback issue with IntersectionObserver
- Remove SX observe-intersection from boot-helpers.sx (was overriding
  the working native version)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-02 00:17:02 +00:00
parent 9594362427
commit 90a2eaaf7a
4 changed files with 22 additions and 17 deletions

View File

@@ -430,17 +430,6 @@
(host-callback thunk))
(thunk))))
(define
observe-intersection
(fn
(el callback once? delay)
(let
((cb (host-callback (fn (entries) (for-each (fn (entry) (when (host-get entry "isIntersecting") (if delay (set-timeout (fn () (callback entry)) delay) (callback entry)) (when once? (host-call observer "unobserve" el)))) (host-call entries "forEach" (host-callback (fn (e) e))))))))
(let
((observer (host-new "IntersectionObserver" (host-callback (fn (entries) (let ((arr-len (host-get entries "length"))) (let loop ((i 0)) (when (< i arr-len) (let ((entry (host-call entries "item" i))) (when (and entry (host-get entry "isIntersecting")) (if delay (set-timeout (fn () (callback entry)) delay) (callback entry)) (when once? (host-call observer "unobserve" el)))) (loop (+ i 1))))))))))
(host-call observer "observe" el)
observer))))
(define
event-source-connect
(fn