Files
2026-etpgrf-site/public/static/js/base.js

166 lines
6.3 KiB
JavaScript

(function () {
"use strict";
// --- АВТОМАТИЧЕСКОЕ ПЕРЕКЛЮЧЕНИЕ ТЕМЫ (Dark/Light) ---
const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
function updateTheme(e) {
const theme = e.matches ? 'dark' : 'light';
document.documentElement.setAttribute('data-bs-theme', theme);
}
// Установить при загрузке
updateTheme(darkModeMediaQuery);
// Слушать изменения
darkModeMediaQuery.addEventListener('change', updateTheme);
// --- ЛОГОТИП И СКРОЛЛ ---
function updateLogo() {
const navbar = document.getElementById('logo');
if (!navbar) return;
const scrollY = window.scrollY;
// Гистерезис: включаем после 60px, выключаем до 10px
// Это предотвращает дребезг на границе
if (scrollY > 60) {
navbar.classList.remove('logo-big');
} else if (scrollY < 10) {
navbar.classList.add('logo-big');
}
}
// Инициализация логотипа при загрузке и скролле
window.addEventListener('scroll', updateLogo, { passive: true });
// --- МОБИЛЬНОЕ МЕНЮ (Скрытие логотипа при открытии) ---
document.addEventListener('DOMContentLoaded', function() {
const navbarNav = document.getElementById('navbarNav');
const navbarBrand = document.querySelector('.navbar-brand');
if (navbarNav && navbarBrand) {
navbarNav.addEventListener('show.bs.collapse', function () {
navbarBrand.style.opacity = '0';
navbarBrand.style.transition = 'opacity 0.3s ease';
});
navbarNav.addEventListener('hide.bs.collapse', function () {
navbarBrand.style.opacity = '1';
});
}
});
// --- КУКИ И СЧЕТЧИКИ ---
const COOKIE_KEY = 'cookie_consent';
const TTL_MS = 90 * 24 * 60 * 60 * 1000; // 90 дней
const MAILRU_ID = "3734603";
const YANDEX_ID = "106310834";
const GOOGLE_ID = "G-03WY2S9FXB";
function loadCounters() {
// console.log("Загрузка счетчиков...");
try {
// Mail.ru
var _tmr = window._tmr || (window._tmr = []);
_tmr.push({id: MAILRU_ID, type: "pageView", start: (new Date()).getTime()});
(function (d, w, id) {
if (d.getElementById(id)) return;
var ts = d.createElement("script"); ts.type = "text/javascript"; ts.async = true; ts.id = id;
ts.src = "https://top-fwz1.mail.ru/js/code.js";
var f = d.getElementsByTagName("script")[0]; f.parentNode.insertBefore(ts, f);
})(document, window, "topmailru-code");
// Яндекс.Метрика
(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
m[i].l=1*new Date();
for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }}
k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
window.ym(YANDEX_ID, "init", {
clickmap:true,
trackLinks:true,
accurateTrackBounce:true
});
// Google Analytics
(function() {
var script = document.createElement('script');
script.async = true;
script.src = 'https://www.googletagmanager.com/gtag/js?id=' + GOOGLE_ID;
document.head.appendChild(script);
})();
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
// Делаем gtag глобальной, чтобы вызывать из sendGoal
window.gtag = gtag;
gtag('js', new Date());
gtag('config', GOOGLE_ID);
} catch (e) {
console.error("Ошибка загрузки счетчиков:", e);
}
}
function checkConsent() {
try {
const stored = localStorage.getItem(COOKIE_KEY);
if (!stored) return false;
const data = JSON.parse(stored);
const now = Date.now();
if (now - data.timestamp > TTL_MS) {
localStorage.removeItem(COOKIE_KEY);
return false;
}
return true;
} catch (e) {
return false;
}
}
// Инициализация куки-баннера
document.addEventListener('DOMContentLoaded', function() {
const banner = document.getElementById('cookie-banner');
const acceptButton = document.getElementById('cookie-accept');
if (banner && acceptButton) {
if (checkConsent()) {
loadCounters();
} else {
banner.style.display = 'block';
}
acceptButton.addEventListener('click', function () {
const data = { value: true, timestamp: Date.now() };
localStorage.setItem(COOKIE_KEY, JSON.stringify(data));
banner.style.display = 'none';
loadCounters();
});
}
});
// Глобальная функция для отправки целей
window.sendGoal = function(goalName) {
if (!checkConsent()) return;
// console.log("Sending goal:", goalName);
try {
// Mail.ru
if (window._tmr) {
window._tmr.push({ id: MAILRU_ID, type: "reachGoal", goal: goalName, value: 1 });
}
// Яндекс.Метрика
if (typeof window.ym === 'function') {
window.ym(YANDEX_ID, 'reachGoal', goalName);
}
// Google Analytics
if (typeof window.gtag === 'function') {
window.gtag('event', goalName);
}
} catch (e) {
console.error("Ошибка отправки цели:", e);
}
};
})();