Canoe vessel that navigates your aria.
Ember reactivity bindings for aria-voyager
.
... and this library will make it interactive, according to applicable ARIA patterns. This library does not apply styling, it will operate on the accessibility tree.
See hokulea/aria-voyager
for a
full list of supported features.
pnpm add ember-aria-voyager
Basic example:
import { listbox } from 'ember-aria-voyager';
const options = ['apple', 'banana', 'pineapple'];
<template>
<ul role="listbox" {{listbox items=options}}>
{{#each options as |option|}}
<li role="option">{{option}}</li>
{{/each}}
</ul>
</template>
Here are the options, you can pass to {{listbox}}
type ListboxSignature<T = HTMLElement> = {
items?: T[];
selection?: T | T[];
activateItem?: (item: T) => void;
} & (
| {
multi: true;
select?: (selection: T[]) => void;
}
| {
multi?: false;
select?: (selection: T) => void;
}
)
When passing items
the select()
and selection
can work off of your passed items, anyway will fall back to the HTMLElement
Full example:
import { listbox } from 'ember-aria-voyager';
const options = ['apple', 'banana', 'pineapple'];
const context = new class {
@tracked selection = [options[0]];
@tracked disabled = false;
select: (fruits: string[]) => {
this.selection = fruits;
}
};
const selection = ['banana'];
<template>
<ul role="listbox" {{listbox
items=options
multi=true
disabled=context.disabled
selection=context.selection
select=context.select
}}>
{{#each options as |option|}}
<li role="option">{{option}}</li>
{{/each}}
</ul>
</template>
Basic example:
import { menu } from 'ember-aria-voyager';
<template>
<div role="menu" {{menu}}>
<button role="menuitem">Version Info</button>
<a role="menuitem" href="https://github.com/hokulea/aria-voyager" target="_blank">Github</a>
<button role="menuitem" popovertarget="authormenu">Author</button>
<div role="menu" id="authormenu" popover {{menu}}>
<a role="menuitem" href="https://gos.si" target="_blank">Homepage</a>
<a role="menuitem" href="https://github.com" target="_blank">Github</a>
</div>
</div>
</template>
Here are the options, you can pass to {{menu}}
interface MenuSignature<T> {
items?: T[];
disabled?: boolean;
}
Here is a full example:
import { menu } from 'ember-aria-voyager';
const items = [
{
label: 'Version Info',
action: () => console.log('1.2.4');
},
{
label 'Github',
link: 'https://github.com/hokulea/aria-voyager'
}
];
<template>
<div role="menu" {{menu items=items}}>
{{#each items as |item|}}
{{#if item.action}}
<button type="button" role="menuitem" {{on "click" item.action}}>{{item.label}}</button>
{{else if item.link}}
<a role="menuitem" href={{item.link}} target="_blank">{{item.label}}</a>
{{else}}
euw, what?
{{/if}}
{{/each}}
</div>
</template>