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;
-
\ No newline at end of file
+
+