Three bugs in the DOM morph algorithm (web/engine.sx): 1. Empty-id keying: dom-id returns "" (not nil) for elements without an id attribute, and "" is truthy in SX. Every id-less element was stored under key "" in old-by-id, causing all new children to match the same old element via the keyed branch — collapsing all children into one. Fix: guard with (and id (not (empty? id))) in map building and matching. 2. Cleanup bug: the oi-cursor cleanup (range oi len) removed keyed elements that were matched and moved from positions >= oi, and failed to remove unmatched elements at positions < oi. Fix: track consumed indices in a dict and remove all unconsumed elements regardless of position. 3. Island attr sync: morph-node delegated to morph-island-children without first syncing the island element's own attributes (e.g. data-sx-state). Fix: call sync-attrs before morph-island-children. Also: pass explicit `true` to all dom-clone calls (deep clone parameter). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
22 KiB
22 KiB