A badge decorates metadata. A status reports a state.
Badges & Status v1 is Irozon's fourth canonical component family —
packages/design-system/src/components/badge.css. Two related shapes,
kept deliberately separate in markup: .iz-badge for compact
metadata/category/count, .iz-status for a meaningful operational
state. They can look similar; they're answering different questions.
.iz-badge.iz-statusQuiet by default.
No attribute needed for the common case — a category label or a count sits neutral unless there's a real reason to color it.
<span class="iz-badge">Beta</span>
<span class="iz-badge">12</span>
Four roles. No arbitrary palette.
neutral / success / warning / error
— the same four tokens already canonical on the
Status Colors page. No Blue, no
Purple, no new brand color introduced for this component.
data-variant="neutral"
data-variant="success"
data-variant="warning"
data-variant="error"
Products map their own states onto these roles
The design system defines four visual roles, not a dictionary of every workflow state a future product might need:
- Running →
success(or neutral, if "in progress" isn't yet a good outcome) - Completed →
success - Pending →
neutral - Paused →
neutralorwarning, depending on why it's paused - Needs review →
warning - Failed →
error
The same roles, with a precise indicator.
.iz-status adds an optional .iz-status__indicator dot —
small, decorative (aria-hidden), never the only signal. The visible
text carries the state; the dot just helps a dense table scan faster.
Motion only when it means something.
data-live="true" is opt-in, reserved for the one state that's
genuinely in progress right now — never applied by default, never on more than one
row at a time in the same view. A restrained opacity pulse on the dot only; no
scale, no glow, no bounce. prefers-reduced-motion: reduce removes it
entirely — the word "Running" already says everything the pulse does.
data-live="true" · role="status"
Do / Don't.
Text first. ARIA only when it earns its place.
role="status" only on a status whose value actually changes while the page is open and should be announced — not on every static badge on the page..iz-status__indicator is always aria-hidden="true" — it's a scanability aid, never the state's only carrier.prefers-reduced-motion: reduce; the state remains fully legible without it.