Skip to content

Commit

Permalink
fix(web): focus trap inside portal (#11797)
Browse files Browse the repository at this point in the history
* fix(web): focus trap inside portal

* fix tests
  • Loading branch information
michelheusschen authored Aug 15, 2024
1 parent f7bfde6 commit fa64277
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 5 deletions.
9 changes: 5 additions & 4 deletions web/src/lib/actions/__test__/focus-trap.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,22 @@ import { tick } from 'svelte';
describe('focusTrap action', () => {
const user = userEvent.setup();

it('sets focus to the first focusable element', () => {
it('sets focus to the first focusable element', async () => {
render(FocusTrapTest, { show: true });
await tick();
expect(document.activeElement).toEqual(screen.getByTestId('one'));
});

it('supports backward focus wrapping', async () => {
render(FocusTrapTest, { show: true });
await tick();
await user.keyboard('{Shift>}{Tab}{/Shift}');
expect(document.activeElement).toEqual(screen.getByTestId('three'));
});

it('supports forward focus wrapping', async () => {
render(FocusTrapTest, { show: true });
await tick();
screen.getByTestId('three').focus();
await user.keyboard('{Tab}');
expect(document.activeElement).toEqual(screen.getByTestId('one'));
Expand All @@ -28,9 +31,7 @@ describe('focusTrap action', () => {
render(FocusTrapTest, { show: false });
const openButton = screen.getByText('Open');

openButton.focus();
openButton.click();
await tick();
await user.click(openButton);
expect(document.activeElement).toEqual(screen.getByTestId('one'));

screen.getByText('Close').click();
Expand Down
5 changes: 4 additions & 1 deletion web/src/lib/actions/focus-trap.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { shortcuts } from '$lib/actions/shortcut';
import { tick } from 'svelte';

const selectors =
'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';
Expand All @@ -7,7 +8,9 @@ export function focusTrap(container: HTMLElement) {
const triggerElement = document.activeElement;

const focusableElement = container.querySelector<HTMLElement>(selectors);
focusableElement?.focus();

// Use tick() to ensure focus trap works correctly inside <Portal />
void tick().then(() => focusableElement?.focus());

const getFocusableElements = (): [HTMLElement | null, HTMLElement | null] => {
const focusableElements = container.querySelectorAll<HTMLElement>(selectors);
Expand Down

0 comments on commit fa64277

Please sign in to comment.