Chip

Atom
An interactive pill for filter chips, tags, and selectable tokens. It carries an optional leading icon and a label, becomes tappable with onPress, and grows a trailing "×" remove button with onRemove.

Playground

Every control sets a real prop of ChipProps. The JSX below updates as you go.
Design
Props
children
string
Color
pick one
Emphasis
pick one
icon
icon
count
string
trailing
icon
selectable
boolean
selected
boolean
disabled
boolean
JSX · ChipProps
<Chip>Design</Chip>

Variants

6 examples from src/atoms/chip/chip.md, each rendered live from its own JSX.
Bug
Chore
Docs
Feature
Design
Backend
Frontend
Research
Infra
Growth
Archived
Colors
<Row wrap>
<Chip red>Bug</Chip>
<Chip orange>Chore</Chip>
<Chip amber>Docs</Chip>
<Chip green>Feature</Chip>
<Chip teal>Design</Chip>
<Chip blue>Backend</Chip>
<Chip indigo>Frontend</Chip>
<Chip violet>Research</Chip>
<Chip purple>Infra</Chip>
<Chip pink>Growth</Chip>
<Chip gray>Archived</Chip>
</Row>
Passing
Flaky
Failing
Queued
Skipped
Status
<Row wrap>
<Chip success>Passing</Chip>
<Chip warning>Flaky</Chip>
<Chip destructive>Failing</Chip>
<Chip info>Queued</Chip>
<Chip neutral>Skipped</Chip>
</Row>
Neutral
Accent
Outline
Emphasis
<Row>
<Chip>Neutral</Chip>
<Chip primary>Accent</Chip>
<Chip outline>Outline</Chip>
</Row>
Verified
With leading icon
A leading <Icon /> is auto-tinted to the chip's color, so a bare <Icon check /> matches without threading the color through.
<Chip success icon={<Icon check size={14} />}>Verified</Chip>
Role: Admin
Removable filters
onRemove grows the trailing "×"; wire it to your own state to drop the filter.
<Chip onRemove={() => {}}>Role: Admin</Chip>
Selectable
A selectable chip is a filter chip: the outlined pill at rest, and the accent's soft wash inside an accent edge, leading with a check, once selected.
<Row>
<Chip selectable defaultSelected>Design</Chip>
<Chip selectable>Engineering</Chip>
</Row>

States

Hover, focus and press are pinned so they can be compared side by side; the rest are real props.
Design
default
Design
hover
Design
focus
selected
Design
disabled

Anatomy

Design
12
1
Container
2
Leading icon
3
Label
4
Count
5
Trailing control
Dimmed parts appear only in some states or variants.

Props

