Badge

A small chip that labels the state or the category of the thing it sits next to.

import from ~/components/ui/badge

Variants

Featured

variant="default"

Primary categorization: active, featured, selected.

Archived

variant="secondary"

Neutral weight: tags, counts, quiet metadata.

Error

variant="destructive"

Failed, blocked, invalid. Action is required.

Tag

variant="outline"

The quietest option, safe on an unknown surface.

Live

variant="success"

Resolved state: live, published, paid, complete.

Draft

variant="warning"

Pending, in review, expiring. Nothing has failed yet.

Beta

variant="info"

Non-blocking information: new, beta, a version tag.

Sizes

LiveDraftLiveDraft

size

Two steps only. `xs` uppercases and tracks out for dense tables, sidebars and inline indicators.

Standalone status chip

Keystone SiteLive
Ledger rewriteIn review
Nightly exportFailed

status row

One badge per row states the state of the thing on that row. It is the whole meaning of the cell.

Inline in a sentence

The export ran at 02:00 and is currently Live. The replacement pipeline is still Draft and ships behind a Beta flag.

inline

A badge is an inline-flex span, so it sits in a line of text and keeps its baseline.

Rules

Do

Pick the variant by state: success is resolved, warning is pending, destructive failed.
Keep the label to one or two words. A badge is not a sentence.
Use size="xs" inside tables and sidebars where the default crowds the row.
Pair the color with a word — the label carries the meaning, not the hue.

Don't

Do not use a badge as a button; it has no press affordance. Use Button.
Do not use secondary or outline for status — they read as metadata.
Do not put more than one badge on a row; the state stops being obvious.
Do not pass bg- or text- color classes; seven variants is the whole set.