// Enhanced navigation functionality let activeDropdown = null; function init() { setupDropdownNavigation(); setupMobileMenuImprovement(); setupKeyboardNavigation(); } function teardown() { // Remove event listeners document.removeEventListener('click', handleDocumentClick); // Remove dropdown event listeners const dropdownToggles = document.querySelectorAll('.group button'); dropdownToggles.forEach(toggle => { toggle.removeEventListener('click', handleDropdownToggle); toggle.removeEventListener('keydown', handleDropdownKeydown); }); } function setupDropdownNavigation() { const dropdownToggles = document.querySelectorAll('.group button'); dropdownToggles.forEach(toggle => { toggle.addEventListener('click', handleDropdownToggle); toggle.addEventListener('keydown', handleDropdownKeydown); }); // Close dropdowns when clicking outside document.addEventListener('click', handleDocumentClick); } function handleDropdownToggle(event) { event.preventDefault(); event.stopPropagation(); const group = event.currentTarget.closest('.group'); const dropdown = group.querySelector('div[class*="absolute"]'); // Close other dropdowns if (activeDropdown && activeDropdown !== dropdown) { closeDropdown(activeDropdown); } // Toggle current dropdown if (dropdown.classList.contains('opacity-0')) { openDropdown(dropdown); activeDropdown = dropdown; } else { closeDropdown(dropdown); activeDropdown = null; } } function openDropdown(dropdown) { dropdown.classList.remove('opacity-0', 'invisible', 'translate-y-2'); dropdown.classList.add('opacity-100', 'visible', 'translate-y-0'); } function closeDropdown(dropdown) { dropdown.classList.add('opacity-0', 'invisible', 'translate-y-2'); dropdown.classList.remove('opacity-100', 'visible', 'translate-y-0'); } function handleDocumentClick(event) { if (activeDropdown && !event.target.closest('.group')) { closeDropdown(activeDropdown); activeDropdown = null; } } function handleDropdownKeydown(event) { if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); handleDropdownToggle(event); } else if (event.key === 'Escape' && activeDropdown) { closeDropdown(activeDropdown); activeDropdown = null; event.currentTarget.focus(); } } function setupMobileMenuImprovement() { const mobileMenuButton = document.querySelector('[data-landingsite-mobile-menu-toggle]'); const mobileMenu = document.querySelector('[data-landingsite-mobile-menu]'); if (mobileMenuButton && mobileMenu) { // Improve mobile menu accessibility mobileMenuButton.setAttribute('aria-expanded', 'false'); mobileMenuButton.setAttribute('aria-controls', 'mobile-menu'); mobileMenu.setAttribute('id', 'mobile-menu'); } } function setupKeyboardNavigation() { // Add keyboard navigation for dropdown items const dropdownItems = document.querySelectorAll('.group div[class*="absolute"] a'); dropdownItems.forEach((item, index, items) => { item.addEventListener('keydown', (event) => { if (event.key === 'ArrowDown') { event.preventDefault(); const nextItem = items[index + 1]; if (nextItem) nextItem.focus(); } else if (event.key === 'ArrowUp') { event.preventDefault(); const prevItem = items[index - 1]; if (prevItem) { prevItem.focus(); } else { // Focus back on the dropdown toggle const group = item.closest('.group'); const toggle = group.querySelector('button'); if (toggle) toggle.focus(); } } else if (event.key === 'Escape') { event.preventDefault(); const group = item.closest('.group'); const toggle = group.querySelector('button'); const dropdown = group.querySelector('div[class*="absolute"]'); closeDropdown(dropdown); activeDropdown = null; if (toggle) toggle.focus(); } }); }); } // Export functions for the site system export { init, teardown };