/** * Modal Component * Reusable modal overlay with animations */ 'use client'; import { useEffect, useCallback } from 'react'; import { createPortal } from 'react-dom'; import styles from './Modal.module.css'; interface ModalProps { isOpen: boolean; onClose: () => void; children: React.ReactNode; title?: string; size?: 'small' | 'medium' | 'large'; } export function Modal({ isOpen, onClose, children, title, size = 'medium' }: ModalProps) { const handleEscape = useCallback((e: KeyboardEvent) => { if (e.key === 'Escape') { onClose(); } }, [onClose]); useEffect(() => { if (!isOpen) return; // Add event listener document.addEventListener('keydown', handleEscape); // Prevent body scroll document.body.style.overflow = 'hidden'; return () => { document.removeEventListener('keydown', handleEscape); document.body.style.overflow = 'unset'; }; }, [isOpen, handleEscape]); if (!isOpen || typeof window === 'undefined') return null; const handleOverlayClick = (e: React.MouseEvent) => { if (e.target === e.currentTarget) { onClose(); } }; return createPortal(
{title &&

{title}

}
{children}
, document.body ); }