Skip to main content

useFocusTrap

Traps keyboard focus within a container element by cycling Tab navigation between the first and last focusable items. Optionally auto-focuses the first element when activated. Used internally by the Popover component.

Import

import { useFocusTrap } from '@andrejground/lab';

Usage

import React from 'react';
import { useFocusTrap } from '@andrejground/lab';

export default function App() {
const [isActive, setIsActive] = React.useState(false);
const { focusContainerRef, firstFocusableItemRef, lastFocusableItemRef } =
useFocusTrap(isActive);

return (
<div>
<button onClick={() => setIsActive(true)}>Open dialog</button>

{isActive && (
<div ref={focusContainerRef}>
<input ref={firstFocusableItemRef} placeholder="First field" />
<input placeholder="Middle field" />
<button ref={lastFocusableItemRef} onClick={() => setIsActive(false)}>
Close
</button>
</div>
)}
</div>
);
}

API

const { focusContainerRef, firstFocusableItemRef, lastFocusableItemRef } =
useFocusTrap(isActive, shouldAutoFocus);
ParameterTypeDefaultDescription
isActiveboolean-Whether the focus trap is active
shouldAutoFocusbooleantrueAuto-focus the first focusable element on activation

Returns

PropertyTypeDescription
focusContainerRefRefObject<HTMLDivElement>Ref for the trap container
firstFocusableItemRefRefObject<HTMLDivElement>Ref for the first focusable element
lastFocusableItemRefRefObject<HTMLDivElement>Ref for the last focusable element