DocsComponents
Badge
Status and labels, never interactive.
PublishedDraftFully booked17:30
Verified organiser
- 1Pill: radius 9999 px, 1 px border, padding 2 × 8 px
- 2Optional icon 12 px, gap 4 px
- 3Label: Inter 12 / 600, one line
- 4Not a control: no hover, no focus, no click
Variants
Four variants, one shape. Each variant has a meaning, so the same status always looks the same across the product.
Published
Draft
Fully booked
17:30
On white and on the page background
PublishedDraftFully booked17:30
States
A badge has no interactive states: it is a label, not a control. What changes is the content and the variant, chosen by the status it shows.
Published Paused Draft Coming soon
API reference
A plain span with a data-variant attribute; the text comes from the app’s translations.
| Prop | Type | Default | Description |
|---|---|---|---|
variant | "secondary" | "outline" | "inverted" | "default" | "secondary" | Colour set; shape and size are the same in every variant. |
children | text, optional 12 px icon | – | Content of the badge; the icon comes from the app. |
className | string | – | Extra classes, e.g. position on a card. |
Accessibility
- A span without a role: screen readers read the text in place, as part of the card or row.
- Not focusable and not clickable. The design-system audit leaves badges out of the rule that every control needs a visible border, because they are not controls.
- The status lives in the text, not only in the colour.
- Contrast: secondary 16.3:1, outline 18.3:1 on the page background, inverted 14.2:1, default 20.2:1.
Do and don’t
Swimming for beginnersPublished
Sport ✕ Art ✕