72 lines
2.4 KiB
JavaScript
72 lines
2.4 KiB
JavaScript
(() => {
|
|
const initMobileSheet = () => {
|
|
const sheet = document.querySelector("[data-mobile-sheet]");
|
|
const navStack = document.querySelector("[data-mobile-nav-stack]");
|
|
const openButtons = document.querySelectorAll("[data-mobile-sheet-open]");
|
|
if (!sheet || !navStack || !openButtons.length) return;
|
|
|
|
const closeSheet = () => {
|
|
sheet.hidden = true;
|
|
navStack.classList.remove("is-open");
|
|
openButtons.forEach((button) => button.classList.remove("is-open"));
|
|
};
|
|
|
|
const openSheet = () => {
|
|
sheet.hidden = false;
|
|
navStack.classList.add("is-open");
|
|
openButtons.forEach((button) => button.classList.add("is-open"));
|
|
};
|
|
|
|
const toggleSheet = () => {
|
|
if (sheet.hidden) {
|
|
openSheet();
|
|
} else {
|
|
closeSheet();
|
|
}
|
|
};
|
|
|
|
openButtons.forEach((button) => {
|
|
button.addEventListener("click", toggleSheet);
|
|
});
|
|
|
|
document.addEventListener("keydown", (event) => {
|
|
if (event.key === "Escape") {
|
|
closeSheet();
|
|
}
|
|
});
|
|
|
|
sheet.querySelectorAll("a").forEach((link) => {
|
|
link.addEventListener("click", closeSheet);
|
|
});
|
|
sheet.querySelectorAll("button[data-theme-toggle]").forEach((button) => {
|
|
button.addEventListener("click", closeSheet);
|
|
});
|
|
};
|
|
|
|
const initFilterInputs = () => {
|
|
document.querySelectorAll("[data-filter-input]").forEach((input) => {
|
|
const listSelector = input.getAttribute("data-filter-target");
|
|
if (!listSelector) return;
|
|
const container = document.querySelector(listSelector);
|
|
if (!container) return;
|
|
|
|
const items = Array.from(container.querySelectorAll("[data-filter-label]"));
|
|
const applyFilter = () => {
|
|
const term = input.value.trim().toLowerCase();
|
|
items.forEach((item) => {
|
|
const haystack = (item.getAttribute("data-filter-label") || "").toLowerCase();
|
|
item.hidden = Boolean(term) && !haystack.includes(term);
|
|
});
|
|
};
|
|
|
|
input.addEventListener("input", applyFilter);
|
|
applyFilter();
|
|
});
|
|
};
|
|
|
|
document.addEventListener("DOMContentLoaded", () => {
|
|
initMobileSheet();
|
|
initFilterInputs();
|
|
});
|
|
})();
|