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

@@ -5,6 +5,7 @@ import containerQueries from "@tailwindcss/container-queries";
// Tokens ported verbatim from design-samples/stitch_jasonwoltje.com/*/code.html
// Full token rationale in design-samples/stitch_jasonwoltje.com/silicon_ethos/DESIGN.md
const stitchColors = {
// Core accents
primary: "#81ecff",
"primary-dim": "#00d4ec",
"primary-fixed": "#00e3fd",
@@ -41,9 +42,11 @@ const stitchColors = {
"on-error": "#490006",
"on-error-container": "#ffa8a3",
// Base
background: "#0d0e12",
"on-background": "#f7f5fc",
// Surface stack (hyphenated — existing usage)
surface: "#0d0e12",
"surface-dim": "#0d0e12",
"surface-bright": "#2a2c32",
@@ -63,6 +66,20 @@ const stitchColors = {
outline: "#75757a",
"outline-variant": "#47484d",
// Underscore aliases — for page subagents (matches DESIGN.md token names)
on_surface: "#f7f5fc",
on_primary: "#005762",
outline_variant: "#47484d",
primary_container: "#00e3fd",
inverse_surface: "#faf8ff",
surface_variant: "#24252c",
surface_bright: "#2a2c32",
surface_container_lowest: "#000000",
surface_container_low: "#121318",
surface_container: "#18191e",
surface_container_high: "#1e1f25",
surface_container_highest: "#24252c",
};
const config: Config = {
@@ -81,6 +98,9 @@ const config: Config = {
full: "9999px",
},
fontFamily: {
display: ["Space Grotesk", "sans-serif"],
sans: ["Inter", "sans-serif"],
mono: ["Space Grotesk", "ui-monospace", "monospace"],
headline: ["var(--font-headline)", "Space Grotesk", "sans-serif"],
body: ["var(--font-body)", "Inter", "sans-serif"],
label: ["var(--font-label)", "Space Grotesk", "monospace"],
@@ -90,6 +110,7 @@ const config: Config = {
"0 0 32px 4px rgba(129, 236, 255, 0.25), 0 0 4px 1px rgba(129, 236, 255, 0.5)",
"neon-secondary":
"0 0 32px 4px rgba(216, 115, 255, 0.25), 0 0 4px 1px rgba(216, 115, 255, 0.5)",
"ambient-primary": "0 0 40px 6px rgba(129, 236, 255, 0.06)",
},
backdropBlur: {
"2xl": "24px",