From d306aed5876cd095e46f9c0d1b9ccc9bdc70b1df Mon Sep 17 00:00:00 2001 From: Sorin Davidoi Date: Thu, 15 Feb 2018 00:37:19 +0100 Subject: [PATCH] Accessibility improvements (#611) * fix(theme/book/themes): Check for control keys in event listener * fix(theme/index): Menu role for theme selector * fix(theme/book/themes): Handle focus when toggling theme list * feat(theme/book/themes): Handle ArrowUp, ArrowDown, Home and End --- src/theme/book.js | 32 +++++++++++++++++++++++++++++--- src/theme/index.hbs | 12 ++++++------ 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/theme/book.js b/src/theme/book.js index 53806af0..c2deb79c 100644 --- a/src/theme/book.js +++ b/src/theme/book.js @@ -298,11 +298,13 @@ function playpen_text(playpen) { function showThemes() { themePopup.style.display = 'block'; themeToggleButton.setAttribute('aria-expanded', true); + themePopup.querySelector("button#" + document.body.className).focus(); } function hideThemes() { themePopup.style.display = 'none'; themeToggleButton.setAttribute('aria-expanded', false); + themeToggleButton.focus(); } function set_theme(theme) { @@ -369,19 +371,43 @@ function playpen_text(playpen) { set_theme(theme); }); - // Hide theme selector popup when clicking outside of it - document.addEventListener('click', function (event) { - if (themePopup.style.display === 'block' && !themeToggleButton.contains(event.target) && !themePopup.contains(event.target)) { + themePopup.addEventListener('focusout', function(e) { + if (!themePopup.contains(e.relatedTarget)) { hideThemes(); } }); document.addEventListener('keydown', function (e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } + if (!themePopup.contains(e.target)) { return; } + switch (e.key) { case 'Escape': e.preventDefault(); hideThemes(); break; + case 'ArrowUp': + e.preventDefault(); + var li = document.activeElement.parentElement; + if (li && li.previousElementSibling) { + li.previousElementSibling.querySelector('button').focus(); + } + break; + case 'ArrowDown': + e.preventDefault(); + var li = document.activeElement.parentElement; + if (li && li.nextElementSibling) { + li.nextElementSibling.querySelector('button').focus(); + } + break; + case 'Home': + e.preventDefault(); + themePopup.querySelector('li:first-child button').focus(); + break; + case 'End': + e.preventDefault(); + themePopup.querySelector('li:last-child button').focus(); + break; } }); })(); diff --git a/src/theme/index.hbs b/src/theme/index.hbs index 2c15f38e..04fae848 100644 --- a/src/theme/index.hbs +++ b/src/theme/index.hbs @@ -95,12 +95,12 @@ -