PageSourceSearch

https://enestit.com/wp-content/plugins/clever-mega-menu-pro-for-el…/assets/frontend/js/cmm4e.min.js?ver=1.0.8

js enestit.com collected 2026-10-08 23:35:29 UTC 8,211 bytes, 238 lines download raw bytes

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.