agency-web/app/components/Reveal.tsx

46 lines
928 B
TypeScript

"use client";
import { useEffect, useRef, ReactNode } from "react";
import { gsap } from "gsap";
import { ScrollTrigger } from "gsap/ScrollTrigger";
gsap.registerPlugin(ScrollTrigger);
export default function Reveal({
children,
className = "",
stagger = 0,
y = 40,
}: {
children: ReactNode;
className?: string;
stagger?: number;
y?: number;
}) {
const ref = useRef<HTMLDivElement>(null);
useEffect(() => {
const el = ref.current;
if (!el) return;
const targets = stagger > 0 ? Array.from(el.children) : [el];
const ctx = gsap.context(() => {
gsap.from(targets, {
y,
opacity: 0,
duration: 1,
ease: "power3.out",
stagger,
scrollTrigger: { trigger: el, start: "top 85%" },
});
}, el);
return () => ctx.revert();
}, [stagger, y]);
return (
<div ref={ref} className={className}>
{children}
</div>
);
}