All design decisions live as CSS custom properties in site.css. Templates inherit everything and override only what's layout-specific (3 values). Toggle dark mode above to verify all tokens respond.
Each layer inherits tokens from above and overrides only what it needs
--radius: 10px · --max-w: 1440px · local --ease: 0.22sAlways use semantic tokens. Legacy aliases exist for backward compat only — do not use in new code.
Surfaces
Text
Accent
Borders
Chips, Forms & Status
Montserrat for all display/UI text. Open Sans for reading. h1–h5 now have defined default sizes via the type scale — template-specific overrides are valid where layouts demand it.
--text-3xl: clamp(32px, 5vw, 56px) · weight 800 · ls -0.02em · lh 1.1
--text-2xl: clamp(28px, 4vw, 44px) · weight 800 · ls -0.01em · lh 1.2
--text-xl: clamp(22px, 3vw, 32px) · weight 700 · lh 1.25
--text-lg: clamp(18px, 2vw, 22px) · weight 700 · lh 1.3
--text-md: 16px · weight 600 · lh 1.4
12px · weight 700 · uppercase · ls 0.12em · --accent → .section-label
--text-md: 16px (site) / --text-base: 15px (templates) · --text-body · lh 1.7
13–14px · --text-muted · lh 1.7
6-step spacing scale, 4-step radius scale, 4 named easing curves — all tokenised in site.css.
Spacing scale
Radius scale — 4 steps only
--radius: 10px — a value between sm and md used for their card components. Use var(--radius) inside template CSS, and --radius-sm/md/lg/full for all other contexts.
Easing — 4 named curves
All components consume design tokens. Toggle dark mode at the top — everything should respond.
Triggered by html.fn-dark (floating-nav settings panel) or OS preference. All tokens have dark counterparts. WCAG AA on all text.