From c5a982abc087906c51632b4faeb6a8b8a0b2ee06 Mon Sep 17 00:00:00 2001 From: MBO-Tech-IT Date: Thu, 2 Apr 2026 01:12:15 +0200 Subject: [PATCH] feat: add ScrollReveal component with Intersection Observer --- components/ScrollReveal.tsx | 47 +++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 components/ScrollReveal.tsx diff --git a/components/ScrollReveal.tsx b/components/ScrollReveal.tsx new file mode 100644 index 0000000..787b405 --- /dev/null +++ b/components/ScrollReveal.tsx @@ -0,0 +1,47 @@ +// components/ScrollReveal.tsx +"use client"; + +import { useEffect, useRef, useState } from "react"; + +interface ScrollRevealProps { + children: React.ReactNode; + delay?: number; + className?: string; +} + +export default function ScrollReveal({ children, delay = 0, className = "" }: ScrollRevealProps) { + const ref = useRef(null); + const [visible, setVisible] = useState(false); + + useEffect(() => { + const el = ref.current; + if (!el) return; + + const observer = new IntersectionObserver( + ([entry]) => { + if (entry.isIntersecting) { + setVisible(true); + observer.disconnect(); + } + }, + { threshold: 0.1 } + ); + + observer.observe(el); + return () => observer.disconnect(); + }, []); + + return ( +
+ {children} +
+ ); +}