/** * Individual Blog Post Page * * Renders MDX content with series navigation */ import { notFound } from 'next/navigation' import Link from 'next/link' import { MDXRemote } from 'next-mdx-remote/rsc' import { getPost, getSeries, getPostsBySeries, getSeriesNavigation, getAllPosts } from '@/lib/mdx/blog' import { mdxComponents } from '../../../../documentatie/components/mdx-components' interface PostPageProps { params: Promise<{ serieId: string; slug: string }> } export async function generateStaticParams() { const posts = await getAllPosts() return posts.map((post) => ({ serieId: post.seriesId, slug: post.slug, })) } export async function generateMetadata({ params }: PostPageProps) { const { serieId, slug } = await params const post = await getPost(serieId, slug) const series = await getSeries(serieId) if (!post || !series) { return { title: 'Post niet gevonden' } } return { title: `${post.frontmatter.title} - ${series.title}`, description: post.frontmatter.description, openGraph: { title: post.frontmatter.title, description: post.frontmatter.description, type: 'article', publishedTime: post.frontmatter.date, }, } } export default async function PostPage({ params }: PostPageProps) { const { serieId, slug } = await params const post = await getPost(serieId, slug) const series = await getSeries(serieId) if (!post || !series) { notFound() } const navigation = await getSeriesNavigation(serieId, slug) const { frontmatter, content, readingTime } = post const colorStyles = { teal: { badge: 'bg-teal-100 text-teal-700 border-teal-200', link: 'text-teal-600 hover:text-teal-700', }, amber: { badge: 'bg-amber-100 text-amber-700 border-amber-200', link: 'text-amber-600 hover:text-amber-700', }, slate: { badge: 'bg-slate-100 text-slate-700 border-slate-200', link: 'text-slate-600 hover:text-slate-700', }, } const styles = colorStyles[series.color] || colorStyles.slate return (
{/* Back link */}
Terug naar {series.title}
{/* Header */}
{/* Series badge */}
{series.title} Deel {navigation.current} van {navigation.total}
{/* Title */}

{frontmatter.title}

{/* Description */}

{frontmatter.description}

{/* Meta */}
{readingTime} min leestijd
{/* Tags */} {frontmatter.tags && frontmatter.tags.length > 0 && (
{frontmatter.tags.map((tag) => ( {tag} ))}
)}
{/* MDX Content */}
{/* Series Navigation */} {/* Back to overview */}
) }