"use client"; import { useEffect, useRef, useState, type ReactNode } from "react"; type RevealProps = { children: ReactNode; className?: string; /** Stagger delay in ms once visible */ delay?: number; /** Optional custom y offset in px */ offset?: number; }; export default function Reveal({ children, className = "", delay = 0, offset = 36, }: RevealProps) { const ref = useRef(null); const [visible, setVisible] = useState(false); useEffect(() => { const el = ref.current; if (!el) return; const reduce = window.matchMedia("(prefers-reduced-motion: reduce)").matches; if (reduce) { setVisible(true); return; } const io = new IntersectionObserver( ([entry]) => { if (entry.isIntersecting) { setVisible(true); io.disconnect(); } }, { threshold: 0.12, rootMargin: "0px 0px -6% 0px" }, ); io.observe(el); return () => io.disconnect(); }, []); return (
{children}
); }