feat(blog): add the blog index, post pages, RSS and content sitemap
The rendering split is dictated by CI building with no database. /blog, /blog/rss.xml and /content-sitemap.xml have no dynamic params, so Next prerenders them at build time and the build fails on a missing Payload secret — caught here, not on staging. They are force-dynamic instead: one indexed query against Postgres on the same Docker network, and a newly published post appears immediately rather than waiting on a revalidation. /blog/[slug] keeps ISR, because with no generateStaticParams there is nothing to prerender; it is generated on first request and cached, which is exactly what the collection's afterChange hook exists to invalidate. RichText takes `converters`, not `blocks`, in Payload 3.88, and the default converters must be spread or every paragraph and heading loses its renderer and the body comes out empty. BlogPosting references the Person and Organization by @id rather than repeating them, so every post and the About page resolve to one author entity instead of declaring several people with the same name. /sitemap.xml is proxied from FastAPI, which knows nothing about Payload, so the Next-owned URLs get their own sitemap and robots.txt lists both. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017YmbBhr8s7GusjDE12hrZM
This commit is contained in:
1 parent
21a5d18f59
commit
b793640507
15 files changed
+705
-14
No files matched your search
@@ -0,0 +1,21 @@
|
||||
.caveat,
|
||||
.note {
|
||||
border-left: 3px solid var(--brand);
|
||||
background: var(--brand-bg);
|
||||
padding: 1rem 1.15rem;
|
||||
margin: 1.75rem 0;
|
||||
border-radius: 0 8px 8px 0;
|
||||
}
|
||||
|
||||
.note {
|
||||
border-left-color: var(--border-strong);
|
||||
background: var(--bg-secondary);
|
||||
}
|
||||
|
||||
.body {
|
||||
font-family: var(--font-ui);
|
||||
font-size: 0.95rem;
|
||||
line-height: 1.65;
|
||||
color: var(--text-primary);
|
||||
margin: 0;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
import styles from './CalloutBlock.module.css';
|
||||
|
||||
/**
|
||||
* Renders the Callout block from blocks/Callout.ts. The "caveat" tone is the
|
||||
* one that matters: it is how a post says what a number does not show, in
|
||||
* context, rather than burying it in a closing paragraph.
|
||||
*/
|
||||
export function CalloutBlock({ tone, body }: { tone: string; body: string }) {
|
||||
return (
|
||||
<aside className={tone === 'caveat' ? styles.caveat : styles.note}>
|
||||
<p className={styles.body}>{body}</p>
|
||||
</aside>
|
||||
);
|
||||
}
|
||||
Reference in new issue
Block a user