1 Design Language
David Spitzer edited this page 2026-10-21 13:39:00 -07:00

Design Language

Mirrors docs/design-language.md in the repository. Update both together.

Every screen in the dashboard follows one visual language: the dense view at /, the wallboard at /wall, the classic dashboard at /classic, the admin console, and the sign-in screens.

Sign-in screen

Principles

  1. Healthy is quiet; problems are loud. Normal rows are dim and low-contrast. A problem gets a red tint, a red left edge or a solid red fill, so it is the first thing your eye lands on.
  2. Blue means normal, red means a problem. Those two colors carry all the meaning. Nothing else (green, amber, brand colors) is used for status, which keeps the signal unambiguous and works for most color-blind viewers.
  3. Color is never the only signal. Every state also has a word or a shape: ▪ OK, ▲ WARN, ■ DOWN, OFFLINE, OVERDUE.
  4. Flat and dense. Panels are flat with a 1px hairline border, one corner radius (8px for panels, 4px for buttons, inputs and chips), no gradients, no glow, no blur, no animated backgrounds and no hover movement.
  5. Mono for data, sans for names. Labels, timestamps, chips and numbers use a monospace stack in small uppercase; names and prose use the system UI font.
  6. One primary action per screen. Outline buttons by default, and a single filled accent button for the action that matters (sign in, save settings).

Palette

Token Dark Light Used for
Page #0f141b #f2f5f9 Background
Panel #161d27 #ffffff Cards and panels
Panel (strong) #1c2531 #f6f8fb Inputs, nested panels, hover
Line #263140 #d3dce8 Hairline borders
Text #e6ebf2 #17202b Body text
Muted #8d9bb0 #5d6b80 Secondary text
Faint #7b89a1 n/a Timestamps and group labels (dense view and wallboard)
Accent (blue) #5aa9ff #1f6fd0 Normal state, links, primary button
Problem #ff5964 / #ff3b4a #a12f3a text on #fff0f1 Warnings and outages

Accent presets (Blue, Cyan, Violet, Slate) change the accent only. Red is reserved for problems and is not an accent choice. Older saved preferences for Amber or Rose fall back to Blue.

Contrast

Text colors were measured against WCAG 2.1 (4.5:1 is the AA threshold for small text). Dark theme: body text 14.2:1, muted 6.0:1, faint 4.8:1, blue accent 6.9:1, red 5.5:1, button text on the accent 7.7:1. Light theme: body 16.4:1, muted 5.4:1, blue accent 4.95:1 (and white on it 4.95:1). All four accent presets pass in both themes.

Where the styles live

File Covers
src/App.css Layout and component rules for the classic dashboard and admin, plus the theme tokens (.dashboard, .dashboard--light, the accent presets).
src/theme.css The design-language layer, imported last: compact header, mono chips, outline and primary buttons, inputs, flat panels, admin navigation. Written only in terms of the tokens, so it covers dark and light.
src/dense.css The dense view.
src/wall.css The wallboard, on a fixed 1920 x 1080 canvas.

To change the look of the classic dashboard or admin, change a token in App.css or a rule in theme.css; avoid adding hard-coded colors, gradients or shadows to component rules. After any visible change run npm run build && npm run docs:screenshots and look at the images, including the light theme (dashboard-classic-light.png).

What changed from the original look

The original styling used an animated gradient background, glowing headlines, translucent glass panels with blur, depth shadows, pill-shaped chips, heavy 800 to 950 font weights, per-service brand colors on every card, and green and amber for status. All of those were removed. The "panel depth" slider (glass transparency) was removed because panels are now opaque, and the Amber and Rose accents were replaced by Cyan and Slate.