Pills

Selectable chips for quick, visible filtering.

v1.0.0·Updated Jul 8, 2026 · 10:45
Live Demo — Fully Interactive
Pick one — like a filter tab row
Configuration
Selection
Size
Count
State
Label
Active
<Pill role="radio" selected>Active</Pill>
Behavior — The Engineering Contract
Prop / eventTypeNotes
value / onChangestring | string[]Selected pill(s); controlled
multiplebooleanCheckbox semantics with a leading check
countnumberTrailing match count in muted mono
disabledbooleanUnselectable
← / → · SpaceMove within the group; Space toggles

Pills select and filter, and hold their state. For a read-only label use a Tag; for a status use a Badge; for switching whole views use Tabs.

Anatomy
Active24
1CheckShown on selected multi-select pills.
2LabelThe filter's name; warm when selected.
3CountOptional number of matching items.
Do's and Don'ts
✓ Do
AllActiveDraft

Keep one option always selected in a single-select filter row.

✕ Don't
AllActiveDraft

Don't light every pill. If all are on, none is filtering.

✓ Do
React

Add a check to multi-select pills so on-versus-off is unmistakable.

✕ Don't
read-only

Don't use a pill for a static label. That is a Tag, and it isn't clickable.

In context: Examples
A · List filter
All147Open24Done112

Filter a list by status, each pill showing its match count.

B · Tag picker
DesignEngDocs

Multi-select topics or tags when assigning or filtering.

C · Quick range
DayWeekMonth

A compact time-range switch above a chart.

Measurements & Tokens
TokenValueRole
--pill-pad6px 13pxChip padding
--pill-bg#16171BResting fill
--pill-border#2A2A30Resting border
--pill-on-fillrgba(255,122,0,.14)Selected tint
--pill-on-text#FF9D45Selected label + check
--pill-radius999pxFully rounded
Code
<div class="o-pills" role="radiogroup" aria-label="Status">
  <button class="o-pill is-on" role="radio" aria-checked="true">All</button>
  <button class="o-pill" role="radio" aria-checked="false">Active</button>
  <button class="o-pill" role="radio" aria-checked="false">
    Draft <span class="o-pill__count">8</span>
  </button>
</div>