♿️ feat(a11y): add keyboard accessibility to theme toggler
This commit is contained in:
parent
b6a89e6370
commit
dce495e71d
@ -57,3 +57,18 @@ themeSwitcher.setAttribute('aria-pressed', currentTheme === 'dark');
|
|||||||
if (localStorage.getItem('theme')) {
|
if (localStorage.getItem('theme')) {
|
||||||
themeResetter.classList.add('has-custom-theme');
|
themeResetter.classList.add('has-custom-theme');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Function to handle keydown event on theme toggler buttons.
|
||||||
|
function handleThemeTogglerKeydown(event) {
|
||||||
|
if (event.key === 'Enter' || event.key === ' ') {
|
||||||
|
event.preventDefault();
|
||||||
|
if (event.target === themeSwitcher) {
|
||||||
|
switchTheme();
|
||||||
|
} else if (event.target === themeResetter) {
|
||||||
|
resetTheme();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
themeSwitcher.addEventListener('keydown', handleThemeTogglerKeydown);
|
||||||
|
themeResetter.addEventListener('keydown', handleThemeTogglerKeydown);
|
||||||
|
2
static/js/themeSwitcher.min.js
vendored
2
static/js/themeSwitcher.min.js
vendored
@ -1 +1 @@
|
|||||||
const themeSwitcher=document.querySelector(".theme-switcher"),themeResetter=document.querySelector(".theme-resetter"),defaultTheme=document.documentElement.getAttribute("data-default-theme");function getSystemThemePreference(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}let currentTheme=localStorage.getItem("theme")||document.documentElement.getAttribute("data-theme")||getSystemThemePreference();function setTheme(e,t=!1){document.documentElement.setAttribute("data-theme",e),currentTheme=e,themeSwitcher.setAttribute("aria-pressed","dark"===e),t?(localStorage.setItem("theme",e),themeResetter.classList.add("has-custom-theme")):(localStorage.removeItem("theme"),themeResetter.classList.remove("has-custom-theme")),window.dispatchEvent(new CustomEvent("themeChanged",{detail:{theme:e}}))}function resetTheme(){setTheme(defaultTheme||getSystemThemePreference())}function switchTheme(){setTheme("dark"===currentTheme?"light":"dark",!0)}themeSwitcher.addEventListener("click",switchTheme),themeResetter.addEventListener("click",resetTheme),defaultTheme||window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e=>{setTheme(e.matches?"dark":"light")}),themeSwitcher.setAttribute("aria-pressed","dark"===currentTheme),localStorage.getItem("theme")&&themeResetter.classList.add("has-custom-theme");
|
const a=document.querySelector(".theme-switcher"),r=document.querySelector(".theme-resetter"),e=document.documentElement.getAttribute("data-default-theme");function t(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}let d=localStorage.getItem("theme")||document.documentElement.getAttribute("data-theme")||t();function n(e,t=!1){document.documentElement.setAttribute("data-theme",e),d=e,a.setAttribute("aria-pressed","dark"===e),t?(localStorage.setItem("theme",e),r.classList.add("has-custom-theme")):(localStorage.removeItem("theme"),r.classList.remove("has-custom-theme")),window.dispatchEvent(new CustomEvent("themeChanged",{detail:{theme:e}}))}function c(){n(e||t())}function m(){n("dark"===d?"light":"dark",!0)}function o(e){"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),e.target===a?m():e.target===r&&c())}a.addEventListener("click",m),r.addEventListener("click",c),e||window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e=>{n(e.matches?"dark":"light")}),a.setAttribute("aria-pressed","dark"===d),localStorage.getItem("theme")&&r.classList.add("has-custom-theme"),a.addEventListener("keydown",o),r.addEventListener("keydown",o);
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
<div
|
<div
|
||||||
title="{{ title_label }}"
|
title="{{ title_label }}"
|
||||||
class="theme-switcher"
|
class="theme-switcher"
|
||||||
|
tabindex="0"
|
||||||
role="button"
|
role="button"
|
||||||
aria-label="{{ aria_label }}"
|
aria-label="{{ aria_label }}"
|
||||||
aria-pressed="false">
|
aria-pressed="false">
|
||||||
@ -21,6 +22,7 @@
|
|||||||
<div
|
<div
|
||||||
title="{{ reset_str }}"
|
title="{{ reset_str }}"
|
||||||
class="theme-resetter"
|
class="theme-resetter"
|
||||||
|
tabindex="0"
|
||||||
role="button"
|
role="button"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
aria-label="{{ reset_str }}">
|
aria-label="{{ reset_str }}">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user