'use client'; import { forwardRef, HTMLAttributes, useEffect } from 'react'; export interface CyberModalProps extends HTMLAttributes { isOpen: boolean; onClose: () => void; title?: string; variant?: 'cyan' | 'pink' | 'green' | 'red'; size?: 'sm' | 'md' | 'lg'; } const variantStyles = { cyan: 'border-cyan-400 shadow-[0_0_20px_#00f0ff]', pink: 'border-fuchsia-500 shadow-[0_0_20px_#ff00ff]', green: 'border-emerald-400 shadow-[0_0_20px_#00ff88]', red: 'border-rose-500 shadow-[0_0_20px_#ff0040]', }; const titleColors = { cyan: 'text-cyan-400 bg-cyan-400/10 border-cyan-400', pink: 'text-fuchsia-500 bg-fuchsia-500/10 border-fuchsia-500', green: 'text-emerald-400 bg-emerald-400/10 border-emerald-400', red: 'text-rose-500 bg-rose-500/10 border-rose-500', }; const sizeStyles = { sm: 'max-w-[400px]', md: 'max-w-[600px]', lg: 'max-w-[900px]' }; export const CyberModal = forwardRef( ({ isOpen, onClose, title, variant = 'cyan', size = 'md', children, className = '', ...props }, ref) => { useEffect(() => { const handleEscape = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); }; if (isOpen) { document.addEventListener('keydown', handleEscape); document.body.style.overflow = 'hidden'; } return () => { document.removeEventListener('keydown', handleEscape); document.body.style.overflow = ''; }; }, [isOpen, onClose]); if (!isOpen) return null; return ( e.stopPropagation()} role="dialog" aria-modal="true" {...props} > {title && ( {title} )} ✕ {children} ); } ); CyberModal.displayName = 'CyberModal'; export default CyberModal;