export default function trapFocus(element: HTMLElement) { function handleKeyDown(e: KeyboardEvent) { if (e.key !== 'Tab') { return; } e.preventDefault(); e.stopPropagation(); const focusableElements = Array.from( element.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'), ) as HTMLElement[]; if (!focusableElements.length) { return; } const currentFocusedIndex = focusableElements.findIndex((em) => em.isSameNode(document.activeElement)); let newFocusedIndex = 0; if (currentFocusedIndex >= 0) { if (e.shiftKey) { newFocusedIndex = currentFocusedIndex > 0 ? currentFocusedIndex - 1 : focusableElements.length - 1; } else { newFocusedIndex = currentFocusedIndex < focusableElements.length - 1 ? currentFocusedIndex + 1 : 0; } } focusableElements[newFocusedIndex].focus(); } document.addEventListener('keydown', handleKeyDown, false); return () => { document.removeEventListener('keydown', handleKeyDown, false); }; }