Skip to content

Commit cf16acd

Browse files
authored
fix: enable local transitions on svelte:element (#12346)
fixes #12231
1 parent 67bf7a8 commit cf16acd

File tree

4 files changed

+40
-1
lines changed

4 files changed

+40
-1
lines changed

.changeset/wild-cows-chew.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: enable local transitions on `svelte:element`

packages/svelte/src/internal/client/dom/blocks/svelte-element.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { current_component_context, current_effect } from '../../runtime.js';
1414
import { DEV } from 'esm-env';
1515
import { assign_nodes } from '../template.js';
1616
import { noop } from '../../../shared/utils.js';
17+
import { EFFECT_TRANSPARENT } from '../../constants.js';
1718

1819
/**
1920
* @param {Comment | Element} node
@@ -135,5 +136,5 @@ export function element(node, get_tag, is_svg, render_fn, get_namespace, locatio
135136
// Inert effects are proactively detached from the effect tree. Returning a noop
136137
// teardown function is an easy way to ensure that this is not discarded
137138
return noop;
138-
});
139+
}, EFFECT_TRANSPARENT);
139140
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { test } from '../../test';
2+
import { flushSync } from 'svelte';
3+
4+
export default test({
5+
async test({ assert, target, raf }) {
6+
const btn = target.querySelector('button');
7+
8+
raf.tick(0);
9+
btn?.click();
10+
flushSync();
11+
12+
assert.htmlEqual(
13+
target.innerHTML,
14+
`<button>Toggle</button> <div style="opacity: 0;">DIV</div>`
15+
);
16+
17+
raf.tick(100);
18+
19+
assert.htmlEqual(target.innerHTML, `<button>Toggle</button> <div style="">DIV</div>`);
20+
}
21+
});
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<script>
2+
import { fade } from 'svelte/transition';
3+
4+
let element = $state('div');
5+
let show = $state(false);
6+
</script>
7+
8+
<button onclick={() => (show = !show)}>Toggle</button>
9+
10+
{#if show}
11+
<svelte:element this={element} transition:fade={{ duration: 100 }}>DIV</svelte:element>
12+
{/if}

0 commit comments

Comments
 (0)