document.documentElement.classList.add("js");
const toggle = document.querySelector(".menu-toggle");
const nav = document.querySelector(".main-nav");
if (toggle && nav) {
toggle.addEventListener("click", () => {
const isOpen = nav.classList.toggle("open");
toggle.setAttribute("aria-expanded", String(isOpen));
});
}
document.querySelectorAll(".main-nav a").forEach((link) => {
link.addEventListener("click", () => {
if (nav) {
nav.classList.remove("open");
}
if (toggle) {
toggle.setAttribute("aria-expanded", "false");
}
});
});
document.addEventListener("keydown", (event) => {
if (event.key === "Escape" && nav?.classList.contains("open")) {
nav.classList.remove("open");
toggle?.setAttribute("aria-expanded", "false");
toggle?.focus();
}
});
const revealItems = document.querySelectorAll(".reveal");
const reduceMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
if (reduceMotion || !("IntersectionObserver" in window)) {
revealItems.forEach((item) => item.classList.add("is-visible"));
} else {
const observer = new IntersectionObserver(
(entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
entry.target.classList.add("is-visible");
observer.unobserve(entry.target);
}
});
},
{ threshold: 0.16 }
);
revealItems.forEach((item) => observer.observe(item));
}
const testimonialCarousel = document.querySelector("[data-testimonial-carousel]");
if (testimonialCarousel) {
const track = testimonialCarousel.querySelector(".testimonial-track");
const slides = Array.from(testimonialCarousel.querySelectorAll("[data-testimonial-slide]"));
const dots = Array.from(testimonialCarousel.querySelectorAll("[data-testimonial-dot]"));
const prev = testimonialCarousel.querySelector("[data-testimonial-prev]");
const next = testimonialCarousel.querySelector("[data-testimonial-next]");
let currentSlide = 0;
const setSlide = (index) => {
if (!track || slides.length === 0) return;
currentSlide = (index + slides.length) % slides.length;
track.style.transform = `translateX(-${currentSlide * 100}%)`;
slides.forEach((slide, slideIndex) => {
slide.setAttribute("aria-hidden", String(slideIndex !== currentSlide));
});
dots.forEach((dot, dotIndex) => {
const isActive = dotIndex === currentSlide;
dot.classList.toggle("is-active", isActive);
dot.setAttribute("aria-current", isActive ? "true" : "false");
});
};
prev?.addEventListener("click", () => setSlide(currentSlide - 1));
next?.addEventListener("click", () => setSlide(currentSlide + 1));
dots.forEach((dot, dotIndex) => {
dot.addEventListener("click", () => setSlide(dotIndex));
});
testimonialCarousel.addEventListener("keydown", (event) => {
if (event.key === "ArrowLeft") setSlide(currentSlide - 1);
if (event.key === "ArrowRight") setSlide(currentSlide + 1);
});
setSlide(0);
}