castopod/app/Resources/js/modules/SidebarToggler.ts

64 lines
2.1 KiB
TypeScript

const SidebarToggler = (): void => {
const sidebar = document.querySelector(
"aside[data-sidebar-toggler='sidebar']"
) as HTMLElement;
const toggler = document.querySelector(
"button[data-sidebar-toggler='toggler']"
) as HTMLButtonElement;
const sidebarBackdrop = document.querySelector(
"div[data-sidebar-toggler='backdrop']"
) as HTMLDivElement;
if (typeof sidebar.dataset.toggleClass !== "undefined") {
const setAriaExpanded = (isExpanded: "true" | "false") => {
toggler.setAttribute("aria-expanded", isExpanded);
sidebarBackdrop.setAttribute("aria-expanded", isExpanded);
};
const hideSidebar = () => {
setAriaExpanded("false");
sidebar.classList.add(sidebar.dataset.toggleClass as string);
sidebarBackdrop.classList.add("hidden");
toggler.classList.add(toggler.dataset.toggleClass as string);
};
const showSidebar = () => {
setAriaExpanded("true");
sidebar.classList.remove(sidebar.dataset.toggleClass as string);
sidebarBackdrop.classList.remove("hidden");
toggler.classList.remove(toggler.dataset.toggleClass as string);
};
toggler.addEventListener("click", () => {
if (sidebar.classList.contains(sidebar.dataset.hideClass as string)) {
showSidebar();
} else {
hideSidebar();
}
});
sidebarBackdrop.addEventListener("click", () => {
if (!sidebar.classList.contains(sidebar.dataset.hideClass as string)) {
hideSidebar();
}
});
const setAriaExpandedOnWindowEvent = () => {
const isExpanded =
!sidebar.classList.contains(sidebar.dataset.hideClass as string) ||
window.innerWidth >= 768;
const ariaExpanded = toggler.getAttribute("aria-expanded");
if (isExpanded && (!ariaExpanded || ariaExpanded === "false")) {
setAriaExpanded("true");
} else if (!isExpanded && (!ariaExpanded || ariaExpanded === "true")) {
setAriaExpanded("false");
}
};
window.addEventListener("load", setAriaExpandedOnWindowEvent);
window.addEventListener("resize", setAriaExpandedOnWindowEvent);
}
};
export default SidebarToggler;