Skip to content

Commit 9a8272d

Browse files
authored
A11y: set aria-expanded to the toggle button. (#61)
* A11y: set aria-expanded to the toggle button. Closes Quansight-Labs/czi-scientific-python-mgmt#77 * run linter/prettify
1 parent f468ca6 commit 9a8272d

File tree

1 file changed

+59
-42
lines changed

1 file changed

+59
-42
lines changed

sphinx_togglebutton/_static/togglebutton.js

+59-42
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ let toggleChevron = `
1010

1111
var initToggleItems = () => {
1212
var itemsToToggle = document.querySelectorAll(togglebuttonSelector);
13-
console.log(`[togglebutton]: Adding toggle buttons to ${itemsToToggle.length} items`)
13+
console.log(
14+
`[togglebutton]: Adding toggle buttons to ${itemsToToggle.length} items`
15+
);
1416
// Add the button to each admonition and hook up a callback to toggle visibility
1517
itemsToToggle.forEach((item, index) => {
1618
if (item.classList.contains("admonition")) {
@@ -19,30 +21,40 @@ var initToggleItems = () => {
1921
var toggleID = `toggle-${index}`;
2022
var buttonID = `button-${toggleID}`;
2123

22-
item.setAttribute('id', toggleID);
23-
if (!item.classList.contains("toggle")){
24+
item.setAttribute("id", toggleID);
25+
if (!item.classList.contains("toggle")) {
2426
item.classList.add("toggle");
2527
}
2628
// This is the button that will be added to each item to trigger the toggle
2729
var collapseButton = `
28-
<button type="button" id="${buttonID}" class="toggle-button" data-target="${toggleID}" data-button="${buttonID}" data-toggle-hint="${toggleHintShow}" aria-label="Toggle hidden content">
30+
<button type="button"
31+
id="${buttonID}"
32+
class="toggle-button"
33+
data-target="${toggleID}"
34+
data-button="${buttonID}"
35+
data-toggle-hint="${toggleHintShow}"
36+
aria-label="Toggle hidden content"
37+
aria-expanded="false"
38+
>
2939
${toggleChevron}
3040
</button>`;
3141

32-
title = item.querySelector(".admonition-title")
42+
title = item.querySelector(".admonition-title");
3343
title.insertAdjacentHTML("beforeend", collapseButton);
3444
thisButton = document.getElementById(buttonID);
3545

3646
// Add click handlers for the button + admonition title (if admonition)
37-
admonitionTitle = document.querySelector(`#${toggleID} > .admonition-title`)
47+
admonitionTitle = document.querySelector(
48+
`#${toggleID} > .admonition-title`
49+
);
3850
if (admonitionTitle) {
3951
// If an admonition, then make the whole title block clickable
40-
admonitionTitle.addEventListener('click', toggleClickHandler);
41-
admonitionTitle.dataset.target = toggleID
42-
admonitionTitle.dataset.button = buttonID
52+
admonitionTitle.addEventListener("click", toggleClickHandler);
53+
admonitionTitle.dataset.target = toggleID;
54+
admonitionTitle.dataset.button = buttonID;
4355
} else {
4456
// If not an admonition then we'll listen for the button click
45-
thisButton.addEventListener('click', toggleClickHandler);
57+
thisButton.addEventListener("click", toggleClickHandler);
4658
}
4759

4860
// Now hide the item for this toggle button unless explicitly noted to show
@@ -62,12 +74,12 @@ var initToggleItems = () => {
6274
item.insertAdjacentHTML("beforebegin", detailsBlock);
6375

6476
// Now move the toggle-able content inside of the details block
65-
details = item.previousElementSibling
66-
details.appendChild(item)
67-
item.classList.add("toggle-details__container")
77+
details = item.previousElementSibling;
78+
details.appendChild(item);
79+
item.classList.add("toggle-details__container");
6880

6981
// Set up a click trigger to change the text as needed
70-
details.addEventListener('click', (click) => {
82+
details.addEventListener("click", (click) => {
7183
let parent = click.target.parentElement;
7284
if (parent.tagName.toLowerCase() == "details") {
7385
summary = parent.querySelector("summary");
@@ -78,35 +90,38 @@ var initToggleItems = () => {
7890
}
7991
// Update the inner text for the proper hint
8092
if (details.open) {
81-
summary.querySelector("span.toggle-details__summary-text").innerText = toggleHintShow;
93+
summary.querySelector("span.toggle-details__summary-text").innerText =
94+
toggleHintShow;
8295
} else {
83-
summary.querySelector("span.toggle-details__summary-text").innerText = toggleHintHide;
96+
summary.querySelector("span.toggle-details__summary-text").innerText =
97+
toggleHintHide;
8498
}
85-
8699
});
87100

88101
// If we have a toggle-shown class, open details block should be open
89102
if (item.classList.contains("toggle-shown")) {
90103
details.click();
91104
}
92105
}
93-
})
106+
});
94107
};
95108

