import { type RefObject, useEffect } from "react"; const FOCUSABLE = [ "a[href]", "button:not(:disabled)", "input:not(:disabled)", "select:not(:disabled)", "textarea:not(:disabled)", '[tabindex]:not([tabindex="-1"])', ].join(", "); export function useFocusTrap(containerRef: RefObject): void { useEffect(() => { const el = containerRef.current; if (!el) return; const focusable = () => Array.from(el.querySelectorAll(FOCUSABLE)); focusable()[0]?.focus(); const onKeyDown = (e: KeyboardEvent) => { if (e.key !== "Tab") return; const items = focusable(); if (items.length === 0) return; const first = items[0]; const last = items[items.length - 1]; if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last.focus(); } else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first.focus(); } }; el.addEventListener("keydown", onKeyDown); return () => el.removeEventListener("keydown", onKeyDown); }, [containerRef]); }