<?php
/**
 * Premium Media Grid.
 */

namespace PremiumAddons\Widgets;

// Elementor Classes.
use Elementor\Plugin;
use Elementor\Modules\DynamicTags\Module as TagsModule;
use Elementor\Widget_Base;
use Elementor\Utils;
use Elementor\Embed;
use Elementor\Control_Media;
use Elementor\Controls_Manager;
use Elementor\Icons_Manager;
use Elementor\Repeater;
use Elementor\Core\Kits\Documents\Tabs\Global_Colors;
use Elementor\Core\Kits\Documents\Tabs\Global_Typography;
use Elementor\Group_Control_Border;
use Elementor\Group_Control_Typography;
use Elementor\Group_Control_Css_Filter;
use Elementor\Group_Control_Text_Shadow;
use Elementor\Group_Control_Box_Shadow;
use Elementor\Group_Control_Image_Size;

// PremiumAddons Classes.
use PremiumAddons\Includes\Helper_Functions;
use PremiumAddons\Includes\Controls\Premium_Post_Filter;
use PremiumAddons\Includes\Controls\Premium_Background;

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class Premium_Grid
 */
class Premium_Grid extends Widget_Base {

	/**
	 * Check for Self Hosted Videos
	 *
	 * @var is_self_hosted
	 */
	private static $check_self_hosted = false;

	/**
	 * Retrieve Widget Name.
	 *
	 * @since 1.0.0
	 * @access public
	 */
	public function get_name() {
		return 'premium-img-gallery';
	}

	/**
	 * Retrieve Widget Title.
	 *
	 * @since 1.0.0
	 * @access public
	 */
	public function get_title() {
		return __( 'Media Grid', 'premium-addons-for-elementor' );
	}

	/**
	 * Retrieve Widget Icon.
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @return string widget icon.
	 */
	public function get_icon() {
		return 'pa-grid-icon';
	}

	/**
	 * Retrieve Widget Dependent CSS.
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @return array CSS style handles.
	 */
	public function get_style_depends() {
		return array(
			'pa-glass',
			'pa-prettyphoto',
			'e-swiper',
			'premium-addons',
		);
	}

	/**
	 * Retrieve Widget Dependent JS.
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @return array JS script handles.
	 */
	public function get_script_depends() {

		$is_edit = Helper_Functions::is_edit_mode();

		$scripts = array( 'imagesloaded', 'isotope-js' );

		if ( $is_edit ) {

			$scripts = array_merge( $scripts, array( 'pa-glass', 'prettyPhoto-js' ) );

		} else {
			$settings = $this->get_settings();

			if ( 'yes' === $settings['premium_gallery_light_box'] && 'default' === $settings['premium_gallery_lightbox_type'] ) {
				$scripts[] = 'prettyPhoto-js';
			}

			if ( 'none' !== $settings['filter_lq_effect'] ) {
				$scripts[] = 'pa-glass';
			}
		}

		$scripts[] = 'premium-addons';

		return $scripts;
	}

	/**
	 * Widget preview refresh button.
	 *
	 * @since 1.0.0
	 * @access public
	 */
	public function is_reload_preview_required() {
		return true;
	}

	/**
	 * Retrieve Widget Categories.
	 *
	 * @since 1.5.1
	 * @access public
	 *
	 * @return array Widget categories.
	 */
	public function get_categories() {
		return array( 'premium-elements' );
	}

	/**
	 * Retrieve Widget Keywords.
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @return string Widget keywords.
	 */
	public function get_keywords() {
		return array( 'pa', 'premium', 'premium media grid', 'layout', 'gallery', 'image', 'video', 'portfolio', 'visual', 'masonry', 'youtube', 'vimeo' );
	}

	protected function is_dynamic_content(): bool {
		return false;
	}

	/**
	 * Retrieve Widget Support URL.
	 *
	 * @access public
	 *
	 * @return string support URL.
	 */
	public function get_custom_help_url() {
		return 'https://premiumaddons.com/support/';
	}

	public function has_widget_inner_wrapper(): bool {
		return ! Helper_Functions::check_elementor_experiment( 'e_optimized_markup' );
	}

