diff --git a/.changeset/famous-insects-sort.md b/.changeset/famous-insects-sort.md new file mode 100644 index 0000000000..d38361b99d --- /dev/null +++ b/.changeset/famous-insects-sort.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +chore: ensure transition events are dispatched without current reaction diff --git a/packages/svelte/src/internal/client/dom/elements/transitions.js b/packages/svelte/src/internal/client/dom/elements/transitions.js index b473d0029d..158cee84c0 100644 --- a/packages/svelte/src/internal/client/dom/elements/transitions.js +++ b/packages/svelte/src/internal/client/dom/elements/transitions.js @@ -1,7 +1,13 @@ /** @import { AnimateFn, Animation, AnimationConfig, EachItem, Effect, TransitionFn, TransitionManager } from '#client' */ import { noop, is_function } from '../../../shared/utils.js'; import { effect } from '../../reactivity/effects.js'; -import { active_effect, untrack } from '../../runtime.js'; +import { + active_effect, + active_reaction, + set_active_effect, + set_active_reaction, + untrack +} from '../../runtime.js'; import { loop } from '../../loop.js'; import { should_intro } from '../../render.js'; import { current_each_item } from '../blocks/each.js'; @@ -15,7 +21,16 @@ import { queue_micro_task } from '../task.js'; * @returns {void} */ function dispatch_event(element, type) { - element.dispatchEvent(new CustomEvent(type)); + var previous_reaction = active_reaction; + var previous_effect = active_effect; + set_active_reaction(null); + set_active_effect(null); + try { + element.dispatchEvent(new CustomEvent(type)); + } finally { + set_active_reaction(previous_reaction); + set_active_effect(previous_effect); + } } /**