From bb452c82eee28706c135a77e4d39cc2100fee479 Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 4 Mar 2026 00:29:04 +0000 Subject: [PATCH] Switch to version 1: modified src/components/sections/blog/BlogCardTwo.tsx --- src/components/sections/blog/BlogCardTwo.tsx | 246 ++++++++++++++++++- 1 file changed, 238 insertions(+), 8 deletions(-) diff --git a/src/components/sections/blog/BlogCardTwo.tsx b/src/components/sections/blog/BlogCardTwo.tsx index dbf7600..c0b3f30 100644 --- a/src/components/sections/blog/BlogCardTwo.tsx +++ b/src/components/sections/blog/BlogCardTwo.tsx @@ -1,11 +1,241 @@ -import { useCardAnimation } from '@/components/cardStack/CardStack'; +"use client"; -export function BlogCardTwo() { - const { animate } = useCardAnimation(); +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"; - return ( -
- -
- ); +type BlogCard = Omit & { + category: string | string[]; +}; + +interface BlogCardTwoProps { + blogs: BlogCard[]; + 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; + 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; } + +interface BlogCardItemProps { + blog: BlogCard; + shouldUseLightText: boolean; + cardClassName?: string; + imageWrapperClassName?: string; + imageClassName?: string; + authorAvatarClassName?: string; + authorDateClassName?: string; + cardTitleClassName?: string; + excerptClassName?: string; + categoryClassName?: string; +} + +const BlogCardItem = memo(({ + blog, + shouldUseLightText, + cardClassName = "", + imageWrapperClassName = "", + imageClassName = "", + authorAvatarClassName = "", + authorDateClassName = "", + cardTitleClassName = "", + excerptClassName = "", + categoryClassName = "", +}: BlogCardItemProps) => { + return ( +
+
+ {blog.imageAlt + +
+ +
+
+
+ {blog.authorAvatar && ( + {blog.authorName} + )} +

+ {blog.authorName} • {blog.date} +

+
+ +

+ {blog.title} +

+ +

+ {blog.excerpt} +

+
+ +
+ {Array.isArray(blog.category) ? ( + blog.category.map((cat, index) => ( + + )) + ) : ( + + )} +
+
+
+ ); +}); + +BlogCardItem.displayName = "BlogCardItem"; + +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 ( + + {blogs.map((blog) => ( + + ))} + + ); +}; + +BlogCardTwo.displayName = "BlogCardTwo"; + +export default BlogCardTwo;