Home/Blocks/Filter chips

Filter chips

A horizontally-scrolling chip row that filters the list below — assignments by status, receipts by date, payments by method. The phone-first counterpart to the desktop data toolbar.

Stable .b-filter-chips Canonical Horizontal scroll

Canonical filter-chip row.

Per audit-reuse D-4, b-filter-chips is the canonical implementation of the filter-pill row. Legacy .filter-chips, .chip-bar and .hist-filter markup still renders via deprecation aliases in components.css; new code MUST use .b-filter-chips > .b-fc. For single-trigger pills (open-a-menu / removable tag), see Chip & tag.

Default

Chips with a count badge. The active chip inverts to brand fill.

5 chips, "All" active.b-filter-chips

Without counts

When the underlying set is too large to count cheaply, drop the badge.

Time-range chips

Parts

PropertyValueNotes
chip padding7 × 14 pxTap target reaches ~32 px via line-height
radius9999 pxPill shape — distinguishes from buttons
active fill--brand · #fffInverts to brand to read at a glance
count badge--surface-muted on rest, white-22% on activeMono font, tabular-nums
overflowscroll-x, scrollbar hiddenTouch-momentum on iOS
row padding12 × 16 pxBleed to viewport edge so the first chip starts flush on phone

Do & don't

Do

Order chips by traffic — the chip most operators tap first goes first. "All" only leads when there's no obvious default.

Don't

Use chips for multi-select with > 2 selected. The visual stops reading. Use a check-list sheet instead.

Do

Carry a count badge whenever the count is cheap and stable. The badge is half the value of the chip.

Don't

Animate the active chip into / out of view. The scroll snap is the feedback.

Accessibility

  • Wrap with role="tablist" if the chips swap content in place; role="radiogroup" if they're a single-select filter.
  • The active chip carries aria-pressed="true" (radio) or aria-selected="true" (tab).
  • Count badges read as ambiguous numbers — append a hidden suffix: <span class="sr-only"> results</span>.
  • The scrollable row gets tabindex="0" and an accessible name so keyboard users can pan it.