import classNames from "classnames"; import { FocusTrap } from "focus-trap-react"; import * as m from "motion/react-m"; import type { ReactNode } from "react"; import { useRef } from "react"; import { Portal } from "./Portal"; interface Props { children: ReactNode; portalName: string; open: boolean; onClose?: () => void; zIndex?: keyof typeof zIndexes; variant?: "default" | "transparent"; noBackdrop?: boolean; } const zIndexes: Record = { 10: "z-10", 20: "z-20", 30: "z-30", 40: "z-40", 50: "z-50", }; export function Overlay({ variant = "default", zIndex = 30, open, onClose, portalName, noBackdrop, children, }: Props) { const containerRef = useRef(null); if (noBackdrop) { return ( {open && ( {/* NOTE:
wrapper is required for some reason, or FocusTrap complains */}
{children}
)} ); } return ( {open && ( { // Not sure why delayInitialFocus: true doesn't help, but having this no-op promise // seems to be required to make things work. }, }} >
{/* Show the draggable region at the top */} {/* TODO: Figure out tauri drag region and also make clickable still */} {variant === "default" && (
)} {children} )} ); }