From c3e91a38510b44057e2f58f13934bc18840e2991 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Fri, 10 Oct 2025 11:57:06 +0200 Subject: [PATCH] fix: better input cursor restoration for `bind:value` If cursor was at end and new input is longer, move cursor to new end No test because not possible to reproduce using our test setup. Follow-up to #14649, helps with #16577 --- .changeset/fair-aliens-wait.md | 5 +++++ .../internal/client/dom/elements/bindings/input.js | 12 ++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 .changeset/fair-aliens-wait.md diff --git a/.changeset/fair-aliens-wait.md b/.changeset/fair-aliens-wait.md new file mode 100644 index 000000000000..66e4cf2bd1ed --- /dev/null +++ b/.changeset/fair-aliens-wait.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: better input cursor restoration for `bind:value` 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 815acde7c53b..23ad6f5cdc6c 100644 --- a/packages/svelte/src/internal/client/dom/elements/bindings/input.js +++ b/packages/svelte/src/internal/client/dom/elements/bindings/input.js @@ -43,14 +43,22 @@ export function bind_value(input, get, set = get) { if (value !== (value = get())) { var start = input.selectionStart; var end = input.selectionEnd; + var length = input.value.length; // 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); + var new_length = input.value.length; + // If cursor was at end and new input is longer, move cursor to new end + if (start === end && end === length && new_length > length) { + input.selectionStart = new_length; + input.selectionEnd = new_length; + } else { + input.selectionStart = start; + input.selectionEnd = Math.min(end, new_length); + } } } });