From 6eecadbaf80c14bf2cff80b91cd8c4d1acfa302a Mon Sep 17 00:00:00 2001
From: paoloricciuti <ricciutipaolo@gmail.com>
Date: Thu, 29 May 2025 16:41:15 +0200
Subject: [PATCH] fix: only `select_option` if `'value'` is in `next`

---
 .changeset/smooth-weeks-hide.md               |  5 +++++
 .../client/dom/elements/attributes.js         |  2 +-
 .../spread-element-input-select/_config.js    | 20 +++++++++++++++++++
 .../spread-element-input-select/main.svelte   | 10 ++++++++++
 4 files changed, 36 insertions(+), 1 deletion(-)
 create mode 100644 .changeset/smooth-weeks-hide.md
 create mode 100644 packages/svelte/tests/runtime-runes/samples/spread-element-input-select/_config.js
 create mode 100644 packages/svelte/tests/runtime-runes/samples/spread-element-input-select/main.svelte

diff --git a/.changeset/smooth-weeks-hide.md b/.changeset/smooth-weeks-hide.md
new file mode 100644
index 000000000000..dc982561eb85
--- /dev/null
+++ b/.changeset/smooth-weeks-hide.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: only `select_option` if `'value'` is in `next`
diff --git a/packages/svelte/src/internal/client/dom/elements/attributes.js b/packages/svelte/src/internal/client/dom/elements/attributes.js
index 6cfc123cc251..fcce0b444f49 100644
--- a/packages/svelte/src/internal/client/dom/elements/attributes.js
+++ b/packages/svelte/src/internal/client/dom/elements/attributes.js
@@ -486,7 +486,7 @@ export function attribute_effect(
 
 		set_attributes(element, prev, next, css_hash, skip_warning);
 
-		if (inited && is_select) {
+		if (inited && is_select && 'value' in next) {
 			select_option(/** @type {HTMLSelectElement} */ (element), next.value, false);
 		}
 
diff --git a/packages/svelte/tests/runtime-runes/samples/spread-element-input-select/_config.js b/packages/svelte/tests/runtime-runes/samples/spread-element-input-select/_config.js
new file mode 100644
index 000000000000..71802ba6de9a
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/spread-element-input-select/_config.js
@@ -0,0 +1,20 @@
+import { flushSync } from 'svelte';
+import { ok, test } from '../../test';
+
+export default test({
+	async test({ assert, target }) {
+		const select = target.querySelector('select');
+		ok(select);
+		const [option1, option2] = select;
+
+		assert.ok(option1.selected);
+		assert.ok(!option2.selected);
+
+		const btn = target.querySelector('button');
+		flushSync(() => {
+			btn?.click();
+		});
+		assert.ok(option1.selected);
+		assert.ok(!option2.selected);
+	}
+});
diff --git a/packages/svelte/tests/runtime-runes/samples/spread-element-input-select/main.svelte b/packages/svelte/tests/runtime-runes/samples/spread-element-input-select/main.svelte
new file mode 100644
index 000000000000..fb1f7ddf9614
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/spread-element-input-select/main.svelte
@@ -0,0 +1,10 @@
+<script>
+	let { value = "Hello", spread = { disabled: false } } = $props();
+</script>
+
+<button onclick={()=> spread = { disabled: false }}></button>
+
+<select bind:value {...spread}>
+  <option>Hello</option>
+  <option>World</option>
+</select>