Skip to content

Commit 94a61e2

Browse files
authored
next: ensure focus focus scope handlers are cleaned up (#936)
1 parent ffc5db7 commit 94a61e2

File tree

3 files changed

+19
-16
lines changed

3 files changed

+19
-16
lines changed

.changeset/odd-chairs-teach.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"bits-ui": patch
3+
---
4+
5+
fix: cleanup focus scope handlers

packages/bits-ui/src/lib/bits/utilities/focus-scope/useFocusScope.svelte.ts

+13-15
Original file line numberDiff line numberDiff line change
@@ -130,19 +130,19 @@ export function useFocusScope({
130130
}
131131
}
132132

133-
const unsubEvents = executeCallbacks(
134-
addEventListener(document, "focusin", handleFocusIn),
135-
addEventListener(document, "focusout", handleFocusOut)
136-
);
137-
const mutationObserver = new MutationObserver(handleMutations);
138-
if (container) {
133+
return untrack(() => {
134+
const unsubEvents = executeCallbacks(
135+
addEventListener(document, "focusin", handleFocusIn),
136+
addEventListener(document, "focusout", handleFocusOut)
137+
);
138+
const mutationObserver = new MutationObserver(handleMutations);
139139
mutationObserver.observe(container, { childList: true, subtree: true });
140-
}
141140

142-
return () => {
143-
unsubEvents();
144-
mutationObserver.disconnect();
145-
};
141+
return () => {
142+
unsubEvents();
143+
mutationObserver.disconnect();
144+
};
145+
});
146146
});
147147

148148
$effect(() => {
@@ -161,8 +161,8 @@ export function useFocusScope({
161161

162162
$effect(() => {
163163
if (!forceMount.current) return;
164-
let container = ref.current;
165164
enabled.current;
165+
const container = ref.current;
166166
const previouslyFocusedElement = document.activeElement as HTMLElement | null;
167167
untrack(() => {
168168
handleMount(container, previouslyFocusedElement);
@@ -175,9 +175,7 @@ export function useFocusScope({
175175
});
176176

177177
function handleMount(container: HTMLElement | null, prevFocusedElement: HTMLElement | null) {
178-
if (!container) {
179-
container = document.getElementById(id.current);
180-
}
178+
if (!container) container = document.getElementById(id.current);
181179
if (!container) return;
182180
focusScopeStack.add(focusScope);
183181
const hasFocusedCandidate = container.contains(prevFocusedElement);

packages/bits-ui/src/lib/internal/should-trap-focus.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@ export function shouldTrapFocus({
1212
if (forceMount) {
1313
return open && trapFocus;
1414
}
15-
return present && trapFocus;
15+
return present && trapFocus && open;
1616
}

0 commit comments

Comments
 (0)