import { useEffect, type RefObject } from 'react'; /** * Closes a dropdown/menu when the user clicks anywhere outside `ref` or * presses Escape (M10 follow-up). Pass the menu's *container* (trigger + * popup) so clicks on the trigger keep working as a toggle. */ export function useDismissable( ref: RefObject, open: boolean, onClose: () => void, ): void { useEffect(() => { if (!open) return undefined; function onPointerDown(event: PointerEvent): void { if (ref.current && !ref.current.contains(event.target as Node)) onClose(); } function onKeyDown(event: KeyboardEvent): void { if (event.key === 'Escape') onClose(); } document.addEventListener('pointerdown', onPointerDown); document.addEventListener('keydown', onKeyDown); return () => { document.removeEventListener('pointerdown', onPointerDown); document.removeEventListener('keydown', onKeyDown); }; }, [ref, open, onClose]); }