Goondex/internal/web/static/css/gx/GX_SelectMenu.js
Stu Leak 16fb407a3c v0.1.0-dev4: Add web frontend with UI component library
- 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>
2025-11-17 10:47:30 -05:00

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");
}
});