Chip
Selectable 40px pill in four types — outline, filled, glass and inverse — with an optional leading marker and a removable form.
chipsOpen in Figma ↗A compact interactive element for representing categories, filter options, or selection states.
Use for: Filtering content within a section, selecting one or more categories from a set, or representing a toggleable option in a horizontal scrollable row.
Not for: Navigation between screens — use tab-pill instead. Not for actions with immediate side effects — use a button instead.
Choosing: Use type=outline on light flat surfaces. Use type=filled when the chip needs stronger visual weight on a light surface. Use type=glass over imagery or glass surfaces. Use type=inverse on dark or midnight surfaces. Set state=selected when the option is active — the leading icon automatically swaps to a checkmark and the trailing icon appears. Set state=disabled to remove interactivity without hiding the chip.
Rules: Always group chips in a horizontally scrollable row — do not stack them vertically in isolation. Edit the label via the text property on the instance; do not detach to change copy. In RTL the entire layout mirrors — do not manually adjust icon placement.
import SwiftUI import EandTokens // V1.2 chip: 40 tall, min 72 wide, body/md, padding 12 (8 before a 16pt marker). // Outline = 1pt stroke; selected fills midnight with no stroke. struct EandChip: View { let label: String; let selected: Bool var body: some View { Text(label) .font(.system(size: EandTypography.bodyMd.size)) .foregroundColor(selected ? EandColor.chipsDefaultOutlineTextSelected : EandColor.chipsDefaultOutlineTextDefault) .padding(.horizontal, EandSpacing.md) .frame(minWidth: EandScale.scale72, minHeight: EandTabs.heightMd) .background(selected ? EandColor.chipsDefaultOutlineSurfaceSelected : .clear) .overlay { if !selected { Capsule().strokeBorder(EandColor.chipsDefaultOutlineBorderDefault, lineWidth: EandBorder.sm) } } .clipShape(Capsule()) } }
When to use
- Use for quick filters and tags that toggle on and off, usually in a row that scrolls
sideways. Pass
onDismissfor a removable chip, such as an applied filter. - Don't use for a filter that opens a list of options — that is a FilterPill. Not for switching views (Tabs) or for a read-only label (Badge).
Choosing a type
type | Look |
|---|---|
outline | 1px stroke, no fill — the default |
filled | Solid fill, no stroke |
glass | Frosted fill behind a 20px backdrop blur, for imagery |
inverse | 1px light stroke, for brand-red and midnight surfaces |
A selected chip is fill only, with no stroke, in every type.
- Marker —
leadingIconfills a 16px box (pass a 12px glyph).checkshows a check mark while the chip is selected. - Removable —
onDismissadds a trailing 20px Dismiss; the label stays a separate button foronClick.dismissLabelnames it (default “Remove …”). - Deprecated —
inverseis an alias fortype="inverse".loadingstill renders a spinner, but V1.2 chips have no loader.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
check? | boolean | — | Show a check mark as the leading marker while selected (Figma marker type=check). |
disabled? | boolean | — | |
dismissLabel? | string | — | Accessible name for the dismiss button. Defaults to "Remove <label>". |
inverse? | boolean | — | Deprecated. Alias for type="inverse". |
leadingIcon? | ReactNode | — | Leading marker (Figma .chips.marker type=custom-icon): a 16px box — pass a 12px glyph. |
loading? | boolean | — | Deprecated. V1.2 chips have no loader. Still renders a spinner in the marker slot and suppresses clicks. |
onClick? | (() => void) | — | |
onDismiss? | (() => void) | — | Makes the chip removable (Figma .chips-core-status selected=true): a trailing 20px
dismiss that calls this. The label stays a separate button for onClick. |
selected? | boolean | — | Figma state=selected (the pressed/active chip). |
type? | 'inverse' | 'filled' | 'outline' | 'glass' | — | Figma type axis. |
Design
Figma source: chips — etisalat Consumer App DSL V1.2
- Height
tabs/height/md(40), minimum widthscale/72, pill; labelbody/md. - Padding: 12 / 12 without a marker; 8 · 16px marker · 4 · label · 12 with one; removable 12 · label · 4 · 20px dismiss · 8.
- Colours are
chips/default/<type>/{surface,text,border}/<state>. - The 1px stroke appears only on
outlineandinverse, in the default and disabled states. - The Chips page is still marked In review in Figma.