(() => { const menuButton = document.querySelector('[data-menu-button]'); const menu = document.querySelector('[data-menu]'); if (menuButton && menu) { menuButton.addEventListener('click', () => { const isOpen = menu.classList.toggle('open'); menuButton.setAttribute('aria-expanded', String(isOpen)); }); menu.querySelectorAll('a').forEach((link) => { link.addEventListener('click', () => { menu.classList.remove('open'); menuButton.setAttribute('aria-expanded', 'false'); }); }); } const carousel = document.querySelector('[data-carousel]'); if (!carousel) return; const track = carousel.querySelector('[data-carousel-track]'); const slides = Array.from(carousel.querySelectorAll('[data-carousel-slide]')); const dots = Array.from(carousel.querySelectorAll('[data-carousel-dot]')); const previousButton = carousel.querySelector('[data-carousel-prev]'); const nextButton = carousel.querySelector('[data-carousel-next]'); const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; let currentIndex = 0; let timerId = null; const render = (index) => { currentIndex = (index + slides.length) % slides.length; track.style.transform = `translateX(-${currentIndex * 100}%)`; slides.forEach((slide, slideIndex) => { const active = slideIndex === currentIndex; slide.classList.toggle('active', active); slide.setAttribute('aria-hidden', String(!active)); }); dots.forEach((dot, dotIndex) => { const active = dotIndex === currentIndex; dot.classList.toggle('active', active); dot.setAttribute('aria-selected', String(active)); }); }; const stopTimer = () => { if (timerId !== null) { window.clearInterval(timerId); timerId = null; } }; const startTimer = () => { if (reduceMotion || slides.length < 2) return; stopTimer(); timerId = window.setInterval(() => render(currentIndex + 1), 6500); }; previousButton?.addEventListener('click', () => { render(currentIndex - 1); startTimer(); }); nextButton?.addEventListener('click', () => { render(currentIndex + 1); startTimer(); }); dots.forEach((dot) => { dot.addEventListener('click', () => { render(Number(dot.dataset.carouselDot)); startTimer(); }); }); carousel.addEventListener('mouseenter', stopTimer); carousel.addEventListener('mouseleave', startTimer); carousel.addEventListener('focusin', stopTimer); carousel.addEventListener('focusout', startTimer); carousel.addEventListener('keydown', (event) => { if (event.key === 'ArrowLeft') { event.preventDefault(); render(currentIndex - 1); } if (event.key === 'ArrowRight') { event.preventDefault(); render(currentIndex + 1); } }); render(0); startTimer(); })();