From ca213349c7d431329c97c3ec9a814e1c4bde7bba Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 11 Mar 2026 20:09:14 +0000 Subject: [PATCH] Switch to version 3: modified src/components/sections/testimonial/TestimonialCardThirteen.tsx --- .../testimonial/TestimonialCardThirteen.tsx | 280 +++++++++++++++--- 1 file changed, 234 insertions(+), 46 deletions(-) diff --git a/src/components/sections/testimonial/TestimonialCardThirteen.tsx b/src/components/sections/testimonial/TestimonialCardThirteen.tsx index 5127b8b..4a464d4 100644 --- a/src/components/sections/testimonial/TestimonialCardThirteen.tsx +++ b/src/components/sections/testimonial/TestimonialCardThirteen.tsx @@ -1,52 +1,240 @@ -import React from 'react'; -import { CardStack } from '@/components/cardStack/CardStack'; +"use client"; -interface TestimonialCardThirteenProps { - testimonials: Array<{ +import { memo } from "react"; +import CardStack from "@/components/cardStack/CardStack"; +import TestimonialAuthor from "@/components/shared/TestimonialAuthor"; +import { cls, shouldUseInvertedText } from "@/lib/utils"; +import { useTheme } from "@/providers/themeProvider/ThemeProvider"; +import { Quote, Star } from "lucide-react"; +import type { LucideIcon } from "lucide-react"; +import type { ButtonConfig, ButtonAnimationType, CardAnimationTypeWith3D, TitleSegment, TextboxLayout, InvertedBackground } from "@/components/cardStack/types"; + +type Testimonial = { id: string; name: string; - imageSrc: string; + handle: string; + testimonial: string; + rating: number; + imageSrc?: string; imageAlt?: string; - }>; - title: string; - description: string; - gridVariant?: string; - animationType?: string; - textboxLayout?: string; - useInvertedBackground?: boolean; - [key: string]: any; -} - -const TestimonialCardThirteen: React.FC = ({ - testimonials, - title, - description, - gridVariant = 'uniform-all-items-equal', - animationType = 'slide-up', - textboxLayout = 'default', - useInvertedBackground = false, - ...props -}) => { - const testimonialItems = testimonials.map((testimonial) => ( -
- {testimonial.imageAlt -

{testimonial.name}

-
- )); - - return ( - - {testimonialItems} - - ); + icon?: LucideIcon; }; -export default TestimonialCardThirteen; \ No newline at end of file +interface TestimonialCardThirteenProps { + testimonials: Testimonial[]; + showRating: boolean; + carouselMode?: "auto" | "buttons"; + uniformGridCustomHeightClasses?: string; + animationType: CardAnimationTypeWith3D; + 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; + cardClassName?: string; + textBoxTitleClassName?: string; + textBoxTitleImageWrapperClassName?: string; + textBoxTitleImageClassName?: string; + textBoxDescriptionClassName?: string; + imageWrapperClassName?: string; + imageClassName?: string; + iconClassName?: string; + nameClassName?: string; + handleClassName?: string; + testimonialClassName?: string; + ratingClassName?: string; + contentWrapperClassName?: string; + gridClassName?: string; + carouselClassName?: string; + controlsClassName?: string; + textBoxClassName?: string; + textBoxTagClassName?: string; + textBoxButtonContainerClassName?: string; + textBoxButtonClassName?: string; + textBoxButtonTextClassName?: string; +} + +interface TestimonialCardProps { + testimonial: Testimonial; + showRating: boolean; + useInvertedBackground: boolean; + cardClassName?: string; + imageWrapperClassName?: string; + imageClassName?: string; + iconClassName?: string; + nameClassName?: string; + handleClassName?: string; + testimonialClassName?: string; + ratingClassName?: string; + contentWrapperClassName?: string; +} + +const TestimonialCard = memo(({ + testimonial, + showRating, + useInvertedBackground, + cardClassName = "", + imageWrapperClassName = "", + imageClassName = "", + iconClassName = "", + nameClassName = "", + handleClassName = "", + testimonialClassName = "", + ratingClassName = "", + contentWrapperClassName = "", +}: TestimonialCardProps) => { + const Icon = testimonial.icon || Quote; + const theme = useTheme(); + const shouldUseLightText = shouldUseInvertedText(useInvertedBackground, theme.cardStyle); + + return ( +
+
+ {showRating ? ( +
+ {Array.from({ length: 5 }).map((_, index) => ( + + ))} +
+ ) : ( + + )} + +

+ {testimonial.testimonial} +

+
+ + +
+ ); +}); + +TestimonialCard.displayName = "TestimonialCard"; + +const TestimonialCardThirteen = ({ + testimonials, + showRating, + carouselMode = "buttons", + uniformGridCustomHeightClasses = "min-h-none", + animationType, + title, + titleSegments, + description, + tag, + tagIcon, + tagAnimation, + buttons, + buttonAnimation, + textboxLayout, + useInvertedBackground, + ariaLabel = "Testimonials section", + className = "", + containerClassName = "", + cardClassName = "", + textBoxTitleClassName = "", + textBoxTitleImageWrapperClassName = "", + textBoxTitleImageClassName = "", + textBoxDescriptionClassName = "", + imageWrapperClassName = "", + imageClassName = "", + iconClassName = "", + nameClassName = "", + handleClassName = "", + testimonialClassName = "", + ratingClassName = "", + contentWrapperClassName = "", + gridClassName = "", + carouselClassName = "", + controlsClassName = "", + textBoxClassName = "", + textBoxTagClassName = "", + textBoxButtonContainerClassName = "", + textBoxButtonClassName = "", + textBoxButtonTextClassName = "", +}: TestimonialCardThirteenProps) => { + return ( + + {testimonials.map((testimonial, index) => ( + + ))} + + ); +}; + +TestimonialCardThirteen.displayName = "TestimonialCardThirteen"; + +export default TestimonialCardThirteen;