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

@@ -0,0 +1,60 @@
# Site Components — Contract for Page Subagents
## Imports
```ts
import { Nav, Footer, StatusTerminal, GridOverlay, Button, TechChip } from "@/components/site";
```
## Rules
- **Do NOT** redefine `<Nav>` or `<Footer>` in page files. They are wired in `src/app/(frontend)/layout.tsx`.
- `<StatusTerminal>` reads `NEXT_PUBLIC_BUILD_SHA` and `NEXT_PUBLIC_BUILD_REV` at build time. Accept `location` and `status` props to override defaults.
- `<GridOverlay>` is `position: absolute` — wrap parent in `relative overflow-hidden`.
## Color Token Classes
| Token | Tailwind class |
|---|---|
| Background | `bg-background` |
| Primary accent | `text-primary`, `bg-primary` |
| Secondary | `text-secondary` |
| Tertiary (terminal green) | `text-tertiary` |
| Surface base | `bg-surface-container` |
| Surface low | `bg-surface-container-low` |
| Surface high | `bg-surface-container-high` |
| Surface highest | `bg-surface-container-highest` |
| Surface lowest | `bg-surface-container-lowest` |
| Underscore aliases | `bg-surface_container_high`, `text-on_surface`, `text-outline_variant` |
| Text default | `text-on-surface` |
| Text muted | `text-on-surface-variant` |
| Border ghost | `border-outline-variant/15` |
## Typography Utility Classes
| Class | Usage |
|---|---|
| `.display-lg` | Hero headline (H1) |
| `.display-md` | Sub-hero or section hero |
| `.display-sm` | Large section titles |
| `.headline-lg` | Section headings (H2) |
| `.title-lg` | Card / module titles (H3) |
| `.body-lg` | Primary body copy |
| `.body-md` | Secondary / card body |
| `.label-md` | ALL CAPS metadata labels |
| `.label-sm` | Tiny ALL CAPS technical labels, chips |
## Button Variants
```tsx
<Button variant="primary">CTA Label</Button>
<Button variant="secondary">Secondary</Button>
<Button variant="ghost">Ghost</Button>
```
## Design Rules (from DESIGN.md)
- No `border-1 solid` at 100% opacity. Use `border-outline-variant/15` or tonal shifts.
- No `rounded-full` on cards. Use `rounded-md` (0.375rem) or `rounded-sm`.
- No drop shadows on cards sitting on `bg-background`. Use `bg-surface-container-high` lift.
- Glass surfaces: add class `glass` (backdrop-blur-24px + semi-transparent surface_bright).