Display elements in a subtree that match filter input text.
npm install @github/filter-input-elementDisplay elements in a subtree that match filter input text.
```
$ npm install @github/filter-input-element
` 0 robots found.html`
- filter-input[aria-owns] should point to the container ID that wraps all related elements.filter-input
- should have one input child element that is used to filter.[id]
- should be set on a container that either contains or has [data-filter-list] attribute.[data-filter-list]
- should be set on the element whose direct child elements are to be filtered.
#### Specify filter text
Use [data-filter-item-text] to specify an element whose text should be used for filtering. In the following example, the text (current) would not be matched.
`html`
#### Blankslate
Use [data-filter-empty-state] to specify an element to be displayed when no results were found. This element must be inside of the container aria-owns points to.
`html`
#### Create new item
Use [data-filter-new-item] to include an item to create a new instance when no exact match were found. The element with [data-filter-new-text]'s text content will be set to the input value. You can also use [data-filter-new-value] to set an input value to the query param.
`html`
filterInputElement.filter can be optionally set to provide an alternative filtering logic. The default is substring.
`js`
const fuzzyFilterInput = document.querySelector('.js-fuzzy-filter-input')
fuzzyFilterInput.filter = (element, elementText, query) => {
// fuzzy filtering logic
return {match: boolean, hideNew: boolean}
}
match(required) indicates whether the item should be shown. hideNew (optional) will determine whether the "Create new item" element should be hidden. For example, when an exact match is found, the "create new item" option should be hidden.
- filter-input-start (bubbles) - fired on when a filter action is about to start.filter-input-updated
- (bubbles) - fired on when filter has finished. event.detail.count is the number of matches found, and event.detail.total is the total number of elements.
To ensure that the client side update is communicated to assistive technologies, filter-input-updated event can be used to update filter results to screen readers. For example:
`js${event.detail.count} results found.
const ariaLiveContainer = document.querySelector('[aria-live="assertive"]')
document.addEventListener('filter-input-updated', event => {
ariaLiveContainer.textContent = `
})
For more details on this technique, check out Improving accessibility on GOV.UK search.
Browsers without native [custom element support][support] require a [polyfill][].
- Chrome
- Firefox
- Safari
- Microsoft Edge
[support]: https://caniuse.com/#feat=custom-elementsv1
[polyfill]: https://github.com/webcomponents/custom-elements
```
npm install
npm test
Distributed under the MIT license. See LICENSE for details.