@botandrose/input-tag
Version:
A declarative, zero-dependency, framework-agnostic custom element for tag input with autocomplete
136 lines (97 loc) • 3.41 kB
Markdown
A declarative, framework-agnostic custom element for tag input with optional autocomplete functionality.
Built with appreciation on the excellent foundation of [Taggle.js](https://github.com/okcoker/taggle.js) by Sean Coker.
```bash
npm install @botandrose/input-tag
```
Import the custom element:
```javascript
import "@botandrose/input-tag"
```
Then use it in your HTML:
```html
<input-tag name="tags" multiple>
<tag-option value="javascript">JavaScript</tag-option>
<tag-option value="typescript">TypeScript</tag-option>
</input-tag>
<datalist id="suggestions">
<option value="react">React</option>
<option value="vue">Vue</option>
<option value="angular">Angular</option>
</datalist>
<input-tag name="frameworks" list="suggestions" multiple></input-tag>
```
- Form-associated custom element with full form integration
- Autocomplete support via datalist or custom options
- Multiple/single value modes
- Real-time validation
- Accessible keyboard navigation
- Shadow DOM encapsulation
- Framework-agnostic
- `name`: Form field name
- `multiple`: Allow multiple tags (default: single tag mode)
- `required`: Make field required
- `list`: ID of datalist for autocomplete suggestions
### Properties
- `value`: Get/set tag values - returns **array** when `multiple`, **string** when single mode
- `tags`: Get current tag values as array (read-only)
- `options`: Get available autocomplete options from datalist
- `form`: Reference to associated form element
- `name`: Get the name attribute value
### Events
- `change`: Fired when tag values change
- `update`: Fired when individual tags are added/removed with detail `{tag, isNew}`
- `add(tag | tags[])`: Add single tag or array of tags
- `remove(tag)`: Remove specific tag by value
- `removeAll()`: Clear all tags
- `has(tag)`: Check if tag exists
- `addAt(tag, index)`: Add tag at specific position
- `reset()`: Clear all tags and input field
- `checkValidity()`: Check if field passes validation
- `reportValidity()`: Check validity and show validation UI
- `focus()`: Focus the input field
- `disable()`: Disable the input
- `enable()`: Enable the input
```javascript
// Multiple mode
const multipleTag = document.querySelector('input-tag[multiple]')
// Add tags
multipleTag.add('react')
multipleTag.add(['vue', 'angular'])
// Get current tags
console.log(multipleTag.value) // ['react', 'vue', 'angular'] - returns array
console.log(multipleTag.tags) // ['react', 'vue', 'angular'] - also array
// Set all tags at once
multipleTag.value = ['new', 'tags'] // accepts array
// Single mode
const singleTag = document.querySelector('input-tag:not([multiple])')
// Set single tag
singleTag.value = 'selected-tag' // accepts string
// Get current tag
console.log(singleTag.value) // 'selected-tag' - returns string
console.log(singleTag.tags) // ['selected-tag'] - always array
// Backward compatibility: arrays still work in single mode
singleTag.value = ['another-tag'] // accepts array, uses first item
console.log(singleTag.value) // 'another-tag' - still returns string
// Form validation
if (!singleTag.checkValidity()) {
singleTag.reportValidity()
}
```
```bash
npm test
npm run test:all
```
MIT