From dbddc32418d2c7e5a04d1a66c8c2e8e7e26dad7b Mon Sep 17 00:00:00 2001 From: "Builder.io" Date: Tue, 14 Oct 2025 04:54:58 +0000 Subject: [PATCH] Create BlogPostGrid component cgen-811e46c8dfa44cf9900c8b06747da9d7 --- client/components/blog/BlogPostGrid.tsx | 97 +++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 client/components/blog/BlogPostGrid.tsx diff --git a/client/components/blog/BlogPostGrid.tsx b/client/components/blog/BlogPostGrid.tsx new file mode 100644 index 00000000..186319f5 --- /dev/null +++ b/client/components/blog/BlogPostGrid.tsx @@ -0,0 +1,97 @@ +import { Link } from "react-router-dom"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { Calendar, MessageCircle, Share2, ThumbsUp, User } from "lucide-react"; +import type { BlogPost } from "./types"; + +interface BlogPostGridProps { + posts: BlogPost[]; + placeholderImage?: string; + emptyState?: React.ReactNode; +} + +const BlogPostGrid = ({ posts, placeholderImage = "/placeholder.svg", emptyState }: BlogPostGridProps) => { + if (!posts.length) { + return ( +
+ {emptyState || "No posts found. Try adjusting your filters."} +
+ ); + } + + return ( +
+ {posts.map((post, index) => ( + + {post.image ? ( +
+ {post.title} +
+ ) : ( +
+ Placeholder +
+ )} + + +
+ + {post.category || "General"} + + {post.readTime ? ( + {post.readTime} + ) : null} +
+ + + {post.title} + + +

{post.excerpt}

+
+ + +
+ + + {post.author || "AeThex Team"} + + + + {post.date || "Recently"} + +
+ +
+ + + {post.likes?.toLocaleString() ?? 0} + + + + {post.comments?.toLocaleString() ?? 0} + + +
+
+
+ ))} +
+ ); +}; + +export default BlogPostGrid;