From 6d3d9dcf3ada5bf262571bec6c7c8f162954342f Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 11 Mar 2026 20:09:03 +0000 Subject: [PATCH] Switch to version 3: modified src/components/sections/feature/FeatureCardMedia.tsx --- .../sections/feature/FeatureCardMedia.tsx | 300 +++++++++++++++--- 1 file changed, 253 insertions(+), 47 deletions(-) diff --git a/src/components/sections/feature/FeatureCardMedia.tsx b/src/components/sections/feature/FeatureCardMedia.tsx index 146f55a..c6f9699 100644 --- a/src/components/sections/feature/FeatureCardMedia.tsx +++ b/src/components/sections/feature/FeatureCardMedia.tsx @@ -1,55 +1,261 @@ -import React from 'react'; -import { CardStack } from '@/components/cardStack/CardStack'; +"use client"; -interface FeatureCardMediaProps { - features: Array<{ +import { memo } from "react"; +import CardStack from "@/components/cardStack/CardStack"; +import MediaContent from "@/components/shared/MediaContent"; +import Tag from "@/components/shared/Tag"; +import Button from "@/components/button/Button"; +import { cls, shouldUseInvertedText } from "@/lib/utils"; +import { getButtonProps } from "@/lib/buttonUtils"; +import { useTheme } from "@/providers/themeProvider/ThemeProvider"; +import type { LucideIcon } from "lucide-react"; +import type { ButtonConfig, CardAnimationType, TitleSegment, ButtonAnimationType } from "@/components/cardStack/types"; +import type { TextboxLayout, InvertedBackground } from "@/providers/themeProvider/config/constants"; + +type FeatureCard = { id: string; title: string; description: string; tag: string; imageSrc?: string; - }>; - title: string; - description: string; - animationType?: 'none' | 'opacity' | 'slide-up' | 'scale-rotate' | 'blur-reveal'; - textboxLayout?: 'default' | 'split' | 'split-actions' | 'split-description' | 'inline-image'; - useInvertedBackground?: boolean; - [key: string]: any; -} - -const FeatureCardMedia: React.FC = ({ - features, - title, - description, - animationType = 'slide-up', - textboxLayout = 'default', - useInvertedBackground = false, - ...props -}) => { - const featureItems = features.map((feature) => ( -
- {feature.imageSrc && ( - {feature.title} - )} - {feature.tag} -

{feature.title}

-

{feature.description}

-
- )); - - return ( - - {featureItems} - - ); + videoSrc?: string; + imageAlt?: string; + videoAriaLabel?: string; + buttons?: ButtonConfig[]; + onCardClick?: () => void; }; -export default FeatureCardMedia; \ No newline at end of file +interface FeatureCardMediaProps { + features: FeatureCard[]; + carouselMode?: "auto" | "buttons"; + uniformGridCustomHeightClasses?: string; + animationType: CardAnimationType; + title: string; + titleSegments?: TitleSegment[]; + description: string; + tag?: string; + tagIcon?: LucideIcon; + tagAnimation?: ButtonAnimationType; + buttons?: ButtonConfig[]; + buttonAnimation?: ButtonAnimationType; + textboxLayout: TextboxLayout; + useInvertedBackground: InvertedBackground; + ariaLabel?: string; + className?: string; + containerClassName?: string; + itemClassName?: string; + mediaWrapperClassName?: string; + mediaClassName?: string; + tagClassName?: string; + contentClassName?: string; + cardTitleClassName?: string; + cardDescriptionClassName?: string; + cardButtonContainerClassName?: string; + cardButtonClassName?: string; + cardButtonTextClassName?: string; + textBoxTitleClassName?: string; + textBoxTitleImageWrapperClassName?: string; + textBoxTitleImageClassName?: string; + textBoxDescriptionClassName?: string; + gridClassName?: string; + carouselClassName?: string; + controlsClassName?: string; + textBoxClassName?: string; + textBoxTagClassName?: string; + textBoxButtonContainerClassName?: string; + textBoxButtonClassName?: string; + textBoxButtonTextClassName?: string; +} + +interface FeatureCardItemProps { + feature: FeatureCard; + shouldUseLightText: boolean; + useInvertedBackground: InvertedBackground; + itemClassName?: string; + mediaWrapperClassName?: string; + mediaClassName?: string; + tagClassName?: string; + contentClassName?: string; + cardTitleClassName?: string; + cardDescriptionClassName?: string; + cardButtonContainerClassName?: string; + cardButtonClassName?: string; + cardButtonTextClassName?: string; +} + +const FeatureCardItem = memo(({ + feature, + shouldUseLightText, + useInvertedBackground, + itemClassName = "", + mediaWrapperClassName = "", + mediaClassName = "", + tagClassName = "", + contentClassName = "", + cardTitleClassName = "", + cardDescriptionClassName = "", + cardButtonContainerClassName = "", + cardButtonClassName = "", + cardButtonTextClassName = "", +}: FeatureCardItemProps) => { + const theme = useTheme(); + + return ( +
+
+ +
+ +
+
+ +
+

+ {feature.title} +

+ +

+ {feature.description} +

+ + {feature.buttons && feature.buttons.length > 0 && ( +
+ {feature.buttons.slice(0, 2).map((button, index) => ( +
+ )} +
+
+ ); +}); + +FeatureCardItem.displayName = "FeatureCardItem"; + +const FeatureCardMedia = ({ + features, + carouselMode = "buttons", + uniformGridCustomHeightClasses, + animationType, + title, + titleSegments, + description, + tag, + tagIcon, + tagAnimation, + buttons, + buttonAnimation, + textboxLayout, + useInvertedBackground, + ariaLabel = "Features section", + className = "", + containerClassName = "", + itemClassName = "", + mediaWrapperClassName = "", + mediaClassName = "", + tagClassName = "", + contentClassName = "", + cardTitleClassName = "", + cardDescriptionClassName = "", + cardButtonContainerClassName = "", + cardButtonClassName = "", + cardButtonTextClassName = "", + textBoxTitleClassName = "", + textBoxTitleImageWrapperClassName = "", + textBoxTitleImageClassName = "", + textBoxDescriptionClassName = "", + gridClassName = "", + carouselClassName = "", + controlsClassName = "", + textBoxClassName = "", + textBoxTagClassName = "", + textBoxButtonContainerClassName = "", + textBoxButtonClassName = "", + textBoxButtonTextClassName = "", +}: FeatureCardMediaProps) => { + const theme = useTheme(); + const shouldUseLightText = shouldUseInvertedText(useInvertedBackground, theme.cardStyle); + + return ( + + {features.map((feature) => ( + + ))} + + ); +}; + +FeatureCardMedia.displayName = "FeatureCardMedia"; + +export default FeatureCardMedia;