feat(site): port stitch design system + seed-ready content model
Some checks failed
ci/woodpecker/push/web Pipeline failed
ci/woodpecker/pr/web Pipeline failed

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
This commit is contained in:
2026-04-14 18:57:53 -05:00
parent 6db28bc81f
commit 486bbc8cf8
42 changed files with 4184 additions and 397 deletions

View File

@@ -1,6 +1,4 @@
import { notFound } from "next/navigation";
import { SiteHeader } from "@/components/SiteHeader";
import { SiteFooter } from "@/components/SiteFooter";
type Params = { slug: string };
@@ -22,22 +20,16 @@ export default async function PostDetailPage({
if (!slug) notFound();
return (
<>
<SiteHeader />
<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="mb-6 font-headline text-4xl font-bold tracking-tight md:text-6xl">
Post detail
</h1>
<p className="font-body text-lg text-on-surface-variant">
Body renders from Payload{" "}
<code className="font-label text-primary">posts</code> once wired.
</p>
</article>
<SiteFooter />
</>
<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>
);
}