"use client" import { useRef } from "react" import { AnimatePresence, motion, useInView, type MotionProps, type UseInViewOptions, type Variants, } from "motion/react" type MarginType = UseInViewOptions["margin"] interface BlurFadeProps extends MotionProps { children: React.ReactNode className?: string variant?: { hidden: { y: number } visible: { y: number } } duration?: number delay?: number offset?: number direction?: "up" | "down" | "left" | "right" inView?: boolean inViewMargin?: MarginType blur?: string } const getFilter = (v: Variants[string]) => typeof v === "function" ? undefined : v.filter export function BlurFade({ children, className, variant, duration = 0.4, delay = 0, offset = 6, direction = "down", inView = false, inViewMargin = "-50px", blur = "6px", ...props }: BlurFadeProps) { const ref = useRef(null) const inViewResult = useInView(ref, { once: true, margin: inViewMargin }) const isInView = !inView || inViewResult const defaultVariants: Variants = { hidden: { [direction === "left" || direction === "right" ? "x" : "y"]: direction === "right" || direction === "down" ? -offset : offset, opacity: 0, filter: `blur(${blur})`, }, visible: { [direction === "left" || direction === "right" ? "x" : "y"]: 0, opacity: 1, filter: `blur(0px)`, }, } const combinedVariants = variant ?? defaultVariants const hiddenFilter = getFilter(combinedVariants.hidden) const visibleFilter = getFilter(combinedVariants.visible) const shouldTransitionFilter = hiddenFilter != null && visibleFilter != null && hiddenFilter !== visibleFilter return ( {children} ) }