Warm paper, deep ink.
Neutrals do the work. Jade is the only brand color — live, healthy, primary. Semantic colors are categorical, never decorative. Purple belongs to the AI alone.
Five families, strict jobs.
Every swatch below is painted with its token, so this page re-proves itself in both themes. Click any hex to copy it.
An evergreen, not a go-button. Live states, confirmed coverage, the one committing action per surface. was #209F5B
Only where the agent acts: briefings, drafts, the ask bar, the canvas. If it's purple, Cadence did it.
Internal-staff blocks, neutral notices. #2C5BB0
Drift, thresholds, needs your eyes. #9A6717
Unfilled, blockers, compliance trips. #B0392A
EOR, long-term placements, tiers. #5B3F7A
Every color, named, both themes.
Components reference roles, never hex — dark mode is a remapping, not a second system. Click a hex to copy; the whole table lives in tokens.json.
| Token | Role | Light | Dark |
|---|
Three voices, strict jobs.
Schedule · Orchestration
Coverage this week
Auto-match handled 14 of 17 shifts overnight. 3 Friday bartender posts hit your approval threshold — Lisa released them at 7:58am.
Your operation, in rhythm.
8-pt grid (4 / 8 / 12 / 16 / 24 / 32 / 48 / 64) · radii 8 buttons · 14 cards · 20 large · 999 pills · shadows 0 1px 2px ·04 cards / 0 8px 24px ·10 drawers / 0 20px 48px ·16 modals
Inline, stroked, quiet.
No icon library. Inline SVG, 1.8 stroke, round caps, currentColor. 16px in rows and buttons, 20px in headers. The four-point spark belongs to the agent.
One dark bar, everything under it.
Nothing moves unless it means something.
hover, press, chip changes
toggles, segmented control
drawer, popover, modal enter
live dots only — jade or purple LIVE
indeterminate progress
Hover changes color, never position or scale. No bounce, no spring, no confetti — an operator doesn't want a high-five for filling a shift. Entrances fade + 8px rise; exits just fade. One perpetual motion per view. prefers-reduced-motion drops all loops.
Mono for data, Fraunces for drama.
| Kind | Format | Rule |
|---|---|---|
| Money | $24.50/hr · $47.2k | Cents on rates, k-abbreviation above $10k. Never “$24.50 per hour”. |
| Time | 4:00 PM · 4:00–11:00 | No leading zero on hours; en-dash ranges; AM/PM caps. |
| Dates | TUE · MAY 19 | Mono caps in chrome and eyebrows; “Tuesday, May 19” in prose. |
| Ratios | 39/42 · 93% | Ratio first, percent second. Never percent alone when the raw count fits. |
| Big metrics | 42M+ · 97% | Fraunces for hero and stat-tile numbers only — the drama voice, one per tile. |
Calm is also legible.
Every approved text/background pair, with its contrast ratio computed live from the tokens — flip the theme and the table re-proves itself. Use the pairing tool before inventing a new combination.
39/42 · 93% · 4:00–11:00
| Pair | Use | Ratio | Verdict |
|---|
2px jade ring, 2px offset, on every interactive element. Never removed, never opacity-faded. Focus order follows reading order.
Status is a chip with a word, not a bare dot. Charts carry labels and counts. Red without the word “unfilled” is a bug.
Touch targets 44px minimum; table rows 44–48px are the target. prefers-reduced-motion drops every loop — pulses, sweeps, spinners become static.