From 95b1b27ea508f5a275bd63bd1ba096e56ea2b3fb Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 11 Mar 2026 20:09:02 +0000 Subject: [PATCH] Switch to version 3: modified src/components/sections/blog/BlogCardThree.tsx --- .../sections/blog/BlogCardThree.tsx | 337 +++++++++++++++--- 1 file changed, 280 insertions(+), 57 deletions(-) diff --git a/src/components/sections/blog/BlogCardThree.tsx b/src/components/sections/blog/BlogCardThree.tsx index 38c3f76..9e1f326 100644 --- a/src/components/sections/blog/BlogCardThree.tsx +++ b/src/components/sections/blog/BlogCardThree.tsx @@ -1,65 +1,288 @@ -import React from 'react'; -import { CardStack } from '@/components/cardStack/CardStack'; +"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"; + +type BlogCard = BlogPost; interface BlogCardThreeProps { - blogs: Array<{ - id: string; - category: string; + blogs: BlogCard[]; + carouselMode?: "auto" | "buttons"; + uniformGridCustomHeightClasses?: string; + animationType: CardAnimationType; title: string; - excerpt: string; - imageSrc: string; - imageAlt?: string; - authorName: string; - authorAvatar: string; - date: string; - onBlogClick?: () => void; - }>; - 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; + 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; } -const BlogCardThree: React.FC = ({ - blogs, - title, - description, - animationType = 'slide-up', - textboxLayout = 'default', - useInvertedBackground = false, - ...props -}) => { - const blogItems = blogs.map((blog) => ( -
- {blog.imageAlt - {blog.category} -

{blog.title}

-

{blog.excerpt}

-
- {blog.authorName} -
-

{blog.authorName}

-

{blog.date}

-
-
-
- )); +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; +} - return ( - - {blogItems} - - ); +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); + + return ( +
+
+ + +

+ {blog.title} +

+ +

+ {blog.excerpt} +

+ + {(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} +

+ )} + + )} +
+ )} +
+ +
+ + +
+
+ ); +}); + +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 ( + + {blogs.map((blog) => ( + + ))} + + ); }; -export default BlogCardThree; \ No newline at end of file +BlogCardThree.displayName = "BlogCardThree"; + +export default BlogCardThree;