Design System

The visual vocabulary behind the site. Every value flows from styles/tokens.css through Tailwind's @theme inline into every component. Toggle the theme in the header to see how tokens shift between light and dark.

Color

Accent — Cool Blue

Hue 260, step 9 anchored at oklch(0.487 0.220 260). Chroma peaks at 0.220 — above sRGB at most steps so wide-gamut P3 displays render the full color; sRGB displays receive a gamut-mapped clamp (step 9 → #0051d8). Dark mode inverts L and uses the same hue.

accent-1oklch(0.99 0.011 260)
accent-2oklch(0.965 0.032 260)
accent-3oklch(0.93 0.053 260)
accent-4oklch(0.885 0.073 260)
accent-5oklch(0.832 0.095 260)
accent-6oklch(0.755 0.126 260)
accent-7oklch(0.67 0.157 260)
accent-8oklch(0.575 0.189 260)
accent-9oklch(0.487 0.220 260)
anchor · primary
accent-10oklch(0.43 0.220 260)
accent-11oklch(0.37 0.197 260)
accent-12oklch(0.275 0.147 260)
deepest text

Gray — Warm

Hue 80, near-neutral with a hint of warmth. Powers surfaces, body text, borders. Dark mode follows shadcn's Neutral lightness anchors (bg 0.145 → muted 0.27).

gray-1oklch(1 0 0)
gray-2oklch(0.98 0.002 80)
gray-3oklch(0.967 0.003 80)
gray-4oklch(0.92 0.004 80)
gray-5oklch(0.88 0.005 80)
gray-6oklch(0.84 0.006 80)
gray-7oklch(0.78 0.008 80)
gray-8oklch(0.68 0.010 80)
gray-9oklch(0.55 0.012 80)
gray-10oklch(0.50 0.012 80)
gray-11oklch(0.55 0.016 80)
gray-12oklch(0.145 0.005 80)

Semantic Tokens

Aliases that map intent (background, accent, border) to scale steps. Components only reference these — never the raw scale — so dark mode and brand retunes propagate automatically.

background→ gray-1 / gray-1 (dark)
foreground→ gray-12 / gray-12 (dark)
card→ gray-2
muted→ gray-3
muted-foreground→ gray-11
accent→ accent-9
accent-foreground→ white
border→ gray-4
ring→ gray-8
selection→ accent-3 / accent-9 35% (dark)

Typography

Font Families

Four families with distinct roles. Geist (sans + mono) handles the bulk; serif and script appear sparingly for personality.

Geist SansBody, UI

The quick brown fox jumps over the lazy dog

Geist MonoCode, technical labels

const accent = oklch(0.487 0.220 260);

Libre BaskervilleItalic emphasis, blockquotes

Invisible details that feel alive.

Meow ScriptPersonal touches (signature)

Zephyr

Line Height

Three rhythms — tight for display, normal for UI, relaxed for long-form prose.

leading-tight1.2
leading-normal1.5
leading-relaxed1.7

Scale

Default Tailwind type scale. Body copy never goes below 14px (text-sm). Page titles are text-[1.1875rem] (19px). Labels and dates use text-xs (12px).

xsAa0.75rem · 12px
smAa0.875rem · 14px
baseAa1rem · 16px
lgAa1.125rem · 18px
xlAa1.25rem · 20px
2xlAa1.5rem · 24px
3xlAa1.875rem · 30px
4xlAa2.25rem · 36px
5xlAa3rem · 48px
6xlAa3.75rem · 60px

Spacing

Scale

Twelve steps from 4px to 96px. Used for padding, margins, and gap-* utilities.

space-1
0.25rem · 4px
space-2
0.5rem · 8px
space-3
0.75rem · 12px
space-4
1rem · 16px
space-5
1.5rem · 24px
space-6
2rem · 32px
space-7
2.5rem · 40px
space-8
3rem · 48px
space-9
3.5rem · 56px
space-10
4rem · 64px
space-11
5rem · 80px
space-12
6rem · 96px

Radius

sm

0.375rem

md

0.5rem

lg

0.75rem

xl

1rem

full

9999px

Shadow

shadow-sm

1px lift

shadow-md

2px + 8px stack

shadow-lg

8px + 24px stack

Shadows are translucent black layers (4-8% in light, 30-50% in dark). They hint at lift without competing with the soft palette.

Motion

Tokens

Durations and line-heights live alongside motion as one rhythm system. Animations only ever transition transform, opacity, or filter — never layout.

duration-fast150ms
duration-normal250ms

Components

Avatar

The brand mark — a layered multi-blob orb rendered entirely in CSS. One source scales fluidly via --avatar-size from a 20px header logo to a 128px feature element, with blur radii proportional to size.

20px
32px
64px
96px
128px
<Avatar size={64} />

Inline Link

Subtle underline that intensifies on hover. Used inside body prose.

I worked at Spatial Topology on indoor mapping, and OfferLand on a student community platform.

Sketchy Underline

Marker-style highlighter using accent-9 with a slight gradient sweep. Use sparingly to call out a single phrase per paragraph.

I care about the invisible details that make interfaces feel alive.

Dim Siblings

On hover within a .dim-siblings group, all non-hovered children fade to 30% opacity (benji.org pattern). Try hovering one of the items below.

  • First item
  • Second item
  • Third item
  • Fourth item