Skip to content

Commit 5f33368

Browse files
committed
Improve aria accessibility roles
1 parent b7098d9 commit 5f33368

File tree

2 files changed

+31
-15
lines changed

2 files changed

+31
-15
lines changed

src/content/assets/js/linter-rules.js

+23-7
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ function _setupFiltering() {
5151
chip.addEventListener('click', () => {
5252
_closeMenusAndToggle();
5353
chip.classList.toggle('selected');
54-
const checked = chip.getAttribute('aria-checked');
55-
chip.setAttribute('aria-checked', checked === 'true' ? 'false' : 'true');
54+
const checked = chip.ariaChecked;
55+
chip.ariaChecked = checked === 'true' ? 'false' : 'true';
5656
filterRules();
5757
});
5858
});
@@ -67,7 +67,10 @@ function _setupFiltering() {
6767
const options = chip.parentElement.querySelectorAll('.select-menu button');
6868

6969
function unselectOptions() {
70-
options.forEach(option => option.classList.remove('selected'));
70+
options.forEach(option => {
71+
option.classList.remove('selected');
72+
option.ariaSelected = 'false';
73+
});
7174
}
7275

7376
options.forEach(option => {
@@ -77,6 +80,7 @@ function _setupFiltering() {
7780
} else {
7881
unselectOptions();
7982
option.classList.add('selected');
83+
option.ariaSelected = 'true';
8084
chip.classList.add('selected');
8185
chip.querySelector('.label').textContent = option.querySelector('.label').textContent;
8286
chip.dataset.filter = option.dataset.filter;
@@ -132,23 +136,35 @@ function _setupFiltering() {
132136
}
133137

134138
function _closeMenusAndToggle(menuToToggle = '') {
135-
document.querySelectorAll('.select-menu').forEach(menu => {
139+
document.querySelectorAll('.select-chip').forEach(chip => {
140+
const menu = chip.parentElement.querySelector('.select-menu');
136141
if (menu.id === menuToToggle) {
137-
menu.classList.toggle('show-menu');
142+
if (menu.classList.contains('show-menu')) {
143+
menu.classList.remove('show-menu');
144+
chip.ariaExpanded = 'false';
145+
} else {
146+
menu.classList.add('show-menu');
147+
chip.ariaExpanded = 'true';
148+
}
138149
} else {
139150
// Close all other menus.
140151
menu.classList.remove('show-menu');
152+
chip.ariaExpanded = 'false';
141153
}
142154
});
143155
}
144156

145157
function _resetChip(chip) {
146158
chip.classList.remove('selected');
147159
if (chip.classList.contains('filter-chip')) {
148-
chip.setAttribute('aria-checked', 'false');
160+
chip.ariaChecked = 'false';
149161
} else if (chip.classList.contains('select-chip')) {
150162
chip.parentElement.querySelectorAll('.select-menu button')
151-
.forEach(option => option.classList.remove('selected'));
163+
.forEach(option => {
164+
option.classList.remove('selected');
165+
option.ariaSelected = 'false';
166+
});
167+
chip.ariaExpanded = 'false';
152168
chip.querySelector('.label').textContent = chip.dataset.title;
153169
}
154170
}

src/content/tools/linter-rules/index.md

+8-8
Original file line numberDiff line numberDiff line change
@@ -133,36 +133,36 @@ check out [All linter rules](/tools/linter-rules/all).
133133

134134
<div class="chip-set">
135135
{%- comment %}<div class="button-menu-wrapper">
136-
<button class="chip select-chip" data-menu="category-menu" data-title="Category">
136+
<button class="chip select-chip" data-menu="category-menu" data-title="Category" aria-controls="category-menu" aria-expanded="false">
137137
<span class="label">Category</span>
138138
<svg class="chip-icon trailing-icon" width="24" height="24" viewBox="0 0 24 24">
139139
<path d="M7 10l5 5 5-5H7z"></path>
140140
</svg>
141141
</button>
142142
<div id="category-menu" class="select-menu">
143-
<ul>
144-
<li><button><span class="label">Effective Dart</span></button></li>
143+
<ul role="listbox">
144+
<li><button role="option" aria-selected="false"><span class="label">Effective Dart</span></button></li>
145145
</ul>
146146
</div>
147147
</div>{% endcomment -%}
148148
<div class="button-menu-wrapper">
149-
<button class="chip select-chip" data-menu="rule-set-menu" data-title="Rule set">
149+
<button class="chip select-chip" data-menu="rule-set-menu" data-title="Rule set" aria-controls="rule-set-menu" aria-expanded="false">
150150
<span class="label">Rule set</span>
151151
<svg class="chip-icon trailing-icon" width="24" height="24" viewBox="0 0 24 24">
152152
<path d="M7 10l5 5 5-5H7z"></path>
153153
</svg>
154154
</button>
155155
<div id="rule-set-menu" class="select-menu">
156-
<ul>
157-
<li><button data-filter="inFlutter">
156+
<ul role="listbox">
157+
<li><button data-filter="inFlutter" role="option" aria-selected="false">
158158
<span class="material-symbols" aria-hidden="true">flutter</span>
159159
<span class="label">Flutter</span>
160160
</button></li>
161-
<li><button data-filter="inRecommended">
161+
<li><button data-filter="inRecommended" role="option" aria-selected="false">
162162
<span class="material-symbols" aria-hidden="true">thumb_up</span>
163163
<span class="label">Recommended</span>
164164
</button></li>
165-
<li><button data-filter="inCore">
165+
<li><button data-filter="inCore" role="option" aria-selected="false">
166166
<span class="material-symbols" aria-hidden="true">circles</span>
167167
<span class="label">Core</span>
168168
</button></li>

0 commit comments

Comments
 (0)