Dish card
IILifts 4px on hover, border deepens, shadow follows.
Colophon
Every token, specimen, and motion rule the site runs on, laid out in the open. Build one of these for anything you care about.
01
OKLCH throughout. Paper neutrals carry the room, the periwinkle accent carries the buttons, and moss, clay, and gold mark the season notes. The dark theme remaps the same tokens.
02
Fraunces speaks, Inter works. One variable file each, self-hosted, five clamp() steps that scale with the reader's own font size.
Eat what the valley is having.
One field, one river, one fire.
Body text runs at the reading measure cooks use for recipes: long enough to think in, short enough to follow at a counter with flour on your hands.
The eyebrow, smallest voice in the room
03
Three timing curves, one stagger system, and a hard promise: everything collapses to instant states under prefers-reduced-motion.
IntersectionObserver with a 15% threshold and an 8% bottom margin. Children take a --reveal-delay of 80ms per index, capped at 240ms so nothing waits on nothing.
Parallax figures and grow bars ship behind @supports (animation-timeline: view()) and disappear gracefully where the browser says no.
Reveals render in their final state, the marquee slows to a crawl instead of stopping, and the scroll cue goes still. Motion is a preference, not a dependency.
04
The reusable parts, live from the same classes the site uses.
A paper panel wipes across from the left on hover. Disabled buttons sit at 55% opacity with pointer events off.
Small state-bearing chips: superscript dietary marks, season notes with the dot, and the dashed report stamp.
Lifts 4px on hover, border deepens, shadow follows.
05
Every component reads variables, never the theme. Two fonts, no exceptions. Colors carry meaning only through tokens. Motion transforms and opacity only, nothing that costs layout. One accent; gold, moss, and clay are season notes, not decoration. Every control has designed hover, focus, active, loading, empty, and error states before it ships.
The full system lives in assets/css/main.css?v=1.0.2, organized
in cascade layers so a future build can fork the tokens and keep the
bones. That is the point of writing it down.