"use client"; import { ComponentProps, useState, useEffect } from "react"; import NextImage from "next/image"; import { createPortal } from "react-dom"; import { motion, AnimatePresence } from "framer-motion"; import { X, ZoomIn } from "lucide-react"; type Height = ComponentProps["height"]; type Width = ComponentProps["width"]; type ImageProps = Omit, "src"> & { src?: ComponentProps["src"]; }; export default function Image({ src, alt = "alt", width = 800, height = 350, ...props }: ImageProps) { const [isOpen, setIsOpen] = useState(false); // Lock scroll when open useEffect(() => { if (isOpen) { document.body.style.overflow = "hidden"; // Check for Escape key const handleEsc = (e: KeyboardEvent) => { if (e.key === "Escape") setIsOpen(false); }; window.addEventListener("keydown", handleEsc); return () => { document.body.style.overflow = "auto"; window.removeEventListener("keydown", handleEsc); }; } }, [isOpen]); if (!src) return null; return ( <> {isOpen && ( setIsOpen(false)} > {/* Close Button */} {/* Image Container */} e.stopPropagation()} >
setIsOpen(false)}>
{/* Caption */} {alt && alt !== "alt" && ( {alt} )}
)}
); } const Portal = ({ children }: { children: React.ReactNode }) => { if (typeof window === "undefined") return null; return createPortal(children, document.body); };