ec-confettieffect.js
6 months ago
ec-confettieffect.min.js
6 months ago
ecafe-accordion.js
6 months ago
ecafe-accordion.min.js
6 months ago
ecafe-assets.js
6 months ago
ecafe-assets.min.js
6 months ago
ecafe-back-to-top.js
6 months ago
ecafe-back-to-top.min.js
6 months ago
ecafe-changelog.js
6 months ago
ecafe-changelog.min.js
6 months ago
ecafe-chart.js
6 months ago
ecafe-chart.min.js
6 months ago
ecafe-countdown.js
6 months ago
ecafe-countdown.min.js
6 months ago
ecafe-coupon-code.js
6 months ago
ecafe-coupon-code.min.js
6 months ago
ecafe-hover-background.js
6 months ago
ecafe-hover-background.min.js
6 months ago
ecafe-image-accordion.js
6 months ago
ecafe-image-accordion.min.js
6 months ago
ecafe-image-scroll.js
6 months ago
ecafe-image-scroll.min.js
6 months ago
ecafe-infocircle.js
6 months ago
ecafe-infocircle.min.js
6 months ago
ecafe-infounfold.js
6 months ago
ecafe-infounfold.min.js
6 months ago
ecafe-lottie.js
6 months ago
ecafe-lottie.min.js
6 months ago
ecafe-marketing-link.js
6 months ago
ecafe-marketing-link.min.js
6 months ago
ecafe-page-piling.js
6 months ago
ecafe-page-piling.min.js
6 months ago
ecafe-page-scroll-to-id.js
6 months ago
ecafe-page-scroll-to-id.min.js
6 months ago
ecafe-pdf-viewer.js
6 months ago
ecafe-pdf-viewer.min.js
6 months ago
ecafe-post-image.js
6 months ago
ecafe-post-image.min.js
6 months ago
ecafe-post-listing.js
6 months ago
ecafe-post-listing.min.js
6 months ago
ecafe-qrcode.js
6 months ago
ecafe-qrcode.min.js
6 months ago
ecafe-scroll-progress.js
6 months ago
ecafe-scroll-progress.min.js
6 months ago
ecafe-sticky-video.js
6 months ago
ecafe-sticky-video.min.js
6 months ago
ecafe-tabs.js
6 months ago
ecafe-tabs.min.js
6 months ago
ecafe-tilt-custom.js
6 months ago
ecafe-tilt-custom.min.js
6 months ago
ecafe-tippy-custom.js
6 months ago
ecafe-tippy-custom.min.js
6 months ago
ecafe-toc.js
6 months ago
ecafe-toc.min.js
6 months ago
ecafe-whatsapp.js
6 months ago
ecafe-whatsapp.min.js
6 months ago
ecafe.js
6 months ago
ecafe.min.js
6 months ago
ecafe-tabs.js
128 lines
| 1 | (function ($) { |
| 2 | "use strict"; |
| 3 | var WidgetTabs = function ($scope, $) { |
| 4 | if ($scope.find('.eca-tabs-wrapper').length) { |
| 5 | var elements = $scope[0].querySelectorAll('.eca-tabs-wrapper'); |
| 6 | |
| 7 | Array.prototype.forEach.call(elements, function (el, i) { |
| 8 | var settings = el.getAttribute('data-settings'); |
| 9 | settings = JSON.parse(settings); |
| 10 | |
| 11 | var tabs = el.querySelectorAll('.eca-tabs-title-wrap .eca-tab-title'); |
| 12 | var contents = el.querySelectorAll('.eca-tabs-content-wrap .eca-tab-content'); |
| 13 | var accordions = el.querySelectorAll('.eca-tab-accordion-title'); |
| 14 | |
| 15 | var autoplay = settings.autoplay === 'yes' && window.innerWidth > 767; // Autoplay only for larger screens |
| 16 | var autoplaySpeed = settings.autoplayduration ? parseInt(settings.autoplayduration) : 5000; |
| 17 | var currentIndex = 0; |
| 18 | var autoplayInterval; |
| 19 | |
| 20 | function activateTab(index) { |
| 21 | tabs.forEach(tab => tab.classList.remove('tab-active')); |
| 22 | contents.forEach(content => content.classList.remove('tab-active')); |
| 23 | |
| 24 | if (settings.accordion === true && window.innerWidth <= 767) { |
| 25 | accordions.forEach(acc => acc.classList.remove('tab-active')); |
| 26 | accordions[index].classList.add('tab-active'); |
| 27 | $(accordions[index]).next('.eca-tab-content').slideDown(300).addClass('tab-active'); |
| 28 | } else { |
| 29 | tabs[index].classList.add('tab-active'); |
| 30 | contents[index].classList.add('tab-active'); |
| 31 | } |
| 32 | |
| 33 | eclayoutreinit(el); |
| 34 | if (autoplay) resetProgressBar(); |
| 35 | } |
| 36 | |
| 37 | function startAutoplay() { |
| 38 | if (autoplay) { |
| 39 | activateTab(currentIndex); |
| 40 | autoplayInterval = setInterval(function () { |
| 41 | if (currentIndex < tabs.length - 1) { |
| 42 | currentIndex++; |
| 43 | } else { |
| 44 | // NEW: Infinite autoplay support |
| 45 | if (settings.autoplayloop === 'yes') { |
| 46 | currentIndex = 0; |
| 47 | } else { |
| 48 | clearInterval(autoplayInterval); |
| 49 | return; |
| 50 | } |
| 51 | } |
| 52 | |
| 53 | activateTab(currentIndex); |
| 54 | }, autoplaySpeed); |
| 55 | } |
| 56 | } |
| 57 | |
| 58 | function resetProgressBar() { |
| 59 | if (window.innerWidth <= 767) return; // No progress bar on mobile |
| 60 | el.querySelectorAll('.eca-tab-progress').forEach(el => el.remove()); |
| 61 | |
| 62 | tabs.forEach((tab, index) => { |
| 63 | let bar = document.createElement('div'); |
| 64 | bar.className = 'eca-tab-progress'; |
| 65 | tab.appendChild(bar); |
| 66 | |
| 67 | if (index === currentIndex) { |
| 68 | setTimeout(() => { |
| 69 | bar.style.transition = `width ${autoplaySpeed}ms linear`; |
| 70 | bar.style.width = '100%'; |
| 71 | }, 50); |
| 72 | } |
| 73 | }); |
| 74 | } |
| 75 | |
| 76 | // Attach event listeners for tab click/hover |
| 77 | tabs.forEach((tab, index) => { |
| 78 | tab.addEventListener(settings.type === 'click' ? 'click' : 'mouseover', (event) => { |
| 79 | event.preventDefault(); |
| 80 | clearInterval(autoplayInterval); |
| 81 | currentIndex = index; |
| 82 | activateTab(index); |
| 83 | if (autoplay) startAutoplay(); |
| 84 | }); |
| 85 | }); |
| 86 | |
| 87 | // Accordion Mode for Mobile |
| 88 | if (settings.accordion === true && window.innerWidth <= 767) { |
| 89 | $(accordions).off('click').on('click', function () { |
| 90 | var $this = $(this); |
| 91 | var $content = $this.next('.eca-tab-content'); |
| 92 | |
| 93 | if ($this.hasClass('tab-active')) { |
| 94 | $this.removeClass('tab-active'); |
| 95 | $content.stop().slideUp(300).removeClass('tab-active'); |
| 96 | } else { |
| 97 | $(accordions).removeClass('tab-active').next('.eca-tab-content').stop().slideUp(300).removeClass('tab-active'); |
| 98 | $this.addClass('tab-active'); |
| 99 | $content.stop().slideDown(300).addClass('tab-active'); |
| 100 | } |
| 101 | }); |
| 102 | } |
| 103 | |
| 104 | // Start autoplay only for non-mobile screens |
| 105 | if (autoplay) { |
| 106 | resetProgressBar(); |
| 107 | startAutoplay(); |
| 108 | } |
| 109 | }); |
| 110 | } |
| 111 | }; |
| 112 | |
| 113 | function eclayoutreinit(el) { |
| 114 | const grid = el.querySelectorAll('.eca-isotope .eca-post-listing-inner'); |
| 115 | if (grid.length) { |
| 116 | grid.forEach(grid => setTimeout(() => $(grid).isotope('layout'), 50)); |
| 117 | } |
| 118 | |
| 119 | const slide = el.querySelectorAll('.ec-slider-wrap'); |
| 120 | if (slide.length) { |
| 121 | slide.forEach(slide => setTimeout(() => $(slide).slick('setPosition'), 50)); |
| 122 | } |
| 123 | } |
| 124 | |
| 125 | $(window).on('elementor/frontend/init', function () { |
| 126 | elementorFrontend.hooks.addAction('frontend/element_ready/ecafe-tabs.default', WidgetTabs); |
| 127 | }); |
| 128 | })(jQuery); |