Files
wordpress-theme-aksrt/assets/js/core/dropdown.js
T

110 lines
4.0 KiB
JavaScript

/**
* AKSRT Dropdown Menus — user, auth, post-meta
*/
(function () {
"use strict";
function initUserDropdown() {
var toggle = document.getElementById("user-menu-toggle");
var menu = document.getElementById("user-dropdown");
if (!toggle || !menu) return;
function close() {
menu.classList.remove("is-open");
toggle.setAttribute("aria-expanded", "false");
}
toggle.addEventListener("click", function (e) {
e.stopPropagation();
var open = !menu.classList.contains("is-open");
menu.classList.toggle("is-open", open);
toggle.setAttribute("aria-expanded", open ? "true" : "false");
});
document.addEventListener("click", function (e) {
if (!menu.contains(e.target) && e.target !== toggle) close();
});
document.addEventListener("touchstart", function (e) {
if (!menu.contains(e.target) && e.target !== toggle) close();
}, { passive: true });
document.addEventListener("keydown", function (e) {
if (e.key === "Escape") close();
});
}
function initAuthDropdown() {
var trigger = document.getElementById("nav-auth-trigger");
var container = document.getElementById("nav-auth-dropdown");
if (!trigger || !container) return;
function close() {
container.classList.remove("is-open");
trigger.setAttribute("aria-expanded", "false");
}
trigger.addEventListener("click", function (e) {
e.stopPropagation();
var open = !container.classList.contains("is-open");
container.classList.toggle("is-open", open);
trigger.setAttribute("aria-expanded", open ? "true" : "false");
});
document.addEventListener("click", function (e) {
if (!container.contains(e.target) && e.target !== trigger) close();
});
document.addEventListener("touchstart", function (e) {
if (!container.contains(e.target) && e.target !== trigger) close();
}, { passive: true });
document.addEventListener("keydown", function (e) {
if (e.key === "Escape") close();
});
}
function initPostDropMeta() {
document.querySelectorAll('.post-drop-meta').forEach(function (wrap) {
if (!wrap || wrap.dataset.aksrtDropMetaBound === '1') return;
var trigger = wrap.querySelector('.post-drop-meta__toggle');
var menu = wrap.querySelector('.post-drop-meta__menu');
if (!trigger || !menu) return;
wrap.dataset.aksrtDropMetaBound = '1';
function close() {
wrap.classList.remove('is-open');
trigger.setAttribute('aria-expanded', 'false');
menu.setAttribute('aria-hidden', 'true');
}
trigger.addEventListener('click', function (e) {
e.stopPropagation();
var open = !wrap.classList.contains('is-open');
document.querySelectorAll('.post-drop-meta.is-open').forEach(function (other) {
if (other !== wrap) {
other.classList.remove('is-open');
var otherTrigger = other.querySelector('.post-drop-meta__toggle');
var otherMenu = other.querySelector('.post-drop-meta__menu');
if (otherTrigger) otherTrigger.setAttribute('aria-expanded', 'false');
if (otherMenu) otherMenu.setAttribute('aria-hidden', 'true');
}
});
wrap.classList.toggle('is-open', open);
trigger.setAttribute('aria-expanded', open ? 'true' : 'false');
menu.setAttribute('aria-hidden', open ? 'false' : 'true');
});
document.addEventListener('click', function (e) {
if (!wrap.contains(e.target)) close();
});
document.addEventListener('touchstart', function (e) {
if (!wrap.contains(e.target)) close();
}, { passive: true });
document.addEventListener('keydown', function (e) {
if (e.key === 'Escape') close();
});
});
}
window.AksrtFrontend.register("aksrt-user-dropdown", function () { initUserDropdown(); });
window.AksrtFrontend.register("aksrt-auth-dropdown", function () { initAuthDropdown(); });
window.AksrtFrontend.register("aksrt-post-drop-meta", function () { initPostDropMeta(); });
})();