/** * Svelte action to handle clicks outside of a DOM node * @param node DOM node to check the click is outside of * @param callback callback function to call if click is outside * @returns svelte action return object with destroy method to remove event listener */ export function click_outside( node: Node, callback: (arg: MouseEvent) => void ): any { const handle_click = (event: MouseEvent): void => { if ( node && !node.contains(event.target as Node) && !event.defaultPrevented ) { callback(event); } }; document.addEventListener("mousedown", handle_click, true); return { destroy() { document.removeEventListener("mousedown", handle_click, true); } }; }