Components
Chip
Compact interactive pill for filtering, selection, and removable tokens.
Chip is the action sibling of Badge and Tag. Always interactive. Render a Chip only when onChipClick, onRemove, or showDropdown is wired up — a Chip with no handler is a bug.
Status: Active
Chip
Use when: Compact pill *after* a filter choice is made, multi-select tokens, secondary toggle pills.
Don't: Render with no handler — use Badge or Tag.
<Chip label="Active" onRemove={...} />FilterButton
Use when: Dropdown trigger inside a FilterBar — encapsulates dropdown state.
Don't: Show selections after picking — those are Chips.
<FilterButton label="Status" options={...} />Button
Use when: Primary CTAs, form submits, primary workflows.
Don't: Compact filter pills — use Chip.
<Button>Save</Button>Use it for
- Active filter pills with a dismiss X ("Status: Active" × — clear that filter)
- Multi-select tokens — selected categories rendered as removable pills
- Filter dropdown triggers ("All statuses" with a chevron)
- Compact toggleable pills inside facet sidebars
Import
import { Chip } from '@brikdesigns/bds';Variants
Two variants × two appearances. Match the chip's role:
secondary+solid— Default filter chip. High contrast.secondary+outline— Softer filter chip. Transparent + neutral border.primary+solid— Active/selected filter. Brand emphasis.primary+outline— Active filter with lower brand emphasis.
<Chip label="Design" variant="secondary" appearance="solid" />
<Chip label="Design" variant="primary" appearance="outline" />Common shapes
Removable filter chip
<Chip label="Status: Active" onRemove={() => clearFilter('status')} />Filter dropdown trigger
<Chip
label="All statuses"
icon={<FilterIcon />}
showDropdown
onChipClick={() => openMenu()}
/>With avatar
<Chip label="Sarah Chen" avatar={<Avatar src={...} />} />Disabled
<Chip label="Archived" disabled />When not to use
- Don't duplicate FilterButton. If you're inside a
FilterBaropening a dropdown, use FilterButton — it handles the state machine. Chip is for what comes after the choice. - Don't use Chip for primary CTAs. It's compact by design. Form submits and primary workflows belong on a Button.
Accessibility
- Renders a
<button>when interactive. KeyboardEnter/Spaceactivates. onRemoveadds a separate dismiss button with its own accessible name (aria-label="Remove {label}").showDropdownaddsaria-haspopup="listbox"to the chip body.
API
| Prop | Type | Default |
|---|---|---|
label | string (required) | — |
size | 'sm' | 'md' | 'lg' | 'md' |
variant | 'primary' | 'secondary' | 'secondary' |
appearance | 'solid' | 'outline' | 'solid' |
icon | ReactNode | — |
avatar | ReactNode | — |
showDropdown | boolean | false |
onRemove | () => void | — |
onChipClick | () => void | — |
disabled | boolean | false |
CSS Override API
| Variable | Default | Controls |
|---|---|---|
--chip-hover-overlay | var(--state-hover-overlay) | Inset overlay color on hover |
--chip-pressed-overlay | var(--state-pressed-overlay) | Inset overlay color on press |
.filter-bar {
--chip-hover-overlay: rgba(0, 0, 0, 0.08);
--chip-pressed-overlay: rgba(0, 0, 0, 0.14);
}Related
- Badge — read-only status sibling
- Tag — read-only categorization sibling
- FilterButton — dropdown trigger inside FilterBar
- Button — primary action shape
- Storybook playground