/** * Blog Overview Page * * Landing page with series cards and recent posts */ import Link from 'next/link' import { getAllPosts, getSeriesWithCounts, type BlogSeries } from '@/lib/mdx/blog' export const metadata = { title: 'Blog - AI Speedrun', description: 'Artikelen over AI-gestuurde software ontwikkeling, healthcare IT en het bouwen van een EPD.', openGraph: { title: 'Blog - AI Speedrun', description: 'Artikelen over AI-gestuurde software ontwikkeling, healthcare IT en het bouwen van een EPD.', type: 'website', siteName: 'AI Speedrun', locale: 'nl_NL', }, twitter: { card: 'summary', title: 'Blog - AI Speedrun', description: 'Artikelen over AI-gestuurde software ontwikkeling, healthcare IT en het bouwen van een EPD.', }, alternates: { canonical: `${process.env.NEXT_PUBLIC_APP_URL || 'https://aispeedrun.vercel.app'}/blog`, }, } export default async function BlogPage() { const series = await getSeriesWithCounts() const posts = await getAllPosts() return (
{/* Header */}

Blog

Artikelen over AI-gestuurde ontwikkeling en de reis van het bouwen van een EPD.

{/* Series Section */} {series.length > 0 && (

Series

{series.map((serie) => ( ))}
)} {/* Recent Posts Section */}

Recente Posts

{posts.length === 0 ? (

Nog geen blogposts gepubliceerd.

) : (
{posts.map((post) => (
{post.seriesId.replace('-', ' ')} {post.readingTime} min leestijd

{post.frontmatter.title}

{post.frontmatter.description}

{post.frontmatter.tags && post.frontmatter.tags.length > 0 && (
{post.frontmatter.tags.map((tag) => ( {tag} ))}
)} ))}
)}
) } function SeriesCard({ series }: { series: BlogSeries & { postCount: number } }) { const colorStyles = { teal: { bg: 'bg-teal-50', border: 'border-teal-200 hover:border-teal-400', badge: 'bg-teal-100 text-teal-700', dot: 'bg-teal-500', }, amber: { bg: 'bg-amber-50', border: 'border-amber-200 hover:border-amber-400', badge: 'bg-amber-100 text-amber-700', dot: 'bg-amber-500', }, slate: { bg: 'bg-slate-50', border: 'border-slate-200 hover:border-slate-400', badge: 'bg-slate-100 text-slate-700', dot: 'bg-slate-500', }, } const styles = colorStyles[series.color] || colorStyles.slate const statusLabels = { completed: 'Voltooid', active: 'Actief', planned: 'Gepland', } return (
{statusLabels[series.status]}

{series.title}

{series.description}

{series.postCount} {series.postCount === 1 ? 'deel' : 'delen'}
) }