Skip to content
VibeTheory

Design system

Every token and component, rendered live with the active brand theme and color mode. Switch them here to preview; sites set their brand once in site.config.ts.

Color mode

Semantic colors

Roles, not values. Components only use these; brand themes re-point them at different primitives. Values below are resolved live for the current theme and mode.

Surfaces

Backgrounds that hold content. Each has a matching foreground for text on it.

  • Aa
    --background--foreground

    The page.

    …

  • Aa
    --card--card-foreground

    Raised containers: cards, list rows.

    …

  • Aa
    --popover--popover-foreground

    Floating layers: menus, selects, dialogs, toasts.

    …

  • Aa
    --muted--muted-foreground

    Quiet fills: tab lists, table footers, empty states.

    …

Actions

Things people press. Primary is the one main action per view.

  • Aa
    --primary--primary-foreground

    Main buttons, checked controls, links, progress.

    …

  • Aa
    --secondary--secondary-foreground

    Secondary buttons and less prominent fills.

    …

  • Aa
    --accent--accent-foreground

    Hover and highlight states for ghost/outline items.

    …

Feedback

Meaning, always paired with an icon or text, never color alone.

  • Aa
    --destructive--destructive-foreground

    Errors and irreversible actions.

    …

  • Aa
    --success--success-foreground

    Completed or valid states.

    …

Lines & focus

Structure and keyboard focus.

  • --border

    Decorative dividers and container edges.

    …

  • --input

    Form control edges (3:1 against the page).

    …

  • --ring

    Focus indicator (3:1 against the page).

    …

  • --overlay

    Scrim behind dialogs.

    …

Charts

Series colors meet 3:1 against cards and the page. Lines also differ by dash and marker.

  • --chart-1

    Series 1

    …

  • --chart-2

    Series 2

    …

  • --chart-3

    Series 3

    …

  • --chart-4

    Series 4

    …

  • --chart-5

    Series 5

    …

  • --chart-grid

    Grid lines and axis lines.

    …

  • --chart-axis

    Axis labels (text contrast).

    …

  • Aa
    --chart-tooltip--chart-tooltip-foreground

    Tooltip surface.

    …

Status

Project lifecycle states used by StatusBadge.

  • Aa
    --status-idea--status-idea-foreground

    Idea

    …

  • Aa
    --status-building--status-building-foreground

    Building

    …

  • Aa
    --status-testing--status-testing-foreground

    Testing

    …

  • Aa
    --status-retired--status-retired-foreground

    Retired

    …

Contrast

Every text and UI pair, checked against WCAG AA (4.5:1 for text, 3:1 for focus rings, control edges and chart marks) for the active theme and mode. npm run lint runs the same check for every theme in both modes and fails on any miss.

Calculating contrast…

Primitive palette

Raw colors with generic names (--palette-hue-step). Never used directly by components; brand themes may add their own primitives in their theme file.

neutral
50
100
200
300
400
500
600
700
800
900
950
red
50
100
200
300
400
500
600
700
800
900
950
orange
50
100
200
300
400
500
600
700
800
900
950
amber
50
100
200
300
400
500
600
700
800
900
950
green
50
100
200
300
400
500
600
700
800
900
950
teal
50
100
200
300
400
500
600
700
800
900
950
blue
50
100
200
300
400
500
600
700
800
900
950
violet
50
100
200
300
400
500
600
700
800
900
950
pink
50
100
200
300
400
500
600
700
800
900
950

Typography

Font roles and the type scale, in rem.

  • font-sans · --font-body

    Sphinx of black quartz, judge my vow

    Body copy and UI.

  • font-heading · --font-display

    Sphinx of black quartz, judge my vow

    Headings (with --heading-weight and --heading-tracking).

  • font-mono · --font-code

    Sphinx of black quartz, judge my vow

    Code, numbers in tables.

  • text-xs · --type-size-xs

    The quick brown fox

  • text-sm · --type-size-sm

    The quick brown fox

  • text-base · --type-size-base

    The quick brown fox

  • text-lg · --type-size-lg

    The quick brown fox

  • text-xl · --type-size-xl

    The quick brown fox

  • text-2xl · --type-size-2xl

    The quick brown fox

  • text-3xl · --type-size-3xl

    The quick brown fox

  • text-4xl · --type-size-4xl

    The quick brown fox

  • text-5xl · --type-size-5xl

    The quick brown fox

Spacing

One base unit (--space-unit); every spacing utility is a multiple. Controls use --control-height, at least the 44 × 44 tap target.

  • 1 × --space-unit
  • 2 × --space-unit
  • 3 × --space-unit
  • 4 × --space-unit
  • 6 × --space-unit
  • 8 × --space-unit
  • 12 × --space-unit
  • 16 × --space-unit
  • tap · --space-tap-target

Shape & elevation

The rounded-* scale derives from a single --radius; themes can set it to 0 for square corners.

  • rounded-xs--radius × 0.25
  • rounded-sm--radius × 0.5
  • rounded-md--radius
  • rounded-lg--radius × 1.5
  • rounded-xl--radius × 2
  • rounded-control--shape-control
  • rounded-surface--shape-surface
  • rounded-pill--shape-pill
  • shadow-control--elevation-control

    Buttons and inputs.

  • shadow-raised--elevation-raised

    Cards.

  • shadow-overlay--elevation-overlay

    Dialogs, menus, toasts.

Motion

  • --motion-fastSmall state changes: hover, press.
  • --motion-baseDefault for transitions.
  • --motion-slowLarger movements: panels, dialogs.

Every transition uses --motion-base and --motion-easing by default. With prefers-reduced-motion: reduce, motion tokens collapse to 0ms and animations are switched off globally. Charts read the same preference in JavaScript.

Components

shadcn/ui components restyled entirely through tokens, plus SegmentedControl, StatusBadge and FileDropzone.

Button

Default and large sizes meet the 44 × 44 tap target. Use small only in dense, pointer-first layouts.

Input, Textarea, Label

Enter an email address like name@example.com.

Checkbox, Radio group, Switch, Select

Plan

Tabs

Default tabs: the active tab is a raised chip.
Line tabs: the active tab is underlined.

Segmented control

Size
With icons
Many options, wrapped in a grid

A radio group: Tab enters it, arrow keys choose. The chosen segment is raised with a border, shadow and bold text, not just a different color.

Slider

120 BPM

Drag, tap the track, or use the arrow keys. The thumb's hit area is 44 × 44.

Card

Weekend experiment
A small idea, tested in public.
Testing
Cards use the surface radius, the raised elevation and the card colors from the active theme.

Dialog and Toast

Badge and StatusBadge

DefaultSecondaryOutlineDestructive
IdeaBuildingTestingRetired

Status names are fixed and generic (idea, building, testing, retired). Themes restyle them through the --status-* tokens; each state also has its own icon.

FileDropzone

Upload files

Drag files here or choose them.
PNG, JPG or PDF · up to 5.0 MB each · max 3 files

UI only: uploads here are simulated. Files over 2 MB fail part-way to show the error state; wrong types and files over 5 MB are rejected before upload.

Charts

Recharts via shadcn's chart component, colored with the chart tokens. Each chart has a written summary and a data table, and series differ by pattern as well as color.

Line chart

Weekly sessions by experimentAll three experiments grow over six weeks. A leads throughout, peaking at 240 in week 5; B closes the gap to 210 by week 6; C roughly doubles from 40 to 104.

Bar chart

Visits and sign-ups by channelSearch brings the most visits (420), but email converts best: 44 sign-ups from 180 visits.