import React, { useEffect, useRef } from 'react'; import { clsx } from 'clsx'; import { X } from 'lucide-react'; export interface DialogProps { open: boolean; onOpenChange: (open: boolean) => void; children: React.ReactNode; size?: 'sm' | 'md' | 'lg' | 'xl' | 'full'; className?: string; } const sizeClasses = { sm: 'max-w-sm', md: 'max-w-lg', lg: 'max-w-2xl', xl: 'max-w-4xl', full: 'max-w-[95vw] max-h-[95vh]', }; /** * Dialog/Modal component using divs for better control */ export const Dialog = ({ open, onOpenChange, children, size = 'md', className }: DialogProps) => { const dialogRef = useRef(null); useEffect(() => { if (open) { document.body.style.overflow = 'hidden'; } else { document.body.style.overflow = ''; } return () => { document.body.style.overflow = ''; }; }, [open]); useEffect(() => { const handleEscape = (e: KeyboardEvent) => { if (e.key === 'Escape' && open) { onOpenChange(false); } }; if (open) { document.addEventListener('keydown', handleEscape); // Focus trap const focusableElements = dialogRef.current?.querySelectorAll( 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])' ); const firstElement = focusableElements?.[0] as HTMLElement; firstElement?.focus(); } return () => { document.removeEventListener('keydown', handleEscape); }; }, [open, onOpenChange]); if (!open) return null; return (
{ if (e.target === e.currentTarget) { onOpenChange(false); } }} > {/* Backdrop */}
{/* Dialog Content */}
e.stopPropagation()} > {children}
); }; export interface DialogHeaderProps extends React.HTMLAttributes { children: React.ReactNode; } export const DialogHeader = ({ children, className, ...props }: DialogHeaderProps) => { return (
{children}
); }; export interface DialogTitleProps extends React.HTMLAttributes { children: React.ReactNode; } export const DialogTitle = ({ children, className, ...props }: DialogTitleProps) => { return (

{children}

); }; export interface DialogDescriptionProps extends React.HTMLAttributes { children: React.ReactNode; } export const DialogDescription = ({ children, className, ...props }: DialogDescriptionProps) => { return (

{children}

); }; export interface DialogContentProps extends React.HTMLAttributes { children: React.ReactNode; } export const DialogContent = ({ children, className, ...props }: DialogContentProps) => { return (
{children}
); }; export interface DialogFooterProps extends React.HTMLAttributes { children: React.ReactNode; } export const DialogFooter = ({ children, className, ...props }: DialogFooterProps) => { return (
{children}
); }; export interface DialogCloseProps { onClose: () => void; className?: string; } export const DialogClose = ({ onClose, className }: DialogCloseProps) => { return ( ); };