From 4d6b0d488afd107f98833c196c2dfc8a33682df8 Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 11 Mar 2026 20:26:22 +0000 Subject: [PATCH] Switch to version 3: modified src/components/cardStack/CardStack.tsx --- src/components/cardStack/CardStack.tsx | 247 ++++++++++++++++++++++--- 1 file changed, 226 insertions(+), 21 deletions(-) diff --git a/src/components/cardStack/CardStack.tsx b/src/components/cardStack/CardStack.tsx index 6ac66da..3003a8a 100644 --- a/src/components/cardStack/CardStack.tsx +++ b/src/components/cardStack/CardStack.tsx @@ -1,24 +1,229 @@ -import { ReactNode } from 'react'; -import { CardStackProvider, CardStackContextType } from './CardStackContext'; +"use client"; -export interface CardStackProps { - children: ReactNode; - className?: string; - ariaLabel?: string; -} +import { memo, Children } from "react"; +import { CardStackProps } from "./types"; +import GridLayout from "./layouts/grid/GridLayout"; +import AutoCarousel from "./layouts/carousels/AutoCarousel"; +import ButtonCarousel from "./layouts/carousels/ButtonCarousel"; +import TimelineBase from "./layouts/timelines/TimelineBase"; +import { gridConfigs } from "./layouts/grid/gridConfigs"; -export default function CardStack({ children, className = '', ariaLabel = 'Card stack' }: CardStackProps) { - const contextValue: CardStackContextType = { - isVisible: true, - getAnimationProps: () => ({ isVisible: true }), - itemRefs: {} - }; +const CardStack = ({ + children, + mode = "buttons", + gridVariant = "uniform-all-items-equal", + uniformGridCustomHeightClasses, + gridRowsClassName, + itemHeightClassesOverride, + animationType, + supports3DAnimation = false, + title, + titleSegments, + description, + tag, + tagIcon, + tagAnimation, + buttons, + buttonAnimation, + textboxLayout = "default", + useInvertedBackground, + carouselThreshold = 5, + bottomContent, + className = "", + containerClassName = "", + gridClassName = "", + carouselClassName = "", + carouselItemClassName = "", + controlsClassName = "", + textBoxClassName = "", + titleClassName = "", + titleImageWrapperClassName = "", + titleImageClassName = "", + descriptionClassName = "", + tagClassName = "", + buttonContainerClassName = "", + buttonClassName = "", + buttonTextClassName = "", + ariaLabel = "Card stack", +}: CardStackProps) => { + const childrenArray = Children.toArray(children); + const itemCount = childrenArray.length; - return ( - -
- {children} -
-
- ); -} + // Check if the current grid config has gridRows defined + const gridConfig = gridConfigs[gridVariant]?.[itemCount]; + const hasFixedGridRows = gridConfig && 'gridRows' in gridConfig && gridConfig.gridRows; + + // If grid has fixed row heights and we have uniformGridCustomHeightClasses, + // we need to use min-h-0 on md+ to prevent conflicts + let adjustedHeightClasses = uniformGridCustomHeightClasses; + if (hasFixedGridRows && uniformGridCustomHeightClasses) { + // Extract the mobile min-height and add md:min-h-0 + const mobileMinHeight = uniformGridCustomHeightClasses.split(' ')[0]; + adjustedHeightClasses = `${mobileMinHeight} md:min-h-0`; + } + + // Timeline layout for zigzag pattern (works best with 3-6 items) + if (gridVariant === "timeline" && itemCount >= 3 && itemCount <= 6) { + // Convert depth-3d to scale-rotate for timeline (doesn't support 3D) + const timelineAnimationType = animationType === "depth-3d" ? "scale-rotate" : animationType; + + return ( + + {childrenArray} + + ); + } + + // Use grid for items below threshold, carousel for items at or above threshold + // Timeline with 7+ items will also use carousel + const useCarousel = itemCount >= carouselThreshold || (gridVariant === "timeline" && itemCount > 6); + + // Grid layout for 1-4 items + if (!useCarousel) { + return ( + + {childrenArray} + + ); + } + + // Auto-scroll carousel for 5+ items + if (mode === "auto") { + // Convert depth-3d to scale-rotate for carousel (doesn't support 3D) + const carouselAnimationType = animationType === "depth-3d" ? "scale-rotate" : animationType; + + return ( + + {childrenArray} + + ); + } + + // Button-controlled carousel for 5+ items + // Convert depth-3d to scale-rotate for carousel (doesn't support 3D) + const carouselAnimationType = animationType === "depth-3d" ? "scale-rotate" : animationType; + + return ( + + {childrenArray} + + ); +}; + +CardStack.displayName = "CardStack"; + +export default memo(CardStack);