Public Blog
Last updated on 2026-03-22
The public blog is the reader-facing experience. Pages in the (blog) route group share a common layout with BlogHeader (navigation, search, categories, theme toggle) and BlogFooter (links, newsletter, social media). The homepage uses a standalone layout to accommodate its featured hero section.
Homepage
Route: /
The homepage features:
- Featured hero — large featured post card with the
PostHerocomponent - Category tabs — filter posts by category using pill-style toggle buttons
- Post grid — responsive 3-column grid of
PostCardcomponents with staggered fade-in animations - Newsletter form — email signup CTA section
- Empty state — friendly message when no posts match the selected category
import { PostHero } from "@/components/blog/post-hero"
import { PostCard } from "@/components/blog/post-card"
import { CategoryTabs } from "@/components/blog/category-tabs"
import { NewsletterForm } from "@/components/blog/newsletter-form"
Article Detail
Route: /posts/[slug]
Individual article pages include:
- Reading progress — fixed top bar showing scroll progress via
ReadingProgress - Breadcrumbs — Home > Category > Post title navigation
- Category & tag badges — clickable badges linking to category and tag pages
- Author byline — avatar, name (linked to author page), date, and reading time
- Featured image — full-width responsive image with 2:1 aspect ratio
- Post body — rendered article content via
PostBody - TOC sidebar — sticky table of contents on desktop via
PostToc - Share buttons — social sharing links via
ShareButtons - Author card — full author bio card with social links
- Comments — threaded comment list using
CommentCard - Related posts — 3-column grid of related articles
- Prev/next navigation — links to adjacent posts via
PostNavigation
import { ReadingProgress } from "@/components/blog/reading-progress"
import { PostBody } from "@/components/blog/post-body"
import { PostToc } from "@/components/blog/post-toc"
import { ShareButtons } from "@/components/blog/share-buttons"
import { AuthorCard } from "@/components/blog/author-card"
import { PostNavigation } from "@/components/blog/post-navigation"
import { CommentCard } from "@/components/blog/comment-card"
Layout Structure
The article page uses a two-column grid on desktop:
┌─────────────────────────────┬──────────┐
│ Breadcrumbs │ │
│ Category / Tag Badges │ │
│ Title │ TOC │
│ Author Byline │ (sticky) │
│ Featured Image │ │
│ Post Body │ │
│ Share Buttons / Tags │ │
│ Author Card │ │
│ Comments │ │
│ Related Posts │ │
│ Prev/Next Navigation │ │
└─────────────────────────────┴──────────┘
Category Page
Route: /categories/[slug]
Category pages display:
- Breadcrumbs — Home > Category name
- Hero section — category name, description, post count badge, and optional background image with gradient overlay
- Filtered post grid — 3-column responsive grid of posts in the selected category
- Empty state — message when no posts exist in the category
import { PostCard } from "@/components/blog/post-card"
Tag Page
Route: /tags/[slug]
Tag pages display:
- Breadcrumbs — Home > #TagName
- Hero section — tag name with hash icon, post count badge
- Filtered post grid — 3-column responsive grid of posts with the selected tag
- Empty state — message when no posts have the tag
Author Page
Route: /authors/[slug]
Author profile pages include:
- Breadcrumbs — Home > Author name
- Profile hero — large avatar, name, role, bio, and social links (GitHub, Twitter, LinkedIn, website) displayed as icon buttons with tooltips
- Posts grid — 3-column grid of all posts by the author with post count badge
- Empty state — message when the author has no published posts
import { PostCard } from "@/components/blog/post-card"
Search
Route: /search
Full-text search with real-time filtering:
- Search input — with search icon and keyboard shortcut hint (Cmd+K)
- Category checkboxes — sidebar filter panel with category names and post counts
- Real-time results — updates as you type with result count
- Search results — rendered via
SearchResultscomponent with highlighted matches - Popular searches — pill buttons for common terms (React, TypeScript, Next.js, Performance, Design System, AI) shown when no query is active
import { SearchResults } from "@/components/blog/search-results"
Layout Structure
┌─────────────────────────┬──────────────────┐
│ Search Input │ │
│ │ Filter by │
│ Result Count │ category │
│ Search Results Grid │ (checkboxes) │
│ │ │
└─────────────────────────┴──────────────────┘
About
Route: /about
The about page includes:
- Hero section — title, description, and background image with gradient overlay
- Team grid — 2-column grid of
AuthorCardcomponents in full variant showing bio and social links - Our Story — multi-paragraph prose section about the blog's origins and mission
- Newsletter form — email signup CTA
import { AuthorCard } from "@/components/blog/author-card"
import { NewsletterForm } from "@/components/blog/newsletter-form"
Newsletter Archive
Route: /newsletter
The newsletter page features:
- Archive heading — title and description
- Subscribe form —
NewsletterFormcomponent for email signup - Past issues — list of newsletter issues as cards, each showing title, description, recipient count badge, send date, and "Read issue" link
import { NewsletterForm } from "@/components/blog/newsletter-form"
Past issues are sourced from the newsletterIssues array in data/seed.ts and formatted with date-fns.