"use client"; import React, { useEffect, useRef, memo } from "react"; import { gsap } from "gsap"; import { ScrollTrigger } from "gsap/ScrollTrigger"; import CardStackTextBox from "../../CardStackTextBox"; import { useCardAnimation } from "../../hooks/useCardAnimation"; import { cls } from "@/lib/utils"; import type { LucideIcon } from "lucide-react"; import type { ButtonConfig } from "../../types"; import type { CardAnimationType } from "../../types"; import type { TitleSegment } from "../../types"; import type { TextboxLayout, InvertedBackground } from "@/providers/themeProvider/config/constants"; gsap.registerPlugin(ScrollTrigger); interface TimelineProcessFlowItem { id: string; content: React.ReactNode; media: React.ReactNode; reverse: boolean; } interface TimelineProcessFlowProps { items: TimelineProcessFlowItem[]; title: string; titleSegments?: TitleSegment[]; description: string; tag?: string; tagIcon?: LucideIcon; buttons?: ButtonConfig[]; 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, buttons, 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 processLineRef = useRef(null); const { itemRefs } = useCardAnimation({ animationType, itemCount: items.length }); useEffect(() => { if (!processLineRef.current) return; gsap.fromTo( processLineRef.current, { yPercent: -100 }, { yPercent: 0, ease: "none", scrollTrigger: { trigger: ".timeline-line", start: "top center", end: "bottom center", scrub: true, }, } ); return () => { ScrollTrigger.getAll().forEach((trigger) => trigger.kill()); }; }, []); return (
    {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}

    {item.id}

    {item.content}
  2. ))}
); }; TimelineProcessFlow.displayName = "TimelineProcessFlow"; export default memo(TimelineProcessFlow);