From c174aaa219bb0df5a033ff5ca48a8008751c683d Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 11 Mar 2026 20:30:42 +0000 Subject: [PATCH] Update src/components/sections/feature/FeatureCardTwentySeven.tsx --- .../feature/FeatureCardTwentySeven.tsx | 295 +++++++----------- 1 file changed, 108 insertions(+), 187 deletions(-) diff --git a/src/components/sections/feature/FeatureCardTwentySeven.tsx b/src/components/sections/feature/FeatureCardTwentySeven.tsx index 8e95b1a..57f0c0d 100644 --- a/src/components/sections/feature/FeatureCardTwentySeven.tsx +++ b/src/components/sections/feature/FeatureCardTwentySeven.tsx @@ -1,127 +1,44 @@ "use client"; -import { useState } from "react"; -import { Plus } from "lucide-react"; -import CardStack from "@/components/cardStack/CardStack"; -import MediaContent from "@/components/shared/MediaContent"; -import { cls } from "@/lib/utils"; -import type { LucideIcon } from "lucide-react"; -import type { ButtonConfig, GridVariant, CardAnimationType, TitleSegment, ButtonAnimationType } from "@/components/cardStack/types"; -import type { TextboxLayout, InvertedBackground } from "@/providers/themeProvider/config/constants"; +import React, { useMemo } from "react"; +import CardStack from "@/components/card/CardStack"; +import TextBox from "@/components/Textbox"; +import type { CardAnimationType } from "@/types/animations"; +import type { GridVariant } from "@/types/grid"; -type FeatureCard = { - id: string; - title: string; - descriptions: string[]; - imageSrc?: string; - videoSrc?: string; - imageAlt?: string; -}; - -interface FeatureCardTwentySevenItemProps { - title: string; - descriptions: string[]; - imageSrc?: string; - videoSrc?: string; - imageAlt?: string; - className?: string; - titleClassName?: string; - descriptionClassName?: string; -} - -const FeatureCardTwentySevenItem = ({ - title, - descriptions, - imageSrc, - videoSrc, - imageAlt = "", - className = "", - titleClassName = "", - descriptionClassName = "", -}: FeatureCardTwentySevenItemProps) => { - const [isFlipped, setIsFlipped] = useState(false); - - return ( -
setIsFlipped(!isFlipped)} - > -
-
-
-

- {title} -

-
- -
-
-
- -
-
- -
-
-

- {title} -

-
- -
-
-
- {descriptions.map((desc, index) => ( -

- {desc} -

- ))} -
-
-
-
- ); -}; - -interface FeatureCardTwentySevenProps { - features: FeatureCard[]; - carouselMode?: "auto" | "buttons"; - gridVariant: GridVariant; +export interface FeatureCardTwentySevenProps { + features?: Array<{ + id: string; + title: string; + description: string; + icon?: React.ReactNode; + mediaItems?: Array<{ type: string; src: string; alt?: string }>; + }>; + gridVariant?: GridVariant; uniformGridCustomHeightClasses?: string; - animationType: CardAnimationType; - title: string; - titleSegments?: TitleSegment[]; - description: string; + animationType?: CardAnimationType; + title?: string; + titleSegments?: Array<{ type: "text"; content: string } | { type: "image"; src: string; alt?: string }>; + description?: string; tag?: string; - tagIcon?: LucideIcon; - tagAnimation?: ButtonAnimationType; - buttons?: ButtonConfig[]; - buttonAnimation?: ButtonAnimationType; - textboxLayout: TextboxLayout; - useInvertedBackground: InvertedBackground; + tagAnimation?: "none" | "opacity" | "slide-up" | "blur-reveal"; + buttons?: Array<{ text: string; onClick?: () => void; href?: string }>; + buttonAnimation?: "none" | "opacity" | "slide-up" | "blur-reveal"; + textboxLayout?: "default" | "split" | "split-actions" | "split-description" | "inline-image"; + useInvertedBackground?: boolean; ariaLabel?: string; className?: string; containerClassName?: string; cardClassName?: string; + mediaClassName?: string; textBoxTitleClassName?: string; textBoxTitleImageWrapperClassName?: string; textBoxTitleImageClassName?: string; textBoxDescriptionClassName?: string; cardTitleClassName?: string; cardDescriptionClassName?: string; + cardIconClassName?: string; + cardIconWrapperClassName?: string; gridClassName?: string; carouselClassName?: string; controlsClassName?: string; @@ -132,90 +49,94 @@ interface FeatureCardTwentySevenProps { textBoxButtonTextClassName?: string; } -const FeatureCardTwentySeven = ({ - features, - carouselMode = "buttons", - gridVariant, - uniformGridCustomHeightClasses = "min-h-none", - animationType, - title, +const FeatureCardTwentySeven: React.FC = ({ + features = [], + gridVariant = "uniform-all-items-equal", uniformGridCustomHeightClasses = "min-h-95 2xl:min-h-105", animationType = "slide-up", title, titleSegments, - description, - tag, - tagIcon, + description = "", tag, tagAnimation, buttons, buttonAnimation, - textboxLayout, - useInvertedBackground, - ariaLabel = "Feature section", - className = "", - containerClassName = "", - cardClassName = "", - textBoxTitleClassName = "", - textBoxTitleImageWrapperClassName = "", - textBoxTitleImageClassName = "", - textBoxDescriptionClassName = "", - cardTitleClassName = "", - cardDescriptionClassName = "", - gridClassName = "", - carouselClassName = "", - controlsClassName = "", - textBoxClassName = "", - textBoxTagClassName = "", - textBoxButtonContainerClassName = "", - textBoxButtonClassName = "", - textBoxButtonTextClassName = "", -}: FeatureCardTwentySevenProps) => { + textboxLayout = "default", useInvertedBackground = false, + ariaLabel = "Feature section", className = "", containerClassName = "", cardClassName = "", mediaClassName = "", textBoxTitleClassName = "", textBoxTitleImageWrapperClassName = "", textBoxTitleImageClassName = "", textBoxDescriptionClassName = "", cardTitleClassName = "", cardDescriptionClassName = "", cardIconClassName = "", cardIconWrapperClassName = "", gridClassName = "", carouselClassName = "", controlsClassName = "", textBoxClassName = "", textBoxTagClassName = "", textBoxButtonContainerClassName = "", textBoxButtonClassName = "", textBoxButtonTextClassName = ""}) => { + const cardItems = useMemo( + () => + features.map((feature) => ( +
+ {feature.icon && ( +
+ {feature.icon} +
+ )} +

+ {feature.title} +

+

+ {feature.description} +

+ {feature.mediaItems && ( +
+ {feature.mediaItems.map((media, idx) => ( + {media.alt + ))} +
+ )} +
+ )), + [features, cardClassName, cardIconWrapperClassName, cardIconClassName, cardTitleClassName, cardDescriptionClassName, mediaClassName] + ); + return ( - - {features.map((feature, index) => ( - - ))} - + {title && ( +
+ +
+ )} + +
+ + {cardItems.map((item) => item)} + +
+ ); }; -FeatureCardTwentySeven.displayName = "FeatureCardTwentySeven"; - -export default FeatureCardTwentySeven; +export default FeatureCardTwentySeven; \ No newline at end of file