No description
  • TypeScript 54.3%
  • JavaScript 45.7%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Marie Lucca 5fca36c7c7
Merge pull request #39 from github/dependabot/npm_and_yarn/npm_and_yarn-4e67b7c87e
Bump the npm_and_yarn group across 1 directory with 1 update
2026-07-08 23:14:18 -04:00
.github/workflows Update nodejs.yml 2026-05-14 09:32:08 -07:00
examples Use unpkg 2019-11-26 16:53:38 -05:00
src use new standards for CEs 2023-10-20 12:37:07 +01:00
test use new standards for CEs 2023-10-20 12:37:07 +01:00
.eslintignore Convert to typescript setup 2019-11-25 17:28:31 -05:00
.eslintrc.json use new standards for CEs 2023-10-20 12:37:07 +01:00
.gitignore Initial commit 2019-11-25 14:58:27 -05:00
CODE_OF_CONDUCT.md Fix repo name 2020-01-21 16:57:58 -05:00
CODEOWNERS move AOR to primer 2022-09-23 18:36:07 +01:00
CONTRIBUTING.md Fix repo name 2020-01-21 16:57:58 -05:00
custom-elements.json use new standards for CEs 2023-10-20 12:37:07 +01:00
LICENSE Initial commit 2019-11-25 14:58:27 -05:00
package-lock.json Bump the npm_and_yarn group across 1 directory with 1 update 2026-07-08 17:40:56 +00:00
package.json Bump the npm_and_yarn group across 1 directory with 2 updates 2026-06-13 08:27:52 +00:00
README.md Add actions CI badge 2019-11-27 16:11:48 -05:00
SECURITY.md Add files in preparation for open source 2020-01-21 11:54:07 -05:00
tsconfig.json use new standards for CEs 2023-10-20 12:37:07 +01:00
web-test-runner.config.js use new standards for CEs 2023-10-20 12:37:07 +01:00

<filter-input> element

Display elements in a subtree that match filter input text.

Installation

$ npm install @github/filter-input-element

Usage

<filter-input aria-owns="robots">
  <label>
    Filter robots
    <input type="text" autofocus autocomplete="off">
  </label>
</filter-input>
<div id="robots">
  <ul data-filter-list>
    <li>Bender</li>
    <li>Hubot</li>
    <li>Wall-E</li>
    <li>BB-8</li>
    <li>R2-D2</li>
  </ul>
  <p data-filter-empty-state hidden>0 robots found.</p>
</div>

Elements and attributes

Required

  • filter-input[aria-owns] should point to the container ID that wraps all <filter-input> 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.

Optional

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.

<div data-filter-list>
  <a href="/bender">Bender</a>
  <a href="/hubot">
    <span data-filter-item-text>Hubot</span>
    (current)
  </a>
</div>

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.

<div id="filter-list">
  <div data-filter-list>
    <a href="/bender">Bender</a>
    <a href="/hubot">Hubot</a>
  </div>
  <div data-filter-empty-state hidden>No results found.</div>
</div>

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.

<div id="filter-list">
  <div data-filter-list>
    <a href="/bender">Bender</a>
    <a href="/hubot">Hubot</a>
  </div>
  <form action="/new" data-filter-new-item hidden>
    <button name="robot" data-filter-new-item-value>
      Create robot "<span data-filter-new-item-text></span>"
    </button>
  </form>
</div>

Methods

filterInputElement.filter can be optionally set to provide an alternative filtering logic. The default is substring.

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.

Events

  • filter-input-start (bubbles) - fired on <filter-input> when a filter action is about to start.
  • filter-input-updated (bubbles) - fired on <filter-input> 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:

const ariaLiveContainer = document.querySelector('[aria-live="assertive"]')
document.addEventListener('filter-input-updated', event => {
  ariaLiveContainer.textContent = `${event.detail.count} results found.`
})

For more details on this technique, check out Improving accessibility on GOV.UK search.

Browser support

Browsers without native custom element support require a polyfill.

  • Chrome
  • Firefox
  • Safari
  • Microsoft Edge

Development

npm install
npm test

License

Distributed under the MIT license. See LICENSE for details.