From 6d3d0b5e95468e5d0a736a059c674367f93b1da3 Mon Sep 17 00:00:00 2001 From: Vula Builder Date: Tue, 23 Jun 2026 08:47:10 +0000 Subject: [PATCH] Deploy --- src/components/ui/Modal.tsx | 67 +++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/components/ui/Modal.tsx diff --git a/src/components/ui/Modal.tsx b/src/components/ui/Modal.tsx new file mode 100644 index 0000000..1cd07b7 --- /dev/null +++ b/src/components/ui/Modal.tsx @@ -0,0 +1,67 @@ +'use client' + +import { cn } from "@/lib/utils" +import React, { useEffect, useRef, useState } from "react" +import { X } from 'lucide-react' + +interface ModalProps { + isOpen: boolean + onClose: () => void + title?: string + children: React.ReactNode + className?: string +} + +export default function Modal({ isOpen, onClose, title, children, className }: ModalProps) { + const overlayRef = useRef(null) + const [mounted, setMounted] = useState(false) + + useEffect(() => { + setMounted(isOpen) + }, [isOpen]) + + useEffect(() => { + if (!isOpen) return + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key === "Escape") onClose() + } + document.addEventListener("keydown", handleKeyDown) + return () => document.removeEventListener("keydown", handleKeyDown) + }, [isOpen, onClose]) + + if (!mounted) return null + + const handleOverlayClick = (e: React.MouseEvent) => { + if (e.target === overlayRef.current) onClose() + } + + return ( +
+
+
+ {title &&

{title}

} + +
+
{children}
+
+
+ ) +} \ No newline at end of file