333 lines
8.6 KiB
PHP
333 lines
8.6 KiB
PHP
<?php
|
|
/**
|
|
* Jet_Blocks_Ext_Elements
|
|
*
|
|
* @package package_name
|
|
* @author Cherry Team
|
|
* @license GPL-2.0+
|
|
*/
|
|
|
|
// If this file is called directly, abort.
|
|
if ( ! defined( 'WPINC' ) ) {
|
|
die;
|
|
}
|
|
|
|
if ( ! class_exists( 'Jet_Blocks_Ext_Elements' ) ) {
|
|
|
|
/**
|
|
* Define Jet_Blocks_Ext_Elements class
|
|
*/
|
|
class Jet_Blocks_Ext_Elements {
|
|
|
|
/**
|
|
* A reference to an instance of this class.
|
|
*
|
|
* @since 1.0.0
|
|
* @var object
|
|
*/
|
|
private static $instance = null;
|
|
|
|
/**
|
|
* Has sticky section.
|
|
*
|
|
* @var bool
|
|
*/
|
|
private $has_sticky = false;
|
|
|
|
/**
|
|
* Initialize hooks
|
|
*
|
|
* @return void
|
|
*/
|
|
public function init() {
|
|
$avaliable_extensions = jet_blocks_settings()->get( 'avaliable_extensions', jet_blocks_settings()->default_avaliable_ext );
|
|
|
|
if ( isset( $avaliable_extensions['column_order'] ) && 'true' === $avaliable_extensions['column_order'] ) {
|
|
add_action( 'elementor/element/column/layout/before_section_end', array( $this, 'add_column_order_control' ), 10, 2 );
|
|
}
|
|
|
|
if ( isset( $avaliable_extensions['sticky_section'] ) && 'true' === $avaliable_extensions['sticky_section'] ) {
|
|
|
|
add_action( 'elementor/element/section/section_advanced/after_section_end', array( $this, 'add_section_sticky_controls' ), 10, 2 );
|
|
add_action( 'elementor/frontend/element/before_render', array( $this, 'section_before_render' ) );
|
|
add_action( 'elementor/frontend/section/before_render', array( $this, 'section_before_render' ) ); // for compatibility with Elementor 2.1.0
|
|
add_action( 'elementor/frontend/before_enqueue_scripts', array( $this, 'enqueue_scripts' ), 9 );
|
|
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add order control to column settings.
|
|
*
|
|
* @param object $element Element instance.
|
|
* @param array $args Element arguments.
|
|
*/
|
|
public function add_column_order_control( $element, $args ) {
|
|
$element->add_responsive_control(
|
|
'column_order',
|
|
array(
|
|
'label' => esc_html__( 'Column Order', 'jet-blocks' ),
|
|
'type' => Elementor\Controls_Manager::NUMBER,
|
|
'min' => 0,
|
|
'max' => 100,
|
|
'selectors' => array(
|
|
'{{WRAPPER}}.elementor-column' => 'order: {{VALUE}}',
|
|
),
|
|
),
|
|
array(
|
|
'position' => array(
|
|
'at' => 'before',
|
|
'of' => 'content_position',
|
|
),
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Add sticky controls to section settings.
|
|
*
|
|
* @param object $element Element instance.
|
|
* @param array $args Element arguments.
|
|
*/
|
|
public function add_section_sticky_controls( $element, $args ) {
|
|
$element->start_controls_section(
|
|
'jet_sticky_section_settings',
|
|
array(
|
|
'label' => esc_html__( 'Jet Sticky', 'jet-blocks' ),
|
|
'tab' => Elementor\Controls_Manager::TAB_ADVANCED,
|
|
)
|
|
);
|
|
|
|
$element->add_control(
|
|
'jet_sticky_section',
|
|
array(
|
|
'label' => esc_html__( 'Sticky Section', 'jet-blocks' ),
|
|
'type' => Elementor\Controls_Manager::SWITCHER,
|
|
'default' => '',
|
|
'frontend_available' => true,
|
|
)
|
|
);
|
|
|
|
$element->add_control(
|
|
'jet_sticky_section_visibility',
|
|
array(
|
|
'label' => esc_html__( 'Sticky Section Visibility', 'jet-blocks' ),
|
|
'type' => Elementor\Controls_Manager::SELECT2,
|
|
'multiple' => true,
|
|
'label_block' => true,
|
|
'default' => array( 'desktop', 'tablet', 'mobile' ),
|
|
'options' => array(
|
|
'desktop' => esc_html__( 'Desktop', 'jet-blocks' ),
|
|
'tablet' => esc_html__( 'Tablet', 'jet-blocks' ),
|
|
'mobile' => esc_html__( 'Mobile', 'jet-blocks' ),
|
|
),
|
|
'condition' => array(
|
|
'jet_sticky_section' => 'yes',
|
|
),
|
|
'frontend_available' => true,
|
|
)
|
|
);
|
|
|
|
$element->add_control(
|
|
'jet_sticky_section_z_index',
|
|
array(
|
|
'label' => esc_html__( 'Z-index', 'jet-blocks' ),
|
|
'type' => Elementor\Controls_Manager::NUMBER,
|
|
'placeholder' => 1100,
|
|
'min' => 1,
|
|
'max' => 10000,
|
|
'step' => 1,
|
|
'selectors' => array(
|
|
'{{WRAPPER}}.jet-sticky-section--stuck' => 'z-index: {{VALUE}};',
|
|
),
|
|
'condition' => array(
|
|
'jet_sticky_section' => 'yes',
|
|
),
|
|
)
|
|
);
|
|
|
|
$element->add_control(
|
|
'jet_sticky_section_max_width',
|
|
array(
|
|
'label' => esc_html__( 'Max Width (px)', 'jet-blocks' ),
|
|
'type' => Elementor\Controls_Manager::SLIDER,
|
|
'range' => array(
|
|
'px' => array(
|
|
'min' => 500,
|
|
'max' => 2000,
|
|
),
|
|
),
|
|
'selectors' => array(
|
|
'{{WRAPPER}}.jet-sticky-section--stuck' => 'max-width: {{SIZE}}{{UNIT}};',
|
|
),
|
|
'condition' => array(
|
|
'jet_sticky_section' => 'yes',
|
|
),
|
|
)
|
|
);
|
|
|
|
$element->add_responsive_control(
|
|
'jet_sticky_section_style_heading',
|
|
array(
|
|
'label' => esc_html__( 'Sticky Section Style', 'jet-blocks' ),
|
|
'type' => Elementor\Controls_Manager::HEADING,
|
|
'separator' => 'before',
|
|
'condition' => array(
|
|
'jet_sticky_section' => 'yes',
|
|
),
|
|
)
|
|
);
|
|
|
|
$element->add_responsive_control(
|
|
'jet_sticky_section_margin',
|
|
array(
|
|
'label' => esc_html__( 'Margin', 'jet-blocks' ),
|
|
'type' => Elementor\Controls_Manager::DIMENSIONS,
|
|
'size_units' => array( 'px', '%' ),
|
|
'allowed_dimensions' => 'vertical',
|
|
'placeholder' => array(
|
|
'top' => '',
|
|
'right' => 'auto',
|
|
'bottom' => '',
|
|
'left' => 'auto',
|
|
),
|
|
'selectors' => array(
|
|
'{{WRAPPER}}.jet-sticky-section--stuck' => 'margin-top: {{TOP}}{{UNIT}}; margin-bottom: {{BOTTOM}}{{UNIT}};',
|
|
),
|
|
'condition' => array(
|
|
'jet_sticky_section' => 'yes',
|
|
),
|
|
)
|
|
);
|
|
|
|
$element->add_responsive_control(
|
|
'jet_sticky_section_padding',
|
|
array(
|
|
'label' => esc_html__( 'Padding', 'jet-blocks' ),
|
|
'type' => Elementor\Controls_Manager::DIMENSIONS,
|
|
'size_units' => array( 'px', 'em', '%' ),
|
|
'selectors' => array(
|
|
'{{WRAPPER}}.jet-sticky-section--stuck' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
|
|
),
|
|
'condition' => array(
|
|
'jet_sticky_section' => 'yes',
|
|
),
|
|
)
|
|
);
|
|
|
|
$element->add_group_control(
|
|
Elementor\Group_Control_Background::get_type(),
|
|
array(
|
|
'name' => 'jet_sticky_section_background',
|
|
'selector' => '{{WRAPPER}}.jet-sticky-section--stuck',
|
|
'condition' => array(
|
|
'jet_sticky_section' => 'yes',
|
|
),
|
|
)
|
|
);
|
|
|
|
$element->add_group_control(
|
|
Elementor\Group_Control_Box_Shadow::get_type(),
|
|
array(
|
|
'name' => 'jet_sticky_section_box_shadow',
|
|
'selector' => '{{WRAPPER}}.jet-sticky-section--stuck',
|
|
'condition' => array(
|
|
'jet_sticky_section' => 'yes',
|
|
),
|
|
)
|
|
);
|
|
|
|
$element->add_control(
|
|
'jet_sticky_section_transition',
|
|
array(
|
|
'label' => esc_html__( 'Transition Duration', 'jet-blocks' ),
|
|
'type' => Elementor\Controls_Manager::SLIDER,
|
|
'default' => array(
|
|
'size' => 0.1,
|
|
),
|
|
'range' => array(
|
|
'px' => array(
|
|
'max' => 3,
|
|
'step' => 0.1,
|
|
),
|
|
),
|
|
'selectors' => array(
|
|
'{{WRAPPER}}.jet-sticky-section--stuck.jet-sticky-transition-in, {{WRAPPER}}.jet-sticky-section--stuck.jet-sticky-transition-out' => 'transition: margin {{SIZE}}s, padding {{SIZE}}s, background {{SIZE}}s, box-shadow {{SIZE}}s',
|
|
),
|
|
'condition' => array(
|
|
'jet_sticky_section' => 'yes',
|
|
),
|
|
)
|
|
);
|
|
|
|
$element->end_controls_section();
|
|
}
|
|
|
|
/**
|
|
* Elementor before section render callback.
|
|
*
|
|
* @param object $element Section instance.
|
|
*/
|
|
public function section_before_render( $element ) {
|
|
if ( 'section' !== $element->get_name() ) {
|
|
return;
|
|
}
|
|
|
|
if ( 'yes' === $element->get_settings( 'jet_sticky_section' ) ) {
|
|
$element->add_render_attribute( '_wrapper', array(
|
|
'class' => 'jet-sticky-section',
|
|
) );
|
|
|
|
$this->has_sticky = true;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Enqueue scripts.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function enqueue_scripts() {
|
|
|
|
if ( $this->has_sticky ) {
|
|
|
|
$min_suffix = jet_blocks_tools()->is_script_debug() ? '' : '.min';
|
|
|
|
wp_enqueue_script(
|
|
'jsticky',
|
|
jet_blocks()->plugin_url( 'assets/js/lib/jsticky/jquery.jsticky' . $min_suffix . '.js' ),
|
|
array( 'jquery' ),
|
|
'1.1.0',
|
|
true
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns the instance.
|
|
*
|
|
* @since 1.0.0
|
|
* @return object
|
|
*/
|
|
public static function get_instance() {
|
|
|
|
// If the single instance hasn't been set, set it now.
|
|
if ( null == self::$instance ) {
|
|
self::$instance = new self;
|
|
}
|
|
|
|
return self::$instance;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* Returns instance of Jet_Blocks_Ext_Elements
|
|
*
|
|
* @return object
|
|
*/
|
|
function jet_blocks_ext_elements() {
|
|
return Jet_Blocks_Ext_Elements::get_instance();
|
|
}
|