- Implement full web interface with Go html/template server - Add GX component library (buttons, dialogs, tables, forms, etc.) - Create scene/performer/studio/movie detail and listing pages - Add Adult Empire scraper for additional metadata sources - Implement movie support with database schema - Add import and sync services for data management - Include comprehensive API and frontend documentation - Add custom color scheme and responsive layout 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
79 lines
2.2 KiB
JavaScript
79 lines
2.2 KiB
JavaScript
document.querySelectorAll(".gx-select").forEach(select => {
|
|
const trigger = select.querySelector(".gx-select-trigger");
|
|
const menu = select.querySelector(".gx-select-menu");
|
|
const valueElement = select.querySelector(".gx-select-value");
|
|
const items = menu.querySelectorAll(".gx-select-item");
|
|
|
|
let open = false;
|
|
let index = -1;
|
|
|
|
/* OPEN/CLOSE */
|
|
trigger.addEventListener("click", () => toggleMenu());
|
|
|
|
function toggleMenu() {
|
|
open = !open;
|
|
select.classList.toggle("open", open);
|
|
|
|
if (open) {
|
|
index = -1;
|
|
positionMenu();
|
|
}
|
|
}
|
|
|
|
/* SMART POSITIONING */
|
|
function positionMenu() {
|
|
const rect = menu.getBoundingClientRect();
|
|
if (rect.bottom > window.innerHeight) {
|
|
menu.style.top = "auto";
|
|
menu.style.bottom = "calc(100% + 6px)";
|
|
}
|
|
}
|
|
|
|
/* ITEM CLICK */
|
|
items.forEach((item, i) => {
|
|
item.addEventListener("click", () => {
|
|
items.forEach(i => i.classList.remove("selected"));
|
|
item.classList.add("selected");
|
|
valueElement.textContent = item.textContent;
|
|
|
|
select.dataset.value = item.dataset.value;
|
|
toggleMenu();
|
|
});
|
|
});
|
|
|
|
/* CLICK OUTSIDE */
|
|
document.addEventListener("click", e => {
|
|
if (!select.contains(e.target)) {
|
|
select.classList.remove("open");
|
|
open = false;
|
|
}
|
|
});
|
|
|
|
/* KEYBOARD NAVIGATION */
|
|
trigger.addEventListener("keydown", e => {
|
|
if (!open && (e.key === "ArrowDown" || e.key === "Enter")) {
|
|
toggleMenu();
|
|
return;
|
|
}
|
|
|
|
if (!open) return;
|
|
|
|
if (e.key === "ArrowDown") {
|
|
index = (index + 1) % items.length;
|
|
highlight();
|
|
} else if (e.key === "ArrowUp") {
|
|
index = (index - 1 + items.length) % items.length;
|
|
highlight();
|
|
} else if (e.key === "Enter") {
|
|
if (index >= 0) items[index].click();
|
|
} else if (e.key === "Escape") {
|
|
toggleMenu();
|
|
}
|
|
});
|
|
|
|
function highlight() {
|
|
items.forEach(i => i.classList.remove("selected"));
|
|
if (index >= 0) items[index].classList.add("selected");
|
|
}
|
|
});
|