Date: 23 October 2026.
The previous site (UIKit, IBM Plex Mono, a photo gallery) was discarded. Nothing from its CSS, markup, or layout was copied. The prototypes below were written as standalone HTML so the three directions could be compared before any production component existed.
Fetched in the browser, then used as references for structure rather than as templates:
No screenshot of those sites was traced. The three prototypes are original compositions.
Static prototypes live in docs/design-prototypes/. Screenshots:
| Direction | Desktop | Phone |
|---|---|---|
| A — Editorial proof | docs/design/a-editorial-1280.png |
docs/design/a-editorial-390.png |
| B — Swiss index | docs/design/b-swiss-1280.png |
docs/design/b-swiss-390.png |
| C — Cinematic chapters | docs/design/c-cinematic-1280.png |
docs/design/c-cinematic-390.png |
A. Editorial proof. Warm paper, Fraunces headlines, Source Serif body, a mono kicker, one rust action, and an index of work as rows. It reads. The risk is that cream paper plus Fraunces is a common portfolio costume.
B. Swiss index. Near-white field, one grotesque (Schibsted Grotesk), a numbered vertical spine, hairline rules, and a single red square. It is disciplined and a little cold for a person whose public work is explanation.
C. Cinematic chapters. Full-viewport dark chapters, Cormorant italic, brass labels, and an empty plate where a portrait would go. It needs photographs Ryan has not supplied. Without them it becomes a dark film page, which is the look this brief asked to avoid.
A hybrid, not a copy of A.
The production palette is in app/globals.css. Radius is 0. There are no shadows, gradients, glass panels, or glow. The square in the spine is a stamp, not a decoration repeated on every card. Work is an index of rows, not a card grid.
| Role | Value |
|---|---|
| Paper | #efeae0 |
| Paper, secondary | #e4ddd0 |
| Ink | #17241c |
| Ink, soft | #24352c |
| Muted | #4d5a52 (about 6.04:1 on paper) |
| Stamp | #9f2d1a (about 6.11:1 on paper, and as the inverse button) |
| Stamp ink | #f6f1e6 |
| Radius | 0 |
| Measure | 66ch |
| Page | 72rem |
| Space | 0.25, 0.5, 0.75, 1, 1.5, 2, 3, 4, 6 rem |
Type, self-hosted Latin woff2 subsets via next/font/local:
System stacks sit behind each family if a subset fails to load.
line-height: 0.96, slight negative tracking). Body stays at 1.0625rem / 1.5.data-label.document.body, with the rest of the shell inert, Escape to close, and focus moved to Close.:focus-visible only.cursor: not-allowed.The only motion is a short color/underline change and smooth anchor scrolling. @media (prefers-reduced-motion: reduce) sets scroll behavior to auto and collapses animations and transitions. The site is usable with that media query, and with CSS disabled the HTML is still a document: headings, links, and forms.
No stock photography and no fake screenshots. There is no portrait. Project pages link to the repository instead of inventing a picture. The social image is generated type (app/opengraph-image.tsx), using Fraunces only, with no glyph outside that font.
| Width | Behavior |
|---|---|
| below 48rem | Facts stack. Mast and footer padding tighten. Menu button. |
| 48rem and up | Inline nav. Two-column home split. Footer in four columns. |
| below 64rem | Index tables stack. |
| 68rem and up | Vertical spine. |