diff --git a/.changeset/fair-aliens-wait.md b/.changeset/fair-aliens-wait.md new file mode 100644 index 0000000000..66e4cf2bd1 --- /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 815acde7c5..23ad6f5cdc 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); + } } } });