Rost
← All components
component

Badge

A small status marker: a coloured dot on its own, or an outlined label. The colour sits in the dot and the outline, never in the text.

In codeContract: stableGuidance: agreedContract on GitHubFigma 139:395
Draft
default · small
label
default · medium
Overdue
negative · small
label
negative · medium
Paid
positive · small
label
positive · medium
Due soon
warning · small
label
warning · medium

When to use

  • Marking the status of something in a list, a card or a table row: Paid, Overdue, Draft.
  • Small when there's no room for words, or the status is obvious from where it sits. Just the coloured dot.

When not to use

  • Telling people something about the whole page. That's InlineBanner.
  • Describing what something is about rather than its status. That's Tag.
  • Anything clickable. Badge doesn't do hover or focus, Chip does.

Behaviour

Two sizes now. Small is only the dot, 24 by 24, coloured by status. Medium is the label with an outline, and status changes only the outline (non-interactive/background/<status>/light). The text stays non-interactive/foreground/tertiary whatever the status, on purpose: I keep badges quiet. There's no background fill either. My first Badge in akount.ing got exactly that wrong. The dot in front of the label is optional now (showIcon), and off unless you ask for it.

Accessibility

  • Element: a <span>. Nothing to click, nothing to focus.
  • Name: on Medium, the label. On Small there is no text, so pass aria-label and it becomes the dot's alt text.
  • Keyboard: none. It isn't interactive.
  • Colour: the colour alone isn't enough. On Medium the text says the status. On Small there's no text, so give it an aria-label ("Overdue") or put the status in words right next to it.
  • Dot: aria-hidden="true" when there's a label next to it.

Content

One or two words. Sentence case, no punctuation.

Props

PropTypeValuesDefault
statusenumDefault · Negative · Positive · WarningDefault
sizeenumMedium · SmallMedium
labelslot
showIconbooleanfalse
iconslot

Where it's used

Values

Straight from the contract. Each value sits next to its token, because six tokens here all come out as #3a3a3a and the colour alone can't tell you which one is right.

Never changes

PartPropertyValueToken
rootdisplayinline-flexlayout
rootvertical-alignmiddlelayout
rootpositionrelativelayout
rootmin-width24pxspacing/size/small

Changes by variant

