1(function () { 2 const el = document.getElementById("footer-placeholder"); 3 if (!el) return; 4 const ready = el.children.length 5 ? Promise.resolve() 6 : fetch("/components/footer.html").then((r) => r.text()).then((html) => { el.innerHTML = html; }); 7 ready 8 .then(() => { 9 const dateEl = document.getElementById("date"); 10 if (dateEl) dateEl.textContent = new Date().getFullYear(); 11 }) 12 .catch((err) => console.error("Footer failed to load", err)); 13})(); 14 15(function () { 16 const el = document.getElementById("header-placeholder"); 17 if (!el) return; 18 const ready = el.children.length 19 ? Promise.resolve() 20 : fetch("/components/header.html").then((r) => r.text()).then((html) => { el.innerHTML = html; }); 21 ready.then(() => { 22 23 const cfg = window.HEADER_CONFIG || {}; 24 const activeLink = cfg.activeLink || ""; 25 const whiteHeader = cfg.whiteHeader || false; 26 const whiteLogo = cfg.whiteLogoOnLoad || false; 27 28 const header = document.getElementById("mainnavigationBar"); 29 if (!header) return; 30 31 // --- WHITE HEADER BG --- 32 if (whiteHeader) { 33 header.classList.remove("bg-transparent"); 34 header.classList.add("why-us-header"); 35 } 36 37 // --- LOGO SWAP --- 38 const whiteLogoEl = document.querySelector(".white-logo"); 39 const colorLogoEl = document.querySelector(".colored-logo"); 40 41 if (whiteLogo && whiteLogoEl && colorLogoEl) { 42 const isScrolledOnLoad = window.scrollY > 10; 43 whiteLogoEl.style.display = isScrolledOnLoad ? "none" : "block"; 44 colorLogoEl.style.display = isScrolledOnLoad ? "block" : "none"; 45 46 window.addEventListener("scroll", function () { 47 const isScrolled = window.scrollY > 10; 48 whiteLogoEl.style.display = isScrolled ? "none" : "block"; 49 colorLogoEl.style.display = isScrolled ? "block" : "none"; 50 }); 51 } 52 // --- ACTIVE LINK via data-menu --- 53 if (activeLink) { 54 document 55 .querySelectorAll(`.nav-list li[data-menu="${activeLink}"]`) 56 .forEach(function (li) { 57 const isMobile = li.closest(".mobile-menu") !== null; 58 59 // The clickable element â either <a> or <p> (for dropdowns) 60 const anchor = li.querySelector(":scope > a"); 61 const dropdown = li.querySelector(":scope > p"); 62 const target = anchor || dropdown; 63 if (!target) return; 64 65 target.classList.add("active"); 66 67 // Desktop only: wrap in nav-gradient-border span 68 if (!isMobile) { 69 const span = document.createElement("span"); 70 span.className = "nav-gradient-border"; 71 li.insertBefore(span, target); 72 span.appendChild(target); 73 } 74 }); 75 } 76 77 // --- MOBILE MENU --- 78 let btn = document.querySelector("button.mobile-menu-button"), 79 menu = document.querySelector(".mobile-menu"), 80 btnClose = document.querySelector(".navbar-toggle-close"); 81 82 if (btn && menu) { 83 btn.addEventListener("click", () => { 84 menu.classList.remove("hidden"); 85 menu.classList.add("open"); 86 }); 87 } 88 if (btnClose && menu) { 89 btnClose.addEventListener("click", () => { 90 menu.classList.add("hidden"); 91 menu.classList.remove("open"); 92 }); 93 } 94 95 // --- STICKY NAV --- 96 function handleScroll() { 97 var e = window.pageYOffset, 98 t = document.getElementById("top-nav"); 99 100 if (30 <= e) { 101 header.classList.add("nav-sticky", "header-nav-bg"); 102 t && 103 (t.classList.add("scale-y-0", "origin-top"), 104 t.classList.remove("scale-y-100")); 105 } else { 106 header.classList.remove("nav-sticky", "header-nav-bg"); 107 t && 108 (t.classList.remove("scale-y-0", "origin-top"), 109 t.classList.add("scale-y-100", "origin-top")); 110 } 111 } 112 113 // --- SUBMENU TOGGLE --- 114 document.querySelectorAll(".submenu-toggle").forEach((btn) => { 115 btn.addEventListener("click", function () { 116 const parent = this.closest(".menu-item"); 117 if (parent) parent.classList.toggle("active"); 118 }); 119 });
120 121 window.addEventListener("scroll", handleScroll); 122 handleScroll(); 123 }); 124})(); 125 126// ============================================================ 127// YEAR 128// ============================================================ 129// let date = new Date(), 130// year = date.getFullYear(); 131 132// if (document.getElementById("date")) { 133// document.getElementById("date").innerHTML = year; 134// } 135 136// ============================================================ 137// MARQUEE CLIENTS 138// ============================================================ 139if (null != document.querySelector("#clients")) { 140 let e = document.documentElement, 141 t = getComputedStyle(e).getPropertyValue("--marquee-elements-displayed"), 142 n = document.querySelector(".marquee-content"); 143 if (n) { 144 e.style.setProperty("--marquee-elements", n.children.length); 145 for (let i = 0; i < t; i++) n.appendChild(n.children[i].cloneNode(true)); 146 } 147} 148 149// ============================================================ 150// COUNTERS 151// ============================================================ 152let section_counter = document.querySelector("#counter"), 153 counters = document.querySelectorAll(".counter"); 154 155if (section_counter) { 156 let e = new IntersectionObserver( 157 (e, t) => { 158 var [e] = e; 159 e.isIntersecting && 160 (counters.forEach((n, e) => { 161 n.innerHTML = "0"; 162 let a = () => { 163 var e = +n.getAttribute("data-value"), 164 t = +n.innerHTML; 165 t < e 166 ? ((n.innerHTML = "" + Math.ceil(t + e / 5e3)), setTimeout(a, 1)) 167 : (n.innerHTML = e); 168 }; 169 (a(), 170 n.parentElement.style.animation 171 ? (n.parentElement.style.animation = "") 172 : (n.parentElement.style.animation = `slide-up 0.3s ease forwards ${e / counters.length + 1.5}s`)); 173 }), 174 t.unobserve(section_counter)); 175 }, 176 { root: null, threshold: 1 }, 177 ); 178 e.observe(section_counter); 179} 180 181let trusted_counter = document.querySelector("#counter_trusted"), 182 trusted_counters = document.querySelectorAll(".counterTrusted"); 183 184if (trusted_counter) { 185 let e = new IntersectionObserver( 186 (e, t) => { 187 var [e] = e; 188 e.isIntersecting && 189 (trusted_counters.forEach((n, e) => { 190 n.innerHTML = "0"; 191 let a = () => { 192 var e = +n.getAttribute("data-value"), 193 t = +n.innerHTML; 194 t < e 195 ? ((n.innerHTML = "" + Math.ceil(t + e / 5e3)), setTimeout(a, 1)) 196 : (n.innerHTML = e); 197 }; 198 (a(), 199 n.parentElement.style.animation 200 ? (n.parentElement.style.animation = "") 201 : (n.parentElement.style.animation = `slide-up 0.3s ease forwards ${e / trusted_counters.length + 1.5}s`)); 202 }), 203 t.unobserve(trusted_counter)); 204 }, 205 { root: null, threshold: 1 }, 206 ); 207 e.observe(trusted_counter); 208} 209 210let company_bar = document.querySelector("#company_bar"), 211 companyBarItem = document.querySelectorAll(".companyBar"); 212 213if (company_bar) { 214 let e = new IntersectionObserver( 215 (e, t) => { 216 var [e] = e; 217 e.isIntersecting && 218 (companyBarItem.forEach((n, e) => { 219 n.innerHTML = "0"; 220 let a = () => { 221 var e = +n.getAttribute("data-value"), 222 t = +n.innerHTML; 223 t < e 224 ? ((n.innerHTML = "" + Math.ceil(t + e / 5e3)), setTimeout(a, 1)) 225 : (n.innerHTML = e); 226 }; 227 (a(), 228 n.parentElement.style.animation 229 ? (n.parentElement.style.animation = "") 230 : (n.parentElement.style.animation = `slide-up 0.3s ease forwards ${e / companyBarItem.length + 1.5}s`)); 231 }), 232 t.unobserve(company_bar)); 233 }, 234 { root: null, threshold: 1 }, 235 ); 236 e.observe(company_bar); 237} 238 239// ============================================================ 240// FAQ ACCORDION 241// ============================================================ 242document.querySelectorAll(".faq-header").forEach((n) => { 243 n.addEventListener("click", (e) => { 244 let t = n.nextElementSibling; 245 if (!t || n.classList.contains("collapsing")) return; 246 if (n.classList.contains("open")) { 247 ((t.classList = "faq-body collapsing"), 248 setTimeout(() => { 249 t.style.height = "0px"; 250 }, 1), 251 setTimeout(() => { 252 ((t.classList = "faq-body close"), (t.style.height = "")); 253 }, 300)); 254 } else { 255 t.style.display = "block"; 256 let e = t.clientHeight; 257 (setTimeout(() => { 258 ((t.style.height = e + "px"), (t.style.display = "")); 259 }, 1), 260 (t.classList = "faq-body collapsing"), 261 setTimeout(() => { 262 t.classList = "faq-body close open"; 263 }, 300)); 264 } 265 n.classList.toggle("open"); 266 }); 267}); 268 269// ============================================================ 270// PRICING TOGGLE 271// ============================================================ 272var checkBox = document.getElementById("priceCheck"); 273function check() { 274 for ( 275 var e = document.getElementsByClassName("price-month"), 276 t = document.getElementsByClassName("price-year"), 277 n = 0; 278 n < e.length; 279 n++ 280 ) 281 !1 === checkBox.checked 282 ? ((e[n].style.display = "block"), (t[n].style.display = "none")) 283 : !0 === checkBox.checked && 284 ((e[n].style.display = "none"), (t[n].style.display = "block")); 285} 286if (checkBox) { 287 check(); 288 checkBox.addEventListener("click", check); 289} 290 291// ============================================================ 292// SWIPER 293// ============================================================ 294let testimoial = document.querySelector("#testionial") 295 ? new Swiper("#testionial", { 296 loop: true, 297 spaceBetween: 45, 298 autoplay: { delay: 2500, disableOnInteraction: false }, 299 pagination: { el: ".swiper-pagination", clickable: true }, 300 breakpoints: { 301 640: { slidesPerView: 1, spaceBetween: 0 }, 302 768: { slidesPerView: 2, spaceBetween: 45 }, 303 1024: { slidesPerView: 3, spaceBetween: 45 }, 304 }, 305 }) 306 : null; 307 308let bloglFeature = document.querySelector("#blog-feature") 309 ? new Swiper("#blog-feature", { 310 loop: true, 311 slidesPerView: 1, 312 spaceBetween: 45, 313 autoplay: { delay: 10000, disableOnInteraction: false }, 314 pagination: { el: ".swiper-pagination", clickable: true },
315 speed: 800, 316 effect: "slide", 317 }) 318 : null; 319 320// ============================================================ 321// FAQ TABS 322// ============================================================ 323let faqTabs = document.querySelectorAll("ul.faq-tabs > li"); 324function myTabClicks(e) { 325 for (let e = 0; e < faqTabs.length; e++) 326 faqTabs[e].classList.remove("tabActive"); 327 e.currentTarget.classList.add("tabActive"); 328 e.preventDefault(); 329 var t = document.querySelectorAll(".tab-pane"); 330 for (let e = 0; e < t.length; e++) t[e].classList.remove("tabActive"); 331 e = e.target.getAttribute("href"); 332 if (document.querySelector(e)) 333 document.querySelector(e).classList.add("tabActive"); 334} 335for (let e = 0; e < faqTabs.length; e++) 336 faqTabs[e].addEventListener("click", myTabClicks); 337 338// ============================================================ 339// FANCYBOX 340// ============================================================ 341if (typeof Fancybox !== "undefined") { 342 Fancybox.bind("[data-fancybox]", {}); 343} 344 345// ============================================================ 346// GSAP MOTION PATH 347// ============================================================ 348if (typeof gsap !== "undefined" && typeof MotionPathPlugin !== "undefined") { 349 gsap.registerPlugin(MotionPathPlugin); 350 351 const rectIds = [ 352 "#rect", 353 "#rect-2", 354 "#rect-3", 355 "#rect-4", 356 "#rect-5", 357 "#rect-6", 358 ]; 359 const pathIds = [ 360 "#path", 361 "#path-2", 362 "#path-3", 363 "#path-4", 364 "#path-5", 365 "#path-6", 366 ]; 367 368 const existingRects = rectIds.filter((id) => document.querySelector(id)); 369 if (existingRects.length) { 370 gsap.set(existingRects.join(", "), { opacity: 1 }); 371 existingRects.forEach((rectId, i) => { 372 const pathId = pathIds[i]; 373 if (document.querySelector(pathId)) { 374 gsap.from(rectId, { 375 motionPath: { 376 path: pathId, 377 autoRotate: true, 378 align: pathId, 379 alignOrigin: [0.5, 0.5], 380 }, 381 duration: 2, 382 ease: "none", 383 repeat: -1, 384 repeatDelay: 0, 385 }); 386 } 387 }); 388 } 389} 390 391// ============================================================ 392// MODALS (page-level, outside header) 393// ============================================================ 394let modal = document.getElementById("modal"), 395 modal2 = document.getElementById("modal2"), 396 modalOpenBtn2 = document.getElementById("open-btn-2"), 397 modalOpenBtn3 = document.getElementById("open-btn-3"), 398 modalOpenBtn4 = document.getElementById("open-btn-4"), 399 modalCloseBtn = document.getElementById("ok-btn"), 400 modalCloseBtn2 = document.getElementById("ok-btn2"); 401 402if (modalOpenBtn2 && modal) 403 modalOpenBtn2.onclick = function () { 404 modal.style.display = "flex"; 405 }; 406if (modalOpenBtn3 && modal2) 407 modalOpenBtn3.onclick = function () { 408 modal2.style.display = "flex"; 409 }; 410if (modalOpenBtn4 && modal2) 411 modalOpenBtn4.onclick = function () { 412 modal2.style.display = "flex"; 413 }; 414if (modalCloseBtn && modal) 415 modalCloseBtn.onclick = function () { 416 modal.style.display = "none"; 417 }; 418if (modalCloseBtn2 && modal2) 419 modalCloseBtn2.onclick = function () { 420 modal2.style.display = "none"; 421 }; 422 423window.onclick = function (e) { 424 if (modal && e.target == modal) modal.style.display = "none"; 425 if (modal2 && e.target == modal2) modal2.style.display = "none"; 426}; 427 428// ============================================================ 429// AOS 430// ============================================================ 431if (typeof AOS !== "undefined") { 432 AOS.init({ 433 disable: function () { 434 return window.innerWidth < 768; 435 }, 436 }); 437} 438 439// ============================================================ 440// PARALLAX SCENE 441// ============================================================ 442if (null != document.querySelector("#scene")) { 443 let e = document.getElementById("scene"); 444 function parallax(a) { 445 this.querySelectorAll(".parallax-effect").forEach((e) => { 446 var t = e.getAttribute("parallax-value"), 447 n = (e.offsetWidth - a.pageX * t) / 90, 448 t = (e.offsetWidth - a.pageY * t) / 90; 449 e.style.cssText = `transform: translateX(${n}px) translateY(${t}px); transition-duration: 0.1s;`; 450 });
451 } 452 e.addEventListener("mousemove", parallax); 453}
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.