Action chip

● Stable · v0.1

A small, tappable pill for a quick action or a filter — a category, a shortcut, a toggleable option. Chips let a user pick without typing, which suits a low-literacy user and a small screen.

In context

9:41

Purpose

An ActionChip is a lightweight choice a user can tap instead of type: a category while recording a sale, a "Walk-in" shortcut, a filter on a list. Selected chips lift onto a soft teal; unselected stay quiet white — so the current choice is obvious.

Anatomy

  • Pill — a rounded, tappable container (≥ 40dp, with hit-slop to a 44dp target).
  • Icon (optional) — a small leading glyph (~16).
  • Label — one or two words.
  • Selected state — teal tint + teal edge + semibold label.

Variants

  • Unselected / selected — quiet white vs teal-tinted active.
  • disabled — dimmed and non-tappable, for a choice not available yet.
  • With or without a leading icon.

Code

import { ActionChip } from '@daytwo/components'
const [cat, setCat] = useState('food')
{['food', 'drinks', 'other'].map((c) => (
<ActionChip
key={c}
label={c}
selected={cat === c}
onPress={() => setCat(c)}
/>
))}

When to use

  • A row of 2–8 peer choices (categories, quick filters, shortcuts).
  • Anywhere tapping beats typing for the user.

When NOT to use

Good vs bad

  • Good: four category chips under a sale amount — one tap sets the category, the selected one is clearly teal, no keyboard needed.
  • Bad: twelve chips wrapping across four rows as the primary way to pick a category — past ~8 it stops being scannable; use a dropdown or search instead.

Edge cases

Long Burmese/Thai label
numberOfLines={1}; chip hugs its label
WhyMY/TH labels run longer — the row must wrap cleanly, not clip
Touch target
40dp min + 4dp hit-slop each side ≈ 48dp
WhyChips are small but must still meet the tap minimum
Nothing selected
All quiet white is a valid resting state
WhyA filter row may start with no filter applied
Dark mode
Tint + edge follow the theme surfaces
WhySelected must stay legible in both schemes
Chips are for picking, not reporting

If it's tappable, it's an ActionChip; if it only shows a state, it's a StatusLabel. Keep the two apart so taps are predictable.

Tokens used

color.surface.primarycolor.brand.tintcolor.brand.primarycolor.border.defaultcolor.text.primaryradius.pilltypography.subhead