start_controls_section( 'section_trigger', [ 'label' => __( 'Trigger Button', 'admore-widgets-suite' ), 'tab' => \Elementor\Controls_Manager::TAB_CONTENT, ] ); $this->add_control( 'trigger_type', [ 'label' => __( 'Trigger Type', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::SELECT, 'default' => 'button', 'options' => [ 'button' => __( 'Button', 'admore-widgets-suite' ), 'icon' => __( 'Icon Only', 'admore-widgets-suite' ), 'text' => __( 'Text Only', 'admore-widgets-suite' ), ], ] ); $this->add_control( 'trigger_text', [ 'label' => __( 'Button Text', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::TEXT, 'default' => __( 'Open Panel', 'admore-widgets-suite' ), 'placeholder' => __( 'Enter text', 'admore-widgets-suite' ), 'condition' => [ 'trigger_type' => [ 'button', 'text' ], ], ] ); $this->add_control( 'trigger_icon', [ 'label' => __( 'Icon', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::ICONS, 'default' => [ 'value' => 'fas fa-bars', 'library' => 'fa-solid', ], 'condition' => [ 'trigger_type' => [ 'button', 'icon' ], ], ] ); $this->add_control( 'icon_position', [ 'label' => __( 'Icon Position', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::SELECT, 'default' => 'left', 'options' => [ 'left' => __( 'Left', 'admore-widgets-suite' ), 'right' => __( 'Right', 'admore-widgets-suite' ), ], 'condition' => [ 'trigger_type' => 'button', ], ] ); $this->end_controls_section(); // Panel Content $this->start_controls_section( 'section_content', [ 'label' => __( 'Panel Content', 'admore-widgets-suite' ), 'tab' => \Elementor\Controls_Manager::TAB_CONTENT, ] ); $this->add_control( 'content_type', [ 'label' => __( 'Content Type', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::SELECT, 'default' => 'template', 'options' => [ 'template' => __( 'Saved Template', 'admore-widgets-suite' ), 'content' => __( 'Custom Content', 'admore-widgets-suite' ), ], ] ); $this->add_control( 'template_id', [ 'label' => __( 'Choose Template', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::SELECT2, 'options' => $this->get_elementor_templates(), 'label_block' => true, 'condition' => [ 'content_type' => 'template', ], ] ); $this->add_control( 'custom_content', [ 'label' => __( 'Content', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::WYSIWYG, 'default' => __( 'Add your content here.', 'admore-widgets-suite' ), 'condition' => [ 'content_type' => 'content', ], ] ); $this->end_controls_section(); // Panel Settings $this->start_controls_section( 'section_settings', [ 'label' => __( 'Panel Settings', 'admore-widgets-suite' ), 'tab' => \Elementor\Controls_Manager::TAB_CONTENT, ] ); $this->add_control( 'panel_position', [ 'label' => __( 'Panel Position', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::SELECT, 'default' => 'left', 'options' => [ 'left' => __( 'Slide from Left', 'admore-widgets-suite' ), 'right' => __( 'Slide from Right', 'admore-widgets-suite' ), 'top' => __( 'Slide from Top', 'admore-widgets-suite' ), 'bottom' => __( 'Slide from Bottom', 'admore-widgets-suite' ), ], ] ); $this->add_control( 'animation_speed', [ 'label' => __( 'Animation Speed (ms)', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::NUMBER, 'min' => 100, 'max' => 2000, 'step' => 50, 'default' => 300, ] ); $this->add_control( 'auto_open', [ 'label' => __( 'Auto Open', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::SWITCHER, 'label_on' => __( 'Yes', 'admore-widgets-suite' ), 'label_off' => __( 'No', 'admore-widgets-suite' ), 'return_value' => 'yes', 'default' => '', ] ); $this->add_control( 'auto_open_delay', [ 'label' => __( 'Auto Open Delay (ms)', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::NUMBER, 'min' => 0, 'max' => 10000, 'step' => 100, 'default' => 1000, 'condition' => [ 'auto_open' => 'yes', ], ] ); $this->add_control( 'close_button', [ 'label' => __( 'Show Close Button', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::SWITCHER, 'label_on' => __( 'Yes', 'admore-widgets-suite' ), 'label_off' => __( 'No', 'admore-widgets-suite' ), 'return_value' => 'yes', 'default' => 'yes', ] ); $this->add_control( 'close_icon', [ 'label' => __( 'Close Icon', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::ICONS, 'default' => [ 'value' => 'fas fa-times', 'library' => 'fa-solid', ], 'condition' => [ 'close_button' => 'yes', ], ] ); $this->add_control( 'overlay_click_close', [ 'label' => __( 'Close on Overlay Click', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::SWITCHER, 'label_on' => __( 'Yes', 'admore-widgets-suite' ), 'label_off' => __( 'No', 'admore-widgets-suite' ), 'return_value' => 'yes', 'default' => 'yes', ] ); $this->add_control( 'esc_close', [ 'label' => __( 'Close on ESC Key', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::SWITCHER, 'label_on' => __( 'Yes', 'admore-widgets-suite' ), 'label_off' => __( 'No', 'admore-widgets-suite' ), 'return_value' => 'yes', 'default' => 'yes', ] ); $this->add_control( 'body_scroll_lock', [ 'label' => __( 'Lock Body Scroll', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::SWITCHER, 'label_on' => __( 'Yes', 'admore-widgets-suite' ), 'label_off' => __( 'No', 'admore-widgets-suite' ), 'return_value' => 'yes', 'default' => 'yes', ] ); $this->end_controls_section(); // ═══════════════════════════════════════════════════════════════ // STYLE TAB // ═══════════════════════════════════════════════════════════════ // Trigger Button Style $this->start_controls_section( 'section_trigger_style', [ 'label' => __( 'Trigger Button', 'admore-widgets-suite' ), 'tab' => \Elementor\Controls_Manager::TAB_STYLE, ] ); $this->add_group_control( \Elementor\Group_Control_Typography::get_type(), [ 'name' => 'trigger_typography', 'selector' => '{{WRAPPER}} .eppro-off-canvas-trigger', ] ); $this->start_controls_tabs( 'trigger_style_tabs' ); $this->start_controls_tab( 'trigger_normal', [ 'label' => __( 'Normal', 'admore-widgets-suite' ), ] ); $this->add_control( 'trigger_color', [ 'label' => __( 'Text Color', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::COLOR, 'selectors' => [ '{{WRAPPER}} .eppro-off-canvas-trigger' => 'color: {{VALUE}};', ], ] ); $this->add_control( 'trigger_icon_color', [ 'label' => __( 'Icon Color', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::COLOR, 'default' => '#ffffff', 'selectors' => [ '{{WRAPPER}} .eppro-off-canvas-trigger i' => 'color: {{VALUE}};', '{{WRAPPER}} .eppro-off-canvas-trigger svg' => 'fill: {{VALUE}}; color: {{VALUE}};', ], ] ); $this->add_group_control( \Elementor\Group_Control_Background::get_type(), [ 'name' => 'trigger_background', 'selector' => '{{WRAPPER}} .eppro-off-canvas-trigger', ] ); $this->end_controls_tab(); $this->start_controls_tab( 'trigger_hover', [ 'label' => __( 'Hover', 'admore-widgets-suite' ), ] ); $this->add_control( 'trigger_hover_color', [ 'label' => __( 'Text Color', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::COLOR, 'selectors' => [ '{{WRAPPER}} .eppro-off-canvas-trigger:hover' => 'color: {{VALUE}};', ], ] ); $this->add_control( 'trigger_hover_icon_color', [ 'label' => __( 'Icon Color', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::COLOR, 'selectors' => [ '{{WRAPPER}} .eppro-off-canvas-trigger:hover i' => 'color: {{VALUE}};', '{{WRAPPER}} .eppro-off-canvas-trigger:hover svg' => 'fill: {{VALUE}}; color: {{VALUE}};', ], ] ); $this->add_group_control( \Elementor\Group_Control_Background::get_type(), [ 'name' => 'trigger_hover_background', 'selector' => '{{WRAPPER}} .eppro-off-canvas-trigger:hover', ] ); $this->end_controls_tab(); $this->end_controls_tabs(); $this->add_responsive_control( 'trigger_padding', [ 'label' => __( 'Padding', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::DIMENSIONS, 'size_units' => [ 'px', 'em', '%' ], 'selectors' => [ '{{WRAPPER}} .eppro-off-canvas-trigger' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], 'separator' => 'before', ] ); $this->add_group_control( \Elementor\Group_Control_Border::get_type(), [ 'name' => 'trigger_border', 'selector' => '{{WRAPPER}} .eppro-off-canvas-trigger', ] ); $this->add_control( 'trigger_border_radius', [ 'label' => __( 'Border Radius', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::DIMENSIONS, 'size_units' => [ 'px', '%' ], 'selectors' => [ '{{WRAPPER}} .eppro-off-canvas-trigger' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], ] ); $this->add_group_control( \Elementor\Group_Control_Box_Shadow::get_type(), [ 'name' => 'trigger_box_shadow', 'selector' => '{{WRAPPER}} .eppro-off-canvas-trigger', ] ); $this->end_controls_section(); // Panel Style $this->start_controls_section( 'section_panel_style', [ 'label' => __( 'Panel', 'admore-widgets-suite' ), 'tab' => \Elementor\Controls_Manager::TAB_STYLE, ] ); $this->add_responsive_control( 'panel_width', [ 'label' => __( 'Width', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::SLIDER, 'size_units' => [ 'px', '%', 'vw' ], 'range' => [ 'px' => [ 'min' => 200, 'max' => 800, ], '%' => [ 'min' => 10, 'max' => 100, ], ], 'default' => [ 'unit' => 'px', 'size' => 400, ], 'selectors' => [ '{{WRAPPER}} .eppro-off-canvas-panel' => 'width: {{SIZE}}{{UNIT}};', ], 'condition' => [ 'panel_position' => [ 'left', 'right' ], ], ] ); $this->add_responsive_control( 'panel_height', [ 'label' => __( 'Height', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::SLIDER, 'size_units' => [ 'px', '%', 'vh' ], 'range' => [ 'px' => [ 'min' => 200, 'max' => 800, ], '%' => [ 'min' => 10, 'max' => 100, ], ], 'default' => [ 'unit' => 'px', 'size' => 400, ], 'selectors' => [ '{{WRAPPER}} .eppro-off-canvas-panel' => 'height: {{SIZE}}{{UNIT}};', ], 'condition' => [ 'panel_position' => [ 'top', 'bottom' ], ], ] ); $this->add_group_control( \Elementor\Group_Control_Background::get_type(), [ 'name' => 'panel_background', 'selector' => '{{WRAPPER}} .eppro-off-canvas-panel', ] ); $this->add_responsive_control( 'panel_padding', [ 'label' => __( 'Padding', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::DIMENSIONS, 'size_units' => [ 'px', 'em', '%' ], 'selectors' => [ '{{WRAPPER}} .eppro-off-canvas-content' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], ] ); $this->add_group_control( \Elementor\Group_Control_Box_Shadow::get_type(), [ 'name' => 'panel_box_shadow', 'selector' => '{{WRAPPER}} .eppro-off-canvas-panel', ] ); $this->end_controls_section(); // Overlay Style $this->start_controls_section( 'section_overlay_style', [ 'label' => __( 'Overlay', 'admore-widgets-suite' ), 'tab' => \Elementor\Controls_Manager::TAB_STYLE, ] ); $this->add_control( 'overlay_color', [ 'label' => __( 'Color', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::COLOR, 'default' => 'rgba(0,0,0,0.5)', 'selectors' => [ '{{WRAPPER}} .eppro-off-canvas-overlay' => 'background-color: {{VALUE}};', ], ] ); $this->end_controls_section(); // Close Button Style $this->start_controls_section( 'section_close_style', [ 'label' => __( 'Close Button', 'admore-widgets-suite' ), 'tab' => \Elementor\Controls_Manager::TAB_STYLE, 'condition' => [ 'close_button' => 'yes', ], ] ); $this->add_responsive_control( 'close_size', [ 'label' => __( 'Icon Size', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::SLIDER, 'size_units' => [ 'px' ], 'range' => [ 'px' => [ 'min' => 10, 'max' => 50, ], ], 'default' => [ 'size' => 20, ], 'selectors' => [ '{{WRAPPER}} .eppro-off-canvas-close' => 'font-size: {{SIZE}}{{UNIT}};', '{{WRAPPER}} .eppro-off-canvas-close i' => 'font-size: {{SIZE}}{{UNIT}}; width: {{SIZE}}{{UNIT}}; height: {{SIZE}}{{UNIT}};', '{{WRAPPER}} .eppro-off-canvas-close svg' => 'width: {{SIZE}}{{UNIT}}; height: {{SIZE}}{{UNIT}};', ], ] ); $this->add_responsive_control( 'close_box_size', [ 'label' => __( 'Button Size', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::SLIDER, 'size_units' => [ 'px' ], 'range' => [ 'px' => [ 'min' => 24, 'max' => 80, ], ], 'selectors' => [ '{{WRAPPER}} .eppro-off-canvas-panel .eppro-off-canvas-close' => 'width: {{SIZE}}{{UNIT}}; height: {{SIZE}}{{UNIT}}; min-width: {{SIZE}}{{UNIT}}; min-height: {{SIZE}}{{UNIT}};', ], ] ); // Colours are passed as CSS variables (see style.css) so they beat // theme button styles and a Normal colour never overrides Hover. $this->start_controls_tabs( 'close_style_tabs' ); $this->start_controls_tab( 'close_normal', [ 'label' => __( 'Normal', 'admore-widgets-suite' ), ] ); $this->add_control( 'close_color', [ 'label' => __( 'Icon Color', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::COLOR, 'selectors' => [ '{{WRAPPER}} .eppro-off-canvas-panel' => '--eppro-oc-close-color: {{VALUE}};', ], ] ); $this->add_control( 'close_bg_color', [ 'label' => __( 'Background Color', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::COLOR, 'selectors' => [ '{{WRAPPER}} .eppro-off-canvas-panel' => '--eppro-oc-close-bg: {{VALUE}};', ], ] ); $this->end_controls_tab(); $this->start_controls_tab( 'close_hover', [ 'label' => __( 'Hover', 'admore-widgets-suite' ), ] ); $this->add_control( 'close_hover_color', [ 'label' => __( 'Icon Color', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::COLOR, 'selectors' => [ '{{WRAPPER}} .eppro-off-canvas-panel' => '--eppro-oc-close-hover-color: {{VALUE}};', ], ] ); $this->add_control( 'close_hover_bg_color', [ 'label' => __( 'Background Color', 'admore-widgets-suite' ), 'type' => \Elementor\Controls_Manager::COLOR, 'selectors' => [ '{{WRAPPER}} .eppro-off-canvas-panel' => '--eppro-oc-close-hover-bg: {{VALUE}};', ], ] ); $this->end_controls_tab(); $this->end_controls_tabs(); $this->end_controls_section(); } protected function render() { $settings = $this->get_settings_for_display(); $widget_id = $this->get_id(); $panel_classes = [ 'eppro-off-canvas-panel', 'eppro-off-canvas-panel--' . $settings['panel_position'], ]; $panel_attrs = [ 'id' => 'eppro-off-canvas-' . $widget_id, 'class' => implode( ' ', $panel_classes ), 'role' => 'dialog', 'aria-modal' => 'true', 'aria-hidden' => 'true', 'tabindex' => '-1', 'data-widget-id' => $widget_id, 'data-position' => $settings['panel_position'], 'data-speed' => absint( $settings['animation_speed'] ?? 300 ) ?: 300, 'data-overlay-close' => $settings['overlay_click_close'] === 'yes' ? 'true' : 'false', 'data-esc-close' => $settings['esc_close'] === 'yes' ? 'true' : 'false', 'data-scroll-lock' => $settings['body_scroll_lock'] === 'yes' ? 'true' : 'false', 'data-auto-open' => $settings['auto_open'] === 'yes' ? 'true' : 'false', // Only set while "Auto Open" is on (conditional control), so default it. 'data-auto-delay' => absint( $settings['auto_open_delay'] ?? 1000 ), ]; $trigger_classes = [ 'eppro-off-canvas-trigger' ]; if ( $settings['trigger_type'] === 'icon' ) { $trigger_classes[] = 'eppro-off-canvas-trigger--icon-only'; } ?>