diff --git a/src/components/sections/feature/FeatureCardMedia.tsx b/src/components/sections/feature/FeatureCardMedia.tsx index c6f9699..2b73dbf 100644 --- a/src/components/sections/feature/FeatureCardMedia.tsx +++ b/src/components/sections/feature/FeatureCardMedia.tsx @@ -1,261 +1,141 @@ "use client"; -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"; +import React, { useMemo } from "react"; +import CardStack from "@/components/card/CardStack"; +import TextBox from "@/components/Textbox"; +import type { CardAnimationType } from "@/types/animations"; -type FeatureCard = { +export interface FeatureCardMediaProps { + features?: Array<{ id: string; title: string; description: string; - tag: string; - imageSrc?: string; - videoSrc?: string; - imageAlt?: string; - videoAriaLabel?: string; - buttons?: ButtonConfig[]; - onCardClick?: () => void; -}; - -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; + icon?: React.ReactNode; + mediaItems?: Array<{ type: string; src: string; alt?: string }>; + }>; + gridVariant?: string; + uniformGridCustomHeightClasses?: string; + animationType?: CardAnimationType; + title?: string; + titleSegments?: Array<{ type: "text"; content: string } | { type: "image"; src: string; alt?: string }>; + description?: string; + tag?: string; + 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; + textBoxClassName?: string; + textBoxTagClassName?: string; + textBoxButtonContainerClassName?: string; + textBoxButtonClassName?: string; + buttonTextClassName?: 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 ( -
= ({ + features = [], + gridVariant = "uniform-all-items-equal", uniformGridCustomHeightClasses = "min-h-95 2xl:min-h-105", animationType = "slide-up", title, + titleSegments, + description = "", tag, + tagAnimation, + buttons, + buttonAnimation, + 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 = "", buttonTextClassName = ""}) => { + const cardItems = useMemo( + () => + features.map((feature) => ( +
-
- + {feature.icon} +
+ )} +

+ {feature.title} +

+

+ {feature.description} +

+ {feature.mediaItems && ( +
+ {feature.mediaItems.map((media, idx) => ( + {media.alt -
- -
+ ))}
+ )} +
+ )), + [features, cardClassName, cardIconWrapperClassName, cardIconClassName, cardTitleClassName, cardDescriptionClassName, mediaClassName] + ); -
-

- {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 ( - + {title && ( +
+ +
+ )} + +
+ - {features.map((feature) => ( - - ))} + {cardItems.map((item) => item)} - ); +
+ + ); }; -FeatureCardMedia.displayName = "FeatureCardMedia"; - -export default FeatureCardMedia; +export default FeatureCardMedia; \ No newline at end of file