'use client'; import { ReactNode, useEffect, useRef, useState } from 'react'; import { motion } from 'framer-motion'; import { clsx } from 'clsx/lite'; import useClickInsideOutside from '@/utility/useClickInsideOutside'; import { useRouter } from 'next/navigation'; import AnimateItems from './AnimateItems'; import { PATH_ROOT } from '@/site/paths'; import usePrefersReducedMotion from '@/utility/usePrefersReducedMotion'; import useMetaThemeColor from '@/site/useMetaThemeColor'; import useEscapeHandler from '@/utility/useEscapeHandler'; export default function Modal({ onClosePath, onClose, className, anchor = 'center', children, fast, }: { onClosePath?: string onClose?: () => void className?: string anchor?: 'top' | 'center' children: ReactNode fast?: boolean }) { const router = useRouter(); const prefersReducedMotion = usePrefersReducedMotion(); const contentRef = useRef(null); const [htmlElements, setHtmlElements] = useState([]); useEffect(() => { if (contentRef.current) { setHtmlElements([contentRef.current]); } }, []); useMetaThemeColor({ colorLight: '#333' }); useClickInsideOutside({ htmlElements, onClickOutside: () => { if (onClose) { onClose(); } else { router.push( onClosePath ?? PATH_ROOT, { scroll: false }, ); } }, }); useEscapeHandler(onClose, true); return ( {children} ]} /> ); };