TagInput
v1.0.17Updated 19 Oct 2026Gmail / GitHub-style inline chip input. Type-then-commit on Enter / comma / semicolon / Tab; backspace deletes last chip; paste comma-separated splits into multiple tags; autocomplete dropdown with arrow-key nav + pinned
Preview
Live · 14 stories▸Why this is recommendedformtagschipsmulti-input+6
The default, out-of-the-box TagInput.
- ✓Gmail-style recipient pickers
- ✓GitHub-issue label editors
- ✓Tag / topic pickers with create-new
- ✓Skill / interest selectors
- Type-then-commit on Enter / comma / semicolon / Tab
- Backspace at empty input deletes last chip
- Paste comma-separated splits into multiple tags
- Autocomplete dropdown with arrow-key nav
- Pinned Create-new row in the suggestion popover
- Max-tags cap + N/max counter
- Per-tag tone / icon / meta / disabled / invalid
- Reorderable via @dnd-kit (lazy bundle)
- Async suggestions via onSearchChange + loading
- Custom renderTag slot
- Labelled by FormField: id and aria-* land on the text input (role=combobox); FormField hint / error join the component validation message in aria-describedby; at max the chip group takes the id and the field name
- ✕Static visible tag cluster (use TagCloud)
- ✕Single-select (use Combobox)
- ✕Free-text comment field (use Textarea)
Install
Ask your agent, or call the MCP tool directly. The resolved bundle is written into your project.
Usage
Tick variants in the left menu — each adds a tab with that variant’s real story source, the same code the preview above renders.
Props
valueCurrent tags
yesonValueChangeTag change callback
yessuggestionsAutocomplete options
—allowCreateAllow tags not in suggestions (default true)
—validatePer-input validation
—commitKeysKeys that commit (default Enter / , / ; / Tab)
—maxMax tag count
—showCounterShow N/max counter
—reorderableEnable drag-to-reorder
—onSearchChangeAsync fetch hook
—loadingAsync suggestion loading state
—renderTagCustom chip renderer
—variantVisual variant
—sizeSize scale
—aria-labelAccessible name of the text input (the ARIA combobox)
—aria-labelledbyId(s) of the element(s) that label the text input; wins over a FormField label
—idDOM id set on the text input (the chip group while max is reached); FormField clones its field id in, and its label then names the control
—aria-describedbyId(s) of hint or error text describing the text input (FormField clones this in)
—aria-invalidMark the text input invalid; FormField clones this in from its error prop
—aria-requiredMark the text input required; FormField clones this in from its required prop
—