diff --git a/src/compiler/compile/render_dom/wrappers/Element/index.ts b/src/compiler/compile/render_dom/wrappers/Element/index.ts index 62c45c093d..db26b6673c 100644 --- a/src/compiler/compile/render_dom/wrappers/Element/index.ts +++ b/src/compiler/compile/render_dom/wrappers/Element/index.ts @@ -760,7 +760,7 @@ export default class ElementWrapper extends Wrapper { intro_block = b` @add_render_callback(() => { if (${outro_name}) ${outro_name}.end(1); - if (!${intro_name}) ${intro_name} = @create_in_transition(${this.var}, ${fn}, ${snippet}); + ${intro_name} = @create_in_transition(${this.var}, ${fn}, ${snippet}); ${intro_name}.start(); }); `; diff --git a/test/runtime/samples/transition-css-in-out-in-with-param/_config.js b/test/runtime/samples/transition-css-in-out-in-with-param/_config.js new file mode 100644 index 0000000000..c5dfb63225 --- /dev/null +++ b/test/runtime/samples/transition-css-in-out-in-with-param/_config.js @@ -0,0 +1,21 @@ +export default { + test({ assert, component, target, window, raf }) { + component.visible = true; + const div = target.querySelector('div'); + + // animation duration of `in` should be 10ms. + assert.equal(div.style.animation, '__svelte_1670736059_0 10ms linear 0ms 1 both'); + + // animation duration of `out` should be 5ms. + component.visible = false; + assert.equal(div.style.animation, '__svelte_1670736059_0 10ms linear 0ms 1 both, __svelte_1998461463_0 5ms linear 0ms 1 both'); + + // change param + raf.tick(1); + component.param = true; + component.visible = true; + + // animation duration of `in` should be 20ms. + assert.equal(div.style.animation, '__svelte_722598827_0 20ms linear 0ms 1 both'); + } +}; diff --git a/test/runtime/samples/transition-css-in-out-in-with-param/main.svelte b/test/runtime/samples/transition-css-in-out-in-with-param/main.svelte new file mode 100644 index 0000000000..616e2e0e8b --- /dev/null +++ b/test/runtime/samples/transition-css-in-out-in-with-param/main.svelte @@ -0,0 +1,26 @@ +<script> + export let visible = false; + export let param = false; + + function getInParam() { + return { + duration: param ? 20 : 10, + css: t => { + return `opacity: ${t}`; + } + }; + } + + function getOutParam() { + return { + duration: param ? 15 : 5, + css: t => { + return `opacity: ${t}`; + } + }; + } +</script> + +{#if visible} + <div in:getInParam out:getOutParam></div> +{/if} \ No newline at end of file diff --git a/test/runtime/samples/transition-css-in-out-in/_config.js b/test/runtime/samples/transition-css-in-out-in/_config.js index cd7ae14ce8..6d93c0e8c3 100644 --- a/test/runtime/samples/transition-css-in-out-in/_config.js +++ b/test/runtime/samples/transition-css-in-out-in/_config.js @@ -15,6 +15,6 @@ export default { component.visible = true; // reset original styles - assert.equal(div.style.animation, '__svelte_3809512021_1 100ms linear 0ms 1 both'); + assert.equal(div.style.animation, '__svelte_3809512021_0 100ms linear 0ms 1 both'); } };