diff --git a/.changeset/quiet-timers-speak.md b/.changeset/quiet-timers-speak.md new file mode 100644 index 000000000..3de152a4f --- /dev/null +++ b/.changeset/quiet-timers-speak.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: correctly update tweened store initialized with nullish value diff --git a/packages/svelte/src/motion/tweened.js b/packages/svelte/src/motion/tweened.js index 35ae4cbfa..90b6aaa00 100644 --- a/packages/svelte/src/motion/tweened.js +++ b/packages/svelte/src/motion/tweened.js @@ -89,11 +89,12 @@ export function tweened(value, defaults = {}) { * @param {import('./private').TweenedOptions} [opts] */ function set(new_value, opts) { + target_value = new_value; + if (value == null) { store.set((value = new_value)); return Promise.resolve(); } - target_value = new_value; /** @type {import('../internal/client/types').Task | null} */ let previous_task = task; diff --git a/packages/svelte/tests/motion/test.ts b/packages/svelte/tests/motion/test.ts index ea2e5c059..05971b5ca 100644 --- a/packages/svelte/tests/motion/test.ts +++ b/packages/svelte/tests/motion/test.ts @@ -26,5 +26,15 @@ describe('motion', () => { size.set(100, { duration: 0 }); assert.equal(get(size), 100); }); + + it('updates correctly when initialized with a `null`-ish value', () => { + const size = tweened(undefined as unknown as number, { duration: 0 }); + + size.set(10); + assert.equal(get(size), 10); + + size.update((v) => v + 10); + assert.equal(get(size), 20); + }); }); });