Multi-select Input
Also called token input, tag input, chips input, multi combobox
A field holding several selected values at once, each shown as a chip that can be removed.
Example
Reviewers
- Grace Hopper
1 of 5 selected. Backspace in the empty field removes the last one.
Removals and additions are announced here.
These chips look like the tags on the Tag page and are a different thing: each one is part of the value this field will submit, so each one carries a remove button named after the value it removes — not a row of identical crosses.
When to use it
- A field takes several values from a known set — reviewers, labels, recipients, skills.
- The chosen values must stay visible while more are added, so the user can see what they already picked.
- The list is long enough that typing to narrow it beats scrolling.
When not to
- There are five options or fewer. A checkbox group shows them all at once with no typing and no hidden state.
- Only one value is allowed. That is a select or a combobox, and letting people add a second one just to reject it later is cruel.
- The values are free text with no vocabulary behind them. That is a text field; chips imply a set to choose from.
Trade-offs
- Selected values stay on screen, which prevents the “did I already add that?” loop of a plain multi-select listbox.
- Each value is individually removable, so correcting one mistake does not mean redoing the whole field.
- Typing narrows a long list without leaving the field.
- Height changes as chips are added, and a growing field pushes the rest of the form around.
- Genuinely hard to make accessible: it is a composite of a text input, a listbox and a list of buttons.
- Many chips become their own scanning problem — past a dozen, the field is harder to read than a list would be.
Accessibility
What this pattern needs in order to work for everyone.
- Keyboard
- Backspace on an empty input removes the last chip. It is the behaviour people expect from email fields, and its absence is felt immediately.
- Every chip needs a reachable remove control — a tiny × that only responds to the mouse strands keyboard users with a value they cannot delete.
- Decide where focus goes after a removal and be consistent. Returning it to the input is the safe default; leaving it on a removed node is a dead focus.
- Roles and state
- The remove button's name must include the value: “Remove TypeScript”, never a bare “Remove” repeated six times.
- Put the chips in a `<ul>`, one `<li>` each, so the number of selected values is announced before they are read out.
- Announce removals in a polite live region. Without it, pressing Backspace deletes something with no feedback at all.
- The input keeps its own label. “Reviewers” must still be announced when focus lands in a field already full of chips.
- Focus
- Clicking anywhere in the field focuses the text input, including the empty space beside the chips — the whole box should behave like one field.
In the wild
- GitHub reviewers — Type to filter, chips for the chosen reviewers, each removable with a named button.
- Gmail recipients — The canonical Backspace behaviour: an empty field plus Backspace removes the last address.
Compared with
Side-by-side breakdowns of patterns that solve a similar problem.