Attach combobox navigation behavior to or .</body></html>
Перейти к файлу
Keith Cirkel a5260930d3
prettier
2023-09-25 10:18:48 +01:00
.github/workflows Add comment 2023-02-28 08:36:27 +00:00
examples Remove old demo page 2020-04-29 14:20:14 -04:00
src prettier 2023-09-25 10:18:48 +01:00
test introduce combobox-select event 2023-09-14 15:55:27 +02:00
.eslintignore Switch to TS and exports only ESmodule 2020-04-23 16:26:28 -04:00
.eslintrc.json Update ESLint config after updating 2022-03-30 16:33:29 +01:00
.gitattributes Set end of line to `lf` in gitattributes 2022-03-30 16:33:31 +01:00
.gitignore Initial commit 2018-11-06 15:37:49 -05:00
.travis.yml Set env to osx to test ctrl np shortcut 2018-11-08 08:21:49 -05:00
CODEOWNERS move AOR to primer 2022-09-23 18:01:47 +01:00
LICENSE Initial commit 2018-10-11 13:10:36 -07:00
README.md Merge branch 'main' into scroll-into-view 2023-09-25 10:06:51 +01:00
karma.config.cjs configure karma to use chromium 2022-01-29 17:24:35 +00:00
package-lock.json upgrade all dependencies 2023-09-25 10:18:09 +01:00
package.json upgrade all dependencies 2023-09-25 10:18:09 +01:00
tsconfig.json Switch to TS and exports only ESmodule 2020-04-23 16:26:28 -04:00

README.md

Combobox Navigation

Attach combobox navigation behavior (ARIA 1.2) to <input>.

Installation

$ npm install @github/combobox-nav

Usage

HTML

<label>
  Robot
  <input id="robot-input" type="text" />
</label>
<ul role="listbox" id="list-id" hidden>
  <li id="baymax" role="option">Baymax</li>
  <li><del>BB-8</del></li>
  <!-- `role=option` needs to be present for item to be selectable -->
  <li id="hubot" role="option">Hubot</li>
  <li id="r2-d2" role="option">R2-D2</li>
</ul>

Markup requirements:

  • Each option needs to have role="option" and a unique id
  • The list should have role="listbox"

JS

import Combobox from '@github/combobox-nav'
const input = document.querySelector('#robot-input')
const list = document.querySelector('#list-id')

// install combobox pattern on a given input and listbox
const combobox = new Combobox(input, list)
// when options appear, start intercepting keyboard events for navigation
combobox.start()
// when options disappear, stop intercepting keyboard events for navigation
combobox.stop()

// move selection to the nth+1 item in the list
combobox.navigate(1)
// reset selection
combobox.clearSelection()
// uninstall combobox pattern from the input
combobox.destroy()

Events

A bubbling combobox-commit event is fired on the list element when an option is selected via keyboard or click.

For example, autocomplete when an option is selected:

list.addEventListener('combobox-commit', function (event) {
  console.log('Element selected: ', event.target)
})

Note When using <label> + <input> as options, please listen on change instead of combobox-commit.

When a label is clicked on, click event is fired from both <label> and its associated input label.control. Since combobox does not know about the control, combobox-commit cannot be used as an indicator of the item's selection state.

A bubbling combobox-select event is fired on the list element when an option is selected but not yet committed.

For example, autocomplete when an option is selected but not yet committed:

list.addEventListener('combobox-select', function (event) {
  console.log('Element selected : ', event.target)
})

Settings

For advanced configuration, the constructor takes an optional third argument. For example:

const combobox = new Combobox(input, list, {tabInsertsSuggestions: true})

These settings are available:

  • tabInsertsSuggestions: boolean = true - Control whether the highlighted suggestion is inserted when Tab is pressed (Enter will always insert a suggestion regardless of this setting). When true, tab-navigation will be hijacked when open (which can have negative impacts on accessibility) but the combobox will more closely imitate a native IDE experience.
  • defaultFirstOption: boolean = false - If no options are selected and the user presses Enter, should the first item be inserted? If enabled, the default option can be selected and styled with [data-combobox-option-default] . This should be styled differently from the aria-selected option.

    Warning Screen readers will not announce that the first item is the default. This should be announced explicitly with the use of aria-live status text.

  • scrollIntoViewOptions?: boolean | ScrollIntoViewOptions = undefined - When controlling the element marked [aria-selected="true"] with keyboard navigation, the selected element will be scrolled into the viewport by a call to Element.scrollIntoView. Configure this value to control the scrolling behavior (either with a boolean or a ScrollIntoViewOptions object.

Development

npm install
npm test