You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Focus trapping and utilities for accessible modal dialogs and overlays.
Quick Start
import{FocusTrap,FocusUtils}from'@zappzarapp/browser-utils/focus';// Create and activate focus trap for modalconsttrap=FocusTrap.create(modalElement,{initialFocus: modalElement.querySelector('input'),returnFocus: true,escapeDeactivates: true,});trap.activate();// Later, when modal closestrap.deactivate();
FocusTrap
Factory Method
consttrap=FocusTrap.create(container,{initialFocus: null,// Element or selector to focus initiallyreturnFocus: true,// Return focus when deactivatedescapeDeactivates: false,// Deactivate on Escape keyonEscapeDeactivate: ()=>{},// Callback when Escape deactivatesallowOutsideClick: true,// Allow clicks outside container});
constmodalStack: FocusTrapInstance[]=[];functionopenNestedModal(modalElement: HTMLElement): void{// Pause current trapconstcurrentTrap=modalStack[modalStack.length-1];if(currentTrap){currentTrap.pause();}// Create new trapconsttrap=FocusTrap.create(modalElement,{escapeDeactivates: true,onEscapeDeactivate: ()=>closeNestedModal(),});modalStack.push(trap);trap.activate();}functioncloseNestedModal(): void{consttrap=modalStack.pop();trap?.deactivate();// Unpause previous trapconstpreviousTrap=modalStack[modalStack.length-1];if(previousTrap){previousTrap.unpause();}}
Custom Focus Navigation
// Arrow key navigation in a listlistElement.addEventListener('keydown',(event)=>{if(event.key==='ArrowDown'){event.preventDefault();FocusUtils.focusNext(listElement);}elseif(event.key==='ArrowUp'){event.preventDefault();FocusUtils.focusPrevious(listElement);}});
Save and Restore Focus
// Save focus before temporary operationconstrestoreFocus=FocusUtils.saveFocus();// Do something that changes focussearchInput.focus();// Later, restore focusrestoreFocus();
Accessibility Considerations
WCAG Compliance - Focus trapping is essential for modal dialogs (WCAG
2.4.3)
Keyboard Navigation - All interactive elements remain accessible via Tab
Focus Visible - Ensure trapped elements have visible focus indicators
Escape Key - Enable escapeDeactivates for user control
Return Focus - Always return focus to trigger element when closing modals