Uname: Linux webm012.cluster130.gra.hosting.ovh.net 5.15.167-ovh-vps-grsec-zfs-classid #1 SMP Tue Sep 17 08:14:20 UTC 2024 x86_64
Software: Apache
PHP version: 8.0.30 [ PHP INFO ] PHP os: Linux
Server Ip: 145.239.37.162
Your Ip: 216.73.216.190
User: dreampi (1009562) | Group: users (100)
Safe Mode: OFF
Disable Function:
_dyuweyrj4,_dyuweyrj4r,dl

name : elementor-class-widget.php
<?php
/**
 * Plugin support: Elementor ( Define class to create our modules (widgets) )
 *
 * @package ThemeREX Addons
 * @since v1.0
 */

// Don't load directly
if ( ! defined( 'TRX_ADDONS_VERSION' ) ) {
	exit;
}

if ( class_exists('\Elementor\Widget_Base') && ! class_exists('TRX_Addons_Elementor_Widget') ) {

	/**
	 * Define a base class (abstract) for our shortcodes and widgets.
	 * This class will be extended by the class for each shortcode/widget.
	 * This class extends Elementor's Widget_Base class.
	 */
	abstract class TRX_Addons_Elementor_Widget extends \Elementor\Widget_Base {

		/**
		 * List of shortcodes params, that must be plain and get its value from the elementor's arrays
		 * 'size', 'url', etc.
		 * 
		 * @var array $plain_params  List of params, that must be plain.
		 * 							 Format: 'param_name' => "key from the elementor's array".
		 * 							 Example: 'link' => 'url', 'image' => 'url',
		 * 									  'columns' => 'size', 'count' => 'size', 'offset' => 'size', etc.
		 *
		 * @access private
		 */
		private $plain_params = array(
			'url' => 'url',
			'link' => 'url',
			'image' => 'url',
			'bg_image' => 'url',
			'link_image' => 'url',					
			'columns' => 'size',
			'columns_widescreen' => 'size',
			'columns_desktop' => 'size',
			'columns_laptop' => 'size',
			'columns_tablet_extra' => 'size',
			'columns_tablet' => 'size',
			'columns_mobile_extra' => 'size',
			'columns_mobile' => 'size',
			'count' => 'size',
			'offset' => 'size',
			'slides_space' => 'size',
			'gradient_direction' => 'size',
			'gradient_direction2' => 'size',
			'typed_speed' => 'size',
			'typed_delay' => 'size',
		);
		
		/**
		 * Set a new list of shortcodes params, that must be plain and get its value from the elementor's arrays
		 * 'size', 'url', etc.
		 * Format: 'param_name' => "key from the elementor's array".
		 * Example: 'link' => 'url', 'image' => 'url', 'columns' => 'size', 'count' => 'size', 'offset' => 'size', etc.
		 *
		 * @access protected
		 * 
		 * @param array $list  List of params, that must be plain.
		 */
		protected function set_plain_params( $list ) {
			$this->plain_params = $list;
		}
		
		/**
		 * Add new params to the list of shortcodes params, that must be plain and get its value from the elementor's arrays
		 * 'size', 'url', etc.
		 * Format: 'param_name' => "key from the elementor's array".
		 * Example: 'link' => 'url', 'image' => 'url', 'columns' => 'size', 'count' => 'size', 'offset' => 'size', etc.
		 *
		 * @access public
		 * 
		 * @param array $list  List of params, that must be plain.
		 */
		public function add_plain_params( $list ) {
			$this->plain_params = array_merge( $this->plain_params, $list );
		}

		/**
		 * Return string with a default subtitle
		 *
		 * @access protected
		 * 
		 * @return string Default subtitle
		 */
		protected function get_default_subtitle() {
			return __('Subtitle', 'trx_addons');
		}

		/**
		 * Return string with a default description
		 *
		 * @access protected
		 * 
		 * @return string Default description
		 */
		protected function get_default_description() {
			return __('Some description text for this item', 'trx_addons');
		}

		/**
		 * Retrieve the list of scripts the widget depended on.
		 *
		 * Used to set scripts dependencies required to run the widget.
		 *
		 * @since 1.6.41
		 *
		 * @access public
		 *
		 * @return array Widget scripts dependencies.
		 */
		public function get_script_depends() {
			return array( 'trx_addons-elementor-preview' );
		}
		
		/**
		 * Get all elements from specified post from the Elementor's array in the post meta '_elementor_data'
		 *
		 * @access protected
		 * 
		 * @param int $post_id  Post ID
		 * 
		 * @return array  List of elements from the Elementor's array in the post meta '_elementor_data'
		 */
		protected function get_post_elements( $post_id = 0 ) {
			$meta = array();
			if ( $post_id == 0 ) {
				if ( trx_addons_get_value_gp( 'action' ) == 'elementor' ) {
					$post_id = trx_addons_get_value_gp( 'post' );
				} else if ( trx_addons_get_value_gp( 'action' ) == 'elementor_ajax' ) {
					$post_id = trx_addons_get_value_gp( 'editor_post_id' );
				}
			}
			if ( $post_id > 0 ) {
				$meta = get_post_meta( $post_id, '_elementor_data', true );
				if ( substr( $meta, 0, 1 ) == '[' ) {
					$meta = json_decode( $meta, true );
				}
			}
			return $meta;
		}
		
		/**
		 * Get a shortcode parameters from the current post or from the specified post meta (2-nd parameter)
		 *
		 * @access protected
		 * 
		 * @param string $sc   Shortcode name
		 * @param array $meta  List of elements from the Elementor's array in the post meta '_elementor_data'
		 * 
		 * @return array       List of shortcode parameters
		 */
		protected function get_sc_params( $sc = '', $meta = false ) {
			if ( $meta === false ) {
				$meta = $this->get_post_elements();
			}
			if ( empty( $sc ) ) {
				$sc = $this->get_name();
			}
			$params = false;
			if ( is_array( $meta ) ) {
				foreach( $meta as $v ) {
					if ( ! empty( $v['widgetType'] ) && $v['widgetType'] == $sc ) {
						$params = $v['settings'];
						break;
					} else if ( ! empty( $v['elements'] ) && count( $v['elements'] ) > 0 ) {
						$params = $this->get_sc_params( $sc, $v['elements'] );
						if ( $params !== false ) {
							break;
						}
					}
				}
			}
			return $params;
		}

		/**
		 * Return a shortcode's name
		 *
		 * @access public
		 * 
		 * @return string  Shortcode's name
		 */
		public function get_sc_name() {
			return $this->get_name();
		}

		/**
		 * Return a shortcode's function name by the shortcode's name
		 *
		 * @access public
		 * 
		 * @return string  Shortcode's function name
		 */
		public function get_sc_function() {
			return sprintf( "trx_addons_%s", str_replace( array( 'trx_sc_', 'trx_widget_' ), array( 'sc_', 'sc_widget_' ), $this->get_sc_name() ) );
		}

		
		// ADD CONTROLS FOR COMMON PARAMETERS
		// Attention! You can use next tabs to create sections inside:
		// TAB_CONTENT | TAB_STYLE | TAB_ADVANCED | TAB_RESPONSIVE | TAB_LAYOUT | TAB_SETTINGS
		//------------------------------------------------------------

		/**
		 * Add common groups of controls, like 'id', 'title', 'query', 'slider', etc.
		 * to the our shortcode's settings for Elementor
		 * 
		 * @access protected
		 * 
		 * @param array $group       Group of parameters
		 * @param array $params      List of parameters
		 * @param array $add_params  List of additional parameters. Used to add/remove/change some parameters from the list $params
		 */
		protected function add_common_controls( $group, $params, $add_params ) {
			if ( ! empty( $group['label'] ) ) {
				$this->start_controls_section( 'section_' . $group['section'] . '_params', array(
					'label' => $group['label'],
					'tab' => empty( $group['tab'] ) 
								? \Elementor\Controls_Manager::TAB_CONTENT 
								: $group['tab']
				) );
			}
			foreach ( $params as $param ) {
				if ( isset( $add_params[ $param['name'] ] ) ) {
					if ( empty( $add_params[ $param['name'] ] ) ) {
						continue;
					} else {
						$param = array_merge( $param, $add_params[ $param['name'] ] );
					}
					unset( $add_params[ $param['name'] ] );
				}
				if ( ! empty( $param['responsive'] ) ) {
					$this->add_responsive_control( $param['name'], $param );
				} else if ( ! empty( $param['group'] ) ) {
					$this->add_group_control( $param['group'], $param );
				} else {
					$this->add_control( $param['name'], $param );
				}
			}
			if ( count( $add_params ) > 0 ) {
				foreach ( $add_params as $k => $v ) {
					if ( ! empty( $v ) && is_array( $v ) ) {
						if ( ! empty( $v['responsive'] ) ) {
							$this->add_responsive_control( $k, $v );
						} else if ( ! empty( $param['group'] ) ) {
							$this->add_group_control( $param['group'], $param );
						} else {
							$this->add_control( $k, $v );
						}
					}
				}
			}
			if ( ! empty( $group['label'] ) ) {
				$this->end_controls_section();
			}
		}



		// Icon selector
		//------------------------------------------------------------
		
		/**
		 * Return 'icon' parameters for the control with icons selector
		 *
		 * @access protected
		 * 
		 * @param bool   $only_socials  If true - return only socials icons
		 * @param string $style         Icon's style: images | icons | svg
		 * 
		 * @return array  List of parameters
		 */
		protected function get_icon_param( $only_socials = false, $style = '' ) {
			return trx_addons_get_icon_param( 'icon', $only_socials, $style );
		}

		/**
		 * Create a control with icons selector
		 *
		 * @access protected
		 * 
		 * @param string|boolean $group  Name of the group. If false - use 'Icon' as a group name
		 * @param array  $add_params  List of additional parameters. Used to add/remove/change some parameters from the list $params
		 * @param string $style       Icon's style: images | icons | svg
		 */
		protected function add_icon_param( $group = '', $add_params = array(), $style = '' ) {
			$this->add_common_controls(
				array(
					'label' => $group === false ? __('Icon', 'trx_addons') : $group,
					'section' => 'icon'
				),
				$this->get_icon_param( ! empty( $add_params['only_socials'] ), $style ),
				$add_params
			);
		}


		// Slider parameters
		//------------------------------------------------------------

		/**
		 * Return a group of 'slider' parameters for some shortcodes, like 'blogger', 'services', etc.
		 *
		 * @access protected
		 * 
		 * @trigger trx_addons_filter_elementor_add_slider_param
		 * 
		 * @return array  List of parameters
		 */
		protected function get_slider_param() {

			// Detect edit mode
			$is_edit_mode = trx_addons_elm_is_edit_mode();

			$params = array(
				array(
					'name' => 'slider',
					'type' => \Elementor\Controls_Manager::SWITCHER,
					'label' => __('Slider', 'trx_addons'),
					'label_off' => __( 'Off', 'trx_addons' ),
					'label_on' => __( 'On', 'trx_addons' ),
					'return_value' => '1'
				),

				array(
					'name' => 'slider_effect',
					'type' => \Elementor\Controls_Manager::SELECT,
					'label' => __( 'Effect', 'trx_addons' ),
					'label_block' => false,
					'options' => ! $is_edit_mode ? array() : trx_addons_get_list_sc_slider_effects(),
					'default' => 'slide',
					'condition' => array(
						'slider' => '1'
					)
				),
				array(
					'name' => 'slides_space',
					'type' => \Elementor\Controls_Manager::SLIDER,
					'label' => __('Space', 'trx_addons'),
					"description" => wp_kses_data( __('Space between slides', 'trx_addons') ),
					'condition' => array(
						'slider' => '1',
					),
					'default' => array(
						'size' => 0
					),
					'range' => array(
						'px' => array(
							'min' => 0,
							'max' => 100
						)
					)
				),
				array(
					'name' => 'slider_controls',
					'type' => \Elementor\Controls_Manager::SELECT,
					'label' => __( 'Slider controls', 'trx_addons' ),
					'label_block' => false,
					'options' => ! $is_edit_mode ? array() : trx_addons_get_list_sc_slider_controls(),
					'condition' => array(
						'slider' => '1',
					),
					'default' => 'none',
				),
				array(
					'name' => 'slider_pagination',
					'type' => \Elementor\Controls_Manager::SELECT,
					'label' => __( 'Slider pagination', 'trx_addons' ),
					'label_block' => false,
					'options' => ! $is_edit_mode ? array() : trx_addons_get_list_sc_slider_paginations(),
					'condition' => array(
						'slider' => '1'
					),
					'default' => 'none',
				),
				array(
					'name' => 'slider_pagination_type',
					'type' => \Elementor\Controls_Manager::SELECT,
					'label' => __( 'Slider pagination type', 'trx_addons' ),
					'label_block' => false,
					'options' => ! $is_edit_mode ? array() : trx_addons_get_list_sc_slider_paginations_types(),
					'condition' => array(
						'slider' => '1',
						'slider_pagination!' => 'none'
					),
					'default' => 'bullets',
				),
				array(
					'name' => 'slides_centered',
					'type' => \Elementor\Controls_Manager::SWITCHER,
					'label' => __('Slides centered', 'trx_addons'),
					'label_off' => __( 'Off', 'trx_addons' ),
					'label_on' => __( 'On', 'trx_addons' ),
					'return_value' => '1',
					'condition' => array(
						'slider' => '1',
					),
				),
				array(
					'name' => 'slides_overflow',
					'type' => \Elementor\Controls_Manager::SWITCHER,
					'label' => __('Slides overflow visible', 'trx_addons'),
					'label_off' => __( 'Off', 'trx_addons' ),
					'label_on' => __( 'On', 'trx_addons' ),
					'return_value' => '1',
					'condition' => array(
						'slider' => '1',
					),
				),
				array(
					'name' => 'slider_mouse_wheel',
					'type' => \Elementor\Controls_Manager::SWITCHER,
					'label' => __('Mouse wheel enabled', 'trx_addons'),
					'label_off' => __( 'Off', 'trx_addons' ),
					'label_on' => __( 'On', 'trx_addons' ),
					'return_value' => '1',
					'condition' => array(
						'slider' => '1',
					),
				),
				array(
					'name' => 'slider_autoplay',
					'type' => \Elementor\Controls_Manager::SWITCHER,
					'label' => __('Enable autoplay', 'trx_addons'),
					'label_off' => __( 'Off', 'trx_addons' ),
					'label_on' => __( 'On', 'trx_addons' ),
					'default' => '1',
					'return_value' => '1',
					'condition' => array(
						'slider' => '1',
					),
				),
				array(
					'name' => 'slider_loop',
					'type' => \Elementor\Controls_Manager::SWITCHER,
					'label' => __('Loop', 'trx_addons'),
					'label_off' => __( 'Off', 'trx_addons' ),
					'label_on' => __( 'On', 'trx_addons' ),
					'default' => '1',
					'return_value' => '1',
					'condition' => array(
						'slider' => '1',
						'slides_overflow!' => '1'
					),
				),
				array(
					'name' => 'slider_free_mode',
					'type' => \Elementor\Controls_Manager::SWITCHER,
					'label' => __('Free mode', 'trx_addons'),
					'label_off' => __( 'Off', 'trx_addons' ),
					'label_on' => __( 'On', 'trx_addons' ),
					'return_value' => '1',
					'condition' => array(
						'slider' => '1',
					),
				),
			);
			return apply_filters( 'trx_addons_filter_elementor_add_slider_param', $params );
		}
		
		/**
		 * Add 'Slider' controls to our shortcodes
		 * 
		 * @access protected
		 *
		 * @param string|boolean $group  Group name. If false - use 'Slider' as group name
		 * @param array $add_params  Additional parameters to add or change some default 'slider' parameters
		 */
		protected function add_slider_param( $group = false, $add_params = array() ) {
			$this->add_common_controls(
				array(
					'label' => $group === false ? __( 'Slider', 'trx_addons' ) : $group,
					'section' => 'slider',
					'tab' => \Elementor\Controls_Manager::TAB_LAYOUT
				),
				$this->get_slider_param(),
				$add_params
			);
		}


		// 'Title' parameters
		//----------------------------------------------------------------------

		/**
		 * Return common 'Title' parameters for the shortcode's controls
		 * 
		 * @access protected
		 * 
		 * @trigger trx_addons_filter_elementor_add_title_param
		 *
		 * @param boolean $button  Add a button to the title block
		 * 
		 * @return array  	   List of parameters
		 */
		protected function get_title_param( $button = true ) {

			// Detect edit mode
			$is_edit_mode = trx_addons_elm_is_edit_mode();

			$params = array(
				// Common
				array(
					'name' => 'title_style',
					'type' => \Elementor\Controls_Manager::SELECT,
					'label' => __( 'Title style', 'trx_addons' ),
					'label_block' => false,
					'options' => ! $is_edit_mode ? array() : apply_filters('trx_addons_sc_type', trx_addons_components_get_allowed_layouts('sc', 'title'), 'trx_sc_title'),
					'default' => 'default',
				),
				array(
					'name' => 'title_tag',
					'type' => \Elementor\Controls_Manager::SELECT,
					'label' => __( 'Title tag', 'trx_addons' ),
					'label_block' => false,
					'options' => ! $is_edit_mode ? array() : trx_addons_get_list_sc_title_tags(),
					'default' => 'none',
				),
				array(
					'name' => 'title_align',
					'type' => \Elementor\Controls_Manager::SELECT,
					'label' => __( 'Title alignment', 'trx_addons' ),
					'label_block' => false,
					'options' => ! $is_edit_mode ? array() : trx_addons_get_list_sc_aligns(),
					'default' => 'none',
				),
				// Title
				array(
					'name' => 'title_heading',
					'type' => \Elementor\Controls_Manager::HEADING,
					'label' => esc_html__( 'Title settings', 'trx_addons' ),
					'separator' => 'before',
				),
				array(
					'name' => 'title',
					'type' => \Elementor\Controls_Manager::TEXTAREA,
					'label' => __( "Title", 'trx_addons' ),
					"description" => wp_kses_data( __("Title of the block. Enclose any words in {{ and }} to make them italic or in (( and )) to make them bold. If title style is 'accent' - bolded element styled as shadow, italic - as a filled circle", 'trx_addons') )
									. '<br />'
									. wp_kses_data( __("You can also enclose the title part with [[ and ]] to apply styles from the 'Title 2' section to it (see below)", 'trx_addons') ),
					'placeholder' => __( "Title", 'trx_addons' ),
					'separator' => 'before',
					'default' => ''
				),
				array(
					'name' => 'title_color',
					'label' => __( 'Title color', 'trx_addons' ),
					'type' => \Elementor\Controls_Manager::COLOR,
					'default' => '',
					'description' => '',
					'selectors' => [
						'{{WRAPPER}} .sc_item_title' => 'color: {{VALUE}};',
					],
//					'global' => array(
//						'active' => false,
//					),
				),
				array(
					'name' => 'title_color2',
					'label' => __( 'Title color 2', 'trx_addons' ),
					'type' => \Elementor\Controls_Manager::COLOR,
					'default' => '',
					'description' => '',
//					'global' => array(
//						'active' => false,
//					),
					'condition' => array(
						'title_style' => 'gradient'
					),
				),
				array(
					'name' => 'gradient_fill',
					'type' => \Elementor\Controls_Manager::SELECT,
					'label' => __( 'Gradient fill', 'trx_addons' ),
					'label_block' => false,
					'options' => ! $is_edit_mode ? array() : trx_addons_get_list_sc_title_gradient_fills(),
					'default' => 'block',
					'condition' => array(
						'title_style' => 'gradient'
					),
				),
				array(
					'name' => 'gradient_direction',
					'label' => __( 'Gradient direction', 'trx_addons' ),
					'type' => \Elementor\Controls_Manager::SLIDER,
					'default' => array(
						'size' => 0,
						'unit' => 'px'
					),
					'size_units' => array( 'px' ),
					'range' => array(
						'px' => array(
							'min' => 0,
							'max' => 360
						)
					),
					'condition' => array(
						'title_style' => 'gradient'
					),
				),
				array(
					'name' => 'title_border_color',
					'label' => __( 'Title border color', 'trx_addons' ),
					'type' => \Elementor\Controls_Manager::COLOR,
					'default' => '',
					'description' => '',
//					'global' => array(
//						'active' => false,
//					),
					'selectors' => array(
						'{{WRAPPER}} .sc_item_title_text' => '-webkit-text-stroke-color:{{VALUE}};'
					)
				),
				array(
					'name' => 'title_border_width',
					'label' => __( 'Title border width', 'trx_addons' ),
					'type' => \Elementor\Controls_Manager::SLIDER,
					'default' => array(
						'size' => 0,
						'unit' => 'px'
					),
					'size_units' => array( 'px' ),
					'range' => array(
						'px' => array(
							'min' => 0,
							'max' => 10
						)
					),
					'selectors' => array(
						'{{WRAPPER}} .sc_item_title_text' => '-webkit-text-stroke-width:{{SIZE}}px;'
					)
				),
				array(
					'name' => 'title_bg_image',
					'type' => \Elementor\Controls_Manager::MEDIA,
					'label' => __( 'Title bg image', 'trx_addons' ),
					'default' => array(
						'url' => '',
					),
					'selectors' => array(
						'{{WRAPPER}} .sc_item_title_text' => '-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text;background-image:url({{URL}});background-position:center center;background-size:cover;'
					)
				),
				array(
					'name' => 'title_typography',
					'label' => __( 'Title typography', 'trx_addons' ),
					'group' => \Elementor\Group_Control_Typography::get_type(),
//					'global' => [
//						'default' => \Elementor\Core\Kits\Documents\Tabs\Global_Typography::TYPOGRAPHY_PRIMARY,
//					],
					'selector' => '{{WRAPPER}} .sc_item_title_text'
				),
				array(
					'name' => 'title_shadow',
					'label' => __( 'Title shadow', 'trx_addons' ),
					'group' => \Elementor\Group_Control_Text_Shadow::get_type(),
					'selector' => '{{WRAPPER}} .sc_item_title_text'
				),
				array(
					'name' => "typed",
					'type' => \Elementor\Controls_Manager::SWITCHER,
					'label' => __("Use autotype", 'trx_addons'),
					'label_off' => __( 'Off', 'trx_addons' ),
					'label_on' => __( 'On', 'trx_addons' ),
					'return_value' => '1',
					'condition' => array(
						'title!' => '',
					),
				),
				array(
					'name' => "typed_loop",
					'type' => \Elementor\Controls_Manager::SWITCHER,
					'label' => __("Autotype loop", 'trx_addons'),
					'label_off' => __( 'Off', 'trx_addons' ),
					'label_on' => __( 'On', 'trx_addons' ),
					'return_value' => '1',
					'default' => '1',
					'condition' => array(
						'typed' => '1',
					),
				),
				array(
					'name' => "typed_cursor",
					'type' => \Elementor\Controls_Manager::SWITCHER,
					'label' => __("Autotype cursor", 'trx_addons'),
					'label_off' => __( 'Off', 'trx_addons' ),
					'label_on' => __( 'On', 'trx_addons' ),
					'return_value' => '1',
					'default' => '1',
					'condition' => array(
						'typed' => '1',
					),
				),
				array(
					'name' => 'typed_strings',
					'type' => \Elementor\Controls_Manager::TEXTAREA,
					'label' => __( 'Alternative strings', 'trx_addons' ),
					'label_block' => true,
					'description' => __( "Alternative strings to type. Attention! First string must be equal of the part of the title.", 'trx_addons' ),
					'default' => '',
					'separator' => 'none',
					'rows' => 5,
					'show_label' => true,
					'condition' => array(
						'typed' => '1',
					),
				),
				array(
					'name' => 'typed_color',
					'label' => __( 'Autotype color', 'trx_addons' ),
					'type' => \Elementor\Controls_Manager::COLOR,
					'default' => '',
					'description' => '',
//					'global' => array(
//						'active' => false,
//					),
					'condition' => array(
						'typed' => '1',
					),
				),
				array(
					'name' => "typed_speed",
					'type' => \Elementor\Controls_Manager::SLIDER,
					'label' => __('Autotype speed', 'trx_addons'),
					'condition' => array(
						'typed' => '1',
					),
					'default' => array(
						'size' => 6
					),
					'step' => 0.5,
					'range' => array(
						'px' => array(
							'min' => 1,
							'max' => 10
						)
					)
				),
				array(
					'name' => "typed_delay",
					'type' => \Elementor\Controls_Manager::SLIDER,
					'label' => __('Autotype delay (in sec.)', 'trx_addons'),
					'separator' => 'after',
					'condition' => array(
						'typed' => '1',
					),
					'default' => array(
						'size' => 1
					),
					'step' => 0.5,
					'range' => array(
						'px' => array(
							'min' => 0,
							'max' => 10
						)
					)
				),
				// Title 2 (dual title)
				array(
					'name' => 'title2_heading',
					'type' => \Elementor\Controls_Manager::HEADING,
					'label' => esc_html__( 'Dual heading', 'trx_addons' ),
					"description" => wp_kses_data( __("Allows to separate title on parts with different color, border or background (if your theme support this functionality)", 'trx_addons') )
									. '<br />'
									. wp_kses_data( __("You could also enclose part of the title in the field 'Title' with [[ and ]]", 'trx_addons') ),
					'separator' => 'before',
				),
				array(
					'name' => 'title2',
					'type' => \Elementor\Controls_Manager::TEXT,
					'label' => __( "Title part 2", 'trx_addons' ),
					"description" => wp_kses_data( __("Use this parameter if you want to separate title parts with different color, border or background", 'trx_addons') ),
					'placeholder' => __( "Title part 2", 'trx_addons' ),
					'separator' => 'before',
					'default' => ''
				),
				array(
					'name' => 'title2_color',
					'label' => __( 'Title 2 color', 'trx_addons' ),
					'type' => \Elementor\Controls_Manager::COLOR,
					'default' => '',
					'description' => '',
//					'global' => array(
//						'active' => false,
//					),
					'selectors' => array(
						'{{WRAPPER}} .sc_item_title_text2' => 'color:{{VALUE}};'
					)
				),
				array(
					'name' => 'title2_color2',
					'label' => __( 'Title 2 color 2', 'trx_addons' ),
					'type' => \Elementor\Controls_Manager::COLOR,
					'default' => '',
					'description' => '',
//					'global' => array(
//						'active' => false,
//					),
					'condition' => array(
						'title_style' => 'gradient'
					),
				),
				array(
					'name' => 'gradient_fill2',
					'type' => \Elementor\Controls_Manager::SELECT,
					'label' => __( 'Gradient fill', 'trx_addons' ),
					'label_block' => false,
					'options' => ! $is_edit_mode ? array() : trx_addons_get_list_sc_title_gradient_fills(),
					'default' => 'block',
					'condition' => array(
						'title_style' => 'gradient'
					),
				),
				array(
					'name' => 'gradient_direction2',
					'label' => __( 'Gradient direction', 'trx_addons' ),
					'type' => \Elementor\Controls_Manager::SLIDER,
					'default' => array(
						'size' => 0,
						'unit' => 'px'
					),
					'size_units' => array( 'px' ),
					'range' => array(
						'px' => array(
							'min' => 0,
							'max' => 360
						)
					),
					'condition' => array(
						'title_style' => 'gradient'
					),
				),
				array(
					'name' => 'title2_border_color',
					'label' => __( 'Title 2 border color', 'trx_addons' ),
					'type' => \Elementor\Controls_Manager::COLOR,
					'default' => '',
					'description' => '',
//					'global' => array(
//						'active' => false,
//					),
					'selectors' => array(
						'{{WRAPPER}} .sc_item_title_text2' => '-webkit-text-stroke-color:{{VALUE}};'
					)
				),
				array(
					'name' => 'title2_border_width',
					'label' => __( 'Title 2 border width', 'trx_addons' ),
					'type' => \Elementor\Controls_Manager::SLIDER,
					'default' => array(
						'size' => 0,
						'unit' => 'px'
					),
					'size_units' => array( 'px' ),
					'range' => array(
						'px' => array(
							'min' => 0,
							'max' => 10
						)
					),
					'selectors' => array(
						'{{WRAPPER}} .sc_item_title_text2' => '-webkit-text-stroke-width:{{SIZE}}px;'
					)
				),
				array(
					'name' => 'title2_bg_image',
					'type' => \Elementor\Controls_Manager::MEDIA,
					'label' => __( 'Title 2 bg image', 'trx_addons' ),
					'default' => array(
						'url' => '',
					),
					'selectors' => array(
						'{{WRAPPER}} .sc_item_title_text2' => '-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text;background-image:url({{URL}});background-position:center center;background-size:cover;'
					)
				),
				array(
					'name' => 'title2_typography',
					'label' => __( 'Title 2 typography', 'trx_addons' ),
					'group' => \Elementor\Group_Control_Typography::get_type(),
//					'global' => [
//						'default' => Global_Typography::TYPOGRAPHY_PRIMARY,
//					],
					'selector' => '{{WRAPPER}} .sc_item_title_text2'
				),
				array(
					'name' => 'title2_shadow',
					'label' => __( 'Title 2 shadow', 'trx_addons' ),
					'group' => \Elementor\Group_Control_Text_Shadow::get_type(),
					'selector' => '{{WRAPPER}} .sc_item_title_text2'
				),

				// Subtitle
				array(
					'name' => 'title_subtitle_heading',
					'type' => \Elementor\Controls_Manager::HEADING,
					'label' => esc_html__( 'Subtitle settings', 'trx_addons' ),
					'separator' => 'before',
				),
				array(
					'name' => 'subtitle',
					'type' => \Elementor\Controls_Manager::TEXT,
					'label' => __( "Subtitle", 'trx_addons' ),
					'placeholder' => __( "Title text", 'trx_addons' ),
					'default' => '',
					'separator' => 'before',
				),
				array(
					'name' => 'subtitle_align',
					'type' => \Elementor\Controls_Manager::SELECT,
					'label' => __( 'Subtitle alignment', 'trx_addons' ),
					'label_block' => false,
					'options' => ! $is_edit_mode ? array() : trx_addons_get_list_sc_aligns(),
					'default' => 'none',
				),
				array(
					'name' => 'subtitle_position',
					'type' => \Elementor\Controls_Manager::SELECT,
					'label' => __( 'Subtitle position', 'trx_addons' ),
					'label_block' => false,
					'options' => ! $is_edit_mode ? array() : trx_addons_get_list_sc_subtitle_positions(),
					'default' => trx_addons_get_setting('subtitle_above_title') ? 'above' : 'below',
				),
				array(
					'name' => 'subtitle_color',
					'label' => __( 'Subtitle color', 'trx_addons' ),
					'type' => \Elementor\Controls_Manager::COLOR,
					'default' => '',
					'description' => '',
					'selectors' => [
						'{{WRAPPER}} .sc_item_subtitle' => 'color: {{VALUE}};',
					],
//					'global' => array(
//						'active' => false,
//					),
				),

				// Description
				array(
					'name' => 'title_description_heading',
					'type' => \Elementor\Controls_Manager::HEADING,
					'label' => esc_html__( 'Description', 'trx_addons' ),
					'separator' => 'before',
				),
				array(
					'name' => 'description',
					'type' => \Elementor\Controls_Manager::TEXTAREA,
					'label' => __( 'Description', 'trx_addons' ),
					'label_block' => true,
					'placeholder' => __( "Short description of this block", 'trx_addons' ),
					'default' => '',
					'separator' => 'none',
					'rows' => 10,
					'show_label' => false,
				),
				array(
					'name' => 'description_color',
					'label' => __( 'Description color', 'trx_addons' ),
					'type' => \Elementor\Controls_Manager::COLOR,
					'default' => '',
					'description' => '',
					'selectors' => [
						'{{WRAPPER}} .sc_item_descr' => 'color: {{VALUE}};',
					],
//					'global' => array(
//						'active' => false,
//					),
				),
			);

			// Add button's params
			if ( $button ) {
				$params[] = array(
								'name' => 'title_link_heading',
								'type' => \Elementor\Controls_Manager::HEADING,
								'label' => esc_html__( 'Button settings', 'trx_addons' ),
								'separator' => 'before',
							);
				$params[] = array(
								'name' => 'link',
								'type' => \Elementor\Controls_Manager::URL,
								'label' => __( "Button's Link", 'trx_addons' ),
								'label_block' => false,
								'placeholder' => __( '//your-link.com', 'trx_addons' ),
								'separator' => 'before',
							);
				$params[] = array(
								'name' => 'link_text',
								'type' => \Elementor\Controls_Manager::TEXT,
								'label' => __( "Button's text", 'trx_addons' ),
								'label_block' => false,
								'placeholder' => __( "Link's text", 'trx_addons' ),
								'default' => ''
							);
				$params[] = array(
								'name' => 'link_size',
								'type' => \Elementor\Controls_Manager::SELECT,
								'label' => __( "Button's size", 'trx_addons' ),
								'label_block' => false,
								'options' => ! $is_edit_mode ? array() : trx_addons_get_list_sc_button_sizes(),
								'default' => 'normal',
							);
				$params[] = array(
								'name' => 'link_style',
								'type' => \Elementor\Controls_Manager::SELECT,
								'label' => __( "Button's style", 'trx_addons' ),
								'label_block' => false,
								'options' => ! $is_edit_mode ? array() : apply_filters('trx_addons_sc_type', trx_addons_components_get_allowed_layouts('sc', 'button'), 'trx_sc_button'),
								'default' => 'default',
							);
				$params[] = array(
								'name' => 'link_image',
								'type' => \Elementor\Controls_Manager::MEDIA,
								'label' => __( "Button's image", 'trx_addons' ),
								'default' => array(
									'url' => '',
								),
							);
			}
			return apply_filters('trx_addons_filter_elementor_add_title_param', $params);
		}
		
		/**
		 * Add 'Title' controls to our shortcodes
		 * 
		 * @access protected
		 *
		 * @param boolean|string $group  A section's name or false to use a default name 'Title, Description & Button'
		 * @param array $add_params  Additional parameters to add or replace some default 'title' parameters
		 */
		protected function add_title_param( $group = false, $add_params = array() ) {
			$this->add_common_controls(
				array(
					'label' => $group === false ? __('Title, Description & Button', 'trx_addons') : $group,
					'section' => 'title',
					'tab' => \Elementor\Controls_Manager::TAB_LAYOUT
				),
				$this->get_title_param( ! isset( $add_params['button'] ) || $add_params['button'] ),
				$add_params
			);
		}


		// 'Query' parameters
		//------------------------------------------------------

		/**
		 * Return 'Query' parameters (ids, count, columns, offset, etc.) for our shortcodes
		 *
		 * @access protected
		 * 
		 * @trigger trx_addons_filter_elementor_add_query_param
		 *
		 * @param string $pt  Post type
		 *
		 * @return array  List of parameters
		 */
		protected function get_query_param( $pt ) {

			// Detect edit mode
			$is_edit_mode = trx_addons_elm_is_edit_mode();

			$params = array(
				trx_addons_get_option( 'sc_ids_type' ) == 'simple'
					? array(
							'name' => 'ids',
							'type' => \Elementor\Controls_Manager::TEXT,
							'label' => __( "IDs to show", 'trx_addons' ),
							"description" => wp_kses_data( __("Comma separated list of IDs to display. If not empty, parameters 'cat', 'offset' and 'count' are ignored!", 'trx_addons') ),
							'placeholder' => __( "IDs list", 'trx_addons' ),
							'default' => ''
						)
					: array_merge(
							array(
								'name' => 'ids',
								'type' => \Elementor\Controls_Manager::SELECT2,
								'label' => __( "Posts to show", 'trx_addons' ),
								"description" => wp_kses_data( __("List of posts to display. If not empty, parameters 'cat', 'offset' and 'count' are ignored!", 'trx_addons') ),
								'placeholder' => __( "Posts list", 'trx_addons' ),
								'multiple' => true,
								'options' => ! $is_edit_mode ? array() : trx_addons_get_list_posts( false, array(
																				'post_type' => $pt,
																				'not_selected' => false,
																				'orderby' => 'title',
																				'order' => 'asc'
																				)
																			),
								'default' => '',
							),
							trx_addons_is_on( trx_addons_get_option( 'use_ajax_to_get_ids' ) )
								? array(
										'select2options' => array(
																'ajax' => array(
																				'delay' => 600,
																				'type' => 'post',
																				'dataType' => 'json',
																				'url' => esc_url( trx_addons_add_to_url( admin_url('admin-ajax.php'), array(
																							'action' => 'ajax_sc_posts_search'
																						) ) ),
																				)
																),
									)
								: array()
						),
				array(
					'name' => "count",
					'type' => \Elementor\Controls_Manager::SLIDER,
					'label' => __('Count', 'trx_addons'),
					"description" => wp_kses_data( __("The number of displayed posts. If 'Posts to show' is not empty, this parameter is ignored.", 'trx_addons') ),
/*
					'condition' => array(
						'ids' => '',
					),
*/
					'default' => array(
						'size' => 3
					),
					'range' => array(
						'px' => array(
							'min' => 1,
							'max' => 100
						)
					)
				),
				array(
					'name' => "columns",
					'type' => \Elementor\Controls_Manager::SLIDER,
					'responsive' => true,
					'label' => __('Columns', 'trx_addons'),
					"description" => wp_kses_data( __("Specify the number of columns. If left empty or assigned the value '0' - auto detect by the number of items.", 'trx_addons') ),
					'default' => array(
						'size' => 0
					),
					'range' => array(
						'px' => array(
							'min' => 0,
							'max' => 12
						)
					)
				),
				array(
					'name' => "offset",
					'type' => \Elementor\Controls_Manager::SLIDER,
					'label' => __('Offset', 'trx_addons'),
					"description" => wp_kses_data( __("Specify the number of items to be skipped before the displayed items.", 'trx_addons') ),
/*
					'condition' => array(
						'ids' => '',
					),
*/
					'default' => array(
						'size' => 0
					),
					'range' => array(
						'px' => array(
							'min' => 0,
							'max' => 100
						)
					)
				),
				array(
					'name' => 'orderby',
					'type' => \Elementor\Controls_Manager::SELECT,
					'label' => __( 'Order by', 'trx_addons' ),
					'label_block' => false,
					'options' => ! $is_edit_mode ? array() : trx_addons_get_list_sc_query_orderby(),
					'default' => 'none',
				),
				array(
					'name' => 'order',
					'type' => \Elementor\Controls_Manager::SELECT,
					'label' => __( 'Order', 'trx_addons' ),
					'label_block' => false,
					'options' => ! $is_edit_mode ? array() : trx_addons_get_list_sc_query_orders(),
					'default' => 'asc',
				)
			);
			return apply_filters( 'trx_addons_filter_elementor_add_query_param', $params );
		}
		
		/**
		 * Add 'Query' section with controls to the shortcode's params
		 * 
		 * @access protected
		 *
		 * @param boolean|string $group  Group name. If false - add controls to the 'Query' section
		 * @param array $add_params  Additional parameters to add or override default 'query' parameters
		 * @param string $pt         Post type
		 */
		protected function add_query_param( $group = false, $add_params = array(), $pt = 'any' ) {
			$this->add_common_controls(
				array(
					'label' => $group === false ? __('Query', 'trx_addons') : $group,
					'section' => 'query'
				),
				$this->get_query_param( $pt ),
				$add_params
			);
		}


		// 'Hide' parameters
		//-------------------------------------------------------------

		/**
		 * Return 'Hide' parameters list for our shortcodes
		 *
		 * @access public
		 * 
		 * @trigger trx_addons_filter_elementor_add_hide_param
		 * 
		 * @param boolean $hide_on_frontpage  Add 'Hide on front page' parameter
		 * 
		 * @return array  				 List of parameters
		 */
		static function get_hide_param( $hide_on_frontpage = false ) {
			$params = array(
				array(
					'name' => 'hide_on_wide',
					'type' => \Elementor\Controls_Manager::SWITCHER,
					'label' => __( 'Hide on wide screens', 'trx_addons' ),
					'label_off' => __( 'Off', 'trx_addons' ),
					'label_on' => __( 'On', 'trx_addons' ),
					'return_value' => '1'
				),
				array(
					'name' => 'hide_on_desktop',
					'type' => \Elementor\Controls_Manager::SWITCHER,
					'label' => __( 'Hide on desktops', 'trx_addons' ),
					'label_off' => __( 'Off', 'trx_addons' ),
					'label_on' => __( 'On', 'trx_addons' ),
					'return_value' => '1'
				),
				array(
					'name' => 'hide_on_notebook',
					'type' => \Elementor\Controls_Manager::SWITCHER,
					'label' => __( 'Hide on notebooks', 'trx_addons' ),
					'label_off' => __( 'Off', 'trx_addons' ),
					'label_on' => __( 'On', 'trx_addons' ),
					'return_value' => '1'
				),
				array(
					'name' => 'hide_on_tablet',
					'type' => \Elementor\Controls_Manager::SWITCHER,
					'label' => __( 'Hide on tablets', 'trx_addons' ),
					'label_off' => __( 'Off', 'trx_addons' ),
					'label_on' => __( 'On', 'trx_addons' ),
					'return_value' => '1'
				),
				array(
					'name' => 'hide_on_mobile',
					'type' => \Elementor\Controls_Manager::SWITCHER,
					'label' => __( 'Hide on mobile devices', 'trx_addons' ),
					'label_off' => __( 'Off', 'trx_addons' ),
					'label_on' => __( 'On', 'trx_addons' ),
					'return_value' => '1'
				)
			);
			if ( $hide_on_frontpage ) {
				$params[] = array(
					'name' => 'hide_on_frontpage',
					'type' => \Elementor\Controls_Manager::SWITCHER,
					'label' => __( 'Hide on Frontpage', 'trx_addons' ),
					'label_off' => __( 'Off', 'trx_addons' ),
					'label_on' => __( 'On', 'trx_addons' ),
					'return_value' => '1'
				);
				$params[] = array(
					'name' => 'hide_on_singular',
					'type' => \Elementor\Controls_Manager::SWITCHER,
					'label' => __( 'Hide on single posts and pages', 'trx_addons' ),
					'label_off' => __( 'Off', 'trx_addons' ),
					'label_on' => __( 'On', 'trx_addons' ),
					'return_value' => '1'
				);
				$params[] = array(
					'name' => 'hide_on_other',
					'type' => \Elementor\Controls_Manager::SWITCHER,
					'label' => __( 'Hide on other pages', 'trx_addons' ),
					'label_off' => __( 'Off', 'trx_addons' ),
					'label_on' => __( 'On', 'trx_addons' ),
					'return_value' => '1'
				);
			}
			return apply_filters( 'trx_addons_filter_elementor_add_hide_param', $params );
		}
		
		/**
		 * Add 'Hide' controls to the shortcode's settings
		 * 
		 * @access protected
		 *
		 * @param boolean|string $group  Group name. If false - add controls to the 'Hide' section
		 * @param array $add_params      Additional parameters to add or replace default 'hide' parameters
		 */
		protected function add_hide_param( $group = false, $add_params = array() ) {
			$this->add_common_controls(
				array(
					'label' => $group === false ? __('Hide', 'trx_addons') : $group,
					'section' => 'hide',
					'tab' => \Elementor\Controls_Manager::TAB_LAYOUT
				),
				$this->get_hide_param( ! empty( $add_params['hide_on_frontpage'] ) ),
				$add_params
			);
		}

		
		// RENDER SHORTCODE'S CONTENT
		//------------------------------------------------------------

		/**
		 * Render Elementor widget.
		 * Call shortcode's function to display it's output in Elementor.
		 * 
		 * @access public
		 */
		public function render() {
			$sc_func = $this->get_sc_function();
			if ( function_exists( $sc_func ) ) {
				trx_addons_sc_stack_push( 'trx_sc_layouts' );		// To prevent wrap shortcodes output to the '<div class="sc_layouts_item"></div>'
				$output = call_user_func( $sc_func, $this->sc_prepare_atts( $this->get_settings(), $this->get_sc_name() ) );
				trx_addons_sc_stack_pop();
				trx_addons_show_layout( $output );
			}
		}

		/**
		 * Show message ( placeholder layout ) about not existing shortcode
		 * 
		 * @access public
		 *
		 * @param string $sc        Shortcode name
		 * @param string $plugin    Plugin name
		 */
		public function shortcode_not_exists( $sc, $plugin ) {
			?><div class="trx_addons_sc_not_exists">
				<h5 class="trx_addons_sc_not_exists_title"><?php echo esc_html( sprintf( __( 'Shortcode %s is not available!', 'trx_addons' ), $sc ) ); ?></h5>
				<div class="trx_addons_sc_not_exists_description">
					<p><?php echo esc_html( sprintf( __( 'Shortcode "%1$s" from plugin "%2$s" is not available in Elementor Editor!', 'trx_addons' ), $sc, $plugin ) ); ?></p>
					<p><?php esc_html_e( 'Possible causes:', 'trx_addons' ); ?></p>
					<ol class="trx_addons_sc_not_exists_causes">
						<li><?php echo esc_html( sprintf( __( 'Plugin "%s" is not installed or not active', 'trx_addons' ), $plugin ) ); ?></li>
						<li><?php esc_html_e( 'The plugin registers a shortcode later than it asks for Elementor Editor', 'trx_addons' ); ?></li>
					</ol>
					<p><?php esc_html_e( "So you see this message instead the shortcode in the editor. To see the real shortcode's output - save the changes and open this page in Frontend", 'trx_addons' ); ?></p>
				</div>
			</div><?php
		}

		/**
		 * Prepare shortcode's attributes for Elementor:
		 * - Convert array to string for attributes, added to the array 'plain_params'
		 *   For example: 1) if in the 'plain_params' specified 'height' => 'size' and 'height' is an array( 'size' => 100, 'unit' => 'px' )
		 *                   then 'height' will be converted to '100' and a new attribute 'height_extra' will be added with the original array
		 * 				  2) if in the 'plain_params' specified 'height' => 'size+unit' and 'height' is an array( 'size' => 100, 'unit' => 'px' )
		 *                   then 'height' will be converted to '100px' and a new attribute 'height_extra' will be added with the original array
		 *                3) if in the 'plain_params' specified 'icon' => 'value.url' and 'icon' is an array( 'value' => array( 'id' => 'test', 'url' => 'https://xxx.yyy' ) )
		 * 				     then 'icon' will be converted to 'https://xxx.yyy' and a new attribute 'icon_extra' will be added with the original array
		 * - Sinchronize Elementor's setting '_element_id' with the shortcode's parameter 'id'
		 * - Add this object to the parameters with the key 'sc_elementor_object' to use it in the shortcode's templates
		 * - and more...
		 * 
		 * @access protected
		 * 
		 * @trigger trx_addons_filter_elementor_sc_prepare_atts
		 * @trigger trx_addons_filter_sc_generate_id
		 *
		 * @param array $atts       Shortcode's attributes
		 * @param string $sc        Shortcode name
		 * @param int $level        Recursion level
		 *
		 * @return array            Prepared attributes
		 */
		protected function sc_prepare_atts( $atts, $sc = '', $level = 0 ) {
			if ( is_array( $atts ) ) {
				foreach( $atts as $k => $v ) {
					// If current element is group (repeater) - call this function recursively
					if ( is_array( $v ) && isset( $v[0] ) && is_array( $v[0] ) ) {
						foreach ( $v as $k1 => $v1 ) {
							$atts[$k][$k1] = $this->sc_prepare_atts( $v1, $sc, $level + 1 );
						}

					// Current element is single control
					} else {
						// Make 'xxx' as plain string
						// and add 'xxx_extra' for each plain param
						if ( in_array( $k, array_keys( $this->plain_params ) ) && is_array( $v ) ) {
							$atts["{$k}_extra"] = $v;
							$prm = explode( '+', $this->plain_params[$k] );
							// New way
							$value = '';
							$i = 0;
							foreach( $prm as $p ) {
								if ( ! empty( $p ) && ( ! empty( $value ) || $i === 0 ) ) {
									$parts = explode( '.', $p );
									if ( isset( $v[ $parts[0] ] ) ) {
										$value .= ! empty( $parts[1] )
													? ( ! empty( $v[ $parts[0] ][ $parts[1] ] )
														? $v[ $parts[0] ][ $parts[1] ]
														: ''
														)
													: $v[ $parts[0] ];
									}
								}
								$i++;
							}
							$atts[$k] = $v = $value;
							// Old way
							// if ( isset( $v[ $prm[0] ] ) ) {
							// 	$atts[$k] = $v = $v[ $prm[0] ] . ( ! empty( $v[ $prm[0] ] ) && ! empty( $prm[1] ) && isset( $v[ $prm[1] ] ) ? $v[ $prm[1] ] : '' );
							// }
						}
						// Sinchronize 'id' and '_element_id'
						if ( $k == '_element_id' ) {
							if ( empty( $atts['id'] ) ) {
								$atts['id'] = ! empty( $v ) 
												? $v . '_sc' // original '_element_id' is already applied to element's wrapper
												: ( apply_filters( 'trx_addons_filter_sc_generate_id', false )
													? trx_addons_generate_id( $this->get_sc_name() . '_' )
													: ''
													);
							}
/*
						// Sinchronize 'class' and '_css_classes'
						// Not used, because 'class' is already applied to element's wrapper
						} else if ($k == '_css_classes') {
							if ( empty( $atts['class'] ) ) {
								$atts['class'] = $v;
							}
*/
						// Add icon_type='elementor' if attr 'icon' is present and equal to the 'fa fa-xxx'
						// After update Elementor 2.6.0 'icon' is array (was a string in the previous versions) - convert it to string again
						} else if ( $k == 'icon' ) {
							if ( is_array( $v ) ) {
								$atts['icon_extra'] = $v;
								$atts['icon'] = $v = ! empty( $v['icon'] ) ? $v['icon'] : '';
							}
							if ( trx_addons_is_elementor_icon( $v ) ) {
								$atts['icon_type'] = 'elementor';
							}
						}
					}
				}
			}

			if ( $level == 0 ) {
				if ( trx_addons_get_setting( 'add_render_attributes' ) ) {
					$atts[ 'sc_elementor_object' ] = $this;	// Add shortcode object instance to the attributes array
				}
				$atts = apply_filters( 'trx_addons_filter_elementor_sc_prepare_atts', $atts, $sc );
			}

			return $atts;
		}

		
		// DISPLAY TEMPLATE'S PARTS
		//------------------------------------------------------------
		
		/**
		 * Display title, subtitle and description for some shortcodes. Use the template 'templates/tpe.sc_titles.php'
		 * 
		 * @access public
		 *
		 * @param string $sc    Shortcode name
		 * @param string $size  Size of the title: 'tiny', 'small', 'medium', 'large', 'huge', 'super'
		 */
		public function sc_show_titles( $sc, $size = '' ) {
			trx_addons_get_template_part( 'templates/tpe.sc_titles.php',
									'trx_addons_args_sc_show_titles',
									array( 'sc' => $sc, 'size' => $size, 'element' => $this )
								);
			
		}

		/**
		 * Display a link button for some shortcodes. Use the template 'templates/tpe.sc_links.php'
		 * 
		 * @access public
		 *
		 * @param string $sc    Shortcode name
		 */
		public function sc_show_links( $sc ) {
			trx_addons_get_template_part( 'templates/tpe.sc_links.php',
									'trx_addons_args_sc_show_links',
									array( 'sc' => $sc, 'element' => $this )
								);
		}

		/**
		 * Display a button for some shortcodes. Use the template 'shortcodes/button/tpe.sc_button.php'
		 * 
		 * @access public
		 *
		 * @param string $sc    Shortcode name
		 */
		public function sc_show_button( $sc ) {
			?><# 
			var settings_sc_button_old = settings;
			settings = {
				'title': settings.link_text,
				'link': settings.link,
				'type': settings.link_style,
				'size': settings.link_size,
				'class': 'sc_item_button sc_item_button_' + settings.link_style + ' sc_item_button_size_' + settings.link_size + ' <?php echo esc_attr($sc); ?>_button',
				'align': settings.title_align ? settings.title_align : 'none'
			};
			#><?php
			trx_addons_get_template_part( TRX_ADDONS_PLUGIN_SHORTCODES . 'button/tpe.button.php',
									'trx_addons_args_sc_show_button',
									array( 'sc' => $sc, 'element' => $this )
								);
			?><#
			settings = settings_sc_button_old;
			#><?php
		}

		/**
		 * Display a start portion of a slider layout (open a slider wrapper) for some shortcodes.
		 * Use the template 'templates/tpe.sc_slider_start.php'
		 * 
		 * @access public
		 * 
		 * @trigger trx_addons_filter_sc_show_slider_args
		 *
		 * @param string $sc    Shortcode name
		 */
		public function sc_show_slider_wrap_start( $sc ) {
			trx_addons_get_template_part( 'templates/tpe.sc_slider_start.php',
									'trx_addons_args_sc_show_slider_wrap',
									apply_filters( 'trx_addons_filter_sc_show_slider_args', array( 'sc' => $sc, 'element' => $this ) )
								);
		}

		/**
		 * Display an end portion of a slider layout (close a slider wrapper) for some shortcodes.
		 * Use the template 'templates/tpe.sc_slider_end.php'
		 * 
		 * @access public
		 * 
		 * @trigger trx_addons_filter_sc_show_slider_args
		 *
		 * @param string $sc    Shortcode name
		 */
		public function sc_show_slider_wrap_end( $sc ) {
			trx_addons_get_template_part( 'templates/tpe.sc_slider_end.php',
									'trx_addons_args_sc_show_slider_wrap',
									apply_filters( 'trx_addons_filter_sc_show_slider_args', array( 'sc' => $sc, 'element' => $this ) )
								);
		}

		/**
		 * Display a placeholder for a shortcode. Use the template 'templates/tpe.sc_placeholder.php'
		 * 
		 * @access public
		 * 
		 * @triggr trx_addons_filter_sc_placeholder_args
		 * 
		 * @param array $args   Array of parameters
		 */
		public function sc_show_placeholder( $args = array() ) {
			$args = array_merge(
						array(
							'sc' => $this->get_sc_name(),
							'title_field' => '',
							'element' => $this
						),
						$args
			);
			trx_addons_get_template_part( 'templates/tpe.sc_placeholder.php',
									'trx_addons_args_sc_placeholder',
									apply_filters( 'trx_addons_filter_sc_placeholder_args', $args )
								);
		}
	}
}
© 2026 GrazzMean-Shell