(function() { "use strict"; window.onload = function(){ /*------------------------------------------------ Sticky Header ------------------------------------------------*/ const getHeaderId = document.querySelector(".navbar-area"); if (getHeaderId) { window.addEventListener('scroll', event => { const height = 150; const { scrollTop } = event.target.scrollingElement; document.querySelector('#navbar').classList.toggle('sticky', scrollTop >= height); }); } /*------------------------------------------------ Back to Top ------------------------------------------------*/ let progressPath = document.getElementById("progress-path"); let progressWrap = document.getElementById("progress-wrap"); if (progressPath && progressWrap) { let pathLength = progressPath.getTotalLength(); progressPath.style.transition = progressPath.style.webkitTransition = "none"; progressPath.style.strokeDasharray = pathLength + " " + pathLength; progressPath.style.strokeDashoffset = pathLength; progressPath.getBoundingClientRect(); progressPath.style.transition = progressPath.style.webkitTransition = "stroke-dashoffset 10ms linear"; const onScollEvent = function (event) { let scroll = window.scrollY; let height = document.body.scrollHeight - window.innerHeight; let progress = pathLength - (scroll * pathLength) / height; progressPath.style.strokeDashoffset = progress; let offset = 50; if (window.scrollY > offset) { progressWrap.classList.add("active-progress"); } else { progressWrap.classList.remove("active-progress"); } }; onScollEvent(); window.onscroll = onScollEvent; progressWrap.onclick = function (event) { window.scroll({ top: 0, behavior: "smooth" }); return false; }; } /*------------------------------------------------ Preloader ------------------------------------------------*/ const getPreloaderId = document.getElementById('preloader'); if (getPreloaderId) { getPreloaderId.style.display = 'none'; } }; /*------------------------------------------------ Hero Overlay On mouse move ------------------------------------------------*/ window.addEventListener("load", () => { const spotlight = document.querySelector('.spotlight'); if (!spotlight) return; // ✅ stop if spotlight doesn't exist let spotlightSize = 'transparent 20%, rgba(0, 37, 44, 0.4) 30%'; window.addEventListener('mousemove', e => updateSpotlight(e)); window.addEventListener('mousedown', e => { spotlightSize = 'transparent 10%, rgba(0, 37, 44, 0.7) 25%'; updateSpotlight(e); }); window.addEventListener('mouseup', e => { spotlightSize = 'transparent 20%, rgba(0, 37, 44, 0.4) 30%'; updateSpotlight(e); }); function updateSpotlight(e) { spotlight.style.backgroundImage = `radial-gradient(circle at ${e.pageX / window.innerWidth * 100}% ${e.pageY / window.innerHeight * 100}%, ${spotlightSize}`; } }); /*------------------------------------------------ Hero Slider One ------------------------------------------------*/ var hero_slider_one = new Swiper('.hero-slider-one', { spaceBetween: 24, speed: 1100, fadeEffect: { crossFade: true }, effect: "fade", autoplay: { delay: 3500, disableOnInteraction: true }, autoHeight: true, pagination: { el: '.hero-pagination', type: 'fraction', renderFraction: function (currentClass, totalClass) { return ` / `; } }, on: { slideChange: function () { updateFractionPadding(); }, init: function () { updateFractionPadding(); } } }); function updateFractionPadding() { const currentEl = document.querySelector('.swiper-pagination-current'); const totalEl = document.querySelector('.swiper-pagination-total'); if (currentEl && totalEl) { currentEl.textContent = currentEl.textContent.padStart(2, '0'); totalEl.textContent = totalEl.textContent.padStart(2, '0'); } } /*------------------------------------------------ Testimonial Slider ------------------------------------------------*/ var testimonial_slider_one = new Swiper(".testimonial-slider-one", { spaceBetween: 24, speed: 600, loop: true, autoHeight: true, autoplay: { delay: 3000, disableOnInteraction: false, pauseOnMouseEnter: true }, breakpoints: { 0: { slidesPerView: 1 }, 768: { slidesPerView: 1.4 }, 992: { slidesPerView: 2.2 }, 1200: { slidesPerView: 2.8 }, 1400: { slidesPerView: 3.2 }, 1600: { slidesPerView: 3.5 }, 1920: { slidesPerView: 4 } }, }); var testimonial_slider_two = new Swiper(".testimonial-slider-two", { spaceBetween: 0, speed: 1100, autoHeight: true, slidesPerView: 1, fadeEffect: { crossFade: true }, effect: "fade", navigation: { nextEl: ".testimonial-next", prevEl: ".testimonial-prev", }, }); /*------------------------------------------------ Service Slider ------------------------------------------------*/ var service_slider_one = new Swiper(".service-slider-one", { loop: true, speed: 1500, spaceBetween: 24, navigation: { nextEl: ".service-next", prevEl: ".service-prev", }, breakpoints: { 0: { slidesPerView: 1 }, 768: { slidesPerView: 2 }, 992: { slidesPerView: 2.5 }, 1200: { slidesPerView: 3 }, 1300: { slidesPerView: 3.2 }, 1400: { slidesPerView: 3.4 }, 1600: { slidesPerView: 3.7 }, 1920: { slidesPerView: 4 } } }); /*------------------------------------------------ Case Study Slider ------------------------------------------------*/ var case_slider_one = new Swiper(".case-slider-one", { loop: true, speed: 1500, freemode: false, spaceBetween: 24, simulateTouch: false, navigation: { nextEl: ".case-next", prevEl: ".case-prev", }, breakpoints: { 0: { slidesPerView: 1 }, 768: { slidesPerView: 2 }, 992: { slidesPerView: 1.3 }, 1200: { slidesPerView: 1.4 }, 1300: { slidesPerView: 1.5 }, 1400: { slidesPerView: 1.7 }, 1600: { slidesPerView: 1.9 }, 1920: { slidesPerView: 2.15 } } }); /*------------------------------------------------ Blog Slider ------------------------------------------------*/ var blog_slider_one = new Swiper(".blog-slider-one", { loop: true, speed: 1500, freemode: false, spaceBetween: 24, pagination: { el: '.blog-pagination', clickable: true }, breakpoints: { 0: { slidesPerView: 1 }, 768: { slidesPerView: 2 }, 1200: { slidesPerView: 3 } } }); /*------------------------------------------------ Service Js ------------------------------------------------*/ /*------------------------------------------------ Counter Js ------------------------------------------------*/ if ("IntersectionObserver" in window) { let counterObserver = new IntersectionObserver(function (entries, observer) { entries.forEach(function (entry) { if (entry.isIntersecting) { let counter = entry.target; let target = parseInt(counter.innerText); let step = target / 200; let current = 0; let timer = setInterval(function () { current += step; counter.innerText = Math.floor(current); if (parseInt(counter.innerText) >= target) { clearInterval(timer); } }, 10); counterObserver.unobserve(counter); } }); }); let counters = document.querySelectorAll(".counter"); counters.forEach(function (counter) { counterObserver.observe(counter); }); } //Gsap Mousemove Animation /*------------------------------------------------ Hero Slider One ------------------------------------------------*/ document.addEventListener("mousemove", mouseMoveFunc); let moveonmouse = gsap.utils.toArray(".moveContent"); function mouseMoveFunc(e) { moveonmouse.forEach((circle, index) => { const depth = 65; const moveX = (e.pageX - window.innerWidth / 2) / depth; const moveY = (e.pageY - window.innerHeight / 2) / depth; index ++ gsap.to(circle, { x: moveX * index, y: moveY * index, }); }); } gsap.registerPlugin(SplitText, ScrollTrigger); /*------------------------------------------------ GSAP Text Animation ------------------------------------------------*/ //Text Reveal By Letters let split = new SplitText(".reveal-text", { type: "chars" }); gsap.from(split.chars, { x: 20, opacity: 0, duration: 0.6, ease: "power4.out", stagger: 0.05 }); //Text Reveal By Words let split_two = new SplitText(".reveal-text-two", { type: "words" }); gsap.from(split_two.words, { y: 40, opacity: 0, duration: 1.2, ease: "power4.out", stagger: 0.15 }); //Text Reveal From Right window.addEventListener("load", function() { gsap.registerPlugin(CustomEase); // Wrap every letter const textRevealElements = document.querySelectorAll(".reveal-text-right"); textRevealElements.forEach((element) => { element.innerHTML = element.textContent.replace( /([-A-Za-z0-9!$#%^&*@()_+|~=`{}\[\]:";'<>?,.\/]+)/g, '