add_skin( new Skins\Skin_Classic( $this ) );
}
/**
* Get Nav Menu Index
*
* @since 2.0.0
* @return int
*/
protected function get_nav_menu_index() {
return $this->nav_menu_index++;
}
/**
* Get Available Menu
*
* Return the list of available WP menus
*
* @since 2.0.0
* @return array
*/
private function get_available_menus() {
$menus = wp_get_nav_menus();
$options = [];
foreach ( $menus as $menu ) {
$options[ $menu->slug ] = $menu->name;
}
return $options;
}
/**
* Register Widget Controls
*
* @since 2.0.0
* @return void
*/
protected function _register_controls() {
// Content tab
$this->register_settings_controls();
// Style tab
$this->register_menu_style_controls();
$this->register_links_style_controls();
}
/**
* Register Settings Controls
*
* @since 2.0.0
* @return void
*/
protected function register_settings_controls() {
$this->start_controls_section(
'section_settings',
[
'label' => __( 'Settings', 'elementor-extras' ),
'tab' => Controls_Manager::TAB_CONTENT,
]
);
$menus = $this->get_available_menus();
if ( ! empty( $menus ) ) {
$this->add_control(
'menu',
[
'label' => __( 'Menu', 'elementor-extras' ),
'type' => Controls_Manager::SELECT,
'options' => $menus,
'default' => array_keys( $menus )[0],
'save_default' => true,
'separator' => 'after',
'description' => sprintf( __( 'Go to the Menus screen to manage your menus.', 'elementor-extras' ), admin_url( 'nav-menus.php' ) ),
]
);
} else {
$this->add_control(
'menu',
[
'type' => Controls_Manager::RAW_HTML,
'raw' => sprintf( __( 'There are no menus in your site.
Go to the Menus screen to create one.', 'elementor-extras' ), admin_url( 'nav-menus.php?action=edit&menu=0' ) ),
'separator' => 'after',
'content_classes' => 'elementor-panel-alert elementor-panel-alert-info',
]
);
}
$this->add_control(
'back_text',
[
'label' => __( 'Back Label', 'elementor-extras' ),
'type' => Controls_Manager::TEXT,
'dynamic' => [ 'active' => true ],
'default' => __( 'Back', 'elementor-extras' ),
'label_block' => false,
'frontend_available' => true,
]
);
$this->add_control(
'effect',
[
'label' => __( 'Effect', 'elementor-extras' ),
'type' => Controls_Manager::SELECT,
'options' => [
'overlay' => __( 'Overlay', 'elementor-extras' ),
'push' => __( 'Push', 'elementor-extras' ),
// 'shift' => __( 'Shift', 'elementor-extras' ),
],
'default' => 'overlay',
'prefix_class' => 'ee-slide-menu-effect--',
]
);
$this->add_control(
'direction',
[
'label' => __( 'Direction', 'elementor-extras' ),
'type' => Controls_Manager::SELECT,
'options' => [
'left' => __( 'Left', 'elementor-extras' ),
'right' => __( 'Right', 'elementor-extras' ),
'bottom' => __( 'Bottom', 'elementor-extras' ),
'top' => __( 'Top', 'elementor-extras' ),
],
'default' => 'left',
'prefix_class' => 'ee-slide-menu-direction--',
]
);
$this->add_responsive_control(
'duration',
[
'label' => __( 'Transition Duration', 'elementor-extras' ),
'type' => Controls_Manager::SLIDER,
'range' => [
'px' => [
'min' => 0,
'max' => 3,
'step'=> 0.1,
],
],
'selectors' => [
'{{WRAPPER}} .ee-menu__sub-menu,
{{WRAPPER}} .ee-menu__menu' => 'transition-duration: {{SIZE}}s;',
],
]
);
$this->add_control(
'link_navigation',
[
'label' => __( 'Link Navigation', 'elementor-extras' ),
'type' => Controls_Manager::SWITCHER,
'description' => __( 'Allow navigating to sub-menus by clicking the links instead of just the arrows.', 'elementor-extras' ),
'return_value' => 'yes',
'frontend_available' => true,
]
);
$this->add_control(
'parent_icon',
[
'label' => __( 'Parent Icon', 'elementor' ),
'type' => Controls_Manager::ICONS,
'default' => [
'value' => 'fas fa-angle-right',
'library' => 'fa-solid',
],
]
);
$this->end_controls_section();
}
/**
* Register Menu Style Controls
*
* @since 2.0.0
* @return void
*/
protected function register_menu_style_controls() {
$this->start_controls_section(
'section_menu_style',
[
'label' => __( 'Menu', 'elementor-extras' ),
'tab' => Controls_Manager::TAB_STYLE,
]
);
$this->add_responsive_control(
'width',
[
'label' => __( 'Width', 'elementor-extras' ),
'type' => Controls_Manager::SLIDER,
'size_units' => [ 'px', '%' ],
'range' => [
'%' => [
'min' => 0,
'max' => 100,
],
'px' => [
'min' => 100,
'max' => 1000,
],
],
'selectors' => [
'{{WRAPPER}} .ee-slide-menu' => 'max-width: {{SIZE}}{{UNIT}};',
],
]
);
$this->add_control(
'fixed_height',
[
'label' => __( 'Fixed Height', 'elementor-extras' ),
'type' => Controls_Manager::SWITCHER,
'description' => __( 'If turned off, the menu will adjust its height based on the currently active sub-menu.', 'elementor-extras' ),
'default' => 'yes',
]
);
$this->add_responsive_control(
'height',
[
'label' => __( 'Min. Height', 'elementor-extras' ),
'type' => Controls_Manager::SLIDER,
'range' => [
'px' => [
'min' => 100,
'max' => 1000,
],
],
'selectors' => [
'{{WRAPPER}} .ee-slide-menu,
{{WRAPPER}} .ee-slide-menu__sub-menu' => 'min-height: {{SIZE}}px;',
],
'condition' => [
'fixed_height!' => '',
],
]
);
$this->add_control(
'align',
[
'label' => __( 'Align', 'elementor-extras' ),
'type' => Controls_Manager::CHOOSE,
'default' => 'left',
'options' => [
'left' => [
'title' => __( 'Left', 'elementor-extras' ),
'icon' => 'eicon-h-align-left',
],
'center' => [
'title' => __( 'Center', 'elementor-extras' ),
'icon' => 'eicon-h-align-center',
],
'right' => [
'title' => __( 'Right', 'elementor-extras' ),
'icon' => 'eicon-h-align-right',
],
],
'selectors' => [
'{{WRAPPER}}' => 'text-align: {{VALUE}};',
],
]
);
$this->add_control(
'background',
[
'label' => __( 'Background', 'elementor-extras' ),
'type' => Controls_Manager::COLOR,
'global' => [
'default' => Global_Colors::COLOR_PRIMARY,
],
'default' => '',
'selectors' => [
'{{WRAPPER}} .ee-slide-menu,
{{WRAPPER}} .ee-menu__sub-menu' => 'background-color: {{VALUE}};',
],
]
);
$this->add_group_control(
Group_Control_Border::get_type(),
[
'name' => 'navigation',
'label' => __( 'Border', 'elementor-extras' ),
'selector' => '{{WRAPPER}} .ee-slide-menu',
]
);
$this->add_control(
'border_radius',
[
'label' => __( 'Border Radius', 'elementor-extras' ),
'type' => Controls_Manager::DIMENSIONS,
'selectors' => [
'{{WRAPPER}} .ee-slide-menu,
{{WRAPPER}} .ee-slide-menu__sub-menu' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
],
]
);
$this->add_group_control(
Group_Control_Box_Shadow::get_type(),
[
'name' => 'navigation_box_shadow',
'selector' => '{{WRAPPER}} .ee-slide-menu',
'separator' => '',
]
);
$this->add_group_control(
Group_Control_Typography::get_type(),
[
'name' => 'navigation_links_typography',
'label' => __( 'Typography', 'elementor-extras' ),
'global' => [
'default' => Global_Typography::TYPOGRAPHY_TEXT,
],
'selector' => '{{WRAPPER}} .ee-slide-menu .ee-menu__item a',
]
);
$this->end_controls_section();
}
/**
* Register Links Style Controls
*
* @since 2.0.0
* @return void
*/
protected function register_links_style_controls() {
$this->start_controls_section(
'section_links_style',
[
'label' => __( 'Links', 'elementor-extras' ),
'tab' => Controls_Manager::TAB_STYLE,
]
);
$this->add_responsive_control(
'links_spacing',
[
'label' => __( 'Spacing', 'elementor-extras' ),
'type' => Controls_Manager::SLIDER,
'default' => [
'size' => 0,
],
'range' => [
'px' => [
'min' => 0,
'max' => 50,
],
],
'selectors' => [
'{{WRAPPER}} .ee-menu__item:not(:last-child)' => 'margin-bottom: {{SIZE}}px;',
],
]
);
$this->add_responsive_control(
'links_separator_thickness',
[
'label' => __( 'Separator Thickness', 'elementor-extras' ),
'type' => Controls_Manager::SLIDER,
'separator' => 'before',
'range' => [
'px' => [
'min' => 0,
'max' => 50,
],
],
'selectors' => [
'{{WRAPPER}} .ee-menu__item' => 'border-bottom-width: {{SIZE}}px; border-bottom-style: solid;',
],
]
);
$this->add_group_control(
Group_Control_Transition::get_type(),
[
'name' => 'links',
'selector' => '{{WRAPPER}} .ee-menu__item__link,
{{WRAPPER}} .ee-menu__arrow',
'separator' => '',
]
);
$this->start_controls_tabs( 'links_type' );
$this->start_controls_tab( 'links_regular', [ 'label' => __( 'Default', 'elementor-extras' ) ] );
$this->add_control(
'links_padding',
[
'label' => __( 'Padding', 'elementor-extras' ),
'type' => Controls_Manager::DIMENSIONS,
'selectors' => [
'{{WRAPPER}} .ee-menu__item__link' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
'{{WRAPPER}} .ee-menu__arrow' => 'padding-top: {{TOP}}{{UNIT}}; padding-bottom: {{BOTTOM}}{{UNIT}};',
],
]
);
$this->add_control(
'links_text_align',
[
'label' => __( 'Align Text', 'elementor-extras' ),
'type' => Controls_Manager::CHOOSE,
'default' => 'left',
'options' => [
'left' => [
'title' => __( 'Left', 'elementor-extras' ),
'icon' => 'fa fa-align-left',
],
'center' => [
'title' => __( 'Center', 'elementor-extras' ),
'icon' => 'fa fa-align-center',
],
'right' => [
'title' => __( 'Right', 'elementor-extras' ),
'icon' => 'fa fa-align-right',
],
],
'selectors' => [
'{{WRAPPER}} .ee-menu__item__link' => 'text-align: {{VALUE}};',
],
]
);
$this->end_controls_tab();
$this->start_controls_tab( 'links_back', [ 'label' => __( 'Back', 'elementor-extras' ) ] );
$this->add_control(
'links_back_padding',
[
'label' => __( 'Padding', 'elementor-extras' ),
'type' => Controls_Manager::DIMENSIONS,
'selectors' => [
'{{WRAPPER}} .ee-menu__back .ee-menu__item__link' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
'{{WRAPPER}} .ee-menu__back .ee-menu__arrow' => 'padding-top: {{TOP}}{{UNIT}}; padding-bottom: {{BOTTOM}}{{UNIT}};',
],
]
);
$this->add_control(
'links_back_text_align',
[
'label' => __( 'Align Text', 'elementor-extras' ),
'type' => Controls_Manager::CHOOSE,
'default' => 'left',
'options' => [
'left' => [
'title' => __( 'Left', 'elementor-extras' ),
'icon' => 'fa fa-align-left',
],
'center' => [
'title' => __( 'Center', 'elementor-extras' ),
'icon' => 'fa fa-align-center',
],
'right' => [
'title' => __( 'Right', 'elementor-extras' ),
'icon' => 'fa fa-align-right',
],
],
'selectors' => [
'{{WRAPPER}} .ee-menu__back .ee-menu__item__link' => 'text-align: {{VALUE}};',
],
]
);
$this->end_controls_tab();
$this->end_controls_tabs();
$this->start_controls_tabs( 'links' );
$this->start_controls_tab( 'links_default', [ 'label' => __( 'Default', 'elementor-extras' ) ] );
$this->add_control(
'links_color',
[
'label' => __( 'Color', 'elementor-extras' ),
'type' => Controls_Manager::COLOR,
'default' => '',
'selectors' => [
'{{WRAPPER}} .ee-menu__item__link' => 'color: {{VALUE}};',
],
]
);
$this->add_control(
'links_separator_color',
[
'label' => __( 'Separator Color', 'elementor-extras' ),
'type' => Controls_Manager::COLOR,
'default' => '',
'selectors' => [
'{{WRAPPER}} .ee-menu__item' => 'border-color: {{VALUE}};',
],
]
);
$this->add_control(
'links_background',
[
'label' => __( 'Background', 'elementor-extras' ),
'type' => Controls_Manager::COLOR,
'default' => '',
'selectors' => [
'{{WRAPPER}} .ee-menu__item__link' => 'background-color: {{VALUE}};',
],
]
);
$this->end_controls_tab();
$this->start_controls_tab( 'links_hover', [ 'label' => __( 'Hover', 'elementor-extras' ) ] );
$this->add_control(
'links_color_hover',
[
'label' => __( 'Color', 'elementor-extras' ),
'type' => Controls_Manager::COLOR,
'default' => '',
'selectors' => [
'{{WRAPPER}} .ee-menu__item__link:hover' => 'color: {{VALUE}};',
],
]
);
$this->add_control(
'links_separator_color_hover',
[
'label' => __( 'Separator Color', 'elementor-extras' ),
'type' => Controls_Manager::COLOR,
'default' => '',
'selectors' => [
'{{WRAPPER}} .ee-menu__item:hover' => 'border-color: {{VALUE}};',
],
]
);
$this->add_control(
'links_background_hover',
[
'label' => __( 'Background', 'elementor-extras' ),
'type' => Controls_Manager::COLOR,
'default' => '',
'selectors' => [
'{{WRAPPER}} .ee-menu__item__link:hover' => 'background-color: {{VALUE}};',
],
]
);
$this->end_controls_tab();
$this->start_controls_tab( 'links_current', [ 'label' => __( 'Current', 'elementor-extras' ) ] );
$this->add_control(
'links_color_current',
[
'label' => __( 'Color', 'elementor-extras' ),
'type' => Controls_Manager::COLOR,
'default' => '',
'selectors' => [
'{{WRAPPER}} .ee-menu__item__link.ee-menu__item__link--current,
{{WRAPPER}} .ee-menu__item__link.ee-menu__item__link--current:hover' => 'color: {{VALUE}};',
],
]
);
$this->add_control(
'links_separator_color_current',
[
'label' => __( 'Separator Color', 'elementor-extras' ),
'type' => Controls_Manager::COLOR,
'default' => '',
'selectors' => [
'{{WRAPPER}} .ee-menu__item.ee-menu__item--current' => 'border-color: {{VALUE}};',
],
]
);
$this->add_control(
'links_background_current',
[
'label' => __( 'Background', 'elementor-extras' ),
'type' => Controls_Manager::COLOR,
'default' => '',
'selectors' => [
'{{WRAPPER}} .ee-menu__item__link.ee-menu__item__link--current,
{{WRAPPER}} .ee-menu__item__link.ee-menu__item__link--current:hover' => 'background-color: {{VALUE}};',
],
]
);
$this->end_controls_tab();
$this->end_controls_tabs();
$this->add_control(
'heading_arrows',
[
'type' => Controls_Manager::HEADING,
'label' => __( 'Arrows', 'elementor-extras' ),
'separator' => 'before',
]
);
$this->add_responsive_control(
'arrows_separator_thickness',
[
'label' => __( 'Separator Thickness', 'elementor-extras' ),
'type' => Controls_Manager::SLIDER,
'separator' => 'after',
'range' => [
'px' => [
'min' => 0,
'max' => 50,
],
],
'selectors' => [
'{{WRAPPER}} .ee-menu__item--has-children > .ee-menu__arrow' => 'border-left-width: {{SIZE}}px; border-left-style: solid;',
'{{WRAPPER}} .ee-menu__back > .ee-menu__arrow' => 'border-right-width: {{SIZE}}px; border-right-style: solid;',
],
]
);
$this->start_controls_tabs( 'arrows_type' );
$this->start_controls_tab( 'arrows_regular', [ 'label' => __( 'Default', 'elementor-extras' ) ] );
$this->add_responsive_control(
'arrows_size',
[
'label' => __( 'Size', 'elementor-extras' ),
'type' => Controls_Manager::SLIDER,
'default' => [
'size' => 1,
],
'range' => [
'px' => [
'min' => 0.1,
'max' => 3,
'step'=> 0.1,
],
],
'selectors' => [
'{{WRAPPER}} .ee-menu__arrow' => 'font-size: {{SIZE}}em;',
],
]
);
$this->add_control(
'arrows_padding',
[
'label' => __( 'Padding', 'elementor-extras' ),
'type' => Controls_Manager::DIMENSIONS,
'allowed_dimensions' => [ 'right', 'left' ],
'selectors' => [
'{{WRAPPER}} .ee-menu__arrow' => 'padding-right: {{RIGHT}}{{UNIT}}; padding-left: {{LEFT}}{{UNIT}};',
],
]
);
$this->end_controls_tab();
$this->start_controls_tab( 'arrows_back', [ 'label' => __( 'Back', 'elementor-extras' ) ] );
$this->add_responsive_control(
'arrows_back_size',
[
'label' => __( 'Size', 'elementor-extras' ),
'type' => Controls_Manager::SLIDER,
'default' => [
'size' => 1,
],
'range' => [
'px' => [
'min' => 0.1,
'max' => 3,
'step'=> 0.1,
],
],
'selectors' => [
'{{WRAPPER}} .ee-menu__back .ee-menu__arrow' => 'font-size: {{SIZE}}em;',
],
]
);
$this->add_control(
'arrows_back_padding',
[
'label' => __( 'Padding', 'elementor-extras' ),
'type' => Controls_Manager::DIMENSIONS,
'allowed_dimensions' => [ 'right', 'left' ],
'selectors' => [
'{{WRAPPER}} .ee-menu__back .ee-menu__arrow' => 'padding-right: {{RIGHT}}{{UNIT}}; padding-left: {{LEFT}}{{UNIT}};',
],
]
);
$this->end_controls_tab();
$this->end_controls_tabs();
$this->start_controls_tabs( 'arrows' );
$this->start_controls_tab( 'arrows_default', [ 'label' => __( 'Default', 'elementor-extras' ) ] );
$this->add_control(
'arrows_color',
[
'label' => __( 'Color', 'elementor-extras' ),
'type' => Controls_Manager::COLOR,
'default' => '',
'selectors' => [
'{{WRAPPER}} .ee-menu__arrow' => 'color: {{VALUE}};',
'{{WRAPPER}} .ee-menu__arrow svg' => 'fill: {{VALUE}};',
],
]
);
$this->add_control(
'arrows_separator_color',
[
'label' => __( 'Separator Color', 'elementor-extras' ),
'type' => Controls_Manager::COLOR,
'default' => '',
'selectors' => [
'{{WRAPPER}} .ee-menu__arrow' => 'border-color: {{VALUE}};',
],
]
);
$this->add_control(
'arrows_background',
[
'label' => __( 'Background', 'elementor-extras' ),
'type' => Controls_Manager::COLOR,
'default' => '',
'selectors' => [
'{{WRAPPER}} .ee-menu__arrow' => 'background-color: {{VALUE}};',
],
]
);
$this->end_controls_tab();
$this->start_controls_tab( 'arrows_hover', [ 'label' => __( 'Hover', 'elementor-extras' ) ] );
$this->add_control(
'arrows_color_hover',
[
'label' => __( 'Color', 'elementor-extras' ),
'type' => Controls_Manager::COLOR,
'default' => '',
'selectors' => [
'{{WRAPPER}} .ee-menu__arrow:hover' => 'color: {{VALUE}};',
'{{WRAPPER}} .ee-menu__arrow:hover svg' => 'fill: {{VALUE}};',
],
]
);
$this->add_control(
'arrows_separator_color_hover',
[
'label' => __( 'Separator Color', 'elementor-extras' ),
'type' => Controls_Manager::COLOR,
'default' => '',
'selectors' => [
'{{WRAPPER}} .ee-menu__arrow:hover' => 'border-color: {{VALUE}};',
],
]
);
$this->add_control(
'arrows_background_hover',
[
'label' => __( 'Background', 'elementor-extras' ),
'type' => Controls_Manager::COLOR,
'default' => '',
'selectors' => [
'{{WRAPPER}} .ee-menu__arrow:hover' => 'background-color: {{VALUE}};',
],
]
);
$this->end_controls_tab();
$this->end_controls_tabs();
$this->end_controls_section();
}
/**
* Render
*
* Render widget contents on frontend
*
* @since 2.0.0
* @return void
*/
public function render() {
$available_menus = $this->get_available_menus();
if ( ! $available_menus ) {
return;
}
$settings = $this->get_active_settings();
ob_start();
Icons_Manager::render_icon( $settings['parent_icon'], [ 'aria-hidden' => 'true' ] );
$icon = ob_get_clean();
$args = [
'echo' => false,
'menu' => $settings['menu'],
'menu_class' => 'ee-menu__menu ee-slide-menu__menu',
'menu_id' => 'menu-' . $this->get_nav_menu_index() . '-' . $this->get_id(),
'fallback_cb' => '__return_empty_string',
'before' => ' ',
'container' => '',
];
add_filter( 'walker_nav_menu_start_el', [ $this, 'filter_nav_menu_start_el' ], 10, 4 );
add_filter( 'wp_nav_menu_items', [ $this, 'handle_menu_items' ] );
add_filter( 'nav_menu_link_attributes', [ $this, 'handle_link_classes' ], 10, 4 );
add_filter( 'nav_menu_submenu_css_class', [ $this, 'handle_sub_menu_classes' ] );
add_filter( 'nav_menu_css_class', [ $this, 'handle_menu_item_classes' ] );
// General Menu.
$menu_html = wp_nav_menu( $args );
remove_filter( 'wp_nav_menu_items', [ $this, 'handle_menu_items' ] );
remove_filter( 'nav_menu_link_attributes', [ $this, 'handle_link_classes' ] );
remove_filter( 'nav_menu_submenu_css_class', [ $this, 'handle_sub_menu_classes' ] );
remove_filter( 'nav_menu_css_class', [ $this, 'handle_menu_item_classes' ] );
remove_filter( 'walker_nav_menu_start_el', [ $this, 'filter_nav_menu_start_el' ] );
$this->add_render_attribute( [
'wrapper' => [
'class' => [
'ee-menu',
'ee-slide-menu',
],
],
] );
?>