Files
bentopdf/src/js/mobileMenu.ts
T

100 lines
3.4 KiB
TypeScript

document.addEventListener('DOMContentLoaded', () => {
const mobileMenuButton = document.getElementById('mobile-menu-button');
const mobileMenu = document.getElementById('mobile-menu');
const menuIcon = document.getElementById('menu-icon');
const closeIcon = document.getElementById('close-icon');
if (mobileMenuButton && mobileMenu && menuIcon && closeIcon) {
// Toggle menu on button click
mobileMenuButton.addEventListener('click', () => {
const isExpanded =
mobileMenuButton.getAttribute('aria-expanded') === 'true';
// Toggle menu visibility
mobileMenu.classList.toggle('hidden');
// Toggle icons
menuIcon.classList.toggle('hidden');
closeIcon.classList.toggle('hidden');
// Update aria-expanded for accessibility
mobileMenuButton.setAttribute('aria-expanded', (!isExpanded).toString());
});
// Close menu when clicking on a link
const mobileLinks = mobileMenu.querySelectorAll('a');
mobileLinks.forEach((link) => {
link.addEventListener('click', () => {
mobileMenu.classList.add('hidden');
menuIcon.classList.remove('hidden');
closeIcon.classList.add('hidden');
mobileMenuButton.setAttribute('aria-expanded', 'false');
});
});
// Close menu when clicking outside
document.addEventListener('click', (event) => {
const target = event.target as Node;
const isClickInsideMenu = mobileMenu.contains(target);
const isClickOnButton = mobileMenuButton.contains(target);
if (
!isClickInsideMenu &&
!isClickOnButton &&
!mobileMenu.classList.contains('hidden')
) {
mobileMenu.classList.add('hidden');
menuIcon.classList.remove('hidden');
closeIcon.classList.add('hidden');
mobileMenuButton.setAttribute('aria-expanded', 'false');
}
});
}
const mobileProductsButton = document.getElementById(
'mobile-products-button'
);
const mobileProductsMenu = document.getElementById('mobile-products-menu');
if (mobileProductsButton && mobileProductsMenu) {
mobileProductsButton.addEventListener('click', (event) => {
event.stopPropagation();
const isOpen =
mobileProductsButton.getAttribute('aria-expanded') === 'true';
mobileProductsMenu.hidden = isOpen;
mobileProductsButton.setAttribute('aria-expanded', (!isOpen).toString());
});
}
const productsButton = document.getElementById('products-menu-button');
const productsMenu = document.getElementById('products-menu');
if (productsButton && productsMenu) {
const closeProducts = () => {
productsMenu.hidden = true;
productsButton.setAttribute('aria-expanded', 'false');
};
productsButton.addEventListener('click', (event) => {
event.stopPropagation();
const isOpen = productsButton.getAttribute('aria-expanded') === 'true';
productsMenu.hidden = isOpen;
productsButton.setAttribute('aria-expanded', (!isOpen).toString());
});
document.addEventListener('click', (event) => {
const target = event.target as Node;
if (!productsMenu.contains(target) && !productsButton.contains(target)) {
closeProducts();
}
});
document.addEventListener('keydown', (event) => {
if (event.key === 'Escape' && !productsMenu.hidden) {
closeProducts();
productsButton.focus();
}
});
}
});