/** * Modal Component * * Reusable modal layout component with consistent styling and behavior. * * Features: * - Backdrop overlay with click-to-close * - Header with icon, title, subtitle, and close button * - Scrollable content area * - Sticky footer with action buttons * - Configurable max width * - Fade-in and scale-in animations * * @component * @layer Presentation */ import { X } from 'lucide-react'; export interface ModalProps { /** Modal title */ title: string; /** Optional subtitle */ subtitle?: string; /** Optional icon component */ icon?: React.ReactNode; /** Modal content */ children: React.ReactNode; /** Footer content (buttons) */ footer?: React.ReactNode; /** Close handler */ onClose: () => void; /** Max width class (default: max-w-2xl) */ maxWidth?: string; /** Whether to show close button (default: true) */ showCloseButton?: boolean; } /** * Modal Component */ export function Modal({ title, subtitle, icon, children, footer, onClose, maxWidth = 'max-w-2xl', showCloseButton = true, }: ModalProps) { return (
{ if (e.target === e.currentTarget) { onClose(); } }} >
{/* Header */}
{icon && (
{icon}
)}

{title}

{subtitle &&

{subtitle}

}
{showCloseButton && ( )}
{/* Content */}
{children}
{/* Footer */} {footer && (
{footer}
)}
); }