96109
// This should simply add / remove the collapsed class and change the button text
97110
var toggleHidden = (button) => {
98-
target = button.dataset['target']
111+
target = button.dataset["target"];
99112
var itemToToggle = document.getElementById(target);
100113
if (itemToToggle.classList.contains("toggle-hidden")) {
101114
itemToToggle.classList.remove("toggle-hidden");
102115
button.classList.remove("toggle-button-hidden");
103116
button.dataset.toggleHint = toggleHintHide;
117+
button.setAttribute("aria-expanded", true);
104118
} else {
105119
itemToToggle.classList.add("toggle-hidden");
106120
button.classList.add("toggle-button-hidden");
107121
button.dataset.toggleHint = toggleHintShow;
122+
button.setAttribute("aria-expanded", false);
108123
}
109-
}
124+
};
110125

111126
var toggleClickHandler = (click) => {
112127
// Be cause the admonition title is clickable and extends to the whole admonition
@@ -124,36 +139,36 @@ var toggleClickHandler = (click) => {
124139
// We've clicked the button itself and so don't need to do anything
125140
button = click.target;
126141
} else {
127-
console.log(`[togglebutton]: Couldn't find button for ${click.target}`)
142+
console.log(`[togglebutton]: Couldn't find button for ${click.target}`);
128143
}
129-
target = document.getElementById(button.dataset['button']);
144+
target = document.getElementById(button.dataset["button"]);
130145
toggleHidden(target);
131-
}
146+
};
132147

133148
// If we want to blanket-add toggle classes to certain cells
134149
var addToggleToSelector = () => {
135150
const selector = "";
136151
if (selector.length > 0) {
137152
document.querySelectorAll(selector).forEach((item) => {
138153
item.classList.add("toggle");
139-
})
154+
});
140155
}
141-
}
156+
};
142157

143158
// Helper function to run when the DOM is finished
144-
const sphinxToggleRunWhenDOMLoaded = cb => {
145-
if (document.readyState != 'loading') {
146-
cb()
159+
const sphinxToggleRunWhenDOMLoaded = (cb) => {
160+
if (document.readyState != "loading") {
161+
cb();
147162
} else if (document.addEventListener) {
148-
document.addEventListener('DOMContentLoaded', cb)
163+
document.addEventListener("DOMContentLoaded", cb);
149164
} else {
150-
document.attachEvent('onreadystatechange', function() {
151-
if (document.readyState == 'complete') cb()
152-
})
165+
document.attachEvent("onreadystatechange", function () {
166+
if (document.readyState == "complete") cb();
167+
});
153168
}
154-
}
155-
sphinxToggleRunWhenDOMLoaded(addToggleToSelector)
156-
sphinxToggleRunWhenDOMLoaded(initToggleItems)
169+
};
170+
sphinxToggleRunWhenDOMLoaded(addToggleToSelector);
171+
sphinxToggleRunWhenDOMLoaded(initToggleItems);
157172

158173
/** Toggle details blocks to be open when printing */
159174
if (toggleOpenOnPrint == "true") {
@@ -163,21 +178,23 @@ if (toggleOpenOnPrint == "true") {
163178
el.dataset["togglestatus"] = el.open;
164179
el.open = true;
165180
});
166-
181+
167182
// Open the admonitions
168-
document.querySelectorAll(".admonition.toggle.toggle-hidden").forEach((el) => {
169-
console.log(el);
170-
el.querySelector("button.toggle-button").click();
171-
el.dataset["toggle_after_print"] = "true";
172-
});
183+
document
184+
.querySelectorAll(".admonition.toggle.toggle-hidden")
185+
.forEach((el) => {
186+
console.log(el);
187+
el.querySelector("button.toggle-button").click();
188+
el.dataset["toggle_after_print"] = "true";
189+
});
173190
});
174191
window.addEventListener("afterprint", () => {
175192
// Re-close the details that were closed
176193
document.querySelectorAll("details.toggle-details").forEach((el) => {
177194
el.open = el.dataset["togglestatus"] == "true";
178195
delete el.dataset["togglestatus"];
179196
});
180-
197+
181198
// Re-close the admonition toggle buttons
182199
document.querySelectorAll(".admonition.toggle").forEach((el) => {
183200
if (el.dataset["toggle_after_print"] == "true") {

0 commit comments

Comments
 (0)