PluginProbe ʕ •ᴥ•ʔ
Essential Classy Addons for Elementor – 150+ Widgets, Templates & Performance Tools / 3.0.52
Essential Classy Addons for Elementor – 150+ Widgets, Templates & Performance Tools v3.0.52
4.0 3.0.59 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 3.0 3.0.1 3.0.10 3.0.11 3.0.12 3.0.13 3.0.14 3.0.15 3.0.16 3.0.18 3.0.2 3.0.20 3.0.21 3.0.22 3.0.23 3.0.24 3.0.25 3.0.26 3.0.27 3.0.28 3.0.29 3.0.3 3.0.30 3.0.31 3.0.32 3.0.33 3.0.34 3.0.35 3.0.36 3.0.37 3.0.38 3.0.39 3.0.4 3.0.40 3.0.41 3.0.42 3.0.43 3.0.44 3.0.45 3.0.46 3.0.47 3.0.48 3.0.49 3.0.5 3.0.50 3.0.51 3.0.52 3.0.53 3.0.54 3.0.55 3.0.56 3.0.57 3.0.58 3.0.6 3.0.7 3.0.8 3.0.9
essential-classy-addons-for-elementor / assets / js / custom / ecafe-tabs.js
essential-classy-addons-for-elementor / assets / js / custom Last commit date
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);