diff --git a/.changeset/plenty-plums-sparkle.md b/.changeset/plenty-plums-sparkle.md new file mode 100644 index 0000000000..4613cc321e --- /dev/null +++ b/.changeset/plenty-plums-sparkle.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: ensure snippets after empty text correctly hydrate diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/RegularElement.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/RegularElement.js index d748fd85e8..52100a2019 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/RegularElement.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/RegularElement.js @@ -384,7 +384,7 @@ export function RegularElement(node, context) { arg = b.member(arg, 'content'); } - process_children(trimmed, () => b.call('$.child', arg), true, { + process_children(trimmed, (is_text) => b.call('$.child', arg, is_text && b.true), true, { ...context, state: child_state }); diff --git a/packages/svelte/src/internal/client/dom/operations.js b/packages/svelte/src/internal/client/dom/operations.js index e179ca0c71..6dfce9ebd3 100644 --- a/packages/svelte/src/internal/client/dom/operations.js +++ b/packages/svelte/src/internal/client/dom/operations.js @@ -91,9 +91,10 @@ export function get_next_sibling(node) { * Don't mark this as side-effect-free, hydration needs to walk all nodes * @template {Node} N * @param {N} node + * @param {boolean} is_text * @returns {Node | null} */ -export function child(node) { +export function child(node, is_text) { if (!hydrating) { return get_first_child(node); } @@ -103,6 +104,11 @@ export function child(node) { // Child can be null if we have an element with a single child, like `
{text}
`, where `text` is empty if (child === null) { child = hydrate_node.appendChild(create_text()); + } else if (is_text && child.nodeType !== 3) { + var text = create_text(); + child?.before(text); + set_hydrate_node(text); + return text; } set_hydrate_node(child); diff --git a/packages/svelte/tests/runtime-runes/samples/snippet-after-text/Child.svelte b/packages/svelte/tests/runtime-runes/samples/snippet-after-text/Child.svelte new file mode 100644 index 0000000000..711171a21d --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/snippet-after-text/Child.svelte @@ -0,0 +1,5 @@ + + +