Files
mal/static/js/anime.js

51 lines
1.5 KiB
JavaScript

// static/js/anime.ts
(() => {
const parseClassList = (value) => {
if (!value) {
return [];
}
return value.split(" ").map((entry) => entry.trim()).filter((entry) => entry.length > 0);
};
const setMenuState = (menu, isOpen) => {
const openClasses = parseClassList(menu.getAttribute("data-dropdown-open-classes"));
const closedClasses = parseClassList(menu.getAttribute("data-dropdown-closed-classes"));
if (isOpen) {
menu.classList.remove(...closedClasses);
menu.classList.add(...openClasses);
return;
}
menu.classList.remove(...openClasses);
menu.classList.add(...closedClasses);
};
const toggleDropdown = () => {
const dropdown = document.getElementById("watchlist-dropdown");
if (!dropdown) {
return;
}
const isOpen = !dropdown.classList.contains("open");
dropdown.classList.toggle("open", isOpen);
const menu = dropdown.querySelector("[data-dropdown-menu]");
if (menu instanceof HTMLElement) {
setMenuState(menu, isOpen);
}
};
window.toggleDropdown = toggleDropdown;
document.addEventListener("click", (event) => {
const dropdown = document.getElementById("watchlist-dropdown");
if (!dropdown) {
return;
}
const target = event.target;
if (!(target instanceof Node)) {
return;
}
if (!dropdown.contains(target)) {
dropdown.classList.remove("open");
const menu = dropdown.querySelector("[data-dropdown-menu]");
if (menu instanceof HTMLElement) {
setMenuState(menu, false);
}
}
});
})();