/** * Armchair Brigade — Navigation & Account Dropdown Controller */ (function () { 'use strict'; function initNav() { const nav = document.getElementById('siteNav'); const toggle = document.getElementById('navToggle'); const links = document.getElementById('navLinks'); const dropdown = document.getElementById('navAccountDropdown'); const dropdownToggle = document.getElementById('accountDropdownToggle'); const dropdownMenu = document.getElementById('accountDropdownMenu'); const signoutBtn = document.getElementById('nav-item-signout'); /* 1. Navbar scroll styling */ if (nav) { const handleScroll = () => { nav.classList.toggle('scrolled', window.scrollY > 10); }; window.addEventListener('scroll', handleScroll, { passive: true }); handleScroll(); } /* 2. Mobile hamburger menu */ if (toggle && links) { toggle.addEventListener('click', (e) => { e.stopPropagation(); const isOpen = links.classList.toggle('open'); toggle.setAttribute('aria-expanded', isOpen ? 'true' : 'false'); }); } /* 3. Account Dropdown Menu */ if (dropdown && dropdownToggle && dropdownMenu) { let closeTimeout = null; const openMenu = () => { if (closeTimeout) clearTimeout(closeTimeout); dropdown.classList.add('is-open'); dropdownToggle.setAttribute('aria-expanded', 'true'); }; const closeMenu = () => { if (closeTimeout) clearTimeout(closeTimeout); dropdown.classList.remove('is-open'); dropdownToggle.setAttribute('aria-expanded', 'false'); }; const toggleMenu = () => { if (dropdown.classList.contains('is-open')) { closeMenu(); } else { openMenu(); } }; // Click to toggle dropdownToggle.addEventListener('click', (e) => { e.preventDefault(); e.stopPropagation(); toggleMenu(); }); // Desktop hover support dropdown.addEventListener('mouseenter', () => { if (window.innerWidth > 768) { openMenu(); } }); dropdown.addEventListener('mouseleave', () => { if (window.innerWidth > 768) { closeTimeout = setTimeout(closeMenu, 180); } }); // Click outside to close document.addEventListener('click', (e) => { if (!dropdown.contains(e.target)) { closeMenu(); } }); // Keyboard accessibility (WCAG / a11y) dropdown.addEventListener('keydown', (e) => { const menuItems = Array.from(dropdownMenu.querySelectorAll('[role="menuitem"]')); const currentIndex = menuItems.indexOf(document.activeElement); if (e.key === 'Escape') { closeMenu(); dropdownToggle.focus(); } else if (e.key === 'ArrowDown') { e.preventDefault(); if (!dropdown.classList.contains('is-open')) { openMenu(); menuItems[0]?.focus(); } else { const nextIndex = (currentIndex + 1) % menuItems.length; menuItems[nextIndex]?.focus(); } } else if (e.key === 'ArrowUp') { e.preventDefault(); if (dropdown.classList.contains('is-open')) { const prevIndex = (currentIndex - 1 + menuItems.length) % menuItems.length; menuItems[prevIndex]?.focus(); } } else if (e.key === 'Tab' && dropdown.classList.contains('is-open')) { if (e.shiftKey && document.activeElement === menuItems[0]) { closeMenu(); } else if (!e.shiftKey && document.activeElement === menuItems[menuItems.length - 1]) { closeMenu(); } } }); } /* 4. Signout Action */ if (signoutBtn) { signoutBtn.addEventListener('click', (e) => { e.preventDefault(); showToast('Signed out successfully. Returning to Home...'); setTimeout(() => { window.location.href = 'index.html'; }, 1200); }); } } /* Toast Notification Helper */ function showToast(message) { let toast = document.getElementById('siteToast'); if (!toast) { toast = document.createElement('div'); toast.id = 'siteToast'; toast.className = 'site-toast'; document.body.appendChild(toast); } toast.innerHTML = ` ${message} `; toast.classList.add('show'); setTimeout(() => { toast.classList.remove('show'); }, 3200); } window.showToast = showToast; if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initNav); } else { initNav(); } })();