+ {title} +
+ + + ++ {description} +
+ + + {tags && tags.length > 0 && !isCompact && ( +diff --git a/src/components/BlogCard.astro b/src/components/BlogCard.astro
new file mode 100644
index 0000000..b5cdf09
--- /dev/null
+++ b/src/components/BlogCard.astro
@@ -0,0 +1,148 @@
+---
+import { Image } from 'astro:assets';
+import type { ImageMetadata } from 'astro';
+import FormattedDate from './FormattedDate.astro';
+
+interface Props {
+ title: string;
+ description: string;
+ pubDate: Date;
+ heroImage?: ImageMetadata;
+ category?: string;
+ tags?: string[];
+ href: string;
+ variant?: 'default' | 'compact' | 'featured';
+ class?: string;
+}
+
+const {
+ title,
+ description,
+ pubDate,
+ heroImage,
+ category,
+ tags,
+ href,
+ variant = 'default',
+ class: className = '',
+} = Astro.props;
+
+// Compute estimated read time (rough estimate: 200 words per minute)
+// For now, we'll show a placeholder since we don't have word count in frontmatter
+const readTime = '5 min read';
+
+const isCompact = variant === 'compact';
+const isFeatured = variant === 'featured';
+---
+
+
+ {description}
+
+ {title}
+
+
+
+
+