diff --git a/.changeset/cyan-ducks-train.md b/.changeset/cyan-ducks-train.md new file mode 100644 index 000000000000..6f061706a35c --- /dev/null +++ b/.changeset/cyan-ducks-train.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: restore input binding selection position diff --git a/packages/svelte/src/internal/client/dom/elements/bindings/input.js b/packages/svelte/src/internal/client/dom/elements/bindings/input.js index 810dcb08629d..ec123d39681d 100644 --- a/packages/svelte/src/internal/client/dom/elements/bindings/input.js +++ b/packages/svelte/src/internal/client/dom/elements/bindings/input.js @@ -30,8 +30,17 @@ export function bind_value(input, get, set = get) { // In runes mode, respect any validation in accessors (doesn't apply in legacy mode, // because we use mutable state which ensures the render effect always runs) if (runes && value !== (value = get())) { + var start = input.selectionStart; + var end = input.selectionEnd; + // the value is coerced on assignment input.value = value ?? ''; + + // Restore selection + if (end !== null) { + input.selectionStart = start; + input.selectionEnd = Math.min(end, input.value.length); + } } });