Skip to content

Commit b2e0cbd

Browse files
author
Nii Yeboah
authored
fix: add aria-controls to details toggle button (#175)
1 parent 9eeee12 commit b2e0cbd

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

packages/vaadin-details/src/vaadin-details.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,15 @@ class DetailsElement extends ControlStateMixin(ElementMixin(ThemableMixin(Polyme
8282
on-keydown="_onToggleKeyDown"
8383
disabled$="[[disabled]]"
8484
aria-expanded$="[[_getAriaExpanded(opened)]]"
85+
aria-controls$="[[_contentId]]"
8586
>
8687
<span part="toggle"></span>
8788
<span part="summary-content"><slot name="summary"></slot></span>
8889
</div>
8990
</div>
90-
<div part="content" aria-hidden$="[[_getAriaHidden(opened)]]">
91+
<section id$="[[_contentId]]" part="content" aria-hidden$="[[_getAriaHidden(opened)]]">
9192
<slot></slot>
92-
</div>
93+
</section>
9394
`;
9495
}
9596

@@ -136,6 +137,8 @@ class DetailsElement extends ControlStateMixin(ElementMixin(ThemableMixin(Polyme
136137

137138
ready() {
138139
super.ready();
140+
const uniqueId = (DetailsElement._uniqueId = 1 + DetailsElement._uniqueId || 0);
141+
this._contentId = `${this.constructor.is}-content-${uniqueId}`;
139142
// prevent Shift + Tab on content from host blur
140143
this._collapsible.addEventListener('keydown', (e) => {
141144
if (e.shiftKey && e.keyCode === 9) {

packages/vaadin-details/test/details.test.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,40 @@ describe('vaadin-details', () => {
129129
details.opened = true;
130130
expect(content.getAttribute('aria-hidden')).to.equal('false');
131131
});
132+
133+
it('should set aria-controls on toggle button', () => {
134+
const idRegex = /^vaadin-details-content-\d+$/;
135+
expect(idRegex.test(toggle.getAttribute('aria-controls'))).to.be.true;
136+
});
137+
});
138+
139+
describe('unique IDs', () => {
140+
const idRegex = /^vaadin-details-content-\d+$/;
141+
let container, details;
142+
143+
beforeEach(() => {
144+
container = fixtureSync(`
145+
<div>
146+
<vaadin-details>
147+
<div slot="summary">Summary</div>
148+
<input>
149+
</vaadin-details>
150+
<vaadin-details>
151+
<div slot="summary">Summary</div>
152+
<input>
153+
</vaadin-details>
154+
</div>
155+
`);
156+
details = container.querySelectorAll('vaadin-details');
157+
});
158+
159+
it('should set unique id on the content', () => {
160+
const detailsId1 = details[0]._collapsible.id;
161+
const detailsId2 = details[1]._collapsible.id;
162+
expect(idRegex.test(detailsId1)).to.be.true;
163+
expect(idRegex.test(detailsId2)).to.be.true;
164+
expect(detailsId1).to.not.equal(detailsId2);
165+
});
132166
});
133167

134168
describe('keyboard events', () => {

0 commit comments

Comments
 (0)