(function($) { "use strict"; function initBackPostSlider($scope) { var $slider = $scope.find('.eel-all-slider'); if (!$slider.length) { return; } var loop = $slider.data('loop') === true || $slider.data('loop') === 'true'; var autoplay = $slider.data('autoplay') === true || $slider.data('autoplay') === 'true'; var autoplayDelay = parseInt($slider.data('autoplay-delay'), 10) || 3000; var slidesPerView = parseInt($slider.data('slides-per-view'), 10) || 3; var spvSkin1 = parseInt($slider.data('slides-per-view-skin1'), 10); var spvSkin4 = parseInt($slider.data('slides-per-view-skin4'), 10); var spvSpecificDefault = parseInt($slider.data('slides-per-view-default'), 10); var finalSlidesPerView; if (spvSkin1) { finalSlidesPerView = spvSkin1; } else if (spvSkin4) { finalSlidesPerView = spvSkin4; } else if (spvSpecificDefault) { finalSlidesPerView = spvSpecificDefault; } else { finalSlidesPerView = slidesPerView; } var speed = parseInt($slider.data('speed'), 10) || 600; var centeredSlides = $slider.data('centered-slides') === true || $slider.data('centered-slides') === 'true'; var freeMode = $slider.data('free-mode') === true || $slider.data('free-mode') === 'true'; var spaceBetween = parseInt($slider.data('space-between'), 10) || 0; var slidesPerViewTablet = parseInt($slider.data('slides-per-view-tablet'), 10) || 2; var slidesPerViewMobile = parseInt($slider.data('slides-per-view-mobile'), 10) || 1; var paginationType = $slider.data('pagination') !== 'none' ? $slider.data('pagination') : false; var navigation = $slider.data('navigation') === true || $slider.data('navigation') === 'true'; var effect = $slider.data('effect') || 'slide'; var cubeShadow = $slider.data('cube-shadow') === true || $slider.data('cube-shadow') === 'true'; var coverflowRotate = parseInt($slider.data('coverflow-rotate'), 10) || 50; var coverflowStretch = parseInt($slider.data('coverflow-stretch'), 10) || 0; // Find navigation elements within the scope var $nextButton = $scope.find('.swiper-next'); var $prevButton = $scope.find('.swiper-prev'); var $pagination = $scope.find('.swiper-pagination'); // Prevent multiple instances and duplicated handlers if Elementor re-runs init if ($slider[0] && $slider[0].swiper) { try { $slider[0].swiper.destroy(true, true); } catch (e) {} } if ($nextButton.length) { $nextButton.off('click.easyStopAuto click.easyFadeNav'); } if ($prevButton.length) { $prevButton.off('click.easyStopAuto click.easyFadeNav'); } var hasProgressBar = $pagination.hasClass('swiper-pagination-progressbar'); var kbDirection = $slider.data('kenburns-direction') || 'in'; var effectOptions = {}; if (effect === 'cube') { effectOptions = { cubeEffect: { shadow: cubeShadow, slideShadows: cubeShadow, shadowOffset: 20, shadowScale: 0.94, } }; } else if (effect === 'coverflow') { effectOptions = { coverflowEffect: { rotate: coverflowRotate, stretch: coverflowStretch, depth: 100, modifier: 1, slideShadows: true, } }; } else if (effect === 'flip') { effectOptions = { flipEffect: { slideShadows: true, limitRotation: true, } }; } else if (effect === 'cards') { effectOptions = { cardsEffect: { slideShadows: true, rotate: true, perSlideOffset: 8, } }; } else if (effect === 'creative') { var creativeStyle = $slider.data('creative-style') || 'default'; if (creativeStyle === 'zoom') { effectOptions = { creativeEffect: { limitProgress: true, prev: { scale: 1.1, opacity: 0, translate: [0, 0, 0] }, next: { scale: 1.6, opacity: 0, translate: [0, 0, 0] }, }, }; } else { effectOptions = { creativeEffect: { limitProgress: true, prev: { shadow: true, translate: [0, 0, -400] }, next: { translate: ['100%', 0, 0] }, }, }; } } else if (effect === 'fade') { effectOptions = { fadeEffect: { crossFade: true } }; } else if (effect === 'kenburns') { effectOptions = { effect: 'fade', fadeEffect: { crossFade: true }, on: { init: function () { var swiper = this; setTimeout(function() { var $activeSlide = $(swiper.el).find('.swiper-slide-active'); $activeSlide.find('.hero-content-wrapper').addClass('eel-text-animated'); $activeSlide.find('.hero-slide-background img').addClass('eel-kb-active-' + kbDirection); }, 200); }, slideChange: function () { var $allSlides = $(this.el).find('.swiper-slide'); $allSlides.find('.hero-content-wrapper').removeClass('eel-text-animated'); $allSlides.find('.hero-slide-background img').removeClass('eel-kb-active-in eel-kb-active-out'); }, transitionEnd: function () { var swiper = this; var $activeSlide = $(swiper.el).find('.swiper-slide-active'); $activeSlide.find('.hero-content-wrapper').addClass('eel-text-animated'); $activeSlide.find('.hero-slide-background img').addClass('eel-kb-active-' + kbDirection); } } }; } // Loop handling tuned to avoid double-advance on loop edges var totalSlides = $slider.find('.swiper-slide').length; var isFade = effect === 'fade'; var visibleSlides = isFade ? 1 : slidesPerView; var canLoop = totalSlides > visibleSlides; var loopConfig = {}; if (loop && (canLoop || isFade)) { loopConfig = { loop: true, loopAdditionalSlides: isFade ? totalSlides : 20, loopedSlides: isFade ? totalSlides : Math.max(Math.ceil(visibleSlides), Math.min(totalSlides, 10)) }; } else { loopConfig = { loop: false, rewind: !!loop }; } var swiper = new Swiper($slider[0], { ...loopConfig, speed: speed, effect: effect, normalizeSlideIndex: true, preventInteractionOnTransition: true, simulateTouch: true, touchRatio: 1, grabCursor: true, mousewheel: hasProgressBar ? { enabled: true, sensitivity: 1, thresholdDelta: 50, thresholdTime: 200, releaseOnEdges: true, invert: false, forceToAxis: false, eventsTarget: 'container' } : false, autoplay: autoplay ? { delay: autoplayDelay, disableOnInteraction: isFade ? true : false, } : false, slidesPerView: visibleSlides, spaceBetween: isFade ? 0 : spaceBetween, centeredSlides: isFade ? false : centeredSlides, freeMode: freeMode, pagination: paginationType && $pagination.length ? { el: $pagination[0], clickable: true, type: paginationType, renderBullet: function (index, className) { let num = (index + 1).toString().padStart(2, '0'); return `${num}`; } } : false, // Progress bar for mouse scroll - only when swiper-pagination-progressbar class is present progressbar: hasProgressBar ? { el: '.swiper-progressbar', type: 'progressbar', } : false, navigation: (!isFade) && navigation && ($nextButton.length || $prevButton.length) ? { nextEl: $nextButton.length ? $nextButton[0] : null, prevEl: $prevButton.length ? $prevButton[0] : null, } : false, breakpoints: { 0: { slidesPerView: isFade ? 1 : slidesPerViewMobile, }, 768: { slidesPerView: isFade ? 1 : slidesPerViewTablet, }, 1024: { slidesPerView: isFade ? 1 : finalSlidesPerView, }, }, ...effectOptions, }); // Fade: attach custom navigation so Next/Prev work if (isFade && ($nextButton.length || $prevButton.length)) { var isTransitioning = false; swiper.on('transitionStart', function () { isTransitioning = true; }); swiper.on('transitionEnd', function () { isTransitioning = false; }); if ($nextButton.length) { $nextButton.off('click.easyFadeNav').on('click.easyFadeNav', function (e) { e.preventDefault(); e.stopPropagation(); if (swiper && swiper.autoplay && swiper.autoplay.stop) { swiper.autoplay.stop(); } if (isTransitioning || (swiper && swiper.animating)) return; swiper.slideNext(); }); } if ($prevButton.length) { $prevButton.off('click.easyFadeNav').on('click.easyFadeNav', function (e) { e.preventDefault(); e.stopPropagation(); if (swiper && swiper.autoplay && swiper.autoplay.stop) { swiper.autoplay.stop(); } if (isTransitioning || (swiper && swiper.animating)) return; swiper.slidePrev(); }); } } // Non-fade: if loop+autoplay, stop autoplay on manual nav to avoid double-advance if (!isFade && loop && autoplay) { if ($nextButton.length) { $nextButton.on('click.easyStopAuto', function () { if (swiper && swiper.autoplay && swiper.autoplay.stop) { swiper.autoplay.stop(); } }); } if ($prevButton.length) { $prevButton.on('click.easyStopAuto', function () { if (swiper && swiper.autoplay && swiper.autoplay.stop) { swiper.autoplay.stop(); } }); } } } if (!window.EEL_AddWidgetTypeBodyClass) { window.EEL_AddWidgetTypeBodyClass = true; function addWidgetTypeToBody($scope) { if (!$scope || !$scope.length) return; var widgetType = $scope.data('widget_type'); if (!widgetType) return; var safeWidgetType = widgetType .toString() .replace(/[^a-z0-9_-]/gi, '-') .toLowerCase(); var className = 'easy-eel-has-widget-' + safeWidgetType; if (!document.body.classList.contains(className)) { document.body.classList.add(className); } } /* ------------------------------------------------- * Elementor Hooks * ------------------------------------------------- */ $(window).on('elementor/frontend/init', function () { // Slider init elementorFrontend.hooks.addAction( 'frontend/element_ready/global', initBackPostSlider ); // Widget type → body class elementorFrontend.hooks.addAction( 'frontend/element_ready/global', function ($scope) { addWidgetTypeToBody($scope); } ); }); } $(window).on('elementor/frontend/init', function () { function checkStickySection() { const stickySection = document.querySelector('.eel-sticky-section'); if (stickySection) { document.body.classList.add('sticky-enabled-overlap'); } else { document.body.classList.remove('sticky-enabled-overlap'); } } checkStickySection(); const observer = new MutationObserver(checkStickySection); observer.observe(document.body, { childList: true, subtree: true }); }); $(window).on('elementor/frontend/init', function () { function initReveal_ad($scope) { const revealElements = $scope.find(".eel-img-advance-wrap"); const revealAnimate = (el) => { const target = el.querySelector(".eel-advance-img-main"); if(target && !target.classList.contains("el-reveal-animate")) { target.classList.add("el-reveal-animate"); } }; const isEditor = window.elementorFrontend && elementorFrontend.isEditMode && elementorFrontend.isEditMode(); if(isEditor){ revealElements.each(function(){ revealAnimate(this); }); } else { const observer = new IntersectionObserver((entries, obs) => { entries.forEach(entry => { if(entry.isIntersecting){ revealAnimate(entry.target); obs.unobserve(entry.target); } }); }, { threshold: 0.3 }); revealElements.each(function(){ observer.observe(this); }); // Lenis safe if (window.Lenis && typeof window.Lenis.raf === 'function') { window.Lenis.raf(() => {}); } } } elementorFrontend.hooks.addAction( 'frontend/element_ready/eel-advance-image.default', initReveal_ad ); function initReveal($scope) { const revealElements = $scope.find(".eel-img-reveal-wrap"); const revealAnimate = (el) => { const target = el.querySelector(".eel-reveal-img-main"); if(target && !target.classList.contains("el-reveal-animate")) { target.classList.add("el-reveal-animate"); } }; const isEditor = window.elementorFrontend && elementorFrontend.isEditMode && elementorFrontend.isEditMode(); if(isEditor){ revealElements.each(function(){ revealAnimate(this); }); } else { const observer = new IntersectionObserver((entries, obs) => { entries.forEach(entry => { if(entry.isIntersecting){ revealAnimate(entry.target); obs.unobserve(entry.target); } }); }, { threshold: 0.3 }); revealElements.each(function(){ observer.observe(this); }); // Lenis safe if (window.Lenis && typeof window.Lenis.raf === 'function') { window.Lenis.raf(() => {}); } } } elementorFrontend.hooks.addAction( 'frontend/element_ready/eel-image-reveal.default', initReveal ); }); $(window).on("elementor/frontend/init", function () { var EasyJarallax = function ($scope, $) { if (typeof jarallax === 'undefined') return; var $wrappers = $scope.hasClass('eele-has-jarallax') ? $scope : $scope.find('.eele-has-jarallax, .eele-inner-jarallax'); if (!$wrappers.length) return; $wrappers.each(function () { var $wrapper = $(this); var bg = $wrapper.data('jarallax-bg'); var speed = $wrapper.data('jarallax-speed') || 0.5; if (!bg) return; // Destroy previous instance if re-rendering in editor var $oldJarallax = $wrapper.find('.jarallax'); if ($oldJarallax.length) { $oldJarallax.each(function () { jarallax(this, 'destroy'); }); $oldJarallax.remove(); } var $div = $('