Ports the "Technical Editorial" design sample into real TSX wired to Payload globals/collections. Home/About/Projects (list+detail)/Contact pages render against Payload data. Expands schemas (Home principles, About timeline/skills/gear, Contact channels) to cover the full design surface. Adds seed script that populates realistic AI-drafted content for first boot. Defers writing/resume routes per scope cut. - Design tokens: Material-3 palette + Space Grotesk/Inter typography scale + dot-grid + glassmorphism utilities - Shared layout: Nav, Footer, StatusTerminal, GridOverlay, Button, TechChip in src/components/site - Schemas: expand 5 globals + 6 collections; add auto-slug hook - Seed: scripts/seed.ts — idempotent upsert for media, categories, 6 projects, 8 gear, 3 posts, 5 globals; generates placeholder admin - Contact: form + /api/contact route with optional Turnstile verify - Rename TURNSTILE_SITE_KEY -> NEXT_PUBLIC_TURNSTILE_SITE_KEY (client) - Remove dead src/components/SiteHeader|SiteFooter|StatusTerminal
36 lines
891 B
TypeScript
36 lines
891 B
TypeScript
import { notFound } from "next/navigation";
|
|
|
|
type Params = { slug: string };
|
|
|
|
export async function generateMetadata({
|
|
params,
|
|
}: {
|
|
params: Promise<Params>;
|
|
}) {
|
|
const { slug } = await params;
|
|
return { title: slug };
|
|
}
|
|
|
|
export default async function PostDetailPage({
|
|
params,
|
|
}: {
|
|
params: Promise<Params>;
|
|
}) {
|
|
const { slug } = await params;
|
|
if (!slug) notFound();
|
|
|
|
return (
|
|
<article className="mx-auto max-w-3xl px-6 py-24">
|
|
<span className="mb-4 block font-label text-xs uppercase tracking-[0.4em] text-secondary">
|
|
POST //{" "}
|
|
<code className="text-on-surface-variant">{slug}</code>
|
|
</span>
|
|
<h1 className="display-sm mb-6 text-on-surface">Post detail</h1>
|
|
<p className="body-md">
|
|
Body renders from Payload{" "}
|
|
<code className="font-label text-primary">posts</code> once wired.
|
|
</p>
|
|
</article>
|
|
);
|
|
}
|