Skip to content

Chip

A compact interactive tag with two interaction modes: selectable (toggles on/off for filters) and removable (applied tags that can be cleared). Unlike Badge, Chip is interactive.

When to use: Filter bars, tag lists, multi-select category pickers, applied-filter indicators.

When not to use: Non-interactive labels — use Badge. Long phrases — Chip is optimized for 1-3 word labels. More than ~8 chips — consider a searchable multi-select instead.

import { Chip } from '@/components';
// Selectable filter chip
<Chip label="React Native" isSelected={selected} onPress={() => toggle('rn')} />
// Removable tag chip
<Chip label="TypeScript" onRemove={() => removeTag('ts')} />
PropTypeDefaultDescription
labelstringDisplay text (required)
isSelectedbooleanfalseSelected / active state
onPress() => voidPress handler (for filter chips)
onRemove() => voidRenders × button; called on tap
variantstring'default'Color variant
isDisabledbooleanfalsePrevents interaction
testIDstringFor testing
const FILTERS = ['All', 'Active', 'Pending', 'Archived'];
const [active, setActive] = useState('All');
<View style={{ flexDirection: 'row', gap: 8, flexWrap: 'wrap' }}>
{FILTERS.map(f => (
<Chip
key={f}
label={f}
isSelected={active === f}
onPress={() => setActive(f)}
/>
))}
</View>
<View style={{ flexDirection: 'row', gap: 8, flexWrap: 'wrap' }}>
{tags.map(tag => (
<Chip
key={tag}
label={tag}
onRemove={() => removeTag(tag)}
/>
))}
</View>
  • Role: button when onPress or onRemove is set
  • isSelected maps to accessibilityState.selected
  • Badge — non-interactive status label
  • TagInput — Chip list + text input for adding new tags