File: /home/dfwparty/www/wp-content/plugins/ultimate-elementor/modules/sticky-header/sticky-header.php
<?php
/**
* UAEL Sticky Header functionality.
*
* @package UAEL
*/
namespace UltimateElementor\Modules\StickyHeader;
use Elementor\Controls_Manager;
use Elementor\Controls_Stack;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
/**
* Class Sticky_Header
*
* @package UltimateElementor\Modules\StickyHeader
*/
class Sticky_Header {
/**
* Constructor.
*
* @since 1.40.0
*/
public function __construct() {
$this->init_hooks();
}
/**
* Initialize hooks.
*
* @since 1.40.0
*/
private function init_hooks() {
// Ensure settings are passed to frontend.
add_action( 'elementor/frontend/section/before_render', array( $this, 'before_render' ) );
add_action( 'elementor/frontend/container/before_render', array( $this, 'before_render' ) );
}
/**
* Add all controls to the element.
*
* @since 1.40.0
* @param Controls_Stack $element Current element.
*/
public function add_controls( Controls_Stack $element ) {
$this->add_main_controls( $element );
$this->add_visual_effects_controls( $element );
$this->add_border_shadow_controls( $element );
$this->add_behavior_controls( $element );
}
/**
* Add main sticky header controls.
*
* @since 1.40.0
* @param Controls_Stack $element Current element.
*/
private function add_main_controls( Controls_Stack $element ) {
// Enable sticky header.
$element->add_control(
'uae_sticky_header_enable',
array(
'label' => __( 'Enable Sticky Header', 'uael' ),
'type' => Controls_Manager::SWITCHER,
'label_on' => __( 'Yes', 'uael' ),
'label_off' => __( 'No', 'uael' ),
'return_value' => 'yes',
'default' => '',
'frontend_available' => true,
'prefix_class' => 'uae-sticky-header-',
'render_type' => 'none',
)
);
// Device controls.
$element->add_control(
'uae_sticky_devices',
array(
'label' => __( 'Enable On', 'uael' ),
'type' => Controls_Manager::SELECT2,
'multiple' => true,
'label_block' => true,
'default' => array( 'desktop', 'tablet', 'mobile' ),
'options' => array(
'desktop' => __( 'Desktop', 'uael' ),
'tablet' => __( 'Tablet', 'uael' ),
'mobile' => __( 'Mobile', 'uael' ),
),
'condition' => array(
'uae_sticky_header_enable' => 'yes',
),
'frontend_available' => true,
'render_type' => 'none',
)
);
// Scroll distance.
$element->add_responsive_control(
'uae_sticky_scroll_distance',
array(
'label' => __( 'Scroll Distance', 'uael' ),
'type' => Controls_Manager::SLIDER,
'size_units' => array( 'px', '%' ),
'range' => array(
'px' => array(
'min' => 0,
'max' => 500,
),
'%' => array(
'min' => 0,
'max' => 100,
),
),
'default' => array(
'size' => 100,
'unit' => 'px',
),
'condition' => array(
'uae_sticky_header_enable' => 'yes',
),
'frontend_available' => true,
'render_type' => 'none',
)
);
}
/**
* Add visual effects controls.
*
* @since 1.40.0
* @param Controls_Stack $element Current element.
*/
private function add_visual_effects_controls( Controls_Stack $element ) {
// Visual Effects Heading.
$element->add_control(
'uae_sticky_effects_heading',
array(
'label' => __( 'Visual Effects', 'uael' ),
'type' => Controls_Manager::HEADING,
'separator' => 'before',
'condition' => array(
'uae_sticky_header_enable' => 'yes',
),
)
);
// Transparent header.
$element->add_control(
'uae_sticky_transparent_enable',
array(
'label' => __( 'Transparent Header', 'uael' ),
'description' => __( 'Enable transparent header. If no background color is set below, the header will remain transparent when sticky.', 'uael' ),
'type' => Controls_Manager::SWITCHER,
'label_on' => __( 'Yes', 'uael' ),
'label_off' => __( 'No', 'uael' ),
'return_value' => 'yes',
'default' => '',
'frontend_available' => true,
'prefix_class' => 'uae-sticky-transparent-',
'condition' => array(
'uae_sticky_header_enable' => 'yes',
),
)
);
// Transparency level.
$element->add_control(
'uae_sticky_transparency_level',
array(
'label' => __( 'Transparency Level', 'uael' ),
'type' => Controls_Manager::SLIDER,
'size_units' => array( '%' ),
'range' => array(
'%' => array(
'min' => 0,
'max' => 100,
),
),
'default' => array(
'size' => 100,
'unit' => '%',
),
'condition' => array(
'uae_sticky_header_enable' => 'yes',
'uae_sticky_transparent_enable' => 'yes',
),
'frontend_available' => true,
'render_type' => 'none',
)
);
// Background color change.
$element->add_control(
'uae_sticky_background_enable',
array(
'label' => __( 'Background Color', 'uael' ),
'description' => __( 'Set a background color for the sticky header. Leave disabled to maintain transparency when sticky.', 'uael' ),
'type' => Controls_Manager::SWITCHER,
'label_on' => __( 'Yes', 'uael' ),
'label_off' => __( 'No', 'uael' ),
'return_value' => 'yes',
'default' => '',
'frontend_available' => true,
'condition' => array(
'uae_sticky_header_enable' => 'yes',
),
)
);
// Background type.
$element->add_control(
'uae_sticky_background_type',
array(
'label' => __( 'Background Type', 'uael' ),
'type' => Controls_Manager::CHOOSE,
'options' => array(
'solid' => array(
'title' => __( 'Solid', 'uael' ),
'icon' => 'eicon-paint-brush',
),
'gradient' => array(
'title' => __( 'Gradient', 'uael' ),
'icon' => 'eicon-barcode',
),
),
'default' => 'solid',
'condition' => array(
'uae_sticky_header_enable' => 'yes',
'uae_sticky_background_enable' => 'yes',
),
'frontend_available' => true,
'render_type' => 'ui',
)
);
// Solid background color.
$element->add_control(
'uae_sticky_background_color',
array(
'label' => __( 'Color', 'uael' ),
'type' => Controls_Manager::COLOR,
'default' => '#ffffff',
'condition' => array(
'uae_sticky_header_enable' => 'yes',
'uae_sticky_background_enable' => 'yes',
'uae_sticky_background_type' => 'solid',
),
'frontend_available' => true,
'render_type' => 'none',
)
);
// Gradient controls.
$this->add_gradient_controls( $element );
}
/**
* Add gradient controls.
*
* @since 1.40.0
* @param Controls_Stack $element Current element.
*/
private function add_gradient_controls( Controls_Stack $element ) {
// Gradient color 1.
$element->add_control(
'uae_sticky_gradient_color_1',
array(
'label' => __( 'Color 1', 'uael' ),
'type' => Controls_Manager::COLOR,
'default' => '#ffffff',
'condition' => array(
'uae_sticky_header_enable' => 'yes',
'uae_sticky_background_enable' => 'yes',
'uae_sticky_background_type' => 'gradient',
),
'frontend_available' => true,
'render_type' => 'none',
)
);
// Gradient location 1.
$element->add_control(
'uae_sticky_gradient_location_1',
array(
'label' => __( 'Location', 'uael' ),
'type' => Controls_Manager::SLIDER,
'size_units' => array( '%' ),
'default' => array(
'size' => 0,
'unit' => '%',
),
'condition' => array(
'uae_sticky_header_enable' => 'yes',
'uae_sticky_background_enable' => 'yes',
'uae_sticky_background_type' => 'gradient',
),
'frontend_available' => true,
)
);
// Gradient color 2.
$element->add_control(
'uae_sticky_gradient_color_2',
array(
'label' => __( 'Color 2', 'uael' ),
'type' => Controls_Manager::COLOR,
'default' => '#f0f0f0',
'condition' => array(
'uae_sticky_header_enable' => 'yes',
'uae_sticky_background_enable' => 'yes',
'uae_sticky_background_type' => 'gradient',
),
'frontend_available' => true,
'render_type' => 'none',
)
);
// Gradient location 2.
$element->add_control(
'uae_sticky_gradient_location_2',
array(
'label' => __( 'Location', 'uael' ),
'type' => Controls_Manager::SLIDER,
'size_units' => array( '%' ),
'default' => array(
'size' => 100,
'unit' => '%',
),
'condition' => array(
'uae_sticky_header_enable' => 'yes',
'uae_sticky_background_enable' => 'yes',
'uae_sticky_background_type' => 'gradient',
),
'frontend_available' => true,
)
);
// Gradient type.
$element->add_control(
'uae_sticky_gradient_type',
array(
'label' => __( 'Gradient Type', 'uael' ),
'type' => Controls_Manager::SELECT,
'options' => array(
'linear' => __( 'Linear', 'uael' ),
'radial' => __( 'Radial', 'uael' ),
),
'default' => 'linear',
'condition' => array(
'uae_sticky_header_enable' => 'yes',
'uae_sticky_background_enable' => 'yes',
'uae_sticky_background_type' => 'gradient',
),
'frontend_available' => true,
)
);
// Gradient angle.
$element->add_control(
'uae_sticky_gradient_angle',
array(
'label' => __( 'Angle', 'uael' ),
'type' => Controls_Manager::SLIDER,
'size_units' => array( 'deg' ),
'default' => array(
'size' => 180,
'unit' => 'deg',
),
'range' => array(
'deg' => array(
'step' => 10,
),
),
'condition' => array(
'uae_sticky_header_enable' => 'yes',
'uae_sticky_background_enable' => 'yes',
'uae_sticky_background_type' => 'gradient',
'uae_sticky_gradient_type' => 'linear',
),
'frontend_available' => true,
)
);
}
/**
* Add border and shadow controls.
*
* @since 1.40.0
* @param Controls_Stack $element Current element.
*/
private function add_border_shadow_controls( Controls_Stack $element ) {
// Border & Shadow Heading.
$element->add_control(
'uae_sticky_border_shadow_heading',
array(
'label' => __( 'Border & Shadow', 'uael' ),
'type' => Controls_Manager::HEADING,
'separator' => 'before',
'condition' => array(
'uae_sticky_header_enable' => 'yes',
),
)
);
// Bottom border.
$element->add_control(
'uae_sticky_border_enable',
array(
'label' => __( 'Bottom Border', 'uael' ),
'type' => Controls_Manager::SWITCHER,
'label_on' => __( 'Yes', 'uael' ),
'label_off' => __( 'No', 'uael' ),
'return_value' => 'yes',
'default' => '',
'frontend_available' => true,
'condition' => array(
'uae_sticky_header_enable' => 'yes',
),
)
);
// Border color.
$element->add_control(
'uae_sticky_border_color',
array(
'label' => __( 'Border Color', 'uael' ),
'type' => Controls_Manager::COLOR,
'default' => '#e0e0e0',
'condition' => array(
'uae_sticky_header_enable' => 'yes',
'uae_sticky_border_enable' => 'yes',
),
'frontend_available' => true,
'render_type' => 'none',
)
);
// Border thickness.
$element->add_control(
'uae_sticky_border_thickness',
array(
'label' => __( 'Border Thickness (px)', 'uael' ),
'type' => Controls_Manager::SLIDER,
'size_units' => array( 'px' ),
'range' => array(
'px' => array(
'min' => 0,
'max' => 10,
),
),
'default' => array(
'size' => 1,
'unit' => 'px',
),
'condition' => array(
'uae_sticky_header_enable' => 'yes',
'uae_sticky_border_enable' => 'yes',
),
'frontend_available' => true,
)
);
// Drop shadow.
$element->add_control(
'uae_sticky_shadow_enable',
array(
'label' => __( 'Drop Shadow', 'uael' ),
'type' => Controls_Manager::SWITCHER,
'label_on' => __( 'Yes', 'uael' ),
'label_off' => __( 'No', 'uael' ),
'return_value' => 'yes',
'default' => '',
'frontend_available' => true,
'condition' => array(
'uae_sticky_header_enable' => 'yes',
),
)
);
// Shadow controls.
$this->add_shadow_controls( $element );
}
/**
* Add shadow controls.
*
* @since 1.40.0
* @param Controls_Stack $element Current element.
*/
private function add_shadow_controls( Controls_Stack $element ) {
// Shadow color.
$element->add_control(
'uae_sticky_shadow_color',
array(
'label' => __( 'Shadow Color', 'uael' ),
'type' => Controls_Manager::COLOR,
'default' => 'rgba(0, 0, 0, 0.1)',
'condition' => array(
'uae_sticky_header_enable' => 'yes',
'uae_sticky_shadow_enable' => 'yes',
),
'frontend_available' => true,
'render_type' => 'none',
)
);
// Shadow vertical offset.
$element->add_control(
'uae_sticky_shadow_vertical',
array(
'label' => __( 'Vertical Offset', 'uael' ),
'type' => Controls_Manager::SLIDER,
'size_units' => array( 'px' ),
'range' => array(
'px' => array(
'min' => -20,
'max' => 20,
),
),
'default' => array(
'size' => 0,
'unit' => 'px',
),
'condition' => array(
'uae_sticky_header_enable' => 'yes',
'uae_sticky_shadow_enable' => 'yes',
),
'frontend_available' => true,
)
);
// Shadow blur.
$element->add_control(
'uae_sticky_shadow_blur',
array(
'label' => __( 'Blur Radius', 'uael' ),
'type' => Controls_Manager::SLIDER,
'size_units' => array( 'px' ),
'range' => array(
'px' => array(
'min' => 0,
'max' => 50,
),
),
'default' => array(
'size' => 10,
'unit' => 'px',
),
'condition' => array(
'uae_sticky_header_enable' => 'yes',
'uae_sticky_shadow_enable' => 'yes',
),
'frontend_available' => true,
)
);
// Shadow spread.
$element->add_control(
'uae_sticky_shadow_spread',
array(
'label' => __( 'Spread', 'uael' ),
'type' => Controls_Manager::SLIDER,
'size_units' => array( 'px' ),
'range' => array(
'px' => array(
'min' => -20,
'max' => 20,
),
),
'default' => array(
'size' => 0,
'unit' => 'px',
),
'condition' => array(
'uae_sticky_header_enable' => 'yes',
'uae_sticky_shadow_enable' => 'yes',
),
'frontend_available' => true,
)
);
}
/**
* Add behavior controls.
*
* @since 1.40.0
* @param Controls_Stack $element Current element.
*/
private function add_behavior_controls( Controls_Stack $element ) {
// Advanced Behavior Heading.
$element->add_control(
'uae_sticky_behavior_heading',
array(
'label' => __( 'Advanced Behavior', 'uael' ),
'type' => Controls_Manager::HEADING,
'separator' => 'before',
'condition' => array(
'uae_sticky_header_enable' => 'yes',
),
)
);
// Hide on scroll down.
$element->add_control(
'uae_sticky_hide_on_scroll_down',
array(
'label' => __( 'Hide on Scroll Down', 'uael' ),
'type' => Controls_Manager::SWITCHER,
'label_on' => __( 'Yes', 'uael' ),
'label_off' => __( 'No', 'uael' ),
'return_value' => 'yes',
'default' => '',
'frontend_available' => true,
'condition' => array(
'uae_sticky_header_enable' => 'yes',
),
)
);
// Hide scroll threshold.
$element->add_responsive_control(
'uae_sticky_hide_threshold',
array(
'label' => __( 'Hide Threshold', 'uael' ),
'type' => Controls_Manager::SLIDER,
'size_units' => array( 'px', '%' ),
'range' => array(
'px' => array(
'min' => 0,
'max' => 1000,
),
'%' => array(
'min' => 0,
'max' => 100,
),
),
'default' => array(
'size' => 10,
'unit' => '%',
),
'condition' => array(
'uae_sticky_header_enable' => 'yes',
'uae_sticky_hide_on_scroll_down' => 'yes',
),
'frontend_available' => true,
)
);
// Notice about scroll behavior.
$element->add_control(
'uae_sticky_scroll_notice',
array(
'type' => Controls_Manager::RAW_HTML,
'raw' => sprintf(
'<div class="elementor-panel-alert elementor-panel-alert-warning">%s</div>',
__( 'The header will hide when scrolling down and show when scrolling up.', 'uael' )
),
'condition' => array(
'uae_sticky_header_enable' => 'yes',
'uae_sticky_hide_on_scroll_down' => 'yes',
),
)
);
}
/**
* Before render.
*
* @since 1.40.0
* @param \Elementor\Element_Base $element The element.
*/
public function before_render( $element ) {
if ( ! $element->get_settings( 'uae_sticky_header_enable' ) ) {
return;
}
// Get all sticky settings.
$settings = array(
'uae_sticky_header_enable' => $element->get_settings( 'uae_sticky_header_enable' ),
'uae_sticky_devices' => $element->get_settings( 'uae_sticky_devices' ),
'uae_sticky_scroll_distance' => $element->get_settings( 'uae_sticky_scroll_distance' ),
'uae_sticky_scroll_distance_tablet' => $element->get_settings( 'uae_sticky_scroll_distance_tablet' ),
'uae_sticky_scroll_distance_mobile' => $element->get_settings( 'uae_sticky_scroll_distance_mobile' ),
'uae_sticky_transparent_enable' => $element->get_settings( 'uae_sticky_transparent_enable' ),
'uae_sticky_transparency_level' => $element->get_settings( 'uae_sticky_transparency_level' ),
'uae_sticky_background_enable' => $element->get_settings( 'uae_sticky_background_enable' ),
'uae_sticky_background_type' => $element->get_settings( 'uae_sticky_background_type' ),
'uae_sticky_background_color' => $element->get_settings( 'uae_sticky_background_color' ),
'uae_sticky_gradient_color_1' => $element->get_settings( 'uae_sticky_gradient_color_1' ),
'uae_sticky_gradient_location_1' => $element->get_settings( 'uae_sticky_gradient_location_1' ),
'uae_sticky_gradient_color_2' => $element->get_settings( 'uae_sticky_gradient_color_2' ),
'uae_sticky_gradient_location_2' => $element->get_settings( 'uae_sticky_gradient_location_2' ),
'uae_sticky_gradient_type' => $element->get_settings( 'uae_sticky_gradient_type' ),
'uae_sticky_gradient_angle' => $element->get_settings( 'uae_sticky_gradient_angle' ),
'uae_sticky_border_enable' => $element->get_settings( 'uae_sticky_border_enable' ),
'uae_sticky_border_color' => $element->get_settings( 'uae_sticky_border_color' ),
'uae_sticky_border_thickness' => $element->get_settings( 'uae_sticky_border_thickness' ),
'uae_sticky_shadow_enable' => $element->get_settings( 'uae_sticky_shadow_enable' ),
'uae_sticky_shadow_color' => $element->get_settings( 'uae_sticky_shadow_color' ),
'uae_sticky_shadow_vertical' => $element->get_settings( 'uae_sticky_shadow_vertical' ),
'uae_sticky_shadow_blur' => $element->get_settings( 'uae_sticky_shadow_blur' ),
'uae_sticky_shadow_spread' => $element->get_settings( 'uae_sticky_shadow_spread' ),
'uae_sticky_hide_on_scroll_down' => $element->get_settings( 'uae_sticky_hide_on_scroll_down' ),
'uae_sticky_hide_threshold' => $element->get_settings( 'uae_sticky_hide_threshold' ),
'uae_sticky_hide_threshold_tablet' => $element->get_settings( 'uae_sticky_hide_threshold_tablet' ),
'uae_sticky_hide_threshold_mobile' => $element->get_settings( 'uae_sticky_hide_threshold_mobile' ),
);
// Add settings as data attribute.
$element->add_render_attribute( '_wrapper', 'data-uae-sticky-settings', wp_json_encode( $settings ) );
}
}