PageSourceSearch

https://mizl.ru/assets/js/main.js?v=1784807774

js mizl.ru collected 2026-10-05 00:30:36 UTC 5,098 bytes, 150 lines download raw bytes

1(function () {
2  var COOKIE_KEY = 'mizl_cookie_consent';
3  var banner = document.getElementById('cookie-banner');
4
5  function loadTracking() {
6    if (window.MizlTracking && typeof window.MizlTracking.load === 'function') {
7      window.MizlTracking.load();
8    }
9  }
10
11  /* Виджеты и счётчики — сразу; баннер только информирует, «Принимаю» скрывает его. */
12  document.documentElement.setAttribute('data-cookie-consent', 'all');
13  loadTracking();
14
15  if (banner) {
16    var dismissed = false;
17    try {
18      dismissed = localStorage.getItem(COOKIE_KEY) === 'all';
19    } catch (e) {}
20
21    function dismissBanner() {
22      try {
23        localStorage.setItem(COOKIE_KEY, 'all');
24      } catch (e) {}
25      banner.hidden = true;
26      loadTracking();
27    }
28
29    banner.hidden = dismissed;
30
31    var accept = banner.querySelector('[data-cookie-accept]');
32    if (accept) {
33      accept.addEventListener('click', dismissBanner);
34    }
35  }
36
37  var toggle = document.querySelector('.nav-toggle');
38  var nav = document.getElementById('site-nav');
39  if (toggle && nav) {
40    toggle.addEventListener('click', function () {
41      var open = toggle.getAttribute('aria-expanded') === 'true';
42      toggle.setAttribute('aria-expanded', open ? 'false' : 'true');
43      nav.classList.toggle('is-open', !open);
44    });
45    nav.querySelectorAll('a').forEach(function (link) {
46      link.addEventListener('click', function () {
47        toggle.setAttribute('aria-expanded', 'false');
48        nav.classList.remove('is-open');
49      });
50    });
51  }
52
53  var reduceMotion = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
54
55  /* Hero hierarchy enters as one staged composition. */
56  var hero = document.querySelector('.home-hero');
57  if (hero) {
58    hero.classList.add('is-staging');
59    if (reduceMotion) {
60      hero.classList.add('is-ready');
61    } else {
62      requestAnimationFrame(function () {
63        requestAnimationFrame(function () {
64          hero.classList.add('is-ready');
65        });
66      });
67
68      hero.addEventListener('pointermove', function (event) {
69        if (event.pointerType === 'touch') return;
70        var x = event.clientX / Math.max(window.innerWidth, 1) - 0.5;
71        var y = event.clientY / Math.max(window.innerHeight, 1) - 0.5;
72        hero.style.setProperty('--hero-x', (x * 12).toFixed(2) + 'px');
73        hero.style.setProperty('--hero-y', (y * 8).toFixed(2) + 'px');
74      });
75      hero.addEventListener('pointerleave', function () {
76        hero.style.setProperty('--hero-x', '0px');
77        hero.style.setProperty('--hero-y', '0px');
78      });
79    }
80  }
81
82  /* Presence: staggered fade/slide into view. */
83  var reveals = document.querySelectorAll('.reveal');
84  var staggerParents = [
85    '.home-outcomes__grid',
86    '.home-clients__grid',
87    '.home-process__steps',
88    '.home-pillars__grid',
89    '.home-svc-grid'
90  ];
91  staggerParents.forEach(function (sel) {
92    document.querySelectorAll(sel).forEach(function (grid) {
93      var kids = grid.querySelectorAll(':scope > .reveal, :scope > .home-outcome.reveal, :scope > .home-client.reveal, :scope > .home-process__step.reveal, :scope > .home-pillar.reveal, :scope > .home-svc-card');
94      if (!kids.length) {
95        kids = grid.children;
96      }
97      Array.prototype.forEach.call(kids, function (el, i) {
98        if (!el.classList.contains('reveal')) {
99          el.classList.add('reveal');
100        }
101        el.style.setProperty('--reveal-delay', Math.min(i * 70, 420) + 'ms');
102      });
103    });
104  });
105
106  if (reveals.length && 'IntersectionObserver' in window) {
107    var io = new IntersectionObserver(
108      function (entries) {
109        entries.forEach(function (entry) {
110          if (entry.isIntersecting) {
111            entry.target.classList.add('is-in');
112            io.unobserve(entry.target);
113          }
114        });
115      },
116      { rootMargin: '0px 0px -8% 0px', threshold: 0.1 }
117    );
118    document.querySelectorAll('.reveal').forEach(function (el) {
119      io.observe(el);
120    });
121  } else {
122    document.querySelectorAll('.reveal').forEach(function (el) {
123      el.classList.add('is-in');
124    });
125  }
126
127  var footerTop = document.getElementById('footer-top');
128  if (footerTop) {
129    footerTop.addEventListener('click', function () {
130      window.scrollTo({ top: 0, behavior: reduceMotion ? 'auto' : 'smooth' });
131    });
132
133    if ('IntersectionObserver' in window) {
134      var topSentinel = document.createElement('span');
135      topSentinel.setAttribute('aria-hidden', 'true');
136      topSentinel.style.cssText = 'position:absolute;top:320px;left:0;width:1px;height:1px;pointer-events:none;';
137      document.body.appendChild(topSentinel);
138
139      var topObserver = new IntersectionObserver(function (entries) {
140        var entry = entries[0];
141        var show = !entry.isIntersecting && entry.boundingClientRect.top < 0;
142        footerTop.classList.toggle('is-visible', show);
143        footerTop.hidden = !show;
144      });
145      topObserver.observe(topSentinel);
146    } else {
147      footerTop.hidden = false;
148    }
149  }
150})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.