PluginProbe
King Addons for Elementor – 100+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce Builder, Mega Menu, Popup Builder / 51.1.87
King Addons for Elementor – 100+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce Builder, Mega Menu, Popup Builder v51.1.87
51.1.87 51.1.86 51.1.84 51.1.85 51.1.83 51.1.82 51.1.81 51.1.79 51.1.78 51.1.77 51.1.76 51.1.74 51.1.75 51.1.65 51.1.64 51.1.63 trunk 51.1.14 51.1.2 51.1.35 51.1.36 51.1.37 51.1.38 51.1.39 51.1.44 All 41 releases
← All changes | includes/widgets/Mega_Menu/Mega_Menu.php +1386 -0 51.1.2 → 51.1.87 View file →
@@ -1,0 +1,1386 @@
1 +<?php
2 +
3 +namespace King_Addons;
4 +
5 +use Elementor\Widget_Base;
6 +use Elementor\Controls_Manager;
7 +use Elementor\Group_Control_Typography;
8 +use Elementor\Group_Control_Border;
9 +use Elementor\Group_Control_Box_Shadow;
10 +
11 +if (!defined('ABSPATH')) {
12 + exit; // Exit if accessed directly.
13 +}
14 +
15 +
16 +
17 +/**
18 + * Class Mega_Menu
19 + *
20 + * Elementor Mega Menu widget for King Addons plugin.
21 + *
22 + * Provides a flexible, customizable mega menu for Elementor, supporting WordPress menus and (in Pro) custom menu items, advanced dropdowns, and mobile layouts.
23 + *
24 + * @package King_Addons
25 + */
26 +class Mega_Menu extends Widget_Base
27 +{
28 +
29 +
30 + /**
31 + * Get widget unique name.
32 + *
33 + * @return string Widget name.
34 + */
35 + public function get_name(): string
36 + {
37 + return 'king-addons-mega-menu';
38 + }
39 +
40 + /**
41 + * Get widget display title.
42 + *
43 + * @return string Widget title.
44 + */
45 + public function get_title(): string
46 + {
47 + return esc_html__('Mega Menu', 'king-addons');
48 + }
49 +
50 + /**
51 + * Get widget icon for Elementor panel.
52 + *
53 + * @return string Icon class.
54 + */
55 + public function get_icon(): string
56 + {
57 + return 'king-addons-icon king-addons-mega-menu';
58 + }
59 +
60 + /**
61 + * Get style dependencies for the widget.
62 + *
63 + * @return array List of style handles.
64 + */
65 + public function get_style_depends(): array
66 + {
67 + return [KING_ADDONS_ASSETS_UNIQUE_KEY . '-mega-menu-style'];
68 + }
69 +
70 + /**
71 + * Get script dependencies for the widget.
72 + *
73 + * @return array List of script handles.
74 + */
75 + public function get_script_depends(): array
76 + {
77 + return [KING_ADDONS_ASSETS_UNIQUE_KEY . '-mega-menu-script'];
78 + }
79 +
80 + /**
81 + * Get widget categories for Elementor panel.
82 + *
83 + * @return array List of categories.
84 + */
85 + public function get_categories(): array
86 + {
87 + return ['king-addons'];
88 + }
89 +
90 + /**
91 + * Get widget keywords for Elementor search.
92 + *
93 + * @return array List of keywords.
94 + */
95 + public function get_keywords(): array
96 + {
97 + return ['menu', 'nav', 'navigation', 'header', 'navbar', 'mega', 'dropdown', 'king', 'addons', 'kingaddons', 'king-addons'];
98 + }
99 +
100 + /**
101 + * Get custom help URL for the widget.
102 + *
103 + * @return string Help URL.
104 + */
105 + public function get_custom_help_url()
106 + {
107 + return 'mailto:[email protected]?subject=Bug Report - King Addons&body=Please describe the issue';
108 + }
109 +
110 + /**
111 + * Get available WordPress navigation menus.
112 + *
113 + * @return array Associative array of menu slugs => names.
114 + */
115 + public function get_wp_nav_menus(): array
116 + {
117 + $menus = wp_get_nav_menus();
118 + $options = [];
119 +
120 + foreach ($menus as $menu) {
121 + $options[$menu->slug] = $menu->name;
122 + }
123 +
124 + return $options;
125 + }
126 +
127 + /**
128 + * Placeholder for Pro: Add controls for custom menu items.
129 + *
130 + * In Free, shows Pro upgrade notice if 'custom' menu source is selected.
131 + *
132 + * @return void
133 + */
134 + public function add_custom_menu_items_controls()
135 + {
136 +
137 + $this->add_control(
138 + 'menu_source_pro_notice',
139 + [
140 + 'raw' => 'Custom Menu Items and Elementor Templates as dropdown content are available in the <strong><a href="https://kingaddons.com/pricing/?utm_source=kng-module-mega-menu-settings-upgrade-pro&utm_medium=plugin&utm_campaign=kng" target="_blank">Pro version</a></strong>',
141 + 'type' => Controls_Manager::RAW_HTML,
142 + 'content_classes' => 'king-addons-pro-notice',
143 + 'condition' => [
144 + 'menu_source' => 'custom',
145 + ]
146 + ]
147 + );
148 + }
149 +
150 + /**
151 + * Placeholder for Pro: Add Lottie logo controls.
152 + *
153 + * Pro overrides this method to inject additional logo controls.
154 + *
155 + * @return void
156 + */
157 + public function add_lottie_logo_controls(): void
158 + {
159 + // Intentionally empty in Free.
160 + }
161 +
162 + /**
163 + * Placeholder for Pro: Add current menu item style controls.
164 + *
165 + * Pro overrides this method to add advanced current menu item styling.
166 + *
167 + * @return void
168 + */
169 + public function add_current_menu_item_controls(): void
170 + {
171 + // Intentionally empty in Free.
172 + }
173 +
174 + /**
175 + * Placeholder for Pro: Add controls for mobile menu layout.
176 + *
177 + * @return void
178 + */
179 + public function add_mobile_menu_layout_controls() {}
180 +
181 + /**
182 + * Placeholder for Pro: Add advanced dropdown controls.
183 + *
184 + * @return void
185 + */
186 + public function add_advanced_dropdown_controls() {}
187 +
188 + public function add_advanced_dropdown_animation() {
189 + // Dropdown Animation Control
190 + $this->add_control(
191 + 'dropdown_animation',
192 + [
193 + 'label' => esc_html__('Dropdown Animation', 'king-addons'),
194 + 'type' => Controls_Manager::SELECT,
195 + 'default' => 'fade',
196 + 'options' => [
197 + 'fade' => esc_html__('Fade', 'king-addons'),
198 + 'slide' => esc_html__('Slide', 'king-addons'),
199 + 'none' => esc_html__('None', 'king-addons'),
200 + 'pro-fade-up' => esc_html__('Fade Up (Pro)', 'king-addons'),
201 + 'pro-fade-down' => esc_html__('Fade Down (Pro)', 'king-addons'),
202 + 'pro-fade-left' => esc_html__('Fade Left (Pro)', 'king-addons'),
203 + 'pro-fade-right' => esc_html__('Fade Right (Pro)', 'king-addons'),
204 + 'pro-zoom-in' => esc_html__('Zoom In (Pro)', 'king-addons'),
205 + 'pro-zoom-out' => esc_html__('Zoom Out (Pro)', 'king-addons'),
206 + ],
207 + ]
208 + );
209 + }
210 +
211 + /**
212 + * Register Elementor controls for the widget.
213 + *
214 + * Defines all settings and style controls for the Mega Menu widget, including menu source, layout, logo, menu items, dropdown, and style options.
215 + *
216 + * @return void
217 + */
218 + protected function register_controls()
219 + {
220 + $this->start_controls_section(
221 + 'section_mega_menu_general',
222 + [
223 + 'label' => KING_ADDONS_ELEMENTOR_ICON . esc_html__('General', 'king-addons'),
224 + 'tab' => Controls_Manager::TAB_CONTENT,
225 + ]
226 + );
227 +
228 + $this->add_control(
229 + 'menu_source',
230 + [
231 + 'label' => esc_html__('Menu Source', 'king-addons'),
232 + 'type' => Controls_Manager::SELECT,
233 + 'default' => 'wordpress',
234 + 'options' => [
235 + 'wordpress' => esc_html__('WordPress Menu', 'king-addons'),
236 + 'custom' => esc_html__('Custom Elementor Menu', 'king-addons'),
237 + ],
238 + ]
239 + );
240 +
241 + $this->add_control(
242 + 'wp_menu',
243 + [
244 + 'label' => esc_html__('Select Menu', 'king-addons'),
245 + 'type' => Controls_Manager::SELECT,
246 + 'default' => array_keys($this->get_wp_nav_menus())[0] ?? '',
247 + 'options' => $this->get_wp_nav_menus(),
248 + 'condition' => [
249 + 'menu_source' => 'wordpress',
250 + ],
251 + ]
252 + );
253 +
254 + $this->add_control(
255 + 'show_logo',
256 + [
257 + 'label' => esc_html__('Show Logo', 'king-addons'),
258 + 'type' => Controls_Manager::SWITCHER,
259 + 'default' => 'yes',
260 + 'label_on' => esc_html__('Yes', 'king-addons'),
261 + 'label_off' => esc_html__('No', 'king-addons'),
262 + ]
263 + );
264 +
265 + $this->add_control(
266 + 'logo_position',
267 + [
268 + 'label' => esc_html__('Logo Position (Desktop)', 'king-addons'),
269 + 'type' => Controls_Manager::SELECT,
270 + 'default' => 'left',
271 + 'options' => [
272 + 'left' => esc_html__('Left', 'king-addons'),
273 + 'center' => esc_html__('Center Between', 'king-addons'),
274 + 'right' => esc_html__('Right', 'king-addons'),
275 + ],
276 + 'condition' => [
277 + 'show_logo' => 'yes',
278 + ],
279 + ]
280 + );
281 +
282 + $this->add_control(
283 + 'logo_position_tablet',
284 + [
285 + 'label' => esc_html__('Logo Position (Tablet)', 'king-addons'),
286 + 'type' => Controls_Manager::SELECT,
287 + 'default' => 'left',
288 + 'options' => [
289 + 'left' => esc_html__('Left', 'king-addons'),
290 + 'center' => esc_html__('Center', 'king-addons'),
291 + 'right' => esc_html__('Right', 'king-addons'),
292 + ],
293 + 'condition' => [
294 + 'show_logo' => 'yes',
295 + ],
296 + ]
297 + );
298 +
299 + $this->add_control(
300 + 'logo_position_mobile',
301 + [
302 + 'label' => esc_html__('Logo Position (Mobile)', 'king-addons'),
303 + 'type' => Controls_Manager::SELECT,
304 + 'default' => 'left',
305 + 'options' => [
306 + 'left' => esc_html__('Left', 'king-addons'),
307 + 'center' => esc_html__('Center', 'king-addons'),
308 + 'right' => esc_html__('Right', 'king-addons'),
309 + ],
310 + 'condition' => [
311 + 'show_logo' => 'yes',
312 + ],
313 + ]
314 + );
315 +
316 + $this->add_control(
317 + 'custom_logo',
318 + [
319 + 'label' => esc_html__('Custom Logo', 'king-addons'),
320 + 'type' => Controls_Manager::MEDIA,
321 + 'default' => [
322 + 'url' => '',
323 + ],
324 + 'condition' => [
325 + 'show_logo' => 'yes',
326 + ],
327 + ]
328 + );
329 +
330 + $this->add_control(
331 + 'center_logo_split_at',
332 + [
333 + 'label' => esc_html__('Split Menu After Item', 'king-addons'),
334 + 'type' => Controls_Manager::NUMBER,
335 + 'default' => 2,
336 + 'min' => 1,
337 + 'max' => 10,
338 + 'description' => esc_html__('Logo will be placed after this menu item number (e.g., 2 = after 2nd menu item)', 'king-addons'),
339 + 'condition' => [
340 + 'show_logo' => 'yes',
341 + 'logo_position' => 'center',
342 + ],
343 + ]
344 + );
345 +
346 + $this->add_control(
347 + 'center_logo_menu_alignment',
348 + [
349 + 'label' => esc_html__('Menu Items Vertical Alignment', 'king-addons'),
350 + 'type' => Controls_Manager::SELECT,
351 + 'default' => 'center',
352 + 'options' => [
353 + 'start' => esc_html__('Top', 'king-addons'),
354 + 'center' => esc_html__('Center', 'king-addons'),
355 + 'end' => esc_html__('Bottom', 'king-addons'),
356 + ],
357 + 'selectors' => [
358 + '{{WRAPPER}} .king-addons-logo-position-center.king-addons-mega-menu-horizontal .king-addons-menu-items' => 'align-items: {{VALUE}};',
359 + ],
360 + 'condition' => [
361 + 'show_logo' => 'yes',
362 + 'logo_position' => 'center',
363 + ],
364 + ]
365 + );
366 +
367 + $this->add_responsive_control(
368 + 'logo_size',
369 + [
370 + 'label' => esc_html__('Logo Size', 'king-addons'),
371 + 'type' => Controls_Manager::SLIDER,
372 + 'size_units' => ['px', '%'],
373 + 'range' => [
374 + 'px' => [
375 + 'min' => 10,
376 + 'max' => 500,
377 + ],
378 + '%' => [
379 + 'min' => 1,
380 + 'max' => 100,
381 + ],
382 + ],
383 + 'default' => [
384 + 'unit' => 'px',
385 + 'size' => 150,
386 + ],
387 + 'selectors' => [
388 + '{{WRAPPER}} .king-addons-mega-menu-logo img' => 'max-width: {{SIZE}}{{UNIT}};',
389 + '{{WRAPPER}} .king-addons-mega-menu-logo .king-addons-lottie-animations' => 'width: {{SIZE}}{{UNIT}}; height: {{SIZE}}{{UNIT}};',
390 + '{{WRAPPER}} .king-addons-mega-menu-logo .king-addons-lottie-animations svg' => 'width: 100% !important; height: 100% !important;',
391 + '{{WRAPPER}} .king-addons-mega-menu-logo .king-addons-lottie-animations canvas' => 'width: 100% !important; height: 100% !important;',
392 + ],
393 + 'condition' => [
394 + 'show_logo' => 'yes',
395 + ],
396 + ]
397 + );
398 +
399 + // Allow Pro to inject additional logo controls (e.g., Lottie logo type).
400 + $this->add_lottie_logo_controls();
401 +
402 + $this->add_control(
403 + 'menu_layout',
404 + [
405 + 'label' => esc_html__('Menu Layout', 'king-addons'),
406 + 'type' => Controls_Manager::SELECT,
407 + 'default' => 'horizontal',
408 + 'options' => [
409 + 'horizontal' => esc_html__('Horizontal', 'king-addons'),
410 + 'vertical' => esc_html__('Vertical', 'king-addons'),
411 + ],
412 + ]
413 + );
414 +
415 + $this->add_control(
416 + 'horizontal_alignment',
417 + [
418 + 'label' => esc_html__('Menu Alignment', 'king-addons'),
419 + 'type' => Controls_Manager::CHOOSE,
420 + 'options' => [
421 + 'flex-start' => [
422 + 'title' => esc_html__('Left', 'king-addons'),
423 + 'icon' => 'eicon-text-align-left',
424 + ],
425 + 'center' => [
426 + 'title' => esc_html__('Center', 'king-addons'),
427 + 'icon' => 'eicon-text-align-center',
428 + ],
429 + 'flex-end' => [
430 + 'title' => esc_html__('Right', 'king-addons'),
431 + 'icon' => 'eicon-text-align-right',
432 + ],
433 + 'space-between' => [
434 + 'title' => esc_html__('Justify', 'king-addons'),
435 + 'icon' => 'eicon-text-align-justify',
436 + ],
437 + ],
438 + 'default' => 'flex-end',
439 + 'selectors' => [
440 + '{{WRAPPER}} .king-addons-mega-menu.king-addons-mega-menu-horizontal' => 'justify-content: {{VALUE}};',
441 + ],
442 + 'condition' => [
443 + 'menu_layout' => 'horizontal',
444 + ],
445 + 'render_type' => 'template',
446 + ]
447 + );
448 +
449 + $this->add_control(
450 + 'vertical_alignment',
451 + [
452 + 'label' => esc_html__('Menu Alignment', 'king-addons'),
453 + 'type' => Controls_Manager::CHOOSE,
454 + 'options' => [
455 + 'flex-start' => [
456 + 'title' => esc_html__('Left', 'king-addons'),
457 + 'icon' => 'eicon-text-align-left',
458 + ],
459 + 'center' => [
460 + 'title' => esc_html__('Center', 'king-addons'),
461 + 'icon' => 'eicon-text-align-center',
462 + ],
463 + 'flex-end' => [
464 + 'title' => esc_html__('Right', 'king-addons'),
465 + 'icon' => 'eicon-text-align-right',
466 + ],
467 + ],
468 + 'default' => 'flex-start',
469 + 'selectors' => [
470 + '{{WRAPPER}} .king-addons-mega-menu.king-addons-mega-menu-vertical .king-addons-menu-items' => 'align-items: {{VALUE}};',
471 + ],
472 + 'condition' => [
473 + 'menu_layout' => 'vertical',
474 + ],
475 + 'render_type' => 'template',
476 + ]
477 + );
478 +
479 + $this->add_mobile_menu_layout_controls();
480 +
481 + $this->end_controls_section();
482 +
483 + // Add Custom Menu Items Section - Only in Pro
484 + $this->start_controls_section(
485 + 'section_mega_menu_custom_items',
486 + [
487 + 'label' => KING_ADDONS_ELEMENTOR_ICON . esc_html__('Custom Elementor Menu', 'king-addons'),
488 + 'tab' => Controls_Manager::TAB_CONTENT,
489 + 'condition' => [
490 + 'menu_source' => 'custom',
491 + ],
492 + ]
493 + );
494 +
495 + $this->add_custom_menu_items_controls();
496 +
497 + $this->end_controls_section();
498 +
499 + // TODO: Add dropdown settings
500 + // Advanced Dropdown Settings - Only in Pro
501 + $this->start_controls_section(
502 + 'section_mega_menu_dropdown',
503 + [
504 + 'label' => KING_ADDONS_ELEMENTOR_ICON . esc_html__('Dropdown Settings', 'king-addons'),
505 + 'tab' => Controls_Manager::TAB_CONTENT,
506 + ]
507 + );
508 +
509 + // TODO: Add dropdown width control
510 + // $this->add_control(
511 + // 'dropdown_width',
512 + // [
513 + // 'label' => sprintf(__('Dropdown Width %s', 'king-addons'), '<i class="eicon-pro-icon"></i>'),
514 + // 'type' => Controls_Manager::SELECT,
515 + // 'default' => 'default',
516 + // 'options' => [
517 + // 'default' => esc_html__('Default', 'king-addons'),
518 + // 'custom' => esc_html__('Custom', 'king-addons'),
519 + // 'full-width' => esc_html__('Full Width', 'king-addons'),
520 + // ],
521 + // 'classes' => 'king-addons-pro-control',
522 + // ]
523 + // );
524 +
525 + $this->add_advanced_dropdown_animation();
526 + $this->add_control(
527 + 'dropdown_animation_duration',
528 + [
529 + 'label' => esc_html__('Animation Duration (ms)', 'king-addons'),
530 + 'type' => Controls_Manager::NUMBER,
531 + 'default' => 300,
532 + 'selectors' => [
533 + '{{WRAPPER}} .king-addons-mega-menu .king-addons-menu-items ul.sub-menu' => 'transition-duration: {{VALUE}}ms;',
534 + ],
535 + 'condition' => [
536 + 'dropdown_animation!' => 'none',
537 + ],
538 + ]
539 + );
540 +
541 + $this->add_advanced_dropdown_controls();
542 +
543 + $this->end_controls_section();
544 +
545 + Core::renderProFeaturesSection(
546 + $this,
547 + Controls_Manager::TAB_CONTENT,
548 + Controls_Manager::RAW_HTML,
549 + 'mega-menu',
550 + [
551 + esc_html__('Add Elementor templates as dropdown content', 'king-addons'),
552 + esc_html__('Create custom menu items with icons', 'king-addons'),
553 + esc_html__('Build nested dropdown menus with unlimited levels', 'king-addons'),
554 + esc_html__('Advanced mobile menu layouts', 'king-addons'),
555 + esc_html__('Set megamenu width and position', 'king-addons'),
556 + esc_html__('Advanced transitions and animations', 'king-addons'),
557 + ]
558 + );
559 +
560 + // Style Sections
561 + $this->start_controls_section(
562 + 'section_mega_menu_style',
563 + [
564 + 'label' => KING_ADDONS_ELEMENTOR_ICON . esc_html__('Menu Style', 'king-addons'),
565 + 'tab' => Controls_Manager::TAB_STYLE,
566 + ]
567 + );
568 +
569 + $this->add_control(
570 + 'menu_background',
571 + [
572 + 'label' => esc_html__('Background (Desktop)', 'king-addons'),
573 + 'type' => Controls_Manager::COLOR,
574 + 'selectors' => [
575 + '{{WRAPPER}} .king-addons-mega-menu' => 'background-color: {{VALUE}};',
576 + ],
577 + ]
578 + );
579 +
580 + $this->add_control(
581 + 'menu_background_tablet',
582 + [
583 + 'label' => esc_html__('Background (Tablet)', 'king-addons'),
584 + 'type' => Controls_Manager::COLOR,
585 + 'selectors' => [
586 + '(tablet){{WRAPPER}} .king-addons-mega-menu' => 'background-color: {{VALUE}};',
587 + ],
588 + ]
589 + );
590 +
591 + $this->add_control(
592 + 'menu_background_mobile',
593 + [
594 + 'label' => esc_html__('Background (Mobile)', 'king-addons'),
595 + 'type' => Controls_Manager::COLOR,
596 + 'selectors' => [
597 + '(mobile){{WRAPPER}} .king-addons-mega-menu' => 'background-color: {{VALUE}};',
598 + ],
599 + ]
600 + );
601 +
602 + $this->add_group_control(
603 + Group_Control_Border::get_type(),
604 + [
605 + 'name' => 'menu_border',
606 + 'selector' => '{{WRAPPER}} .king-addons-mega-menu',
607 + ]
608 + );
609 +
610 + $this->add_responsive_control(
611 + 'menu_border_radius',
612 + [
613 + 'label' => esc_html__('Border Radius', 'king-addons'),
614 + 'type' => Controls_Manager::DIMENSIONS,
615 + 'size_units' => ['px', '%', 'em'],
616 + 'selectors' => [
617 + '{{WRAPPER}} .king-addons-mega-menu' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
618 + ],
619 + ]
620 + );
621 +
622 + $this->add_responsive_control(
623 + 'menu_padding',
624 + [
625 + 'label' => esc_html__('Padding', 'king-addons'),
626 + 'type' => Controls_Manager::DIMENSIONS,
627 + 'size_units' => ['px', '%', 'em'],
628 + 'selectors' => [
629 + '{{WRAPPER}} .king-addons-mega-menu' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
630 + ],
631 + ]
632 + );
633 +
634 + $this->add_group_control(
635 + Group_Control_Box_Shadow::get_type(),
636 + [
637 + 'name' => 'menu_box_shadow',
638 + 'selector' => '{{WRAPPER}} .king-addons-mega-menu',
639 + ]
640 + );
641 +
642 +
643 +
644 +
645 +$this->end_controls_section();
646 +
647 +
648 +
649 +
650 + // Menu Items Style
651 + $this->start_controls_section(
652 + 'section_mega_menu_items_style',
653 + [
654 + 'label' => KING_ADDONS_ELEMENTOR_ICON . esc_html__('Menu Items', 'king-addons'),
655 + 'tab' => Controls_Manager::TAB_STYLE,
656 + ]
657 + );
658 +
659 + $this->add_group_control(
660 + Group_Control_Typography::get_type(),
661 + [
662 + 'name' => 'menu_item_typography',
663 + 'selector' => '{{WRAPPER}} .king-addons-menu-item > a, {{WRAPPER}} .king-addons-menu-items > li > a',
664 + ]
665 + );
666 +
667 + $this->add_responsive_control(
668 + 'menu_item_spacing',
669 + [
670 + 'label' => esc_html__('Items Spacing', 'king-addons'),
671 + 'type' => Controls_Manager::SLIDER,
672 + 'range' => [
673 + 'px' => [
674 + 'min' => 0,
675 + 'max' => 100,
676 + ],
677 + ],
678 + 'selectors' => [
679 + '{{WRAPPER}} .king-addons-mega-menu-horizontal .king-addons-menu-item' => 'margin-right: {{SIZE}}{{UNIT}};',
680 + '{{WRAPPER}} .king-addons-mega-menu-vertical .king-addons-menu-item' => 'margin-bottom: {{SIZE}}{{UNIT}};',
681 + '{{WRAPPER}} .king-addons-mega-menu-horizontal .king-addons-menu-items > li' => 'margin-right: {{SIZE}}{{UNIT}};',
682 + '{{WRAPPER}} .king-addons-mega-menu-vertical .king-addons-menu-items > li' => 'margin-bottom: {{SIZE}}{{UNIT}};',
683 + ],
684 + ]
685 + );
686 +
687 + $this->add_responsive_control(
688 + 'menu_item_padding',
689 + [
690 + 'label' => esc_html__('Item Padding', 'king-addons'),
691 + 'type' => Controls_Manager::DIMENSIONS,
692 + 'size_units' => ['px', 'em', '%'],
693 + 'selectors' => [
694 + '{{WRAPPER}} .king-addons-menu-item > a' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
695 + '{{WRAPPER}} .king-addons-menu-items > li > a' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
696 + ],
697 + ]
698 + );
699 +
700 + $this->start_controls_tabs('menu_item_style_tabs');
701 +
702 + // Normal State
703 + $this->start_controls_tab(
704 + 'menu_item_style_normal',
705 + [
706 + 'label' => esc_html__('Normal', 'king-addons'),
707 + ]
708 + );
709 +
710 + $this->add_control(
711 + 'menu_item_text_color',
712 + [
713 + 'label' => esc_html__('Text Color', 'king-addons'),
714 + 'type' => Controls_Manager::COLOR,
715 + 'default' => '',
716 + 'selectors' => [
717 + '{{WRAPPER}} .king-addons-menu-item > a' => 'color: {{VALUE}};',
718 + '{{WRAPPER}} .king-addons-menu-items > li > a' => 'color: {{VALUE}};',
719 + ],
720 + ]
721 + );
722 +
723 + $this->add_control(
724 + 'menu_item_background_color',
725 + [
726 + 'label' => esc_html__('Background Color', 'king-addons'),
727 + 'type' => Controls_Manager::COLOR,
728 + 'selectors' => [
729 + '{{WRAPPER}} .king-addons-menu-item > a' => 'background-color: {{VALUE}};',
730 + '{{WRAPPER}} .king-addons-menu-items > li > a' => 'background-color: {{VALUE}};',
731 + ],
732 + ]
733 + );
734 +
735 + $this->add_group_control(
736 + Group_Control_Border::get_type(),
737 + [
738 + 'name' => 'menu_item_border',
739 + 'selector' => '{{WRAPPER}} .king-addons-menu-item > a, {{WRAPPER}} .king-addons-menu-items > li > a',
740 + ]
741 + );
742 +
743 + $this->add_responsive_control(
744 + 'menu_item_border_radius',
745 + [
746 + 'label' => esc_html__('Border Radius', 'king-addons'),
747 + 'type' => Controls_Manager::DIMENSIONS,
748 + 'size_units' => ['px', '%', 'em'],
749 + 'selectors' => [
750 + '{{WRAPPER}} .king-addons-menu-item > a' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
751 + '{{WRAPPER}} .king-addons-menu-items > li > a' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
752 + ],
753 + ]
754 + );
755 +
756 + $this->end_controls_tab();
757 +
758 + // Hover State
759 + $this->start_controls_tab(
760 + 'menu_item_style_hover',
761 + [
762 + 'label' => esc_html__('Hover', 'king-addons'),
763 + ]
764 + );
765 +
766 + $this->add_control(
767 + 'menu_item_text_color_hover',
768 + [
769 + 'label' => esc_html__('Text Color', 'king-addons'),
770 + 'type' => Controls_Manager::COLOR,
771 + 'selectors' => [
772 + '{{WRAPPER}} .king-addons-menu-item > a:hover' => 'color: {{VALUE}};',
773 + '{{WRAPPER}} .king-addons-menu-item:hover > a' => 'color: {{VALUE}};',
774 + '{{WRAPPER}} .king-addons-menu-items > li > a:hover' => 'color: {{VALUE}};',
775 + '{{WRAPPER}} .king-addons-menu-items > li:hover > a' => 'color: {{VALUE}};',
776 + ],
777 + ]
778 + );
779 +
780 + $this->add_control(
781 + 'menu_item_background_color_hover',
782 + [
783 + 'label' => esc_html__('Background Color', 'king-addons'),
784 + 'type' => Controls_Manager::COLOR,
785 + 'selectors' => [
786 + '{{WRAPPER}} .king-addons-menu-item > a:hover' => 'background-color: {{VALUE}};',
787 + '{{WRAPPER}} .king-addons-menu-item:hover > a' => 'background-color: {{VALUE}};',
788 + '{{WRAPPER}} .king-addons-menu-items > li > a:hover' => 'background-color: {{VALUE}};',
789 + '{{WRAPPER}} .king-addons-menu-items > li:hover > a' => 'background-color: {{VALUE}};',
790 + ],
791 + ]
792 + );
793 +
794 + $this->add_control(
795 + 'menu_item_border_color_hover',
796 + [
797 + 'label' => esc_html__('Border Color', 'king-addons'),
798 + 'type' => Controls_Manager::COLOR,
799 + 'selectors' => [
800 + '{{WRAPPER}} .king-addons-menu-item > a:hover' => 'border-color: {{VALUE}};',
801 + '{{WRAPPER}} .king-addons-menu-item:hover > a' => 'border-color: {{VALUE}};',
802 + '{{WRAPPER}} .king-addons-menu-items > li > a:hover' => 'border-color: {{VALUE}};',
803 + '{{WRAPPER}} .king-addons-menu-items > li:hover > a' => 'border-color: {{VALUE}};',
804 + ],
805 + 'condition' => [
806 + 'menu_item_border_border!' => '',
807 + ],
808 + ]
809 + );
810 +
811 + $this->end_controls_tab();
812 +
813 + // Active State
814 + $this->start_controls_tab(
815 + 'menu_item_style_active',
816 + [
817 + 'label' => esc_html__('Active', 'king-addons'),
818 + ]
819 + );
820 +
821 + $this->add_control(
822 + 'menu_item_text_color_active',
823 + [
824 + 'label' => esc_html__('Text Color', 'king-addons'),
825 + 'type' => Controls_Manager::COLOR,
826 + 'selectors' => [
827 + '{{WRAPPER}} .king-addons-menu-item.current-menu-item > a' => 'color: {{VALUE}};',
828 + '{{WRAPPER}} .king-addons-menu-item.current-menu-ancestor > a' => 'color: {{VALUE}};',
829 + '{{WRAPPER}} .king-addons-menu-items > li.current-menu-item > a' => 'color: {{VALUE}};',
830 + '{{WRAPPER}} .king-addons-menu-items > li.current-menu-ancestor > a' => 'color: {{VALUE}};',
831 + ],
832 + ]
833 + );
834 +
835 + $this->add_control(
836 + 'menu_item_background_color_active',
837 + [
838 + 'label' => esc_html__('Background Color', 'king-addons'),
839 + 'type' => Controls_Manager::COLOR,
840 + 'selectors' => [
841 + '{{WRAPPER}} .king-addons-menu-item.current-menu-item > a' => 'background-color: {{VALUE}};',
842 + '{{WRAPPER}} .king-addons-menu-item.current-menu-ancestor > a' => 'background-color: {{VALUE}};',
843 + '{{WRAPPER}} .king-addons-menu-items > li.current-menu-item > a' => 'background-color: {{VALUE}};',
844 + '{{WRAPPER}} .king-addons-menu-items > li.current-menu-ancestor > a' => 'background-color: {{VALUE}};',
845 + ],
846 + ]
847 + );
848 +
849 + $this->add_control(
850 + 'menu_item_border_color_active',
851 + [
852 + 'label' => esc_html__('Border Color', 'king-addons'),
853 + 'type' => Controls_Manager::COLOR,
854 + 'selectors' => [
855 + '{{WRAPPER}} .king-addons-menu-item.current-menu-item > a' => 'border-color: {{VALUE}};',
856 + '{{WRAPPER}} .king-addons-menu-item.current-menu-ancestor > a' => 'border-color: {{VALUE}};',
857 + '{{WRAPPER}} .king-addons-menu-items > li.current-menu-item > a' => 'border-color: {{VALUE}};',
858 + '{{WRAPPER}} .king-addons-menu-items > li.current-menu-ancestor > a' => 'border-color: {{VALUE}};',
859 + ],
860 + 'condition' => [
861 + 'menu_item_border_border!' => '',
862 + ],
863 + ]
864 + );
865 +
866 + $this->end_controls_tab();
867 +
868 + $this->end_controls_tabs();
869 +
870 + $this->end_controls_section();
871 +
872 + // Dropdown Style
873 + $this->start_controls_section(
874 + 'section_mega_menu_dropdown_style',
875 + [
876 + 'label' => KING_ADDONS_ELEMENTOR_ICON . esc_html__('Dropdown Style', 'king-addons'),
877 + 'tab' => Controls_Manager::TAB_STYLE,
878 + ]
879 + );
880 +
881 + $this->add_control(
882 + 'dropdown_background',
883 + [
884 + 'label' => esc_html__('Background', 'king-addons'),
885 + 'type' => Controls_Manager::COLOR,
886 + 'default' => '#fff',
887 + 'selectors' => [
888 + '{{WRAPPER}} .king-addons-menu-items ul.sub-menu' => 'background-color: {{VALUE}};',
889 + '{{WRAPPER}} .king-addons-submenu' => 'background-color: {{VALUE}};',
890 + ],
891 + ]
892 + );
893 +
894 + $this->add_group_control(
895 + Group_Control_Typography::get_type(),
896 + [
897 + 'name' => 'dropdown_typography',
898 + 'selector' => '{{WRAPPER}} .king-addons-menu-items ul.sub-menu li a, {{WRAPPER}} .king-addons-submenu li a',
899 + ]
900 + );
901 +
902 + $this->add_control(
903 + 'dropdown_text_color',
904 + [
905 + 'label' => esc_html__('Text Color', 'king-addons'),
906 + 'type' => Controls_Manager::COLOR,
907 + 'selectors' => [
908 + '{{WRAPPER}} .king-addons-menu-items ul.sub-menu li a' => 'color: {{VALUE}};',
909 + '{{WRAPPER}} .king-addons-submenu li a' => 'color: {{VALUE}};',
910 + ],
911 + ]
912 + );
913 +
914 + $this->add_control(
915 + 'dropdown_text_hover_color',
916 + [
917 + 'label' => esc_html__('Text Hover Color', 'king-addons'),
918 + 'type' => Controls_Manager::COLOR,
919 + 'selectors' => [
920 + '{{WRAPPER}} .king-addons-menu-items ul.sub-menu li a:hover' => 'color: {{VALUE}};',
921 + '{{WRAPPER}} .king-addons-submenu li a:hover' => 'color: {{VALUE}};',
922 + ],
923 + ]
924 + );
925 +
926 + $this->add_control(
927 + 'dropdown_item_hover_background',
928 + [
929 + 'label' => esc_html__('Item Hover Background', 'king-addons'),
930 + 'type' => Controls_Manager::COLOR,
931 + 'selectors' => [
932 + '{{WRAPPER}} .king-addons-menu-items ul.sub-menu li a:hover' => 'background-color: {{VALUE}};',
933 + '{{WRAPPER}} .king-addons-submenu li a:hover' => 'background-color: {{VALUE}};',
934 + ],
935 + ]
936 + );
937 +
938 + $this->add_group_control(
939 + Group_Control_Border::get_type(),
940 + [
941 + 'name' => 'dropdown_border',
942 + 'selector' => '{{WRAPPER}} .king-addons-menu-items ul.sub-menu, {{WRAPPER}} .king-addons-submenu',
943 + ]
944 + );
945 +
946 + $this->add_responsive_control(
947 + 'dropdown_border_radius',
948 + [
949 + 'label' => esc_html__('Border Radius', 'king-addons'),
950 + 'type' => Controls_Manager::DIMENSIONS,
951 + 'size_units' => ['px', '%', 'em'],
952 + 'selectors' => [
953 + '{{WRAPPER}} .king-addons-menu-items ul.sub-menu' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
954 + '{{WRAPPER}} .king-addons-submenu' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
955 + ],
956 + ]
957 + );
958 +
959 + $this->add_responsive_control(
960 + 'dropdown_padding',
961 + [
962 + 'label' => esc_html__('Padding', 'king-addons'),
963 + 'type' => Controls_Manager::DIMENSIONS,
964 + 'size_units' => ['px', '%', 'em'],
965 + 'selectors' => [
966 + '{{WRAPPER}} .king-addons-menu-items ul.sub-menu' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
967 + '{{WRAPPER}} .king-addons-submenu' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
968 + ],
969 + ]
970 + );
971 +
972 + $this->add_group_control(
973 + Group_Control_Box_Shadow::get_type(),
974 + [
975 + 'name' => 'dropdown_box_shadow',
976 + 'selector' => '{{WRAPPER}} .king-addons-menu-items ul.sub-menu, {{WRAPPER}} .king-addons-submenu',
977 + ]
978 + );
979 +
980 + $this->end_controls_section();
981 +
982 + // Mobile Menu Style
983 + $this->start_controls_section(
984 + 'section_mega_menu_mobile_style',
985 + [
986 + 'label' => KING_ADDONS_ELEMENTOR_ICON . esc_html__('Mobile Menu', 'king-addons'),
987 + 'tab' => Controls_Manager::TAB_STYLE,
988 + ]
989 + );
990 +
991 + $this->add_control(
992 + 'mobile_toggle_color',
993 + [
994 + 'label' => esc_html__('Toggle Button Color', 'king-addons'),
995 + 'type' => Controls_Manager::COLOR,
996 + 'selectors' => [
997 + '{{WRAPPER}} .king-addons-mobile-menu-toggle' => 'color: {{VALUE}};',
998 + ],
999 + ]
1000 + );
1001 +
1002 + $this->add_control(
1003 + 'mobile_toggle_background',
1004 + [
1005 + 'label' => esc_html__('Toggle Button Background', 'king-addons'),
1006 + 'type' => Controls_Manager::COLOR,
1007 + 'selectors' => [
1008 + '{{WRAPPER}} .king-addons-mobile-menu-toggle' => 'background-color: {{VALUE}};',
1009 + ],
1010 + ]
1011 + );
1012 +
1013 + $this->add_control(
1014 + 'mobile_toggle_hover_color',
1015 + [
1016 + 'label' => esc_html__('Toggle Button Hover Color', 'king-addons'),
1017 + 'type' => Controls_Manager::COLOR,
1018 + 'selectors' => [
1019 + '{{WRAPPER}} .king-addons-mobile-menu-toggle:hover' => 'color: {{VALUE}};',
1020 + ],
1021 + ]
1022 + );
1023 +
1024 + $this->add_control(
1025 + 'mobile_toggle_hover_background',
1026 + [
1027 + 'label' => esc_html__('Toggle Button Hover Background', 'king-addons'),
1028 + 'type' => Controls_Manager::COLOR,
1029 + 'selectors' => [
1030 + '{{WRAPPER}} .king-addons-mobile-menu-toggle:hover' => 'background-color: {{VALUE}};',
1031 + ],
1032 + ]
1033 + );
1034 +
1035 + $this->add_control(
1036 + 'mobile_toggle_active_color',
1037 + [
1038 + 'label' => esc_html__('Toggle Button Active Color', 'king-addons'),
1039 + 'type' => Controls_Manager::COLOR,
1040 + 'selectors' => [
1041 + '{{WRAPPER}} .king-addons-mobile-menu-toggle.active' => 'color: {{VALUE}};',
1042 + ],
1043 + ]
1044 + );
1045 +
1046 + $this->add_control(
1047 + 'mobile_toggle_active_background',
1048 + [
1049 + 'label' => esc_html__('Toggle Button Active Background', 'king-addons'),
1050 + 'type' => Controls_Manager::COLOR,
1051 + 'selectors' => [
1052 + '{{WRAPPER}} .king-addons-mobile-menu-toggle.active' => 'background-color: {{VALUE}};',
1053 + ],
1054 + ]
1055 + );
1056 +
1057 + $this->add_control(
1058 + 'mobile_menu_background',
1059 + [
1060 + 'label' => esc_html__('Menu Background', 'king-addons'),
1061 + 'type' => Controls_Manager::COLOR,
1062 + 'selectors' => [
1063 + '{{WRAPPER}} .king-addons-mobile-menu' => 'background-color: {{VALUE}};',
1064 + ],
1065 + ]
1066 + );
1067 +
1068 + $this->add_control(
1069 + 'mobile_menu_text_color',
1070 + [
1071 + 'label' => esc_html__('Text Color', 'king-addons'),
1072 + 'type' => Controls_Manager::COLOR,
1073 + 'selectors' => [
1074 + '{{WRAPPER}} .king-addons-mobile-menu .king-addons-menu-items a' => 'color: {{VALUE}} !important;',
1075 + '{{WRAPPER}} .king-addons-mobile-menu .king-addons-menu-items li a' => 'color: {{VALUE}} !important;',
1076 + ],
1077 + ]
1078 + );
1079 +
1080 + $this->add_control(
1081 + 'mobile_menu_text_hover_color',
1082 + [
1083 + 'label' => esc_html__('Text Hover Color', 'king-addons'),
1084 + 'type' => Controls_Manager::COLOR,
1085 + 'selectors' => [
1086 + '{{WRAPPER}} .king-addons-mobile-menu .king-addons-menu-items a:hover' => 'color: {{VALUE}} !important;',
1087 + '{{WRAPPER}} .king-addons-mobile-menu .king-addons-menu-items li a:hover' => 'color: {{VALUE}} !important;',
1088 + ],
1089 + ]
1090 + );
1091 +
1092 + $this->add_group_control(
1093 + Group_Control_Typography::get_type(),
1094 + [
1095 + 'name' => 'mobile_menu_typography',
1096 + 'selector' => '{{WRAPPER}} .king-addons-mobile-menu a',
1097 + ]
1098 + );
1099 +
1100 + $this->add_group_control(
1101 + Group_Control_Border::get_type(),
1102 + [
1103 + 'name' => 'mobile_menu_border',
1104 + 'selector' => '{{WRAPPER}} .king-addons-mobile-menu',
1105 + ]
1106 + );
1107 +
1108 + $this->add_group_control(
1109 + Group_Control_Box_Shadow::get_type(),
1110 + [
1111 + 'name' => 'mobile_menu_shadow',
1112 + 'selector' => '{{WRAPPER}} .king-addons-mobile-menu',
1113 + ]
1114 + );
1115 +
1116 + $this->end_controls_section();
1117 +
1118 + // Logo Style
1119 + $this->start_controls_section(
1120 + 'section_mega_menu_logo_style',
1121 + [
1122 + 'label' => KING_ADDONS_ELEMENTOR_ICON . esc_html__('Logo Style', 'king-addons'),
1123 + 'tab' => Controls_Manager::TAB_STYLE,
1124 + 'condition' => [
1125 + 'show_logo' => 'yes',
1126 + ],
1127 + ]
1128 + );
1129 +
1130 + $this->add_responsive_control(
1131 + 'logo_margin',
1132 + [
1133 + 'label' => esc_html__('Margin', 'king-addons'),
1134 + 'type' => Controls_Manager::DIMENSIONS,
1135 + 'size_units' => ['px', '%', 'em'],
1136 + 'default' => [
1137 + 'top' => 0,
1138 + 'right' => 0,
1139 + 'bottom' => 0,
1140 + 'left' => 0,
1141 + ],
1142 + 'selectors' => [
1143 + '{{WRAPPER}} .king-addons-mega-menu-logo' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
1144 + ],
1145 + ]
1146 + );
1147 +
1148 + $this->add_responsive_control(
1149 + 'logo_padding',
1150 + [
1151 + 'label' => esc_html__('Padding', 'king-addons'),
1152 + 'type' => Controls_Manager::DIMENSIONS,
1153 + 'size_units' => ['px', '%', 'em'],
1154 + 'default' => [
1155 + 'top' => 0,
1156 + 'right' => 0,
1157 + 'bottom' => 0,
1158 + 'left' => 0,
1159 + ],
1160 + 'selectors' => [
1161 + '{{WRAPPER}} .king-addons-mega-menu-logo' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
1162 + ],
1163 + ]
1164 + );
1165 +
1166 + $this->add_group_control(
1167 + Group_Control_Border::get_type(),
1168 + [
1169 + 'name' => 'logo_border',
1170 + 'selector' => '{{WRAPPER}} .king-addons-mega-menu-logo',
1171 + ]
1172 + );
1173 +
1174 + $this->add_responsive_control(
1175 + 'logo_border_radius',
1176 + [
1177 + 'label' => esc_html__('Border Radius', 'king-addons'),
1178 + 'type' => Controls_Manager::DIMENSIONS,
1179 + 'size_units' => ['px', '%', 'em'],
1180 + 'selectors' => [
1181 + '{{WRAPPER}} .king-addons-mega-menu-logo' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
1182 + ],
1183 + ]
1184 + );
1185 +
1186 + $this->end_controls_section();
1187 +
1188 + $this->add_menu_items_hover_effects_controls();
1189 +
1190 + // Allow Pro to add current menu item styling controls.
1191 + $this->add_current_menu_item_controls();
1192 + }
1193 +
1194 + /**
1195 + * Render the widget output on the frontend.
1196 + *
1197 + * Outputs the Mega Menu HTML structure, including logo, menu, and mobile menu toggle. Handles both horizontal and vertical layouts, logo position, and menu source.
1198 + *
1199 + * @return void
1200 + */
1201 + protected function render()
1202 + {
1203 + $settings = $this->get_settings_for_display();
1204 + $menu_layout = $settings['menu_layout'];
1205 + $logo_position = $settings['logo_position'];
1206 + $logo_position_tablet = !empty($settings['logo_position_tablet']) ? $settings['logo_position_tablet'] : $logo_position;
1207 + $logo_position_mobile = !empty($settings['logo_position_mobile']) ? $settings['logo_position_mobile'] : $logo_position;
1208 + $logo_html = '';
1209 +
1210 + if ($settings['show_logo'] === 'yes') {
1211 + $site_url = get_home_url();
1212 + $logo_content = '';
1213 +
1214 + // Generate logo content
1215 + if (!empty($settings['custom_logo']['url'])) {
1216 + // Custom logo uploaded via Elementor
1217 + $logo_content = '<img src="' . esc_url($settings['custom_logo']['url']) . '" alt="' . esc_attr(get_bloginfo('name')) . '">';
1218 + } else {
1219 + // Use WordPress theme logo
1220 + $custom_logo_id = get_theme_mod('custom_logo');
1221 + if ($custom_logo_id) {
1222 + $logo_content = wp_get_attachment_image($custom_logo_id, 'full');
1223 + } else {
1224 + $logo_content = '<span class="site-title">' . esc_html(get_bloginfo('name')) . '</span>';
1225 + }
1226 + }
1227 +
1228 + if (!empty($logo_content)) {
1229 + $logo_classes = 'king-addons-mega-menu-logo';
1230 + $logo_classes .= ' king-addons-logo-position-' . esc_attr($logo_position);
1231 + $logo_classes .= ' king-addons-logo-position-tablet-' . esc_attr($logo_position_tablet);
1232 + $logo_classes .= ' king-addons-logo-position-mobile-' . esc_attr($logo_position_mobile);
1233 +
1234 + $logo_html = '<div class="' . esc_attr($logo_classes) . '">';
1235 + $logo_html .= '<a href="' . esc_url($site_url) . '">';
1236 + $logo_html .= $logo_content;
1237 + $logo_html .= '</a>';
1238 + $logo_html .= '</div>';
1239 + }
1240 + }
1241 +
1242 + $menu_source = $settings['menu_source'];
1243 + $menu_html = '';
1244 + $menu_html_left = '';
1245 + $menu_html_right = '';
1246 +
1247 + if ($menu_source === 'wordpress' && !empty($settings['wp_menu'])) {
1248 + $args = [
1249 + 'menu' => $settings['wp_menu'],
1250 + 'container' => false,
1251 + 'menu_class' => 'king-addons-menu-items',
1252 + 'echo' => false,
1253 + 'fallback_cb' => '__return_empty_string',
1254 + 'items_wrap' => '<ul id="%1$s" class="%2$s">%3$s</ul>',
1255 + 'depth' => 3,
1256 + 'walker' => new King_Addons_Mega_Menu_Walker_Free(),
1257 + ];
1258 +
1259 + $menu_html = wp_nav_menu($args);
1260 +
1261 + // Store split position for center logo (will be handled by JavaScript)
1262 + if ($logo_position === 'center' && !empty($logo_html)) {
1263 + $split_at = isset($settings['center_logo_split_at']) ? (int)$settings['center_logo_split_at'] : 2;
1264 + // We'll let JavaScript handle the splitting for more reliable results
1265 + }
1266 + }
1267 +
1268 + // Mobile menu toggle button
1269 + $mobile_toggle = '<button class="king-addons-mobile-menu-toggle"><i class="fas fa-bars"></i></button>';
1270 +
1271 + // Applying styles for vertical alignment
1272 + $vertical_alignment_style = '';
1273 + $vertical_alignment_attr = '';
1274 + if ($menu_layout === 'vertical' && !empty($settings['vertical_alignment'])) {
1275 + $vertical_alignment_style = ' style="align-items: ' . esc_attr($settings['vertical_alignment']) . ';"';
1276 + $vertical_alignment_attr = ' data-vertical-align="' . esc_attr($settings['vertical_alignment']) . '"';
1277 + }
1278 +
1279 + // Applying styles for horizontal alignment
1280 + $horizontal_alignment_attr = '';
1281 + if ($menu_layout === 'horizontal' && !empty($settings['horizontal_alignment'])) {
1282 + $horizontal_alignment_attr = ' data-horizontal-align="' . esc_attr($settings['horizontal_alignment']) . '"';
1283 + }
1284 +
1285 + // Add data attributes to main menu wrapper
1286 + $dropdown_animation = !empty($settings['dropdown_animation']) ? $settings['dropdown_animation'] : 'fade';
1287 + $dropdown_animation_attr = ' data-dropdown-animation="' . esc_attr($dropdown_animation) . '"';
1288 +
1289 + // Add center logo data attributes for responsive positions
1290 + $center_logo_attrs = '';
1291 + $has_center_logo = ($logo_position === 'center' || $logo_position_tablet === 'center' || $logo_position_mobile === 'center');
1292 +
1293 + if ($has_center_logo && !empty($logo_html)) {
1294 + $split_at = isset($settings['center_logo_split_at']) ? (int)$settings['center_logo_split_at'] : 2;
1295 + $center_logo_attrs = ' data-center-logo="true" data-split-at="' . esc_attr($split_at) . '"';
1296 + $center_logo_attrs .= ' data-logo-position-desktop="' . esc_attr($logo_position) . '"';
1297 + $center_logo_attrs .= ' data-logo-position-tablet="' . esc_attr($logo_position_tablet) . '"';
1298 + $center_logo_attrs .= ' data-logo-position-mobile="' . esc_attr($logo_position_mobile) . '"';
1299 + }
1300 +
1301 +?>
1302 + <div class="king-addons-mega-menu king-addons-mega-menu-<?php echo esc_attr($menu_layout); ?> king-addons-logo-position-<?php echo esc_attr($logo_position); ?> king-addons-logo-position-tablet-<?php echo esc_attr($logo_position_tablet); ?> king-addons-logo-position-mobile-<?php echo esc_attr($logo_position_mobile); ?>" <?php echo $vertical_alignment_attr . $horizontal_alignment_attr . $dropdown_animation_attr . $center_logo_attrs; ?>>
1303 +
1304 + <?php if ($logo_position === 'left' && !empty($logo_html)) : ?>
1305 + <?php echo $logo_html; ?>
1306 + <?php endif; ?>
1307 +
1308 + <?php if (!empty($logo_html) && ($logo_position === 'center' || $logo_position_tablet === 'center' || $logo_position_mobile === 'center')) : ?>
1309 + <!-- Center logo will be positioned by JavaScript -->
1310 + <div class="king-addons-center-logo-placeholder">
1311 + <?php echo $logo_html; ?>
1312 + </div>
1313 + <?php endif; ?>
1314 +
1315 + <nav class="king-addons-menu-container" <?php echo $vertical_alignment_style; ?>>
1316 + <?php echo $menu_html; ?>
1317 + </nav>
1318 +
1319 + <?php if ($logo_position === 'right' && !empty($logo_html)) : ?>
1320 + <?php echo $logo_html; ?>
1321 + <?php endif; ?>
1322 +
1323 + <?php echo $mobile_toggle; ?>
1324 + <div class="king-addons-mobile-menu">
1325 + <?php echo $menu_html; ?>
1326 + </div>
1327 + </div>
1328 +<?php
1329 + }
1330 +
1331 + public function add_menu_items_hover_effects_controls()
1332 + {
1333 + $this->start_controls_section(
1334 + 'section_menu_items_hover_effects',
1335 + [
1336 + 'label' => KING_ADDONS_ELEMENTOR_ICON . esc_html__('Menu Items Hover Effects', 'king-addons'),
1337 + 'tab' => Controls_Manager::TAB_STYLE,
1338 + ]
1339 + );
1340 + $this->add_control(
1341 + 'dropdown_icon_heading',
1342 + [
1343 + 'label' => esc_html__('Dropdown Icon', 'king-addons'),
1344 + 'type' => Controls_Manager::HEADING,
1345 + 'separator' => 'before',
1346 + ]
1347 + );
1348 + $this->add_control(
1349 + 'dropdown_icon_pro_notice',
1350 + [
1351 + 'type' => Controls_Manager::RAW_HTML,
1352 + 'raw' => 'Dropdown icon customization is available in the <strong><a href="https://kingaddons.com/pricing/?utm_source=kng-module-mega-menu-settings-upgrade-pro&utm_medium=plugin&utm_campaign=kng" target="_blank">Pro version</a></strong>',
1353 + 'content_classes' => 'king-addons-pro-notice',
1354 + ]
1355 + );
1356 + $this->end_controls_section();
1357 + }
1358 +}
1359 +
1360 +class King_Addons_Mega_Menu_Walker_Free extends \Walker_Nav_Menu {
1361 + public function start_el( &$output, $item, $depth = 0, $args = [], $id = 0 ) {
1362 + $classes = empty($item->classes) ? [] : (array) $item->classes;
1363 + $is_dropdown = in_array('menu-item-has-children', $classes);
1364 + $output .= '<li class="' . esc_attr(implode(' ', $classes)) . '">';
1365 + $atts = [];
1366 + $atts['href'] = !empty($item->url) ? $item->url : '';
1367 + $atts['title'] = !empty($item->attr_title) ? $item->attr_title : '';
1368 + $atts['target'] = !empty($item->target) ? $item->target : '';
1369 + $atts['rel'] = !empty($item->xfn) ? $item->xfn : '';
1370 + $attributes = '';
1371 + foreach ($atts as $attr => $value) {
1372 + if (!empty($value)) {
1373 + $attributes .= ' ' . $attr . '="' . esc_attr($value) . '"';
1374 + }
1375 + }
1376 + $output .= '<a' . $attributes . '>';
1377 + $output .= '<span class="menu-item-text">' . apply_filters('the_title', $item->title, $item->ID) . '</span>';
1378 + if ($is_dropdown) {
1379 + $output .= '<span class="king-addons-dropdown-icon" style="margin-left:8px;"><i class="fas fa-angle-down"></i></span>';
1380 + }
1381 + $output .= '</a>';
1382 + }
1383 + public function end_el( &$output, $item, $depth = 0, $args = [] ) {
1384 + $output .= '</li>';
1385 + }
1386 +}