Design system
Warm editorial, hard shadows.
One theme for the homepage, résumé, docs and blog. Every value below is rendered from the real tokens in tokens.css, so this page can never drift from the site. Flip the theme toggle to check dark.
01 Principles
Minimal
Few colours, one idea per section. If it doesn't help the reader, remove it.
Warm & tactile
Cream paper, dotted grain, ink borders and hard offset shadows instead of blur.
A little playful
The chrome has personality (the face, the glasses). The content stays direct.
Influences: Radix and Tailwind (colour scales), Material and Primer (token tiers), Carbon (type scale), Polaris (spacing and docs), neo-brutalism (hard shadows).
02 Colour
Brand
--lensTeal from the logo. Tags, timeline dots, progress bar.--orangeOrange from the logo. Link underlines, highlights, hover blobs.--accentRust. Primary hover, emphasis, blockquote rules.--tealEyebrows, kickers, secondary labels (text-safe).Surface & text
--bgPage. Cream in light, warm near-black in dark.--cardRaised surfaces: cards, chips, buttons.--fgText and all strong borders and rules.--mutedSecondary text, metadata, captions.--lineHairlines and dividers.--hiMarker-pen underlay behind key words.Status
--ok--warn--danger--infoScales (primitives)
Each hue has 12 steps, generated in OKLCH by scripts/gen-scales.mjs. Step roles follow Radix: 1–2 backgrounds, 3–5 components, 6–8 borders, 9–10 solid fills, 11–12 text. Steps 11 and 12 are searched until they pass contrast (APCA Lc 60 / 90 and WCAG 4.5 / 7) on the page background, in each theme.
123456789101112123456789101112123456789101112123456789101112Rule: use roles (var(--accent)), never raw hex. Roles remap per theme; hex doesn't. Teal and orange #00ADB5 / #FF7F11 come from the logo.
03 Typography
Fraunces for headings, Inter for body, JetBrains Mono for code. Scale is roughly ×1.25.
04 Space, radius, borders
Space (4px base)
--space-1--space-2--space-3--space-4--space-5--space-6--space-8--space-10--space-12--space-16Radius
xs6pxsm8pxmd10pxlg12pxxl14pxpill∞pxBorder widths
thin1px · dividersbase1.5px · cards, tagsthick2px · rules, buttons05 Elevation & motion
No blur. Light theme: depth is a hard offset shadow in warm ink (--shadow = sand-12, never pure black). Dark theme: black vanishes on near-black, so the offset becomes a low-contrast rust (rust-6) and raised cards also get a lighter surface (--card-raised), the way Material lifts surfaces in dark mode. Interactive cards lift by --lift; buttons lift 1px and press back flat on click.
--shadow-1Small controls--shadow-2Cards on hover--shadow-3Hero imagery--dur-fast .15s hover, press--dur-base .3s badges, fades--dur-slow .5s decorativeEverything that moves must stop under prefers-reduced-motion.
06 Components
Buttons
Cards
Interactive card
Hover me: lifts up-left and gains a hard shadow.
Static card
Same border, radius and padding, no hover effect.
Tags & chips
- Docker
- Linked chip
- Homelab
Quote
Minimalism and simplicity are the best tools to communicate ideas.
Links, highlight, code
Body text with a link (orange underline in docs), a highlighted phrase, and inline code.
services:
caddy:
image: caddy:latest
restart: unless-stopped07 Using it
- Add a colour or size: edit
src/styles/tokens.cssonly. Pages andtheme.csspick it up. - New component: build it from tokens (
var(--card-border),var(--radius-lg),var(--space-4)), no raw px, hex or ms. - Check: both themes, 375px width, and reduced motion.
- Docs and blog:
theme.cssmaps these tokens onto Starlight's--sl-*variables.