(() => { document.querySelectorAll(".marquee-track").forEach((track) => { const group = track.querySelector(".marquee-group"); if (!group) return; const seed = group.innerHTML; let guard = 0; while (group.scrollWidth < window.innerWidth + 80 && guard < 12) { group.insertAdjacentHTML("beforeend", seed); guard += 1; } track.querySelectorAll(".marquee-group").forEach((g, i) => { if (i > 0) g.innerHTML = group.innerHTML; }); }); const nav = document.getElementById("nav"); const progress = document.getElementById("progress"); const toggle = document.getElementById("navToggle"); const reduce = window.matchMedia("(prefers-reduced-motion: reduce)").matches; const onScroll = () => { const max = document.documentElement.scrollHeight - window.innerHeight; const p = max > 0 ? window.scrollY / max : 0; progress.style.width = `${p * 100}%`; nav.classList.toggle("is-on", window.scrollY > 24); if (reduce) return; document.querySelectorAll("[data-parallax]").forEach((el) => { const speed = parseFloat(el.dataset.parallax) || 0; const rect = el.getBoundingClientRect(); const mid = rect.top + rect.height / 2 - window.innerHeight / 2; el.style.transform = `translate3d(0, ${mid * speed * -0.12}px, 0)`; }); }; window.addEventListener("scroll", onScroll, { passive: true }); onScroll(); toggle?.addEventListener("click", () => nav.classList.toggle("is-open")); nav.querySelectorAll(".nav-links a").forEach((a) => { a.addEventListener("click", () => nav.classList.remove("is-open")); }); const io = new IntersectionObserver( (entries) => { entries.forEach((e) => { if (e.isIntersecting) { e.target.classList.add("is-in"); io.unobserve(e.target); } }); }, { threshold: 0.12, rootMargin: "0px 0px -8% 0px" } ); document.querySelectorAll(".reveal").forEach((el) => io.observe(el)); const counter = document.getElementById("countMillion"); if (counter) { const target = 600; const format = (n) => `${Math.round(n)} млн ₽`; if (reduce) { counter.textContent = format(target); } else { const run = () => { const start = performance.now(); const dur = 1800; const tick = (t) => { const k = Math.min(1, (t - start) / dur); const ease = 1 - Math.pow(1 - k, 3); counter.textContent = format(Math.round(target * ease)); if (k < 1) requestAnimationFrame(tick); }; requestAnimationFrame(tick); }; const cio = new IntersectionObserver((entries) => { if (entries[0].isIntersecting) { run(); cio.disconnect(); } }); cio.observe(counter); } } const modal = document.getElementById("modal"); const player = document.getElementById("player"); const close = () => { modal.classList.remove("is-open"); player.pause(); player.removeAttribute("src"); player.load(); document.body.style.overflow = ""; }; const open = (src) => { player.src = src; modal.classList.add("is-open"); document.body.style.overflow = "hidden"; player.play().catch(() => {}); }; document.querySelectorAll("[data-video]").forEach((el) => { el.addEventListener("click", () => open(el.dataset.video)); }); document.getElementById("modalClose")?.addEventListener("click", close); modal?.addEventListener("click", (e) => { if (e.target === modal) close(); }); const lb = document.getElementById("lightbox"); const lbImg = document.getElementById("lightboxImg"); const lbCap = document.getElementById("lightboxCap"); let lbItems = []; let lbIndex = 0; const srcOf = (el) => el.dataset.src || el.getAttribute("href") || el.getAttribute("src") || ""; const showLb = () => { const el = lbItems[lbIndex]; if (!el) return; lbImg.src = srcOf(el); lbImg.alt = el.dataset.caption || ""; lbCap.textContent = el.dataset.caption || ""; }; const closeLb = () => { lb.classList.remove("is-open"); lbImg.removeAttribute("src"); if (!modal.classList.contains("is-open")) document.body.style.overflow = ""; }; const openLb = (el) => { const group = el.dataset.lightbox; lbItems = [...document.querySelectorAll(`[data-lightbox="${group}"]`)]; lbIndex = Math.max(0, lbItems.indexOf(el)); showLb(); lb.classList.add("is-open"); document.body.style.overflow = "hidden"; }; const stepLb = (dir) => { if (!lbItems.length) return; lbIndex = (lbIndex + dir + lbItems.length) % lbItems.length; showLb(); }; document.querySelectorAll("[data-lightbox]").forEach((el) => { el.addEventListener("click", (e) => { e.preventDefault(); openLb(el); }); el.addEventListener("keydown", (e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); openLb(el); } }); }); document.getElementById("lightboxClose")?.addEventListener("click", closeLb); document.getElementById("lightboxPrev")?.addEventListener("click", () => stepLb(-1)); document.getElementById("lightboxNext")?.addEventListener("click", () => stepLb(1)); lb?.addEventListener("click", (e) => { if (e.target === lb) closeLb(); }); window.addEventListener("keydown", (e) => { if (e.key === "Escape") { if (lb.classList.contains("is-open")) closeLb(); else close(); } if (!lb.classList.contains("is-open")) return; if (e.key === "ArrowRight") stepLb(1); if (e.key === "ArrowLeft") stepLb(-1); }); })();