How this site is built
This page is a static Astro page — not a Notion page.
It lives at src/pages/contact.astro and demonstrates one of
two ways to add pages to a notro-tail site.
Two types of pages
| Type | Where the content lives | bodyClass set by |
|---|---|---|
| Notion fixed page | Notion database (rendered via NotionMarkdownRenderer) | navPages[].bodyClass in config.ts |
| Static Astro page | This .astro file | <Layout bodyClass="..."> prop directly |
Per-page scoped styles
Both page types share the same styling mechanism: a CSS class on
<body> lets you scope styles in
global.css without affecting other pages.
.page-contact
This page — indigo gradient background, h2 in indigo, links underlined indigo
.page-about
The About Notion page — blue top border on the page, h2 gets a blue left border + tinted background
.page-privacy
The Privacy Notion page — body text is smaller and subdued
Content loading pipeline
- The
loader()fromnotrocalls the Notion Public API and fetches pages as Markdown. - Pages are cached by
last_edited_time; only changed pages are re-fetched on rebuild. - Preprocessed Markdown is stored in the Astro Content Collection store.
- At render time,
NotionMarkdownRendererruns the full remark/rehype plugin pipeline: callouts, toggles, columns, KaTeX math, table of contents, and more. - Notion pre-signed S3 image URLs are cached correctly via a custom Astro image service that strips expiring
X-Amz-*query parameters.