(() => { const reduceMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches; const menuButton = document.querySelector(".menu-toggle"); const mobileMenu = document.querySelector(".mobile-menu"); if (menuButton && mobileMenu) { menuButton.addEventListener("click", () => { const isOpen = mobileMenu.classList.toggle("is-open"); menuButton.setAttribute("aria-expanded", String(isOpen)); menuButton.setAttribute("aria-label", isOpen ? "¸Þ´º ´Ý±â" : "¸Þ´º ¿­±â"); menuButton.querySelector("span").textContent = isOpen ? "X" : "|||"; }); mobileMenu.querySelectorAll("a").forEach((link) => link.addEventListener("click", () => { mobileMenu.classList.remove("is-open"); menuButton.setAttribute("aria-expanded", "false"); menuButton.querySelector("span").textContent = "|||"; })); } const hero = document.querySelector(".hero"); if (hero && !reduceMotion) { hero.addEventListener("pointermove", (event) => { if (event.pointerType === "touch") return; const bounds = hero.getBoundingClientRect(); hero.style.setProperty("--pointer-x", (((event.clientX - bounds.left) / bounds.width) * 100) + "%"); hero.style.setProperty("--pointer-y", (((event.clientY - bounds.top) / bounds.height) * 100) + "%"); hero.dataset.pointerActive = "true"; }); hero.addEventListener("pointerleave", () => { hero.dataset.pointerActive = "false"; }); } const counters = [...document.querySelectorAll(".count-number")]; const setFinalValues = () => counters.forEach((counter) => { counter.textContent = Number(counter.dataset.target || 0).toLocaleString("ko-KR"); }); const runCounters = () => { const startedAt = performance.now(); const duration = 1650; const tick = (now) => { const progress = Math.min((now - startedAt) / duration, 1); const eased = 1 - Math.pow(1 - progress, 4); counters.forEach((counter) => { counter.textContent = Math.round(Number(counter.dataset.target || 0) * eased).toLocaleString("ko-KR"); }); if (progress < 1) requestAnimationFrame(tick); }; requestAnimationFrame(tick); }; if (reduceMotion || !("IntersectionObserver" in window)) { setFinalValues(); } else { const facts = document.querySelector(".mini-facts"); if (facts) { const observer = new IntersectionObserver(([entry]) => { if (entry.isIntersecting) { runCounters(); observer.disconnect(); } }, { threshold: 0.35 }); observer.observe(facts); } } })();