Tag
Preview appears after the next Storybook update.
<Tag>color.action</Tag>When to use
Use it for
- Filter chips above a table or a list: toggle tags in a labelled group.
- Selected values in a multi-select Combobox or a filter bar: removable tags.
- Static metadata: token groups, platforms, component categories.
Not for
- Status (Published, Failed): use Badge.
- Actions: use Button. A tag describes a value; it does not do something.
- Choosing one option out of several: use RadioGroup or Tabs.
Do and don't
Every example is rendered with the real component, so it always matches what ships.
Put filter chips in a named group
role group with aria-label ("Filter by theme") tells screen reader users what the chips control.
Sentences in tags
Tags truncate. Keep them to a value of one to three words.
Accessibility
- Toggle tags are Base UI Toggle buttons with aria-pressed; selected also shows a check icon, so selection is not color alone.
- The remove button is a separate button named "Remove <label>" (removeLabel when the text is not a plain string).
- Both buttons have the focus ring and are reachable with Tab; Enter and Space activate them.
- Static tags are plain text with no role.
Content guidelines
- Values as they appear elsewhere in the product: token paths in lowercase, names in sentence case.
- After removing a tag, move focus to the next tag or back to the input.
From the code Generated from the component, not editable here.
Anatomy and tokens
Read from packages/react/src/components/Tag/Tag.module.css at build time. Every value is a token: open one to see its alias chain in both themes.
- Container
.tag - Size sm
.sm - Signal tone
.signal - Static label
.label, .toggle - Toggle button, focus
.toggle:focus-visible, .remove:focus-visible - toggleable, hover
@media (hover: hover) .toggleable:not([data-disabled]):hover - toggleable
.toggleable:has(.toggle[data-pressed]) - removable
.removable .label, .removable .toggle - Remove button
.remove - Remove button, hover + disabled
@media (hover: hover) .remove:not(:disabled):hover - Container
.tag[data-disabled]
Motion and interaction
Tag has motion in code that this page cannot list yet: try it in the preview.
With reduced motion turned on, its changes happen at once.
From the code Generated from the component, not editable here.
Props
Parsed from the TypeScript types in packages/react/src/components/Tag/Tag.tsx, so this table cannot drift from the code. It also accepts every native <span> attribute except children.
| Prop | Type | Default | Description |
|---|---|---|---|
childrenrequired | ReactNode | none | The tag text: a filter value, a token group, a component name. |
tone | 'neutral' | 'signal' | 'neutral' | `signal` marks a tag that matches the current search or filter. Default `neutral`. |
icon | LucideIcon | none | Leading Lucide icon. |
selected | boolean | none | Makes the tag a toggle (filter chip). Controlled pressed state, announced with aria-pressed. |
defaultSelected | boolean | none | Uncontrolled initial selected state for a toggle tag. |
onSelectedChange | (selected: boolean) => void | none | Called when a toggle tag is pressed. Passing it makes the tag interactive. |
onRemove | () => void | none | Adds a remove button. Called when it is pressed. |
removeLabel | string | none | Accessible name of the remove button, without the verb. Defaults to the tag text when it is a string. |
disabled | boolean | false | No description in the code yet. |
size | 'sm' | 'md' | 'md' | No description in the code yet. |
Playground
Change the props and see the real Tag update. Controls are generated from the TypeScript props; nothing here changes the system.
<Tag>color.action</Tag>Workbench
For contributors: every state with the accessibility panel, in the component workbench (Storybook). The stories double as visual test fixtures; the guidance on this page is the user documentation (open Tag in Storybook).
Embed Storybook stories here (5)
Loads from https://bridge-storybook.floriangouloubi.com (set STORYBOOK_URL at build time). If Storybook is not running, the frames stay empty.
Static
Removable
Toggle
FilterChips
AllStates
From the code Generated from the component, not editable here.
Changelog
- New
Data display: Card restyled as a flat plate with an
interactiveoption and padding sizes; Badge gainsappearance(subtle, now the default, or solid), a dot, icons and sizes (existing solid badges must passappearance="solid"to keep their look); new Avatar and AvatarGroup, Table (sortable headers with aria-sort, selectable rows, sticky header, focusable scroll region, useTableSort), Accordion, Tag (removable, toggleable), Divider and Kbdv1.0.0, Nov 11, 2026
- Fix
Studio consistency: one count, one verb, one meaning per tag colour
v1.0.0, Nov 11, 2026
- Fix
A drafted summary that names a token (tag.bg) keeps its sentences: a dot inside a token path is not a sentence end
v1.0.0, Nov 11, 2026
- Fix
Adds the generated
component-specs.json(runnpm run specs) for Button, IconButton, Badge, Tag, Input and Card, read by the DS Bridge Figma plugin to pull them as component setsv1.0.0, Nov 11, 2026
- Fix
Exploration page, "What this changes in the library": each piece is one header line (kind tile, name, one tag, origin), a new component shows the piece as built with one "Add Timeline to the library" tick, and a change to a component part reads like the component's own options ("Padding: Comfortable", 20 px, +4 px) with the new values to tick, the ones already in the library under them, Rename, and a button that names the outcome
v1.0.0, Nov 11, 2026
- Fix
Library review List: a piece's tag sits next to its name, and the name and its kind sit closer
v1.0.0, Nov 11, 2026
- Fix
Studio polish: the lead's zone asks the library question first (1 of 2); Library review says its count in words, drops the shortcut hints and the shared-decision line, and shows the list and the piece as two cards with each piece in its own card and a list that scrolls on its own; the home's Oldest tag and the folder tiles' Captured tag keep their size and edge
v1.0.0, Nov 11, 2026
- Fix
One Bridge account per Gmail mailbox: emails are keyed by their canonical spelling (lower case; for gmail.com and googlemail.com without dots or a "+tag"), so either spelling signs in to the same account
v1.0.0, Nov 11, 2026
- Fix
An archived exploration keeps its page: the preview and activity, an Archived tag, one line and Unarchive, with no GitHub links
v1.0.0, Nov 11, 2026
- Fix
Being built: no "Exploration" tag on rows (every change starts as an exploration); the row's line already says where it comes from
v1.0.0, Nov 11, 2026
- Fix
After Done exploring, an exploration keeps the page it had while it ran: the status tag (Waiting for code, Being built, Shipped), who said done and when, the preview, what happens next in three steps, what the library gets from it, and the activity
v1.0.0, Nov 11, 2026
- Fix
Team Libraries are noindex on the server: every
/library/<owner>/<repo>/address answersX-Robots-Tag: noindex, except the teams in the committed allow-listhosted/public-libraries.jsonv1.0.0, Nov 11, 2026
- Fix
Studio Components: the "Used in" column shows one tag per product instead of a sentence
v1.0.0, Nov 11, 2026