/** * Horizontal Scroll Nav Component * Pill-style category buttons in a horizontal scroller */ class HorizontalScrollNav extends HTMLElement { constructor() { super(); this.attachShadow({ mode: "open" }); this.categories = [ { id: "all", label: "All", active: true }, { id: "fiction", label: "Fiction", active: false }, { id: "non-fiction", label: "Non-Fiction", active: false }, { id: "mystery", label: "Mystery", active: false }, { id: "romance", label: "Romance", active: false }, { id: "sci-fi", label: "Sci-Fi", active: false }, { id: "biography", label: "Biography", active: false }, { id: "history", label: "History", active: false }, ]; } connectedCallback() { this.render(); this.addEventListeners(); } addEventListeners() { const buttons = this.shadowRoot.querySelectorAll(".nav-pill"); buttons.forEach((button) => { button.addEventListener("click", (e) => { this.setActiveCategory(e.target.dataset.id); }); }); } setActiveCategory(id) { this.categories = this.categories.map((cat) => ({ ...cat, active: cat.id === id, })); this.render(); this.addEventListeners(); // Dispatch custom event for parent components this.dispatchEvent( new CustomEvent("category-change", { detail: { categoryId: id }, bubbles: true, composed: true, }) ); } render() { this.shadowRoot.innerHTML = ` `; } } customElements.define("horizontal-scroll-nav", HorizontalScrollNav);