Attach combobox navigation behavior to or .</body></html>
Перейти к файлу
Cameron Dutro 3fe250b4b7
Merge pull request #76 from nicowenterodt/combobox-select-event
Introduce combobox-select event
2023-09-14 13:47:58 -07: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 use Event instead of CustomEvent 2023-09-14 18:25:29 +02: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 introduce combobox-select event 2023-09-14 15:55:27 +02:00
karma.config.cjs configure karma to use chromium 2022-01-29 17:24:35 +00:00
package-lock.json Bump word-wrap from 1.2.3 to 1.2.4 2023-07-19 12:25:57 +00:00
package.json remove post-publish scripts 2023-02-01 16:22:03 +00: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.

Development

npm install
npm test