Tags Input
Features
- Can be controlled or uncontrolled.
- Full keyboard navigation.
- Limit the number of tags.
- Accept value from clipboard.
- Clear button to reset all tags values.
Installation
Install the component from your command line.
$ npm add reka-uiAnatomy
Import all parts and piece them together.
<script setup>
import { TagsInputClear, TagsInputInput, TagsInputItem, TagsInputItemDelete, TagsInputItemText, TagsInputRoot } from 'reka-ui'
</script>
<template>
  <TagsInputRoot>
    <TagsInputItem>
      <TagsInputItemText />
      <TagsInputItemDelete />
    </TagsInputItem>
    <TagsInputInput />
    <TagsInputClear />
  </TagsInputRoot>
</template>API Reference
Root
Contains all the tags input component parts.
| Prop | Default | Type | 
|---|---|---|
| addOnBlur | booleanWhen  | |
| addOnPaste | booleanWhen  | |
| addOnTab | booleanWhen  | |
| as | 'div' | AsTag | ComponentThe element or component this component should render as. Can be overwritten by  | 
| asChild | booleanChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. | |
| convertValue | ((value: string) => AcceptableInputValue)Convert the input value to the desired type. Mandatory when using objects as values and using  | |
| defaultValue | [] | AcceptableInputValue[]The value of the tags that should be added. Use when you do not need to control the state of the tags input | 
| delimiter | ',' | string | RegExpThe character or regular expression to trigger the addition of a new tag. Also used to split tags for  | 
| dir | 'ltr' | 'rtl'The reading direction of the combobox when applicable.  | |
| disabled | booleanWhen  | |
| displayValue | value.toString() | ((value: AcceptableInputValue) => string)Display the value of the tag. Useful when you want to apply modifications to the value like adding a suffix or when using object as values | 
| duplicate | booleanWhen  | |
| id | string | |
| max | 0 | numberMaximum number of tags. | 
| modelValue | AcceptableInputValue[] | nullThe controlled value of the tags input. Can be bind as  | |
| name | stringThe name of the field. Submitted with its owning form as part of a name/value pair. | |
| required | booleanWhen  | 
| Emit | Payload | 
|---|---|
| addTag | [payload: AcceptableInputValue]Event handler called when tag is added | 
| invalid | [payload: AcceptableInputValue]Event handler called when the value is invalid | 
| removeTag | [payload: AcceptableInputValue]Event handler called when tag is removed | 
| update:modelValue | [payload: AcceptableInputValue[]]Event handler called when the value changes | 
| Slots (default) | Payload | 
|---|---|
| modelValue | string | number | bigint | Record<string, any>Current input values | 
| Data Attribute | Value | 
|---|---|
| [data-disabled] | Present when disabled | 
| [data-focused] | Present when focus on input | 
| [data-invalid] | Present when input value is invalid | 
Item
The component that contains the tag.
| Prop | Default | Type | 
|---|---|---|
| as | 'div' | AsTag | ComponentThe element or component this component should render as. Can be overwritten by  | 
| asChild | booleanChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. | |
| disabled | booleanWhen  | |
| value* | string | number | bigint | Record<string, any>Value associated with the tags | 
| Data Attribute | Value | 
|---|---|
| [data-state] | "active" | "inactive" | 
| [data-disabled] | Present when disabled | 
ItemText
The textual part of the tag. Important for accessibility.
| Prop | Default | Type | 
|---|---|---|
| as | 'span' | AsTag | ComponentThe element or component this component should render as. Can be overwritten by  | 
| asChild | booleanChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. | 
ItemDelete
The button that delete the associate tag.
| Prop | Default | Type | 
|---|---|---|
| as | 'button' | AsTag | ComponentThe element or component this component should render as. Can be overwritten by  | 
| asChild | booleanChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. | 
| Data Attribute | Value | 
|---|---|
| [data-state] | "active" | "inactive" | 
| [data-disabled] | Present when disabled | 
Input
The input element for the tags input.
| Prop | Default | Type | 
|---|---|---|
| as | 'input' | AsTag | ComponentThe element or component this component should render as. Can be overwritten by  | 
| asChild | booleanChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. | |
| autoFocus | booleanFocus on element when mounted. | |
| maxLength | numberMaximum number of character allowed. | |
| placeholder | stringThe placeholder character to use for empty tags input. | 
| Data Attribute | Value | 
|---|---|
| [data-invalid] | Present when input value is invalid | 
Clear
The button that remove all tags.
| Prop | Default | Type | 
|---|---|---|
| as | 'button' | AsTag | ComponentThe element or component this component should render as. Can be overwritten by  | 
| asChild | booleanChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. | 
| Data Attribute | Value | 
|---|---|
| [data-disabled] | Present when disabled | 
Examples
Paste behavior
You can automatically add tags on paste by passing the add-on-paste prop.
<script setup lang="ts">
import { TagsInputInput, TagsInputItem, TagsInputItemDelete, TagsInputItemText, TagsInputRoot } from 'reka-ui'
</script>
<template>
  <TagsInputRoot
    v-model="modelValue"
    add-on-paste
  >
    …
  </TagsInputRoot>
</template>Multiple delimiters
You can pass RegExp as delimiter to allow multiple characters to trigger addition of a new tag. When add-on-paste is passed it will be also used to split tags for @paste event.
<script setup lang="ts">
import { TagsInputInput, TagsInputItem, TagsInputItemDelete, TagsInputItemText, TagsInputRoot } from 'reka-ui'
// split by space, comma, semicolon, tab, or newline
const delimiter = /[ ,;\t\n\r]+/
</script>
<template>
  <TagsInputRoot
    v-model="modelValue"
    :delimiter="delimiter"
    add-on-paste
  >
    …
  </TagsInputRoot>
</template>Accessibility
Keyboard Interactions
| Key | Description | 
|---|---|
| Delete |  When tag is active, remove it and set the tag on right active. | 
| Backspace |  When tag is active, remove it and set the tag on left active. If there are no tags to the left, either the next tags gets focus, or the input. | 
| ArrowRight |  Set the next tag active. | 
| ArrowLeft |  Set the previous tag active. | 
| Home |  Set the first tag active | 
| End |  Set the last tag active | 
