JezK
Edit File: Adv_Tabs.php
<?php namespace Essential_Addons_Elementor\Elements; // If this file is called directly, abort. if (!defined('ABSPATH')) { exit; } use \Elementor\Controls_Manager; use \Elementor\Group_Control_Background; use \Elementor\Group_Control_Border; use \Elementor\Group_Control_Box_Shadow; use \Elementor\Group_Control_Typography; use Elementor\Icons_Manager; use \Elementor\Plugin; use Elementor\Repeater; use \Elementor\Utils; use \Elementor\Widget_Base; use \Essential_Addons_Elementor\Classes\Helper; class Adv_Tabs extends Widget_Base { public function get_name() { return 'eael-adv-tabs'; } public function get_title() { return esc_html__('Advanced Tabs', 'essential-addons-for-elementor-lite'); } public function get_icon() { return 'eaicon-advanced-tabs'; } public function get_categories() { return ['essential-addons-elementor']; } public function get_keywords() { return [ 'tab', 'tabs', 'ea tabs', 'ea advanced tabs', 'panel', 'navigation', 'group', 'tabs content', 'product tabs', 'ea', 'essential addons', 'Liquid Glass Effect', 'Glassmorphism', 'Frost Effect', ]; } protected function is_dynamic_content():bool { if( Plugin::$instance->editor->is_edit_mode() ) { return false; } $settings = $this->get_data( 'settings' ); if ( empty( $settings ) || ! is_array( $settings ) ) { return false; } // ACF Repeater pulls per-post data — treat as dynamic so it is not statically cached. if ( 'acf_repeater' === ( $settings['eael_at_data_source'] ?? 'custom' ) ) { return true; } $tabs = $settings['eael_adv_tabs_tab'] ?? []; $is_dynamic_content = false; if( ! empty( $tabs ) ){ foreach( $tabs as $tab ){ if( isset( $tab['eael_adv_tabs_text_type'] ) && 'template' == $tab['eael_adv_tabs_text_type'] ) { $is_dynamic_content = true; break; } } } return $is_dynamic_content; } public function has_widget_inner_wrapper(): bool { return ! Helper::eael_e_optimized_markup(); } public function get_custom_help_url() { return 'https://essential-addons.com/elementor/docs/advanced-tabs/'; } /** * Registers ACF Repeater data-source controls for Advanced Tabs (Lite-native). * Minimal field set: Tab Title, Tab Content, and Icon Class / Icon Image. */ protected function eael_register_acf_controls() { $this->start_controls_section( 'eael_at_section_data_source', [ 'label' => esc_html__( 'Data Source', 'essential-addons-for-elementor-lite' ), ] ); $this->add_control( 'eael_at_data_source', [ 'label' => esc_html__( 'Source', 'essential-addons-for-elementor-lite' ), 'type' => Controls_Manager::SELECT, 'default' => 'custom', 'options' => [ 'custom' => esc_html__( 'Custom (Manual)', 'essential-addons-for-elementor-lite' ), 'acf_repeater' => esc_html__( 'ACF Repeater Field', 'essential-addons-for-elementor-lite' ), ], ] ); $this->add_control( 'eael_at_acf_repeater_field', [ 'label' => esc_html__( 'Repeater Field', 'essential-addons-for-elementor-lite' ), 'type' => Controls_Manager::SELECT, 'default' => '', 'options' => Helper::eael_get_acf_repeater_options(), 'condition' => [ 'eael_at_data_source' => 'acf_repeater' ], ] ); // ACF inactive notice (no-op when ACF is active). Helper::eael_acf_notice_controls( $this, [ 'eael_at_data_source' => 'acf_repeater' ] ); // Per-repeater sub-field mapping. $acf_sub_fields_by_repeater = Helper::eael_get_acf_repeater_sub_fields(); foreach ( $acf_sub_fields_by_repeater as $repeater_name => $sub_field_options ) { $repeater_condition = [ 'eael_at_data_source' => 'acf_repeater', 'eael_at_acf_repeater_field' => $repeater_name, ]; $this->add_control( 'eael_at_acf_fields_heading_' . $repeater_name, [ 'label' => esc_html__( 'Field Mapping', 'essential-addons-for-elementor-lite' ), 'type' => Controls_Manager::HEADING, 'separator' => 'before', 'condition' => $repeater_condition, ] ); $this->add_control( 'eael_at_acf_repeater_title_' . $repeater_name, [ 'label' => esc_html__( 'Tab Title', 'essential-addons-for-elementor-lite' ), 'type' => Controls_Manager::SELECT, 'default' => '', 'options' => $sub_field_options, 'condition' => $repeater_condition, ] ); $this->add_control( 'eael_at_acf_repeater_content_' . $repeater_name, [ 'label' => esc_html__( 'Tab Content', 'essential-addons-for-elementor-lite' ), 'description' => esc_html__( 'Map a Text, Textarea, or WYSIWYG ACF field.', 'essential-addons-for-elementor-lite' ), 'type' => Controls_Manager::SELECT, 'default' => '', 'options' => $sub_field_options, 'condition' => $repeater_condition, ] ); $this->add_control( 'eael_at_acf_repeater_image_' . $repeater_name, [ 'label' => esc_html__( 'Icon Image', 'essential-addons-for-elementor-lite' ), 'description' => esc_html__( 'Map an ACF Image field for the tab icon.', 'essential-addons-for-elementor-lite' ), 'type' => Controls_Manager::SELECT, 'default' => '', 'options' => $sub_field_options, 'condition' => $repeater_condition, ] ); $extra_field_options = $sub_field_options; unset( $extra_field_options[''] ); $this->add_control( 'eael_at_acf_repeater_extras_' . $repeater_name, [ 'label' => esc_html__( 'Additional Fields', 'essential-addons-for-elementor-lite' ), 'description' => esc_html__( 'Select extra sub-fields to display below each tab content.', 'essential-addons-for-elementor-lite' ), 'type' => Controls_Manager::SELECT2, 'multiple' => true, 'default' => [], 'options' => $extra_field_options, 'label_block' => true, 'condition' => $repeater_condition, ] ); } $this->end_controls_section(); } /** * Returns the tabs to render. * * Custom mode returns the manual repeater unchanged. ACF mode maps the selected * ACF Repeater field's rows into the item shape the render loops consume. ACF tabs * are always content-type (the "template" option cannot come from ACF). * * @param array $settings Widget settings from get_settings_for_display(). * @return array */ protected function get_adv_tabs_items( $settings ) { if ( 'acf_repeater' !== ( $settings['eael_at_data_source'] ?? 'custom' ) ) { return is_array( $settings['eael_adv_tabs_tab'] ?? null ) ? $settings['eael_adv_tabs_tab'] : []; } $field_name = sanitize_text_field( $settings['eael_at_acf_repeater_field'] ?? '' ); if ( empty( $field_name ) || ! function_exists( 'get_field' ) ) { return []; } $title_key = sanitize_text_field( $settings[ 'eael_at_acf_repeater_title_' . $field_name ] ?? '' ); $content_key = sanitize_text_field( $settings[ 'eael_at_acf_repeater_content_' . $field_name ] ?? '' ); $image_key = sanitize_text_field( $settings[ 'eael_at_acf_repeater_image_' . $field_name ] ?? '' ); $extra_keys = ( isset( $settings[ 'eael_at_acf_repeater_extras_' . $field_name ] ) && is_array( $settings[ 'eael_at_acf_repeater_extras_' . $field_name ] ) ) ? $settings[ 'eael_at_acf_repeater_extras_' . $field_name ] : []; // Resolve sub-field labels once for the selected additional fields. $sub_field_labels = []; if ( ! empty( $extra_keys ) && function_exists( 'acf_get_field' ) ) { $repeater_field = acf_get_field( $field_name ); if ( ! empty( $repeater_field['sub_fields'] ) ) { foreach ( $repeater_field['sub_fields'] as $sf ) { $sub_field_labels[ $sf['name'] ] = $sf['label']; } } } $object_id = get_the_ID() ?: get_queried_object_id(); $rows = get_field( $field_name, $object_id ); if ( empty( $rows ) || ! is_array( $rows ) ) { return []; } $items = []; $i = 0; foreach ( $rows as $row ) { if ( ! is_array( $row ) ) { continue; } // Title / content kept raw; render escapes (wp_kses + parse_text_editor). $title = ( $title_key && is_scalar( $row[ $title_key ] ?? null ) ) ? (string) $row[ $title_key ] : ''; $content = ( $content_key && is_scalar( $row[ $content_key ] ?? null ) ) ? (string) $row[ $content_key ] : ''; // Image: ACF image array, attachment ID, or URL string. $image = [ 'url' => '', 'id' => 0 ]; if ( $image_key ) { $raw_image = $row[ $image_key ] ?? ''; if ( is_array( $raw_image ) ) { $image['url'] = $raw_image['url'] ?? ''; $image['id'] = (int) ( $raw_image['ID'] ?? ( $raw_image['id'] ?? 0 ) ); } elseif ( is_numeric( $raw_image ) ) { $image['id'] = (int) $raw_image; $image['url'] = (string) wp_get_attachment_url( $image['id'] ); } elseif ( is_string( $raw_image ) && '' !== $raw_image ) { $image['url'] = $raw_image; } } $icon_type = ( '' !== $image['url'] ) ? 'image' : 'none'; // Additional fields: [ [ 'label' => ..., 'value' => ... ], ... ]. $extras = []; foreach ( $extra_keys as $ekey ) { $val = $row[ $ekey ] ?? ''; if ( '' === $val || null === $val || [] === $val ) { continue; } $extras[] = [ 'label' => $sub_field_labels[ $ekey ] ?? $ekey, 'value' => is_scalar( $val ) ? (string) $val : '', ]; } $items[] = [ 'eael_adv_tabs_tab_show_as_default' => ( 0 === $i ? 'active-default' : 'inactive' ), 'eael_adv_tabs_tab_show_as_scheduled' => 'no', 'eael_adv_tabs_schedule_date' => '', 'eael_adv_tabs_schedule_end_date' => '', 'eael_adv_tabs_icon_type' => $icon_type, 'eael_adv_tabs_tab_title_icon_new' => '', 'eael_adv_tabs_tab_title_icon' => '', 'eael_adv_tabs_tab_title_image' => $image, 'eael_adv_tabs_tab_title' => $title, 'eael_adv_tabs_tab_title_html_tag' => 'span', 'eael_adv_tabs_text_type' => 'content', 'eael_adv_tabs_tab_content' => $content, 'eael_adv_tabs_tab_id' => 'eael-acf-tab-' . ( $i + 1 ), 'eael_at_extras' => $extras, '_id' => uniqid( 'at_', false ), ]; $i++; } return $items; } /** * Style controls for the ACF "Additional Fields" output (Style tab). * Only shown when the data source is an ACF Repeater. */ protected function eael_acf_extra_data_controls_style() { $this->start_controls_section( 'eael_at_section_extra_data_style', [ 'label' => esc_html__( 'Additional Fields', 'essential-addons-for-elementor-lite' ), 'tab' => Controls_Manager::TAB_STYLE, 'condition' => [ 'eael_at_data_source' => 'acf_repeater', ], ] ); $this->add_control( 'eael_at_extra_data_text_color', [ 'label' => esc_html__( 'Color', 'essential-addons-for-elementor-lite' ), 'type' => Controls_Manager::COLOR, 'selectors' => [ '{{WRAPPER}} .eael-adv-tabs-extras .eael-adv-tabs-extra-value' => 'color: {{VALUE}}', ], ] ); $this->add_group_control( Group_Control_Typography::get_type(), [ 'name' => 'eael_at_extra_data_text_typography', 'selector' => '{{WRAPPER}} .eael-adv-tabs-extras .eael-adv-tabs-extra-value', ] ); $this->add_control( 'eael_at_extra_data_text_margin', [ 'label' => esc_html__( 'Margin', 'essential-addons-for-elementor-lite' ), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => [ 'px', '%', 'em', 'rem', 'custom' ], 'selectors' => [ '{{WRAPPER}} .eael-adv-tabs-extras .eael-adv-tabs-extra' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], ] ); $this->add_control( 'eael_at_extra_data_text_padding', [ 'label' => esc_html__( 'Padding', 'essential-addons-for-elementor-lite' ), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => [ 'px', '%', 'em', 'rem', 'custom' ], 'selectors' => [ '{{WRAPPER}} .eael-adv-tabs-extras .eael-adv-tabs-extra' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], ] ); $this->end_controls_section(); } protected function register_controls() { $this->eael_register_acf_controls(); /** * Advance Tabs Settings */ $this->start_controls_section( 'eael_section_adv_tabs_settings', [ 'label' => esc_html__('General Settings', 'essential-addons-for-elementor-lite'), ] ); $image_path = EAEL_PLUGIN_URL . 'assets/admin/images/layout-previews/advtab-'; $eael_fg_layout = apply_filters( 'eael_adv_tab_styles', [ 'styles' => [ 'default' => [ 'title' => esc_html__( 'Default', 'essential-addons-for-elementor-lite' ), 'image' => $image_path . 'default.png' ], 'glassey' => [ 'title' => esc_html__( 'Liquid Glass (Pro)', 'essential-addons-for-elementor-lite' ), 'image' => $image_path . 'glassey.png' ], ], 'conditions' => ['glassey'], ] ); $this->add_control( 'eael_adv_tab_new_style', [ 'label' => esc_html__('Styles', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::CHOOSE, 'default' => 'default', 'label_block' => true, 'toggle' => false, 'image_choose'=> true, 'options' => $eael_fg_layout['styles'], ] ); $this->add_control( 'eael_adv_tab_style_pro_alert', [ 'label' => sprintf( '<a target="_blank" href="https://wpdeveloper.com/upgrade/ea-pro">%s</a>', esc_html__('Only Available in Pro Version!', 'essential-addons-for-elementor-lite')), 'type' => Controls_Manager::HEADING, 'condition' => [ 'eael_adv_tab_new_style' => $eael_fg_layout['conditions'], ], ] ); $this->add_control( 'eael_adv_tab_layout', [ 'label' => esc_html__('Layout', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::SELECT, 'default' => 'eael-tabs-horizontal', 'label_block' => false, 'options' => [ 'eael-tabs-horizontal' => esc_html__('Horizontal', 'essential-addons-for-elementor-lite'), 'eael-tabs-vertical' => esc_html__('Vertical', 'essential-addons-for-elementor-lite'), ], ] ); $this->add_control( 'eael_adv_tabs_icon_show', [ 'label' => esc_html__('Enable Icon', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::SWITCHER, 'default' => 'yes', 'return_value' => 'yes', ] ); $this->add_control( 'eael_adv_tab_icon_position', [ 'label' => esc_html__('Icon Position', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::SELECT, 'default' => 'eael-tab-inline-icon', 'label_block' => false, 'options' => [ 'eael-tab-top-icon' => esc_html__('Stacked', 'essential-addons-for-elementor-lite'), 'eael-tab-inline-icon' => esc_html__('Inline', 'essential-addons-for-elementor-lite'), ], 'condition' => [ 'eael_adv_tabs_icon_show' => 'yes', ], ] ); $this->add_control( 'eael_adv_tabs_tab_icon_alignment', [ 'label' => esc_html__( 'Icon Alignment', 'essential-addons-for-elementor-lite' ), 'description' => sprintf( __( 'Set icon position before/after the tab title.', 'essential-addons-for-elementor-lite' ) ), 'type' => Controls_Manager::CHOOSE, 'default' => 'before', 'options' => [ 'before' => [ 'title' => esc_html__( 'Before', 'essential-addons-for-elementor-lite' ), 'icon' => 'eicon-h-align-left', ], 'after' => [ 'title' => esc_html__( 'After', 'essential-addons-for-elementor-lite' ), 'icon' => 'eicon-h-align-right', ], ], 'condition' => [ 'eael_adv_tab_icon_position' => 'eael-tab-inline-icon', ], ] ); $this->add_control( 'eael_adv_tabs_default_active_tab', [ 'label' => esc_html__('Auto Active?', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::SWITCHER, 'description' => esc_html__('Activate the first tab if no tab is selected as the active tab.', 'essential-addons-for-elementor-lite'), 'default' => 'yes', 'return_value' => 'yes', 'label_on' => __('Yes', 'essential-addons-for-elementor-lite'), 'label_off' => __('No', 'essential-addons-for-elementor-lite'), ] ); $this->add_control( 'eael_adv_tabs_toggle_tab', [ 'label' => esc_html__('Toggle Tab', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::SWITCHER, 'description' => esc_html__('Enables tab to expand and collapse.', 'essential-addons-for-elementor-lite'), 'default' => '', 'return_value' => 'yes', 'label_on' => __('Yes', 'essential-addons-for-elementor-lite'), 'label_off' => __('No', 'essential-addons-for-elementor-lite'), ] ); $this->add_control( 'eael_adv_tabs_custom_id_offset', [ 'label' => esc_html__('Custom ID offset', 'essential-addons-for-elementor-lite'), 'description' => esc_html__('Use offset to set the custom ID target scrolling position.', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::NUMBER, 'label_block' => false, 'default' => 0, 'min' => 0, ] ); $this->add_control( 'eael_adv_tabs_scroll_speed', [ 'label' => esc_html__('Scroll Speed (ms)', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::NUMBER, 'label_block' => false, 'default' => 300, ] ); $this->add_control( 'eael_adv_tabs_scroll_onclick', [ 'label' => esc_html__('Scroll on Click', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::SWITCHER, 'default' => 'no', 'return_value' => 'yes', ] ); $this->end_controls_section(); /** * Advance Tabs Content Settings */ $this->start_controls_section( 'eael_section_adv_tabs_content_settings', [ 'label' => esc_html__('Content', 'essential-addons-for-elementor-lite'), 'condition' => [ 'eael_at_data_source' => 'custom' ], ] ); $repeater = new Repeater(); $repeater->add_control( 'eael_adv_tabs_tab_show_as_default', [ 'label' => __('Active as Default', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::SWITCHER, 'default' => 'inactive', 'return_value' => 'active-default', ] ); $repeater->add_control( 'eael_adv_tabs_tab_show_as_scheduled', [ 'label' => __('Active as Scheduled', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::SWITCHER, 'label_on' => __('Yes', 'essential-addons-for-elementor-lite'), 'label_off' => __('No', 'essential-addons-for-elementor-lite'), 'return_value' => 'yes', 'default' => 'no', 'description' => __('When enabled, this tab will become active if the current date matches the scheduled date/time.', 'essential-addons-for-elementor-lite'), ] ); $repeater->add_control( 'eael_adv_tabs_schedule_date', [ 'label' => __('Start Date', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::DATE_TIME, 'default' => gmdate('Y-m-d H:i', current_time('timestamp', 0)), 'picker_options' => [ 'enableTime' => true, 'altInput' => true, 'altFormat' => 'M j, Y h:i K', 'dateFormat' => 'Y-m-d H:i', ], 'condition' => [ 'eael_adv_tabs_tab_show_as_scheduled' => 'yes', ], ] ); $repeater->add_control( 'eael_adv_tabs_schedule_end_date', [ 'label' => __('End Date', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::DATE_TIME, 'default' => '', 'picker_options' => [ 'enableTime' => true, 'altInput' => true, 'altFormat' => 'M j, Y h:i K', 'dateFormat' => 'Y-m-d H:i', ], 'condition' => [ 'eael_adv_tabs_tab_show_as_scheduled' => 'yes', ], ] ); $repeater->add_control( 'eael_adv_tabs_icon_type', [ 'label' => esc_html__('Icon Type', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::CHOOSE, 'label_block' => false, 'options' => [ 'none' => [ 'title' => esc_html__('None', 'essential-addons-for-elementor-lite'), 'icon' => 'fa fa-ban', ], 'icon' => [ 'title' => esc_html__('Icon', 'essential-addons-for-elementor-lite'), 'icon' => 'eicon-icon-box', ], 'image' => [ 'title' => esc_html__('Image', 'essential-addons-for-elementor-lite'), 'icon' => 'eicon-image-bold', ], ], 'default' => 'icon', ] ); $repeater->add_control( 'eael_adv_tabs_tab_title_icon_new', [ 'label' => esc_html__('Icon', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::ICONS, 'fa4compatibility' => 'eael_adv_tabs_tab_title_icon', 'default' => [ 'value' => 'fas fa-home', 'library' => 'fa-solid', ], 'condition' => [ 'eael_adv_tabs_icon_type' => 'icon', ], ] ); $repeater->add_control( 'eael_adv_tabs_tab_title_image', [ 'label' => esc_html__('Image', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::MEDIA, 'default' => [ 'url' => Utils::get_placeholder_image_src(), ], 'condition' => [ 'eael_adv_tabs_icon_type' => 'image', ], 'ai' => [ 'active' => false, ], ] ); $repeater->add_control( 'eael_adv_tabs_tab_title', [ 'name' => 'eael_adv_tabs_tab_title', 'label' => esc_html__('Tab Title', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::TEXT, 'default' => esc_html__('Tab Title', 'essential-addons-for-elementor-lite'), 'dynamic' => ['active' => true], 'ai' => [ 'active' => true, ], ] ); $repeater->add_control( 'eael_adv_tabs_tab_title_html_tag', [ 'name' => 'eael_adv_tabs_tab_title', 'label' => esc_html__('Title HTML Tag', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::SELECT, 'options' => [ 'h1' => 'H1', 'h2' => 'H2', 'h3' => 'H3', 'h4' => 'H4', 'h5' => 'H5', 'h6' => 'H6', 'div' => 'div', 'span' => 'span', 'p' => 'p', ], 'default' => 'span', 'dynamic' => ['active' => true], ] ); $repeater->add_control( 'eael_adv_tabs_text_type', [ 'label' => __('Content Type', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::SELECT, 'options' => [ 'content' => __('Content', 'essential-addons-for-elementor-lite'), 'template' => __('Saved Templates', 'essential-addons-for-elementor-lite'), ], 'default' => 'content', ] ); $repeater->add_control( 'eael_primary_templates', [ 'label' => __('Choose Template', 'essential-addons-for-elementor-lite'), 'type' => 'eael-select2', 'source_name' => 'post_type', 'source_type' => 'elementor_library', 'label_block' => true, 'condition' => [ 'eael_adv_tabs_text_type' => 'template', ], ] ); $repeater->add_control( 'eael_adv_tabs_tab_content', [ 'label' => esc_html__('Tab Content', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::WYSIWYG, 'default' => esc_html__('Enhance user experience with Advanced Tabs, allowing seamless content navigation. Organize information efficiently while keeping the interface clean and interactive. Perfect for FAQs, product details, or multi-section content.', 'essential-addons-for-elementor-lite'), 'dynamic' => ['active' => true], 'condition' => [ 'eael_adv_tabs_text_type' => 'content', ], ] ); $repeater->add_control( 'eael_adv_tabs_tab_id', [ 'label' => esc_html__('Custom ID', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::TEXT, 'description' => esc_html__( 'Custom ID will be added as an anchor tag. For example, if you add ‘test’ as your custom ID, the link will become like the following: https://www.example.com/#test and it will open the respective tab directly.', 'essential-addons-for-elementor-lite' ), 'default' => '', 'ai' => [ 'active' => true, ], ] ); $this->add_control( 'eael_adv_tabs_tab', [ 'type' => Controls_Manager::REPEATER, 'seperator' => 'before', 'default' => [ [ 'eael_adv_tabs_tab_title' => esc_html__('Mission', 'essential-addons-for-elementor-lite'), 'eael_adv_tabs_tab_title_icon_new' => [ 'value' => 'far fa-lightbulb', 'library' => 'fa-solid', ], ], [ 'eael_adv_tabs_tab_title' => esc_html__('Vision', 'essential-addons-for-elementor-lite'), 'eael_adv_tabs_tab_title_icon_new' => [ 'value' => 'fas fa-eye', 'library' => 'fa-solid', ], ], [ 'eael_adv_tabs_tab_title' => esc_html__('Philosophy', 'essential-addons-for-elementor-lite'), 'eael_adv_tabs_tab_title_icon_new' => [ 'value' => 'fas fa-filter', 'library' => 'fa-solid', ], ], ], 'fields' => $repeater->get_controls(), 'title_field' => '{{eael_adv_tabs_tab_title}}', ] ); $this->end_controls_section(); if (!apply_filters('eael/pro_enabled', false)) { $this->start_controls_section( 'eael_section_pro', [ 'label' => __('Go Premium for More Features', 'essential-addons-for-elementor-lite'), ] ); $this->add_control( 'eael_control_get_pro', [ 'label' => __('Unlock more possibilities', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::CHOOSE, 'options' => [ '1' => [ 'title' => '', 'icon' => 'fa fa-unlock-alt', ], ], 'default' => '1', 'description' => '<span class="pro-feature"> Get the <a href="https://wpdeveloper.com/upgrade/ea-pro" target="_blank">Pro version</a> for more stunning elements and customization options.</span>', ] ); $this->end_controls_section(); } /** * ------------------------------------------- * Tab Style Advance Tabs Generel Style * ------------------------------------------- */ $this->start_controls_section( 'eael_section_adv_tabs_style_settings', [ 'label' => esc_html__('General', 'essential-addons-for-elementor-lite'), 'tab' => Controls_Manager::TAB_STYLE, ] ); $this->add_responsive_control( 'eael_adv_tabs_padding', [ 'label' => esc_html__('Padding', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => ['px', 'em', '%'], 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], ] ); $this->add_responsive_control( 'eael_adv_tabs_margin', [ 'label' => esc_html__('Margin', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => ['px', 'em', '%'], 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], ] ); $this->add_group_control( Group_Control_Border::get_type(), [ 'name' => 'eael_adv_tabs_border', 'label' => esc_html__('Border', 'essential-addons-for-elementor-lite'), 'selector' => '{{WRAPPER}} .eael-advance-tabs', ] ); $this->add_responsive_control( 'eael_adv_tabs_border_radius', [ 'label' => esc_html__('Border Radius', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => ['px', 'em', '%'], 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], ] ); $this->add_group_control( Group_Control_Box_Shadow::get_type(), [ 'name' => 'eael_adv_tabs_box_shadow', 'selector' => '{{WRAPPER}} .eael-advance-tabs', ] ); $this->end_controls_section(); /** * ------------------------------------------- * Tab Style Advance Tabs Content Style * ------------------------------------------- */ $this->start_controls_section( 'eael_section_adv_tabs_tab_style_settings', [ 'label' => esc_html__('Tab Title', 'essential-addons-for-elementor-lite'), 'tab' => Controls_Manager::TAB_STYLE, ] ); $this->add_group_control( Group_Control_Typography::get_type(), [ 'name' => 'eael_adv_tabs_tab_title_typography', 'selector' => '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li', ] ); $this->add_responsive_control( 'eael_adv_tabs_title_width', [ 'label' => __('Title Min Width', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::SLIDER, 'size_units' => ['px', 'em', '%'], 'range' => [ 'px' => [ 'min' => 0, 'max' => 1000, 'step' => 1, ], 'em' => [ 'min' => 0, 'max' => 50, 'step' => 1, ], '%' => [ 'min' => 0, 'max' => 100, ], ], 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs.eael-tabs-vertical > .eael-tabs-nav' => 'min-width: {{SIZE}}{{UNIT}};', ], 'condition' => [ 'eael_adv_tab_layout' => 'eael-tabs-vertical', ], ] ); $this->add_responsive_control( 'eael_adv_tabs_tab_icon_size', [ 'label' => __('Icon Size', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::SLIDER, 'default' => [ 'size' => 16, 'unit' => 'px', ], 'size_units' => ['px'], 'range' => [ 'px' => [ 'min' => 0, 'max' => 200, 'step' => 1, ], ], 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li i' => 'font-size: {{SIZE}}{{UNIT}};', '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li img' => 'width: {{SIZE}}{{UNIT}};', '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li svg' => 'width: {{SIZE}}{{UNIT}}; height: {{SIZE}}{{UNIT}};', ], ] ); $this->add_responsive_control( 'eael_adv_tabs_tab_icon_gap', [ 'label' => __('Icon Gap', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::SLIDER, 'default' => [ 'size' => 10, 'unit' => 'px', ], 'size_units' => ['px'], 'range' => [ 'px' => [ 'min' => 0, 'max' => 100, 'step' => 1, ], ], 'selectors' => [ '{{WRAPPER}} .eael-tab-inline-icon li .title-before-icon' => 'margin-right: {{SIZE}}{{UNIT}};', '{{WRAPPER}} .eael-tab-inline-icon li .title-after-icon' => 'margin-left: {{SIZE}}{{UNIT}};', '{{WRAPPER}} .eael-tab-top-icon li i, {{WRAPPER}} .eael-tab-top-icon li img, {{WRAPPER}} .eael-tab-top-icon li svg' => 'margin-bottom: {{SIZE}}{{UNIT}};', ], ] ); $this->add_responsive_control( 'eael_adv_tabs_tab_padding', [ 'label' => esc_html__('Padding', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => ['px', 'em', '%'], 'selectors' => [ '{{WRAPPER}} > .eael-advance-tabs > .eael-tabs-nav ul li' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', '{{WRAPPER}} > .elementor-widget-container > .eael-advance-tabs > .eael-tabs-nav ul li' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', // remove this after elementor permanently remove html class .elementor-widget-container ], ] ); $this->add_responsive_control( 'eael_adv_tabs_tab_margin', [ 'label' => esc_html__('Margin', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => ['px', 'em', '%'], 'selectors' => [ '{{WRAPPER}} > .eael-advance-tabs > .eael-tabs-nav ul li' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', '{{WRAPPER}} > .elementor-widget-container > .eael-advance-tabs > .eael-tabs-nav ul li' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', // remove this after elementor permanently remove html class .elementor-widget-container ], ] ); // Tab Bar Settings(Pro) do_action('eael_adv_tab_liquid_glass_effect_tab_bar', $this); $this->start_controls_tabs('eael_adv_tabs_header_tabs'); // Normal State Tab $this->start_controls_tab( 'eael_adv_tabs_header_normal', [ 'label' => esc_html__('Normal', 'essential-addons-for-elementor-lite'), 'condition' => [ 'eael_adv_tab_new_style' => 'default', ], ] ); $this->add_control( 'eael_adv_tabs_tab_color', [ 'label' => esc_html__('Background Color', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::COLOR, 'default' => '#f1f1f1', 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li' => 'background-color: {{VALUE}};', ], 'description' => __('This controller is depricated. use Background Type controller.', 'essential-addons-for-elementor-lite'), 'condition' => [ 'eael_adv_tab_new_style' => 'default', ], ] ); $this->add_group_control( Group_Control_Background::get_type(), [ 'name' => 'eael_adv_tabs_tab_bgtype', 'types' => ['classic', 'gradient'], 'selector' => '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li.eael-tab-nav-item', 'condition' => [ 'eael_adv_tab_new_style' => 'default', ], ] ); $this->add_control( 'eael_adv_tabs_tab_text_color', [ 'label' => esc_html__('Text Color', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::COLOR, 'default' => '#333', 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li' => 'color: {{VALUE}};', ], 'condition' => [ 'eael_adv_tab_new_style' => 'default', ], ] ); $this->add_control( 'eael_adv_tabs_tab_icon_color', [ 'label' => esc_html__('Icon Color', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::COLOR, 'default' => '#333', 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li i' => 'color: {{VALUE}};', '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li svg' => 'fill: {{VALUE}};', ], 'condition' => [ 'eael_adv_tabs_icon_show' => 'yes', 'eael_adv_tab_new_style' => 'default', ], ] ); $this->add_group_control( Group_Control_Border::get_type(), [ 'name' => 'eael_adv_tabs_tab_border', 'label' => esc_html__('Border', 'essential-addons-for-elementor-lite'), 'selector' => '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li', 'condition' => [ 'eael_adv_tab_new_style' => 'default', ], ] ); $this->add_responsive_control( 'eael_adv_tabs_tab_border_radius', [ 'label' => esc_html__('Border Radius', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => ['px', 'em', '%'], 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], 'condition' => [ 'eael_adv_tab_new_style' => 'default', ], ] ); $this->end_controls_tab(); // Hover State Tab $this->start_controls_tab( 'eael_adv_tabs_header_hover', [ 'label' => esc_html__('Hover', 'essential-addons-for-elementor-lite'), 'condition' => [ 'eael_adv_tab_new_style' => 'default', ], ] ); $this->add_control( 'eael_adv_tabs_tab_color_hover', [ 'label' => esc_html__('Background Color', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::COLOR, 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li:hover:not(.active)' => 'background-color: {{VALUE}};', ], 'description' => __('This controller is depricated. use Background Type controller.', 'essential-addons-for-elementor-lite'), 'condition' => [ 'eael_adv_tab_new_style' => 'default', ], ] ); $this->add_group_control( Group_Control_Background::get_type(), [ 'name' => 'eael_adv_tabs_tab_bgtype_hover', 'types' => ['classic', 'gradient'], 'fields_options' => [ 'background' => [ 'default' => 'classic', ], 'color' => [ 'default' => '#333', ], ], 'selector' => '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li.eael-tab-nav-item:hover:not(.active)', 'condition' => [ 'eael_adv_tab_new_style' => 'default', ], ] ); $this->add_control( 'eael_adv_tabs_tab_text_color_hover', [ 'label' => esc_html__('Text Color', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::COLOR, 'default' => '#fff', 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li:hover' => 'color: {{VALUE}};', ], ] ); $this->add_control( 'eael_adv_tabs_tab_icon_color_hover', [ 'label' => esc_html__('Icon Color', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::COLOR, 'default' => '#fff', 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li:hover > i' => 'color: {{VALUE}};', '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li:hover > svg' => 'fill: {{VALUE}};', ], 'condition' => [ 'eael_adv_tabs_icon_show' => 'yes', ], ] ); $this->add_group_control( Group_Control_Border::get_type(), [ 'name' => 'eael_adv_tabs_tab_border_hover', 'label' => esc_html__('Border', 'essential-addons-for-elementor-lite'), 'selector' => '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li:hover', 'condition' => [ 'eael_adv_tab_new_style' => 'default', ], ] ); $this->add_responsive_control( 'eael_adv_tabs_tab_border_radius_hover', [ 'label' => esc_html__('Border Radius', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => ['px', 'em', '%'], 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li:hover' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], 'condition' => [ 'eael_adv_tab_new_style' => 'default', ], ] ); $this->end_controls_tab(); // Active State Tab $this->start_controls_tab( 'eael_adv_tabs_header_active', [ 'label' => esc_html__('Active', 'essential-addons-for-elementor-lite'), 'condition' => [ 'eael_adv_tab_new_style' => 'default', ], ] ); $this->add_control( 'eael_adv_tabs_tab_color_active', [ 'label' => esc_html__('Background Color', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::COLOR, 'default' => '#444', 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul .active' => 'background-color: {{VALUE}};', ], 'description' => __('This controller is depricated. use Background Type controller.', 'essential-addons-for-elementor-lite'), 'condition' => [ 'eael_adv_tab_new_style' => 'default', ], ] ); $this->add_group_control( Group_Control_Background::get_type(), [ 'name' => 'eael_adv_tabs_tab_bgtype_active', 'types' => ['classic', 'gradient'], 'selector' => '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li.active', 'condition' => [ 'eael_adv_tab_new_style' => 'default', ], ] ); $this->add_control( 'eael_adv_tabs_tab_text_color_active', [ 'label' => esc_html__('Text Color', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::COLOR, 'default' => '#fff', 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li.active' => 'color: {{VALUE}};', ], ] ); $this->add_control( 'eael_adv_tabs_tab_icon_color_active', [ 'label' => esc_html__('Icon Color', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::COLOR, 'default' => '#fff', 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li.active > i' => 'color: {{VALUE}};', //'{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li.active-default > i' => 'color: {{VALUE}};', '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li.active > svg' => 'fill: {{VALUE}};', //'{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li.active-default > svg' => 'fill: {{VALUE}};', ], 'condition' => [ 'eael_adv_tabs_icon_show' => 'yes', ], ] ); $this->add_group_control( Group_Control_Border::get_type(), [ 'name' => 'eael_adv_tabs_tab_border_active', 'label' => esc_html__('Border', 'essential-addons-for-elementor-lite'), 'selector' => '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li.active', 'condition' => [ 'eael_adv_tab_new_style' => 'default', ], ] ); $this->add_responsive_control( 'eael_adv_tabs_tab_border_radius_active', [ 'label' => esc_html__('Border Radius', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => ['px', 'em', '%'], 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li.active' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], 'condition' => [ 'eael_adv_tab_new_style' => 'default', ], ] ); $this->end_controls_tab(); $this->end_controls_tabs(); $this->end_controls_section(); /** * ------------------------------------------- * Tab Style Advance Tabs Content Style * ------------------------------------------- */ $this->start_controls_section( 'eael_section_adv_tabs_tab_content_style_settings', [ 'label' => esc_html__('Content', 'essential-addons-for-elementor-lite'), 'tab' => Controls_Manager::TAB_STYLE, ] ); $this->add_control( 'adv_tabs_content_bg_color', [ 'label' => esc_html__('Background Color', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::HIDDEN, 'default' => '', 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs .eael-tabs-content > div' => 'background-color: {{VALUE}};', ], ] ); $this->add_group_control( Group_Control_Background::get_type(), [ 'name' => 'adv_tabs_content_bgtype', 'types' => ['classic', 'gradient'], 'selector' => '{{WRAPPER}} .eael-advance-tabs .eael-tabs-content > div.eael-tab-content-item', ] ); $this->add_control( 'adv_tabs_content_text_color', [ 'label' => esc_html__('Text Color', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::COLOR, 'default' => '#333', 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs .eael-tabs-content > div' => 'color: {{VALUE}};', ], ] ); $this->add_group_control( Group_Control_Typography::get_type(), [ 'name' => 'eael_adv_tabs_content_typography', 'selector' => '{{WRAPPER}} .eael-advance-tabs .eael-tabs-content > div', ] ); $this->add_responsive_control( 'eael_adv_tabs_content_padding', [ 'label' => esc_html__('Padding', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => ['px', 'em', '%'], 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs .eael-tabs-content > div' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], ] ); $this->add_responsive_control( 'eael_adv_tabs_content_margin', [ 'label' => esc_html__('Margin', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => ['px', 'em', '%'], 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs .eael-tabs-content > div' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], ] ); $this->add_group_control( Group_Control_Border::get_type(), [ 'name' => 'eael_adv_tabs_content_border', 'label' => esc_html__('Border', 'essential-addons-for-elementor-lite'), 'selector' => '{{WRAPPER}} .eael-advance-tabs .eael-tabs-content > div', ] ); $this->add_responsive_control( 'eael_adv_tabs_content_border_radius', [ 'label' => esc_html__('Border Radius', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => ['px', 'em', '%'], 'selectors' => [ '{{WRAPPER}} .eael-tabs-content' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], ] ); $this->add_group_control( Group_Control_Box_Shadow::get_type(), [ 'name' => 'eael_adv_tabs_content_shadow', 'selector' => '{{WRAPPER}} .eael-advance-tabs .eael-tabs-content > div', 'separator' => 'before', ] ); $this->end_controls_section(); /** * ------------------------------------------- * Tab Style Advance Tabs Caret Style * ------------------------------------------- */ $this->start_controls_section( 'eael_section_adv_tabs_tab_caret_style_settings', [ 'label' => esc_html__('Caret', 'essential-addons-for-elementor-lite'), 'tab' => Controls_Manager::TAB_STYLE, ] ); $this->add_control( 'eael_adv_tabs_tab_caret_show', [ 'label' => esc_html__('Show Caret on Active Tab', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::SWITCHER, 'default' => 'yes', 'return_value' => 'yes', ] ); $this->add_control( 'eael_adv_tabs_tab_caret_size', [ 'label' => esc_html__('Caret Size', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::SLIDER, 'default' => [ 'size' => 10, ], 'range' => [ 'px' => [ 'max' => 100, ], ], 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs .eael-tabs-nav > ul li:after' => 'border-width: {{SIZE}}px; bottom: -{{SIZE}}px', '{{WRAPPER}} .eael-advance-tabs.eael-tabs-vertical > .eael-tabs-nav > ul li:after' => 'right: -{{SIZE}}px; top: calc(50% - {{SIZE}}px) !important;', '.rtl {{WRAPPER}} .eael-advance-tabs.eael-tabs-vertical > .eael-tabs-nav > ul li:after' => 'right: auto; left: -{{SIZE}}px !important; top: calc(50% - {{SIZE}}px) !important;', ], 'condition' => [ 'eael_adv_tabs_tab_caret_show' => 'yes', ], ] ); $this->add_control( 'eael_adv_tabs_tab_caret_color', [ 'label' => esc_html__('Caret Color', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::COLOR, 'default' => '#444', 'selectors' => [ '{{WRAPPER}} .eael-advance-tabs:not(.eael-tabs-vertical) > .eael-tabs-nav > ul li:after' => 'border-top-color: {{VALUE}};', '{{WRAPPER}} .eael-advance-tabs.eael-tabs-vertical > .eael-tabs-nav > ul li:after' => 'border-left-color: {{VALUE}};', ], 'condition' => [ 'eael_adv_tabs_tab_caret_show' => 'yes', ], ] ); $this->end_controls_section(); /** * ------------------------------------------- * Tab Style: Advance Tabs Responsive Controls * ------------------------------------------- */ $this->start_controls_section( 'eael_ad_responsive_controls', [ 'label' => esc_html__('Responsive Controls', 'essential-addons-for-elementor-lite'), 'tab' => Controls_Manager::TAB_STYLE, ] ); $this->add_control( 'responsive_vertical_layout', [ 'label' => __('Vertical Layout', 'essential-addons-for-elementor-lite'), 'type' => Controls_Manager::SWITCHER, 'label_on' => __('Yes', 'essential-addons-for-elementor-lite'), 'label_off' => __('No', 'essential-addons-for-elementor-lite'), 'return_value' => 'yes', 'default' => 'yes', ] ); $this->end_controls_section(); $this->eael_acf_extra_data_controls_style(); } /** * Determine which tab should be active based on date/time scheduling windows * * @param array $settings Widget settings * @return int|null Index of the tab that should be active, or null if no schedule matches */ private function get_scheduled_active_tab($settings) { if (empty($settings['eael_adv_tabs_tab'])) { return null; } $current_timestamp = current_time('timestamp'); $matching_tabs = []; foreach ($settings['eael_adv_tabs_tab'] as $index => $tab) { if ('yes' === $tab['eael_adv_tabs_tab_show_as_scheduled'] && !empty($tab['eael_adv_tabs_schedule_date'])) { $start_datetime = trim($tab['eael_adv_tabs_schedule_date']); $end_datetime = !empty($tab['eael_adv_tabs_schedule_end_date']) ? trim($tab['eael_adv_tabs_schedule_end_date']) : ''; $start_timestamp = null; if (preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/', $start_datetime)) { $start_timestamp = strtotime($start_datetime); } $end_timestamp = null; if (!empty($end_datetime)) { if (preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/', $end_datetime)) { $end_timestamp = strtotime($end_datetime); } } $is_active = false; if ($start_timestamp) { if ($end_timestamp) { $is_active = ($current_timestamp >= $start_timestamp && $current_timestamp <= $end_timestamp); } else { $is_active = ($current_timestamp >= $start_timestamp); } } if ($is_active) { $matching_tabs[] = [ 'index' => $index, 'start_timestamp' => $start_timestamp, 'end_timestamp' => $end_timestamp, ]; } } } if (empty($matching_tabs)) { return null; } usort($matching_tabs, function($a, $b) { return $b['start_timestamp'] - $a['start_timestamp']; }); return $matching_tabs[0]['index']; } protected function render() { $settings = $this->get_settings_for_display(); // Swap in ACF-derived tabs when the data source is an ACF Repeater (both loops read this key). $settings['eael_adv_tabs_tab'] = $this->get_adv_tabs_items( $settings ); $scheduled_active_tab_index = $this->get_scheduled_active_tab($settings); $page_id = get_the_ID(); $eael_find_default_tab = []; $eael_adv_tab_id = 1; $eael_adv_tab_content_id = 1; $tab_icon_migrated = isset($settings['__fa4_migrated']['eael_adv_tabs_tab_title_icon_new']); $tab_icon_is_new = empty($settings['eael_adv_tabs_tab_title_icon']); $tab_auto_active = 'yes' === $settings['eael_adv_tabs_default_active_tab'] ? esc_attr('eael-tab-auto-active') : ''; $tab_tpggle = 'yes' === $settings['eael_adv_tabs_toggle_tab'] ? esc_attr( 'eael-tab-toggle' ) : ''; $this->add_render_attribute('eael_tab_wrapper', 'data-scroll-on-click', esc_attr( $settings['eael_adv_tabs_scroll_onclick'] )); $this->add_render_attribute('eael_tab_wrapper', 'data-scroll-speed', esc_attr( $settings['eael_adv_tabs_scroll_speed'] )); $this->add_render_attribute( 'eael_tab_wrapper', [ 'id' => "eael-advance-tabs-{$this->get_id()}", 'class' => ['eael-advance-tabs', $settings['eael_adv_tab_layout'], $tab_auto_active, $tab_tpggle], 'data-tabid' => $this->get_id(), ] ); if ($settings['eael_adv_tabs_tab_caret_show'] != 'yes') { $this->add_render_attribute('eael_tab_wrapper', 'class', 'active-caret-on'); } if ($settings['responsive_vertical_layout'] != 'yes') { $this->add_render_attribute('eael_tab_wrapper', 'class', 'responsive-vertical-layout'); } if( !empty($settings['eael_adv_tabs_custom_id_offset']) ){ $this->add_render_attribute('eael_tab_wrapper', 'data-custom-id-offset', esc_attr( $settings['eael_adv_tabs_custom_id_offset'] ) ); } $this->add_render_attribute('eael_tab_icon_position', 'class', esc_attr($settings['eael_adv_tab_icon_position'])); $this->add_render_attribute('eael_tab_icon_position', 'role', 'tablist'); // Filter allows Pro version to return CSS class based on style $tab_glassey_class = apply_filters( 'eael_adv_tab_glassey_class', '', $settings['eael_adv_tab_new_style'] ); $tab_glassey = $settings['eael_adv_tab_new_style'] === 'glassey' ? $tab_glassey_class : ''; $this->add_render_attribute( 'eael_tab_glassey', [ 'class' => [ 'eael-tabs-nav', $tab_glassey ], ] ); ?> <div <?php $this->print_render_attribute_string('eael_tab_wrapper'); ?>> <div <?php $this->print_render_attribute_string('eael_tab_glassey'); ?>> <ul <?php $this->print_render_attribute_string('eael_tab_icon_position'); ?>> <?php foreach ($settings['eael_adv_tabs_tab'] as $index => $tab) : $tab_id = $tab['eael_adv_tabs_tab_id'] ? $tab['eael_adv_tabs_tab_id'] : Helper::str_to_css_id( $tab['eael_adv_tabs_tab_title'] ); $tab_id = $tab_id === 'safari' ? 'eael-safari' : $tab_id; $tab_count = $index + 1; $tab_title_setting_key = $this->get_repeater_setting_key( 'eael_adv_tabs_tab_title', 'eael_adv_tabs_tab', $index ); $tab_active_class = ''; if ($scheduled_active_tab_index !== null) { if ($index === $scheduled_active_tab_index) { $tab_active_class = 'active-default'; } } else { $tab_active_class = $tab['eael_adv_tabs_tab_show_as_default']; } $this->add_render_attribute( $tab_title_setting_key, [ 'id' => $tab_id, 'class' => [ $tab_active_class, 'eael-tab-item-trigger', 'eael-tab-nav-item' ], 'aria-selected' => 1 === $tab_count ? 'true' : 'false', 'data-tab' => $tab_count, 'role' => 'tab', 'tabindex' => 1 === $tab_count ? '0' : '-1', 'aria-controls' => $tab_id . '-tab', 'aria-expanded' => 'false', ] ); $repeater_html_tag = ! empty( $tab['eael_adv_tabs_tab_title_html_tag'] ) ? Helper::eael_validate_html_tag( $tab['eael_adv_tabs_tab_title_html_tag'] ) : 'span'; $repeater_tab_title = $tab['eael_adv_tabs_tab_title']; ?> <li <?php $this->print_render_attribute_string( $tab_title_setting_key ); ?>> <?php if( $settings['eael_adv_tab_icon_position'] === 'eael-tab-inline-icon' && $settings['eael_adv_tabs_tab_icon_alignment'] === 'after' ) : ?> <?php $this->add_render_attribute( $tab_title_setting_key . '_repeater_tab_title_attr', [ 'class' => [ 'eael-tab-title', 'title-before-icon' ], ] ); echo '<' . esc_attr( $repeater_html_tag ) . ' '; $this->print_render_attribute_string( $tab_title_setting_key . '_repeater_tab_title_attr'); echo ' >'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo wp_kses_post( $repeater_tab_title ); echo '</' . esc_attr( $repeater_html_tag ) . '>'; ?> <?php endif; ?> <?php if ($settings['eael_adv_tabs_icon_show'] === 'yes') : if ($tab['eael_adv_tabs_icon_type'] === 'icon') : ?> <?php if ($tab_icon_is_new || $tab_icon_migrated) { Icons_Manager::render_icon( $tab['eael_adv_tabs_tab_title_icon_new'] ); } else { echo '<i class="' . esc_attr( $tab['eael_adv_tabs_tab_title_icon'] ) . '"></i>'; } ?> <?php elseif ($tab['eael_adv_tabs_icon_type'] === 'image') : $tab['eael_adv_tabs_tab_title_image'] = Helper::eael_wpml_translate_media( $tab['eael_adv_tabs_tab_title_image'] ); // WPML Media Translation compatibility ?> <img src="<?php echo esc_url( $tab['eael_adv_tabs_tab_title_image']['url'] ); ?>" alt="<?php echo esc_attr(get_post_meta($tab['eael_adv_tabs_tab_title_image']['id'], '_wp_attachment_image_alt', true)); ?>"> <?php endif; ?> <?php endif; ?> <?php if( $settings['eael_adv_tab_icon_position'] === 'eael-tab-inline-icon' && $settings['eael_adv_tabs_tab_icon_alignment'] !== 'after' ) : ?> <?php $this->add_render_attribute( $tab_title_setting_key . '_repeater_tab_title_attr', [ 'class' => [ 'eael-tab-title', 'title-after-icon' ], ] ); echo '<' . esc_attr( $repeater_html_tag ) . ' '; $this->print_render_attribute_string( $tab_title_setting_key . '_repeater_tab_title_attr'); echo ' >'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo wp_kses_post( $repeater_tab_title ); echo '</' . esc_attr( $repeater_html_tag ) . '>'; ?> <?php endif; ?> <?php if( $settings['eael_adv_tab_icon_position'] !== 'eael-tab-inline-icon' ) : ?> <?php $this->add_render_attribute( $tab_title_setting_key . '_repeater_tab_title_attr', [ 'class' => [ 'eael-tab-title', 'title-after-icon' ], ] ); echo '<' . esc_attr( $repeater_html_tag ) . ' '; $this->print_render_attribute_string( $tab_title_setting_key . '_repeater_tab_title_attr'); echo ' >'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo wp_kses_post( $repeater_tab_title ); echo '</' . esc_attr( $repeater_html_tag ) . '>'; ?> <?php endif; ?> </li> <?php endforeach; ?> <?php if ( 'glassey' === $settings['eael_adv_tab_new_style'] ) { ?> <div class="eael-tabs-glassey-svg"> <svg style="display: none"> <filter id="switcher" x="0" y="0" width="100%" height="100%" filterUnits="objectBoundingBox"> <feTurbulence type="fractalNoise" baseFrequency="0.003 0.007" numOctaves="1" result="turbulence" /> <feDisplacementMap in="SourceGraphic" in2="turbulence" scale="200" xChannelSelector="R" yChannelSelector="G" /> </filter> </svg> </div> <?php } ?> </ul> </div> <div class="eael-tabs-content"> <?php foreach ($settings['eael_adv_tabs_tab'] as $content_index => $tab) : $eael_find_default_tab[] = $tab['eael_adv_tabs_tab_show_as_default']; $tab_id = $tab['eael_adv_tabs_tab_id'] ? $tab['eael_adv_tabs_tab_id'] : Helper::str_to_css_id( $tab['eael_adv_tabs_tab_title'] ); $tab_id = $tab_id === 'safari' ? 'eael-safari-tab' : $tab_id . '-tab'; $content_active_class = ''; if ($scheduled_active_tab_index !== null) { if ($content_index === $scheduled_active_tab_index) { $content_active_class = 'active-default'; } } else { $content_active_class = $tab['eael_adv_tabs_tab_show_as_default']; } ?> <div id="<?php echo esc_attr( $tab_id ); ?>" class="clearfix eael-tab-content-item <?php echo esc_attr($content_active_class); ?>" data-title-link="<?php echo esc_attr( $tab_id ); ?>"> <?php if ('content' == $tab['eael_adv_tabs_text_type']) : $tab_content = $tab['eael_adv_tabs_tab_content']; if ( ! apply_filters( 'eael/advanced_tabs/allow_dangerous_html', false ) ) { $tab_content = wp_kses( $tab_content, Helper::eael_allowed_tags() ); } // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo $this->parse_text_editor( $tab_content ); elseif ('template' == $tab['eael_adv_tabs_text_type']) : if ( ! empty( $tab['eael_primary_templates'] ) ) { $current_page_id = get_the_ID(); $revisions = wp_get_post_revisions( $current_page_id ); $revision_ids = wp_list_pluck( $revisions, 'ID' ); if ( absint( $tab['eael_primary_templates'] ) === $current_page_id || in_array( absint( $tab['eael_primary_templates'] ), $revision_ids, true ) ) { echo '<p>' . esc_html__( 'The provided Template matches the current page or one of its revisions!', 'essential-addons-for-elementor-lite' ) . '</p>'; } else { if ( ! Helper::is_elementor_publish_template( $tab['eael_primary_templates'] ) ) { return; } // WPML Compatibility if ( ! is_array( $tab['eael_primary_templates'] ) ) { $tab['eael_primary_templates'] = apply_filters( 'wpml_object_id', $tab['eael_primary_templates'], 'elementor_library', true ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound } // Re-validate the translated template is a published elementor_library post before rendering. if ( Helper::is_elementor_publish_template( $tab['eael_primary_templates'] ) ) { Helper::eael_onpage_edit_template_markup( $page_id, $tab['eael_primary_templates'] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo Plugin::$instance->frontend->get_builder_content( $tab['eael_primary_templates'], true ); } } } endif; ?> <?php if ( ! empty( $tab['eael_at_extras'] ) ) : ?> <ul class="eael-adv-tabs-extras"> <?php foreach ( $tab['eael_at_extras'] as $extra ) : ?> <li class="eael-adv-tabs-extra"><span class="eael-adv-tabs-extra-value"><?php echo wp_kses_post( $extra['value'] ); ?></span></li> <?php endforeach; ?> </ul> <?php endif; ?> </div> <?php endforeach; ?> </div> </div> <?php } }