mirror of
https://github.com/imfing/hextra.git
synced 2025-06-19 09:23:37 -04:00
62 lines
1.9 KiB
JavaScript
62 lines
1.9 KiB
JavaScript
![]() |
(function () {
|
||
|
const dropdownToggles = document.querySelectorAll(".hextra-nav-menu-toggle");
|
||
|
|
||
|
dropdownToggles.forEach((toggle) => {
|
||
|
toggle.addEventListener("click", (e) => {
|
||
|
e.preventDefault();
|
||
|
e.stopPropagation();
|
||
|
|
||
|
// Close all other dropdowns first
|
||
|
dropdownToggles.forEach((otherToggle) => {
|
||
|
if (otherToggle !== toggle) {
|
||
|
otherToggle.dataset.state = "closed";
|
||
|
const otherMenuItems = otherToggle.nextElementSibling;
|
||
|
otherMenuItems.classList.add("hx:hidden");
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// Toggle current dropdown
|
||
|
const isOpen = toggle.dataset.state === "open";
|
||
|
toggle.dataset.state = isOpen ? "closed" : "open";
|
||
|
const menuItemsElement = toggle.nextElementSibling;
|
||
|
|
||
|
if (!isOpen) {
|
||
|
// Position dropdown centered with toggle
|
||
|
menuItemsElement.style.position = "absolute";
|
||
|
menuItemsElement.style.top = "100%";
|
||
|
menuItemsElement.style.left = "50%";
|
||
|
menuItemsElement.style.transform = "translateX(-50%)";
|
||
|
menuItemsElement.style.zIndex = "1000";
|
||
|
|
||
|
// Show dropdown
|
||
|
menuItemsElement.classList.remove("hx:hidden");
|
||
|
} else {
|
||
|
// Hide dropdown
|
||
|
menuItemsElement.classList.add("hx:hidden");
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
|
||
|
// Dismiss dropdown when clicking outside
|
||
|
document.addEventListener("click", (e) => {
|
||
|
if (e.target.closest(".hextra-nav-menu-toggle") === null) {
|
||
|
dropdownToggles.forEach((toggle) => {
|
||
|
toggle.dataset.state = "closed";
|
||
|
const menuItemsElement = toggle.nextElementSibling;
|
||
|
menuItemsElement.classList.add("hx:hidden");
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// Close dropdowns on escape key
|
||
|
document.addEventListener("keydown", (e) => {
|
||
|
if (e.key === "Escape") {
|
||
|
dropdownToggles.forEach((toggle) => {
|
||
|
toggle.dataset.state = "closed";
|
||
|
const menuItemsElement = toggle.nextElementSibling;
|
||
|
menuItemsElement.classList.add("hx:hidden");
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
})();
|