1/** 2 * cmm4e.js 3 * 4 * @version 1.0.0 5 * @author CleverSoft <[email protected]> 6 */ 7(function($) { 8 'use strict'; 9 10 /** 11 * Main class 12 * 13 * @param {Object} menu 14 */ 15 function Cmm4e(menu) { 16 var mask = null, 17 toggle = null, 18 config = menu.data('config'); 19 20 var $el = { 21 container: null, // A custom container loaded from menu skin 22 cmm4eContainer: menu.parent(), // Default container 23 items: menu.find('.cmm4e-menu-item') 24 }; 25 26 if (config.mobile.toggleDisable === '1' && config.mobile.toggleTrigger) { 27 var trigger = $(config.mobile.toggleTrigger); 28 if (trigger.length === 1) { 29 toggle = trigger; 30 } 31 } 32 33 if (config.container) { 34 var container = $(config.container); 35 if (container.length === 1) { 36 $el.container = container; 37 } 38 } 39 40 if (!$el.container) { 41 $el.container = $el.cmm4eContainer; 42 } 43 44 /** 45 * Insert nav icons, item toggle buttons, mask layer for off-canvas menu. 46 */ 47 function fetchUI() { 48 // Ensure mega panels are wide as container in horizontal orientation. 49 if ('horizontal' === config.desktop.orientation && !cmm4eFrontendConfig.isMobile && !$el.container.hasClass('cmm4e-container')) { 50 var cWidth = $el.container.width(); 51 // $el.container.css({position: 'relative'}); 52 menu.find('.cmm4e-content-container').each(function(i) { 53 var t = $(this), 54 item = t.parent('li'); 55 if (cmm4eFrontendConfig.iRTL) { 56 // t.css({width: cWidth + parseFloat(item.css('padding-right')) + 'px'}); 57 t.css({ 58 width: cWidth + 'px' 59 }); 60 } else { 61 // t.css({width: cWidth + parseFloat(item.css('padding-left')) + 'px'}); 62 t.css({ 63 width: cWidth + 'px' 64 }); 65 } 66 }); 67 } 68 69 // Fetch toggle button. 70 if (!toggle && config.mobile.animation !== 'none') { 71 var btn = '<div class="cmm4e-toggle-wrapper"><button class="cmm4e-toggle">', 72 icon = '<span class="toggle-icon-open ' + config.mobile.toggleIconOpen + '"></span><span class="toggle-icon-close ' + config.mobile.toggleIconClose + '"></span>'; 73 74 if (!cmm4eFrontendConfig.isRTL) { 75 btn = btn + icon + '<span class="toggle-text" style="display:inline-block; margin-left: 5px">' + config.mobile.toggleMenuText + '</span>'; 76 } else { 77 btn = btn + '<span class="toggle-text" style="display:inline-block; margin-right: 5px">' + config.mobile.toggleMenuText + '</span>' + icon; 78 } 79 80 btn += '</button></div>'; 81 82 $el.cmm4eContainer.prepend(btn); 83 84 toggle = $el.cmm4eContainer.find('.cmm4e-toggle'); 85 } 86 87 // Ensure menu does not overlap toggle and always fit into the viewport. 88 if (toggle && 'slide-down' === config.mobile.animation) { 89 var cPos = $el.container.offset(), 90 cParent = $el.container.parent(); 91 92 // if (menu.offset().top < (toggle.offset().top + toggle.outerHeight())) { 93 // menu.css({ 94 // marginTop: toggle.outerHeight() 95 // }); 96 // } 97 98 if ($(window).width() < config.breakpoint) { 99 if (cParent.hasClass('elementor-nav-menu--dropdown elementor-nav-menu__container')) { 100 cParent.css({ 101 overflow: 'visible' 102 }); 103 } 104 105 menu.css({ 106 left: -cPos.left 107 }); 108 } 109 } 110 111 // Fetch off-canvas mask. 112 if ('off-canvas' === config.mobile.animation) { 113 var canvasMask = $el.cmm4eContainer.find('> .cmm4e-off-canvas-mask'); 114 if (!canvasMask.length) { 115 $el.cmm4eContainer.append('<div role="presentation" class="cmm4e-off-canvas-mask"></div>'); 116 mask = $el.cmm4eContainer.find('> .cmm4e-off-canvas-mask'); 117 } else { 118 mask = canvasMask; 119 } 120 } 121 122 // Fetch menu items' toggle. 123 $el.items.each(function(i) { 124 var item = $(this); 125 126 if (item.hasClass('menu-item-has-children') && !item.hasClass('cmm4e-hide-sub-on-mobile')) { 127 item.append('<span class="cmm4e-item-toggle cs-font clever-icon-plus"></span>'); 128 } 129 }); 130 } 131 132 function toggleMenu(e) { 133 e.preventDefault(); 134 e.stopPropagation(); 135 136 var target = $(e.currentTarget); 137 138 $el.cmm4eContainer.toggleClass('cmm4e-active'); 139 140 if ('off-canvas' === config.mobile.animation) { 141 if (target.hasClass('cmm4e-off-canvas-mask')) { 142 $el.cmm4eContainer.removeClass('cmm4e-active'); 143 toggle.toggleClass('toggled'); 144 } else { 145 target.toggleClass('toggled'); 146 } 147 } else { 148 menu.slideToggle(250); 149 target.toggleClass('toggled'); 150 } 151 152 if ($el.cmm4eContainer.hasClass('cmm4e-active')) { 153 $(document).trigger('cmm4e_menu_expanded'); 154 } else { 155 $(document).trigger('cmm4e_menu_collapsed'); 156 } 157 } 158 159 /** 160 * Toggle item 161 */ 162 var prevItem = null; 163 164 function toggleItem(e) { 165 var btn = $(e.target), 166 item = btn.parent(), 167 itemSub = item.find('> .cmm4e-sub-container'); 168 169 if (prevItem && !item.is(prevItem)) { 170 if (itemSub.length && !item.hasClass('cmm4e-item-depth-0')) { 171 172 } else { 173 prevItem.find('.cmm4e-item-toggle').css({ 174 transform: 'none' 175 }); 176 prevItem.find('.menu-item-has-children').removeClass('cmm4e-item-expanded'); 177 if (prevItem.hasClass('cmm4e-mega')) { 178 prevItem.find('> .cmm4e-content-container').slideUp(); 179 } else { 180 prevItem.find('.cmm4e-sub-container').slideUp(); 181 } 182 prevItem.removeClass('cmm4e-item-expanded'); 183 } 184 } 185 186 item.toggleClass('cmm4e-item-expanded'); 187 188 if (item.hasClass('cmm4e-mega')) { 189 item.find('> .cmm4e-content-container').slideToggle(); 190 } else { 191 item.find('> .cmm4e-sub-container').slideToggle(); 192 } 193 194 if (item.hasClass('cmm4e-item-expanded')) { 195 btn.css({ 196 transform: 'rotate(225deg)' 197 }); 198 } else { 199 btn.css({ 200 transform: 'none' 201 }); 202 } 203 204 if (item.hasClass('cmm4e-item-depth-0')) { 205 prevItem = item; 206 } 207 } 208 209 /** 210 * Bind events 211 */ 212 function bindEvents() { 213 // Menu Toggle 214 if (toggle && config.mobile.animation !== 'none') { 215 toggle.on('click', toggleMenu); 216 } 217 218 // Off-Canvas Mask 219 if (mask) { 220 mask.on('click', toggleMenu); 221 } 222 223 // Item Toggle 224 menu.find('.cmm4e-item-toggle').on('click', toggleItem); 225 } 226 227 // Init 228 fetchUI(); 229 bindEvents(); 230 } 231 232 // Fetch menus 233 $(function() { 234 $('.cmm4e').each(function(i) { 235 Cmm4e($(this)); 236 }); 237 }) 238}(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.