Overview
Pages are MDX entries under content/pages
. Each page includes SEO, a title, optional subtitle, and a sections list (Header, Text, Image). These pages render at the site root via the dynamic [slug]
route.
Location and slug
- Collection: page
- Path:
content/pages
- Filename: editable; generated from title by slugify (lowercase, trimmed).
Use unique slugs. Avoid reserved paths used by other routes (e.g. blog
, docs
, roadmap
, changelog
, dashboard
, auth
).
Fields
- seo — shared SEO object (title, description ≤ 160 chars, Open Graph, article meta).
- title — required.
- subtitle — optional.
- sections — list of content blocks (Header, Text, Image).
Sections and templates
Available templates for pages:
- Header —
variant
(Primary/Secondary) andtext
. - Text — rich text
content
. - Image — image fields plus optional
source { title, url }
.
The editor shows friendly labels via getSectionLabel
to make blocks easy to identify.
Single page route
generateStaticParams()
lists page slugs from the Tina connection for SSG.generateMetadata()
mapspage.seo
withgenerateSeoMetadata()
andpathname: <slug>
.- The page component renders:
- PageHeader (title, subtitle)
- PageSections (maps section types to UI templates)
PageSections mapping
The renderer maps Tina section types to UI components:
PageSectionsHeader
→HeaderTemplate
PageSectionsText
→TextTemplate
PageSectionsImage
→ImageTemplate
Unknown templates are ignored gracefully.
SEO and sitemap
- Page-level SEO comes from the page’s seo object.
- The sitemap service reads pages from the Tina connection and uses
seo.openGraph.updatedTime
forlastModified
when available. home
orindex
is emitted as/
in the sitemap.
Guidelines
- Keep titles short; slugs are generated from the title.
- Use Primary header for main sections and Secondary for subheads.
- Add image
source
info when relevant. - Update
seo.openGraph.updatedTime
when you make edits.