50 lines
1.7 KiB
JavaScript
50 lines
1.7 KiB
JavaScript
(() => {
|
|
"use strict";
|
|
|
|
const toggle = document.querySelector("[data-nav-toggle]");
|
|
const nav = document.getElementById("site-nav");
|
|
const scrim = document.querySelector("[data-nav-scrim]");
|
|
|
|
function setOpen(open) {
|
|
if (!nav || !toggle) return;
|
|
nav.dataset.open = open ? "true" : "false";
|
|
toggle.setAttribute("aria-expanded", open ? "true" : "false");
|
|
if (scrim) scrim.hidden = !open;
|
|
document.body.style.overflow = open ? "hidden" : "";
|
|
if (open) {
|
|
const first = nav.querySelector("a");
|
|
if (first) first.focus({ preventScroll: true });
|
|
} else {
|
|
toggle.focus({ preventScroll: true });
|
|
}
|
|
}
|
|
|
|
function isOpen() {
|
|
return !!nav && nav.dataset.open === "true";
|
|
}
|
|
|
|
if (toggle && nav) {
|
|
if (nav.dataset.open !== "true") nav.dataset.open = "false";
|
|
toggle.addEventListener("click", () => setOpen(!isOpen()));
|
|
document.addEventListener("keydown", (event) => {
|
|
if (event.key === "Escape" && isOpen()) setOpen(false);
|
|
});
|
|
}
|
|
if (scrim) scrim.addEventListener("click", () => setOpen(false));
|
|
|
|
// Active nav item for the current path (progressive enhancement only).
|
|
try {
|
|
const here = new URL(window.location.href).pathname.replace(/\/$/, "") || "/";
|
|
document.querySelectorAll(".site-nav a[href]").forEach((link) => {
|
|
const target = new URL(link.getAttribute("href"), window.location.origin).pathname.replace(/\/$/, "") || "/";
|
|
if (target === here) link.setAttribute("aria-current", "page");
|
|
});
|
|
} catch {
|
|
/* keep server-rendered navigation as is */
|
|
}
|
|
|
|
// Footer year (progressive enhancement only).
|
|
const year = document.querySelector("[data-year]");
|
|
if (year) year.textContent = String(new Date().getFullYear());
|
|
})();
|