"use client"; import React, { useEffect, useState } from "react"; import { gsap } from "gsap"; import { ScrollTrigger } from "gsap/ScrollTrigger"; gsap.registerPlugin(ScrollTrigger); import CardStackTextBox from "../../CardStackTextBox"; import { useCardAnimation } from "../../hooks/useCardAnimation"; import { cls } from "@/lib/utils"; import type { LucideIcon } from "lucide-react"; import type { ButtonConfig, ButtonAnimationType, CardAnimationType, TitleSegment } from "../../types"; import type { TextboxLayout, InvertedBackground } from "@/providers/themeProvider/config/constants"; interface TimelineProcessFlowItem { content: React.ReactNode; media: React.ReactNode; reverse: boolean; } interface TimelineProcessFlowProps { items: TimelineProcessFlowItem[]; title: string; titleSegments?: TitleSegment[]; description: string; tag?: string; tagIcon?: LucideIcon; tagAnimation?: ButtonAnimationType; buttons?: ButtonConfig[]; buttonAnimation?: ButtonAnimationType; textboxLayout: TextboxLayout; animationType: CardAnimationType; useInvertedBackground?: InvertedBackground; ariaLabel?: string; className?: string; containerClassName?: string; textBoxClassName?: string; textBoxTitleClassName?: string; textBoxDescriptionClassName?: string; textBoxTagClassName?: string; textBoxButtonContainerClassName?: string; textBoxButtonClassName?: string; textBoxButtonTextClassName?: string; itemClassName?: string; mediaWrapperClassName?: string; numberClassName?: string; contentWrapperClassName?: string; gapClassName?: string; titleImageWrapperClassName?: string; titleImageClassName?: string; } const TimelineProcessFlow = ({ items, title, titleSegments, description, tag, tagIcon, tagAnimation, buttons, buttonAnimation, textboxLayout, animationType, useInvertedBackground, ariaLabel = "Timeline process flow section", className = "", containerClassName = "", textBoxClassName = "", textBoxTitleClassName = "", textBoxDescriptionClassName = "", textBoxTagClassName = "", textBoxButtonContainerClassName = "", textBoxButtonClassName = "", textBoxButtonTextClassName = "", itemClassName = "", mediaWrapperClassName = "", numberClassName = "", contentWrapperClassName = "", gapClassName = "", titleImageWrapperClassName = "", titleImageClassName = "", }: TimelineProcessFlowProps) => { const { itemRefs } = useCardAnimation({ animationType, itemCount: items.length, useIndividualTriggers: true }); const [isMdScreen, setIsMdScreen] = useState(false); useEffect(() => { const checkScreenSize = () => { setIsMdScreen(window.innerWidth >= 768); }; checkScreenSize(); window.addEventListener('resize', checkScreenSize); return () => window.removeEventListener('resize', checkScreenSize); }, []); useEffect(() => { gsap.fromTo( ".timeline-line-fill", { yPercent: -100 }, { yPercent: 0, ease: "none", scrollTrigger: { trigger: ".timeline-container", start: "top center", end: "bottom center", scrub: true, }, } ); return () => { ScrollTrigger.getAll().forEach((trigger) => trigger.kill()); }; }, []); return (
{/* Mobile line - outside ol for correct positioning */}
    {/* Desktop line - inside ol for correct stacking context */}
    {items.map((item, index) => (
  1. { itemRefs.current[index] = el; }} className={cls( "relative z-10 w-full flex flex-col gap-6 md:gap-0 md:flex-row justify-between", item.reverse && "flex-col md:flex-row-reverse", itemClassName )} >
    {item.media}

    {index + 1}

    {item.content}
  2. ))}
); }; export default TimelineProcessFlow;