Chaque element apparait avec un fade + slide au scroll. Wrapper utilitaire reutilisable.
"use client";
import { useRef, useState, useEffect } from "react";
function ScrollReveal({ children, delay = 0 }: { children: React.ReactNode; delay?: number }) {
const ref = useRef<HTMLDivElement>(null);
const [visible, setVisible] = useState(false);
useEffect(() => {
const observer = new IntersectionObserver(
([entry]) => { if (entry.isIntersecting) { setVisible(true); observer.disconnect(); } },
{ threshold: 0.2 }
);
if (ref.current) observer.observe(ref.current);
return () => observer.disconnect();
}, []);
return (
<div ref={ref} style={{
opacity: visible ? 1 : 0,
transform: visible ? "translateY(0)" : "translateY(20px)",
transition: `opacity 0.6s ease ${delay}ms, transform 0.6s ease ${delay}ms`,
}}>
{children}
</div>
);
}
// Usage: wrap chaque element
<ScrollReveal delay={0}><Card /></ScrollReveal>
<ScrollReveal delay={100}><Card /></ScrollReveal>
<ScrollReveal delay={200}><Card /></ScrollReveal>Wrapper utilitaire reutilisable. Wrappez chaque element avec un delay stagger (0, 100, 200ms...) pour un reveal en cascade. Ajustez le threshold (0.2), la duree (0.6s) et le translateY (20px).