import { type JSX, onCleanup, onMount } from "solid-js"; import { OverlayPortal } from "../../App/OverlayHost"; import texts from "../../i18n"; import { Icon } from "./Icon"; const DIALOG_WIDTHS = { md: "max-w-[calc(var(--ui-control-size-xl)*7.5)]", lg: "max-w-[calc(var(--ui-control-size-xl)*9.25)]", } as const; export function Dialog(props: { bodyClass?: string; children: JSX.Element; label: string; lockPageScroll?: boolean; onClose: () => void; title: JSX.Element; variant: "reader" | "site"; width: keyof typeof DIALOG_WIDTHS; }) { onMount(() => { const scrollRoots = [document.documentElement, document.body]; const overflowStyles = props.lockPageScroll ? scrollRoots.map((root) => ({ priority: root.style.getPropertyPriority("overflow"), value: root.style.getPropertyValue("overflow"), })) : []; const closeOnEscape = (event: KeyboardEvent) => { if (event.key !== "Escape") { return; } event.preventDefault(); event.stopImmediatePropagation(); props.onClose(); }; if (props.lockPageScroll) { for (const root of scrollRoots) { root.style.setProperty("overflow", "hidden", "important"); } } window.addEventListener("keydown", closeOnEscape, true); onCleanup(() => { window.removeEventListener("keydown", closeOnEscape, true); if (props.lockPageScroll) { scrollRoots.forEach((root, index) => { const previous = overflowStyles[index]; if (previous?.value) { root.style.setProperty("overflow", previous.value, previous.priority); } else { root.style.removeProperty("overflow"); } }); } }); }); const reader = () => props.variant === "reader"; return ( ); }