UNPKG

@gambito-corp/mbs-library

Version:

Librería de componentes React reutilizables - Sistema de diseño modular y escalable

82 lines (72 loc) 2.59 kB
import React, { useEffect } from 'react'; import Overlay from '../../atoms/Overlay'; import EscapeButton from '../../atoms/EscapeButton'; const Modal = ({ isOpen = false, onClose, title, children, size = 'medium', showHeader = true, showEscapeButton = true, className = '', ...props }) => { // Cerrar con tecla ESC useEffect(() => { const handleEsc = (e) => { if (e.key === 'Escape' && isOpen) { onClose(); } }; if (isOpen) { document.addEventListener('keydown', handleEsc); document.body.style.overflow = 'hidden'; } return () => { document.removeEventListener('keydown', handleEsc); document.body.style.overflow = 'unset'; }; }, [isOpen, onClose]); if (!isOpen) return null; const sizes = { small: 'max-w-md', medium: 'max-w-lg', large: 'max-w-2xl', xlarge: 'max-w-4xl' }; return ( <div className="fixed inset-0 z-50 overflow-y-auto"> {/* Overlay usando el átomo */} <Overlay isVisible={isOpen} onClick={onClose} /> {/* Modal Container */} <div className="flex min-h-full items-center justify-center p-4"> <div className={`relative bg-white rounded-lg shadow-xl w-full ${sizes[size]} ${className}`} onClick={(e) => e.stopPropagation()} {...props} > {/* Header */} {showHeader && title && ( <div className="flex items-center justify-between p-6 border-b border-gray-200"> <h3 className="text-lg font-semibold text-gray-900"> {title} </h3> {showEscapeButton && ( <EscapeButton onClick={onClose} /> )} </div> )} {/* Content */} <div className="p-6"> {children} </div> </div> </div> </div> ); }; export default Modal;