import React, { useEffect, useRef } from 'react'; import { X, type LucideIcon } from '../../icons'; import { useEscapeKey } from '../../hooks/useEscapeKey'; import { useFocusTrap } from '../../hooks/useFocusTrap'; import './Modal.css'; interface Props { open: boolean; onClose: () => void; title?: string; icon?: LucideIcon; footer?: React.ReactNode; accent?: 'matrix' | 'violet'; width?: 'default' | 'wide'; variant?: 'center' | 'drawer-right'; children: React.ReactNode; className?: string; } const Modal: React.FC = ({ open, onClose, title, icon: Icon, footer, accent = 'matrix', width = 'default', variant = 'center', children, className = '', }) => { const panelRef = useRef(null); useEscapeKey(onClose, open); useFocusTrap(panelRef, open); useEffect(() => { if (!open) return; const prev = document.body.style.overflow; document.body.style.overflow = 'hidden'; return () => { document.body.style.overflow = prev; }; }, [open]); if (!open) return null; const panelClasses = [ 'modal', accent === 'violet' ? 'violet' : '', width === 'wide' ? 'wide' : '', variant === 'drawer-right' ? 'modal-drawer-right' : '', className, ].filter(Boolean).join(' '); const backdropClass = variant === 'drawer-right' ? 'modal-backdrop drawer' : 'modal-backdrop'; return (
e.stopPropagation()} role="dialog" aria-modal="true" > {title && (

{Icon && } {title}

)} {children} {footer &&
{footer}
}
); }; export default Modal;