"use client"; import { memo } from "react"; import CardStackTextBox from "@/components/cardStack/CardStackTextBox"; import MediaContent from "@/components/shared/MediaContent"; import { useCardAnimation } from "@/components/cardStack/hooks/useCardAnimation"; import { cls, shouldUseInvertedText } from "@/lib/utils"; import { useTheme } from "@/providers/themeProvider/ThemeProvider"; import type { LucideIcon } from "lucide-react"; import type { ButtonConfig, CardAnimationType, TitleSegment } from "@/components/cardStack/types"; import type { TextboxLayout, InvertedBackground } from "@/providers/themeProvider/config/constants"; type MediaProps = | { imageSrc: string; imageAlt?: string; videoSrc?: never; videoAriaLabel?: never; } | { videoSrc: string; videoAriaLabel?: string; imageSrc?: never; imageAlt?: never; }; type Metric = MediaProps & { id: string; value: string; title: string; description: string; }; interface MetricCardElevenProps { metrics: Metric[]; animationType: CardAnimationType; title: string; titleSegments?: TitleSegment[]; description: string; tag?: string; tagIcon?: LucideIcon; buttons?: ButtonConfig[]; textboxLayout: TextboxLayout; useInvertedBackground: InvertedBackground; ariaLabel?: string; className?: string; containerClassName?: string; textBoxClassName?: string; textBoxTitleClassName?: string; textBoxTitleImageWrapperClassName?: string; textBoxTitleImageClassName?: string; textBoxDescriptionClassName?: string; textBoxTagClassName?: string; textBoxButtonContainerClassName?: string; textBoxButtonClassName?: string; textBoxButtonTextClassName?: string; gridClassName?: string; cardClassName?: string; valueClassName?: string; cardTitleClassName?: string; cardDescriptionClassName?: string; mediaCardClassName?: string; mediaClassName?: string; } interface MetricTextCardProps { metric: Metric; shouldUseLightText: boolean; cardClassName?: string; valueClassName?: string; cardTitleClassName?: string; cardDescriptionClassName?: string; } interface MetricMediaCardProps { metric: Metric; mediaCardClassName?: string; mediaClassName?: string; } const MetricTextCard = memo(({ metric, shouldUseLightText, cardClassName = "", valueClassName = "", cardTitleClassName = "", cardDescriptionClassName = "", }: MetricTextCardProps) => { return (

{metric.value}

{metric.title}

{metric.description}

); }); MetricTextCard.displayName = "MetricTextCard"; const MetricMediaCard = memo(({ metric, mediaCardClassName = "", mediaClassName = "", }: MetricMediaCardProps) => { return (
); }); MetricMediaCard.displayName = "MetricMediaCard"; const MetricCardEleven = ({ metrics, animationType, title, titleSegments, description, tag, tagIcon, buttons, textboxLayout, useInvertedBackground, ariaLabel = "Metrics section", className = "", containerClassName = "", textBoxClassName = "", textBoxTitleClassName = "", textBoxTitleImageWrapperClassName = "", textBoxTitleImageClassName = "", textBoxDescriptionClassName = "", textBoxTagClassName = "", textBoxButtonContainerClassName = "", textBoxButtonClassName = "", textBoxButtonTextClassName = "", gridClassName = "", cardClassName = "", valueClassName = "", cardTitleClassName = "", cardDescriptionClassName = "", mediaCardClassName = "", mediaClassName = "", }: MetricCardElevenProps) => { const theme = useTheme(); const shouldUseLightText = shouldUseInvertedText(useInvertedBackground, theme.cardStyle); // Inner grid for each metric item (text + media side by side) const innerGridCols = "grid-cols-2"; const { itemRefs } = useCardAnimation({ animationType, itemCount: metrics.length }); return (
{metrics.map((metric, index) => { const isLastItem = index === metrics.length - 1; const isOddTotal = metrics.length % 2 !== 0; const isSingleItem = metrics.length === 1; const shouldSpanFull = isSingleItem || (isLastItem && isOddTotal); // On mobile, even items (2nd, 4th, 6th - index 1, 3, 5) have media first const isEvenItem = (index + 1) % 2 === 0; return (
{ itemRefs.current[index] = el; }} className={cls( "grid gap-4", innerGridCols, shouldSpanFull && "md:col-span-2" )} >
); })}
); }; MetricCardEleven.displayName = "MetricCardEleven"; export default MetricCardEleven;