icon.align-items4
status=Default, size=Mediumcenterlayout
status=Negative, size=Mediumcenterlayout
status=Positive, size=Mediumcenterlayout
status=Warning, size=Mediumcenterlayout
icon.display4
status=Default, size=Mediumflexlayout
status=Negative, size=Mediumflexlayout
status=Positive, size=Mediumflexlayout
status=Warning, size=Mediumflexlayout
icon.flex-shrink4
status=Default, size=Medium0layout
status=Negative, size=Medium0layout
status=Positive, size=Medium0layout
status=Warning, size=Medium0layout
icon.padding-top4
status=Default, size=Medium2pxspacing/gap/3xsmall
status=Negative, size=Medium2pxspacing/gap/3xsmall
status=Positive, size=Medium2pxspacing/gap/3xsmall
status=Warning, size=Medium2pxspacing/gap/3xsmall
icon.position4
status=Default, size=Mediumrelativelayout
status=Negative, size=Mediumrelativelayout
status=Positive, size=Mediumrelativelayout
status=Warning, size=Mediumrelativelayout
icons-dot.flex-shrink4
status=Default, size=Medium0layout
status=Negative, size=Medium0layout
status=Positive, size=Medium0layout
status=Warning, size=Medium0layout
icons-dot.height4
status=Default, size=Medium16pxspacing/size/2xsmall
status=Negative, size=Medium16pxspacing/size/2xsmall
status=Positive, size=Medium16pxspacing/size/2xsmall
status=Warning, size=Medium16pxspacing/size/2xsmall
icons-dot.position4
status=Default, size=Mediumrelativelayout
status=Negative, size=Mediumrelativelayout
status=Positive, size=Mediumrelativelayout
status=Warning, size=Mediumrelativelayout
icons-dot.width4
status=Default, size=Medium16pxspacing/size/2xsmall
status=Negative, size=Medium16pxspacing/size/2xsmall
status=Positive, size=Medium16pxspacing/size/2xsmall
status=Warning, size=Medium16pxspacing/size/2xsmall
label.color4
status=Default, size=Medium#999non-interactive/foreground/tertiary
status=Negative, size=Medium#999non-interactive/foreground/tertiary
status=Positive, size=Medium#999non-interactive/foreground/tertiary
status=Warning, size=Medium#999non-interactive/foreground/tertiary
label.flex-shrink4
status=Default, size=Medium0layout
status=Negative, size=Medium0layout
status=Positive, size=Medium0layout
status=Warning, size=Medium0layout
label.font-family4
status=Default, size=Medium'General Sans Variable'font-family/base
status=Negative, size=Medium'General Sans Variable'font-family/base
status=Positive, size=Medium'General Sans Variable'font-family/base
status=Warning, size=Medium'General Sans Variable'font-family/base
label.font-size4
status=Default, size=Medium12pxtypography/label/font-size
status=Negative, size=Medium12pxtypography/label/font-size
status=Positive, size=Medium12pxtypography/label/font-size
status=Warning, size=Medium12pxtypography/label/font-size
label.font-weight4
status=Default, size=Medium500typography/label/font-weight/medium
status=Negative, size=Medium500typography/label/font-weight/medium
status=Positive, size=Medium500typography/label/font-weight/medium
status=Warning, size=Medium500typography/label/font-weight/medium
label.letter-spacing4
status=Default, size=Medium0pxtypography/label/letter-spacing
status=Negative, size=Medium0pxtypography/label/letter-spacing
status=Positive, size=Medium0pxtypography/label/letter-spacing
status=Warning, size=Medium0pxtypography/label/letter-spacing
label.line-height4
status=Default, size=Medium14pxtypography/label/line-height
status=Negative, size=Medium14pxtypography/label/line-height
status=Positive, size=Medium14pxtypography/label/line-height
status=Warning, size=Medium14pxtypography/label/line-height
label.position4
status=Default, size=Mediumrelativelayout
status=Negative, size=Mediumrelativelayout
status=Positive, size=Mediumrelativelayout
status=Warning, size=Mediumrelativelayout
label.text-align4
status=Default, size=Mediumcenterlayout
status=Negative, size=Mediumcenterlayout
status=Positive, size=Mediumcenterlayout
status=Warning, size=Mediumcenterlayout
label.white-space4
status=Default, size=Mediumnowraplayout
status=Negative, size=Mediumnowraplayout
status=Positive, size=Mediumnowraplayout
status=Warning, size=Mediumnowraplayout
outline.border-color4
status=Default, size=Medium#3a3a3anon-interactive/foreground/quadruple
status=Negative, size=Medium#48050cnon-interactive/background/negative/light
status=Positive, size=Medium#004c19non-interactive/background/positive/light
status=Warning, size=Medium#492604non-interactive/background/warning/light
outline.border-radius4
status=Default, size=Medium10000pxspacing/radius/full
status=Negative, size=Medium10000pxspacing/radius/full
status=Positive, size=Medium10000pxspacing/radius/full
status=Warning, size=Medium10000pxspacing/radius/full
outline.border-sides4
status=Default, size=Mediumalllayout
status=Negative, size=Mediumalllayout
status=Positive, size=Mediumalllayout
status=Warning, size=Mediumalllayout
outline.inset4
status=Default, size=Medium0layout
status=Negative, size=Medium0layout
status=Positive, size=Medium0layout
status=Warning, size=Medium0layout
outline.opacity4
status=Default, size=Medium1opacity/solid
status=Negative, size=Medium1opacity/solid
status=Positive, size=Medium1opacity/solid
status=Warning, size=Medium1opacity/solid
outline.position4
status=Default, size=Mediumabsolutelayout
status=Negative, size=Mediumabsolutelayout
status=Positive, size=Mediumabsolutelayout
status=Warning, size=Mediumabsolutelayout
root.align-items4
status=Default, size=Mediumcenterlayout
status=Negative, size=Mediumcenterlayout
status=Positive, size=Mediumcenterlayout
status=Warning, size=Mediumcenterlayout
root.border-radius4
status=Default, size=Medium10000pxspacing/radius/full
status=Negative, size=Medium10000pxspacing/radius/full
status=Positive, size=Medium10000pxspacing/radius/full
status=Warning, size=Medium10000pxspacing/radius/full
root.gap4
status=Default, size=Medium2pxspacing/gap/3xsmall
status=Negative, size=Medium2pxspacing/gap/3xsmall
status=Positive, size=Medium2pxspacing/gap/3xsmall
status=Warning, size=Medium2pxspacing/gap/3xsmall
root.height8
status=Default, size=Small24pxspacing/size/small
status=Negative, size=Small24pxspacing/size/small
status=Positive, size=Small24pxspacing/size/small
status=Warning, size=Small24pxspacing/size/small
status=Default, size=Medium24pxspacing/size/small
status=Negative, size=Medium24pxspacing/size/small
status=Positive, size=Medium24pxspacing/size/small
status=Warning, size=Medium24pxspacing/size/small
root.justify-content4
status=Default, size=Mediumcenterlayout
status=Negative, size=Mediumcenterlayout
status=Positive, size=Mediumcenterlayout
status=Warning, size=Mediumcenterlayout
root.padding-bottom4
status=Default, size=Medium2pxspacing/gap/3xsmall
status=Negative, size=Medium2pxspacing/gap/3xsmall
status=Positive, size=Medium2pxspacing/gap/3xsmall
status=Warning, size=Medium2pxspacing/gap/3xsmall
root.padding-left4
status=Default, size=Medium8pxspacing/gap/small
status=Negative, size=Medium8pxspacing/gap/small
status=Positive, size=Medium8pxspacing/gap/small
status=Warning, size=Medium8pxspacing/gap/small
root.padding-right4
status=Default, size=Medium8pxspacing/gap/small
status=Negative, size=Medium8pxspacing/gap/small
status=Positive, size=Medium8pxspacing/gap/small
status=Warning, size=Medium8pxspacing/gap/small
root.padding-top4
status=Default, size=Medium0pxspacing/gap/none
status=Negative, size=Medium0pxspacing/gap/none
status=Positive, size=Medium0pxspacing/gap/none
status=Warning, size=Medium0pxspacing/gap/none
root.width4
status=Default, size=Small24pxspacing/size/small
status=Negative, size=Small24pxspacing/size/small
status=Positive, size=Small24pxspacing/size/small
status=Warning, size=Small24pxspacing/size/small