/** Dispatch event on click outside of node */ export interface ClickOutsideOptions { callback: () => void excluded?: HTMLElement[] } export const clickOutside = ( node: HTMLElement, options: ClickOutsideOptions, ) => { const handleClick = (event: MouseEvent) => { if (!event?.target) return if ( node && !node.contains(event.target as Node) && (options.excluded ?? []).every( (excludeNode) => !excludeNode.contains(event.target as Node), ) && !event.defaultPrevented ) { options.callback() } } document.addEventListener("click", handleClick, true) return { destroy() { document.removeEventListener("click", handleClick, true) }, } }