1(function ($) { 2 3 "use strict"; 4 5 var NavMenuHandler = function( $scope, $ ) { 6 7 var $widgetContainer = $scope.find('.trx-addons-nav-widget-container'); 8 9 // we don't need to wait for content dom load since the script is loaded in the footer. 10 // $widgetContainer.removeClass('trx-addons-invisible'); 11 12 if ( ! elementorFrontend.isEditMode() ) { 13 $widgetContainer.css({ visibility: 'inherit', opacity: 'inherit' }); 14 } 15 16 var settings = $widgetContainer.data('settings'); 17 18 if ( ! settings ) { 19 return; 20 } 21 22 var $menuContainer = $scope.find('.trx-addons-mobile-menu'), 23 $menuToggler = $scope.find('.trx-addons-hamburger-toggle'), 24 $hamMenuCloser = $scope.find('.trx-addons-mobile-menu-close'), 25 $centeredItems = $scope.find('.trx-addons-mega-content-centered'), 26 $fullWidthItems = $scope.find('.trx-addons-nav-menu-container').find('li.trx-addons-mega-nav-item,li[data-full-width="true"],li[class*="trx_addons_stretch_"]'), 27 disablePageScroll = $scope.hasClass('trx-addons-disable-scroll-yes') ? true : false, 28 hoverTimeout, 29 mobileMenuTransitionSpeed = trx_addons_apply_filters( 'trx_addons_filter_nav_menu_mobile_transition_speed' , 'normal' ); 30 31 jQuery( document ).on( 'action.menu-collapse-items-moved', function( e, action ) { 32 $fullWidthItems = $scope.find('.trx-addons-nav-menu-container').find('li.trx-addons-mega-nav-item,li[data-full-width="true"],li[class*="trx_addons_stretch_"]'); 33 } ); 34 35 // Get Element On Page Option 36 $scope.find('div[data-mega-content]').each( function( index, elem ) { 37 var $currentItem = $(elem), 38 targetElement = $currentItem.data('mega-content'); 39 if ( $(targetElement).length > 0 ) { 40 var $targetElement = $(targetElement); 41 $targetElement.attr( 'data-menu-id', $scope.data('id') ); 42 $currentItem.append( $targetElement.clone(true).addClass('trx-addons-cloned-element') ); 43 } 44 } ); 45 46 // Remove Element On Page Option If on Frontend 47 if ( ! elementorFrontend.isEditMode() ) { 48 $('div[data-menu-id="' + $scope.data('id') + '"]').not('.trx-addons-cloned-element').remove(); 49 } 50 51 /** 52 * Save current device to use it later to determine if the device changed on resize. 53 */ 54 // window.trxCurrStickyDevice = elementorFrontend.getCurrentDeviceMode(); 55 56 // make sure it's removed when the option is disabled. 57 if ( elementorFrontend.isEditMode() && ! disablePageScroll ) { 58 $('body').removeClass('trx-addons-scroll-disabled'); 59 } 60 61 $centeredItems.each( function( index, item ) { 62 $(item).closest(".trx-addons-nav-menu-item").addClass("trx-addons-mega-item-static"); 63 } ); 64 65 if ( 'slide' === settings.mobileLayout || 'slide' === settings.mainLayout ) { 66 $scope.addClass('trx-addons-ver-hamburger-menu'); 67 } 68 69 // check badges dot/grow effect. 70 if ( 'dot' === settings.hoverEffect ) { 71 var $badgedItems = $scope.find('.trx-addons-mega-content-container .trx-addons-badge-dot, .trx-addons-sub-menu .trx-addons-badge-dot'); 72 $badgedItems.each( function( index, $item ) { 73 $( $item ) 74 .mouseenter( function() { 75 $( $item ).removeClass('trx-addons-badge-dot'); 76 } ) 77 .mouseleave( function() { 78 $($item).addClass('trx-addons-badge-dot'); 79 } ); 80 } ); 81 } 82 83 // close mobile menu after clicking. 84 if ( settings.closeAfterClick ) { 85 $menuContainer.find('.trx-addons-menu-link').on( 'click.trxAfterClick', function () { 86 // check if it has children 87 var hasChildern = itemHasChildren( this ); 88 89 if ( ! hasChildern || jQuery(this).attr('href') !== '#' ) { 90 // close mobile menu 91 if ( 'slide' === settings.mainLayout || 'slide' === settings.mobileLayout ) { 92 // if ($scope.hasClass('trx-addons-nav-slide')) { 93 $hamMenuCloser.trigger( 'click' ); 94 } else { 95 $menuToggler.trigger( 'click' ); 96 } 97 } 98 } ); 99 } 100 101 var isMobileMenu = null, 102 isDesktopMenu = null; 103 104 checkBreakPoint( settings ); 105 106 if ( $scope.hasClass('trx-addons-nav-hor') ) { 107 $(window).trigger( 'resize' ); 108 // Check dimensions after all other handlers are done. 109 setTimeout( checkMegaContentWidth, 100 ); 110 } 111 112 // checkStickyEffect(); 113 114 if ( ['hor', 'ver'].includes( settings.mainLayout ) ) { 115 116 if ( 'hover' === settings.submenuEvent ) { 117 118 $scope.find('.trx-addons-nav-menu-item') 119 .on( 'focus.trxItemHover', '> a', function(e) { 120 $(this).parent().trigger('mouseenter.trxItemHover'); 121 } ) 122 .on( 'mouseenter.trxItemHover', function(e) { 123 var $this = $(this); 124 e.stopPropagation(); 125 clearTimeout( hoverTimeout ); 126 $this.siblings().removeClass('trx-addons-item-hovered'); // unset hovered items only for this menu. 127 $this.find('.trx-addons-nav-menu-item.trx-addons-item-hovered').removeClass('trx-addons-item-hovered'); // unset hovered items for child submenus. 128 $this.addClass('trx-addons-item-hovered'); 129 if ( $this.hasClass('trx-addons-sub-menu-item') ) { 130 $this.parents('.trx-addons-nav-menu-item').addClass('trx-addons-item-hovered'); 131 } 132 initHiddenElements( $this ); 133 } ); 134 135 $scope.on('mouseleave.trxItemHover', function(e) {
136 var delay = getComputedStyle( $scope[0] ).getPropertyValue( '--trx-addons-mega-menu-delay' ); 137 if ( isNaN( delay ) ) { 138 delay = 300; 139 } 140 hoverTimeout = setTimeout( function () { 141 $scope.find('.trx-addons-item-hovered').removeClass('trx-addons-item-hovered'); 142 }, delay); 143 } ); 144 145 // we need to make sure that trx-addons-item-hover is not removed when hovering over a sub/mega menu. 146 $scope.find('.trx-addons-sub-menu, .trx-addons-mega-content-container') 147 .on( 'mouseenter.trxItemHover', function(e) { 148 var $menuItem = $(this).parents('.trx-addons-nav-menu-item').first(); 149 clearTimeout( hoverTimeout ); 150 $menuItem.siblings().removeClass('trx-addons-item-hovered'); // remove it from the menu item in the same widget only 151 $menuItem.addClass('trx-addons-item-hovered'); 152 initHiddenElements( $menuItem ); 153 } ) 154 .on( 'mouseleave.trxItemHover', function(e) { 155 clearTimeout( hoverTimeout ); 156 // $(this).parents('.trx-addons-nav-menu-item').first().removeClass('trx-addons-item-hovered'); 157 } ); 158 159 } else { // click 160 161 var triggerSelector = 'item' === settings.submenuTrigger ? ' > .trx-addons-menu-link' : ' > .trx-addons-menu-link .trx-addons-dropdown-icon', 162 $trigger = $scope.find('.trx-addons-nav-menu-container .trx-addons-nav-menu-item.menu-item-has-children' + triggerSelector); 163 164 // To prevent events overlapping if the user switched between hover/click while building the menu. 165 if ( elementorFrontend.isEditMode() ) { 166 $scope.off( 'mouseleave.trxItemHover' ); 167 } 168 169 $trigger.off( 'click.trxItemClick' ); // to prevent duplications. 170 $trigger.on( 'click.trxItemClick', function(e) { 171 e.preventDefault(); 172 e.stopPropagation(); 173 var $menuItem = $(this).parents('.trx-addons-nav-menu-item').first(); 174 // remove it from the menu item in the same widget only 175 $menuItem.siblings().removeClass('trx-addons-item-hovered').find('.trx-addons-item-hovered').removeClass('trx-addons-item-hovered'); 176 $menuItem.toggleClass('trx-addons-item-hovered'); 177 initHiddenElements( $menuItem ); 178 } ); 179 } 180 } 181 182 // Close the menu when clicking outside of it (on the overlay). 183 $(document).on('click', '.trx-addons-nav-slide-overlay', function() { 184 $scope.find('.trx-addons-mobile-menu-outer-container, .trx-addons-nav-slide-overlay').removeClass('trx-addons-vertical-toggle-open'); 185 $('body').removeClass('trx-addons-scroll-disabled'); 186 $menuToggler 187 .removeClass('trx-addons-toggle-opened') // show/hide close icon/text. 188 .focus(); 189 } ); 190 191 // Close the menu when clicking on the close button. 192 $hamMenuCloser 193 .on( 'keypress', function (e) { 194 if ( e.which === 13 ) { // Enter key 195 $(this).trigger( 'click' ); 196 } 197 } ) 198 .on( 'click', function() { 199 $scope.find('.trx-addons-mobile-menu-outer-container, .trx-addons-nav-slide-overlay').removeClass('trx-addons-vertical-toggle-open'); 200 $('body').removeClass('trx-addons-scroll-disabled'); 201 $menuToggler 202 .removeClass('trx-addons-toggle-opened') // show/hide close icon/text. 203 .focus(); 204 } ); 205 206 // Toggle the menu when clicking on the hamburger icon. 207 $menuToggler 208 .on( 'keypress', function (e) { 209 if ( e.which === 13 ) { // Enter key 210 $(this).trigger( 'click' ); 211 } 212 } ) 213 .on( 'click', function () { 214 if ('slide' === settings.mobileLayout || 'slide' === settings.mainLayout) { 215 $scope.find('.trx-addons-mobile-menu-outer-container, .trx-addons-nav-slide-overlay') 216 .addClass('trx-addons-vertical-toggle-open'); 217 setTimeout( function() { 218 $scope.find('.trx-addons-mobile-menu-outer-container' ).find( 'a,button' ).eq(0).focus(); 219 }, 300 ); 220 if ( disablePageScroll ) { 221 $('body').addClass('trx-addons-scroll-disabled'); 222 } 223 } else { 224 var $menuParent = $scope.find('.trx-addons-mobile-menu-container'); 225 if ( $menuContainer.hasClass('trx-addons-active-menu') ) { 226 $menuParent.slideUp( mobileMenuTransitionSpeed, function () { 227 $menuContainer.removeClass('trx-addons-active-menu'); 228 $menuParent.show(); 229 } ); 230 } else { 231 $menuParent.hide(); 232 $menuContainer.addClass('trx-addons-active-menu'); 233 $menuParent.slideDown( mobileMenuTransitionSpeed ); 234 } 235 } 236 $menuToggler.toggleClass('trx-addons-toggle-opened'); // show/hide close icon/text. 237 } ); 238 239 $menuContainer 240 .find( '.trx-addons-nav-menu-item.menu-item-has-children a[href="#"]' 241 + ',.trx-addons-nav-menu-item.menu-item-has-children a:not([href="#"]) .trx-addons-dropdown-icon' 242 + ',.trx-addons-mega-nav-item a[href="#"]' 243 + ',.trx-addons-mega-nav-item a:not([href="#"]) .trx-addons-dropdown-icon' ) 244 .on('click', function (e) { 245 var $self = $(this).hasClass( 'trx-addons-dropdown-icon' ) ? $(this).closest('a').eq(0) : $(this), 246 $parent = $self.parent( '.trx-addons-nav-menu-item' ), 247 $submenu = $self.next( '.trx-addons-submenu, .trx-addons-mega-content-container' ); 248 if ( $self.find(".trx-addons-dropdown-icon").length < 1 ) { 249 return; 250 } 251 e.stopPropagation(); 252 e.preventDefault(); 253 var closeSubmenu = function( $item ) { 254 var $submenu = $item.find(' > .trx-addons-submenu, > .trx-addons-mega-content-container'); 255 if ( $submenu.length ) { 256 $submenu.slideUp( mobileMenuTransitionSpeed, function () { 257 $item.removeClass('trx-addons-active-menu trx-addons-active-menu-closing'); 258 $submenu.removeAttr('style'); 259 // close all inner submenus. 260 $submenu 261 .find('.trx-addons-active-menu').removeClass('trx-addons-active-menu') 262 .find('>.trx-addons-submenu, >.trx-addons-mega-content-container').removeAttr('style'); 263 } ); 264 } 265 }; 266 //If it was opened, then close it. 267 if ( $parent.hasClass('trx-addons-active-menu') ) { 268 closeSubmenu( $parent ); 269 } else { 270 // Close any other opened items. 271 $parent.parents('.trx-addons-active-menu').addClass('trx-addons-active-menu-fix'); 272 $menuContainer.find('.trx-addons-active-menu:not(.trx-addons-active-menu-fix)').each( function() { 273 var $item = $(this); 274 if ( ! $item.parents('.trx-addons-active-menu-closing').length ) { 275 closeSubmenu( $item.addClass('trx-addons-active-menu-closing') ); 276 } 277 } ); 278 $parent.parents('.trx-addons-active-menu-fix').removeClass('trx-addons-active-menu-fix'); 279 // Then, open this item. 280 $submenu.slideDown( mobileMenuTransitionSpeed, function () { 281 $parent.addClass('trx-addons-active-menu'); 282 $submenu.removeAttr('style'); 283 initHiddenElements( $parent ); 284 } ); 285 } 286 } ); 287 288 $(document).on('click.trxCloseMegaMenu', function (event) { 289 var isTabsItem = $(event.target).closest('.trx-addons-tabs-nav-list-item').length, 290 isWidgetContainer = $(event.target).closest('.trx-addons-nav-widget-container').length; 291 292 if ( ! isWidgetContainer && ! isTabsItem ) { 293 if ( $( $menuContainer ).hasClass('trx-addons-active-menu') ) { 294 $menuToggler.trigger( 'click' ); 295 } 296 if ( 'click' === settings.submenuEvent ) { 297 $scope.find('.trx-addons-nav-menu-container .trx-addons-item-hovered').removeClass('trx-addons-item-hovered') 298 } 299 } 300 } ); 301 302 $(window).on('resize', function () { 303 304 checkBreakPoint( settings ); 305 306 if ( $scope.hasClass('trx-addons-nav-hor') ) { 307 checkMegaContentWidth(); 308 } 309 } ); 310 311 // vertical toggler. 312 if ( $scope.hasClass('trx-addons-ver-toggle-yes') && $scope.hasClass('trx-addons-ver-click') ) { 313 $scope.find('.trx-addons-ver-toggler').on('click', function() { 314 $widgetContainer.toggleClass( 'trx-addons-ver-collapsed', 500 ); 315 } ); 316 } 317 318 $widgetContainer.addClass( 'trx-addons-nav-menu-inited' ); 319 320 //------------------------------- 321 // Helper Functions 322 //------------------------------- 323 324 // Call action.init_hidden_elements to initialize hidden elements. 325 function initHiddenElements( $item ) { 326 checkMegaContentWidth(); 327 if ( typeof window.trx_addons_shift_submenu !== 'undefined' ) { 328 var $submenu = $item.find('> .trx-addons-submenu, > .trx-addons-mega-content-container'); 329 if ( $submenu.length ) { 330 window.trx_addons_shift_submenu( $submenu ); 331 } 332 } 333 334 $(document).trigger( 'action.init_hidden_elements', [ $item ] ); 335 // setTimeout( function() { 336 // }, 400 ); 337 } 338 339 // Set menu items to full width 340 function checkMegaContentWidth() { 341 $fullWidthItems.each( function( index, item ) { 342 fullWidthContent( $(item).find('>ul') ); 343 } ); 344 } 345 346 // Full Width Mega Content. 347 function fullWidthContent( $item ) { 348 if ( typeof window.trx_addons_shift_submenu !== 'undefined' ) { 349 //window.trx_addons_stretch_submenu( $item ); 350 window.trx_addons_shift_submenu( $item ); 351 } else { 352 var is_mobile_menu = $item.closest( '.trx-addons-mobile-menu-container' ).length > 0; 353 if ( is_mobile_menu ) { 354 $item.removeAttr( 'style' ); 355 return; 356 } 357 var isContainer = elementorFrontend.config.experimentalFeatures.container, 358 $parentSec = $scope.parents('.e-con').last(); 359 360 $parentSec = ! isContainer || $parentSec.length < 1 ? $scope.closest('.elementor-top-section') : $parentSec; 361 362 var width = $parentSec.outerWidth(), 363 sectionLeft = $parentSec.offset().left - $item.offset().left; 364 365 $($item).removeClass('trx-addons-mega-item-static').find('.trx-addons-mega-content-container, > .trx-addons-sub-menu').css({ 366 'width': width + 'px', 367 'max-width': 'none', 368 'left': sectionLeft + 'px', 369 'right': 'auto', 370 'transform': 'none' 371 } ); 372 } 373 } 374 375 function checkBreakPoint( settings ) { 376 377 // Trigger small screen menu. 378 if ( settings.breakpoint >= $(window).outerWidth() && ! isMobileMenu ) { 379 // remove the vertical toggler. 380 $scope.find('.trx-addons-ver-toggler').css('display', 'none'); 381 $scope.addClass('trx-addons-hamburger-menu'); 382 $scope.find('.trx-addons-active-menu').removeClass('trx-addons-active-menu'); 383 // stretchDropdown( $scope.find('.trx-addons-stretch-dropdown .trx-addons-mobile-menu-container') ); 384 385 isMobileMenu = true; 386 isDesktopMenu = false;
387 388 // Trigger large screen menu. 389 } else if ( settings.breakpoint < $(window).outerWidth() && ! isDesktopMenu ) { 390 391 // show the vertical toggler if enabled. 392 if ( $scope.hasClass('trx-addons-ver-toggle-yes') ) { 393 $scope.find('.trx-addons-ver-toggler').css('display', 'flex'); 394 } 395 396 $menuToggler.removeClass('trx-addons-toggle-opened'); 397 $scope.find(".trx-addons-mobile-menu-container .trx-addons-active-menu").removeClass("trx-addons-active-menu"); 398 $scope.removeClass('trx-addons-hamburger-menu trx-addons-ham-dropdown'); 399 $scope.find('.trx-addons-vertical-toggle-open').removeClass('trx-addons-vertical-toggle-open'); 400 $scope.find('.trx-addons-nav-default').removeClass('trx-addons-nav-default'); 401 402 isDesktopMenu = true; 403 isMobileMenu = false; 404 } 405 406 // Stretch dropdown menu. 407 if ( $scope.hasClass( 'trx-addons-hamburger-menu' ) || $scope.hasClass( 'trx-addons-nav-dropdown' ) ) { 408 stretchDropdown( $scope.find('.trx-addons-stretch-dropdown .trx-addons-mobile-menu-container') ); 409 } 410 411 } 412 413 // Full Width Option. Shows the mobile menu beneath the widget's parent(section). 414 function stretchDropdown( $menu ) { 415 416 if ( ! $menu.length ) { 417 return; 418 } 419 420 var isContainer = elementorFrontend.config.experimentalFeatures.container, 421 $parentSec = $scope.parents('.e-con').last(); 422 423 $parentSec = ! isContainer || $parentSec.length < 1 ? $scope.closest('.elementor-top-section') : $parentSec; 424 425 var width = Math.min( trx_addons_window_width(), $($parentSec).outerWidth() ), 426 widgetTop = $scope.offset().top, 427 parentBottom = $($parentSec).offset().top + $($parentSec).outerHeight(), 428 stretchTop = parentBottom - widgetTop, 429 stretchLeft = $scope.offset().left - Math.max( 0, $($parentSec).offset().left ); 430 431 $( $menu ).css({ 432 width: width + 'px', 433 left: '-' + stretchLeft + 'px', 434 top: stretchTop + 'px', 435 } ); 436 } 437 438 /** 439 * Check if the item has children. 440 * 441 * @param {link} $item .trx-addons-menu-link 442 * 443 * @returns boolean true if the item has children. 444 */ 445 function itemHasChildren( $item ) { 446 return $( $item ).parent( '.trx-addons-nav-menu-item' ).hasClass( 'menu-item-has-children' ); 447 } 448 }; 449 450 $( window ).on( 'elementor/frontend/init', function () { 451 elementorFrontend.hooks.addAction('frontend/element_ready/trx_elm_nav_menu.default', NavMenuHandler); 452 } ); 453 454}( jQuery ) );
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.