Display
Components that show information rather than take input: labels, status, metrics and notes.
Identity and labels
Colour is kept for small things: badges, status dots and icons.
Why
Of 1,248 visible elements on a live Linear screen only 10.3% carried any chroma, and 89% of those were ≤20px. Colour lives in icons, status dots and small badges — that is the whole list.
Status
Every status has a word as well as a colour.
Why
Every status carries a word as well as a colour, so it survives greyscale, forced-colors, and the ~8% of men with a colour vision deficiency.
Persistence
Shows whether an edit has saved. “Saved” fades after a few seconds.
Why
idle renders an empty live region rather than nothing — a region has to exist before its content changes, or it is not announced. `saved` fades after ~3s, because a permanent “Saved” is indistinguishable from a stuck one.
Connection
A banner for a problem that won't clear by itself. It stays until the connection is back.
Why
A banner, not a toast — a toast implies the condition passes on its own, and this one does not. It is sticky at the top of the scroll container and stays until the connection returns. Rendered here with `offline` forced; left to itself it follows the browser, which reports whether a network interface exists rather than whether Lenz can be reached.
Metrics
A ring for progress inside a row, a gauge for a larger figure.
Why
Ring is glyph-sized, for a row; Gauge is the same idea at 37px. Both draw their arc from --pct in the stylesheet, so the component passes a number and never geometry. Values and deltas use tabular numerals so a changing number does not shift the row beside it.
Navigation and progress
Notes
Info, warning and error, each readable on its own tint.
Why
All three semantic variants clear AA on their own tint (4.69–5.09:1), which hand-picked alert colours usually do not.