Foundations
The Catalyst design language
Every token below is defined once in src/styles.css and consumed everywhere. Components never hardcode color, radius, shadow or timing.
Typography
Poppins for display and UI. One family, tight tracking on headings, generous leading on body.
Display XL
text-5xl sm:text-6xl font-semibold tracking-tightHero statementsDisplay L
text-4xl font-semibold tracking-tightSection headingsHeading
text-2xl font-semibold tracking-tightPage titlesSubheading
text-lg font-semiboldCard titlesBody
text-base leading-relaxedParagraphsSmall
text-sm text-muted-foregroundSecondary textEyebrow
text-[11px] uppercase tracking-[0.28em] text-muted-foregroundSection labelsColor
Midnight navy canvas, spectrum accent (blue → violet → teal). All values are OKLCH and theme-aware.
background
--backgroundsurface
--surfacesurface-2
--surface-2primary
--primaryviolet
--violetteal
--tealamber
--amberdestructive
--destructivemuted-foreground
--muted-foregroundforeground
--foregroundSpectrum gradient
--gradient-spectrumVeil (ambient wash)
--gradient-veilSpacing & grid
4px base unit. Layout uses a 12-column grid, max width 1280px, 24px gutters (16px on mobile).
p-1p-2p-3p-4p-6p-8p-12p-20p-28–4412-column grid · content max-w-7xl · section rhythm py-28 → py-36
Elevation, radius & glass
Depth is expressed with soft, wide shadows and a spectrum glow reserved for primary moments.
Flat — level 0/1
Inline content, list rows
Raised — level 2/3
Cards, popovers, sheets
Floating — level 4
Primary CTA, AI insight
sm
12px
md
16px
lg
20px
xl
24px
2xl
28px
3xl
36px
full
pill
Glass recipe
background: color-mix(in oklab, var(--surface) 55%, transparent); backdrop-filter: blur(18px); border: 1px solid oklch(1 0 0 / 8%);
Motion
Motion explains change; it never decorates. Entrances ease out, exits ease in, nothing bounces.
100msState flips: checkbox, toggle200msHover, focus, button press300msCard lift, dropdown, tooltip600msPanel and drawer transitions900msScroll reveals, hero choreography- Entrance easing: cubic-bezier(0.16, 1, 0.3, 1)
- Standard easing: cubic-bezier(0.4, 0, 0.2, 1)
- Scroll reveals: 28px rise + fade, staggered 100ms
- Ambient loops (drift, float, spin) run 7–40s and never compete with content
- All motion collapses under prefers-reduced-motion
Dark & light mode
Dark is the default canvas. Light mode keeps the identical spectrum accent on a near-white surface.
Toggle the theme in the header — every token remaps, no component changes.
Accessibility rules
- Body text meets WCAG AA (4.5:1); large display text meets 3:1 in both modes.
- Never use color alone — status is always color + label (and icon where possible).
- Focus is always visible: 2px ring in
--ringwith a background offset. - Tap targets are at least 44×44px; icon buttons carry an aria-label.
- One
<main>per screen, one h1, no skipped heading levels. - Live regions announce AI activity and completion states.
- Every flow is completable with keyboard only; modals trap and restore focus.