import { ReactNode, useEffect } from 'react'; import { createPortal } from 'react-dom'; import { motion, AnimatePresence } from 'framer-motion'; import { X } from 'lucide-react'; import { clsx } from 'clsx'; import { useThemeStore } from '@/store/themeStore'; interface ModalProps { open: boolean; onClose: () => void; title?: string; children: ReactNode; size?: 'sm' | 'md' | 'lg' | 'xl'; className?: string; } const sizeClasses = { sm: 'max-w-sm', md: 'max-w-md', lg: 'max-w-lg', xl: 'max-w-2xl', }; export function Modal({ open, onClose, title, children, size = 'md', className }: ModalProps) { // Ensure dark class is on root so modal portal inherits theme const mode = useThemeStore((s) => s.mode); useEffect(() => { if (!open) return; const handleKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); }; document.addEventListener('keydown', handleKey); return () => document.removeEventListener('keydown', handleKey); }, [open, onClose]); useEffect(() => { document.body.style.overflow = open ? 'hidden' : ''; return () => { document.body.style.overflow = ''; }; }, [open]); return createPortal( {open && (
{/* Backdrop */} {/* Panel */} {title && (

{title}

)}
{children}
)}
, document.body ); }