# copy-the-code/3.5.0/classes/class-helpers.php

Copy Anything to Clipboard for WordPress – Copy Button, Copy Text &amp; Copy Code, version 3.5.0. 772 lines.

- Page: https://pluginprobe.com/plugins/copy-the-code/3.5.0/code/classes/class-helpers.php
- Raw: https://pluginprobe.com/plugins/copy-the-code/3.5.0/raw/classes/class-helpers.php
- Modified: 2023-12-24T19:25:42+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/copy-the-code/3.5.0/code/classes/class-helpers.php#L10-L20`.

```php
<?php
/**
 * Helpers
 *
 * @package Copy the Code
 * @since 1.0.0
 */

namespace CopyTheCode;

use Elementor\Controls_Manager;
use Elementor\Group_Control_Background;
use Elementor\Group_Control_Typography;
use Elementor\Group_Control_Border;
use Elementor\Group_Control_Box_Shadow;

/**
 * Helpers
 *
 * @since 1.0.0
 */
class Helpers {
    public static function get_svg_link_icon() {
        return '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24">
        <path fill="#B6BEC6" d="M8.818 8.818l.128-.121a3 3 0 014.115.12l1.06 1.061-1.414 1.415-1.06-1.061-.088-.078a1 1 0 00-1.327.078l-4.95 4.95-.077.087a1 1 0 00.078 1.327l2.12 2.121.088.078a1 1 0 001.327-.078l2.122-2.121 1.414 1.414-2.122 2.121-.128.121a3 3 0 01-4.114-.12L3.868 18.01l-.12-.128a3 3 0 01.12-4.115l4.95-4.95zm4.95-4.95l.128-.121a3 3 0 014.114.12l2.122 2.122.12.128a3 3 0 01-.12 4.115l-4.95 4.95-.128.12a3 3 0 01-4.114-.12L9.879 14.12l1.414-1.414 1.06 1.06.088.078a1 1 0 001.327-.078l4.95-4.95.077-.087a1 1 0 00-.077-1.327l-2.122-2.12-.087-.079a1 1 0 00-1.327.078l-2.121 2.121-1.414-1.414 2.12-2.121z">
        </path>
    </svg>';
    }

    public static function get_svg_pinterest_icon() {
        return '<svg class="gUZ GjR U9O kVc" height="24" width="24" viewBox="0 0 24 24" aria-label="Pinterest" role="img"><path fill="#e60023" d="M0 12c0 5.123 3.211 9.497 7.73 11.218-.11-.937-.227-2.482.025-3.566.217-.932 1.401-5.938 1.401-5.938s-.357-.715-.357-1.774c0-1.66.962-2.9 2.161-2.9 1.02 0 1.512.765 1.512 1.682 0 1.025-.653 2.557-.99 3.978-.281 1.189.597 2.159 1.769 2.159 2.123 0 3.756-2.239 3.756-5.471 0-2.861-2.056-4.86-4.991-4.86-3.398 0-5.393 2.549-5.393 5.184 0 1.027.395 2.127.889 2.726a.36.36 0 0 1 .083.343c-.091.378-.293 1.189-.332 1.355-.053.218-.173.265-.4.159-1.492-.694-2.424-2.875-2.424-4.627 0-3.769 2.737-7.229 7.892-7.229 4.144 0 7.365 2.953 7.365 6.899 0 4.117-2.595 7.431-6.199 7.431-1.211 0-2.348-.63-2.738-1.373 0 0-.599 2.282-.744 2.84-.282 1.084-1.064 2.456-1.549 3.235C9.584 23.815 10.77 24 12 24c6.627 0 12-5.373 12-12S18.627 0 12 0 0 5.373 0 12"></path></svg>';
    }

    public static function get_svg_linkedin_icon() {
        return '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24">
        <path fill="#3277D4" fill-rule="evenodd" d="M21 5a2 2 0 00-2-2H5a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2V5zm-2.5 8.2v5.3h-2.79v-4.93a1.4 1.4 0 00-1.4-1.4c-.77 0-1.39.63-1.39 1.4v4.93h-2.79v-8.37h2.79v1.11c.48-.78 1.47-1.3 2.32-1.3 1.8 0 3.26 1.46 3.26 3.26zM6.88 8.56a1.686 1.686 0 000-3.37 1.69 1.69 0 00-1.69 1.69c0 .93.76 1.68 1.69 1.68zm1.39 1.57v8.37H5.5v-8.37h2.77z" clip-rule="evenodd"></path>
    </svg>';
    }

    public static function get_svg_twitter_icon() {
        return '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24">
        <path fill="#4BA8F5" d="M22.92 6c-.77.35-1.6.58-2.46.69.88-.53 1.56-1.37 1.88-2.38-.83.5-1.75.85-2.72 1.05C18.83 4.5 17.72 4 16.46 4c-2.35 0-4.27 1.92-4.27 4.29 0 .34.04.67.11.98-3.56-.18-6.73-1.89-8.84-4.48-.37.63-.58 1.37-.58 2.15 0 1.49.75 2.81 1.91 3.56-.71 0-1.37-.2-1.95-.5v.03c0 2.08 1.48 3.82 3.44 4.21a4.22 4.22 0 01-1.93.07 4.28 4.28 0 004 2.98 8.521 8.521 0 01-5.33 1.84c-.34 0-.68-.02-1.02-.06C3.9 20.29 6.16 21 8.58 21c7.88 0 12.21-6.54 12.21-12.21 0-.19 0-.37-.01-.56.84-.6 1.56-1.36 2.14-2.23z">
        </path>
    </svg>';
    }

    public static function get_svg_whatsapp_icon() {
        return '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 240 241.19" class="whatsapp"><path class="cls-1" fill="#25d366" d="M205,35.05A118.61,118.61,0,0,0,120.46,0C54.6,0,1,53.61,1,119.51a119.5,119.5,0,0,0,16,59.74L0,241.19l63.36-16.63a119.43,119.43,0,0,0,57.08,14.57h0A119.54,119.54,0,0,0,205,35.07v0ZM120.5,219A99.18,99.18,0,0,1,69.91,205.1l-3.64-2.17-37.6,9.85,10-36.65-2.35-3.76A99.37,99.37,0,0,1,190.79,49.27,99.43,99.43,0,0,1,120.49,219ZM175,144.54c-3-1.51-17.67-8.71-20.39-9.71s-4.72-1.51-6.75,1.51-7.72,9.71-9.46,11.72-3.49,2.27-6.45.76-12.63-4.66-24-14.84A91.1,91.1,0,0,1,91.25,113.3c-1.75-3-.19-4.61,1.33-6.07s3-3.48,4.47-5.23a19.65,19.65,0,0,0,3-5,5.51,5.51,0,0,0-.24-5.23C99,90.27,93,75.57,90.6,69.58s-4.89-5-6.73-5.14-3.73-.09-5.7-.09a11,11,0,0,0-8,3.73C67.48,71.05,59.75,78.3,59.75,93s10.69,28.88,12.19,30.9S93,156.07,123,169c7.12,3.06,12.68,4.9,17,6.32a41.18,41.18,0,0,0,18.8,1.17c5.74-.84,17.66-7.21,20.17-14.18s2.5-13,1.75-14.19-2.69-2.06-5.7-3.59l0,0Z"></path></svg>';
    }

    public static function get_svg_facebook_icon() {
        return '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24">
            <path fill="#425993" fill-rule="evenodd" d="M19 3H5a2 2 0 00-2 2v14a2 2 0 002 2h7v-7h-2v-3h2V8.5A3.5 3.5 0 0115.5 5H18v3h-2a1 1 0 00-1 1v2h3v3h-3v7h4a2 2 0 002-2V5a2 2 0 00-2-2z" clip-rule="evenodd"></path>
            </svg>';
    }
    
    public static function get_svg_copy_icon() {
        return '<svg aria-hidden="true" focusable="false" role="img" class="copy-icon" viewBox="0 0 16 16" width="16" height="16" fill="currentColor"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg>';
    }

    public static function get_svg_checked_icon() {
        return '<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="check-icon" fill="currentColor"><path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path></svg>';
    }

    public static function get_copy_button( $args = [] ) {
        $show_icon = isset( $args['show_icon'] ) ? $args['show_icon'] : 'yes';
        $with_icon = 'yes' === $show_icon ? 'with-icon' : 'without-icon';
        $as_raw = isset( $args['as_raw'] ) ? 'yes' : '';
        $button_text = isset( $args['button_text'] ) ? $args['button_text'] : esc_html__( 'Copy', 'copy-the-code' );
        $button_class = isset( $args['button_class'] ) ? $args['button_class'] : '';
        $button_text_copied = isset( $args['button_text_copied'] ) ? $args['button_text_copied'] : esc_html__( 'Copied!', 'copy-the-code' );
        $icon_direction = isset( $args['icon_direction'] ) ? $args['icon_direction'] : 'before';

        ob_start();
        ?>
        <button class="ctc-block-copy ctc-<?php echo esc_attr( $with_icon ); ?>" copy-as-raw='<?php echo esc_html( $as_raw ); ?>' data-copied="<?php echo esc_html( $button_text_copied ); ?>">
            <?php
            if ( 'before' === $icon_direction && 'yes' === $show_icon ) {
                echo self::get_svg_copy_icon();
                echo self::get_svg_checked_icon();
            }
            echo '<span class="ctc-button-text">' . esc_html( $button_text ) . '</span>';
            if ( 'after' === $icon_direction && 'yes' === $show_icon ) {
                echo self::get_svg_copy_icon();
                echo self::get_svg_checked_icon();
            }
            ?>
        </button>
        <?php
        return ob_get_clean();
    }

    /**
     * Is shortcode used
     * 
     * @param string $shortcode
     * @since 3.1.0
     */
    public static function is_shortcode_used( $shortcode = '' ) {
        global $post;
        if ( ! $post ) {
            return false;
        }

        $found = false;
        if ( has_shortcode( $post->post_content, $shortcode ) ) {
            $found = true;
        }

        return $found;
    }

    /**
     * Get categories
     * 
     * @since 3.2.0
     */
    public static function get_categories() {
        return [ 'copy-the-code', 'basic' ];
    }

    /**
     * Get common keywords
     * 
     * @param array $keywords New keywords.
     * @since 3.2.0
     */
    public static function get_keywords( $keywords = [] ) {
        $default = [ 'copy', 'paste', 'clipboard', 'copy clipboard', 'copy to clipboard', 'copy anything to clipboard' ];

        return array_merge( $default, $keywords );
    }

    /**
     * Register "Copy Content" Section
     * 
     * @param object $self
     */
    public static function register_copy_content_section( $self, $args = [] ) {
        $self->start_controls_section(
            'copy_content_section',
            [
                'label' => esc_html__( 'Hidden Copy Content', 'copy-the-code' ),
            ]
        );

        if ( isset( $args['before_controls'] ) ) {
            foreach ( $args['before_controls'] as $control_id => $options ) {
                $self->add_control( $control_id, $options );
            }
        }

        $self->add_control(
            'copy_content',
            [
                'label' => isset( $args[ 'label' ] ) ? $args[ 'label' ] : esc_html__( 'Enter Text that Copy to Clipboard', 'copy-the-code' ),
                'type' => Controls_Manager::TEXTAREA,
                'default' => isset( $args[ 'default' ] ) ? $args[ 'default' ] : '',
                'rows' => 10,
            ]
        );

        if ( isset( $args['after_controls'] ) ) {
            foreach ( $args['after_controls'] as $control_id => $options ) {
                $self->add_control( $control_id, $options );
            }
        }

        $self->end_controls_section();
    }

    /**
     * Register "Copy Button" Section
     * 
     * @param array $args
     * @param object $self
     */
    public static function register_copy_button_section( $self, $args = [] ) {
        $default = [
            'button_text' => isset( $args[ 'button_text' ] ) ? $args[ 'button_text' ] : esc_html__( 'Copy to Clipboard', 'copy-the-code' ),
            'button_text_copied' => isset( $args[ 'button_text_copied' ] ) ? $args[ 'button_text_copied' ] : esc_html__( 'Copied!', 'copy-the-code' ),
            'show_icon' => 'yes',
            'icon_direction' => 'before',
        ];

        $self->start_controls_section(
            'copy_button_section',
            [
                'label' => esc_html__( 'Copy Button', 'copy-the-code' ),
            ]
        );
        
        $self->add_control(
            'copy_button_text',
            [
                'label' => esc_html__( 'Button Text', 'copy-the-code' ),
                'type' => Controls_Manager::TEXT,
                'default' => $default[ 'button_text' ],
            ]
        );

        $self->add_control(
            'copy_button_text_copied',
            [
                'label' => esc_html__( 'After Copy Text', 'copy-the-code' ),
                'type' => Controls_Manager::TEXT,
                'default' => $default[ 'button_text_copied' ],
            ]
        );

        // Alignment.
        $self->add_responsive_control(
            'copy_button_align',
            [
                'label' => esc_html__( 'Alignment', 'copy-the-code' ),
                'type' => Controls_Manager::CHOOSE,
                'options' => [
                    'left' => [
                        'title' => esc_html__( 'Left', 'copy-the-code' ),
                        'icon' => 'eicon-text-align-left',
                    ],
                    'center' => [
                        'title' => esc_html__( 'Center', 'copy-the-code' ),
                        'icon' => 'eicon-text-align-center',
                    ],
                    'right' => [
                        'title' => esc_html__( 'Right', 'copy-the-code' ),
                        'icon' => 'eicon-text-align-right',
                    ],
                ],
                'selectors' => [
                    '{{WRAPPER}} .ctc-block-actions' => 'text-align: {{VALUE}};',
                ],
            ]
        );

        // Show Icon.
        $self->add_control(
            'copy_show_icon',
            [
                'label' => esc_html__( 'Show Icon', 'copy-the-code' ),
                'type' => Controls_Manager::SWITCHER,
                'label_on' => esc_html__( 'Show', 'copy-the-code' ),
                'label_off' => esc_html__( 'Hide', 'copy-the-code' ),
                'return_value' => 'yes',
                'default' => 'yes',
            ]
        );

        $self->add_control(
            'copy_icon_direction',
            [
                'label' => esc_html__( 'Icon Direction', 'copy-the-code' ),
                'type' => Controls_Manager::SELECT,
                'default' => 'before',
                'options' => [
                    'before' => esc_html__( 'Before', 'copy-the-code' ),
                    'after' => esc_html__( 'After', 'copy-the-code' ),
                ],
                'condition' => [
                    'copy_show_icon' => 'yes',
                ],
            ]
        );

        $self->add_responsive_control(
            'copy_icon_text_gap',
            [
                'label' => esc_html__( 'Icon and Text Gap', 'copy-the-code' ),
                'type' => Controls_Manager::SLIDER,
                'size_units' => [ 'px', 'em' ],
                'range' => [
                    'px' => [
                        'min' => 0,
                        'max' => 100,
                    ],
                    'em' => [
                        'min' => 0,
                        'max' => 10,
                    ],
                ],
                'selectors' => [
                    '{{WRAPPER}} .ctc-with-icon' => 'gap: {{SIZE}}{{UNIT}};',
                ],
                'condition' => [
                    'copy_show_icon' => 'yes',
                ],
            ]
        );

        $self->end_controls_section();
    }

    /**
     * Register "Copy Button Style" Section
     * 
     * @param object $self
     */
    public static function register_copy_button_style_section( $self ) {
        self::register_style_section( $self, 'Copy Button', '.ctc-block-copy', [
            'text_align' => false,
            'normal_text_color' => [
                'selectors' => [
                    '{{WRAPPER}} .ctc-block-copy' => 'color: {{VALUE}};',
					'{{WRAPPER}} .ctc-block-copy svg' => 'fill: {{VALUE}};',
                ]
            ],
            'hover_text_color' => [
                'selectors' => [
                    '{{WRAPPER}} .ctc-block-copy:hover' => 'color: {{VALUE}};',
                    '{{WRAPPER}} .ctc-block-copy:hover svg' => 'fill: {{VALUE}};',
                ]
            ],
        ] );
    }

    /**
     * Render "Copy Button"
     * 
     * @param object $self
     */
    public static function render_copy_button( $self ) {
        $button_text = $self->get_settings_for_display( 'copy_button_text' );
        $button_text_copied = $self->get_settings_for_display( 'copy_button_text_copied' );
        $show_icon = $self->get_settings_for_display( 'copy_show_icon' );
        $icon_direction = $self->get_settings_for_display( 'copy_icon_direction' );

        echo Helpers::get_copy_button( [
            'as_raw' => 'yes',
            'button_text' => $button_text,
            'button_text_copied' => $button_text_copied,
            'icon_direction' => $icon_direction,
            'show_icon' => $show_icon,
        ] );
    }

    /**
     * Render "Copy Content"
     * 
     * @param object $self
     * @param array $args
     */
    public static function render_copy_content( $self, $args = [] ) {
        $content = isset( $args[ 'content' ] ) ? $args[ 'content' ] : $self->get_settings_for_display( 'copy_content' );
        ?>
        <textarea class="ctc-copy-content" style="display: none;"><?php echo wp_kses_post( apply_shortcodes( $content ) ); ?></textarea>
        <?php
    }

    /**
     * Register "Get Pro" Section
     * 
     * @param object $self
     * @param array $args
     */
    public static function register_pro_section( $self, $label ) {
        $id = str_replace( ' ', '-', $label );
        $id = strtolower( $id );

        $self->start_controls_section(
			$id . '_box',
			[
				'label' => $label . ' (Pro)',
				'tab' => Controls_Manager::TAB_STYLE,
			]
		);

        // Buy pro.
        $self->add_control(
            $id . '_box_content',
            [
                'type' => Controls_Manager::RAW_HTML,
                'raw' => '<div style="text-align: center;"><h2 style="font-weight: 600;margin: 0 0 10px 0;font-size: 14px;">Unlock Premium Features!</h2><p style="margin: 0 0 10px 0;">Upgrade to Clipboard Pro for enhanced functionality and exclusive benefits.</p><p style="margin: 0 0 10px 0;">Ready to level up your experience?</p><a href="https://clipboard.agency/#pricing" class="button button-primary" target="_blank">See Pricing Plans</a></div>',
            ]
        );

        $self->end_controls_section();
    }

    /**
     * Register "Get Pro" Sections
     * 
     * @param object $self
     * @param array $labels
     */
    public static function register_pro_sections( $self, $labels = [] ) {
        foreach ( $labels as $label ) {
            self::register_pro_section( $self, $label );
        }
    }

    /**
	 * Register normal and hover styles.
     * 
     * @param object $self
     * @param string $label
     * @param array $args
	 */
	public static function register_style_section( $self, $label = '', $selector = '', $args = [] ) {
        $id = 'reusable-' . sanitize_title_with_dashes( $label );

        $size = isset( $args[ 'size' ] ) ? $args[ 'size' ] : false;
        $text_decoration = isset( $args[ 'text_decoration' ] ) ? $args[ 'text_decoration' ] : false;
        $margin = isset( $args[ 'margin' ] ) ? $args[ 'margin' ] : true;
        $padding = isset( $args[ 'padding' ] ) ? $args[ 'padding' ] : true;
        $border = isset( $args[ 'border' ] ) ? $args[ 'border' ] : false; // Disabled.
        $border_radius = isset( $args[ 'border_radius' ] ) ? $args[ 'border_radius' ] : true;
        $background = isset( $args[ 'background' ] ) ? $args[ 'background' ] : false; // Disabled.
        $text_color = isset( $args[ 'text_color' ] ) ? $args[ 'text_color' ] : false; // Disabled.
        $typography = isset( $args[ 'typography' ] ) ? $args[ 'typography' ] : true;
        $text_align = isset( $args[ 'text_align' ] ) ? $args[ 'text_align' ] : true;
        $box_shadow = isset( $args[ 'box_shadow' ] ) ? $args[ 'box_shadow' ] : false; // Disabled.
        $tabs = isset( $args[ 'tabs' ] ) ? $args[ 'tabs' ] : true;
        $normal_background = isset( $args[ 'normal_background' ] ) ? $args[ 'normal_background' ] : true;
        $normal_text_color = isset( $args[ 'normal_text_color' ] ) ? $args[ 'normal_text_color' ] : true;
        $normal_typography = isset( $args[ 'normal_typography' ] ) ? $args[ 'normal_typography' ] : false; // Disabled.
        $normal_border = isset( $args[ 'normal_border' ] ) ? $args[ 'normal_border' ] : true;
        $normal_box_shadow = isset( $args[ 'normal_box_shadow' ] ) ? $args[ 'normal_box_shadow' ] : true;

        // Section.
		$self->start_controls_section(
			$id . '_style_section',
			[
				'label' => $label,
				'tab'   => Controls_Manager::TAB_STYLE,
			]
		);

        if ( $margin ) :
            $self->add_responsive_control(
                $id . '_margin',
                array(
                    'label'      => esc_html__( 'Margin', 'copy-the-code' ),
                    'type'       => Controls_Manager::DIMENSIONS,
                    'size_units' => array( 'px', 'em', '%' ),
                    'selectors'  => array(
                        '{{WRAPPER}} ' . $selector => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
                    ),
                )
            );
        endif;

        if ( $padding ) :
            $self->add_responsive_control(
                $id . '_padding',
                array(
                    'label'      => esc_html__( 'Padding', 'copy-the-code' ),
                    'type'       => Controls_Manager::DIMENSIONS,
                    'size_units' => array( 'px', 'em', '%' ),
                    'selectors'  => array(
                        '{{WRAPPER}} ' . $selector => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
                    ),
                )
            );
        endif;

        if ( $border ) :
            $border_selector = '{{WRAPPER}} ' . $selector;
            if ( isset( $args[ 'border' ] ) && is_array( $args[ 'border' ] ) ) {
                if ( isset( $args[ 'border' ][ 'selector' ] ) ) {
                    $border_selector = $args[ 'border' ][ 'selector' ];
                }
            }
            $self->add_group_control(
                \Elementor\Group_Control_Border::get_type(),
                [
                    'name'     => $id . '_border',
                    'selector' => $border_selector,
                ]
            );
        endif;

        if ( $border_radius ) :
            $self->add_responsive_control(
                $id . '_border_radius',
                array(
                    'label'      => esc_html__( 'Border Radius', 'copy-the-code' ),
                    'type'       => Controls_Manager::DIMENSIONS,
                    'size_units' => array( 'px', '%' ),
                    'selectors'  => array(
                        '{{WRAPPER}} ' . $selector => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
                    ),
                )
            );
        endif;

        if ( $background ) :
            $self->add_group_control(
                \Elementor\Group_Control_Background::get_type(),
                [
                    'name' => $id . '_background',
                    'types'  => [ 'classic', 'gradient' ],
                    'exclude'  => [ 'image', 'video' ],
                    'selector' => '{{WRAPPER}} ' . $selector,
                ]
            );
        endif;

        if ( $text_color ) :
            $self->add_control(
                $id . '_text_color',
                [
                    'label'     => esc_html__( 'Text Color', 'copy-the-code' ),
                    'type'      => Controls_Manager::COLOR,
                    'selectors' => [
                        '{{WRAPPER}} ' . $selector => 'color: {{VALUE}};',
                    ],
                ]
            );
        endif;

        if ( $typography ) :
            $self->add_group_control(
                \Elementor\Group_Control_Typography::get_type(),
                [
                    'name'     => $id . '_typography',
                    'selector' => '{{WRAPPER}} ' . $selector,
                ]
            );
        endif;

        if ( $size ) :
            $size_label = esc_html__( 'Width', 'copy-the-code' );
            $size_selectors = [
                '{{WRAPPER}} ' . $selector => 'width: {{SIZE}}{{UNIT}};',
            ];
            if ( isset( $args[ 'size' ] ) && is_array( $args[ 'size' ] ) ) {
                if ( isset( $args[ 'size' ][ 'selectors' ] ) ) {
                    $size_selectors = $args[ 'size' ][ 'selectors' ];
                }
                if ( isset( $args[ 'size' ][ 'label' ] ) ) {
                    $size_label = $args[ 'size' ][ 'label' ];
                }
            }

            $self->add_responsive_control(
                $id . '_size',
                [
                    'label' => $size_label,
                    'type' => Controls_Manager::SLIDER,
                    'size_units' => [ 'px', 'em', '%' ],
                    'selectors' => $size_selectors,
                ]
            );
        endif;

        if ( $text_decoration ) :
            $text_decoration_selectors = [
                '{{WRAPPER}} ' . $selector => 'text-decoration: {{VALUE}};',
            ];
            if ( isset( $args[ 'text_decoration' ] ) && is_array( $args[ 'text_decoration' ] ) ) {
                if ( isset( $args[ 'text_decoration' ][ 'selectors' ] ) ) {
                    $text_decoration_selectors = $args[ 'text_decoration' ][ 'selectors' ];
                }
            }

            $self->add_control(
                $id . '_text_decoration',
                [
                    'label' => esc_html__( 'Text Decoration', 'copy-the-code' ),
                    'type' => Controls_Manager::SELECT,
                    'options' => [
                        'none' => esc_html__( 'None', 'copy-the-code' ),
                        'underline' => esc_html__( 'Underline', 'copy-the-code' ),
                        'overline' => esc_html__( 'Overline', 'copy-the-code' ),
                        'line-through' => esc_html__( 'Line Through', 'copy-the-code' ),
                    ],
                    'selectors' => $text_decoration_selectors,
                ]
            );
        endif;

        if ( $text_align ) :
            $self->add_responsive_control(
                $id . '_text_align',
                [
                    'label' => esc_html__( 'Alignment', 'copy-the-code' ),
                    'type' => Controls_Manager::CHOOSE,
                    'options' => [
                        'left' => [
                            'title' => esc_html__( 'Left', 'copy-the-code' ),
                            'icon' => 'eicon-text-align-left',
                        ],
                        'center' => [
                            'title' => esc_html__( 'Center', 'copy-the-code' ),
                            'icon' => 'eicon-text-align-center',
                        ],
                        'right' => [
                            'title' => esc_html__( 'Right', 'copy-the-code' ),
                            'icon' => 'eicon-text-align-right',
                        ],
                    ],
                    'selectors' => [
                        '{{WRAPPER}} ' . $selector => 'text-align: {{VALUE}};',
                    ],
                ]
            );
        endif;

        if ( $box_shadow ) :
            $self->add_group_control(
                \Elementor\Group_Control_Box_Shadow::get_type(),
                [
                    'name'     => $id . '_box_shadow',
                    'selector' => '{{WRAPPER}} ' . $selector,
                ]
            );
        endif;

        if ( $tabs ) :
            // Tabs.
            $self->start_controls_tabs(
                $id . '_style_tabs'
            );

            // Normal.
            $self->start_controls_tab(
                $id . '_style_normal_tab',
                [
                    'label' => esc_html__( 'Normal', 'copy-the-code' ),
                ]
            );

            if ( $normal_background ) :
                $self->add_group_control(
                    \Elementor\Group_Control_Background::get_type(),
                    [
                        'name' => $id . '_normal_background',
                        'types'  => [ 'classic', 'gradient' ],
                        'exclude'  => [ 'image', 'video' ],
                        'selector' => '{{WRAPPER}} ' . $selector,
                    ]
                );
            endif;

            if ( $normal_text_color ) :
                $normal_text_color_label = esc_html__( 'Text Color', 'copy-the-code' );
                $normal_text_color_selectors = [
                    '{{WRAPPER}} ' . $selector => 'color: {{VALUE}};',
                ];
                if ( isset( $args[ 'normal_text_color' ] ) && is_array( $args[ 'normal_text_color' ] ) ) {
                    if ( isset( $args[ 'normal_text_color' ][ 'selectors' ] ) ) {
                        $normal_text_color_selectors = $args[ 'normal_text_color' ][ 'selectors' ];
                    }
                    if ( isset( $args[ 'normal_text_color' ][ 'label' ] ) ) {
                        $normal_text_color_label = $args[ 'normal_text_color' ][ 'label' ];
                    }
                }
                $self->add_control(
                    $id . '_normal_text_color',
                    [
                        'label'     => $normal_text_color_label,
                        'type'      => Controls_Manager::COLOR,
                        'selectors' => $normal_text_color_selectors,
                    ]
                );
            endif;

            if ( $normal_typography ) :
                $self->add_group_control(
                    \Elementor\Group_Control_Typography::get_type(),
                    [
                        'name'     => $id . '_normal_typography',
                        'selector' => '{{WRAPPER}} ' . $selector,
                    ]
                );
            endif;

            if ( $normal_border ) :
                $self->add_group_control(
                    \Elementor\Group_Control_Border::get_type(),
                    [
                        'name'     => $id . '_normal_border',
                        'default'  => 'red',
                        'selector' => '{{WRAPPER}} ' . $selector,
                    ]
                );
            endif;

            if ( $normal_box_shadow ) :
                $self->add_group_control(
                    \Elementor\Group_Control_Box_Shadow::get_type(),
                    [
                        'name'     => $id . '_normal_box_shadow',
                        'selector' => '{{WRAPPER}} ' . $selector,
                    ]
                );
            endif;

            $self->end_controls_tab();
            // Normal End.

            // Hover.
            $self->start_controls_tab(
                $id . '_style_hover_tab',
                [
                    'label' => esc_html__( 'Hover', 'copy-the-code' ),
                ]
            );

            if ( $normal_background ) :
                $self->add_group_control(
                    \Elementor\Group_Control_Background::get_type(),
                    [
                        'name'     => $id . '_hover_background',
                        'types'    => [ 'classic', 'gradient' ],
                        'exclude'  => [ 'image' ],
                        'selector' => '{{WRAPPER}} ' . $selector . ':hover',
                    ]
                );
            endif;

            if ( $normal_text_color ) :

                $hover_text_color_label = esc_html__( 'Text Color', 'copy-the-code' );
                $hover_text_color_selectors = [
                    '{{WRAPPER}} ' . $selector => 'color: {{VALUE}};',
                ];
                if ( isset( $args[ 'hover_text_color' ] ) && is_array( $args[ 'hover_text_color' ] ) ) {
                    if ( isset( $args[ 'hover_text_color' ][ 'selectors' ] ) ) {
                        $hover_text_color_selectors = $args[ 'hover_text_color' ][ 'selectors' ];
                    }
                    if ( isset( $args[ 'hover_text_color' ][ 'label' ] ) ) {
                        $hover_text_color_label = $args[ 'hover_text_color' ][ 'label' ];
                    }
                }

                $self->add_control(
                    $id . '_hover_text_color',
                    array(
                        'label'     => $hover_text_color_label,
                        'type'      => Controls_Manager::COLOR,
                        'selectors' => $hover_text_color_selectors,
                    )
                );
            endif;

            if ( $normal_border ) :
                $self->add_control(
                    $id . '_hover_border',
                    array(
                        'label'     => esc_html__( 'Border Color', 'copy-the-code' ),
                        'type'      => Controls_Manager::COLOR,
                        'selectors' => array(
                            '{{WRAPPER}} ' . $selector . ':hover' => 'border-color: {{VALUE}};',
                        ),
                    )
                );
            endif;

            if ( $normal_box_shadow ) :
                $self->add_group_control(
                    \Elementor\Group_Control_Box_Shadow::get_type(),
                    array(
                        'name'     => $id . '_hover_box_shadow',
                        'selector' => '{{WRAPPER}} ' . $selector . ':hover',
                    )
                );
            endif;

            $self->end_controls_tab();
            // Hover End.

            $self->end_controls_tabs();
            // Tabs.
        endif;

        $self->end_controls_section();
		// Section End.
	}

}
```
