fix dialog aria-expand attribute

This commit is contained in:
okadurin 2024-08-27 16:55:45 +02:00
parent 5f92a722e6
commit 719991fdd3
4 changed files with 39 additions and 12 deletions

View file

@ -0,0 +1,5 @@
---
'@lion/ui': patch
---
add "aria-expanded" attribute only for the non-modal dialogs

View file

@ -1,5 +1,5 @@
/* eslint-disable lit-a11y/no-autofocus */
import { expect, fixture as _fixture, html, unsafeStatic } from '@open-wc/testing';
import { expect, fixture as _fixture, html, unsafeStatic, aTimeout } from '@open-wc/testing';
import { runOverlayMixinSuite } from '../../overlays/test-suites/OverlayMixin.suite.js';
import '@lion/ui/define/lion-dialog.js';
@ -166,4 +166,24 @@ describe('lion-dialog', () => {
el.setAttribute('opened', '');
});
});
describe('Accessibility', () => {
it('adds [aria-expanded] to invoker button', async () => {
const el = await fixture(
html` <lion-dialog>
<div slot="content" class="dialog">Hey there</div>
<button slot="invoker">Popup button</button>
</lion-dialog>`,
);
const invokerButton = /** @type {HTMLElement} */ (el.querySelector('[slot="invoker"]'));
expect(invokerButton.getAttribute('aria-expanded')).to.equal(null);
await invokerButton.click();
await aTimeout(0);
expect(invokerButton.getAttribute('aria-expanded')).to.equal(null);
await invokerButton.click();
await aTimeout(0);
expect(invokerButton.getAttribute('aria-expanded')).to.equal(null);
});
});
});

View file

@ -495,11 +495,11 @@ describe('<lion-input-datepicker>', () => {
const el = await fixture(html`<lion-input-datepicker></lion-input-datepicker>`);
const elObj = new DatepickerInputObject(el);
expect(elObj.invokerEl.getAttribute('aria-expanded')).to.equal('false');
expect(elObj.invokerEl.getAttribute('aria-expanded')).to.equal(null);
await elObj.openCalendar();
expect(elObj.invokerEl.getAttribute('aria-expanded')).to.equal('true');
expect(elObj.invokerEl.getAttribute('aria-expanded')).to.equal(null);
await elObj.closeCalendar();
expect(elObj.invokerEl.getAttribute('aria-expanded')).to.equal('false');
expect(elObj.invokerEl.getAttribute('aria-expanded')).to.equal(null);
});
it('is accessible when closed', async () => {

View file

@ -640,13 +640,14 @@ export class OverlayController extends EventTarget {
__setupTeardownAccessibility({ phase }) {
if (phase === 'init') {
this.__storeOriginalAttrs(this.contentNode, ['role', 'id']);
const isModal = this.hasBackdrop;
if (this.invokerNode) {
this.__storeOriginalAttrs(this.invokerNode, [
'aria-expanded',
'aria-labelledby',
'aria-describedby',
]);
const attributesToStore = ['aria-labelledby', 'aria-describedby'];
if (!isModal) {
attributesToStore.push('aria-expanded');
}
this.__storeOriginalAttrs(this.invokerNode, attributesToStore);
}
if (!this.contentNode.id) {
@ -661,7 +662,7 @@ export class OverlayController extends EventTarget {
}
this.contentNode.setAttribute('role', 'tooltip');
} else {
if (this.invokerNode) {
if (this.invokerNode && !isModal) {
this.invokerNode.setAttribute('aria-expanded', `${this.isShown}`);
}
if (!this.contentNode.getAttribute('role')) {
@ -1092,7 +1093,7 @@ export class OverlayController extends EventTarget {
// @ts-ignore
this.__wrappingDialogNode.close();
// @ts-ignore
this.__wrappingDialogNode.showModal();
this.__wrappingDialogNode.show();
}
// else {
this.enableTrapsKeyboardFocus();
@ -1299,7 +1300,8 @@ export class OverlayController extends EventTarget {
if (phase === 'init' || phase === 'teardown') {
this.__setupTeardownAccessibility({ phase });
}
if (this.invokerNode && !this.isTooltip) {
const isModal = this.hasBackdrop;
if (this.invokerNode && !this.isTooltip && !isModal) {
this.invokerNode.setAttribute('aria-expanded', `${phase === 'show'}`);
}
}