50 props on ChipProps, grouped as they are declared in source. Required props are marked *.
Prop
Type
Default
Description
Props
14 props
children
ReactNode
–
The chip label.
count
number | string
–
A dimmed trailing count, set in the mono face.
start
boolean
false
Pin a chip within an app-owned host layout.
icon
ReactNode
–
A leading element (e.g. an <Icon /> or a small <Avatar />). An <Icon /> is auto-tinted to the chip's label color unless it sets its own color.
trailing
ReactNode
–
A trailing element (e.g. a chevron for a menu trigger). Rendered after the label.
onPress
(event?: GestureResponderEvent) => void
–
Makes the whole chip tappable (e.g. toggling a filter). Called with the press event, which a ChipGroup option's Space key does not have, so an href chip that routes on the client calls event?.preventDefault() here.
href
string
–
Makes the chip a LINK to this destination (a route or a URL): on the web react-native-web renders the chip as an <a href>, so middle-click, cmd-click and open-in-new-tab work and assistive tech hears a link; it takes the link chip's hover (the accent ink inside an accent edge) in place of the brightening. Native platforms have no anchors, so pair it with an onPress that navigates through the host's router, as Button's href does. While disabled the anchor is suppressed. A link is not a toggle, so it is ignored on a selectable chip or a ChipGroup option.
hrefAttrs
{ target?: "_blank" | "_self"; rel?: string; download?: boolean | string }
–
Anchor attributes forwarded with href on the web (react-native-web's hrefAttrs): target, rel, download. Ignored without href, and everywhere natively.
onRemove
() => void
–
Adds a trailing "×" remove button firing this handler.
selectable
boolean
false
Turns the chip into a filter toggle that owns its own selected state: pressing it lights up (to the accent's soft wash, inside an accent edge on the web and iOS) and back. Selection is controlled via selected, uncontrolled via defaultSelected.
selected
boolean
false
Selected state for a selectable chip (CONTROLLED). Omit for uncontrolled use.
defaultSelected
boolean
false
Initial selected state for an uncontrolled selectable chip.
onSelectedChange
(selected: boolean) => void
–
Fired with the next selected state when a selectable chip is pressed.
value
string | number
–
The chip's option value inside a ChipGroup: the chip is one option of the pick-one set, selected when the group's value is this one, and reads as a radio. Ignored outside a group.
Color axis
pick one
5 props
success
boolean
false
warning
boolean
false
destructive
boolean
false
The danger tone. This is the name the intent axis uses across the kit (Button, AlertDialog, and every chart) and the one the design hand-off uses here too.
info
boolean
false
neutral
boolean
false
Free-form palette hues, plus `gray` for an explicit neutral tag
18 props
red
boolean
false
Free-form palette hues, plus gray for an explicit neutral tag.
orange
boolean
false
Free-form palette hues, plus gray for an explicit neutral tag.
amber
boolean
false
Free-form palette hues, plus gray for an explicit neutral tag.
yellow
boolean
false
Free-form palette hues, plus gray for an explicit neutral tag.
lime
boolean
false
Free-form palette hues, plus gray for an explicit neutral tag.
green
boolean
false
Free-form palette hues, plus gray for an explicit neutral tag.
emerald
boolean
false
Free-form palette hues, plus gray for an explicit neutral tag.
teal
boolean
false
Free-form palette hues, plus gray for an explicit neutral tag.
cyan
boolean
false
Free-form palette hues, plus gray for an explicit neutral tag.

Accessibility and keyboard

Keyboard
Enter
Activates
Space
Activates
Tab
Moves focus on
Semantics
Roles
button
link
radio
States
checked
disabled
selected
ARIA on web
aria-checked
aria-disabled
aria-label
aria-pressed
Below the platform minimum, the touch area grows to 44 pt on iOS and 48 dp on Android without moving the layout.
From the docs
On Android a tappable Chip's touch area grows to the 48dp minimum without the chip changing size: 8dp above and below the 32dp chip, and nothing sideways once it is 48dp wide. On iOS it keeps 8pt of extra touch area on every side, which clears the 44pt minimum around the 28pt chip. The remove "×" pads out to the minimum on both, biased away from the label. Inside one chip the two never overlap: the chip splits the gap between its label and its "×", so a tap on the label never removes it. Between chips, React Native

Platform skins

The playground's props on each platform: same tree, native shapes, type and touch sizes.
Neutral
Accent
Outline
Web
control 10 · field 10 · card 16 · Instrument Sans
Neutral
Accent
Outline
iOS
capsule controls · field 8 · card 12 · SF Pro · 44 pt
Neutral
Accent
Outline
Android
Material 3 stadium · field 4 · card 12 · Roboto · 48 dp

Usage

<Chip>Design</Chip>
A Chip is a LOW-emphasis tag, not a call to action: the neutral chip is a 28 px outlined pill (the raised neutral fill inside a hairline, its label at weight 500). A status chip is its soft pill (the status wash under the status ink, the recipe Alert and the other toned surfaces share); a palette hue is that hue's 16% wash inside the same hue at 30%, under a deep ink in the hue that holds 4.5:1 on the wash. A selectable chip rests as the bare pill in the field border, and once selected it is the accent's soft wash in the accent ink, inside an accent edge and leading with a check. On Android the chip is Material 3's: a 32dp outlined container at the 8dp chip corner, its selected filter chip tonal with an 18dp check and no outline. The chip owns that whole look, so no call site hand-composes a borderRadius + backgroundColor + padding Pressable.
Two orthogonal axes drive the look:
  • Color (pick one; default the neutral tag). A semantic status (success, warning, destructive, info, neutral) or a free-form palette hue (red, orange, amber, yellow, lime, green, emerald, teal, cyan, sky, blue, indigo, violet, fuchsia, purple, pink, rose, gray). Status names read the theme's status colors (statusColors), so a success chip matches a success Badge and Alert; info is the primary color. Precedence when more than one is set: status names first, then hues in the order above.
  • Emphasis. outline drops the fill for the field-border edge around the color's ink; primary is the solid accent; secondary is the higher raised fill with no edge (on Android, the filled chip beside the bare outlined container that is its idle chip). neutral is the muted tag with no edge; gray is the same muted fill and ink inside the chip's own edge. outline composes with any color, e.g. <Chip blue outline>. Precedence: a color wins over primary, and outline wins over primary's fill.

Touch area

On Android a tappable Chip's touch area grows to the 48dp minimum without the chip changing size: 8dp above and below the 32dp chip, and nothing sideways once it is 48dp wide. On iOS it keeps 8pt of extra touch area on every side, which clears the 44pt minimum around the 28pt chip. The remove "×" pads out to the minimum on both, biased away from the label. Inside one chip the two never overlap: the chip splits the gap between its label and its "×", so a tap on the label never removes it. Between chips, React Native's own rule applies: where two touch areas overlap, the later chip takes the tap. Android chips that meet the minimum's width reach nothing sideways, so a Row of them never overlaps; on iOS two tappable chips closer than 16pt do, and a tap on the edge of one toggles the next. Leave room between chips on iOS where a mistaken toggle matters.

Tokens

Read from the playground render. Values follow the scheme and the ion hue.
--fd
--ft
--ln
--sf3
--tx

Related components