Cedar contrast pass: before / after

Every small status label, muted text, and focus indicator on the dashboard now meets WCAG AA contrast. Same layout, same brand palette; only the color grades changed. All screenshots on this page were captured from the real running app on each side of the change.

branch contrast-focus-a11y commits 746af87b + 4d24de58 WCAG 2.1 AA July 2, 2026

The screen at a glance

At full size the change is quiet, which is the point: the dashboard keeps its calm. The differences live in the details below.

Before
Dashboard before the contrast pass
After
Dashboard after the contrast pass

The details

Each ratio is measured against the surface the element actually sits on. Small text needs 4.5:1; focus rings, selection rings, and informational icons need 3:1.

Meeting URL input, focused

minimum 3:1
Before success at 20% opacity — 1.21:1
Meeting URL input, focused, before
After solid brand ring — 6.74:1
Meeting URL input, focused, after

Primary button, keyboard focus

minimum 3:1
Before no Cedar style, browser default outline
Primary button, keyboard focus, before
After two-layer ring: white gap + brand, holds on light and dark
Primary button, keyboard focus, after

Timeline “Now” label, 11px

minimum 4.5:1
Before success — 2.54:1
Timeline “Now” label, 11px, before
After success-strong — 5.48:1
Timeline “Now” label, 11px, after

Selected “Get started” card ring

minimum 3:1
Before brand at 60% opacity — 2.85:1
Selected “Get started” card ring, before
After solid brand — 6.74:1
Selected “Get started” card ring, after

Setup progress percentage

minimum 4.5:1
Before success — 2.54:1
Setup progress percentage, before
After success-strong — 5.48:1
Setup progress percentage, after

Next-step arrow

minimum 3:1
Before success — 2.54:1
Next-step arrow, before
After success-strong — 5.48:1
Next-step arrow, after

Token changes

Two new tokens, one value nudge. The pass/fail colors on this page are the new tokens themselves. Base success and destructive are unchanged and still own fills, tints, and large shapes.

TokenValueUsed forWorst-case contrast
--color-success-strong (new) #047857 Small success text and icons on light surfaces 2.31:14.99:1
--color-destructive-strong (new) #b91c1c Small error text on light surfaces 3.76:15.97:1
--color-muted-foreground-light #6b7280#646c7a Muted text on canvas and gray badges 4.39:14.81:1
inactive icons border-lightmuted-foreground-light “Cedar won’t join” sprout, no-notes icon 1.47:15.54:1
focus rings (13 components) 7 alpha recipesbrand-primary Inputs, rows, toggles, icon buttons 1.13–1.94:16.74:1

The focus standard, in one place

/* Light surfaces: inputs use focus:, buttons and rows use focus-visible: */
ring-2 ring-brand-primary

/* Filled buttons (.btn-primary / .btn-secondary), which sit on light AND dark pages */
box-shadow: 0 0 0 2px var(--color-surface-light),  /* white gap carries dark pages */
            0 0 0 4px var(--color-brand-primary);  /* brand ring carries light pages */

/* Dark surfaces (Modal, Select) */
ring-2 ring-foreground/70

Left as is, on purpose