Fix DOM-preserving hydration: text node mismatch + conditional markers

Two issues with the initial hydration implementation:

1. Text node mismatch: SSR merges adjacent text into one node
   ("0 / 16") but client renders three separate children. When the
   cursor ran out, new nodes were created but dom-append was
   unconditionally skipped. Fix: only skip append when the child
   already has a parent (existing SSR node). New nodes (nil parent)
   get appended even during hydration.

2. Conditional markers: dispatch-render-form for if/when/cond in
   island scope was injecting comment markers during hydration,
   corrupting the DOM. Fix: skip the reactive conditional machinery
   during hydration — just evaluate and render the active branch
   normally, walking the cursor. Reactivity for conditionals
   activates after the first user-triggered re-render.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-10 14:27:37 +00:00
parent a2a4d17d53
commit ab50c4516e
3 changed files with 54 additions and 20 deletions

File diff suppressed because one or more lines are too long