"use client"; import { useEffect } from "react"; import gsap from "gsap"; import { ScrollTrigger } from "gsap/ScrollTrigger"; import { SplitText } from "gsap/SplitText"; gsap.registerPlugin(ScrollTrigger, SplitText); export const useSplitHeading = ( headingRef: React.RefObject, subHeadingRef?: React.RefObject ) => { useEffect(() => { if (!headingRef.current) return; const headingSplit = new SplitText(headingRef.current, { type: "words" }); const subSplit = subHeadingRef?.current && new SplitText(subHeadingRef.current, { type: "words" }); // heading animation gsap.from(headingSplit.words, { yPercent: 100, opacity: 0, duration: 1, ease: "expo.out", stagger: 0.07, scrollTrigger: { trigger: headingRef.current, start: "top 85%", toggleActions: "play none none none", }, }); // subheading animation if (subSplit) { gsap.from(subSplit.words, { yPercent: 100, opacity: 0, duration: 1, ease: "expo.out", stagger: 0.04, scrollTrigger: { trigger: subHeadingRef?.current, start: "top 85%", toggleActions: "play none none none", }, }); } return () => { headingSplit.revert(); subSplit?.revert(); ScrollTrigger.getAll().forEach((st) => st.kill()); }; }, [headingRef, subHeadingRef]); };