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.