From 844a98f6a993cc3b21ba59241120611d80c79d82 Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 11 Mar 2026 20:27:11 +0000 Subject: [PATCH 1/3] Update src/components/sections/blog/BlogCardOne.tsx --- src/components/sections/blog/BlogCardOne.tsx | 381 ++++++++----------- 1 file changed, 166 insertions(+), 215 deletions(-) diff --git a/src/components/sections/blog/BlogCardOne.tsx b/src/components/sections/blog/BlogCardOne.tsx index dcb77bc..2cbd923 100644 --- a/src/components/sections/blog/BlogCardOne.tsx +++ b/src/components/sections/blog/BlogCardOne.tsx @@ -1,244 +1,195 @@ "use client"; -import { memo } from "react"; -import Image from "next/image"; -import CardStack from "@/components/cardStack/CardStack"; -import Badge from "@/components/shared/Badge"; -import OverlayArrowButton from "@/components/shared/OverlayArrowButton"; -import { cls, shouldUseInvertedText } from "@/lib/utils"; -import { useTheme } from "@/providers/themeProvider/ThemeProvider"; -import type { BlogPost } from "@/lib/api/blog"; -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, { useState, useMemo } from "react"; +import { ChevronLeft, ChevronRight, ArrowRight } from "lucide-react"; +import TextBox from "@/components/Textbox"; +import { CardStack } from "@/components/card/CardStack"; +import type { CardStackProps } from "@/components/card/CardStack"; +import type { CardAnimationType } from "@/components/card/types"; -type BlogCard = BlogPost; - -interface BlogCardOneProps { - blogs: BlogCard[]; - carouselMode?: "auto" | "buttons"; - uniformGridCustomHeightClasses?: string; - animationType: CardAnimationType; +export interface BlogCardOneProps { + blogs: Array<{ + id: string; + category: string; 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; - imageWrapperClassName?: string; - imageClassName?: string; - categoryClassName?: string; - cardTitleClassName?: string; - excerptClassName?: string; - authorContainerClassName?: string; - authorAvatarClassName?: string; - authorNameClassName?: string; - dateClassName?: 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; + excerpt: string; + imageSrc: string; + imageAlt?: string; + authorName: string; + authorAvatar: string; + date: string; + onBlogClick?: () => void; + }>; + carouselMode?: "auto" | "buttons"; + 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; + imageWrapperClassName?: string; + imageClassName?: string; + categoryClassName?: string; + cardTitleClassName?: string; + excerptClassName?: string; + authorContainerClassName?: string; + authorAvatarClassName?: string; + authorNameClassName?: string; + dateClassName?: 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 BlogCardItemProps { - blog: BlogCard; - shouldUseLightText: boolean; - cardClassName?: string; - imageWrapperClassName?: string; - imageClassName?: string; - categoryClassName?: string; - cardTitleClassName?: string; - excerptClassName?: string; - authorContainerClassName?: string; - authorAvatarClassName?: string; - authorNameClassName?: string; - dateClassName?: string; -} +const BlogCardOne: React.FC = ({ + blogs, + carouselMode = "buttons", uniformGridCustomHeightClasses = "min-h-95 2xl:min-h-105", animationType = "slide-up", title, + titleSegments, + description, + tag, + tagAnimation, + buttons, + buttonAnimation, + textboxLayout = "default", useInvertedBackground = false, + ariaLabel = "Blog section", className = "", containerClassName = "", cardClassName = "", imageWrapperClassName = "", imageClassName = "", categoryClassName = "", cardTitleClassName = "", excerptClassName = "", authorContainerClassName = "", authorAvatarClassName = "", authorNameClassName = "", dateClassName = "", textBoxTitleClassName = "", textBoxTitleImageWrapperClassName = "", textBoxTitleImageClassName = "", textBoxDescriptionClassName = "", gridClassName = "", carouselClassName = "", controlsClassName = "", textBoxClassName = "", textBoxTagClassName = "", textBoxButtonContainerClassName = "", textBoxButtonClassName = "", textBoxButtonTextClassName = ""}) => { + const [currentIndex, setCurrentIndex] = useState(0); + const shouldCarousel = blogs.length > 4; + const mode = shouldCarousel ? "buttons" : "auto"; -const BlogCardItem = memo(({ - blog, - shouldUseLightText, - cardClassName = "", - imageWrapperClassName = "", - imageClassName = "", - categoryClassName = "", - cardTitleClassName = "", - excerptClassName = "", - authorContainerClassName = "", - authorAvatarClassName = "", - authorNameClassName = "", - dateClassName = "", -}: BlogCardItemProps) => { - return ( -
-
- {blog.imageAlt - -
+ const cardStackProps: Omit = { + gridVariant: "uniform-all-items-equal", uniformGridCustomHeightClasses, + animationType: animationType as CardAnimationType, + carouselMode: mode, + carouselThreshold: 4, + currentIndex: shouldCarousel ? currentIndex : undefined, + onCarouselChange: shouldCarousel ? setCurrentIndex : undefined, + ariaLabel, + className, + containerClassName, + cardClassName, + gridClassName, + carouselClassName, + controlsClassName, + }; -
-
- + const blogCards = blogs.map((blog) => ( +
+
+ {blog.imageAlt + +
-

- {blog.title} -

+
+ + {blog.category} + -

- {blog.excerpt} -

-
+

+ {blog.title} +

-
- {blog.authorName} -
-

- {blog.authorName} -

-

- {blog.date} -

-
-
-
-
- ); -}); +

+ {blog.excerpt} +

-BlogCardItem.displayName = "BlogCardItem"; +
+ {blog.authorName} +
+

+ {blog.authorName} +

+

+ {blog.date} +

+
+
+ + + )); -const BlogCardOne = ({ - blogs = [], - carouselMode = "buttons", - uniformGridCustomHeightClasses, - animationType, - title, - titleSegments, - description, - tag, - tagIcon, - tagAnimation, - buttons, - buttonAnimation, - textboxLayout, - useInvertedBackground, - ariaLabel = "Blog section", - className = "", - containerClassName = "", - cardClassName = "", - imageWrapperClassName = "", - imageClassName = "", - categoryClassName = "", - cardTitleClassName = "", - excerptClassName = "", - authorContainerClassName = "", - authorAvatarClassName = "", - authorNameClassName = "", - dateClassName = "", - textBoxTitleClassName = "", - textBoxTitleImageWrapperClassName = "", - textBoxTitleImageClassName = "", - textBoxDescriptionClassName = "", - gridClassName = "", - carouselClassName = "", - controlsClassName = "", - textBoxClassName = "", - textBoxTagClassName = "", - textBoxButtonContainerClassName = "", - textBoxButtonClassName = "", - textBoxButtonTextClassName = "", -}: BlogCardOneProps) => { - const theme = useTheme(); - const shouldUseLightText = shouldUseInvertedText(useInvertedBackground, theme.cardStyle); - - return ( - + {title && ( +
+ - {blogs.map((blog) => ( - - ))} + /> +
+ )} + +
+ + {blogCards} - ); +
+ + ); }; -BlogCardOne.displayName = "BlogCardOne"; - export default BlogCardOne; -- 2.49.1 From 0a13433a6275ef92cd8e7000877d754102466302 Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 11 Mar 2026 20:27:12 +0000 Subject: [PATCH 2/3] Update src/components/sections/blog/BlogCardThree.tsx --- .../sections/blog/BlogCardThree.tsx | 425 +++++++----------- 1 file changed, 166 insertions(+), 259 deletions(-) diff --git a/src/components/sections/blog/BlogCardThree.tsx b/src/components/sections/blog/BlogCardThree.tsx index 9e1f326..499398e 100644 --- a/src/components/sections/blog/BlogCardThree.tsx +++ b/src/components/sections/blog/BlogCardThree.tsx @@ -1,288 +1,195 @@ "use client"; -import { memo } from "react"; -import Image from "next/image"; -import CardStack from "@/components/cardStack/CardStack"; -import Tag from "@/components/shared/Tag"; -import MediaContent from "@/components/shared/MediaContent"; -import OverlayArrowButton from "@/components/shared/OverlayArrowButton"; -import { cls, shouldUseInvertedText } from "@/lib/utils"; -import { useTheme } from "@/providers/themeProvider/ThemeProvider"; -import type { BlogPost } from "@/lib/api/blog"; -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, { useState } from "react"; +import { ChevronLeft, ChevronRight, ArrowRight } from "lucide-react"; +import TextBox from "@/components/Textbox"; +import { CardStack } from "@/components/card/CardStack"; +import type { CardStackProps } from "@/components/card/CardStack"; +import type { CardAnimationType } from "@/components/card/types"; -type BlogCard = BlogPost; - -interface BlogCardThreeProps { - blogs: BlogCard[]; - carouselMode?: "auto" | "buttons"; - uniformGridCustomHeightClasses?: string; - animationType: CardAnimationType; +export interface BlogCardThreeProps { + blogs: Array<{ + id: string; + category: string; 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; - cardContentClassName?: string; - categoryTagClassName?: string; - cardTitleClassName?: string; - excerptClassName?: string; - authorContainerClassName?: string; - authorAvatarClassName?: string; - authorNameClassName?: string; - dateClassName?: string; - mediaWrapperClassName?: string; - mediaClassName?: 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; + excerpt: string; + imageSrc: string; + imageAlt?: string; + authorName: string; + authorAvatar: string; + date: string; + onBlogClick?: () => void; + }>; + carouselMode?: "auto" | "buttons"; + 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; + imageWrapperClassName?: string; + imageClassName?: string; + categoryClassName?: string; + cardTitleClassName?: string; + excerptClassName?: string; + authorContainerClassName?: string; + authorAvatarClassName?: string; + authorNameClassName?: string; + dateClassName?: 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 BlogCardItemProps { - blog: BlogCard; - useInvertedBackground: boolean; - cardClassName?: string; - cardContentClassName?: string; - categoryTagClassName?: string; - cardTitleClassName?: string; - excerptClassName?: string; - authorContainerClassName?: string; - authorAvatarClassName?: string; - authorNameClassName?: string; - dateClassName?: string; - mediaWrapperClassName?: string; - mediaClassName?: string; -} +const BlogCardThree: React.FC = ({ + blogs, + carouselMode = "buttons", uniformGridCustomHeightClasses = "min-h-95 2xl:min-h-105", animationType = "slide-up", title, + titleSegments, + description, + tag, + tagAnimation, + buttons, + buttonAnimation, + textboxLayout = "default", useInvertedBackground = false, + ariaLabel = "Blog section", className = "", containerClassName = "", cardClassName = "", imageWrapperClassName = "", imageClassName = "", categoryClassName = "", cardTitleClassName = "", excerptClassName = "", authorContainerClassName = "", authorAvatarClassName = "", authorNameClassName = "", dateClassName = "", textBoxTitleClassName = "", textBoxTitleImageWrapperClassName = "", textBoxTitleImageClassName = "", textBoxDescriptionClassName = "", gridClassName = "", carouselClassName = "", controlsClassName = "", textBoxClassName = "", textBoxTagClassName = "", textBoxButtonContainerClassName = "", textBoxButtonClassName = "", textBoxButtonTextClassName = ""}) => { + const [currentIndex, setCurrentIndex] = useState(0); + const shouldCarousel = blogs.length > 4; + const mode = shouldCarousel ? "buttons" : "auto"; -const BlogCardItem = memo(({ - blog, - useInvertedBackground, - cardClassName = "", - cardContentClassName = "", - categoryTagClassName = "", - cardTitleClassName = "", - excerptClassName = "", - authorContainerClassName = "", - authorAvatarClassName = "", - authorNameClassName = "", - dateClassName = "", - mediaWrapperClassName = "", - mediaClassName = "", -}: BlogCardItemProps) => { - const theme = useTheme(); - const shouldUseLightText = shouldUseInvertedText(useInvertedBackground, theme.cardStyle); + const cardStackProps: Omit = { + gridVariant: "uniform-all-items-equal", uniformGridCustomHeightClasses, + animationType: animationType as CardAnimationType, + carouselMode: mode, + carouselThreshold: 4, + currentIndex: shouldCarousel ? currentIndex : undefined, + onCarouselChange: shouldCarousel ? setCurrentIndex : undefined, + ariaLabel, + className, + containerClassName, + cardClassName, + gridClassName, + carouselClassName, + controlsClassName, + }; - return ( -
-
- + const blogCards = blogs.map((blog) => ( +
+
+ {blog.imageAlt + +
-

- {blog.title} -

+
+ + {blog.category} + -

- {blog.excerpt} -

+

+ {blog.title} +

- {(blog.authorName || blog.date) && ( -
- {blog.authorAvatar && ( - {blog.authorName - )} - {blog.authorAvatar ? ( -
- {blog.authorName && ( -

- {blog.authorName} -

- )} - {blog.date && ( -

- {blog.date} -

- )} -
- ) : ( - <> - {blog.authorName && ( -

- {blog.authorName} -

- )} - {blog.date && ( -

- {blog.date} -

- )} - - )} -
- )} -
+

+ {blog.excerpt} +

-
- - -
-
- ); -}); +
+ {blog.authorName} +
+

+ {blog.authorName} +

+

+ {blog.date} +

+
+
+ + + )); -BlogCardItem.displayName = "BlogCardItem"; - -const BlogCardThree = ({ - blogs = [], - carouselMode = "buttons", - uniformGridCustomHeightClasses = "min-h-none", - animationType, - title, - titleSegments, - description, - tag, - tagIcon, - tagAnimation, - buttons, - buttonAnimation, - textboxLayout, - useInvertedBackground, - ariaLabel = "Blog section", - className = "", - containerClassName = "", - cardClassName = "", - cardContentClassName = "", - categoryTagClassName = "", - cardTitleClassName = "", - excerptClassName = "", - authorContainerClassName = "", - authorAvatarClassName = "", - authorNameClassName = "", - dateClassName = "", - mediaWrapperClassName = "", - mediaClassName = "", - textBoxTitleClassName = "", - textBoxTitleImageWrapperClassName = "", - textBoxTitleImageClassName = "", - textBoxDescriptionClassName = "", - gridClassName = "", - carouselClassName = "", - controlsClassName = "", - textBoxClassName = "", - textBoxTagClassName = "", - textBoxButtonContainerClassName = "", - textBoxButtonClassName = "", - textBoxButtonTextClassName = "", -}: BlogCardThreeProps) => { - return ( - + {title && ( +
+ - {blogs.map((blog) => ( - - ))} + /> +
+ )} + +
+ + {blogCards} - ); +
+ + ); }; -BlogCardThree.displayName = "BlogCardThree"; - export default BlogCardThree; -- 2.49.1 From 02691a00200d59a417455eec5f911d3cb727a13a Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 11 Mar 2026 20:27:12 +0000 Subject: [PATCH 3/3] Update src/components/sections/blog/BlogCardTwo.tsx --- src/components/sections/blog/BlogCardTwo.tsx | 378 ++++++++----------- 1 file changed, 166 insertions(+), 212 deletions(-) diff --git a/src/components/sections/blog/BlogCardTwo.tsx b/src/components/sections/blog/BlogCardTwo.tsx index c0b3f30..0e2f656 100644 --- a/src/components/sections/blog/BlogCardTwo.tsx +++ b/src/components/sections/blog/BlogCardTwo.tsx @@ -1,241 +1,195 @@ "use client"; -import { memo } from "react"; -import Image from "next/image"; -import CardStack from "@/components/cardStack/CardStack"; -import Badge from "@/components/shared/Badge"; -import OverlayArrowButton from "@/components/shared/OverlayArrowButton"; -import { cls, shouldUseInvertedText } from "@/lib/utils"; -import { useTheme } from "@/providers/themeProvider/ThemeProvider"; -import type { BlogPost } from "@/lib/api/blog"; -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, { useState } from "react"; +import { ChevronLeft, ChevronRight, ArrowRight } from "lucide-react"; +import TextBox from "@/components/Textbox"; +import { CardStack } from "@/components/card/CardStack"; +import type { CardStackProps } from "@/components/card/CardStack"; +import type { CardAnimationType } from "@/components/card/types"; -type BlogCard = Omit & { - category: string | string[]; -}; - -interface BlogCardTwoProps { - blogs: BlogCard[]; - carouselMode?: "auto" | "buttons"; - uniformGridCustomHeightClasses?: string; - animationType: CardAnimationType; +export interface BlogCardTwoProps { + blogs: Array<{ + id: string; + category: string; 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; - imageWrapperClassName?: string; - imageClassName?: string; - authorAvatarClassName?: string; - authorDateClassName?: string; - cardTitleClassName?: string; - excerptClassName?: string; - categoryClassName?: 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; + excerpt: string; + imageSrc: string; + imageAlt?: string; + authorName: string; + authorAvatar: string; + date: string; + onBlogClick?: () => void; + }>; + carouselMode?: "auto" | "buttons"; + 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; + imageWrapperClassName?: string; + imageClassName?: string; + categoryClassName?: string; + cardTitleClassName?: string; + excerptClassName?: string; + authorContainerClassName?: string; + authorAvatarClassName?: string; + authorNameClassName?: string; + dateClassName?: 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 BlogCardItemProps { - blog: BlogCard; - shouldUseLightText: boolean; - cardClassName?: string; - imageWrapperClassName?: string; - imageClassName?: string; - authorAvatarClassName?: string; - authorDateClassName?: string; - cardTitleClassName?: string; - excerptClassName?: string; - categoryClassName?: string; -} +const BlogCardTwo: React.FC = ({ + blogs, + carouselMode = "buttons", uniformGridCustomHeightClasses = "min-h-95 2xl:min-h-105", animationType = "slide-up", title, + titleSegments, + description, + tag, + tagAnimation, + buttons, + buttonAnimation, + textboxLayout = "default", useInvertedBackground = false, + ariaLabel = "Blog section", className = "", containerClassName = "", cardClassName = "", imageWrapperClassName = "", imageClassName = "", categoryClassName = "", cardTitleClassName = "", excerptClassName = "", authorContainerClassName = "", authorAvatarClassName = "", authorNameClassName = "", dateClassName = "", textBoxTitleClassName = "", textBoxTitleImageWrapperClassName = "", textBoxTitleImageClassName = "", textBoxDescriptionClassName = "", gridClassName = "", carouselClassName = "", controlsClassName = "", textBoxClassName = "", textBoxTagClassName = "", textBoxButtonContainerClassName = "", textBoxButtonClassName = "", textBoxButtonTextClassName = ""}) => { + const [currentIndex, setCurrentIndex] = useState(0); + const shouldCarousel = blogs.length > 4; + const mode = shouldCarousel ? "buttons" : "auto"; -const BlogCardItem = memo(({ - blog, - shouldUseLightText, - cardClassName = "", - imageWrapperClassName = "", - imageClassName = "", - authorAvatarClassName = "", - authorDateClassName = "", - cardTitleClassName = "", - excerptClassName = "", - categoryClassName = "", -}: BlogCardItemProps) => { - return ( -
-
- {blog.imageAlt - -
+ const cardStackProps: Omit = { + gridVariant: "uniform-all-items-equal", uniformGridCustomHeightClasses, + animationType: animationType as CardAnimationType, + carouselMode: mode, + carouselThreshold: 4, + currentIndex: shouldCarousel ? currentIndex : undefined, + onCarouselChange: shouldCarousel ? setCurrentIndex : undefined, + ariaLabel, + className, + containerClassName, + cardClassName, + gridClassName, + carouselClassName, + controlsClassName, + }; -
-
-
- {blog.authorAvatar && ( - {blog.authorName} - )} -

- {blog.authorName} • {blog.date} -

-
+ const blogCards = blogs.map((blog) => ( +
+
+ {blog.imageAlt + +
-

- {blog.title} -

+
+ + {blog.category} + -

- {blog.excerpt} -

-
+

+ {blog.title} +

-
- {Array.isArray(blog.category) ? ( - blog.category.map((cat, index) => ( - - )) - ) : ( - - )} -
-
-
- ); -}); +

+ {blog.excerpt} +

-BlogCardItem.displayName = "BlogCardItem"; +
+ {blog.authorName} +
+

+ {blog.authorName} +

+

+ {blog.date} +

+
+
+ + + )); -const BlogCardTwo = ({ - blogs = [], - carouselMode = "buttons", - uniformGridCustomHeightClasses, - animationType, - title, - titleSegments, - description, - tag, - tagIcon, - tagAnimation, - buttons, - buttonAnimation, - textboxLayout, - useInvertedBackground, - ariaLabel = "Blog section", - className = "", - containerClassName = "", - cardClassName = "", - imageWrapperClassName = "", - imageClassName = "", - authorAvatarClassName = "", - authorDateClassName = "", - cardTitleClassName = "", - excerptClassName = "", - categoryClassName = "", - textBoxTitleClassName = "", - textBoxTitleImageWrapperClassName = "", - textBoxTitleImageClassName = "", - textBoxDescriptionClassName = "", - gridClassName = "", - carouselClassName = "", - controlsClassName = "", - textBoxClassName = "", - textBoxTagClassName = "", - textBoxButtonContainerClassName = "", - textBoxButtonClassName = "", - textBoxButtonTextClassName = "", -}: BlogCardTwoProps) => { - const theme = useTheme(); - const shouldUseLightText = shouldUseInvertedText(useInvertedBackground, theme.cardStyle); - - return ( - + {title && ( +
+ - {blogs.map((blog) => ( - - ))} + /> +
+ )} + +
+ + {blogCards} - ); +
+ + ); }; -BlogCardTwo.displayName = "BlogCardTwo"; - export default BlogCardTwo; -- 2.49.1