React focus management library that provides robust focus trapping functionality for modal dialogs and accessibility compliance
npx @tessl/cli install tessl/npm-react-focus-lock@2.13.0React Focus Lock is a comprehensive focus management library that provides robust focus trapping functionality for React applications, primarily designed for modal dialogs, dropdown menus, and other UI components that require focus containment. The library implements accessibility-compliant focus management by automatically trapping keyboard focus within a designated area, preventing users from tabbing out of modal dialogs or other focused components while maintaining proper tab order.
npm install react-focus-lockimport FocusLock from "react-focus-lock";For accessing all components and hooks:
import FocusLock, {
AutoFocusInside,
MoveFocusInside,
FreeFocusInside,
InFocusGuard,
useFocusScope,
useFocusController,
useFocusState,
useFocusInside
} from "react-focus-lock";Alternative entry points:
// UI components only (requires sidecar)
import { FocusLockUI } from "react-focus-lock/UI";
// Sidecar for custom integrations
import sidecar from "react-focus-lock/sidecar";CommonJS:
const FocusLock = require("react-focus-lock");
const { AutoFocusInside, useFocusScope } = require("react-focus-lock");import React, { useState } from "react";
import FocusLock from "react-focus-lock";
function ModalDialog({ isOpen, onClose, children }) {
if (!isOpen) return null;
return (
<div className="overlay">
<FocusLock returnFocus>
<div className="modal">
{children}
<button onClick={onClose}>Close</button>
</div>
</FocusLock>
</div>
);
}
// Usage
function App() {
const [showModal, setShowModal] = useState(false);
return (
<div>
<button onClick={() => setShowModal(true)}>Open Modal</button>
<ModalDialog isOpen={showModal} onClose={() => setShowModal(false)}>
<h2>Modal Content</h2>
<input placeholder="Focused input" />
<button>Modal Button</button>
</ModalDialog>
</div>
);
}React Focus Lock is built around several key components:
FocusLock component and related helper components for controlling focus behaviorCore React components for implementing focus trapping, including the main FocusLock component and helper components for specific focus behaviors.
declare const FocusLock: FC<ReactFocusLockProps>;
interface ReactFocusLockProps {
disabled?: boolean;
returnFocus?: boolean | FocusOptions | ((returnTo: Element) => boolean | FocusOptions);
autoFocus?: boolean;
children?: ReactNode;
}React hooks for programmatic focus management, providing fine-grained control over focus behavior within and outside of focus locks.
function useFocusScope(): FocusControl;
function useFocusController<Elements extends HTMLElement = HTMLElement>(
...shards: ReadonlyArray<HTMLElement | { current: HTMLElement | null }>
): FocusControl;
interface FocusControl {
autoFocus(): Promise<void>;
focusNext(options?: FocusOptions): Promise<void>;
focusPrev(options?: FocusOptions): Promise<void>;
}Complete type definitions for all components, hooks, and configuration options, ensuring full type safety in TypeScript projects.
interface FocusOptions {
cycle?: boolean;
onlyTabbable?: boolean;
}
interface FocusControl {
autoFocus(): Promise<void>;
focusNext(options?: FocusOptions): Promise<void>;
focusPrev(options?: FocusOptions): Promise<void>;
focusFirst(options?: Pick<FocusOptions, 'onlyTabbable'>): Promise<void>;
focusLast(options?: Pick<FocusOptions, 'onlyTabbable'>): Promise<void>;
}