	/**
	 * Register Media Grid controls.
	 *
	 * @since 2.1.0
	 * @access protected
	 */
	protected function register_controls() { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore

		$this->start_controls_section(
			'premium_gallery_general',
			array(
				'label' => __( 'Layout', 'premium-addons-for-elementor' ),

			)
		);

		$demo = Helper_Functions::get_campaign_link( 'https://premiumaddons.com/elementor-grid-widget/', 'grid', 'wp-editor', 'demo' );
		Helper_Functions::add_templates_controls( $this, 'media-grid', $demo );

		$this->add_control(
			'premium_gallery_img_size_select',
			array(
				'label'   => __( 'Layout', 'premium-addons-for-elementor' ),
				'type'    => Controls_Manager::SELECT,
				'options' => array(
					'fitRows' => __( 'Even', 'premium-addons-for-elementor' ),
					'masonry' => __( 'Masonry', 'premium-addons-for-elementor' ),
					'metro'   => __( 'Metro', 'premium-addons-for-elementor' ),
				),
				'default' => 'fitRows',
			)
		);

		$this->add_responsive_control(
			'pemium_gallery_even_img_height',
			array(
				'label'       => __( 'Height', 'premium-addons-for-elementor' ),
				'label_block' => true,
				'size_units'  => array( 'px', 'em', 'vh' ),
				'type'        => Controls_Manager::SLIDER,
				'range'       => array(
					'px' => array(
						'min' => 1,
						'max' => 500,
					),
					'em' => array(
						'min' => 1,
						'max' => 50,
					),
				),
				'render_type' => 'template',
				'condition'   => array(
					'premium_gallery_img_size_select' => 'fitRows',
				),
				'selectors'   => array(
					'{{WRAPPER}} .pa-gallery-img-container img' => 'height: {{SIZE}}{{UNIT}}',
				),
			)
		);

		$this->add_control(
			'premium_gallery_images_fit',
			array(
				'label'     => __( 'Images Fit', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::SELECT,
				'options'   => array(
					'fill'  => __( 'Fill', 'premium-addons-for-elementor' ),
					'cover' => __( 'Cover', 'premium-addons-for-elementor' ),
				),
				'default'   => 'fill',
				'selectors' => array(
					'{{WRAPPER}} .pa-gallery-img-container img'  => 'object-fit: {{VALUE}}',
				),
				'condition' => array(
					'premium_gallery_img_size_select' => array( 'metro', 'fitRows' ),
				),
			)
		);

		$this->add_group_control(
			Group_Control_Image_Size::get_type(),
			array(
				'name'    => 'thumbnail',
				'default' => 'full',
			)
		);

		$this->add_responsive_control(
			'premium_gallery_column_number',
			array(
				'label'           => __( 'Columns', 'premium-addons-for-elementor' ),
				'label_block'     => true,
				'type'            => Controls_Manager::SELECT,
				'desktop_default' => '50%',
				'tablet_default'  => '100%',
				'mobile_default'  => '100%',
				'options'         => array(
					'100%'    => __( '1 Column', 'premium-addons-for-elementor' ),
					'50%'     => __( '2 Columns', 'premium-addons-for-elementor' ),
					'33.330%' => __( '3 Columns', 'premium-addons-for-elementor' ),
					'25%'     => __( '4 Columns', 'premium-addons-for-elementor' ),
					'20%'     => __( '5 Columns', 'premium-addons-for-elementor' ),
					'16.66%'  => __( '6 Columns', 'premium-addons-for-elementor' ),
					'8.33%'   => __( '12 Columns', 'premium-addons-for-elementor' ),
				),
				'condition'       => array(
					'premium_gallery_img_size_select!' => 'metro',
				),
				'selectors'       => array(
					'{{WRAPPER}} .premium-img-gallery-masonry div.premium-gallery-item, {{WRAPPER}} .premium-img-gallery-fitRows div.premium-gallery-item' => 'width: {{VALUE}};',
				),
				'render_type'     => 'template',
			)
		);

		$this->add_control(
			'premium_gallery_load_more',
			array(
				'label'       => __( 'Load More Button', 'premium-addons-for-elementor' ),
				'description' => __( 'Requires number of images larger than 6', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::SWITCHER,
				'condition'   => array(
					'premium_gallery_shuffle_onload!' => 'yes',
				),
			)
		);

		$this->add_control(
			'premium_gallery_load_more_text',
			array(
				'label'     => __( 'Button Text', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::TEXT,
				'default'   => __( 'Load More', 'premium-addons-for-elementor' ),
				'dynamic'   => array( 'active' => true ),
				'condition' => array(
					'premium_gallery_load_more' => 'yes',
				),
				'ai'          => array(
					'active' => false,
				),
			)
		);

		$this->add_control(
			'premium_gallery_load_minimum',
			array(
				'label'       => __( 'Initial Number of Images', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::NUMBER,
				'description' => __( 'Set the minimum number of images before showing load more button', 'premium-addons-for-elementor' ),
				'default'     => 6,
				'condition'   => array(
					'premium_gallery_load_more' => 'yes',
				),
			)
		);

		$this->add_control(
			'premium_gallery_load_click_number',
			array(
				'label'       => __( 'Images to Show', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::NUMBER,
				'description' => __( 'Set the minimum number of images to show with each click', 'premium-addons-for-elementor' ),
				'default'     => 6,
				'condition'   => array(
					'premium_gallery_load_more' => 'yes',
				),
			)
		);

		$this->add_responsive_control(
			'premium_gallery_load_more_align',
			array(
				'label'     => __( 'Button Alignment', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::CHOOSE,
				'options'   => array(
					'left'   => array(
						'title' => __( 'Left', 'premium-addons-for-elementor' ),
						'icon'  => 'eicon-text-align-left',
					),
					'center' => array(
						'title' => __( 'Center', 'premium-addons-for-elementor' ),
						'icon'  => 'eicon-text-align-center',
					),
					'right'  => array(
						'title' => __( 'Right', 'premium-addons-for-elementor' ),
						'icon'  => 'eicon-text-align-right',
					),
				),
				'default'   => 'center',
				'selectors' => array(
					'{{WRAPPER}} .premium-gallery-load-more' => 'text-align: {{VALUE}};',
				),
				'condition' => array(
					'premium_gallery_load_more' => 'yes',
				),
			)
		);

		$this->add_control(
			'gradient_layer',
			array(
				'label'       => __( 'Gradient Layer', 'premium-addons-for-elementor' ),
				'description' => __( 'Adds a gradient color on top of the grid container', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::SWITCHER,
				'condition'   => array(
					'premium_gallery_load_more' => 'yes',
				),
			)
		);

		$this->add_group_control(
			Premium_Background::get_type(),
			array(
				'name'      => 'gradient_color',
				'types'     => array( 'gradient' ),
				'selector'  => '{{WRAPPER}} .premium-gallery-gradient-layer',
				'condition' => array(
					'premium_gallery_load_more' => 'yes',
					'gradient_layer'            => 'yes',
				),
			)
		);

		$this->add_responsive_control(
			'gradient_height',
			array(
				'label'       => __( 'Height', 'premium-addons-for-elementor' ),
				'label_block' => true,
				'size_units'  => array( 'px', 'em', '%', 'custom' ),
				'type'        => Controls_Manager::SLIDER,
				'range'       => array(
					'px' => array(
						'min' => 1,
						'max' => 300,
					),
					'em' => array(
						'min' => 1,
						'max' => 30,
					),
				),
				'condition'   => array(
					'premium_gallery_load_more' => 'yes',
					'gradient_layer'            => 'yes',
				),
				'selectors'   => array(
					'{{WRAPPER}} .premium-gallery-gradient-layer' => 'height: {{SIZE}}{{UNIT}}',
				),
			)
		);

		$this->add_responsive_control(
			'gradient_position',
			array(
				'label'       => __( 'Position', 'premium-addons-for-elementor' ),
				'label_block' => true,
				'size_units'  => array( 'px', 'em', '%', 'custom' ),
				'type'        => Controls_Manager::SLIDER,
				'condition'   => array(
					'premium_gallery_load_more' => 'yes',
					'gradient_layer'            => 'yes',
				),
				'selectors'   => array(
					'{{WRAPPER}} .premium-gallery-gradient-layer' => 'bottom: {{SIZE}}{{UNIT}}',
				),
			)
		);

		$this->end_controls_section();

		$this->start_controls_section(
			'premium_gallery_cats',
			array(
				'label' => __( 'Categories', 'premium-addons-for-elementor' ),
			)
		);

		$this->add_control(
			'premium_gallery_filter',
			array(
				'label'   => __( 'Filter Tabs', 'premium-addons-for-elementor' ),
				'type'    => Controls_Manager::SWITCHER,
				'default' => 'yes',
			)
		);

		$condition = array( 'premium_gallery_filter' => 'yes' );

		$this->add_control(
			'premium_gallery_first_cat_switcher',
			array(
				'label'     => __( 'First Category', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::SWITCHER,
				'default'   => 'yes',
				'condition' => $condition,
			)
		);

		$this->add_control(
			'premium_gallery_first_cat_label',
			array(
				'label'     => __( 'First Category Label', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::TEXT,
				'default'   => __( 'All', 'premium-addons-for-elementor' ),
				'dynamic'   => array( 'active' => true ),
				'condition' => array_merge(
					array(
						'premium_gallery_first_cat_switcher' => 'yes',
					),
					$condition
				),
				'ai'          => array(
					'active' => false,
				),
			)
		);

		$repeater = new REPEATER();

		$repeater->add_control(
			'premium_gallery_img_cat',
			array(
				'label'   => __( 'Category', 'premium-addons-for-elementor' ),
				'type'    => Controls_Manager::TEXT,
				'dynamic' => array( 'active' => true ),
				'ai'          => array(
					'active' => false,
				),
			)
		);

		$repeater->add_control(
			'premium_gallery_img_cat_rotation',
			array(
				'label'       => __( 'Rotation Degrees', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::NUMBER,
				'description' => __( 'Set rotation value in degrees', 'premium-addons-for-elementor' ),
				'min'         => -180,
				'max'         => 180,
				'selectors'   => array(
					'{{WRAPPER}} {{CURRENT_ITEM}}' => 'transform: rotate({{VALUE}}deg);',
				),
			)
		);

		$this->add_control(
			'premium_gallery_cats_content',
			array(
				'label'       => __( 'Categories', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::REPEATER,
				'default'     => array(
					array(
						'premium_gallery_img_cat' => 'Category 1',
					),
					array(
						'premium_gallery_img_cat' => 'Category 2',
					),
				),
				'fields'      => $repeater->get_controls(),
				'title_field' => '{{{ premium_gallery_img_cat }}}',
				'condition'   => $condition,
			)
		);

		$this->add_control(
			'premium_gallery_active_cat',
			array(
				'label'     => __( 'Active Category Index', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::NUMBER,
				'default'   => 0,
				'min'       => 0,
				'condition' => $condition,

			)
		);

		$this->add_control(
			'active_cat_notice',
			array(
				'raw'             => __( 'Please note categories are zero indexed, so if you need the first category to be active, you need to set the value to 0', 'premium-addons-for-elementor' ),
				'type'            => Controls_Manager::RAW_HTML,
				'content_classes' => 'elementor-panel-alert elementor-panel-alert-info',
				'condition'       => $condition,
			)
		);

		$this->add_control(
			'premium_gallery_shuffle',
			array(
				'label'     => __( 'Shuffle Images on Filter Click', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::SWITCHER,
				'condition' => array_merge(
					array(
						'premium_gallery_filter' => 'yes',
					),
					$condition
				),
			)
		);

		$this->add_responsive_control(
			'premium_gallery_filters_align',
			array(
				'label'     => __( 'Alignment', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::CHOOSE,
				'options'   => array(
					'flex-start' => array(
						'title' => __( 'Left', 'premium-addons-for-elementor' ),
						'icon'  => 'eicon-text-align-left',
					),
					'center'     => array(
						'title' => __( 'Center', 'premium-addons-for-elementor' ),
						'icon'  => 'eicon-text-align-center',
					),
					'flex-end'   => array(
						'title' => __( 'Right', 'premium-addons-for-elementor' ),
						'icon'  => 'eicon-text-align-right',
					),
				),
				'default'   => 'center',
				'selectors' => array(
					'{{WRAPPER}} .premium-img-gallery-filter' => 'justify-content: {{VALUE}}',
				),
				'condition' => $condition,
			)
		);

		$this->add_control(
			'url_flag',
			array(
				'label'       => __( 'URL Flag', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::TEXT,
				'default'     => 'cat',
				'description' => __( 'This is used to link categories from different pages. For example: premiumaddons.com/elementor-grid-widget?cat=2', 'premium-addons-for-elementor' ),
				'label_block' => true,
				'condition'   => $condition,
				'ai'          => array(
					'active' => false,
				),
			)
		);

		$this->end_controls_section();

		$this->start_controls_section(
			'premium_gallery_content',
			array(
				'label' => __( 'Images/Videos', 'premium-addons-for-elementor' ),
			)
		);

		$img_repeater = new REPEATER();

		$img_repeater->add_control(
			'premium_gallery_img',
			array(
				'label'   => __( 'Upload Image', 'premium-addons-for-elementor' ),
				'type'    => Controls_Manager::MEDIA,
				'dynamic' => array( 'active' => true ),
				'default' => array(
					'url' => Utils::get_placeholder_image_src(),
				),
			)
		);

		$img_repeater->add_responsive_control(
			'premium_gallery_image_cell',
			array(
				'label'              => __( 'Width', 'premium-addons-for-elementor' ),
				'description'        => __( 'Works only when layout set to Metro', 'premium-addons-for-elementor' ),
				'label_block'        => true,
				'default'            => array(
					'unit' => 'px',
					'size' => 4,
				),
				'type'               => Controls_Manager::SLIDER,
				'range'              => array(
					'px' => array(
						'min' => 1,
						'max' => 12,
					),
				),
				'render_type'        => 'template',
				'frontend_available' => true,
			)
		);

		$img_repeater->add_responsive_control(
			'premium_gallery_image_vcell',
			array(
				'label'              => __( 'Height', 'premium-addons-for-elementor' ),
				'description'        => __( 'Works only when layout set to \'Metro\'', 'premium-addons-for-elementor' ),
				'label_block'        => true,
				'type'               => Controls_Manager::SLIDER,
				'default'            => array(
					'unit' => 'px',
					'size' => 4,
				),
				'range'              => array(
					'px' => array(
						'min' => 1,
						'max' => 12,
					),
				),
				'render_type'        => 'template',
				'frontend_available' => true,
			)
		);

		$img_repeater->add_control(
			'premium_gallery_video',
			array(
				'label'        => __( 'Video', 'premium-addons-for-elementor' ),
				'type'         => Controls_Manager::SWITCHER,
				'return_value' => 'true',
			)
		);

		$img_repeater->add_control(
			'premium_gallery_video_type',
			array(
				'label'       => __( 'Type', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::SELECT,
				'options'     => array(
					'youtube' => __( 'YouTube', 'premium-addons-for-elementor' ),
					'vimeo'   => __( 'Vimeo', 'premium-addons-for-elementor' ),
					'hosted'  => __( 'Self Hosted', 'premium-addons-for-elementor' ),
				),
				'label_block' => true,
				'default'     => 'youtube',
				'condition'   => array(
					'premium_gallery_video' => 'true',
				),
			)
		);

		$img_repeater->add_control(
			'premium_gallery_video_url',
			array(
				'label'       => __( 'Video URL', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::TEXT,
				'label_block' => true,
				'dynamic'     => array(
					'active'     => true,
					'categories' => array(
						TagsModule::POST_META_CATEGORY,
						TagsModule::URL_CATEGORY,
					),
				),
				'condition'   => array(
					'premium_gallery_video'       => 'true',
					'premium_gallery_video_type!' => 'hosted',
				),
				'ai'          => array(
					'active' => false,
				),
			)
		);

		$img_repeater->add_control(
			'premium_gallery_video_self',
			array(
				'label'      => __( 'Select Video', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::MEDIA,
				'dynamic'    => array(
					'active'     => true,
					'categories' => array(
						TagsModule::POST_META_CATEGORY,
						TagsModule::URL_CATEGORY,
					),
				),
				'media_type' => 'video',
				'condition'  => array(
					'premium_gallery_video'      => 'true',
					'premium_gallery_video_type' => 'hosted',
				),
			)
		);

		$img_repeater->add_control(
			'premium_gallery_video_self_url',
			array(
				'label'       => __( 'Remote Video URL', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::TEXT,
				'dynamic'     => array(
					'active' => true,
				),
				'label_block' => true,
				'condition'   => array(
					'premium_gallery_video'      => 'true',
					'premium_gallery_video_type' => 'hosted',
				),
				'ai'          => array(
					'active' => false,
				),
			)
		);

		$img_repeater->add_control(
			'premium_gallery_video_controls',
			array(
				'label'        => __( 'Controls', 'premium-addons-for-elementor' ),
				'type'         => Controls_Manager::SWITCHER,
				'return_value' => 'true',
				'default'      => 'true',
				'condition'    => array(
					'premium_gallery_video' => 'true',
				),
			)
		);

		$img_repeater->add_control(
			'premium_gallery_video_mute',
			array(
				'label'        => __( 'Mute', 'premium-addons-for-elementor' ),
				'type'         => Controls_Manager::SWITCHER,
				'return_value' => 'true',
				'condition'    => array(
					'premium_gallery_video' => 'true',
				),
			)
		);

		$img_repeater->add_control(
			'premium_gallery_video_loop',
			array(
				'label'        => __( 'Loop', 'premium-addons-for-elementor' ),
				'type'         => Controls_Manager::SWITCHER,
				'return_value' => 'true',
				'condition'    => array(
					'premium_gallery_video' => 'true',
				),
			)
		);

		$img_repeater->add_control(
			'download_button',
			array(
				'label'     => __( 'Download Button', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::SWITCHER,
				'condition' => array(
					'premium_gallery_video'      => 'true',
					'premium_gallery_video_type' => 'hosted',
				),
			)
		);

		$img_repeater->add_control(
			'privacy_mode',
			array(
				'label'       => __( 'Privacy Mode', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::SWITCHER,
				'description' => __( 'When turned on, YouTube won\'t store information about visitors on your website unless they play the video.', 'premium-addons-for-elementor' ),
				'condition'   => array(
					'premium_gallery_video'      => 'true',
					'premium_gallery_video_type' => 'youtube',
				),
			)
		);

		$img_repeater->add_control(
			'premmium_gallery_img_info',
			array(
				'label' => __( 'Get Title/Description From Media Library', 'premium-addons-for-elementor' ),
				'type'  => Controls_Manager::SWITCHER,
			)
		);

		$img_repeater->add_control(
			'premium_gallery_img_name',
			array(
				'label'       => __( 'Title', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::TEXT,
				'dynamic'     => array( 'active' => true ),
				'label_block' => true,
				'condition'   => array(
					'premmium_gallery_img_info!' => 'yes',
				),
				'ai'          => array(
					'active' => false,
				),
			)
		);

		$img_repeater->add_control(
			'premium_gallery_img_desc',
			array(
				'label'       => __( 'Description', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::TEXTAREA,
				'dynamic'     => array( 'active' => true ),
				'label_block' => true,
				'condition'   => array(
					'premmium_gallery_img_info!' => 'yes',
				),
				'ai'          => array(
					'active' => false,
				),
			)
		);

		$img_repeater->add_control(
			'premium_gallery_img_category',
			array(
				'label'       => __( 'Category', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::TEXT,
				'description' => __( 'To assign for multiple categories, separate by a comma \',\'', 'premium-addons-for-elementor' ),
				'dynamic'     => array( 'active' => true ),
				'ai'          => array(
					'active' => false,
				),
			)
		);

		$img_repeater->add_control(
			'premium_gallery_img_link_type',
			array(
				'label'       => __( 'Link Type', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::SELECT,
				'options'     => array(
					'url'  => __( 'URL', 'premium-addons-for-elementor' ),
					'link' => __( 'Existing Page', 'premium-addons-for-elementor' ),
				),
				'default'     => 'url',
				'label_block' => true,
				'condition'   => array(
					'premium_gallery_video!' => 'true',
				),
			)
		);

		$img_repeater->add_control(
			'premium_gallery_img_link',
			array(
				'label'       => __( 'Link', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::URL,
				'dynamic'     => array( 'active' => true ),
				'placeholder' => 'https://premiumaddons.com/',
				'label_block' => true,
				'condition'   => array(
					'premium_gallery_img_link_type' => 'url',
					'premium_gallery_video!'        => 'true',
				),
			)
		);

		$img_repeater->add_control(
			'premium_gallery_img_existing',
			array(
				'label'       => __( 'Existing Page', 'premium-addons-for-elementor' ),
				'type'        => Premium_Post_Filter::TYPE,
				'label_block' => true,
				'multiple'    => false,
				'separator'   => 'after',
				'source'      => array( 'post', 'page' ),
				'condition'   => array(
					'premium_gallery_img_link_type' => 'link',
					'premium_gallery_video!'        => 'true',
				),
			)
		);

		$img_repeater->add_control(
			'premium_gallery_link_whole',
			array(
				'label'     => __( 'Whole Image Link', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::SWITCHER,
				'condition' => array(
					'premium_gallery_video!' => 'true',
				),
			)
		);

		$img_repeater->add_control(
			'premium_gallery_lightbox_whole',
			array(
				'label'     => __( 'Whole Image Lightbox', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::SWITCHER,
				'condition' => array(
					'premium_gallery_video!' => 'true',
				),
			)
		);

		$this->add_control(
			'premium_gallery_img_content',
			array(
				'label'              => __( 'Images', 'premium-addons-for-elementor' ),
				'type'               => Controls_Manager::REPEATER,
				'default'            => array(
					array(
						'premium_gallery_img_name'     => 'Image #1',
						'premium_gallery_img_category' => 'Category 1',
					),
					array(
						'premium_gallery_img_name'     => 'Image #2',
						'premium_gallery_img_category' => 'Category 2',
					),
				),
				'frontend_available' => true,
				'fields'             => $img_repeater->get_controls(),
				'title_field'        => '{{{ "" !== premium_gallery_img_name ? premium_gallery_img_name : "Image" }}} - {{{ "" !== premium_gallery_img_category ? premium_gallery_img_category : "No Categories" }}}',
			)
		);

		$this->add_control(
			'premium_gallery_shuffle_onload',
			array(
				'label'     => __( 'Shuffle Images on Page Load', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::SWITCHER,
				'condition' => array(
					'premium_gallery_load_more!' => 'yes',
				),
			)
		);

		$this->add_control(
			'premium_gallery_yt_thumbnail_size',
			array(
				'label'       => __( 'Youtube Videos Thumbnail Size', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::SELECT,
				'options'     => array(
					'maxresdefault' => __( 'Maximum Resolution', 'premium-addons-for-elementor' ),
					'hqdefault'     => __( 'High Quality', 'premium-addons-for-elementor' ),
					'mqdefault'     => __( 'Medium Quality', 'premium-addons-for-elementor' ),
					'sddefault'     => __( 'Standard Quality', 'premium-addons-for-elementor' ),
				),
				'default'     => 'maxresdefault',
				'label_block' => true,
			)
		);

		$this->end_controls_section();

		$this->start_controls_section(
			'premium_gallery_grid_settings',
			array(
				'label' => __( 'Display Options', 'premium-addons-for-elementor' ),

			)
		);

		$this->add_responsive_control(
			'premium_gallery_gap',
			array(
				'label'      => __( 'Image Gap', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::SLIDER,
				'size_units' => array( 'px', '%', 'em' ),
				'range'      => array(
					'px' => array(
						'min' => 0,
						'max' => 200,
					),
				),
				'selectors'  => array(
					'{{WRAPPER}} .premium-gallery-item' => 'padding: {{SIZE}}{{UNIT}}',
				),
			)
		);

		$this->add_control(
			'premium_gallery_img_style',
			array(
				'label'       => __( 'Skin', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::SELECT,
				'description' => __( 'Choose a layout style for the gallery', 'premium-addons-for-elementor' ),
				'options'     => array(
					'default' => __( 'Style 1', 'premium-addons-for-elementor' ),
					'style1'  => __( 'Style 2', 'premium-addons-for-elementor' ),
					'style2'  => __( 'Style 3', 'premium-addons-for-elementor' ),
					'style3'  => __( 'Style 4', 'premium-addons-for-elementor' ),
				),
				'default'     => 'default',
				'separator'   => 'before',
				'label_block' => true,
			)
		);

		$this->add_control(
			'style_notice',
			array(
				'raw'             => __( 'You need to make sure that the grid items have title/description to see the skins.', 'premium-addons-for-elementor' ),
				'type'            => Controls_Manager::RAW_HTML,
				'content_classes' => 'elementor-panel-alert elementor-panel-alert-warning',
			)
		);

		$this->add_control(
			'premium_grid_style_notice',
			array(
				'raw'             => __( 'Style 4 works only with Even / Masonry Layout', 'premium-addons-for-elementor' ),
				'type'            => Controls_Manager::RAW_HTML,
				'content_classes' => 'elementor-panel-alert elementor-panel-alert-info',
				'condition'       => array(
					'premium_gallery_img_style'       => 'style3',
					'premium_gallery_img_size_select' => 'metro',
				),
			)
		);

		$this->add_responsive_control(
			'premium_gallery_style1_border_border',
			array(
				'label'       => __( 'Height', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::SLIDER,
				'range'       => array(
					'px' => array(
						'min' => 0,
						'max' => 700,
					),
				),
				'label_block' => true,
				'selectors'   => array(
					'{{WRAPPER}} .pa-gallery-img.style1 .premium-gallery-caption' => 'bottom: {{SIZE}}px;',
				),
				'condition'   => array(
					'premium_gallery_img_style' => 'style1',
				),
			)
		);

		$this->add_control(
			'premium_gallery_img_effect',
			array(
				'label'       => __( 'Hover Effect', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::SELECT,
				'description' => __( 'Choose a hover effect for the image', 'premium-addons-for-elementor' ),
				'options'     => array(
					'none'    => __( 'None', 'premium-addons-for-elementor' ),
					'zoomin'  => __( 'Zoom In', 'premium-addons-for-elementor' ),
					'zoomout' => __( 'Zoom Out', 'premium-addons-for-elementor' ),
					'scale'   => __( 'Scale', 'premium-addons-for-elementor' ),
					'gray'    => __( 'Grayscale', 'premium-addons-for-elementor' ),
					'blur'    => __( 'Blur', 'premium-addons-for-elementor' ),
					'bright'  => __( 'Bright', 'premium-addons-for-elementor' ),
					'sepia'   => __( 'Sepia', 'premium-addons-for-elementor' ),
					'trans'   => __( 'Translate', 'premium-addons-for-elementor' ),
				),
				'default'     => 'zoomin',
				'label_block' => true,
				'separator'   => 'after',
			)
		);

		$this->add_control(
			'premium_gallery_links_icon',
			array(
				'label'   => __( 'Links Icon', 'premium-addons-for-elementor' ),
				'type'    => Controls_Manager::ICONS,
				'default' => array(
					'library' => 'fa-solid',
					'value'   => 'fas fa-link',
				),
			)
		);

		$this->add_control(
			'premium_gallery_videos_heading',
			array(
				'label'     => __( 'Videos', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::HEADING,
				'separator' => 'before',
			)
		);

		$this->add_control(
			'premium_gallery_video_icon',
			array(
				'label'        => __( 'Always Show Play Icon', 'premium-addons-for-elementor' ),
				'type'         => Controls_Manager::SWITCHER,
				'return_value' => 'true',
				'default'      => 'true',
				'condition'    => array(
					'premium_gallery_img_style!' => 'style2',
				),

			)
		);

		$this->add_control(
			'premium_gallery_videos_icon',
			array(
				'label'   => __( 'Videos Play Icon', 'premium-addons-for-elementor' ),
				'type'    => Controls_Manager::ICONS,
				'default' => array(
					'library' => 'fa-solid',
					'value'   => 'fas fa-play',
				),
			)
		);

		$this->add_control(
			'premium_gallery_rtl_mode',
			array(
				'label'       => __( 'RTL Mode', 'premium-addons-for-elementor' ),
				'description' => __( 'This option moves the origin of the grid to the right side. Useful for RTL direction sites', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::SWITCHER,
				'separator'   => 'before',
			)
		);

		$this->add_responsive_control(
			'premium_gallery_content_align',
			array(
				'label'     => __( 'Content Alignment', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::CHOOSE,
				'options'   => array(
					'left'   => array(
						'title' => __( 'Left', 'premium-addons-for-elementor' ),
						'icon'  => 'eicon-text-align-left',
					),
					'center' => array(
						'title' => __( 'Center', 'premium-addons-for-elementor' ),
						'icon'  => 'eicon-text-align-center',
					),
					'right'  => array(
						'title' => __( 'Right', 'premium-addons-for-elementor' ),
						'icon'  => 'eicon-text-align-right',
					),
				),
				'default'   => 'center',
				'separator' => 'before',
				'selectors' => array(
					'{{WRAPPER}} .premium-gallery-caption' => 'text-align: {{VALUE}};',
				),
			)
		);

		$this->end_controls_section();

		$this->start_controls_section(
			'premium_gallery_lightbox_section',
			array(
				'label' => __( 'Lightbox', 'premium-addons-for-elementor' ),
			)
		);

		$this->add_control(
			'premium_gallery_light_box',
			array(
				'label'     => __( 'Lightbox', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::SWITCHER,
				'default'   => 'yes',
				'separator' => 'before',
			)
		);

		$this->add_control(
			'premium_gallery_lightbox_type',
			array(
				'label'     => __( 'Lightbox Style', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::SELECT,
				'default'   => 'default',
				'options'   => array(
					'default' => __( 'PrettyPhoto', 'premium-addons-for-elementor' ),
					'yes'     => __( 'Elementor', 'premium-addons-for-elementor' ),
					'no'      => __( 'Other Lightbox Plugin', 'premium-addons-for-elementor' ),
				),
				'condition' => array(
					'premium_gallery_light_box' => 'yes',
				),
			)
		);

		$this->add_control(
			'lightbox_show_title',
			array(
				'label'     => __( 'Show Image Title', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::SWITCHER,
				'default'   => 'yes',
				'condition' => array(
					'premium_gallery_light_box'     => 'yes',
					'premium_gallery_lightbox_type' => 'yes',
				),
			)
		);

		$this->add_control(
			'premium_gallery_lightbox_theme',
			array(
				'label'     => __( 'Lightbox Theme', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::SELECT,
				'options'   => array(
					'pp_default'    => __( 'Default', 'premium-addons-for-elementor' ),
					'light_rounded' => __( 'Light Rounded', 'premium-addons-for-elementor' ),
					'dark_rounded'  => __( 'Dark Rounded', 'premium-addons-for-elementor' ),
					'light_square'  => __( 'Light Square', 'premium-addons-for-elementor' ),
					'dark_square'   => __( 'Dark Square', 'premium-addons-for-elementor' ),
					'facebook'      => __( 'Facebook', 'premium-addons-for-elementor' ),
				),
				'default'   => 'pp_default',
				'condition' => array(
					'premium_gallery_light_box'     => 'yes',
					'premium_gallery_lightbox_type' => 'default',
				),
			)
		);

		$this->add_control(
			'premium_gallery_overlay_gallery',
			array(
				'label'     => __( 'Overlay Gallery Images', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::SWITCHER,
				'condition' => array(
					'premium_gallery_light_box'     => 'yes',
					'premium_gallery_lightbox_type' => 'default',
				),
			)
		);

		$this->add_control(
			'premium_gallery_lightbox_icon',
			array(
				'label'     => __( 'Lightbox Icon', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::ICONS,
				'default'   => array(
					'library' => 'fa-solid',
					'value'   => 'fas fa-search',
				),
				'condition' => array(
					'premium_gallery_light_box' => 'yes',
				),
			)
		);

		$this->end_controls_section();

		$this->start_controls_section(
			'premium_gallery_responsive_section',
			array(
				'label' => __( 'Responsive', 'premium-addons-for-elementor' ),
			)
		);

		$this->add_control(
			'premium_gallery_responsive_switcher',
			array(
				'label'       => __( 'Responsive Controls', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::SWITCHER,
				'description' => __( 'If the content text is not suiting well on specific screen sizes, you may enable this option which will hide the description text.', 'premium-addons-for-elementor' ),
			)
		);

		$this->add_control(
			'premium_gallery_min_range',
			array(
				'label'       => __( 'Minimum Size', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::NUMBER,
				'description' => __( 'Note: minimum size for extra small screens is 1px.', 'premium-addons-for-elementor' ),
				'default'     => 1,
				'condition'   => array(
					'premium_gallery_responsive_switcher' => 'yes',
				),
			)
		);

		$this->add_control(
			'premium_gallery_max_range',
			array(
				'label'       => __( 'Maximum Size', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::NUMBER,
				'description' => __( 'Note: maximum size for extra small screens is 767px.', 'premium-addons-for-elementor' ),
				'default'     => 767,
				'condition'   => array(
					'premium_gallery_responsive_switcher' => 'yes',
				),
			)
		);

		$this->end_controls_section();

		$this->start_controls_section(
			'section_pa_docs',
			array(
				'label' => __( 'Help & Docs', 'premium-addons-for-elementor' ),
			)
		);

		$docs = array(
			'https://premiumaddons.com/docs/grid-widget-tutorial' => __( 'Getting started »', 'premium-addons-for-elementor' ),
			'https://premiumaddons.com/docs/how-to-assign-an-image-to-multiple-categories' => __( 'How to assign a grid item to multiple categories »', 'premium-addons-for-elementor' ),
			'https://premiumaddons.com/docs/how-to-link-categories-in-elementor-gallery-widget/' => __( 'How To Link Categories In Media Grid Widget »', 'premium-addons-for-elementor' ),
			'https://premiumaddons.com/docs/how-to-open-a-popup-lightbox-through-a-grid-image' => __( 'How to open an Elementor popup/lightbox using a grid item »', 'premium-addons-for-elementor' ),
			'https://premiumaddons.com/docs/how-to-solve-media-grid-and-tabs-widgets-conflict/'  => __( 'How to Solve Media Grid and Tabs Widgets Conflict »', 'premium-addons-for-elementor' ),
		);

		$doc_index = 1;
		foreach ( $docs as $url => $title ) {

			$doc_url = Helper_Functions::get_campaign_link( $url, 'grid-widget', 'wp-editor', 'get-support' );

			$this->add_control(
				'doc_' . $doc_index,
				array(
					'type'            => Controls_Manager::RAW_HTML,
					'raw'             => sprintf( '<a href="%s" target="_blank">%s</a>', $doc_url, $title ),
					'content_classes' => 'editor-pa-doc',
				)
			);

			++$doc_index;

		}

		Helper_Functions::register_element_feedback_controls( $this );

		$this->end_controls_section();

		Helper_Functions::register_papro_promotion_controls( $this, 'grid' );

		$this->start_controls_section(
			'premium_gallery_img_style_section',
			array(
				'label' => __( 'Image', 'premium-addons-for-elementor' ),
				'tab'   => Controls_Manager::TAB_STYLE,
			)
		);

		$this->add_control(
			'premium_gallery_icons_style_overlay',
			array(
				'label'     => __( 'Hover Overlay Color', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::COLOR,
				'selectors' => array(
					'{{WRAPPER}} .pa-gallery-img:not(.style2):hover .pa-gallery-icons-wrapper, {{WRAPPER}} .pa-gallery-img .pa-gallery-icons-caption-container, {{WRAPPER}} .pa-gallery-img:hover .pa-gallery-icons-caption-container' => 'background-color: {{VALUE}};',
				),
			)
		);

		$this->add_group_control(
			Group_Control_Border::get_type(),
			array(
				'name'     => 'premium_gallery_img_border',
				'selector' => '{{WRAPPER}} .pa-gallery-img-container',
			)
		);

		$this->add_control(
			'premium_gallery_img_border_radius',
			array(
				'label'      => __( 'Border Radius', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::DIMENSIONS,
				'size_units' => array( 'px', '%', 'em' ),
				'selectors'  => array(
					'{{WRAPPER}} .pa-gallery-img-container, {{WRAPPER}} .pa-gallery-img:not(.style2) .pa-gallery-icons-wrapper, {{WRAPPER}} .pa-gallery-img.style2 .pa-gallery-icons-caption-container' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}}',
				),
			)
		);

		$this->add_group_control(
			Group_Control_Box_Shadow::get_type(),
			array(
				'label'     => __( 'Shadow', 'premium-addons-for-elementor' ),
				'name'      => 'premium_gallery_img_box_shadow',
				'selector'  => '{{WRAPPER}} .pa-gallery-img-container',
				'condition' => array(
					'premium_gallery_img_style!' => 'style1',
				),
			)
		);

		$this->add_group_control(
			Group_Control_Css_Filter::get_type(),
			array(
				'name'     => 'css_filters',
				'selector' => '{{WRAPPER}} .pa-gallery-img-container img',
			)
		);

		$this->add_group_control(
			Group_Control_Css_Filter::get_type(),
			array(
				'label'    => __( 'Hover CSS Filters', 'premium-addons-for-elementor' ),
				'name'     => 'hover_css_filters',
				'selector' => '{{WRAPPER}} .premium-gallery-item:hover img',
			)
		);

		$this->add_responsive_control(
			'premium_gallery_img_margin',
			array(
				'label'      => __( 'Margin', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::DIMENSIONS,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .pa-gallery-img-container' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}}',
				),
			)
		);

		$this->add_responsive_control(
			'premium_gallery_img_padding',
			array(
				'label'      => __( 'Padding', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::DIMENSIONS,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .pa-gallery-img-container' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}}',
				),
			)
		);

		$this->end_controls_section();

		$this->start_controls_section(
			'premium_gallery_content_style',
			array(
				'label' => __( 'Title / Description', 'premium-addons-for-elementor' ),
				'tab'   => Controls_Manager::TAB_STYLE,
			)
		);

		$this->add_control(
			'premium_gallery_title_heading',
			array(
				'label' => __( 'Title', 'premium-addons-for-elementor' ),
				'type'  => Controls_Manager::HEADING,
			)
		);

		$this->add_control(
			'premium_gallery_title_color',
			array(
				'label'     => __( 'Color', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::COLOR,
				'global'    => array(
					'default' => Global_Colors::COLOR_SECONDARY,
				),
				'selectors' => array(
					'{{WRAPPER}} .premium-gallery-img-name, {{WRAPPER}} .premium-gallery-img-name a' => 'color: {{VALUE}};',
				),
			)
		);

		$this->add_group_control(
			Group_Control_Typography::get_type(),
			array(
				'name'     => 'premium_gallery_title_typo',
				'global'   => array(
					'default' => Global_Typography::TYPOGRAPHY_PRIMARY,
				),
				'selector' => '{{WRAPPER}} .premium-gallery-img-name, {{WRAPPER}} .premium-gallery-img-name a',
			)
		);

		$this->add_responsive_control(
			'title_spacing',
			array(
				'label'     => __( 'Spacing', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::SLIDER,
				'selectors' => array(
					'{{WRAPPER}} .premium-gallery-img-name'  => 'margin-bottom: {{SIZE}}px',
				),
			)
		);

		$this->add_control(
			'premium_gallery_description_heading',
			array(
				'label'     => __( 'Description', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::HEADING,
				'separator' => 'before',
			)
		);

		$this->add_control(
			'premium_gallery_description_color',
			array(
				'label'     => __( 'Color', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::COLOR,
				'global'    => array(
					'default' => Global_Colors::COLOR_TEXT,
				),
				'selectors' => array(
					'{{WRAPPER}} .premium-gallery-img-desc, {{WRAPPER}} .premium-gallery-img-desc a' => 'color: {{VALUE}};',
				),
			)
		);

		$this->add_group_control(
			Group_Control_Typography::get_type(),
			array(
				'name'     => 'premium_gallery_description_typo',
				'global'   => array(
					'default' => Global_Typography::TYPOGRAPHY_PRIMARY,
				),
				'selector' => '{{WRAPPER}} .premium-gallery-img-desc, {{WRAPPER}} .premium-gallery-img-desc a',
			)
		);

		$this->add_control(
			'container_heading',
			array(
				'label'     => __( 'Container', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::HEADING,
				'separator' => 'before',
			)
		);

		$this->add_group_control(
			Premium_Background::get_type(),
			array(
				'name'     => 'premium_gallery_content_background',
				'types'    => array( 'classic', 'gradient' ),
				'selector' => '{{WRAPPER}} .premium-gallery-caption',
			)
		);

		$this->add_group_control(
			Group_Control_Border::get_type(),
			array(
				'name'     => 'premium_gallery_content_border',
				'selector' => '{{WRAPPER}} .premium-gallery-caption',
			)
		);

		$this->add_control(
			'premium_gallery_content_border_radius',
			array(
				'label'      => __( 'Border Radius', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::DIMENSIONS,
				'size_units' => array( 'px', '%', 'em' ),
				'selectors'  => array(
					'{{WRAPPER}} .premium-gallery-caption' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}}',
				),
			)
		);

		$this->add_group_control(
			Group_Control_Text_Shadow::get_type(),
			array(
				'label'    => __( 'Shadow', 'premium-addons-for-elementor' ),
				'name'     => 'premium_gallery_content_shadow',
				'selector' => '{{WRAPPER}} .premium-gallery-caption',
			)
		);

		$this->add_group_control(
			Group_Control_Box_Shadow::get_type(),
			array(
				'name'     => 'premium_gallery_content_box_shadow',
				'selector' => '{{WRAPPER}} .premium-gallery-caption',
			)
		);

		$this->add_responsive_control(
			'premium_gallery_content_margin',
			array(
				'label'      => __( 'Margin', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::DIMENSIONS,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .premium-gallery-caption' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}}',
				),
			)
		);

		$this->add_responsive_control(
			'premium_gallery_content_padding',
			array(
				'label'      => __( 'Padding', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::DIMENSIONS,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .premium-gallery-caption' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}}',
				),
			)
		);

		$this->end_controls_section();

		$this->start_controls_section(
			'premium_gallery_icons_style',
			array(
				'label' => __( 'Icons', 'premium-addons-for-elementor' ),
				'tab'   => Controls_Manager::TAB_STYLE,
			)
		);

		$this->add_responsive_control(
			'premium_gallery_style1_icons_position',
			array(
				'label'       => __( 'Position', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::SLIDER,
				'size_units'  => array( 'px', '%', 'em', 'custom' ),
				'range'       => array(
					'px' => array(
						'min' => 0,
						'max' => 300,
					),
				),
				'label_block' => true,
				'selectors'   => array(
					'{{WRAPPER}} .pa-gallery-img:not(.style2) .pa-gallery-icons-inner-container' => 'top: {{SIZE}}{{UNIT}};',
				),
				'condition'   => array(
					'premium_gallery_img_style!' => 'style2',
				),
			)
		);

		$this->add_responsive_control(
			'premium_gallery_icons_size',
			array(
				'label'       => __( 'Size', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::SLIDER,
				'size_units'  => array( 'px', 'em' ),
				'range'       => array(
					'px' => array(
						'min' => 1,
						'max' => 50,
					),
				),
				'label_block' => true,
				'selectors'   => array(
					'{{WRAPPER}} .pa-gallery-icons-inner-container i, {{WRAPPER}} .pa-gallery-icons-caption-cell i' => 'font-size: {{SIZE}}{{UNIT}}',
					'{{WRAPPER}} .pa-gallery-icons-inner-container svg, {{WRAPPER}} .pa-gallery-icons-caption-cell svg' => 'width: {{SIZE}}{{UNIT}}; height: {{SIZE}}{{UNIT}}',
				),
			)
		);

		$this->start_controls_tabs( 'premium_gallery_icons_style_tabs' );

		$this->start_controls_tab(
			'premium_gallery_icons_style_normal',
			array(
				'label' => __( 'Normal', 'premium-addons-for-elementor' ),
			)
		);

		$this->add_control(
			'premium_gallery_icons_style_color',
			array(
				'label'     => __( 'Color', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::COLOR,
				'global'    => array(
					'default' => Global_Colors::COLOR_PRIMARY,
				),
				'selectors' => array(
					'{{WRAPPER}} .pa-gallery-magnific-image i, {{WRAPPER}} .pa-gallery-img-link i' => 'color: {{VALUE}};',
					'{{WRAPPER}} .pa-gallery-magnific-image svg, {{WRAPPER}} .pa-gallery-img-link svg' => 'fill: {{VALUE}}; color: {{VALUE}}',
				),
			)
		);

		$this->add_control(
			'premium_gallery_icons_style_background',
			array(
				'label'     => __( 'Background Color', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::COLOR,
				'global'    => array(
					'default' => Global_Colors::COLOR_SECONDARY,
				),
				'selectors' => array(
					'{{WRAPPER}} .pa-gallery-magnific-image span, {{WRAPPER}} .pa-gallery-img-link span' => 'background-color: {{VALUE}};',
				),
			)
		);

		$this->add_group_control(
			Group_Control_Border::get_type(),
			array(
				'name'     => 'premium_gallery_icons_style_border',
				'selector' => '{{WRAPPER}} .pa-gallery-magnific-image span, {{WRAPPER}} .pa-gallery-img-link span',
			)
		);

		$this->add_control(
			'premium_gallery_icons_style_border_radius',
			array(
				'label'      => __( 'Border Radius', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::SLIDER,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .pa-gallery-magnific-image span, {{WRAPPER}} .pa-gallery-img-link span' => 'border-radius: {{SIZE}}{{UNIT}};',
				),
			)
		);

		$this->add_group_control(
			Group_Control_Box_Shadow::get_type(),
			array(
				'label'    => __( 'Shadow', 'premium-addons-for-elementor' ),
				'name'     => 'premium_gallery_icons_style_shadow',
				'selector' => '{{WRAPPER}} .pa-gallery-magnific-image span, {{WRAPPER}} .pa-gallery-img-link span',
			)
		);

		$this->add_responsive_control(
			'premium_gallery_icons_style_margin',
			array(
				'label'      => __( 'Margin', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::DIMENSIONS,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .pa-gallery-magnific-image span, {{WRAPPER}} .pa-gallery-img-link span' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
				),
			)
		);

		$this->add_responsive_control(
			'premium_gallery_icons_style_padding',
			array(
				'label'      => __( 'Padding', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::DIMENSIONS,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .pa-gallery-magnific-image span, {{WRAPPER}} .pa-gallery-img-link span' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
				),
			)
		);

		$this->end_controls_tab();

		$this->start_controls_tab(
			'premium_gallery_icons_style_hover',
			array(
				'label' => __( 'Hover', 'premium-addons-for-elementor' ),
			)
		);

		$this->add_control(
			'premium_gallery_icons_style_color_hover',
			array(
				'label'     => __( 'Color', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::COLOR,
				'global'    => array(
					'default' => Global_Colors::COLOR_PRIMARY,
				),
				'selectors' => array(
					'{{WRAPPER}} .pa-gallery-magnific-image:hover i, {{WRAPPER}} .pa-gallery-img-link:hover i' => 'color: {{VALUE}}',
					'{{WRAPPER}} .pa-gallery-magnific-image:hover svg, {{WRAPPER}} .pa-gallery-img-link:hover svg' => 'fill: {{VALUE}}; color: {{VALUE}}',
				),
			)
		);

		$this->add_control(
			'premium_gallery_icons_style_background_hover',
			array(
				'label'     => __( 'Background Color', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::COLOR,
				'global'    => array(
					'default' => Global_Colors::COLOR_SECONDARY,
				),
				'selectors' => array(
					'{{WRAPPER}} .pa-gallery-magnific-image:hover span, {{WRAPPER}} .pa-gallery-img-link:hover span' => 'background-color: {{VALUE}};',
				),
			)
		);

		$this->add_group_control(
			Group_Control_Border::get_type(),
			array(
				'name'     => 'premium_gallery_icons_style_border_hover',
				'selector' => '{{WRAPPER}} .pa-gallery-magnific-image:hover span, {{WRAPPER}} .pa-gallery-img-link:hover span',
			)
		);

		$this->add_control(
			'premium_gallery_icons_style_border_radius_hover',
			array(
				'label'      => __( 'Border Radius', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::SLIDER,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .pa-gallery-magnific-image:hover span, {{WRAPPER}} .pa-gallery-img-link:hover span' => 'border-radius: {{SIZE}}{{UNIT}};',
				),
			)
		);

		$this->add_group_control(
			Group_Control_Box_Shadow::get_type(),
			array(
				'label'    => __( 'Shadow', 'premium-addons-for-elementor' ),
				'name'     => 'premium_gallery_icons_style_shadow_hover',
				'selector' => '{{WRAPPER}} {{WRAPPER}} .pa-gallery-magnific-image:hover span, {{WRAPPER}} .pa-gallery-img-link:hover span',
			)
		);

		$this->add_responsive_control(
			'premium_gallery_icons_style_margin_hover',
			array(
				'label'      => __( 'Margin', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::DIMENSIONS,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .pa-gallery-magnific-image:hover span, {{WRAPPER}} .pa-gallery-img-link:hover span' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
				),
			)
		);

		$this->add_responsive_control(
			'premium_gallery_icons_style_padding_hover',
			array(
				'label'      => __( 'Padding', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::DIMENSIONS,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .pa-gallery-magnific-image:hover span, {{WRAPPER}} .pa-gallery-img-link:hover span' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
				),
			)
		);

		$this->end_controls_tab();

		$this->end_controls_tabs();

		$this->end_controls_section();

		$this->start_controls_section(
			'premium_gallery_filter_style',
			array(
				'label'     => __( 'Filter Tabs', 'premium-addons-for-elementor' ),
				'tab'       => Controls_Manager::TAB_STYLE,
				'condition' => array(
					'premium_gallery_filter' => 'yes',
				),
			)
		);

		$this->add_group_control(
			Group_Control_Typography::get_type(),
			array(
				'name'     => 'premium_gallery_filter_typo',
				'global'   => array(
					'default' => Global_Typography::TYPOGRAPHY_PRIMARY,
				),
				'selector' => '{{WRAPPER}} .premium-gallery-cats-container li a.category',
			)
		);

		$this->start_controls_tabs( 'premium_gallery_filters' );

		$this->start_controls_tab(
			'premium_gallery_filters_normal',
			array(
				'label' => __( 'Normal', 'premium-addons-for-elementor' ),
			)
		);

		$this->add_control(
			'premium_gallery_filter_color',
			array(
				'label'     => __( 'Text Color', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::COLOR,
				'global'    => array(
					'default' => Global_Colors::COLOR_SECONDARY,
				),
				'selectors' => array(
					'{{WRAPPER}} .premium-gallery-cats-container li a.category' => 'color: {{VALUE}};',
				),
			)
		);

		$this->add_control(
			'premium_gallery_background_color',
			array(
				'label'     => __( 'Background Color', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::COLOR,
				'selectors' => array(
					'{{WRAPPER}} .premium-gallery-cats-container li a.category' => 'background-color: {{VALUE}};',
				),
			)
		);

		$this->add_control(
			'filter_lq_effect',
			array(
				'label'       => __( 'Liquid Glass Effect', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::SELECT,
				'description' => sprintf(
					/* translators: 1: `<a>` opening tag, 2: `</a>` closing tag. */
					esc_html__( 'Important: Make sure this element has a semi-transparent background color to see the effect. See all presets from %1$shere%2$s.', 'premium-addons-for-elementor' ),
					'<a href="https://premiumaddons.com/liquid-glass/" target="_blank">',
					'</a>'
				),
				'options'     => array(
					'none'   => __( 'None', 'premium-addons-for-elementor' ),
					'glass1' => __( 'Preset 01', 'premium-addons-for-elementor' ),
					'glass2' => __( 'Preset 02', 'premium-addons-for-elementor' ),
					'glass3' => apply_filters( 'pa_pro_label', __( 'Preset 03 (Pro)', 'premium-addons-for-elementor' ) ),
					'glass4' => apply_filters( 'pa_pro_label', __( 'Preset 04 (Pro)', 'premium-addons-for-elementor' ) ),
					'glass5' => apply_filters( 'pa_pro_label', __( 'Preset 05 (Pro)', 'premium-addons-for-elementor' ) ),
					'glass6' => apply_filters( 'pa_pro_label', __( 'Preset 06 (Pro)', 'premium-addons-for-elementor' ) ),
				),
				'default'     => 'none',
				'label_block' => true,
			)
		);

		$this->add_group_control(
			Group_Control_Border::get_type(),
			array(
				'name'     => 'premium_gallery_filter_border',
				'selector' => '{{WRAPPER}} .premium-gallery-cats-container li a.category',
			)
		);

		$this->add_control(
			'premium_gallery_filter_border_radius',
			array(
				'label'      => __( 'Border Radius', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::SLIDER,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .premium-gallery-cats-container li a.category'  => 'border-radius: {{SIZE}}{{UNIT}};',
				),
				'condition'  => array(
					'filter_adv_radius!' => 'yes',
				),
			)
		);

		$this->add_control(
			'filter_adv_radius',
			array(
				'label'       => __( 'Advanced Border Radius', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::SWITCHER,
				'description' => __( 'Apply custom radius values. Get the radius value from ', 'premium-addons-for-elementor' ) . '<a href="https://9elements.github.io/fancy-border-radius/" target="_blank">here</a>' . __( '. See ', 'premium-addons-for-elementor' ) . '<a href="https://www.youtube.com/watch?v=S0BJazLHV-M" target="_blank">tutorial</a>',
			)
		);

		$this->add_control(
			'filter_adv_radius_value',
			array(
				'label'     => __( 'Border Radius', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::TEXT,
				'dynamic'   => array( 'active' => true ),
				'selectors' => array(
					'{{WRAPPER}} .premium-gallery-cats-container li a.category' => 'border-radius: {{VALUE}};',
				),
				'condition' => array(
					'filter_adv_radius' => 'yes',
				),
				'ai'          => array(
					'active' => false,
				),
			)
		);

		$this->end_controls_tab();

		$this->start_controls_tab(
			'premium_gallery_filters_hover',
			array(
				'label' => __( 'Hover', 'premium-addons-for-elementor' ),
			)
		);

		$this->add_control(
			'premium_gallery_filter_hover_color',
			array(
				'label'     => __( 'Text Color', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::COLOR,
				'selectors' => array(
					'{{WRAPPER}} .premium-gallery-cats-container li a:hover' => 'color: {{VALUE}};',
				),
			)
		);

		$this->add_control(
			'premium_gallery_background_hover_color',
			array(
				'label'     => __( 'Background Color', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::COLOR,
				'selectors' => array(
					'{{WRAPPER}} .premium-gallery-cats-container li a:hover' => 'background-color: {{VALUE}};',
				),
			)
		);

		$this->add_group_control(
			Group_Control_Border::get_type(),
			array(
				'name'     => 'premium_gallery_filter_border_hover',
				'selector' => '{{WRAPPER}} .premium-gallery-cats-container li a.category:hover',
			)
		);

		$this->add_control(
			'premium_gallery_filter_border_radius_hover',
			array(
				'label'      => __( 'Border Radius', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::SLIDER,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .premium-gallery-cats-container li a.category:hover'  => 'border-radius: {{SIZE}}{{UNIT}};',
				),
				'condition'  => array(
					'filter_hover_adv_radius!' => 'yes',
				),
			)
		);

		$this->add_control(
			'filter_hover_adv_radius',
			array(
				'label'       => __( 'Advanced Border Radius', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::SWITCHER,
				'description' => __( 'Apply custom radius values. Get the radius value from ', 'premium-addons-for-elementor' ) . '<a href="https://9elements.github.io/fancy-border-radius/" target="_blank">here</a>' . __( '. See ', 'premium-addons-for-elementor' ) . '<a href="https://www.youtube.com/watch?v=S0BJazLHV-M" target="_blank">tutorial</a>',
			)
		);

		$this->add_control(
			'filter_hover_adv_radius_value',
			array(
				'label'     => __( 'Border Radius', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::TEXT,
				'dynamic'   => array( 'active' => true ),
				'selectors' => array(
					'{{WRAPPER}} .premium-gallery-cats-container li a.category:hover' => 'border-radius: {{VALUE}};',
				),
				'condition' => array(
					'filter_hover_adv_radius' => 'yes',
				),
				'ai'          => array(
					'active' => false,
				),
			)
		);

		$this->end_controls_tab();

		$this->start_controls_tab(
			'premium_gallery_filters_active',
			array(
				'label' => __( 'Active', 'premium-addons-for-elementor' ),
			)
		);

		$this->add_control(
			'premium_gallery_filter_active_color',
			array(
				'label'     => __( 'Text Color', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::COLOR,
				'global'    => array(
					'default' => Global_Colors::COLOR_PRIMARY,
				),
				'selectors' => array(
					'{{WRAPPER}} .premium-gallery-cats-container li a.active' => 'color: {{VALUE}};',
				),
			)
		);

		$this->add_control(
			'premium_gallery_background_active_color',
			array(
				'label'     => __( 'Background Color', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::COLOR,
				'selectors' => array(
					'{{WRAPPER}} .premium-gallery-cats-container li a.active' => 'background-color: {{VALUE}};',
				),
			)
		);

		$this->add_group_control(
			Group_Control_Border::get_type(),
			array(
				'name'     => 'premium_gallery_filter_border_active',
				'selector' => '{{WRAPPER}} .premium-gallery-cats-container li a.active',
			)
		);

		$this->add_control(
			'premium_gallery_filter_border_radius_active',
			array(
				'label'      => __( 'Border Radius', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::SLIDER,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .premium-gallery-cats-container li a.active'  => 'border-radius: {{SIZE}}{{UNIT}};',
				),
				'condition'  => array(
					'filter_active_adv_radius!' => 'yes',
				),
			)
		);

		$this->add_control(
			'filter_active_adv_radius',
			array(
				'label'       => __( 'Advanced Border Radius', 'premium-addons-for-elementor' ),
				'type'        => Controls_Manager::SWITCHER,
				'description' => __( 'Apply custom radius values. Get the radius value from ', 'premium-addons-for-elementor' ) . '<a href="https://9elements.github.io/fancy-border-radius/" target="_blank">here</a>' . __( '. See ', 'premium-addons-for-elementor' ) . '<a href="https://www.youtube.com/watch?v=S0BJazLHV-M" target="_blank">tutorial</a>',
			)
		);

		$this->add_control(
			'filter_active_adv_radius_value',
			array(
				'label'     => __( 'Border Radius', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::TEXT,
				'dynamic'   => array( 'active' => true ),
				'selectors' => array(
					'{{WRAPPER}} .premium-gallery-cats-container li a.active' => 'border-radius: {{VALUE}};',
				),
				'condition' => array(
					'filter_active_adv_radius' => 'yes',
				),
				'ai'          => array(
					'active' => false,
				),
			)
		);

		$this->end_controls_tab();

		$this->end_controls_tabs();

		$this->add_group_control(
			Group_Control_Box_Shadow::get_type(),
			array(
				'name'     => 'premium_gallery_filter_shadow',
				'selector' => '{{WRAPPER}} .premium-gallery-cats-container li a.category',
			)
		);

		$this->add_responsive_control(
			'premium_gallery_filter_margin',
			array(
				'label'      => __( 'Margin', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::DIMENSIONS,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .premium-gallery-cats-container li a.category' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
				),
			)
		);

		$this->add_responsive_control(
			'premium_gallery_filter_padding',
			array(
				'label'      => __( 'Padding', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::DIMENSIONS,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .premium-gallery-cats-container li a.category' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
				),
			)
		);

		$this->end_controls_section();

		$this->start_controls_section(
			'premium_gallery_button_style_settings',
			array(
				'label'     => __( 'Load More Button', 'premium-addons-for-elementor' ),
				'tab'       => Controls_Manager::TAB_STYLE,
				'condition' => array(
					'premium_gallery_load_more' => 'yes',
				),
			)
		);

		$this->add_group_control(
			Group_Control_Typography::get_type(),
			array(
				'name'     => 'premium_gallery_button_typo',
				'global'   => array(
					'default' => Global_Typography::TYPOGRAPHY_PRIMARY,
				),
				'selector' => '{{WRAPPER}} .premium-gallery-load-more-btn',
			)
		);

		$this->start_controls_tabs( 'premium_gallery_button_style_tabs' );

		$this->start_controls_tab(
			'premium_gallery_button_style_normal',
			array(
				'label' => __( 'Normal', 'premium-addons-for-elementor' ),
			)
		);

		$this->add_control(
			'premium_gallery_button_color',
			array(
				'label'     => __( 'Text Color', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::COLOR,
				'global'    => array(
					'default' => Global_Colors::COLOR_SECONDARY,
				),
				'selectors' => array(
					'{{WRAPPER}} .premium-gallery-load-more-btn'  => 'color: {{VALUE}};',
					'{{WRAPPER}} .premium-gallery-load-more-btn .premium-loader'  => 'border-color: {{VALUE}};',
				),
			)
		);

		$this->add_control(
			'premium_gallery_button_spin_color',
			array(
				'label'     => __( 'Spinner Color', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::COLOR,
				'global'    => array(
					'default' => Global_Colors::COLOR_SECONDARY,
				),
				'selectors' => array(
					'{{WRAPPER}} .premium-gallery-load-more-btn .premium-loader'  => 'border-top-color: {{VALUE}};',
				),
			)
		);

		$this->add_group_control(
			Group_Control_Text_Shadow::get_type(),
			array(
				'name'     => 'premium_gallery_button_text_shadow',
				'selector' => '{{WRAPPER}} .premium-gallery-load-more-btn',
			)
		);

		$this->add_group_control(
			Premium_Background::get_type(),
			array(
				'name'     => 'premium_gallery_button_background',
				'types'    => array( 'classic', 'gradient' ),
				'selector' => '{{WRAPPER}} .premium-gallery-load-more-btn',
			)
		);

		$this->add_group_control(
			Group_Control_Border::get_type(),
			array(
				'name'     => 'premium_gallery_button_border',
				'selector' => '{{WRAPPER}} .premium-gallery-load-more-btn',
			)
		);

		$this->add_control(
			'premium_gallery_button_border_radius',
			array(
				'label'      => __( 'Border Radius', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::SLIDER,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .premium-gallery-load-more-btn' => 'border-radius: {{SIZE}}{{UNIT}};',
				),
			)
		);

		$this->add_group_control(
			Group_Control_Box_Shadow::get_type(),
			array(
				'name'     => 'premium_gallery_button_box_shadow',
				'selector' => '{{WRAPPER}} .premium-gallery-load-more-btn',
			)
		);

		$this->add_responsive_control(
			'premium_gallery_button_margin',
			array(
				'label'      => __( 'Margin', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::DIMENSIONS,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .premium-gallery-load-more' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
				),
			)
		);

		$this->add_responsive_control(
			'premium_gallery_button_padding',
			array(
				'label'      => __( 'Padding', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::DIMENSIONS,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .premium-gallery-load-more-btn' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
				),
			)
		);

		$this->end_controls_tab();

		$this->start_controls_tab(
			'premium_gallery_button_style_hover',
			array(
				'label' => __( 'Hover', 'premium-addons-for-elementor' ),
			)
		);

		$this->add_control(
			'premium_gallery_button_hover_color',
			array(
				'label'     => __( 'Text Hover Color', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::COLOR,
				'global'    => array(
					'default' => Global_Colors::COLOR_SECONDARY,
				),
				'selectors' => array(
					'{{WRAPPER}} .premium-gallery-load-more-btn:hover'  => 'color: {{VALUE}};',
				),
			)
		);

		$this->add_group_control(
			Group_Control_Text_Shadow::get_type(),
			array(
				'name'     => 'premium_gallery_button_text_shadow_hover',
				'selector' => '{{WRAPPER}} .premium-gallery-load-more-btn:hover',
			)
		);

		$this->add_group_control(
			Premium_Background::get_type(),
			array(
				'name'     => 'premium_gallery_button_background_hover',
				'types'    => array( 'classic', 'gradient' ),
				'selector' => '{{WRAPPER}} .premium-gallery-load-more-btn:hover',
			)
		);

		$this->add_group_control(
			Group_Control_Border::get_type(),
			array(
				'name'     => 'premium_gallery_button_border_hover',
				'selector' => '{{WRAPPER}} .premium-gallery-load-more-btn:hover',
			)
		);

		$this->add_control(
			'button_border_radius_hover',
			array(
				'label'      => __( 'Border Radius', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::SLIDER,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .premium-gallery-load-more-btn:hover' => 'border-radius: {{SIZE}}{{UNIT}};',
				),
			)
		);

		$this->add_group_control(
			Group_Control_Box_Shadow::get_type(),
			array(
				'name'     => 'premium_gallery_button_shadow_hover',
				'selector' => '{{WRAPPER}} .premium-gallery-load-more-btn:hover',
			)
		);

		$this->add_responsive_control(
			'button_margin_hover',
			array(
				'label'      => __( 'Margin', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::DIMENSIONS,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .premium-gallery-load-more-btn:hover' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
				),
			)
		);

		$this->add_responsive_control(
			'premium_gallery_button_padding_hover',
			array(
				'label'      => __( 'Padding', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::DIMENSIONS,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .premium-gallery-load-more-btn:hover' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
				),
			)
		);

		$this->end_controls_tab();

		$this->end_controls_tabs();

		$this->end_controls_section();

		$this->start_controls_section(
			'section_lightbox_style',
			array(
				'label'     => __( 'Lightbox', 'premium-addons-for-elementor' ),
				'tab'       => Controls_Manager::TAB_STYLE,
				'condition' => array(
					'premium_gallery_lightbox_type' => 'yes',
				),
			)
		);

		$this->add_control(
			'lightbox_color',
			array(
				'label'     => __( 'Background Color', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::COLOR,
				'selectors' => array(
					'#elementor-lightbox-slideshow-{{ID}}, #elementor-lightbox-{{ID}}' => 'background-color: {{VALUE}};',
				),
			)
		);

		$this->add_control(
			'lightbox_ui_color',
			array(
				'label'     => __( 'UI Color', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::COLOR,
				'selectors' => array(
					'#elementor-lightbox-slideshow-{{ID}} .dialog-lightbox-close-button, #elementor-lightbox-{{ID}} .dialog-lightbox-close-button' => 'color: {{VALUE}};',
					'#elementor-lightbox-slideshow-{{ID}} svg, #elementor-lightbox-{{ID}} svg' => 'fill: {{VALUE}}',
				),
			)
		);

		$this->add_control(
			'lightbox_ui_hover_color',
			array(
				'label'     => __( 'UI Hover Color', 'premium-addons-for-elementor' ),
				'type'      => Controls_Manager::COLOR,
				'selectors' => array(
					'#elementor-lightbox-slideshow-{{ID}} .dialog-lightbox-close-button:hover, #elementor-lightbox-{{ID}} .dialog-lightbox-close-button:hover' => 'color: {{VALUE}};',
					'#elementor-lightbox-slideshow-{{ID}} svg:hover, #elementor-lightbox-{{ID}} svg:hover' => 'fill: {{VALUE}}',
				),
			)
		);

		$this->end_controls_section();

		$this->start_controls_section(
			'premium_gallery_general_style',
			array(
				'label' => __( 'Grid Container', 'premium-addons-for-elementor' ),
				'tab'   => Controls_Manager::TAB_STYLE,
			)
		);

		$this->add_group_control(
			Premium_Background::get_type(),
			array(
				'name'     => 'premium_gallery_general_background',
				'types'    => array( 'classic', 'gradient' ),
				'selector' => '{{WRAPPER}} .premium-img-gallery',
			)
		);

		$this->add_group_control(
			Group_Control_Border::get_type(),
			array(
				'name'     => 'premium_gallery_general_border',
				'selector' => '{{WRAPPER}} .premium-img-gallery',
			)
		);

		$this->add_control(
			'premium_gallery_general_border_radius',
			array(
				'label'      => __( 'Border Radius', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::SLIDER,
				'size_units' => array( 'px', '%', 'em' ),
				'selectors'  => array(
					'{{WRAPPER}} .premium-img-gallery' => 'border-radius: {{SIZE}}{{UNIT}};',
				),
			)
		);

		$this->add_group_control(
			Group_Control_Box_Shadow::get_type(),
			array(
				'name'     => 'premium_gallery_general_box_shadow',
				'selector' => '{{WRAPPER}} .premium-img-gallery',
			)
		);

		$this->add_responsive_control(
			'premium_gallery_general_margin',
			array(
				'label'      => __( 'Margin', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::DIMENSIONS,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .premium-img-gallery' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}}',
				),
			)
		);

		$this->add_responsive_control(
			'premium_gallery_general_padding',
			array(
				'label'      => __( 'Padding', 'premium-addons-for-elementor' ),
				'type'       => Controls_Manager::DIMENSIONS,
				'size_units' => array( 'px', 'em', '%' ),
				'selectors'  => array(
					'{{WRAPPER}} .premium-img-gallery' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}}',
				),
			)
		);

		$this->end_controls_section();
	}

	/**
	 * Filter Cats
	 *
	 * Formats Category to be inserted in class attribute.
	 *
	 * @since 2.1.0
	 * @access public
	 *
	 * @param string $string category slug.
	 *
	 * @return string $cat_filtered slug filtered.
	 */
	public function filter_cats( $string ) {

		$cat_filtered = trim( $string );

		$cat_filtered = extension_loaded( 'mbstring' ) ? mb_strtolower( $cat_filtered ) : strtolower( $cat_filtered );

		if ( strpos( $cat_filtered, 'class' ) || strpos( $cat_filtered, 'src' ) ) {
			$cat_filtered = substr( $cat_filtered, strpos( $cat_filtered, '"' ) + 1 );
			$cat_filtered = strtok( $cat_filtered, '"' );
			$cat_filtered = preg_replace( '/[http:.]/', '', $cat_filtered );
			$cat_filtered = str_replace( '/', '', $cat_filtered );
		}

		$cat_filtered = str_replace( ', ', ',', $cat_filtered );
		$cat_filtered = preg_replace( '/[\s_`\'&@!#%]/', '-', $cat_filtered );
		$cat_filtered = str_replace( ',', ' ', $cat_filtered );

		return $cat_filtered;
	}

	/**
	 * Render Filter Tabs on the frontend
	 *
	 * @since 2.1.0
	 * @access protected
	 *
	 * @param string  $first Class for the first category.
	 * @param integer $active_index active category index.
	 */
	protected function render_filter_tabs( $first, $active_index ) {

		$settings = $this->get_settings_for_display();

		if ( 'none' !== $settings['filter_lq_effect'] ) {
			$first .= ' premium-con-lq__' . $settings['filter_lq_effect'];
		}

		?>

		<div class="premium-img-gallery-filter">
			<ul class="premium-gallery-cats-container">
				<?php if ( 'yes' === $settings['premium_gallery_first_cat_switcher'] ) : ?>
					<li>
						<a href="javascript:;" class="category <?php echo esc_attr( $first ); ?>" data-filter="*">
							<?php echo wp_kses_post( $settings['premium_gallery_first_cat_label'] ); ?>
						</a>
					</li>
					<?php
				endif;
				foreach ( $settings['premium_gallery_cats_content'] as $index => $category ) {
					if ( ! empty( $category['premium_gallery_img_cat'] ) ) {
						$cat_filtered = $this->filter_cats( $category['premium_gallery_img_cat'] );

						$key = 'premium_grid_category_' . $index;

						if ( $active_index === $index ) {
							$this->add_render_attribute( $key, 'class', 'active' );
						}

						$this->add_render_attribute(
							$key,
							'class',
							array(
								'category',
								'elementor-repeater-item-' . $category['_id'],
								'none' !== $settings['filter_lq_effect'] ? 'premium-con-lq__' . $settings['filter_lq_effect'] : '',
							)
						);

						$slug = sprintf( '.%s', $cat_filtered );

						$this->add_render_attribute( $key, 'data-filter', $slug );
						?>
						<li>
							<a href="javascript:;" <?php echo wp_kses_post( $this->get_render_attribute_string( $key ) ); ?>>
								<?php echo wp_kses_post( $category['premium_gallery_img_cat'] ); ?>
							</a>
						</li>
						<?php
					}
				}
				?>
			</ul>
		</div>

		<?php
	}

	/**
	 * Render Grid output on the frontend.
	 *
	 * Written in PHP and used to generate the final HTML.
	 *
	 * @since 2.1.0
	 * @access protected
	 */
	protected function render() {

		$settings = $this->get_settings_for_display();

		$filter = $settings['premium_gallery_filter'];

		$skin = $settings['premium_gallery_img_style'];

		$layout = $settings['premium_gallery_img_size_select'];

		$lightbox = $settings['premium_gallery_light_box'];

		$lightbox_type = $settings['premium_gallery_lightbox_type'];

		$show_play = $settings['premium_gallery_video_icon'];

		if ( 'yes' === $settings['premium_gallery_responsive_switcher'] ) {
			$min_size = $settings['premium_gallery_min_range'] . 'px';
			$max_size = $settings['premium_gallery_max_range'] . 'px';
		}

		$category = '*';

		if ( 'yes' === $filter ) {

			if ( ! empty( $settings['premium_gallery_active_cat'] ) || 0 === $settings['premium_gallery_active_cat'] ) {

				if ( 'yes' !== $settings['premium_gallery_first_cat_switcher'] ) {
					$active_index     = $settings['premium_gallery_active_cat'];
					$active_category  = $settings['premium_gallery_cats_content'][ $active_index ]['premium_gallery_img_cat'];
					$category         = '.' . $this->filter_cats( $active_category );
					$active_cat_index = $settings['premium_gallery_active_cat'];

				} else {
					$active_cat_index = $settings['premium_gallery_active_cat'] - 1;
				}
			} else {
				$active_cat_index = 'yes' === $settings['premium_gallery_first_cat_switcher'] ? -1 : 0;
			}

			$is_all_active = ( 0 > $active_cat_index ) ? 'active' : '';

		}

		if ( 'original' === $layout ) {
			$layout = 'masonry';
		} elseif ( 'one_size' === $layout ) {
			$layout = 'fitRows';
		}

		$ltr_mode = 'yes' === $settings['premium_gallery_rtl_mode'] ? false : true;

		$shuffle = 'yes' === $settings['premium_gallery_shuffle'] ? true : false;

		$shuffle_onload = 'yes' === $settings['premium_gallery_shuffle_onload'] ? 'random' : 'original-order';

		$grid_settings = array(
			'img_size'   => $layout,
			'filter'     => $filter,
			'theme'      => $settings['premium_gallery_lightbox_theme'],
			'active_cat' => $category,
			'ltr_mode'   => $ltr_mode,
			'shuffle'    => $shuffle,
			'sort_by'    => $shuffle_onload,
			'skin'       => $skin,
		);

		if ( 'yes' === $filter ) {
			$grid_settings['flag'] = ! empty( $settings['url_flag'] ) ? $settings['url_flag'] : 'cat';
		}

		$load_more = 'yes' === $settings['premium_gallery_load_more'] ? true : false;

		if ( $load_more ) {
			$minimum      = ! empty( $settings['premium_gallery_load_minimum'] ) ? $settings['premium_gallery_load_minimum'] : 6;
			$click_number = ! empty( $settings['premium_gallery_load_click_number'] ) ? $settings['premium_gallery_load_click_number'] : 6;

			$grid_settings = array_merge(
				$grid_settings,
				array(
					'load_more'    => $load_more,
					'minimum'      => $minimum,
					'click_images' => $click_number,
				)
			);
		}

		if ( 'yes' === $lightbox ) {
			$grid_settings = array_merge(
				$grid_settings,
				array(
					'light_box'     => $lightbox,
					'lightbox_type' => $lightbox_type,
					'overlay'       => 'yes' === $settings['premium_gallery_overlay_gallery'] ? true : false,
				)
			);
		} else {
			$this->add_render_attribute(
				'grid',
				array(
					'class' => array(
						'premium-img-gallery-no-lightbox',
					),
				)
			);
		}

		$this->add_render_attribute(
			'grid',
			array(
				'id'    => 'premium-img-gallery-' . esc_attr( $this->get_id() ),
				'class' => array(
					'elementor-invisible',
					'premium-img-gallery',
					'premium-img-gallery-' . $layout,
					$settings['premium_gallery_img_effect'],
				),
			)
		);

		if ( $show_play ) {
			$this->add_render_attribute(
				'grid',
				array(
					'class' => array(
						'premium-gallery-icon-show',
					),
				)
			);
		}

		$this->add_render_attribute(
			'gallery_container',
			array(
				'class'         => 'premium-gallery-container',
				'data-settings' => wp_json_encode( $grid_settings ),
			)
		);

		$this->add_render_attribute(
			'image_container',
			'class',
			array(
				'pa-gallery-img-container',
			)
		);

		?>

	<div <?php echo wp_kses_post( $this->get_render_attribute_string( 'grid' ) ); ?>>
		<?php
		if ( 'yes' === $filter ) :
			$this->render_filter_tabs( $is_all_active, $active_cat_index );
		endif;
		?>

		<div <?php echo wp_kses_post( $this->get_render_attribute_string( 'gallery_container' ) ); ?>>

			<?php if ( 'metro' === $layout ) : ?>
				<div class="grid-sizer"></div>
				<?php
			endif;

			foreach ( $settings['premium_gallery_img_content'] as $index => $image ) :

				$key = 'gallery_item_' . $index;

				$image_id = apply_filters( 'wpml_object_id', $image['premium_gallery_img']['id'], 'attachment', true );

				// Check for Image ID, but not for the default Elementor placeholder.
				// if ( false === strpos( $image['premium_gallery_img']['url'], 'placeholder.png' ) && ! $image['premium_gallery_video'] && ! $image_id && empty( $image['premium_gallery_img']['url'] ) ) {
				// 	continue;
				// }

				$image_by_id = get_post( $image_id );

				$alt = $image_by_id ? $this->get_lightbox_title( $image_by_id ) : '';

				$this->add_render_attribute(
					$key,
					array(
						'class' => array(
							'premium-gallery-item',
							'elementor-repeater-item-' . $image['_id'],
							$this->filter_cats( $image['premium_gallery_img_category'] ),
						),
					)
				);

				if ( $load_more && $index > $minimum - 1 ) {

					$this->add_render_attribute( $key, 'class', 'premium-gallery-item-hidden' );

				}

				if ( $image['premium_gallery_video'] ) {
					$this->add_render_attribute( $key, 'class', 'premium-gallery-video-item' );
				}
				?>
				<div <?php echo wp_kses_post( $this->get_render_attribute_string( $key ) ); ?>>
				<div class="pa-gallery-img <?php echo esc_attr( $skin ); ?>" onclick="">
					<div <?php echo wp_kses_post( $this->get_render_attribute_string( 'image_container' ) ); ?>>
						<?php
							$video_data = $this->render_grid_item( $image, $index );

							$image['video_link']  = $video_data['link'];
							$image['video_thumb'] = $video_data['thumbnail'];
						if ( 'style3' === $skin ) :
							?>
							<div class="pa-gallery-icons-wrapper">
								<div class="pa-gallery-icons-inner-container">
									<?php $this->render_icons( $image, $index, $alt ); ?>
								</div>
							</div>
						<?php endif; ?>
					</div>
					<?php
					if ( 'style2' !== $skin ) :
						if ( 'default' === $skin || 'style1' === $skin ) :
							?>
							<div class="pa-gallery-icons-wrapper">
								<div class="pa-gallery-icons-inner-container">
									<?php $this->render_icons( $image, $index, $alt ); ?>
								</div>
							</div>
							<?php
						endif;
						$this->render_image_caption( $image );
					else :
						?>
						<div class="pa-gallery-icons-caption-container">
							<div class="pa-gallery-icons-caption-cell">
								<?php
									$this->render_icons( $image, $index, $alt );
									$this->render_image_caption( $image );
								?>
							</div>
						</div>
						<?php
					endif;
					if ( $image['premium_gallery_video'] ) :
						?>
							</div>
						</div>
						<?php
						continue;
					endif;
					if ( 'yes' === $image['premium_gallery_link_whole'] ) {

						$link_key = 'image_link_' . $index;

						$this->add_render_attribute(
							$link_key,
							array(
								'class' => 'pa-gallery-whole-link',
							)
						);

						if ( 'url' === $image['premium_gallery_img_link_type'] ) {
							$icon_link = $image['premium_gallery_img_link'];
						} else {
							$icon_link = get_permalink( $image['premium_gallery_img_existing'] );
						}

						if ( ! empty( $icon_link ) ) {

							if ( 'url' === $image['premium_gallery_img_link_type'] ) {
								$this->add_link_attributes( $link_key, $icon_link );

							} else {
								$this->add_render_attribute( $link_key, 'href', $icon_link );
							}

							?>
							<a <?php echo wp_kses_post( $this->get_render_attribute_string( $link_key ) ); ?>>
								<span>
									<?php echo wp_kses_post( $image['premium_gallery_img_name'] ); ?>
								</span>
							</a>
							<?php
						}
					} elseif ( 'yes' === $lightbox ) {

						if ( 'yes' === $image['premium_gallery_lightbox_whole'] ) {

							$lightbox_key = 'image_lightbox_' . $index;

							$this->add_render_attribute(
								$lightbox_key,
								array(
									'class' => 'pa-gallery-whole-link',
									'href'  => esc_url( $image['premium_gallery_img']['url'] ),
								)
							);

							if ( 'default' !== $lightbox_type ) {

								$this->add_render_attribute(
									$lightbox_key,
									array(
										'data-elementor-open-lightbox'      => $lightbox_type,
										'data-elementor-lightbox-slideshow' => count( $settings['premium_gallery_img_content'] ) > 1 ? $this->get_id() : false,
									)
								);

								if ( 'yes' === $settings['lightbox_show_title'] ) {

									$this->add_render_attribute( $lightbox_key, 'data-elementor-lightbox-title', $alt );

								}
							} else {

								$rel = sprintf( 'prettyPhoto[premium-grid-%s]', $this->get_id() );

								$this->add_render_attribute(
									$lightbox_key,
									array(
										'data-rel' => $rel,
									)
								);
							}

							?>

								<a <?php echo wp_kses_post( $this->get_render_attribute_string( $lightbox_key ) ); ?>></a>

							<?php
						}
					}
					?>
				</div>
			</div>
			<?php endforeach; ?>

			<?php if ( 'yes' === $settings['gradient_layer'] ) : ?>
				<div class="premium-gallery-gradient-layer"></div>
			<?php endif; ?>
		</div>

		<?php if ( 'yes' === $settings['premium_gallery_load_more'] ) : ?>
			<div class="premium-gallery-load-more premium-gallery-btn-hidden">
				<button class="premium-gallery-load-more-btn">
					<?php echo wp_kses_post( $settings['premium_gallery_load_more_text'] ); ?>
					<div class="premium-loader"></div>
				</button>
			</div>
		<?php endif; ?>

	</div>

		<?php
		if ( \Elementor\Plugin::instance()->editor->is_edit_mode() ) {

			if ( 'metro' !== $settings['premium_gallery_img_size_select'] ) {
				$this->render_editor_script();
			}
		}
		?>

		<?php if ( 'yes' === $settings['premium_gallery_responsive_switcher'] ) : ?>
		<style>
			@media( min-width: <?php echo esc_attr( $min_size ); ?> ) and ( max-width:<?php echo esc_attr( $max_size ); ?> ) {
				#premium-img-gallery-<?php echo esc_attr( $this->get_id() ); ?> .premium-gallery-caption {
					display: none;
				}
			}
		</style>
	<?php endif; ?>

		<?php
	}

	/**
	 * Gets lightbox Title according to the Global Lightbox Settings.
	 *
	 * @param object $attachment  image(post) object.
	 *
	 * @since 4.10.62
	 *
	 * @return string $title  lightbox title.
	 */
	protected function get_lightbox_title( $attachment ) {
		$title = '';

		if ( ! $attachment || ! is_a( $attachment, 'WP_Post' ) ) {
			return $title;
		}

		$image_data = array(
			'alt'         => get_post_meta( $attachment->ID, '_wp_attachment_image_alt', true ),
			'caption'     => $attachment->post_excerpt,
			'description' => $attachment->post_content,
			'title'       => $attachment->post_title,
		);

		$kit                = Plugin::$instance->kits_manager->get_active_kit();
		$lightbox_title_src = $kit->get_settings( 'lightbox_title_src' );

		if ( $lightbox_title_src && $image_data[ $lightbox_title_src ] ) {
			$lightbox_title = $image_data[ $lightbox_title_src ];

			$title = apply_filters( 'pa_grid_image_alt', $lightbox_title );
		}

		return $title;
	}

	/**
	 * Render Grid Image
	 *
	 * Written in PHP and used to generate the final HTML for image.
	 *
	 * @since 3.6.4
	 * @access protected
	 *
	 * @param array   $item image repeater item.
	 * @param integer $index item index.
	 */
	protected function render_grid_item( $item, $index ) {

		$settings = $this->get_settings();

		$image_id = apply_filters( 'wpml_object_id', $item['premium_gallery_img']['id'], 'attachment', true );

		$image_src = $image_url = wp_get_attachment_image_url( $image_id, 'full' );

		$is_video = $item['premium_gallery_video'];

		$key = 'image_' . $index;

		if ( ! empty( $item['premium_gallery_img']['url'] ) ) {
			$settings['image_data'] = Helper_Functions::get_image_data( $image_id, $item['premium_gallery_img']['url'], $settings['thumbnail_size'] );
			$image_html             = Group_Control_Image_Size::get_attachment_image_html( $settings, 'thumbnail', 'image_data' );
		}

		if ( $is_video ) {

			$type = $item['premium_gallery_video_type'];

			if ( 'hosted' !== $type ) {
				$embed_params = $this->get_embed_params( $item );
				$link         = Embed::get_embed_url( $item['premium_gallery_video_url'], $embed_params );

				if ( 'youtube' === $type && 'yes' === $item['privacy_mode'] ) {
					$link = str_replace( '.com', '-nocookie.com', $link );
				}

				if ( empty( $image_html ) ) {

					$video_props = Embed::get_video_properties( $link );
					$id          = $video_props['video_id'];
					$type        = $video_props['provider'];
					$size        = '';

					if ( 'youtube' === $type ) {
						$size = $settings['premium_gallery_yt_thumbnail_size'];
					}
					$image_src = Helper_Functions::get_video_thumbnail( $id, $type, $size );

					$image_html = '<img src="' . esc_url( $image_src ) . '">';
				}
			} else {
				self::$check_self_hosted = true;
				$video_params            = $this->get_hosted_params( $item );
			}
		}

		if ( $is_video ) {
			?>
			<div class="premium-gallery-video-wrap" data-type="<?php echo esc_attr( $item['premium_gallery_video_type'] ); ?>">
				<?php if ( 'hosted' !== $item['premium_gallery_video_type'] ) : ?>
					<div class="premium-gallery-iframe-wrap" data-src="<?php echo esc_url( $link ); ?>"></div>
					<?php
				else :
					$link = empty( $item['premium_gallery_video_self_url'] ) ? $item['premium_gallery_video_self']['url'] : $item['premium_gallery_video_self_url'];
					?>
					<video src="<?php echo esc_url( $link ); ?>" <?php echo wp_kses_post( Utils::render_html_attributes( $video_params ) ); ?>></video>
				<?php endif; ?>
			</div>
		<?php } ?>
		<?php echo wp_kses_post( $image_html ); ?>
		<?php

		return array(
			'link'      => ( isset( $link ) && ! empty( $link ) ) ? $link : false,
			'thumbnail' => $image_src,
		);
	}

	/**
	 * Render Icons
	 *
	 * Render Lightbox and URL Icons HTML
	 *
	 * @since 3.6.4
	 * @access protected
	 *
	 * @param array   $item grid image repeater item.
	 * @param integer $index item index.
	 * @param string  $alt image alternative text.
	 */
	protected function render_icons( $item, $index, $alt ) {

		$settings = $this->get_settings_for_display();

		$lightbox_key = 'image_lightbox_' . $index;

		$link_key = 'image_link_' . $index;

		$href = $item['premium_gallery_img']['url'];

		$lightbox = $settings['premium_gallery_light_box'];

		$lightbox_type = $settings['premium_gallery_lightbox_type'];

		$is_video = $item['premium_gallery_video'];

		$id = $this->get_id();

		if ( $is_video ) {

			$type = $item['premium_gallery_video_type'];

			$this->add_render_attribute(
				$lightbox_key,
				array(
					'class'    => array(
						'pa-gallery-lightbox-wrap',
						'pa-gallery-magnific-image',
						'pa-gallery-video-icon',
					),
					'tabindex' => 0,
				)
			);

			if ( 'yes' === $lightbox ) {

				$lightbox_options = array(
					'privacy' => 'yes',
				);

				if ( 'default' !== $lightbox_type ) {

					if ( 1 === count( $settings['premium_gallery_img_content'] ) || self::$check_self_hosted ) {
						$lightbox_options = array(
							'type'         => 'video',
							'videoType'    => $item['premium_gallery_video_type'],
							'url'          => $item['video_link'],
							'modalOptions' => array(
								'id'               => 'elementor-lightbox-' . $id,
								'videoAspectRatio' => '169',
							),
						);

						if ( 'hosted' === $type ) {
							$lightbox_options['videoParams'] = $this->get_hosted_params( $item );
						}
					}

					$this->add_render_attribute(
						$lightbox_key,
						array(
							'data-elementor-open-lightbox' => 'yes',
							'data-elementor-lightbox'      => wp_json_encode( $lightbox_options ),
							'data-elementor-lightbox-video' => esc_url( $item['video_link'] ),
						)
					);

					// Make sure videos slideshow is enabled only when there are no self hosted videos
					// Self hosted videos causes issue with slideshow
					if ( ! self::$check_self_hosted ) {
						$this->add_render_attribute( $lightbox_key, 'data-elementor-lightbox-slideshow', count( $settings['premium_gallery_img_content'] ) > 1 ? $this->get_id() : false );
					}
				} else {

					$rel  = sprintf( 'prettyPhoto[premium-grid-%s]', $this->get_id() );
					$link = ( 'hosted' === $type ) ? $item['video_link'] : $item['video_link'] . '&iframe=true';

					$this->add_render_attribute(
						$lightbox_key,
						array(
							'href'     => esc_url( $link ),
							'data-rel' => $rel,
						)
					);
				}
			}

			?>
			<div>
				<a <?php echo wp_kses_post( $this->get_render_attribute_string( $lightbox_key ) ); ?>>
					<span>
						<?php
						Icons_Manager::render_icon( $settings['premium_gallery_videos_icon'], array( 'aria-hidden' => 'true' ) );
						?>
					</span>
				</a>
			</div>

			<?php
			return;
		}

		if ( 'yes' === $lightbox ) {

			if ( 'yes' !== $item['premium_gallery_lightbox_whole'] ) {

				$this->add_render_attribute(
					$lightbox_key,
					array(
						'class' => 'pa-gallery-magnific-image',
						'href'  => $href,
					)
				);

				if ( 'default' !== $lightbox_type ) {

					$this->add_render_attribute(
						$lightbox_key,
						array(
							'data-elementor-open-lightbox' => $lightbox_type,
							'data-elementor-lightbox-slideshow' => count( $settings['premium_gallery_img_content'] ) > 1 ? $id : false,
						)
					);

					if ( 'yes' === $settings['lightbox_show_title'] ) {

						$this->add_render_attribute( $lightbox_key, 'data-elementor-lightbox-title', $alt );

					}
				} else {

					$rel = sprintf( 'prettyPhoto[premium-grid-%s]', $this->get_id() );

					$this->add_render_attribute(
						$lightbox_key,
						array(
							'data-rel' => $rel,
						)
					);

				}

				?>

					<a <?php echo wp_kses_post( $this->get_render_attribute_string( $lightbox_key ) ); ?>>
						<span>
							<?php
							Icons_Manager::render_icon( $settings['premium_gallery_lightbox_icon'], array( 'aria-hidden' => 'true' ) );
							?>
						</span>
					</a>
				<?php
			}
		}

		if ( ! empty( $item['premium_gallery_img_link']['url'] ) || ! empty( $item['premium_gallery_img_existing'] ) ) {

			if ( 'yes' !== $item['premium_gallery_link_whole'] ) {

				$this->add_render_attribute(
					$link_key,
					array(
						'class' => 'pa-gallery-img-link',
					)
				);

				if ( 'url' === $item['premium_gallery_img_link_type'] ) {
					$icon_link = $item['premium_gallery_img_link'];
				} else {
					$icon_link = get_permalink( $item['premium_gallery_img_existing'] );
				}

				if ( ! empty( $icon_link ) ) {

					if ( 'url' === $item['premium_gallery_img_link_type'] ) {
						$this->add_link_attributes( $link_key, $icon_link );
					} else {
						$this->add_render_attribute( $link_key, 'href', $icon_link );
					}

					?>
					<a <?php echo wp_kses_post( $this->get_render_attribute_string( $link_key ) ); ?>>
						<span>
							<?php
							Icons_Manager::render_icon( $settings['premium_gallery_links_icon'], array( 'aria-hidden' => 'true' ) );
							?>
						</span>
					</a>
					<?php
				}
			}
		}
	}

	/**
	 * Render Image Caption
	 *
	 * Written in PHP to render the final HTML for image title and description
	 *
	 * @since 3.6.4
	 * @access protected
	 *
	 * @param array $item image repeater item.
	 */
	protected function render_image_caption( $item ) {

		$media_lib = $item['premmium_gallery_img_info'];

		if ( 'yes' === $media_lib ) {
			$title = Control_Media::get_image_title( $item['premium_gallery_img'] );

			$description = get_post( $item['premium_gallery_img']['id'] )->post_content;
		} else {
			$title = $item['premium_gallery_img_name'];

			$description = $item['premium_gallery_img_desc'];
		}

		if ( ! empty( $title ) || ! empty( $description ) ) :
			?>
			<div class="premium-gallery-caption">

				<?php if ( ! empty( $title ) ) : ?>
					<span class="premium-gallery-img-name"><?php echo wp_kses_post( $title ); ?></span>
					<?php
				endif;

				if ( ! empty( $description ) ) :
					?>
					<p class="premium-gallery-img-desc"><?php echo wp_kses_post( $description ); ?></p>
				<?php endif; ?>

			</div>
			<?php
		endif;
	}

	/**
	 * Get Hosted Videos Parameters
	 *
	 * @since 3.7.0
	 * @access private
	 *
	 * @param array $item image repeater item.
	 */
	private function get_hosted_params( $item ) {

		$video_params = array();

		if ( $item['premium_gallery_video_controls'] ) {
			$video_params['controls'] = '';
		}

		if ( $item['premium_gallery_video_mute'] ) {
			$video_params['muted'] = 'muted';
		}

		if ( $item['premium_gallery_video_loop'] ) {
			$video_params['loop'] = '';
		}

		if ( 'yes' !== $item['download_button'] ) {
			$video_params['controlsList'] = 'nodownload';
		}

		$video_params['preload'] = 'none';

		return $video_params;
	}

	/**
	 * Get embeded videos parameters
	 *
	 * @since 3.7.0
	 * @access private
	 *
	 * @param array $item image repeater item.
	 */
	private function get_embed_params( $item ) {

		$video_params = array();

		$props = Embed::get_video_properties( $item['premium_gallery_video_url'] );

		$video_params['loop'] = $item['premium_gallery_video_loop'] ? '1' : '0';

		$video_params['autoplay'] = '1';

		$video_params['controls'] = $item['premium_gallery_video_controls'] ? '1' : '0';

		$key = 'youtube' === $item['premium_gallery_video_type'] ? 'mute' : 'muted';

		// $video_params['playlist'] = $props['video_id'];

		$video_params[ $key ] = $item['premium_gallery_video_mute'] ? '1' : '0';

		if ( 'vimeo' === $item['premium_gallery_video_type'] ) {
			$video_params['autopause'] = '0';
		}

		return $video_params;
	}

	/**
	 * Render Editor Masonry Script.
	 *
	 * @since 3.12.3
	 * @access protected
	 */
	protected function render_editor_script() {

		?>
		<script type="text/javascript">
			jQuery( document ).ready( function( $ ) {

				$( '.premium-gallery-container' ).each( function() {

					var $node_id 	= '<?php echo esc_attr( $this->get_id() ); ?>',
						scope 		= $( '[data-id="' + $node_id + '"]' ),
						settings    = $(this).data("settings"),
						selector 	= $(this);

					if ( selector.closest( scope ).length < 1 ) {
						return;
					}

					var masonryArgs = {
						// set itemSelector so .grid-sizer is not used in layout
						filter 			: settings.active_cat,
						itemSelector	: '.premium-gallery-item',
						percentPosition : true,
						layoutMode		: settings.img_size,
					};

					var $isotopeObj = {};

					selector.imagesLoaded( function() {

						$isotopeObj = selector.isotope( masonryArgs );

						selector.find('.premium-gallery-item').resize( function() {
							$isotopeObj.isotope( 'layout' );
						});
					});

				});
			});
		</script>
		<?php
	}
}
