'use client' import React, { ReactNode, useEffect, useState } from 'react' import { motion, Variants } from "framer-motion"; import clsx from 'clsx'; export type BlurredOverlayContainerProps = { visible: boolean bgOpacity?: number inDelay?: number outDelay?: number transitionDelay?: number children: ReactNode } & React.ComponentProps const BlurredOverlayContainer = ({ visible = true, bgOpacity = 30, inDelay = 0, outDelay = 0, transitionDelay: transitionDelay = 0, children, className, onClick, ...props }: BlurredOverlayContainerProps) => { const [loaded, setLoaded] = useState(visible) useEffect(() => { if (visible) { // Show immediately or after delay const timeout = setTimeout(() => setLoaded(true), inDelay) return () => clearTimeout(timeout) } else { // Hide with delay (matches opacity transition duration) const timeout = setTimeout(() => setLoaded(false), outDelay) // 300ms matches Tailwind transition return () => clearTimeout(timeout) } }, [visible, inDelay, outDelay]) const variants: Variants = { hidden: { opacity: 0, visibility: 'hidden', display: 'none', transition: { delay: transitionDelay / 1000, duration: 0.3, ease: 'easeInOut', }, }, visible: { opacity: 1, visibility: 'visible', display: 'block', transition: { delay: transitionDelay / 1000, duration: 0.3, ease: 'easeInOut', }, }, }; return (
{children}
) } export default BlurredOverlayContainer