PageSourceSearch

https://transiti.net/wp-content/plugins/dynamic-content-for-elemen…/dynamic-posts-skin-carousel.js?ver=3.4.16

js transiti.net collected 2026-10-06 05:26:02 UTC 18,033 bytes, 652 lines download raw bytes

1(function () {
2	var widgetHandler = function ($scope, $) {
3		const fallback = $scope.find("> div > div > .dce-posts-fallback");
4		if (fallback.length !== 0) {
5			// no posts where found, nothing to do.
6			return;
7		}
8
9		var elementSettings = dceGetElementSettings($scope);
10		var id_scope = $scope.attr("data-id");
11		var id_post = $scope.attr("data-post-id");
12		var elementSwiper = $scope.find(
13			".dce-posts-container.dce-skin-carousel",
14		);
15		let mainSwiper = null;
16		var isCarouselEnabled = false;
17		var centeredSlides = Boolean(
18			elementSettings[dceDynamicPostsSkinPrefix + "centeredSlides"],
19		);
20		var centerInsufficientSlides = elementSettings[dceDynamicPostsSkinPrefix + "centerInsufficientSlides"] === 'yes';
21		
22		var infiniteLoop = Boolean(
23			elementSettings[dceDynamicPostsSkinPrefix + "loop"],
24		);
25		var slideInitNum = 0;
26		var slidesPerView = Number(
27			elementSettings[dceDynamicPostsSkinPrefix + "slidesPerView"],
28		);
29
30		if (elementSettings.carousel_match_height) {
31			if (elementSettings.style_items === "template") {
32				if ($scope.find(".e-con")) {
33					// select all top level containers:
34					$scope
35						.find(".e-con")
36						.not($scope.find(".e-con .e-con"))
37						.matchHeight();
38				} else if (
39					$scope.find(".dce-post-block .elementor-inner-section")
40						.length
41				) {
42					$scope
43						.find(".dce-post-block")
44						.first()
45						.find(".elementor-inner-section")
46						.each((i) => {
47							let $els = $scope
48								.find(".dce-post-block")
49								.map((_, $e) => {
50									return jQuery($e).find(
51										".elementor-inner-section",
52									)[i];
53								});
54							$els.matchHeight();
55						});
56				} else {
57					selector = ".dce-post-block .elementor-top-section";
58					$scope.find(selector).matchHeight();
59				}
60			} else {
61				selector = ".dce-post-block";
62				$scope.find(selector).matchHeight();
63			}
64		}
65
66		let nextElement = $scope.find(".swiper-button-right")[0];
67		let prevElement = $scope.find(".swiper-button-left")[0];
68		if (Boolean(elementSettings["rtl"])) {
69			let temp = nextElement;
70			nextElement = prevElement;
71			prevElement = temp;
72		}
73
74		// Prevent text selection on navigation buttons
75		if (nextElement) {
76			nextElement.addEventListener('mousedown', function(e) {
77				e.preventDefault();
78			});
79			// Keyboard accessibility for navigation buttons
80			nextElement.addEventListener('keydown', function(e) {
81				if (e.key === 'Enter' || e.key === ' ') {
82					e.preventDefault();
83					nextElement.click();
84				}
85			});
86		}
87		if (prevElement) {
88			prevElement.addEventListener('mousedown', function(e) {
89				e.preventDefault();
90			});
91			// Keyboard accessibility for navigation buttons
92			prevElement.addEventListener('keydown', function(e) {
93				if (e.key === 'Enter' || e.key === ' ') {
94					e.preventDefault();
95					prevElement.click();
96				}
97			});
98		}
99
100		var sliderEffect =
101			elementSettings[dceDynamicPostsSkinPrefix + "effects"] ||
102			"slide";
103		sliderEffect = String(sliderEffect);
104
105		var mainSwiperOptions = {
106			observer: true,
107			observeParents: true,
108			direction:
109				String(
110					elementSettings[
111						dceDynamicPostsSkinPrefix + "direction_slider"
112					],
113				) || "horizontal", //vertical
114			initialSlide: slideInitNum,
115			reverseDirection: Boolean(elementSettings["rtl"]),
116			speed:
117				Number(
118					elementSettings[dceDynamicPostsSkinPrefix + "speed_slider"],
119				) || 300,
120			autoHeight: Boolean(
121				elementSettings[dceDynamicPostsSkinPrefix + "autoHeight"],
122			), // Set to true and slider wrapper will adopt its height to the height of the currently active slide
123			effect: sliderEffect,
124			cubeEffect: {
125				shadow: Boolean(
126					elementSettings[dceDynamicPostsSkinPrefix + "cube_shadow"],
127				),
128				slideShadows: Boolean(
129					elementSettings[dceDynamicPostsSkinPrefix + "slideShadows"],
130				),
131				shadowOffset: 20,
132				shadowScale: 0.94,
133			},
134			coverflowEffect: {
135				rotate: 50,
136				stretch:
137					Number(
138						elementSettings[
139							dceDynamicPostsSkinPrefix + "coverflow_stretch"
140						],
141					) || 0,
142				depth: 100,
143				modifier:
144					Number(
145						elementSettings[
146							dceDynamicPostsSkinPrefix + "coverflow_modifier"
147						],
148					) || 1,
149				slideShadows: Boolean(
150					elementSettings[dceDynamicPostsSkinPrefix + "slideShadows"],
151				),
152			},
153			flipEffect: {
154				rotate: 30,
155				slideShadows: Boolean(
156					elementSettings[dceDynamicPostsSkinPrefix + "slideShadows"],
157				),
158				limitRotation: true,
159			},
160			fadeEffect: {
161				crossFade: true,
162			},
163			initialSlide:
164				Number(
165					elementSettings[dceDynamicPostsSkinPrefix + "initialSlide"],
166				) || 0,
167			slidesPerView: slidesPerView || "auto",
168			slidesPerGroup:
169				Number(
170					elementSettings[
171						dceDynamicPostsSkinPrefix + "slidesPerGroup"
172					],
173				) || 1, // Set numbers of slides to define and enable group sliding. Useful to use with slidesPerView > 1
174			slidesPerColumn:
175				Number(
176					elementSettings[dceDynamicPostsSkinPrefix + "slidesColumn"],
177				) || 1, // Number of slides per column, for multirow layout
178			spaceBetween:
179				Number(
180					elementSettings[dceDynamicPostsSkinPrefix + "spaceBetween"],
181				) || 0,
182			slidesOffsetBefore:
183				Number(
184					elementSettings[
185						dceDynamicPostsSkinPrefix + "slidesOffsetBefore"
186					],
187				) || 0, // Add (in px) additional slide offset in the beginning of the container (before all slides)
188			slidesOffsetAfter:
189				Number(
190					elementSettings[
191						dceDynamicPostsSkinPrefix + "slidesOffsetAfter"
192					],
193				) || 0, // Add (in px) additional slide offset in the end of the container (after all slides)
194			slidesPerColumnFill:
195				String(
196					elementSettings[
197						dceDynamicPostsSkinPrefix + "slidesPerColumnFill"
198					],
199				) || "row", // Could be 'column' or 'row'. Defines how slides should fill rows, by column or by row
200			centerInsufficientSlides: centerInsufficientSlides,
201			centeredSlides: centeredSlides,
202			centeredSlidesBounds: Boolean(
203				elementSettings[
204					dceDynamicPostsSkinPrefix + "centeredSlidesBounds"
205				],
206			),
207			grabCursor: Boolean(
208				elementSettings[dceDynamicPostsSkinPrefix + "grabCursor"],
209			),
210			freeMode: Boolean(
211				elementSettings[dceDynamicPostsSkinPrefix + "freeMode"],
212			),
213			freeModeMomentum: Boolean(
214				elementSettings[dceDynamicPostsSkinPrefix + "freeModeMomentum"],
215			),
216			freeModeMomentumRatio:
217				Number(
218					elementSettings[
219						dceDynamicPostsSkinPrefix + "freeModeMomentumRatio"
220					],
221				) || 1,
222			freeModeMomentumVelocityRatio:
223				Number(
224					elementSettings[
225						dceDynamicPostsSkinPrefix +
226							"freeModeMomentumVelocityRatio"
227					],
228				) || 1,
229			freeModeMomentumBounce: Boolean(
230				elementSettings[
231					dceDynamicPostsSkinPrefix + "freeModeMomentumBounce"
232				],
233			),
234			freeModeMomentumBounceRatio:
235				Number(elementSettings[dceDynamicPostsSkinPrefix + "speed"]) ||
236				1,
237			freeModeMinimumVelocity:
238				Number(elementSettings[dceDynamicPostsSkinPrefix + "speed"]) ||
239				0.02,
240			freeModeSticky: Boolean(
241				elementSettings[dceDynamicPostsSkinPrefix + "freeModeSticky"],
242			),
243			loop: infiniteLoop,
244			navigation: {
245				nextEl: nextElement,
246				prevEl: prevElement,
247			},
248			pagination: {
249				el: id_post
250					? ".elementor-element-" +
251						id_scope +
252						'[data-post-id="' +
253						id_post +
254						'"] .pagination-' +
255						id_scope
256					: ".pagination-" + id_scope,
257				clickable: true,
258				type:
259					String(
260						elementSettings[
261							dceDynamicPostsSkinPrefix + "pagination_type"
262						],
263					) || "bullets",
264				dynamicBullets: Boolean(
265					elementSettings[
266						dceDynamicPostsSkinPrefix + "dynamicBullets"
267					],
268				),
269				renderBullet: function (index, className) {
270					var indexLabel =
271						!Boolean(
272							elementSettings[
273								dceDynamicPostsSkinPrefix + "dynamicBullets"
274							],
275						) &&
276						Boolean(
277							elementSettings[
278								dceDynamicPostsSkinPrefix + "bullets_numbers"
279							],
280						)
281							? '<span class="swiper-pagination-bullet-title">' +
282								(index + 1) +
283								"</span>"
284							: "";
285					return (
286						'<span class="' +
287						className +
288						'">' +
289						indexLabel +
290						"</span>"
291					);
292				},
293				renderFraction: function (currentClass, totalClass) {
294					if (!Boolean(elementSettings["rtl"])) {
295						return (
296							'<span class="' +
297							currentClass +
298							'"></span>' +
299							'<span class="separator">' +
300							String(
301								elementSettings[
302									dceDynamicPostsSkinPrefix +
303										"fraction_separator"
304								],
305							) +
306							"</span>" +
307							'<span class="' +
308							totalClass +
309							'"></span>'
310						);
311					}
312					return (
313						'<span class="' +
314						totalClass +
315						'"></span>' +
316						'<span class="separator">' +
317						String(
318							elementSettings[
319								dceDynamicPostsSkinPrefix + "fraction_separator"
320							],
321						) +
322						"</span>" +
323						'<span class="' +
324						currentClass +
325						'"></span>'
326					);
327				},
328				renderProgressbar: function (progressbarFillClass) {
329					return '<span class="' + progressbarFillClass + '"></span>';
330				},
331			},
332			scrollbar: {
333				el: $scope.find(".swiper-scrollbar")[0],
334				hide: Boolean(
335					elementSettings[
336						dceDynamicPostsSkinPrefix + "scrollbar_hide"
337					],
338				),
339				draggable: Boolean(
340					elementSettings[
341						dceDynamicPostsSkinPrefix + "scrollbar_draggable"
342					],
343				),
344				snapOnRelease: true, // Set to true to snap slider position to slides when you release scrollbar
345			},
346			mousewheel: elementSettings[
347				dceDynamicPostsSkinPrefix + "mousewheelControl"
348			]
349				? {
350						releaseOnEdges: true,
351					}
352				: false,
353			keyboard: {
354				enabled: Boolean(
355					elementSettings[
356						dceDynamicPostsSkinPrefix + "keyboardControl"
357					],
358				),
359			},
360		};
361
362		// Cube effect with loop: prevent duplicate slide content
363		// Cube effect requires explicit loopedSlides count because it pre-calculates
364		// 3D transformations for all faces (including duplicates) to avoid visual glitches
365		if ("cube" === sliderEffect && infiniteLoop) {
366			var sliderSlidesCount = elementSwiper.find(".swiper-slide").length;
367			if (sliderSlidesCount > 0) {
368				// Tell Swiper exactly how many slides to duplicate for seamless 3D loop
369				mainSwiperOptions.loopedSlides = sliderSlidesCount;
370				// Add additional duplicates to ensure smooth transitions between faces
371				mainSwiperOptions.loopAdditionalSlides = sliderSlidesCount;
372				// Disable automatic limit to use our exact count
373				mainSwiperOptions.loopedSlidesLimit = false;
374			}
375		}
376
377		if (elementSettings[dceDynamicPostsSkinPrefix + "useAutoplay"]) {
378			mainSwiperOptions = $.extend(mainSwiperOptions, {
379				autoplay: {
380					delay:
381						Number(
382							elementSettings[
383								dceDynamicPostsSkinPrefix + "autoplay"
384							],
385						) || 3000,
386					disableOnInteraction: Boolean(
387						elementSettings[
388							dceDynamicPostsSkinPrefix +
389								"autoplayDisableOnInteraction"
390						],
391					),
392					stopOnLastSlide: Boolean(
393						elementSettings[
394							dceDynamicPostsSkinPrefix + "autoplayStopOnLast"
395						],
396					),
397				},
398			});
399		}
400
401		mainSwiperOptions.breakpoints = dynamicooo.makeSwiperBreakpoints(
402			{
403				slidesPerView: {
404					elementor_key: "slidesPerView",
405					default_value: "auto",
406				},
407				slidesPerGroup: {
408					elementor_key: "slidesPerGroup",
409					default_value: 1,
410				},
411				spaceBetween: {
412					elementor_key: "spaceBetween",
413					default_value: 1,
414				},
415				slidesPerColumn: {
416					elementor_key: "slidesColumn",
417					default_value: 1,
418				},
419				slidesOffsetBefore: {
420					elementor_key: "slidesOffsetBefore",
421					default_value: 0,
422				},
423				slidesOffsetAfter: {
424					elementor_key: "slidesOffsetAfter",
425					default_value: 0,
426				},
427			},
428			elementSettings,
429			dceDynamicPostsSkinPrefix,
430		);
431
432		mainSwiperOptions.grid = {
433			rows: mainSwiperOptions.slidesPerColumn || 1, 
434			fill: mainSwiperOptions.slidesPerColumnFill || "row", 
435		};
436		
437
438		if ("dualcarousel" === dceDynamicPostsSkin) {
439			let dualCarouselSlidesPerView = Number(
440				elementSettings[
441					dceDynamicPostsSkinPrefix + "thumbnails_slidesPerView"
442				],
443			);
444
445			let dualCarouselSwiperOptions = {
446				spaceBetween:
447					Number(
448						elementSettings[
449							dceDynamicPostsSkinPrefix + "dualcarousel_gap"
450						],
451					) || 0,
452				slidesPerView: dualCarouselSlidesPerView || "auto",
453				autoHeight: true,
454				watchOverflow: true,
455				watchSlidesProgress: true,
456				centeredSlides: Boolean(elementSettings[dceDynamicPostsSkinPrefix + "thumbnails_centered"]),
457				loop: Boolean(elementSettings[dceDynamicPostsSkinPrefix + "thumbnails_loop"]),
458			};
459
460			dualCarouselSwiperOptions.breakpoints =
461				dynamicooo.makeSwiperBreakpoints(
462					{
463						slidesPerView: {
464							elementor_key: "thumbnails_slidesPerView",
465							default_value: "auto",
466						},
467						spaceBetween: {
468							elementor_key: "dualcarousel_gap",
469							default_value: 0,
470						},
471					},
472					elementSettings,
473					dceDynamicPostsSkinPrefix,
474				);
475
476			initSwiperThumbs(dualCarouselSwiperOptions);
477		}
478
479		function initSwiperThumbs(dualCarouselSwiperOptions) {
480			let thumbsContainer = $scope.find(
481				".dce-dualcarousel-gallery-thumbs",
482			);
483			let swiperThumbs;
484			mainSwiperOptions.on = mainSwiperOptions.on || {};
485			mainSwiperOptions.on.slideChange = function (e) {
486				swiperThumbs.slideToLoop(this.realIndex);
487			};
488			const asyncSwiper = elementorFrontend.utils.swiper;
489
490			new asyncSwiper(thumbsContainer, dualCarouselSwiperOptions)
491				.then((newSwiperInstance) => {
492					swiperThumbs = newSwiperInstance;
493					mainSwiperOptions.thumbs = {
494						swiper: swiperThumbs,
495					};
496					initSwiperCarousel();
497				})
498				.catch((error) => console.log(error));
499		}
500
501		function initSwiperCarousel() {
502			const asyncSwiper = elementorFrontend.utils.swiper;
503			new asyncSwiper(elementSwiper, mainSwiperOptions)
504				.then((newSwiperInstance) => {
505					mainSwiper = newSwiperInstance;
506				})
507				.catch((error) => console.log(error));
508		}
509
510		if (elementSwiper.length && "dualcarousel" !== dceDynamicPostsSkin) {
511			initSwiperCarousel();
512		}
513
514		// Callback function executed when mutations occur
515		var handleCarouselClassChange = function (mutationsList, observer) {
516			for (var mutation of mutationsList) {
517				if (
518					mutation.type === "attributes" &&
519					mutation.attributeName === "class" &&
520					isCarouselEnabled
521				) {
522					mainSwiper.update();
523				}
524			}
525		};
526
527		dceObserveElement($scope[0], handleCarouselClassChange);
528	};
529
530	const addActions = () => {
531		elementorFrontend.hooks.addAction(
532			"frontend/element_ready/dce-dynamicposts-v2.carousel",
533			widgetHandler,
534		);
535		elementorFrontend.hooks.addAction(
536			"frontend/element_ready/dce-woo-products-cart.carousel",
537			widgetHandler,
538		);
539		elementorFrontend.hooks.addAction(
540			"frontend/element_ready/dce-dynamic-woo-products.carousel",
541			widgetHandler,
542		);
543		elementorFrontend.hooks.addAction(
544			"frontend/element_ready/dce-dynamic-woo-products-on-sale.carousel",
545			widgetHandler,
546		);
547		elementorFrontend.hooks.addAction(
548			"frontend/element_ready/dce-woo-product-upsells.carousel",
549			widgetHandler,
550		);
551		elementorFrontend.hooks.addAction(
552			"frontend/element_ready/dce-woo-product-crosssells.carousel",
553			widgetHandler,
554		);
555		elementorFrontend.hooks.addAction(
556			"frontend/element_ready/dce-dynamic-show-favorites.carousel",
557			widgetHandler,
558		);
559		elementorFrontend.hooks.addAction(
560			"frontend/element_ready/dce-my-posts.carousel",
561			widgetHandler,
562		);
563		elementorFrontend.hooks.addAction(
564			"frontend/element_ready/dce-dynamic-archives.carousel",
565			widgetHandler,
566		);
567		elementorFrontend.hooks.addAction(
568			"frontend/element_ready/dce-sticky-posts.carousel",
569			widgetHandler,
570		);
571		elementorFrontend.hooks.addAction(
572			"frontend/element_ready/dce-search-results.carousel",
573			widgetHandler,
574		);
575		elementorFrontend.hooks.addAction(
576			"frontend/element_ready/dce-woo-products-variations.carousel",
577			widgetHandler,
578		);
579		elementorFrontend.hooks.addAction(
580			"frontend/element_ready/dce-dynamicposts-v2.dualcarousel",
581			widgetHandler,
582		);
583		elementorFrontend.hooks.addAction(
584			"frontend/element_ready/dce-woo-products-cart.dualcarousel",
585			widgetHandler,
586		);
587		elementorFrontend.hooks.addAction(
588			"frontend/element_ready/dce-woo-products-cart-on-sale.dualcarousel",
589			widgetHandler,
590		);
591		elementorFrontend.hooks.addAction(
592			"frontend/element_ready/dce-dynamic-woo-products.dualcarousel",
593			widgetHandler,
594		);
595		elementorFrontend.hooks.addAction(
596			"frontend/element_ready/dce-woo-products-variations.dualcarousel",
597			widgetHandler,
598		);
599		elementorFrontend.hooks.addAction(
600			"frontend/element_ready/dce-woo-product-upsells.dualcarousel",
601			widgetHandler,
602		);
603		elementorFrontend.hooks.addAction(
604			"frontend/element_ready/dce-woo-product-crosssells.dualcarousel",
605			widgetHandler,
606		);
607		elementorFrontend.hooks.addAction(
608			"frontend/element_ready/dce-dynamic-show-favorites.dualcarousel",
609			widgetHandler,
610		);
611		elementorFrontend.hooks.addAction(
612			"frontend/element_ready/dce-my-posts.dualcarousel",
613			widgetHandler,
614		);
615		elementorFrontend.hooks.addAction(
616			"frontend/element_ready/dce-dynamic-archives.dualcarousel",
617			widgetHandler,
618		);
619		elementorFrontend.hooks.addAction(
620			"frontend/element_ready/dce-sticky-posts.dualcarousel",
621			widgetHandler,
622		);
623		elementorFrontend.hooks.addAction(
624			"frontend/element_ready/dce-search-results.dualcarousel",
625			widgetHandler,
626		);
627		elementorFrontend.hooks.addAction(
628			"frontend/element_ready/dce-metabox-relationship.carousel",
629			widgetHandler,
630		);
631		elementorFrontend.hooks.addAction(
632			"frontend/element_ready/dce-metabox-relationship.dualcarousel",
633			widgetHandler,
634		);
635		elementorFrontend.hooks.addAction(
636			"frontend/element_ready/dce-acf-relationship.carousel",
637			widgetHandler,
638		);
639		elementorFrontend.hooks.addAction(
640			"frontend/element_ready/dce-acf-relationship.dualcarousel",
641			widgetHandler,
642		);
643	};
644	if (
645		typeof elementorFrontend === "object" &&
646		elementorFrontend.hasOwnProperty("hooks")
647	) {
648		addActions();
649	} else {
650		jQuery(window).on("elementor/frontend/init", addActions);
651	}
652})();

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.