PageSourceSearch

https://museodelholocausto.org.ar/wp-content/plugins/jet-tricks/assets/js/jet-tricks-frontend.js?ver=1.5.7

js museodelholocausto.org.ar collected 2026-09-26 02:22:06 UTC 43,525 bytes, 1,418 lines download raw bytes

1( function( $, elementor ) {
2
3	'use strict';
4
5	var JetTricks = {
6
7		init: function() {
8			elementor.hooks.addAction( 'frontend/element_ready/section', JetTricks.elementorSection );
9			elementor.hooks.addAction( 'frontend/element_ready/section', JetTricks.elementorColumn );
10			elementor.hooks.addAction( 'frontend/element_ready/container', JetTricks.elementorSection );
11			elementor.hooks.addAction( 'frontend/element_ready/container', JetTricks.elementorColumn );
12			elementor.hooks.addAction( 'frontend/element_ready/column', JetTricks.elementorColumn );
13			elementor.hooks.addAction( 'frontend/element_ready/widget', JetTricks.elementorWidget );
14
15			var widgets = {
16				'jet-view-more.default' : JetTricks.widgetViewMore,
17				'jet-unfold.default' : JetTricks.widgetUnfold,
18				'jet-hotspots.default' : JetTricks.widgetHotspots
19			};
20
21			$.each( widgets, function( widget, callback ) {
22				elementor.hooks.addAction( 'frontend/element_ready/' + widget, callback );
23			});
24
25			// Re-init widgets in nested tabs
26			window.elementorFrontend.elements.$window.on(
27				'elementor/nested-tabs/activate',
28				( event, content ) => {
29
30					const $content = $( content );
31
32					var $button  = $content.find( '.jet-unfold__button' );
33
34					$button.off( 'click.jetUnfold' );
35
36					JetTricks.initWidgetsHandlers( $content );
37					JetTricks.elementorSection( $content );
38
39				}
40			);
41
42			// Add an action when the Swiper Loop Carousel widget is ready on the frontend
43			var loopCarouselTypes = [
44				'loop-carousel.post',
45				'loop-carousel.product',
46				'loop-carousel.post_taxonomy',
47				'loop-carousel.product_taxonomy'
48			];
49			
50			loopCarouselTypes.forEach( function( carouselType ) {
51				elementorFrontend.hooks.addAction( 'frontend/element_ready/' + carouselType, function( $scope, $ ) {
52					
53					$( window ).on( 'load', function() {
54						var loopCarousel = $scope.find( '.swiper' ),
55							swiperInstance = loopCarousel.data( 'swiper' ),
56							$button = $scope.find( '.jet-unfold__button' );
57						
58						if ( swiperInstance && $button ) {
59				
60							$button.off( 'click.jetUnfold' );
61							JetTricks.initLoopCarouselHandlers( $scope );
62				
63							swiperInstance.on( 'slideChange', function() {
64								$button.off( 'click.jetUnfold' );
65								JetTricks.initLoopCarouselHandlers( $scope );
66							});
67						}
68					});
69				});
70			});
71		},
72
73		initLoopCarouselHandlers: function( $selector ) {
74			$selector.find( '.elementor-widget-jet-unfold' ).each( function() {
75
76				var $this  = $( this ),
77
78				elementType = $this.data( 'element_type' );
79
80				if ( !elementType ) {
81					return;
82				}
83
84				if ( 'widget' === elementType ) {
85					elementType = $this.data( 'widget_type' );
86					window.elementorFrontend.hooks.doAction( 'frontend/element_ready/widget', $this, $ );
87				}
88
89				window.elementorFrontend.hooks.doAction( 'frontend/element_ready/global', $this, $ );
90				window.elementorFrontend.hooks.doAction( 'frontend/element_ready/' + elementType, $this, $ );
91
92
93			} );
94		},
95
96		initWidgetsHandlers: function( $selector ) {
97
98				$selector.find( '[data-element_type]' ).each( function() {
99
100					var excludeWidgets = [
101						'jet-woo-product-gallery-slider.default',
102						'accordion.default' 
103					];
104
105					var $this  = $( this ),
106
107					elementType = $this.data( 'element_type' );
108
109					if ( !elementType ) {
110						return;
111					}
112
113					if ( 'widget' === elementType ) {
114
115						elementType = $this.data( 'widget_type' );
116						
117						if ( excludeWidgets.includes( elementType ) ) {
118							return;
119						}
120						
121						window.elementorFrontend.hooks.doAction( 'frontend/element_ready/widget', $this, $ );
122					}
123
124					window.elementorFrontend.hooks.doAction( 'frontend/element_ready/global', $this, $ );
125					window.elementorFrontend.hooks.doAction( 'frontend/element_ready/' + elementType, $this, $ );
126
127
128				} );
129		},
130
131		elementorSection: function( $scope ) {
132			var $target        = $scope,
133				sectionId      = $scope.data( 'id' ),
134				editMode       = Boolean( elementor.isEditMode() ),
135				jetListing     = $target.parents( '.elementor-widget-jet-listing-grid' ).data( 'id' ),
136				settings       = {};
137
138			if ( window.JetTricksSettings && window.JetTricksSettings.elements_data.sections.hasOwnProperty( sectionId ) ) {
139				settings = window.JetTricksSettings.elements_data.sections[ sectionId ];
140			}
141
142			if ( editMode ) {
143				settings = JetTricks.sectionEditorSettings( $scope );
144			}
145
146			if ( ! settings ) {
147				return false;
148			}
149
150			if ( jQuery.isEmptyObject( settings ) ) {
151				return false;
152			}
153
154			if ( 'false' === settings.particles || '' === settings.particles_json ) {
155				return false;
156			}
157
158			// Compatibility jet tricks particles with jet listing
159
160			if ( jetListing && $target.parent().data( 'elementor-type' ) === 'jet-listing-items' ){
161				sectionId += jetListing + $target.parents( '.jet-listing-grid__item' ).data( 'post-id' );
162			} 
163
164			var particlesId   = 'jet-tricks-particles-instance-' + sectionId,
165				particlesJson = JSON.parse( settings.particles_json );
166
167			$scope.prepend( '<div id="' + particlesId + '" class="jet-tricks-particles-section__instance"></div>' );
168
169			// Initialize particles based on library version
170
171			if ( typeof tsParticles !== 'undefined' && tsParticles.load && tsParticles.version && tsParticles.version.startsWith('3.') ) {
172				tsParticles.load({
173					id: particlesId,
174					options: particlesJson
175				});
176			} else if ( typeof tsParticles !== 'undefined' && tsParticles.load ) {
177				tsParticles.load( particlesId, particlesJson );
178			}
179
180		},
181
182		elementorColumn: function( $scope ) {
183			var $target  = $scope,
184				$parentSection = $scope.closest( '.elementor-section' ),
185				isLegacyModeActive = !!$target.find( '> .elementor-column-wrap' ).length,
186				$window  = $( window ),
187				columnId = $target.data( 'id' ),
188				editMode = Boolean( elementor.isEditMode() ),
189				settings = {},
190				stickyInstance = null,
191				stickyInstanceOptions = {
192					topSpacing: 50,
193					bottomSpacing: 50,
194					containerSelector: isLegacyModeActive ? '.elementor-row' : '.elementor-container, .e-con-inner',
195					innerWrapperSelector: isLegacyModeActive ? '.elementor-column-wrap' : '.elementor-widget-wrap',
196				},
197				$observerTarget = $target.find('.elementor-element');
198
199			if ( ! editMode ) {
200				settings = $target.data( 'jet-settings' );
201
202				if ( $target.hasClass( 'jet-sticky-column' ) ) {
203					if ( -1 !== settings['stickyOn'].indexOf( elementorFrontend.getCurrentDeviceMode() ) ) {
204						$target.each( function() {
205							var $this  = $( this ),
206								elementType = $this.data( 'element_type' );
207		
208							if ( settings['behavior'] === 'fixed' ) {
209								initFixedSticky( $this, settings );
210							} else if ( elementType !== 'container' && elementType !== 'section' ) {
211								initSidebarSticky( $this, settings, stickyInstanceOptions );
212							} else if ( settings['behavior'] === 'scroll_until_end' ) {
213								initScrollUntilEndSticky( $this, settings );
214							} else {
215								initDefaultSticky( $this, settings );
216							}
217						});
218					}
219				}
220			}
221
222			function initFixedSticky($element, settings) {
223				var offsetTop = parseInt(settings['topSpacing']) || 0;
224				var bottomSpacing = parseInt(settings['bottomSpacing']) || 0;
225				var $window = $(window);
226				var elementId = $element.data('id');
227				var originalOffsetTop = $element.offset().top;
228				var originalHeight = $element.outerHeight();
229			
230				var $allStickyElements = $('.jet-sticky-column').filter(function() {
231					var $this = $(this);
232					var elementSettings = $this.data('jet-settings');
233
234					return elementSettings && elementSettings.stickyOn.indexOf(elementorFrontend.getCurrentDeviceMode()) !== -1;
235				});
236
237				var currentIndex = $allStickyElements.index($element);
238				var $nextSticky = currentIndex + 1 < $allStickyElements.length ? $allStickyElements.eq(currentIndex + 1) : null;
239				var $stopper = null;
240				if ($nextSticky) {
241					$stopper = $nextSticky.closest('.elementor-top-section, .e-parent');
242					if (!$stopper.length) {
243						$stopper = $nextSticky;
244					}
245				}
246			
247				const $placeholder = $('<div></div>')
248					.addClass('jet-sticky-placeholder')
249					.css({
250						display: 'none',
251						height: originalHeight,
252						width: $element.outerWidth(),
253						visibility: 'hidden'
254					});
255			
256				$element.before($placeholder);				
257			
258				function enableSticky() {
259					$placeholder.show();
260					$element.addClass('jet-sticky-container--stuck');
261			
262					var stopperTop = $stopper?.offset()?.top;
263					var stopPoint = stopperTop ? (stopperTop - $element.outerHeight() - offsetTop - bottomSpacing) : null;
264					var diff = 0;
265			
266					if (stopPoint && stopPoint < $window.scrollTop()) {
267						diff = (stopPoint - $window.scrollTop());
268					}
269			
270					$element.css({
271						position: 'fixed',
272						top: diff + 'px',
273						transform: `translateY(${offsetTop}px)`,
274						left: $placeholder.offset().left + 'px',
275						width: $placeholder.outerWidth() + 'px'
276					});
277				}
278			
279				function disableSticky() {
280					$placeholder.hide();
281					$element.removeClass('jet-sticky-container--stuck');
282			
283					$element.css({
284						position: '',
285						top: '',
286						transform: '',
287						left: '',
288						width: ''
289					});
290				}
291			
292				function onScroll() {
293					var scrollTop = $window.scrollTop();
294					if (scrollTop >= originalOffsetTop) {
295						enableSticky();
296					} else {
297						disableSticky();
298					}
299				}
300			
301				function onResize() {
302					originalOffsetTop = $placeholder.offset().top;
303					originalHeight = $element.outerHeight();
304			
305					$placeholder.css({
306						height: originalHeight,
307						width: $element.outerWidth()
308					});
309			
310					onScroll();
311				}
312			
313				let ticking = false;
314				$window.on('scroll.jetStickyHeader-' + elementId, function() {
315					if (!ticking) {
316						requestAnimationFrame(function() {
317							onScroll();
318							ticking = false;
319						});
320						ticking = true;
321					}
322				});
323			
324				$window.on('resize.jetStickyHeader-' + elementId, JetTricksTools.debounce(100, onResize));
325				onScroll();
326			
327				$window.on('resize.jetStickyHeader-' + elementId, JetTricksTools.debounce(100, function() {
328					if (-1 === settings['stickyOn'].indexOf(elementorFrontend.getCurrentDeviceMode())) {
329						cleanupSticky($element, $placeholder, elementId);
330					}
331				}));
332			}
333			
334			function cleanupSticky( $element, $placeholder, elementId ) {
335				$placeholder.remove();
336				$element.css({
337					position: '',
338					top: '',
339					transform: '',
340					left: '',
341					width: '',
342					zIndex: '',
343					transition: '',
344					willChange: ''
345				});
346				$element.removeClass('jet-sticky-container--stuck');
347				$window.off('scroll.jetStickyHeader-' + elementId);
348				$window.off('resize.jetStickyHeader-' + elementId);
349			}
350
351			function initSidebarSticky( $element, settings, options ) {
352				options.topSpacing = settings['topSpacing'];
353				options.bottomSpacing = settings['bottomSpacing'];
354
355				imagesLoaded( $parentSection, function() {
356					$target.data( 'stickyColumnInit', true );
357					stickyInstance = new StickySidebar( $target[0], options );
358				});
359
360				var targetMutation = $target[0],
361					config = { attributes: true, childList: true, subtree: true };
362
363				var observer = new MutationObserver( function( mutations ) {
364					for( var mutation of mutations ) {
365						if ( 'attributes' === mutation.type && mutation.attributeName !== 'style' ) {
366							$target[0].style.height = 'auto';
367						}
368					}
369				});
370
371				observer.observe( targetMutation, config );
372
373				$window.on( 'resize.JetTricksStickyColumn orientationchange.JetTricksStickyColumn', 
374					JetTricksTools.debounce( 50, resizeDebounce ) );
375
376				var observer = new MutationObserver( function( mutations ) {
377					if ( stickyInstance ) {
378						mutations.forEach( function(mutation){
379							if (mutation.attributeName === 'class') {
380								setTimeout( function() {
381									stickyInstance.destroy();
382									stickyInstance = new StickySidebar( $target[0], options );
383								}, 100 );
384							}
385						});
386					}
387				});
388
389				$observerTarget.each( function(){
390					observer.observe( $( this )[0], {
391						attributes: true
392					});
393				});
394			}
395
396			function initScrollUntilEndSticky( $element, settings ) {
397				const stickyHeight = $element.outerHeight();
398				const stickyContentBottom = $element.offset().top + stickyHeight;
399				const stickyViewportOffset = $window.height() - stickyHeight - settings['bottomSpacing'];
400
401				$('body').addClass('jet-sticky-container');
402
403				$window.on( 'scroll.jetSticky', function () {
404					const scrollPosition = $window.scrollTop();
405
406					if ( scrollPosition + $window.height() >= stickyContentBottom ) {
407						$element.css({
408							position: 'sticky',
409							top: stickyViewportOffset + 'px',
410							bottom: 'auto',
411							left: 'auto',
412							zIndex: settings['zIndex'],
413						});
414					}
415				});
416
417				$observerTarget.on( 'destroy.jetSticky', function () {
418					$window.off( 'scroll.jetSticky' );
419					$('body').removeClass('jet-sticky-container');
420				});
421			}
422
423			function initDefaultSticky( $element, settings ) {
424				$('body').addClass('jet-sticky-container');
425				$element.addClass( 'jet-sticky-container-sticky' );
426				$element.css({ 
427					'top': settings['topSpacing'], 
428					'bottom': settings['bottomSpacing']
429				});
430			}
431
432			function resizeDebounce() {
433				var currentDeviceMode = elementorFrontend.getCurrentDeviceMode(),
434					availableDevices  = settings['stickyOn'] || [],
435					isInit            = $target.data( 'stickyColumnInit' );
436
437				if ( -1 !== availableDevices.indexOf( currentDeviceMode ) ) {
438					if ( ! isInit ) {
439						$target.data( 'stickyColumnInit', true );
440						stickyInstance = new StickySidebar( $target[0], stickyInstanceOptions );
441						stickyInstance.updateSticky();
442					}
443				} else {
444					$target.data( 'stickyColumnInit', false );
445					stickyInstance.destroy();
446				}
447			}
448		},
449
450		elementorWidget: function( $scope ) {
451			var parallaxInstance = null,
452				satelliteInstance = null,
453				tooltipInstance = null;
454
455			parallaxInstance = new jetWidgetParallax( $scope );
456			parallaxInstance.init();
457
458			satelliteInstance = new jetWidgetSatellite( $scope );
459			satelliteInstance.init();
460
461			tooltipInstance = new jetWidgetTooltip( $scope );
462			tooltipInstance.init();
463
464		},
465
466		getElementorElementSettings: function( $scope ) {
467
468			if ( window.elementorFrontend && window.elementorFrontend.isEditMode() && $scope.hasClass( 'elementor-element-edit-mode' ) ) {
469				return JetTricks.getEditorElementSettings( $scope );
470			}
471
472			return $scope.data( 'settings' ) || {};
473		},
474
475		getEditorElementSettings: function( $scope ) {
476			var modelCID = $scope.data( 'model-cid' ),
477				elementData;
478
479			if ( ! modelCID ) {
480				return {};
481			}
482
483			if ( ! elementor.hasOwnProperty( 'config' ) ) {
484				return {};
485			}
486
487			if ( ! elementor.config.hasOwnProperty( 'elements' ) ) {
488				return {};
489			}
490
491			if ( ! elementor.config.elements.hasOwnProperty( 'data' ) ) {
492				return {};
493			}
494
495			elementData = elementor.config.elements.data[ modelCID ];
496
497			if ( ! elementData ) {
498				return {};
499			}
500
501			return elementData.toJSON();
502		},
503
504		widgetViewMore: function( $scope ) {
505			var $target         = $scope.find( '.jet-view-more' ),
506				instance        = null,
507				settings        = $target.data( 'settings' );
508
509			instance = new jetViewMore( $target, settings );
510			instance.init();
511		},
512
513		widgetUnfold: function( $scope ) {
514			var $target                = $scope.find( '.jet-unfold' ),
515				$button                = $( '.jet-unfold__button', $target ),
516				$mask                  = $( '.jet-unfold__mask', $target ),
517				$content               = $( '.jet-unfold__content', $target ),
518				$contentInner          = $( '.jet-unfold__content-inner', $target),
519				$trigger               = $( '.jet-unfold__trigger', $target),
520				$separator             = $( '.jet-unfold__separator', $target ),
521				settings               = $.extend( {}, $target.data( 'settings' ), JetTricks.getElementorElementSettings( $scope ) ),
522				maskBreakpointsHeights = [],
523				prevBreakpoint         = '',
524				unfoldDuration         = settings['unfoldDuration'] || settings['unfold_duration'],
525				foldDuration           = settings['foldDuration'] || settings['fold_duration'],
526				unfoldEasing           = settings['unfoldEasing'] || settings['unfold_easing'],
527				foldEasing             = settings['foldEasing'] || settings['fold_easing'],
528				maskHeightAdv          = 20,
529				heightCalc             = '',
530				autoHide               = settings['autoHide'] || false,
531				autoHideTime           = settings['autoHideTime'] && 0 != settings['autoHideTime']['size'] ? settings['autoHideTime']['size'] : 5,
532				hideOutsideClick       = settings['hideOutsideClick'] || false,
533				autoHideTrigger,
534				activeBreakpoints      = elementor.config.responsive.activeBreakpoints,
535				initialLoaded          = false;
536
537			function updateMaskGradientClass() {
538				if (settings.separatorType === 'gradient') {
539					if ($target.hasClass('jet-unfold-state') || $trigger.is(':hidden')) {
540						$mask.removeClass('jet-unfold__mask-gradient');
541					} else {
542						$mask.addClass('jet-unfold__mask-gradient');
543					}
544				}
545			}
546
547			maskBreakpointsHeights['desktop']    = [];
548			maskBreakpointsHeights['widescreen'] = [];
549
550			maskBreakpointsHeights['desktop']['maskHeight'] = '' != settings['mask_height']['size'] ? settings['mask_height']['size'] : 50;
551
552			prevBreakpoint = 'desktop';
553
554			Object.keys(  activeBreakpoints ).reverse().forEach(  function( breakpointName ) {
555
556				if ( 'widescreen' === breakpointName ) {
557					maskBreakpointsHeights['widescreen']['maskHeight'] = '' != settings['mask_height_widescreen']['size'] ? settings['mask_height_widescreen']['size'] : maskBreakpointsHeights['desktop']['maskHeight'];
558				} else {
559					maskBreakpointsHeights[breakpointName] = [];
560
561					maskBreakpointsHeights[breakpointName]['maskHeight'] = '' != settings['mask_height_' + breakpointName]['size'] ? settings['mask_height_' + breakpointName]['size'] : maskBreakpointsHeights[prevBreakpoint]['maskHeight'];
562
563					prevBreakpoint = breakpointName;
564				}
565			} );
566
567			onLoaded();
568
569			if ( typeof ResizeObserver !== 'undefined' ) {
570				new ResizeObserver( function( entries ) {
571					if ( $target.hasClass( 'jet-unfold-state' ) ) {
572						$mask.css( {
573							'height': $contentInner.outerHeight()
574						} );
575					}
576				} ).observe( $contentInner[0] );
577			}
578			
579			if ( 'true' === hideOutsideClick ) {
580				$( window ).on( 'mouseup', function( event ) {
581					let container = $target;
582					if ( !container.is( event.target ) && 0 === container.has( event.target ).length && $target.hasClass( 'jet-unfold-state' ) ) {
583						$button.trigger( 'click' );
584					}
585				} )
586			}
587
588			$target.one('transitionend webkitTransitionEnd oTransitionEnd', function() {
589				if ( !initialLoaded ) {
590					onLoaded();
591					initialLoaded = true;
592				}
593			});
594
595			function onLoaded() {
596				initialLoaded = true;
597
598				var deviceHeight = getDeviceHeight();
599
600				heightCalc = +deviceHeight + maskHeightAdv;
601
602				if ( heightCalc < $contentInner.height() ) {
603
604					if ( ! $target.hasClass( 'jet-unfold-state' ) ) {
605						$separator.css( {
606							'opacity': '1'
607						} );
608					}
609
610					if ( ! $target.hasClass( 'jet-unfold-state' ) ) {
611						$mask.css( {
612							'height': deviceHeight
613						} );
614					} else {
615						$mask.css( {
616							'height': $contentInner.outerHeight()
617						} );
618					}
619					$trigger.css( 'display', 'flex' );
620					updateMaskGradientClass();
621				} else {
622					$trigger.hide();
623					$mask.css( {
624						'height': '100%'
625					} );
626					$content.css( {
627						'max-height': 'none'
628					} );
629					$separator.css( {
630						'opacity': '0'
631					} );
632					updateMaskGradientClass();
633				}
634			}
635
636			$( window ).on( 'resize.jetWidgetUnfold orientationchange.jetWidgetUnfold', JetTricksTools.debounce( 50, function(){
637				initialLoaded = false;
638				onLoaded();
639			} ) );
640
641			$button.keypress( function( e ) {
642				if ( e.which == 13 ) {
643					$button.click();
644					return false;
645				}
646			} );
647
648			$button.on( 'click.jetUnfold', function(e) {
649				var $this         = $( this ),
650					$buttonText   = $( '.jet-unfold__button-text', $this ),
651					unfoldText    = $this.data( 'unfold-text' ),
652					foldText      = $this.data( 'fold-text' ),
653					$buttonIcon   = $( '.jet-unfold__button-icon', $this ),
654					unfoldIcon    = $this.data( 'unfold-icon' ),
655					foldIcon      = $this.data( 'fold-icon' ),
656					contentHeight = $contentInner.outerHeight(),
657					deviceHeight  = getDeviceHeight();
658
659				e.preventDefault();
660
661				if ( ! $target.hasClass( 'jet-unfold-state' ) ) {
662					$target.addClass( 'jet-unfold-state' );
663
664					$separator.css( {
665						'opacity': '0'
666					} );
667
668					$buttonIcon.html( foldIcon );
669					$buttonText.html( foldText );
670
671					// Force recalculation of content height after state change
672					setTimeout(function() {
673						contentHeight = $contentInner.outerHeight();
674						
675						anime( {
676							targets: $mask[0],
677							height: contentHeight,
678							duration: unfoldDuration['size'],
679							easing: unfoldEasing,
680							complete: function( anim ) {
681								// Recalculate listing masonry.
682								$( document ).trigger( 'jet-engine/listing/recalculate-masonry' );
683							}
684						} );
685					}, 0);
686
687					if ( 'true' === autoHide ) {
688						autoHideTrigger = setTimeout( function() {
689							$button.trigger( 'click' );
690						}, autoHideTime * 1000 );
691					}
692				} else {
693					clearTimeout( autoHideTrigger );
694
695					$target.removeClass( 'jet-unfold-state' );
696
697					$separator.css( {
698						'opacity': '1'
699					} );
700
701					$buttonIcon.html( unfoldIcon );
702					$buttonText.html( unfoldText );
703
704					anime( {
705						targets: $mask[0],
706						height: deviceHeight,
707						duration: foldDuration['size'],
708						easing: foldEasing,
709						complete: function( anim ) {
710							if ( 'true' === settings['foldScrolling'] ) {
711								$( 'html, body' ).animate( {
712									scrollTop: $target.offset().top - settings['foldScrollOffset']['size']
713								}, 'slow' );
714							}
715
716							// Recalculate listing masonry.
717							$( document ).trigger( 'jet-engine/listing/recalculate-masonry' );
718						}
719					} );
720				}
721				
722				updateMaskGradientClass();
723			} );
724
725			function getDeviceHeight() {
726				let device = elementorFrontend.getCurrentDeviceMode();
727				let heightSettings;
728
729				switch ( device ) {
730
731					case 'mobile':
732						heightSettings = settings.mask_height_mobile;
733						break;
734
735					case 'tablet':
736						heightSettings = settings.mask_height_tablet;
737						break;
738
739					default:
740						heightSettings = settings.mask_height;
741
742				}
743
744				if ( ! heightSettings || ! heightSettings.size || ! heightSettings.unit ) {
745					heightSettings = settings.mask_height;
746				}
747
748				switch ( heightSettings.unit ) {
749
750					case 'vh':
751						return ( window.innerHeight * heightSettings.size ) / 100;
752
753					case '%':
754						let parentHeight = $contentInner.parent().height();
755						return ( parentHeight * heightSettings.size ) / 100;
756
757					default:
758						return heightSettings.size;
759				}
760			}
761		},
762
763		widgetHotspots: function( $scope ) {
764			var $target   = $scope.find( '.jet-hotspots' ),
765				$hotspots = $( '.jet-hotspots__item', $target),
766				settings  = $target.data( 'settings' ),
767				editMode  = Boolean( elementor.isEditMode() ),
768				itemActiveClass = 'jet-hotspots__item--active';
769
770			$target.imagesLoaded().progress( function() {
771				$target.addClass( 'image-loaded' );
772			} );
773
774			$hotspots.each( function( index ) {
775				var $this          = $( this ),
776					horizontal     = $this.data( 'horizontal-position' ),
777					vertical       = $this.data( 'vertical-position' ),
778					tooltipWidth   = $this.data( 'tooltip-width' ) || null,
779					itemSelector   = $this[0],
780					options        = {};
781
782				$this.css( {
783					'left': horizontal + '%',
784					'top': vertical + '%'
785				} );
786
787				if ( itemSelector._tippy ) {
788					itemSelector._tippy.destroy();
789				}
790
791				options = {
792					content: $this.data('tippy-content'),
793					arrow: settings['tooltipArrow'] ? true : false,
794					placement: settings['tooltipPlacement'],
795					trigger: settings['tooltipTrigger'],
796					appendTo: editMode ? document.body : $target[0],
797					hideOnClick: 'manual' !== settings['tooltipTrigger'],
798					maxWidth: 'none',
799					offset: [0, settings['tooltipDistance']['size']],
800					allowHTML: true,
801					interactive: settings['tooltipInteractive'] ? true : false,
802					onShow( instance ) {
803						$( itemSelector ).addClass( itemActiveClass );
804
805						if ( tooltipWidth ) {
806							instance.popper.querySelector( '.tippy-box' ).style.width = tooltipWidth;
807						}
808
809					},
810					onHidden( instance ) {
811						$( itemSelector ).removeClass( itemActiveClass );
812					}
813				}
814
815				if ( 'manual' != settings['tooltipTrigger'] ) {
816					options['duration']  = [ settings['tooltipShowDuration']['size'], settings['tooltipHideDuration']['size'] ];
817					options['animation'] = settings['tooltipAnimation'];
818					options['delay']     = settings['tooltipDelay'];
819				}
820
821				tippy( [ itemSelector ], options );
822
823				if ( 'manual' === settings['tooltipTrigger'] && itemSelector._tippy ) {
824					itemSelector._tippy.show();
825				}
826
827				if ( settings['tooltipShowOnInit'] && itemSelector._tippy ) {
828					itemSelector._tippy.show();
829				}
830
831			} );
832		},
833
834		columnEditorSettings: function( columnId ) {
835			var editorElements = null,
836				columnData     = {};
837
838			if ( ! window.elementor.hasOwnProperty( 'elements' ) ) {
839				return false;
840			}
841
842			editorElements = window.elementor.elements;
843
844			if ( ! editorElements.models ) {
845				return false;
846			}
847
848			$.each( editorElements.models, function( index, obj ) {
849
850				$.each( obj.attributes.elements.models, function( index, obj ) {
851					if ( columnId == obj.id ) {
852						columnData = obj.attributes.settings.attributes;
853					}
854				} );
855
856			} );
857
858			return {
859				'sticky': columnData['jet_tricks_column_sticky'] || false,
860				'topSpacing': columnData['jet_tricks_top_spacing'] || 50,
861				'bottomSpacing': columnData['jet_tricks_bottom_spacing'] || 50,
862				'stickyOn': columnData['jet_tricks_column_sticky_on'] || [ 'desktop', 'tablet', 'mobile']
863			}
864
865		},
866
867		sectionEditorSettings: function( $scope ) {
868			var editorElements = null,
869				sectionData     = {};
870
871			if ( ! window.elementor.hasOwnProperty( 'elements' ) ) {
872				return false;
873			}
874
875			sectionData = JetTricks.getElementorElementSettings( $scope );
876
877			return {
878				'particles': sectionData['section_jet_tricks_particles'] || 'false',
879				'particles_json': sectionData['section_jet_tricks_particles_json'] || '',
880			}
881
882		}
883
884	};
885
886	$( window ).on( 'elementor/frontend/init', JetTricks.init );
887
888	var JetTricksTools = {
889		debounce: function( threshold, callback ) {
890			var timeout;
891
892			return function debounced( $event ) {
893				function delayed() {
894					callback.call( this, $event );
895					timeout = null;
896				}
897
898				if ( timeout ) {
899					clearTimeout( timeout );
900				}
901
902				timeout = setTimeout( delayed, threshold );
903			};
904		},
905
906		widgetEditorSettings: function( widgetId ) {
907			var editorElements = null,
908				widgetData = {};
909		
910			if ( !window.elementor.hasOwnProperty( 'elements' ) || !window.elementor.elements.models ) {
911				return false;
912			}
913		
914			editorElements = window.elementor.elements;
915		
916			function findWidgetById( models, widgetId ) {
917				let foundData = null;
918		
919				$.each( models, function( index, obj ) {
920					if ( obj.id === widgetId ) {
921						foundData = obj.attributes.settings.attributes;
922						return false;
923					}
924					if ( obj.attributes.elements && obj.attributes.elements.models ) {
925						foundData = findWidgetById( obj.attributes.elements.models, widgetId );
926						if ( foundData ) {
927							return false;
928						}
929					}
930				});
931		
932				return foundData;
933			}
934		
935			widgetData = findWidgetById( editorElements.models, widgetId ) || {};
936
937			return {
938				'speed': widgetData['jet_tricks_widget_parallax_speed'] || { 'size': 50, 'unit': '%'},
939				'parallax': widgetData['jet_tricks_widget_parallax'] || 'false',
940				'invert': widgetData['jet_tricks_widget_parallax_invert'] || 'false',
941				'stickyOn': widgetData['jet_tricks_widget_parallax_on'] || [ 'desktop', 'tablet', 'mobile'],
942				'satellite': widgetData['jet_tricks_widget_satellite'] || 'false',
943				'satelliteType': widgetData['jet_tricks_widget_satellite_type'] || 'text',
944				'satellitePosition': widgetData['jet_tricks_widget_satellite_position'] || 'top-center',
945				'satelliteText': widgetData['jet_tricks_widget_satellite_text'] || 'Lorem Ipsum',
946				'satelliteIcon': widgetData['selected_jet_tricks_widget_satellite_icon'] || '',
947				'satelliteImage': widgetData['jet_tricks_widget_satellite_image'] || '',
948				'satelliteLink': widgetData['jet_tricks_widget_satellite_link'] || '',
949				'tooltip': widgetData['jet_tricks_widget_tooltip'] || 'false',
950				'tooltipDescription': widgetData['jet_tricks_widget_tooltip_description'] || 'Lorem Ipsum',
951				'tooltipPlacement': widgetData['jet_tricks_widget_tooltip_placement'] || 'top',
952				'tooltipArrow': 'true' === widgetData['jet_tricks_widget_tooltip_arrow'] ? true : false,
953				'xOffset': widgetData['jet_tricks_widget_tooltip_x_offset'] || 0,
954				'yOffset': widgetData['jet_tricks_widget_tooltip_y_offset'] || 0,
955				'tooltipAnimation': widgetData['jet_tricks_widget_tooltip_animation'] || 'shift-toward',
956				'tooltipTrigger': widgetData['jet_tricks_widget_tooltip_trigger'] || 'mouseenter',
957				'customSelector': widgetData['jet_tricks_widget_tooltip_custom_selector'] || '',
958				'zIndex': widgetData['jet_tricks_widget_tooltip_z_index'] || '999',
959				'delay': widgetData['jet_tricks_widget_tooltip_delay'] || '0'
960			}
961		}
962	}
963
964	/**
965	 * Jet jetViewMore Class
966	 *
967	 * @return {void}
968	 */
969	window.jetViewMore = function( $selector, settings ) {
970		var self            = this,
971			$window         = $( window ),
972			$button         = $( '.jet-view-more__button', $selector ),
973			defaultSettings = {
974				sections: {},
975				effect: 'move-up',
976				showall: false
977			},
978			settings        = $.extend( {}, defaultSettings, settings ),
979			sections        = settings['sections'],
980			sectionsData    = {},
981			editMode        = Boolean( elementor.isEditMode() ),
982			readLess      = settings['read_less'] || false,
983			readMoreLabel   = settings['read_more_label'],
984			readLessLabel   = settings['read_less_label'],
985			readMoreIcon    = settings['read_more_icon'],
986			readLessIcon    = settings['read_less_icon'],
987			hideAll         = settings['hide_all'] || false,
988			isOpened        = false;
989
990		/**
991		 * Init
992		 */
993		self.init = function() {
994			self.setSectionsData();
995
996			if ( editMode ) {
997				return false;
998			}			
999
1000			function hideSection($section) {
1001				// Apply hide effect if available
1002				if (settings['hide_effect'] && settings['hide_effect'] !== 'none') {
1003					$section.addClass('view-more-hiding');
1004					$section.addClass('jet-tricks-' + settings['hide_effect'] + '-hide-effect');
1005					
1006					// Remove classes after animation completes
1007					(function($currentSection) {
1008						$currentSection.on('animationend', function animationEndHandler() {
1009							$currentSection.off('animationend', animationEndHandler);
1010							$currentSection.removeClass('view-more-hiding');
1011							$currentSection.removeClass('jet-tricks-' + settings['hide_effect'] + '-hide-effect');
1012							$currentSection.css('height', '');
1013							$currentSection.removeClass('view-more-visible');
1014							$currentSection.removeClass('jet-tricks-' + settings['effect'] + '-effect');
1015						});
1016					})($section);
1017				} else {
1018					$section.css('height', '');
1019					$section.removeClass('view-more-visible');
1020					$section.removeClass('jet-tricks-' + settings['effect'] + '-effect');
1021				}
1022			}
1023
1024			function showAllSections() {
1025				for ( var section in sectionsData ) {
1026					var $section = sectionsData[ section ]['selector'];
1027					sectionsData[ section ]['visible'] = true;
1028					$section.css('height', $section[0].scrollHeight + 'px');
1029					$section.addClass( 'view-more-visible' );
1030					$section.addClass( 'jet-tricks-' + settings['effect'] + '-effect' );
1031				}
1032			}
1033
1034			function hideAllSections() {
1035				for ( var section in sectionsData ) {
1036					var $section = sectionsData[ section ]['selector'];
1037					sectionsData[ section ]['visible'] = false;
1038					hideSection($section);
1039				}
1040			}
1041
1042			function showNextSection() {
1043				for ( var section in sectionsData ) {
1044					var $section = sectionsData[ section ]['selector'];
1045					if ( !sectionsData[ section ]['visible'] ) {
1046						sectionsData[ section ]['visible'] = true;
1047						$section.css('height', $section[0].scrollHeight + 'px');
1048						$section.addClass( 'view-more-visible' );
1049						$section.addClass( 'jet-tricks-' + settings['effect'] + '-effect' );
1050						break;
1051					}
1052				}
1053			}
1054
1055			function hideNextSection() {
1056				var sectionKeys = Object.keys(sectionsData).reverse();
1057				for (var i = 0; i < sectionKeys.length; i++) {
1058					var sectionKey = sectionKeys[i];
1059					var $section = sectionsData[sectionKey]['selector'];
1060					if (sectionsData[sectionKey]['visible']) {
1061						sectionsData[sectionKey]['visible'] = false;
1062						hideSection($section);
1063						break;
1064					}
1065				}
1066			}
1067
1068			$button.on('click', function() {
1069				if (readLess) {
1070					if (!isOpened) {
1071						if (!settings.showall) {
1072							showNextSection();
1073							var allVisible = true;
1074							for (var section in sectionsData) {
1075								if (!sectionsData[section]['visible']) {
1076									allVisible = false;
1077									break;
1078								}
1079							}
1080							if (allVisible) {
1081								$button.find('.jet-view-more__label').text(readLessLabel);
1082								if (readLessIcon && readLessIcon.value) {
1083									$button.find('.jet-view-more__icon').html('<i class="' + readLessIcon.value + '"></i>');
1084								}
1085								$button.addClass('jet-view-more__button--read-less');
1086								isOpened = true;
1087							}
1088						} else {
1089							showAllSections();
1090							$button.find('.jet-view-more__label').text(readLessLabel);
1091							if (readLessIcon && readLessIcon.value) {
1092								$button.find('.jet-view-more__icon').html('<i class="' + readLessIcon.value + '"></i>');
1093							}
1094							$button.addClass('jet-view-more__button--read-less');
1095							isOpened = true;
1096						}
1097					} else {
1098						if (hideAll) {
1099							hideAllSections();
1100							$button.find('.jet-view-more__label').text(readMoreLabel);
1101							if (readMoreIcon && readMoreIcon.value) {
1102								$button.find('.jet-view-more__icon').html('<i class="' + readMoreIcon.value + '"></i>');
1103							}
1104							$button.removeClass('jet-view-more__button--read-less');
1105							isOpened = false;
1106						} else {
1107							hideNextSection();
1108							var allHidden = true;
1109							for (var section in sectionsData) {
1110								if (sectionsData[section]['visible']) {
1111									allHidden = false;
1112									break;
1113								}
1114							}
1115							if (allHidden) {
1116								$button.find('.jet-view-more__label').text(readMoreLabel);
1117								if (readMoreIcon && readMoreIcon.value) {
1118									$button.find('.jet-view-more__icon').html('<i class="' + readMoreIcon.value + '"></i>');
1119								}
1120								$button.removeClass('jet-view-more__button--read-less');
1121								isOpened = false;
1122							}
1123						}
1124					}
1125				} else {
1126					if (!settings.showall) {
1127						showNextSection();
1128					} else {
1129						showAllSections();
1130					}
1131					var allVisible = true;
1132					for (var section in sectionsData) {
1133						if (!sectionsData[section]['visible']) {
1134							allVisible = false;
1135							break;
1136						}
1137					}
1138					if (allVisible) {
1139						$button.css({ 'display': 'none' });
1140					}
1141				}
1142			});
1143
1144			$button.keydown(function(e) {
1145				var $which = e.which || e.keyCode;
1146				if ($which == 13 || $which == 32) {
1147					e.preventDefault();
1148					if (readLess) {
1149						$button.trigger('click');
1150					} else {
1151						if (!settings.showall) {
1152							showNextSection();
1153						} else {
1154							showAllSections();
1155						}
1156						var allVisible = true;
1157						for (var section in sectionsData) {
1158							if (!sectionsData[section]['visible']) {
1159								allVisible = false;
1160								break;
1161							}
1162						}
1163						if (allVisible) {
1164							$button.css({ 'display': 'none' });
1165						}
1166					}
1167				}
1168			});
1169		};
1170
1171		self.setSectionsData = function() {
1172
1173			for ( var section in sections ) {
1174				var $selector = $( '#' + sections[ section ] );
1175
1176				if ( ! editMode ) {
1177					$selector.addClass( 'jet-view-more-section' );
1178				} else {
1179					$selector.addClass( 'jet-view-more-section-edit-mode' );
1180				}
1181
1182				sectionsData[ section ] = {
1183					'section_id': sections[ section ],
1184					'selector': $selector,
1185					'visible': false,
1186				}
1187			}
1188		};
1189	};
1190
1191	/**
1192	 * [jetWidgetParallax description]
1193	 * @param  {[type]} $scope [description]
1194	 * @return {[type]}        [description]
1195	 */
1196	window.jetWidgetParallax = function( $scope ) {
1197		var self         = this,
1198			$target      = $scope,
1199			$section     = $scope.closest( '.elementor-top-section' ),
1200			widgetId     = $scope.data('id'),
1201			settings     = {},
1202			editMode     = Boolean( elementor.isEditMode() ),
1203			$window      = $( window ),
1204			isSafari     = !!navigator.userAgent.match(/Version\/[\d\.]+.*Safari/),
1205			platform     = navigator.platform,
1206			safariClass  = isSafari ? 'is-safari' : '',
1207			macClass    = 'MacIntel' == platform ? ' is-mac' : '';
1208
1209		/**
1210		 * Init
1211		 */
1212		self.init = function() {
1213
1214			$scope.addClass( macClass );
1215
1216			if ( ! editMode ) {
1217				settings = $scope.data( 'jet-tricks-settings' );
1218			} else {
1219				settings = JetTricksTools.widgetEditorSettings( widgetId );
1220			}
1221
1222			if ( ! settings ) {
1223				return false;
1224			}
1225
1226			if ( 'undefined' === typeof settings ) {
1227				return false;
1228			}
1229
1230			if ( 'false' === settings['parallax'] || 'undefined' === typeof settings['parallax'] ) {
1231				return false;
1232			}
1233
1234			$window.on( 'scroll.jetWidgetParallax resize.jetWidgetParallax', self.scrollHandler ).trigger( 'resize.jetWidgetParallax' );
1235		};
1236
1237		self.scrollHandler = function( event ) {
1238			var speed             = +settings['speed']['size'] * 0.01,
1239				invert            = 'true' == settings['invert'] ? -1 : 1,
1240				winHeight         = $window.height(),
1241				winScrollTop      = $window.scrollTop(),
1242				offsetTop         = $scope.offset().top,
1243				thisHeight        = $scope.outerHeight(),
1244				sectionHeight     = $section.outerHeight(),
1245				positionDelta     = winScrollTop - offsetTop + ( winHeight / 2 ),
1246				abs               = positionDelta > 0 ? 1 : -1,
1247				posY              = abs * Math.pow( Math.abs( positionDelta ), 0.85 ),
1248				availableDevices  = settings['stickyOn'] || [],
1249				currentDeviceMode = elementorFrontend.getCurrentDeviceMode();
1250
1251			posY = invert * Math.ceil( speed * posY );
1252
1253			if ( -1 !== availableDevices.indexOf( currentDeviceMode ) ) {
1254				$target.css( {
1255					'transform': 'translateY(' + posY + 'px)'
1256				} );
1257			} else {
1258				$target.css( {
1259					'transform': 'translateY(0)'
1260				} );
1261			}
1262		};
1263	};
1264
1265	/**
1266	 * [jetWidgetSatellite description]
1267	 * @param  {[type]} $scope [description]
1268	 * @return {[type]}        [description]
1269	 */
1270	window.jetWidgetSatellite = function( $scope ) {
1271		var self     = this,
1272			widgetId = $scope.data('id'),
1273			settings = {},
1274			editMode = Boolean( elementor.isEditMode() );
1275
1276		/**
1277		 * Init
1278		 */
1279		self.init = function() {
1280
1281			if ( ! editMode ) {
1282				settings = $scope.data( 'jet-tricks-settings' );
1283			} else {
1284				settings = JetTricksTools.widgetEditorSettings( widgetId );
1285			}
1286
1287			if ( ! settings || typeof settings !== 'object' ) {
1288				return false;
1289			}
1290
1291			if ( 'false' === settings['satellite'] || 'undefined' === typeof settings['satellite'] ) {
1292				return false;
1293			}
1294
1295			$scope.addClass( 'jet-satellite-widget' );
1296
1297			$( '.jet-tricks-satellite', $scope ).addClass( 'jet-tricks-satellite--' + settings['satellitePosition'] );
1298
1299			//satellite display in edit mode
1300			if ( editMode && $scope.find( '.jet-tricks-satellite' ).length === 0 ) {
1301				var html = '';
1302				var pos = settings['satellitePosition'] || 'top-center';
1303
1304				var link = settings['satelliteLink'] || {};
1305				var linkStart = '', linkEnd = '';
1306				if ( link.url ) {
1307					linkStart = '<a class="jet-tricks-satellite__link">';
1308					linkEnd = '</a>';
1309				}
1310
1311				if ( settings['satelliteType'] === 'text' && settings['satelliteText'] ) {
1312					html = '<div class="jet-tricks-satellite jet-tricks-satellite--' + pos + '"><div class="jet-tricks-satellite__inner"><div class="jet-tricks-satellite__text">' + linkStart + '<span>' + settings['satelliteText'] + '</span>' + linkEnd + '</div></div></div>';
1313				} else if ( settings['satelliteType'] === 'icon' && settings['satelliteIcon'] && settings['satelliteIcon'].value ) {
1314					html = '<div class="jet-tricks-satellite jet-tricks-satellite--' + pos + '"><div class="jet-tricks-satellite__inner"><div class="jet-tricks-satellite__icon">' + linkStart + '<div class="jet-tricks-satellite__icon-instance jet-tricks-icon"><i class="' + settings['satelliteIcon'].value + '"></i></div>' + linkEnd + '</div></div></div>';
1315				} else if ( settings['satelliteType'] === 'image' && settings['satelliteImage'] && settings['satelliteImage'].url ) {
1316					html = '<div class="jet-tricks-satellite jet-tricks-satellite--' + pos + '"><div class="jet-tricks-satellite__inner"><div class="jet-tricks-satellite__image">' + linkStart + '<img class="jet-tricks-satellite__image-instance" src="' + settings['satelliteImage'].url + '" alt="">' + linkEnd + '</div></div></div>';
1317				}
1318
1319				if ( html ) {
1320					$scope.prepend(html);
1321				}
1322			}
1323		};
1324	};
1325
1326	/**
1327	 * [jetWidgetTooltip description]
1328	 * @param  {[type]} $scope [description]
1329	 * @return {[type]}        [description]
1330	 */
1331	window.jetWidgetTooltip = function( $scope ) {
1332		var self            = this,
1333			widgetId        = $scope.data('id'),
1334			widgetSelector  = $scope[0],
1335			tooltipSelector = widgetSelector,
1336			settings        = {},
1337			editMode        = Boolean( elementor.isEditMode() ),
1338			delay,
1339			tooltipEvent    = editMode ? 'click' : 'mouseenter';
1340
1341		/**
1342		 * Init
1343		 */
1344		self.init = function() {
1345
1346			if ( ! editMode ) {
1347				settings = $scope.data( 'jet-tricks-settings' );
1348			} else {
1349				settings = JetTricksTools.widgetEditorSettings( widgetId );
1350			}
1351
1352			if ( widgetSelector._tippy ) {
1353				widgetSelector._tippy.destroy();
1354			}
1355
1356			if ( ! settings ) {
1357				return false;
1358			}
1359
1360			if ( 'undefined' === typeof settings ) {
1361				return false;
1362			}
1363
1364			if ( 'false' === settings['tooltip'] || 'undefined' === typeof settings['tooltip'] || '' === settings['tooltipDescription'] ) {
1365				return false;
1366			}
1367
1368			$scope.addClass( 'jet-tooltip-widget' );
1369
1370			if ( settings['customSelector'] ) {
1371				tooltipSelector = $( '.' + settings['customSelector'], $scope )[0];
1372			}
1373
1374			if ( editMode && ! $( '#jet-tricks-tooltip-content-' + widgetId )[0] ) {
1375				var template = $( '<div>', {
1376					id: 'jet-tricks-tooltip-content-' + widgetId,
1377					class: 'jet-tooltip-widget__content'
1378				} );
1379
1380				template.html( settings['tooltipDescription'] );
1381				$scope.append( template );
1382			}
1383
1384			tippy(
1385				[ tooltipSelector ],
1386				{
1387					content: $scope.find( '.jet-tooltip-widget__content' )[0].innerHTML,
1388					allowHTML: true,
1389					//appendTo: widgetSelector,
1390					appendTo: editMode ? document.body : widgetSelector,
1391					arrow: settings['tooltipArrow'] ? true : false,
1392					placement: settings['tooltipPlacement'],
1393					offset: [ settings['xOffset'], settings['yOffset'] ],
1394					animation: settings['tooltipAnimation'],
1395					trigger: settings['tooltipTrigger'],
1396					interactive: true,
1397					zIndex: settings['zIndex'],
1398					maxWidth: 'none',
1399					delay: settings['delay']['size'] ? settings['delay']['size'] : 0,
1400					onCreate: function (instance) {
1401						if ( editMode ) {
1402							var dataId = tooltipSelector.getAttribute('data-id');
1403							if ( dataId ) {
1404								instance.popper.classList.add( 'tippy-' + dataId );
1405							}
1406						}
1407					}
1408				}
1409			);
1410
1411			if ( editMode && widgetSelector._tippy ) {
1412				widgetSelector._tippy.show();
1413			}
1414
1415		};
1416	};
1417	
1418}( jQuery, window.elementorFrontend ) );

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.