import { ComponentProps, createEffect, onCleanup, Show } from "solid-js"; export interface ModalProps extends Pick, "children"> { open?: boolean; onClose?: () => void; closeOnClick?: boolean; nonBlocking?: boolean; } export const Modal = (props: ModalProps) => { return (
{ const handleEscape = (e: KeyboardEvent) => { if (e.key === "Escape") { const modals = document.querySelectorAll("[data-modal]"); const lastModal = modals[modals.length - 1]; if (lastModal === node) { e.preventDefault(); e.stopPropagation(); if (props.onClose) props.onClose(); } } }; createEffect(() => { if (!props.nonBlocking) document.body.style.overflow = "hidden"; else document.body.style.overflow = "auto"; }); document.addEventListener("keydown", handleEscape); onCleanup(() => { document.body.style.overflow = "auto"; document.removeEventListener("keydown", handleEscape); }); }} onClick={(ev) => { if ( (props.closeOnClick ?? true) && ev.target === ev.currentTarget && !props.nonBlocking ) { if (props.onClose) props.onClose(); } }} > {props.children}
); };