From edbe11ebc93c26410867748a34c4ed311d128de0 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Thu, 27 Aug 2026 16:27:08 +0200 Subject: [PATCH] fix: properly apply static textarea value attribute during CSR (#18727) Fixes #18574 Simpler alternative to #18627 - we just special-case this in the "should this be treated as a dynamic attribute" branches so `$.set_value(...)` is always generated. Given how edge-case-y this is (why would you not just write it into the body of the textarea?) this is fine. --- .changeset/polite-zoos-melt.md | 5 +++++ .../client/visitors/RegularElement.js | 1 + .../samples/textarea-value/_config.js | 17 +++++++++++------ .../samples/textarea-value/main.svelte | 3 ++- 4 files changed, 19 insertions(+), 7 deletions(-) create mode 100644 .changeset/polite-zoos-melt.md diff --git a/.changeset/polite-zoos-melt.md b/.changeset/polite-zoos-melt.md new file mode 100644 index 0000000000..cfff0e82e4 --- /dev/null +++ b/.changeset/polite-zoos-melt.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: properly apply static textarea value attribute during CSR 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 adc9ec72dd..0a32e0dd53 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 @@ -240,6 +240,7 @@ export function RegularElement(node, context) { if ( !is_custom_element && !cannot_be_set_statically(attribute.name) && + (name !== 'value' || node.name !== 'textarea') && (attribute.value === true || is_text_attribute(attribute)) && (name !== 'class' || class_directives.length === 0) && (name !== 'style' || style_directives.length === 0) diff --git a/packages/svelte/tests/runtime-legacy/samples/textarea-value/_config.js b/packages/svelte/tests/runtime-legacy/samples/textarea-value/_config.js index 06264b653b..30e2633154 100644 --- a/packages/svelte/tests/runtime-legacy/samples/textarea-value/_config.js +++ b/packages/svelte/tests/runtime-legacy/samples/textarea-value/_config.js @@ -5,14 +5,19 @@ export default test({ return { foo: 42 }; }, - html: '', - ssrHtml: '', + ssrHtml: ' ', - test({ assert, component, target }) { - const textarea = /** @type {HTMLTextAreaElement} */ (target.querySelector('textarea')); - assert.strictEqual(textarea.value, '42'); + test({ assert, component, target, variant }) { + assert.htmlEqual( + target.innerHTML, + ` ` + ); + + const [textarea1, textarea2] = target.querySelectorAll('textarea'); + assert.strictEqual(textarea1.value, '42'); + assert.strictEqual(textarea2.value, 'static'); component.foo = 43; - assert.strictEqual(textarea.value, '43'); + assert.strictEqual(textarea1.value, '43'); } }); diff --git a/packages/svelte/tests/runtime-legacy/samples/textarea-value/main.svelte b/packages/svelte/tests/runtime-legacy/samples/textarea-value/main.svelte index 7eaf783f7f..203a3ed039 100644 --- a/packages/svelte/tests/runtime-legacy/samples/textarea-value/main.svelte +++ b/packages/svelte/tests/runtime-legacy/samples/textarea-value/main.svelte @@ -2,4 +2,5 @@ export let foo; -