PageContentService loads documents from wwwroot/data/pages with a simple memory cache for template demos.
Blog posts and case studies live in nested folders keyed by slug, matching dynamic routes /blog/{Slug} and /case-studies/{Slug}.
Keep section components dumb: they receive models from code-behind that call IPageContentService.
When integrating a CMS, map API DTOs to FeatureCard, BlogPostSummary, and CaseStudyDetail without changing Razor markup.
Invalidate cache entries on webhook publish events if you retain the in-process cache for performance.