- `category` is a plain, site-local string — never a fixed union. Pass a `categories` config with `{ value, label, colorClassName }` for badge/pill styling, or omit it entirely and the component auto-derives title-cased labels.
- `category` is optional per post — no badge renders when it's absent.
- `imageSrc`/`imageAlt` give a real photo on the card and detail header; `emoji` is a lighter-weight decorative fallback when there's no photo. Neither is required.
- `readTime` is auto-computed from word count (~200wpm) via `estimateReadTime()` when omitted — set it explicitly only when a site wants an editorial override.
- `showFeatured` renders a hero card for one post: an explicit `featuredPostId`, else the newest post flagged `featured: true`, else the newest post overall.
- Cards only link out when `postBasePath` is set — omit it to render an unlinked teaser (e.g. a homepage preview with no dedicated blog section yet).
- The content grammar (`## heading`, `> quote`, `- list`, fenced ``` code blocks, inline `code`/`[link](url)`/`**bold**`) lives entirely inside `BlogPostDetail.tsx` — same self-contained-renderer approach as `EventsNewsDetail.tsx`, not a shared `lib/` markdown utility.
- `subscribeCta` (list) and `cta` (detail) are both fully optional call-outs — a site without a newsletter or a sales CTA simply omits the prop.
- `getRelatedBlogPosts(posts, currentSlug, limit?)` picks the newest other posts, excluding the current slug — pass its result as `relatedPosts` rather than re-implementing the pick logic per site.
- For a post detail page's Previous/Next navigation, compute both neighbors with `getAdjacentBlogPosts(posts, currentSlug, postBasePath)` (exported from `BlogSection.tsx`) and pass the result straight to `BlogPostDetail`'s `previous`/`next` props — do not reimplement chronological-adjacency logic per site. Either side renders nothing when there's no neighbor; distinct from `relatedPosts` (topical, same-category picks) rather than a replacement for it — both can render together.
- `highlightOnHome?: boolean` on `BlogPostEntry` flags a post for the shared homepage highlight card — see the "Homepage highlight" example above and the Home Highlight pattern page for the full contract.
- SEO (`SEOHead`/`StructuredData` — `CollectionPage` for the list, `BlogPosting` for a post) and prerender route generation stay page-level, same as every other pattern.
- Component: `template/src/components/patterns/BlogSection.tsx` + `BlogPostDetail.tsx`