# TagsInput
Type a list of tags into one field: add, edit, delete and paste them from the keyboard.
```ehtml Example
import { TagsInput } from "@elements/ui/tags-input";
```
## Parts
| Part | What it is |
|---|---|
| `.tags-input` | The root. |
| `.tags-input-control` | The bordered box. |
| `.tags-input-item` | One tag. |
| `.tags-input-item-text` | Its text. |
| `.tags-input-item-delete` | Its delete button. |
| `.tags-input-item-input` | The editor while a tag is edited. |
| `.tags-input-input` | The text input. |
| `.tags-input-clear` | Clears every tag. |
| `.tags-input-listbox` | The suggestions popup, role=listbox, in the top layer. |
| `.tags-input-option` | One suggestion, role=option. |
## Attributes
| Attribute | Type | Default | Description |
|---|---|---|---|
| `value` | `string[]` (two-way) | `[]` | The tags. |
| `inputValue` | `string` (two-way) | `""` | The text typed but not yet a tag. |
| `placeholder` | `string` | `""` | Shown in the empty text input. |
| `delimiter` | `string \| RegExp` | `","` | Typing or pasting it ends a tag. A piece the rules refuse stays in the input. |
| `max` | `number` | `Infinity` | Most tags allowed. |
| `allowOverflow` | `boolean` | `false` | Allows tags past max and marks the field invalid. |
| `maxLength` | `number \| undefined` | `undefined` | Most characters per tag. |
| `allowDuplicates` | `boolean` | `false` | Allows the same tag twice. |
| `addOnPaste` | `boolean` | `false` | A paste becomes tags, split on the delimiter and newlines; refused pieces stay in the input. |
| `blurBehavior` | `"" \| "add" \| "clear"` | `""` | On blur: keep the typed text, add it as a tag, or clear it. |
| `editable` | `boolean` | `true` | Enter or a double click edits a tag in place. |
| `suggestions` | `string[]` | `[]` | Options offered in a listbox under the input as you type. Chosen ones are not offered again. |
| `disabledTags` | `string[]` | `[]` | Tags that cannot be deleted or edited; Clear keeps them. |
| `clearable` | `boolean` | `true` | Shows a button that clears every tag. |
| `validate` | `((details: { inputValue: string; value: string[] }) => boolean) \| null` | `null` | Return false to refuse a tag. |
| `sanitizeValue` | `(value: string) => string` | `trim` | Cleans a tag before it is checked. |
| `name` | `string` | `""` | Submits the tags joined by the delimiter. |
| `form` | `string` | `""` | The id of the form the tags belong to. |
| `disabled` | `boolean` | `false` | Not interactive. |
| `readonly` | `boolean` | `false` | Tags can be read and highlighted, not changed. |
| `required` | `boolean` | `false` | The form will not submit without a tag. |
| `invalid` | `boolean` | `false` | Marks the field invalid. |
| `translations` | `Partial` | `{}` | Announcements and button labels, for other languages. |
| `class` | `string` | `""` | Extra classes on the root. |
| `attrs` | `Record` | `{}` | Attributes for the text input: id, aria-label, autofocus, data-\*. |
| `onValueChange` | `(value: string[]) => void` | `() => {}` | After a tag is added, edited, deleted or cleared. |
| `onInputValueChange` | `(inputValue: string) => void` | `() => {}` | As the typed text changes. |
| `onHighlightChange` | `(value: string \| null) => void` | `() => {}` | When the highlighted tag changes. |
| `onValueInvalid` | `(details: { reason: "rangeOverflow" \| "invalidTag" }) => void` | `() => {}` | When max or validate refuses a tag. |
| `onFocusOutside` | `(e: FocusEvent) => void` | `() => {}` | When focus leaves the field. |
| `onPointerDownOutside` | `(e: PointerEvent) => void` | `() => {}` | On a press outside while the field is focused. |
## Keyboard
| Keys | Action |
|---|---|
| `Enter` | Adds the typed text as a tag; on a highlighted tag, edits it. |
| `Delimiter (,)` | Adds the text before it. |
| `ArrowLeft / ArrowRight` | Moves the highlight between tags and back to the input. |
| `Home / End` | First tag / back to the input. |
| `Backspace` | At the start of the input: highlights the last tag, then deletes it. |
| `Delete` | Deletes the highlighted tag. |
| `Escape` | Closes the suggestions, clears the highlight or cancels an edit. |
| `ArrowDown / ArrowUp` | With suggestions: opens the list, or moves through its options. |
| `Enter on an option` | With suggestions: adds the highlighted option as a tag. |
| `Ctrl/Cmd + V` | With addOnPaste, pastes as tags. |
## Data attributes
| Attribute | Values | On |
|---|---|---|
| `data-focus` | present while the input has focus | root, control |
| `data-empty` | present with no tags (on the input: no text) | root, input |
| `data-invalid` | present when invalid (the root also past max) | root, control, input |
| `data-disabled` | present when disabled (an item also when listed in disabledTags) | root, control, item, item text |
| `data-readonly` | present when read-only | root, control, input, clear |
| `data-highlighted` | present on the highlighted tag | item, item text, delete |
| `data-editing` | present while a tag is edited | item |
| `data-invalid` | present on an edit the rules refused, until it changes | item, item input |
| `data-value` | the tag | item |
| `data-highlighted` | present on the highlighted suggestion | option |
## Accessibility
- Focus stays in the text input; arrow keys move a highlight across the tags, so typing is never more than one key away.
- Adding, deleting, editing and highlighting a tag are announced in a polite live region.
- With suggestions the text input is a combobox (aria-expanded, aria-controls, aria-autocomplete=list) and the highlighted option is its aria-activedescendant.
- Delete buttons are named "Delete tag X"; they are out of the tab order because Backspace and Delete do their job.
## See also
- [Slider](slider): Pick a value or a range by dragging thumbs along a track, with full keyboard support.
- [NumberInput](number-input): A number field with stepper buttons, keyboard steps, formatting, wheel and scrub.
- [PasswordInput](password-input): A password field with a button that shows and hides what was typed.
- [InputOTP](input-otp): A one-time code in separate slots, with paste, SMS autofill and a pattern.
- [ColorPicker](color-picker): Pick a color with an area, channel sliders, inputs, swatches and the eye dropper.
- [FileUpload](file-upload): Drop, paste or browse for files; see them listed with previews, sizes, errors and progress.