feat(nav): rewrite top header to zibll 1:1 DOM/CSS/JS contract

Replace hybrid site-nav/drawer shell with zibll navbar-top layouts 1/2/3,
body.mobile-navbar-show drawer, wired NavWalker + aksrt_menu_options meta,
nav_folding/chevron, VIP switches, and SPA/PHP schema parity. No dual-class
compat paths.
This commit is contained in:
kate522 committed 2026-07-22 11:18:34 +08:00
1 parent b8ee6b6a43
commit 259dbdbe04
28 files changed
+2463 -885

No files matched your search

+15 -67
View File
@@ -1,65 +1,10 @@
/**
* AKSRT Dropdown Menus — user, auth, post-meta
* AKSRT Dropdown Menus — post-meta only.
* Header user box uses CSS hover (.navbar-top .sub-menu) per zibll contract.
*/
(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;
@@ -80,10 +25,10 @@
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');
var t = other.querySelector('.post-drop-meta__toggle');
var m = other.querySelector('.post-drop-meta__menu');
if (t) t.setAttribute('aria-expanded', 'false');
if (m) m.setAttribute('aria-hidden', 'true');
}
});
wrap.classList.toggle('is-open', open);
@@ -94,16 +39,19 @@
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(); });
if (window.AksrtFrontend && typeof window.AksrtFrontend.register === 'function') {
window.AksrtFrontend.register('aksrt-post-drop-meta', function () {
initPostDropMeta();
});
} else if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initPostDropMeta);
} else {
initPostDropMeta();
}
})();