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} )} ); }