/** * Dota 2 Arena — поведение хедера (порт логики React site-header.tsx): * выпадающие меню (hover + click, закрытие по клику вне), мобильное меню. */ (function () { "use strict"; var header = document.querySelector("[data-site-header]"); if (!header) return; /* ---------- Desktop dropdowns ---------- */ var groups = header.querySelectorAll("[data-nav-group]"); function closeGroup(group) { var dd = group.querySelector("[data-nav-dropdown]"); var btn = group.querySelector("[data-nav-toggle]"); if (dd) dd.classList.add("hidden"); if (btn) { btn.setAttribute("aria-expanded", "false"); var chev = btn.querySelector("svg:last-of-type"); if (chev) chev.classList.remove("rotate-180"); } } function openGroup(group) { groups.forEach(function (g) { if (g !== group) closeGroup(g); }); var dd = group.querySelector("[data-nav-dropdown]"); var btn = group.querySelector("[data-nav-toggle]"); if (dd) dd.classList.remove("hidden"); if (btn) { btn.setAttribute("aria-expanded", "true"); var chev = btn.querySelector("svg:last-of-type"); if (chev) chev.classList.add("rotate-180"); } } groups.forEach(function (group) { var btn = group.querySelector("[data-nav-toggle]"); group.addEventListener("mouseenter", function () { openGroup(group); }); group.addEventListener("mouseleave", function () { closeGroup(group); }); if (btn) { btn.addEventListener("click", function () { var expanded = btn.getAttribute("aria-expanded") === "true"; if (expanded) { closeGroup(group); } else { openGroup(group); } }); } }); document.addEventListener("mousedown", function (e) { var nav = header.querySelector("[data-desktop-nav]"); if (nav && !nav.contains(e.target)) { groups.forEach(closeGroup); } }); /* ---------- Footer mobile accordions ---------- */ document.querySelectorAll("[data-footer-group]").forEach(function (group) { var btn = group.querySelector("[data-footer-toggle]"); var panel = group.querySelector("[data-footer-panel]"); if (!btn || !panel) return; btn.addEventListener("click", function () { var open = btn.getAttribute("aria-expanded") === "true"; btn.setAttribute("aria-expanded", open ? "false" : "true"); panel.classList.toggle("hidden", open); var chev = btn.querySelector("svg"); if (chev) chev.classList.toggle("rotate-180", !open); }); }); /* ---------- Mobile menu ---------- */ var toggle = header.querySelector("[data-mobile-toggle]"); var mobileMenu = header.querySelector("[data-mobile-menu]"); if (toggle && mobileMenu) { toggle.addEventListener("click", function () { var open = toggle.getAttribute("aria-expanded") === "true"; toggle.setAttribute("aria-expanded", open ? "false" : "true"); mobileMenu.classList.toggle("hidden", open); mobileMenu.classList.toggle("grid", !open); var iconMenu = toggle.querySelector("[data-icon-menu]"); var iconClose = toggle.querySelector("[data-icon-close]"); if (iconMenu) iconMenu.classList.toggle("hidden", !open); if (iconClose) iconClose.classList.toggle("hidden", open); }); } })(); /** * Back to top — глобально для всех страниц (порт common/back-to-top.tsx). * Страничные скрипты (home.js, news.js, news-single.js) пропускают инициализацию * по флагу data-btt-init, чтобы не вешать второй scroll-слушатель. */ (function () { "use strict"; var btn = document.querySelector("[data-back-to-top]"); if (!btn || btn.dataset.bttInit) return; btn.dataset.bttInit = "1"; var reduceMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches; var shown = false; var ticking = false; function apply(show) { if (show === shown) return; shown = show; btn.tabIndex = show ? 0 : -1; btn.setAttribute("aria-hidden", show ? "false" : "true"); btn.classList.toggle("pointer-events-auto", show); btn.classList.toggle("scale-100", show); btn.classList.toggle("opacity-75", show); btn.classList.toggle("pointer-events-none", !show); btn.classList.toggle("scale-[0.94]", !show); btn.classList.toggle("opacity-0", !show); } function onScroll() { if (ticking) return; ticking = true; requestAnimationFrame(function () { apply(window.scrollY > Math.max(900, window.innerHeight * 1.5)); ticking = false; }); } onScroll(); window.addEventListener("scroll", onScroll, { passive: true }); btn.addEventListener("click", function () { window.scrollTo({ top: 0, behavior: reduceMotion ? "auto" : "smooth" }); }); })();