From e3e101f2a871d9917c29ff7ab8c97dc727429f32 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Thu, 31 Oct 2024 18:32:10 +0000 Subject: [PATCH] fix: ensure transitions are applied to nested elements --- .changeset/modern-adults-lay.md | 5 ++++ .../src/compiler/phases/2-analyze/index.js | 2 ++ .../2-analyze/visitors/TransitionDirective.js | 14 +++++++++++ .../transition-static-subtree/_config.js | 23 +++++++++++++++++++ .../transition-static-subtree/main.svelte | 18 +++++++++++++++ 5 files changed, 62 insertions(+) create mode 100644 .changeset/modern-adults-lay.md create mode 100644 packages/svelte/src/compiler/phases/2-analyze/visitors/TransitionDirective.js create mode 100644 packages/svelte/tests/runtime-runes/samples/transition-static-subtree/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/transition-static-subtree/main.svelte diff --git a/.changeset/modern-adults-lay.md b/.changeset/modern-adults-lay.md new file mode 100644 index 0000000000..9caa3962af --- /dev/null +++ b/.changeset/modern-adults-lay.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: ensure transitions are applied to nested elements diff --git a/packages/svelte/src/compiler/phases/2-analyze/index.js b/packages/svelte/src/compiler/phases/2-analyze/index.js index 89c2e19c3f..f5a31d09a7 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/index.js +++ b/packages/svelte/src/compiler/phases/2-analyze/index.js @@ -63,6 +63,7 @@ import { SvelteWindow } from './visitors/SvelteWindow.js'; import { TaggedTemplateExpression } from './visitors/TaggedTemplateExpression.js'; import { Text } from './visitors/Text.js'; import { TitleElement } from './visitors/TitleElement.js'; +import { TransitionDirective } from './visitors/TransitionDirective.js'; import { UpdateExpression } from './visitors/UpdateExpression.js'; import { UseDirective } from './visitors/UseDirective.js'; import { VariableDeclarator } from './visitors/VariableDeclarator.js'; @@ -172,6 +173,7 @@ const visitors = { SvelteWindow, TaggedTemplateExpression, Text, + TransitionDirective, TitleElement, UpdateExpression, UseDirective, diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/TransitionDirective.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/TransitionDirective.js new file mode 100644 index 0000000000..c218f741c3 --- /dev/null +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/TransitionDirective.js @@ -0,0 +1,14 @@ +/** @import { AST } from '#compiler' */ +/** @import { Context } from '../types' */ + +import { mark_subtree_dynamic } from './shared/fragment.js'; + +/** + * @param {AST.TransitionDirective} node + * @param {Context} context + */ +export function TransitionDirective(node, context) { + mark_subtree_dynamic(context.path); + + context.next(); +} diff --git a/packages/svelte/tests/runtime-runes/samples/transition-static-subtree/_config.js b/packages/svelte/tests/runtime-runes/samples/transition-static-subtree/_config.js new file mode 100644 index 0000000000..99563ef959 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/transition-static-subtree/_config.js @@ -0,0 +1,23 @@ +import { flushSync } from '../../../../src/index-client.js'; +import { test } from '../../test'; + +export default test({ + async test({ assert, raf, target }) { + assert.htmlEqual(target.innerHTML, '
123
'); + + const btn1 = target.querySelector('button'); + btn1?.click(); + flushSync(); + raf.tick(250); + + assert.htmlEqual( + target.innerHTML, + '
123
' + ); + + flushSync(); + raf.tick(500); + + assert.htmlEqual(target.innerHTML, ''); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/transition-static-subtree/main.svelte b/packages/svelte/tests/runtime-runes/samples/transition-static-subtree/main.svelte new file mode 100644 index 0000000000..4a15e15699 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/transition-static-subtree/main.svelte @@ -0,0 +1,18 @@ + + + + +{#if visible} +
+ 123 +
+{/if}