"use client"; import React, { Children, useCallback } from "react"; import { cls } from "@/lib/utils"; import CardStackTextBox from "../../CardStackTextBox"; import { useTimelineHorizontal, type MediaItem } from "../../hooks/useTimelineHorizontal"; import MediaContent from "@/components/shared/MediaContent"; import type { LucideIcon } from "lucide-react"; import type { ButtonConfig, TitleSegment, TextboxLayout, InvertedBackground } from "../../types"; interface TimelineHorizontalCardStackProps { children: React.ReactNode; title: string; titleSegments?: TitleSegment[]; description: string; tag?: string; tagIcon?: LucideIcon; buttons?: ButtonConfig[]; textboxLayout: TextboxLayout; useInvertedBackground?: InvertedBackground; mediaItems?: MediaItem[]; className?: string; containerClassName?: string; textBoxClassName?: string; titleClassName?: string; titleImageWrapperClassName?: string; titleImageClassName?: string; descriptionClassName?: string; tagClassName?: string; buttonContainerClassName?: string; buttonClassName?: string; buttonTextClassName?: string; cardClassName?: string; progressBarClassName?: string; mediaContainerClassName?: string; mediaClassName?: string; ariaLabel?: string; } const TimelineHorizontalCardStack = ({ children, title, titleSegments, description, tag, tagIcon, buttons, textboxLayout, useInvertedBackground, mediaItems, className = "", containerClassName = "", textBoxClassName = "", titleClassName = "", titleImageWrapperClassName = "", titleImageClassName = "", descriptionClassName = "", tagClassName = "", buttonContainerClassName = "", buttonClassName = "", buttonTextClassName = "", cardClassName = "", progressBarClassName = "", mediaContainerClassName = "", mediaClassName = "", ariaLabel = "Timeline section", }: TimelineHorizontalCardStackProps) => { const childrenArray = Children.toArray(children); const itemCount = childrenArray.length; const { activeIndex, progressRefs, handleItemClick, imageOpacity, currentMediaSrc } = useTimelineHorizontal({ itemCount, mediaItems, }); const getGridColumns = useCallback(() => { if (itemCount === 2) return "md:grid-cols-2"; if (itemCount === 3) return "md:grid-cols-3"; return "md:grid-cols-4"; }, [itemCount]); const getItemOpacity = useCallback( (index: number) => { return index <= activeIndex ? "opacity-100" : "opacity-50"; }, [activeIndex] ); return (
{mediaItems && mediaItems.length > 0 && (
)}
{Children.map(childrenArray, (child, index) => (
handleItemClick(index)} > {child}
{ if (el !== null) { progressRefs.current[index] = el; } }} className={cls("absolute z-10 h-full w-full bg-foreground origin-left", progressBarClassName)} style={{ transform: "scaleX(0)" }} />
))}
); }; TimelineHorizontalCardStack.displayName = "TimelineHorizontalCardStack"; export default React.memo(TimelineHorizontalCardStack);