Viewing File: /home/maglabs/greentech/wp-content/themes/porto/inc/functions/wpb-elements.php

<?php

/*
 * Update WPB default elements
 */

// Replace rows and columns classes
function porto_custom_css_classes_for_elements( $class_string, $tag ) {

	if ( 'vc_row' == $tag || 'vc_row_inner' == $tag ) {
		if ( strpos( $class_string, 'porto-inner-container' ) !== false ) {
			$class_string = str_replace( 'vc_row-fluid', '', $class_string );
			if ( 'vc_row_inner' == $tag ) {
				$class_string = str_replace( ' porto-inner-container', '', $class_string );
			}
		} else {
			$class_string = str_replace( 'vc_row-fluid', 'row', $class_string );
		}
	}
	if ( ! ( function_exists( 'vc_is_inline' ) && vc_is_inline() ) && ( 'vc_column' == $tag || 'vc_column_inner' == $tag ) ) {
		//$class_string = str_replace( 'vc_column_container', '', $class_string );
		if ( preg_match_all( '/vc_col-(\w{2})-(\d{1,2})(\/5|)($| )/', $class_string, $matches ) ) {
			$class_string = str_replace( array( 'vc_col-xl-offset-', 'vc_col-lg-offset-', 'vc_col-md-offset-', 'vc_col-sm-offset-', 'vc_col-xs-offset-' ), array( 'offset-xxl-', 'offset-xl-', 'offset-lg-', 'offset-md-', 'offset-' ), $class_string );
			if ( isset( $matches[1] ) && isset( $matches[2] ) ) {
				$size_array = array(
					'-xl' => '-xxl',
					'-lg' => '-xl',
					'-md' => '-lg',
					'-sm' => '-md',
					'-xs' => '',
				);
				foreach ( $matches[1] as $index => $size ) {
					$cols = $matches[2][ $index ];
					if ( ! empty( $matches[3][ $index ] ) ) {
						$class_string = str_replace( 'vc_col-' . $size . '-' . $cols . $matches[3][ $index ], 'col' . $size_array[ '-' . $size ] . '-' . $cols . str_replace( '/', '-', $matches[3][ $index ] ), $class_string );
					} else {
						$class_string = str_replace( 'vc_col-' . $size . '-' . $cols, 'col' . $size_array[ '-' . $size ] . '-' . $cols, $class_string );
					}
				}
			}
		}
		/*if ( preg_match( '/col-(\w{2})-(\d{1})\/5/', $class_string ) ) {
			$class_string = str_replace( 'vc_column_container', 'vc_column_container porto-column', $class_string );
			$class_string = preg_replace( '/ col-(\w{2})-12/', '', $class_string );
		}*/
		if ( preg_match( '/vc_hidden-(\w{2})/', $class_string ) ) {
			$class_string = str_replace( array( 'vc_hidden-xl', 'vc_hidden-lg', 'vc_hidden-md', 'vc_hidden-sm', 'vc_hidden-xs' ), array( 'd-xxl-none', 'd-xl-none d-xxl-block', 'd-lg-none d-xl-block', 'd-md-none d-lg-block', 'd-none d-md-block' ), $class_string );
			$screens      = array( '', 'md', 'lg', 'xl', 'xxl' );
			for ( $i = 0; $i <= 4; $i++ ) {
				if ( 0 == $i ) {
					$screen = ' d';
				} else {
					$screen = ' d-' . $screens[ $i ];
				}
				if ( strpos( $class_string, $screen . '-block' ) !== false && strpos( $class_string, $screen . '-none' ) !== false ) {
					$class_string = str_replace( $screen . '-block', '', $class_string );
				}
			}
			for ( $i = 4; $i >= 1; $i-- ) {
				if ( 1 == $i ) {
					$screen = ' d';
				} else {
					$screen = ' d-' . $screens[ $i - 1 ];
				}
				$screen_bigger = ' d-' . $screens[ $i ];
				if ( strpos( $class_string, $screen . '-none' ) !== false && strpos( $class_string, $screen_bigger . '-none' ) !== false ) {
					$class_string = str_replace( $screen_bigger . '-none', '', $class_string );
				}
			}
		}
	}

	return $class_string;
}
add_filter( 'vc_shortcodes_css_class', 'porto_custom_css_classes_for_elements', 10, 2 );

add_action( 'vc_after_init', 'porto_load_shortcodes' );
function porto_load_shortcodes() {

	if ( function_exists( 'vc_map' ) ) {
		global $porto_settings;
		$porto_cur_version = get_option( 'porto_version', '1.0' );
		$dark              = porto_is_dark_skin();

		$section_group      = __( 'Porto Options', 'porto' );
		$addon_group        = __( 'Porto Addons', 'porto' );
		$animation_group    = __( 'Animation', 'porto' );
		$animation_type     = array(
			'type'       => 'porto_theme_animation_type',
			'heading'    => __( 'Animation Type', 'porto' ),
			'param_name' => 'animation_type',
			'group'      => $animation_group,
		);
		$animation_duration = array(
			'type'        => 'textfield',
			'heading'     => __( 'Animation Duration', 'porto' ),
			'param_name'  => 'animation_duration',
			'description' => __( 'numerical value (unit: milliseconds)', 'porto' ),
			'value'       => '1000',
			'group'       => $animation_group,
		);
		$animation_delay    = array(
			'type'        => 'textfield',
			'heading'     => __( 'Animation Delay', 'porto' ),
			'param_name'  => 'animation_delay',
			'description' => __( 'numerical value (unit: milliseconds)', 'porto' ),
			'value'       => '0',
			'group'       => $animation_group,
		);
		$animation_reveal_clr = array(
			'type'       => 'colorpicker',
			'heading'    => __( 'Animation Color', 'porto' ),
			'param_name' => 'animation_reveal_clr',
			'dependency' => array(
				'element' => 'animation_type',
				'value'   => array( 'revealDirTop', 'revealDirDown', 'revealDirLeft', 'revealDirRight' ),
			),
			'group'      => $animation_group,
		);

		$floating_circle        = array(
			'type'        => 'checkbox',
			'heading'     => __( 'Rotate with Scroll', 'porto' ),
			'param_name'  => 'floating_circle',
			'hint'        => '<img src="' . PORTO_HINT_URL . 'wd_floating_circle.gif"/>',
			'value'       => array( __( 'Yes, please', 'porto' ) => 'yes' ),
			'description' => __( 'Rotate when scrolling page.', 'porto' ),
			'dependency'  => array(
				'element' => 'animation_type',
				'value'   => array( '' ),
			),
			'group'       => $animation_group,
		);
		$floatcircle_transition = array(
			'type'       => 'checkbox',
			'heading'    => __( 'Floating Transition', 'porto' ),
			'param_name' => 'floatcircle_transition',
			'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
			'std'        => 'yes',
			'dependency' => array(
				'element'   => 'floating_circle',
				'not_empty' => true,
			),
			'group'      => $animation_group,
		);
		$floatcircle_duration   = array(
			'type'        => 'textfield',
			'heading'     => __( 'Transition Duration', 'porto' ),
			'param_name'  => 'floatcircle_duration',
			'description' => __( 'numerical value (unit: milliseconds). Default is 500ms', 'porto' ),
			'dependency'  => array(
				'element'   => 'floatcircle_transition',
				'not_empty' => true,
			),
			'group'       => $animation_group,
		);
		$floating_start_pos     = array(
			'type'       => 'dropdown',
			'heading'    => __( 'Floating Start Pos', 'porto' ),
			'param_name' => 'floating_start_pos',
			'hint'        => '<img src="' . PORTO_HINT_URL . 'wd_floating_start_pos.gif"/>',
			'value'      => array(
				__( 'Disabled', 'porto' ) => '',
				__( 'None', 'porto' )     => 'none',
				__( 'Top', 'porto' )      => 'top',
				__( 'Bottom', 'porto' )   => 'bottom',
			),
			'dependency' => array(
				'element'  => 'floating_circle',
				'is_empty' => true,
			),
			'group'      => $animation_group,
		);
		$floating_speed         = array(
			'type'        => 'textfield',
			'heading'     => __( 'Floating Speed', 'porto' ),
			'param_name'  => 'floating_speed',
			'description' => __( 'numerical value (from 0.0 to 10.0)', 'porto' ),
			'value'       => '',
			'dependency'  => array(
				'element' => 'floating_start_pos',
				'value'   => array( 'none', 'top', 'bottom' ),
			),
			'group'       => $animation_group,
		);
		$floating_transition    = array(
			'type'       => 'checkbox',
			'heading'    => __( 'Floating Transition', 'porto' ),
			'param_name' => 'floating_transition',
			'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
			'std'        => 'yes',
			'dependency' => array(
				'element'   => 'floating_speed',
				'not_empty' => true,
			),
			'group'      => $animation_group,
		);
		$floating_horizontal    = array(
			'type'       => 'checkbox',
			'heading'    => __( 'Floating Horizontal', 'porto' ),
			'param_name' => 'floating_horizontal',
			'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
			'dependency' => array(
				'element'   => 'floating_speed',
				'not_empty' => true,
			),
			'group'      => $animation_group,
		);
		$floating_duration      = array(
			'type'        => 'textfield',
			'heading'     => __( 'Transition Duration', 'porto' ),
			'param_name'  => 'floating_duration',
			'description' => __( 'numerical value (unit: milliseconds). Default is 500ms', 'porto' ),
			'dependency'  => array(
				'element'   => 'floating_speed',
				'not_empty' => true,
			),
			'group'       => $animation_group,
		);

		$left  = is_rtl() ? 'right' : 'left';
		$right = is_rtl() ? 'left' : 'right';

		$fonts = array(
			esc_html__( 'Default', 'porto' ) => '',
			esc_html__( 'Inherit', 'porto')  => 'inherit',
		);
		foreach( porto_include_google_font() as $font ) {
			$font_key = str_replace( '%2C', ',', $font );
			$font_key = str_replace( '%27', '\'', $font_key );	
			$fonts[ $font_key ] = $font;
		}
		$custom_fonts = get_option( 'porto_custom_fonts', array() );
		if ( ! empty( $custom_fonts ) ) {
			foreach ( $custom_fonts as $c_fonts ) {
				if ( ! empty( $c_fonts ) ) {
					foreach ( $c_fonts as $c_font_name => $font_fields ) {
						$fonts[] = str_replace( '+', ' ', $c_font_name );
					}
				}
			}
		}
		
		/* ---------------------------- */
		/* Customize Section
		/* ---------------------------- */
		vc_add_params(
			'vc_section',
			array(
				array(
					'type'        => 'checkbox',
					'heading'     => esc_html__( 'Wrap as container', 'porto' ),
					'param_name'  => 'is_container',
					'qa_selector' => '>.vc_section',
				),
				array(
					'type'        => 'dropdown',
					'heading'     => esc_html__( 'Divider Type', 'porto' ),
					'description' => esc_html__( 'Select the type of the shape divider', 'porto' ),
					'param_name'  => 'top_divider_type',
					'value'       => function_exists( 'porto_sh_commons' ) ? porto_sh_commons( 'divider_type' ) : array(),
					'std'         => 'none',
					'admin_label' => true,
					'group'       => esc_html__( 'Top Shape Divider', 'porto' ),
				),
				array(
					'type'        => 'textarea_raw_html',
					'heading'     => esc_html__( 'Custom Shape Divider', 'porto' ),
					'param_name'  => 'top_divider_custom',
					// @codingStandardsIgnoreLine
					'value' => base64_encode( '' ),
					'description' => esc_html__( 'Please writer your svg code.', 'porto' ),
					'dependency'  => array(
						'element' => 'top_divider_type',
						'value'   => 'custom',
					),
					'group'       => esc_html__( 'Top Shape Divider', 'porto' ),
				),
				array(
					'type'        => 'colorpicker',
					'heading'     => esc_html__( 'Divider Color', 'porto' ),
					'param_name'  => 'top_divider_color',
					'description' => esc_html__( 'Select fill color of svg.', 'porto' ),
					'dependency'  => array(
						'element'            => 'top_divider_type',
						'value_not_equal_to' => 'none',
					),
					'group'       => esc_html__( 'Top Shape Divider', 'porto' ),
				),
				array(
					'type'        => 'textfield',
					'heading'     => esc_html__( 'Height', 'porto' ),
					'description' => esc_html__( 'Please input height of shape divider.', 'porto' ),
					'param_name'  => 'top_divider_height',
					'dependency'  => array(
						'element'            => 'top_divider_type',
						'value_not_equal_to' => 'none',
					),
					'group'       => esc_html__( 'Top Shape Divider', 'porto' ),
				),
				array(
					'type'       => 'checkbox',
					'heading'    => esc_html__( 'Flip', 'porto' ),
					'param_name' => 'top_divider_flip',
					'dependency' => array(
						'element'            => 'top_divider_type',
						'value_not_equal_to' => 'none',
					),
					'group'      => esc_html__( 'Top Shape Divider', 'porto' ),
				),
				array(
					'type'       => 'checkbox',
					'heading'    => esc_html__( 'Invert', 'porto' ),
					'param_name' => 'top_divider_invert',
					'dependency' => array(
						'element'            => 'top_divider_type',
						'value_not_equal_to' => 'none',
					),
					'group'      => esc_html__( 'Top Shape Divider', 'porto' ),
				),
				array(
					'type'        => 'textfield',
					'heading'     => esc_html__( 'Extra class name', 'js_composer' ),
					'param_name'  => 'top_divider_class',
					'description' => esc_html__( 'Style particular content element differently - add a class name and refer to it in custom CSS.', 'js_composer' ),
					'dependency'  => array(
						'element'            => 'top_divider_type',
						'value_not_equal_to' => 'none',
					),
					'group'       => esc_html__( 'Top Shape Divider', 'porto' ),
				),
				array(
					'type'        => 'dropdown',
					'heading'     => esc_html__( 'Divider Type', 'porto' ),
					'description' => esc_html__( 'Select the type of the shape divider', 'porto' ),
					'param_name'  => 'bottom_divider_type',
					'value'       => function_exists( 'porto_sh_commons' ) ? porto_sh_commons( 'divider_type' ) : array(),
					'std'         => 'none',
					'admin_label' => true,
					'group'       => esc_html__( 'Bottom Shape Divider', 'porto' ),
				),
				array(
					'type'        => 'textarea_raw_html',
					'heading'     => esc_html__( 'Custom Shape Divider', 'porto' ),
					'param_name'  => 'bottom_divider_custom',
					// @codingStandardsIgnoreLine
					'value' => base64_encode( '' ),
					'description' => esc_html__( 'Please writer your svg code.', 'porto' ),
					'dependency'  => array(
						'element' => 'bottom_divider_type',
						'value'   => 'custom',
					),
					'group'       => esc_html__( 'Bottom Shape Divider', 'porto' ),
				),
				array(
					'type'        => 'colorpicker',
					'heading'     => esc_html__( 'Divider Color', 'porto' ),
					'param_name'  => 'bottom_divider_color',
					'description' => esc_html__( 'Select fill color of svg.', 'porto' ),
					'dependency'  => array(
						'element'            => 'bottom_divider_type',
						'value_not_equal_to' => 'none',
					),
					'group'       => esc_html__( 'Bottom Shape Divider', 'porto' ),
				),
				array(
					'type'        => 'textfield',
					'heading'     => esc_html__( 'Height', 'porto' ),
					'description' => esc_html__( 'Please input height of shape divider.', 'porto' ),
					'param_name'  => 'bottom_divider_height',
					'dependency'  => array(
						'element'            => 'bottom_divider_type',
						'value_not_equal_to' => 'none',
					),
					'group'       => esc_html__( 'Bottom Shape Divider', 'porto' ),
				),
				array(
					'type'       => 'checkbox',
					'heading'    => esc_html__( 'Flip', 'porto' ),
					'param_name' => 'bottom_divider_flip',
					'dependency' => array(
						'element'            => 'bottom_divider_type',
						'value_not_equal_to' => 'none',
					),
					'group'      => esc_html__( 'Bottom Shape Divider', 'porto' ),
				),
				array(
					'type'       => 'checkbox',
					'heading'    => esc_html__( 'Invert', 'porto' ),
					'param_name' => 'bottom_divider_invert',
					'dependency' => array(
						'element'            => 'bottom_divider_type',
						'value_not_equal_to' => 'none',
					),
					'group'      => esc_html__( 'Bottom Shape Divider', 'porto' ),
				),
				array(
					'type'        => 'textfield',
					'heading'     => esc_html__( 'Extra class name', 'porto' ),
					'param_name'  => 'bottom_divider_class',
					'description' => esc_html__( 'Style particular content element differently - add a class name and refer to it in custom CSS.', 'porto' ),
					'dependency'  => array(
						'element'            => 'bottom_divider_type',
						'value_not_equal_to' => 'none',
					),
					'group'       => esc_html__( 'Bottom Shape Divider', 'porto' ),
				),
			)
		);

		/* ---------------------------- */
		/* Customize Row
		/* ---------------------------- */
		
		vc_add_param(
			'vc_row',
			array(
				'type'        => 'dropdown',
				'heading'     => esc_html__( 'Row stretch with CSS', 'porto' ),
				'param_name'  => 'full_width_css',
				'value'       => array(
					esc_html__( 'Default', 'porto' ) => '',
					esc_html__( 'Stretch row', 'porto' ) => 'stretch_row_css',
					esc_html__( 'Stretch row and content', 'porto' ) => 'stretch_row_content_css',
					esc_html__( 'Stretch row and content (no paddings)', 'porto' ) => 'stretch_row_content_no_spaces_css',
				),
				'weight'      => 10,
				'description' => esc_html__( 'Enable this option instead of "Row strectch with JS" to stretch row with CSS.', 'porto' ),
			)
		);
		vc_update_shortcode_param( 
            'vc_row',
            array(
                'type' => 'dropdown',
                'heading' => esc_html__( 'Row stretch with JS', 'porto' ),
                'param_name' => 'full_width',
                'value' => array(
                    esc_html__( 'Default', 'js_composer' ) => '',
                    esc_html__( 'Stretch row', 'js_composer' ) => 'stretch_row',
                    esc_html__( 'Stretch row and content', 'js_composer' ) => 'stretch_row_content',
                    esc_html__( 'Stretch row and content (no paddings)', 'js_composer' ) => 'stretch_row_content_no_spaces',
                ),
                'description' => esc_html__( 'Select stretching options for row and content (Note: stretched may not work properly if parent container has "overflow: hidden" CSS property).', 'js_composer' ),
            ),
        );

		vc_add_param(
			'vc_row',
			array(
				'type'        => 'textfield',
				'heading'     => __( 'Video link', 'js_composer' ),
				'param_name'  => 'video_bg_url',
				'value'       => '',
				'description' => __( 'Add YouTube link or mp4 video link.', 'porto' ),
				'dependency'  => array(
					'element'   => 'video_bg',
					'not_empty' => true,
				),
			)
		);

		$param           = WPBMap::getParam( 'vc_row', 'full_width' );
		$param['weight'] = 4;
		vc_update_shortcode_param( 'vc_row', $param );

		vc_add_param(
			'vc_row',
			array(
				'type'        => 'checkbox',
				'heading'     => __( 'Wrap as Container', 'porto' ),
				'param_name'  => 'wrap_container',
				'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'admin_label' => true,
				// 'hint'        => '<img src="' . PORTO_HINT_URL . 'loading-overlay.gif"/>',
				'weight'      => 4,
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'        => 'checkbox',
				'heading'     => __( 'No Space between Columns?', 'porto' ),
				'param_name'  => 'no_padding',
				'hint'        => '<img src="' . PORTO_HINT_URL . 'row-no_padding.gif"/>',
				'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'weight'      => 3,
				'admin_label' => true,
				'qa_selector' => '>.vc_row',
				'description' => sprintf( esc_html__( 'Stretch row and content (no paddings) for full width, if set %1$sPage layout & Sidebar%2$s in Meta Field as \'Wide Width\' (Container Fluid) layout.%3$sRemove only paddings in Container Layout (Without Sidebar).', 'porto' ), '<a href="#view-meta-box">', '</a>', '<br/>' ),
			)
		);
		vc_update_shortcode_param( 
			'vc_row',
			array(
				'type' => 'dropdown',
				'heading' => esc_html__( 'Columns gap', 'js_composer' ),
				'param_name' => 'gap',
				'value' => array(
					'Theme Default' => '0',
					'1px' => '1',
					'2px' => '2',
					'3px' => '3',
					'4px' => '4',
					'5px' => '5',
					'10px' => '10',
					'15px' => '15',
					'20px' => '20',
					'25px' => '25',
					'30px' => '30',
					'35px' => '35',
				),
				'std' => '0',
				'weight' => 2,
				'description' => esc_html__( 'Select gap between columns in row.', 'js_composer' ),
				'dependency' => array(
					'element'   => 'no_padding',
					'is_empty' => true,
				),
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Text Align', 'porto' ),
				'param_name' => 'text_align',
				'value'      => porto_vc_commons( 'align' ),
				'group'      => $section_group,
			)
		);
		$post_id = false;
		if ( is_admin() ) {
			if ( isset( $_REQUEST['post_id'] ) ) {
				$post_id = (int) $_REQUEST['post_id'];
			} elseif ( isset( $_REQUEST['post'] ) ) {
				$post_id = (int) $_REQUEST['post'];
			}
		}
		$is_header_builder = $post_id && 'header' == get_post_meta( $post_id, 'porto_builder_type', true );
		if ( $is_header_builder || ! $post_id ) {
			
			vc_add_params(
				'vc_row',
				array(
					array(
						'type'        => 'checkbox',
						'heading'     => __( 'Make section sticky?', 'porto' ),
						'description' => sprintf( esc_html__( 'This section will be displayed in %1$ssticky header%2$s.', 'porto' ), '<a href="' . porto_get_theme_option_url( 'sticky-header-effect' ) . '" target="_blank">', '</a>' ),
						'param_name'  => 'is_main_header',
						'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
						'group'       => $section_group,
						'admin_label' => true,
					),
					array(
						'type'        => 'porto_number',
						'heading'     => __( 'Padding Left/Right on Sticky', 'porto-functionality' ),
						'param_name'  => 'ph_space_sticky',
						'units'       => array( 'px', 'em', 'rem' ),
						'selectors'   => array(
							'#header.sticky-header {{WRAPPER}}.header-main.sticky' => 'padding-left: {{VALUE}}{{UNIT}} !important;padding-right: {{VALUE}}{{UNIT}} !important;',
						),
						'dependency'  => array(
							'element' => 'is_main_header',
							'value'   => 'yes',
						),
						'group'       => $section_group,
					),
					array(
						'type'        => 'porto_number',
						'heading'     => __( 'Padding Top/Bottom on Sticky', 'porto-functionality' ),
						'param_name'  => 'pv_space_sticky',
						'units'       => array( 'px', 'em', 'rem' ),
						'selectors'   => array(
							'#header.sticky-header {{WRAPPER}}.header-main.sticky' => 'padding-top: {{VALUE}}{{UNIT}} !important; padding-bottom: {{VALUE}}{{UNIT}} !important;',
						),
						'dependency'  => array(
							'element' => 'is_main_header',
							'value'   => 'yes',
						),
						'group'       => $section_group,
					),
					array(
						'type'       => 'porto_param_heading',
						'param_name' => 'dsc_sticky_bg',
						'text'       => esc_html__( 'Background', 'porto-functionality' ),
						'with_group' => true,
						'dependency' => array(
							'element'  => 'sticky_gradient',
							'is_empty' => true,
						),
						'group'      => __( 'Sticky Background', 'porto-functionality' ),
					),
					array(
						'type'        => 'colorpicker',
						'heading'     => __( 'Background Color', 'porto-functionality' ),
						'param_name'  => 'sticky_bg',
						'description' => __( 'Control the sticky background.', 'porto-functionality' ),
						'dependency'  => array(
							'element'  => 'sticky_gradient',
							'is_empty' => true,
						),
						'group'       => __( 'Sticky Background', 'porto-functionality' ),
					),
			
					array(
						'type'       => 'porto_param_heading',
						'param_name' => 'dsc_sticky_gradient',
						'text'       => esc_html__( 'Gradient Background', 'porto-functionality' ),
						'with_group' => true,
						'dependency'  => array(
							'element' => 'is_main_header',
							'value'   => 'yes',
						),
						'group'      => __( 'Sticky Background', 'porto-functionality' ),
					),
					array(
						'type'        => 'checkbox',
						'heading'     => __( 'Gradient Background', 'porto-functionality' ),
						'param_name'  => 'sticky_gradient',
						'description' => __( 'Set the gradient Background.', 'porto-functionality' ),
						'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
						'dependency'  => array(
							'element'  => 'is_main_header',
							'value'   => 'yes',
						),
						'group'       => __( 'Sticky Background', 'porto-functionality' ),
					),
					array(
						'type'        => 'colorpicker',
						'heading'     => __( 'Top Color', 'porto-functionality' ),
						'param_name'  => 'sticky_top_bg',
						'dependency'  => array(
							'element'   => 'sticky_gradient',
							'not_empty' => true,
						),
						'description' => __( 'Control the first color for gradient.', 'porto-functionality' ),
						'group'       => __( 'Sticky Background', 'porto-functionality' ),
					),
					array(
						'type'        => 'number',
						'heading'     => __( 'Top Location (%)', 'porto-functionality' ),
						'param_name'  => 'sticky_top_loc',
						'dependency'  => array(
							'element'   => 'sticky_gradient',
							'not_empty' => true,
						),
						'description' => __( 'Control the location of starting point.', 'porto-functionality' ),
						'group'       => __( 'Sticky Background', 'porto-functionality' ),
					),
					array(
						'type'        => 'colorpicker',
						'heading'     => __( 'Bottom Color', 'porto-functionality' ),
						'param_name'  => 'sticky_bottom_bg',
						'dependency'  => array(
							'element'   => 'sticky_gradient',
							'not_empty' => true,
						),
						'description' => __( 'Control the last color for the gradient.', 'porto-functionality' ),
						'group'       => __( 'Sticky Background', 'porto-functionality' ),
					),
					array(
						'type'        => 'number',
						'heading'     => __( 'Bottom Location (%)', 'porto-functionality' ),
						'param_name'  => 'sticky_bottom_loc',
						'dependency'  => array(
							'element'   => 'sticky_gradient',
							'not_empty' => true,
						),
						'description' => __( 'Control the location of ending point.', 'porto-functionality' ),
						'group'       => __( 'Sticky Background', 'porto-functionality' ),
					),
					array(
						'type'        => 'number',
						'heading'     => __( 'Angle (deg)', 'porto-functionality' ),
						'param_name'  => 'sticky_angle',
						'dependency'  => array(
							'element'   => 'sticky_gradient',
							'not_empty' => true,
						),
						'description' => __( 'Control the angle of gradient direction.', 'porto-functionality' ),
						'group'       => __( 'Sticky Background', 'porto-functionality' ),
					),
				)
			);

			// Update vc_column for header column width - flex-auto, flex-1
			$param = WPBMap::getParam( 'vc_column', 'width' );
			$param['value'] = array_merge(
				$param['value'],
				array(
					esc_html__( 'Flex Auto', 'porto' ) => 'flex-auto',
					esc_html__( 'Flex 1', 'porto' )    => 'flex-1',
				)
			);
			vc_update_shortcode_param( 'vc_column', $param );
		}
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'porto_param_heading',
				'param_name' => 'dsc_section',
				'text'       => esc_html__( 'Section', 'porto' ),
				'group'      => $section_group,
			)
		);	
		vc_add_param(
			'vc_row',
			array(
				'type'        => 'checkbox',
				'heading'     => __( 'Is Section?', 'porto' ),
				'param_name'  => 'is_section',
				'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'       => $section_group,
				'admin_label' => true,
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Section & Parallax Text Color', 'porto' ),
				'param_name' => 'section_text_color',
				'value'      => porto_vc_commons( 'section_text_color' ),
				'group'      => $section_group,
				'dependency' => array(
					'element'   => 'is_section',
					'not_empty' => true,
				),
			)
		);		
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Section Skin Color', 'porto' ),
				'param_name' => 'section_skin',
				'value'      => porto_vc_commons( 'section_skin' ),
				'group'      => $section_group,
				'dependency' => array(
					'element'   => 'is_section',
					'not_empty' => true,
				),
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Section Default Color Scale', 'porto' ),
				'param_name' => 'section_color_scale',
				'value'      => porto_vc_commons( 'section_color_scale' ),
				'dependency' => array(
					'element' => 'section_skin',
					'value'   => array( 'default' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Section Color Scale', 'porto' ),
				'param_name' => 'section_skin_scale',
				'dependency' => array(
					'element' => 'section_skin',
					'value'   => array( 'primary', 'secondary', 'tertiary', 'quaternary', 'dark', 'light' ),
				),
				'group'      => $section_group,
				'value'      => array(
					__( 'Default', 'porto' ) => '',
					__( 'Scale 2', 'porto' ) => 'scale-2',
				),
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Remove Margin Top', 'porto' ),
				'param_name' => 'remove_margin_top',
				'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'      => $section_group,
				'dependency' => array(
					'element' => 'is_section',
					'not_empty' => true,
				),
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Remove Margin Bottom', 'porto' ),
				'param_name' => 'remove_margin_bottom',
				'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'      => $section_group,
				'dependency' => array(
					'element' => 'is_section',
					'not_empty' => true,
				),
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Remove Padding Top', 'porto' ),
				'param_name' => 'remove_padding_top',
				'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'      => $section_group,
				'dependency' => array(
					'element' => 'is_section',
					'not_empty' => true,
				),
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Remove Padding Bottom', 'porto' ),
				'param_name' => 'remove_padding_bottom',
				'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'      => $section_group,
				'dependency' => array(
					'element' => 'is_section',
					'not_empty' => true,
				),
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Remove Border', 'porto' ),
				'param_name' => 'remove_border',
				'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'      => $section_group,
				'dependency' => array(
					'element' => 'is_section',
					'not_empty' => true,
				),
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'porto_param_heading',
				'param_name' => 'dsc_divider',
				'text'       => esc_html__( 'Divider', 'porto' ),
				'group'      => $section_group,
				'dependency' => array(
					'element'   => 'is_section',
					'not_empty' => true,
				),
			)
		);			
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Show Divider', 'porto' ),
				'param_name' => 'show_divider',
				'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'dependency' => array(
					'element'   => 'is_section',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Divider Position', 'porto' ),
				'param_name' => 'divider_pos',
				'value'      => array(
					__( 'Top', 'porto' )    => '',
					__( 'Bottom', 'porto' ) => 'bottom',
				),
				'dependency' => array(
					'element'   => 'show_divider',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Divider Color', 'porto' ),
				'param_name' => 'divider_color',
				'dependency' => array(
					'element'   => 'show_divider',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'textfield',
				'heading'    => __( 'Divider Height', 'porto' ),
				'param_name' => 'divider_height',
				'dependency' => array(
					'element'   => 'show_divider',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Show Divider Icon', 'porto' ),
				'param_name' => 'show_divider_icon',
				'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'dependency' => array(
					'element'   => 'show_divider',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Icon library', 'js_composer' ),
				'value'      => array(
					__( 'Font Awesome', 'porto' )      => 'fontawesome',
					__( 'Simple Line Icon', 'porto' )  => 'simpleline',
					__( 'Custom Image Icon', 'porto' ) => 'image',
				),
				'param_name' => 'divider_icon_type',
				'dependency' => array(
					'element'   => 'show_divider_icon',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'attach_image',
				'heading'    => __( 'Select Icon', 'porto' ),
				'dependency' => array(
					'element' => 'divider_icon_type',
					'value'   => 'image',
				),
				'param_name' => 'divider_icon_image',
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'iconpicker',
				'heading'    => __( 'Select Icon', 'porto' ),
				'param_name' => 'divider_icon',
				'dependency' => array(
					'element' => 'divider_icon_type',
					'value'   => 'fontawesome',
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'iconpicker',
				'heading'    => __( 'Select Icon', 'porto' ),
				'param_name' => 'divider_icon_simpleline',
				'value'      => '',
				'settings'   => array(
					'type'         => 'simpleline',
					'iconsPerPage' => 4000,
				),
				'dependency' => array(
					'element' => 'divider_icon_type',
					'value'   => 'simpleline',
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Icon Skin Color', 'porto' ),
				'param_name' => 'divider_icon_skin',
				'std'        => 'custom',
				'value'      => porto_vc_commons( 'colors' ),
				'dependency' => array(
					'element'   => 'show_divider_icon',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Icon Color', 'porto' ),
				'param_name' => 'divider_icon_color',
				'dependency' => array(
					'element' => 'divider_icon_skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Icon Background Color', 'porto' ),
				'param_name' => 'divider_icon_bg_color',
				'dependency' => array(
					'element' => 'divider_icon_skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Icon Border Color', 'porto' ),
				'param_name' => 'divider_icon_border_color',
				'dependency' => array(
					'element' => 'divider_icon_skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Icon Wrap Border Color', 'porto' ),
				'param_name' => 'divider_icon_wrap_border_color',
				'dependency' => array(
					'element' => 'divider_icon_skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Icon Style', 'porto' ),
				'param_name' => 'divider_icon_style',
				'value'      => porto_vc_commons( 'separator_icon_style' ),
				'dependency' => array(
					'element'   => 'show_divider_icon',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Icon Position', 'porto' ),
				'param_name' => 'divider_icon_pos',
				'value'      => porto_vc_commons( 'separator_icon_pos' ),
				'dependency' => array(
					'element'   => 'show_divider_icon',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_row',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Icon Size', 'porto' ),
				'param_name' => 'divider_icon_size',
				'value'      => porto_vc_commons( 'separator_icon_size' ),
				'dependency' => array(
					'element'   => 'show_divider_icon',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);

		// add sticky options
		vc_add_params(
			'vc_row',
			array(
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'desc_row_addon',
					'text'       => sprintf( esc_html__( 'Read this %1$sarticle%2$s to find out more about Porto Addons.', 'porto' ), '<a target="_blank" href="https://www.portotheme.com/wordpress/porto/documentation/wpbakery-porto-addons/">', '</a>' ),
					'group'      => $addon_group,
				),
			)
		);
		if ( ! $is_header_builder ) {
			// Remove Section Sticky options on Header
			vc_add_params(
				'vc_row',
				array(
					array(
						'type'        => 'checkbox',
						'heading'     => __( 'Enable Sticky Options?', 'porto' ),
						'param_name'  => 'is_sticky',
						'hint'        => '<img src="' . PORTO_HINT_URL . 'row-is_sticky.gif"/>',
						'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
						'group'       => $addon_group,
						'admin_label' => true,
					),
					array(
						'type'       => 'textfield',
						'heading'    => __( 'Container Selector', 'porto' ),
						'param_name' => 'sticky_container_selector',
						'value'      => '.main-content',
						'dependency' => array(
							'element'   => 'is_sticky',
							'not_empty' => true,
						),
						'group'      => $addon_group,
					),
					array(
						'type'       => 'textfield',
						'heading'    => __( 'Min Width (unit: px)', 'porto' ),
						'param_name' => 'sticky_min_width',
						''           => __( 'Wll be disabled if window width is smaller than min width', 'porto' ),
						'value'      => 768,
						'dependency' => array(
							'element'   => 'is_sticky',
							'not_empty' => true,
						),
						'group'      => $addon_group,
					),
					array(
						'type'       => 'textfield',
						'heading'    => __( 'Top (unit: px)', 'porto' ),
						'param_name' => 'sticky_top',
						''           => __( 'Top position when active', 'porto' ),
						'value'      => 110,
						'dependency' => array(
							'element'   => 'is_sticky',
							'not_empty' => true,
						),
						'group'      => $addon_group,
					),
					array(
						'type'       => 'textfield',
						'heading'    => __( 'Bottom (unit: px)', 'porto' ),
						'param_name' => 'sticky_bottom',
						''           => __( 'Bottom position when active', 'porto' ),
						'value'      => 0,
						'dependency' => array(
							'element'   => 'is_sticky',
							'not_empty' => true,
						),
						'group'      => $addon_group,
					),
					array(
						'type'       => 'textfield',
						'heading'    => __( 'Active Class', 'porto' ),
						'param_name' => 'sticky_active_class',
						'value'      => 'sticky-active',
						'dependency' => array(
							'element'   => 'is_sticky',
							'not_empty' => true,
						),
						'group'      => $addon_group,
					),
				)
				);
		}

		// add animation options
		vc_add_params(
			'vc_row',
			array(
				$animation_type,
				$animation_duration,
				$animation_delay,
				$animation_reveal_clr,
			)
		);

		// add scroll parallax effect
		vc_add_params(
			'vc_row',
			array(
				array(
					'type'        => 'checkbox',
					'heading'     => __( 'Scroll Parallax?', 'porto' ),
					'description' => sprintf( esc_html__( 'Section\'s width changes when scrolling page. For more information, read this %1$sarticle%2$s.', 'porto' ), '<a href="https://www.portotheme.com/wordpress/porto/documentation/how-to-add-scroll-paralax-effect/" target="_blank">', '</a>' ),
					'param_name'  => 'scroll_parallax',
					'hint'        => '<img src="' . PORTO_HINT_URL . 'row-scroll_parallax.gif"/>',
					'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
					'group'       => $addon_group,
				),
				array(
					'type'       => 'number',
					'heading'    => __( 'Start Width (%)', 'porto' ),
					'param_name' => 'scroll_parallax_width',
					'std'        => 40,
					'min'        => 10,
					'max'        => 90,
					'step'       => 1,
					'dependency' => array(
						'element'   => 'scroll_parallax',
						'not_empty' => true,
					),
					'group'      => $addon_group,
				),
			)
		);

		// add particles effect
		vc_add_params(
			'vc_row',
			array(
				array(
					'type'        => 'checkbox',
					'heading'     => __( 'Particles Effect?', 'porto' ),
					'param_name'  => 'particles_effect',
					'hint'        => '<img src="' . PORTO_HINT_URL . 'row-particles_effect.gif"/>',
					'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
					'description' => sprintf( esc_html__( 'Read this %1$sarticle%2$s about particle effect.', 'porto' ), '<a href="https://www.portotheme.com/wordpress/porto/documentation/how-to-add-particles-effect/" target="_blank">', '</a>' ),
					'group'       => $addon_group,
				),
				array(
					'type'       => 'attach_image',
					'heading'    => __( 'Particles Image', 'porto' ),
					'param_name' => 'particles_img',
					'dependency' => array(
						'element'   => 'particles_effect',
						'not_empty' => true,
					),
					'group'      => $addon_group,
				),
				array(
					'type'       => 'dropdown',
					'heading'    => __( 'Particles Hover Effect', 'porto' ),
					'param_name' => 'particles_hover_effect',
					'value'      => array(
						__( 'None', 'porto' )    => '',
						__( 'Grab', 'porto' )    => 'grab',
						__( 'Bubble', 'porto' )  => 'bubble',
						__( 'Repulse', 'porto' ) => 'repulse',
					),
					'std'        => '',
					'dependency' => array(
						'element'   => 'particles_img',
						'not_empty' => true,
					),
					'group'      => $addon_group,
				),
				array(
					'type'       => 'dropdown',
					'heading'    => __( 'Particles Click Effect', 'porto' ),
					'param_name' => 'particles_click_effect',
					'value'      => array(
						__( 'None', 'porto' )    => '',
						__( 'Bubble', 'porto' )  => 'bubble',
						__( 'Repulse', 'porto' ) => 'repulse',
						__( 'Push', 'porto' )    => 'push',
						__( 'Remove', 'porto' )  => 'remove',
					),
					'std'        => '',
					'dependency' => array(
						'element'   => 'particles_img',
						'not_empty' => true,
					),
					'group'      => $addon_group,
				),
			)
		);

		// add mouse hover split effect
		vc_add_params(
			'vc_row',
			array(
				array(
					'type'        => 'checkbox',
					'heading'     => __( 'Mouse Hover Split?', 'porto' ),
					'param_name'  => 'hover_split',
					'hint'        => '<img src="' . PORTO_HINT_URL . 'row-hover_split.gif"/>',
					'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
					'description' => sprintf( esc_html__( 'For Hover Split, the row should have two split slide columns. For more information, read this %1$sarticle%2$s.', 'porto' ), '<a href="https://www.portotheme.com/wordpress/porto/documentation/how-to-use-hover-split-effect/" target="_blank">', '</a>' ),
					'group'       => $addon_group,
				),
				array(
					'type'        => 'textfield',
					'heading'     => __( 'Min Height', 'porto' ),
					'description' => __( 'Control the min height of split slide. Default is 300px.', 'porto' ),
					'param_name'  => 'split_mh',
					'dependency'  => array(
						'element'   => 'hover_split',
						'not_empty' => true,
					),
					'group'       => $addon_group,
				),
			)
		);

		// add Scroll Effect In Viewport
		vc_add_params(
			'vc_row',
			array(
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'desc_scroll_inviewport',
					'text'       => __( 'Please don\'t use the background option in the "Design Options" tab.', 'porto' ),
					'group'      => $addon_group,
				),
				array(
					'type'        => 'checkbox',
					'heading'     => __( 'Scroll Effect In Viewport?', 'porto' ),
					'param_name'  => 'scroll_inviewport',
					'hint'        => '<img src="' . PORTO_HINT_URL . 'row-scroll_inviewport.gif"/>',
					'description' => sprintf( esc_html__( 'Section\'s background color changes when scrolling page. For more information, read this %1$sarticle%2$s.', 'porto' ), '<a href="https://www.portotheme.com/wordpress/porto/documentation/how-to-use-scroll-in-viewport/" target="_blank">', '</a>' ),
					'group'       => $addon_group,
				),
				array(
					'type'        => 'checkbox',
					'heading'     => __( 'Scale Background?', 'porto' ),
					'param_name'  => 'scroll_bg_scale',
					'hint'        => '<img src="' . PORTO_HINT_URL . 'row-scroll_bg_scale.gif"/>',
					'description' => esc_html__( 'Scale the background color when scrolling page.', 'porto' ),
					'dependency'  => array(
						'element'   => 'scroll_inviewport',
						'not_empty' => true,
					),
					'group'       => $addon_group,
				),
				array(
					'type'        => 'colorpicker',
					'heading'     => __( 'Inside Background Color', 'porto' ),
					'param_name'  => 'scroll_bg',
					'description' => esc_html__( 'Actual Background Color in the viewport.', 'porto' ),
					'dependency'  => array(
						'element'  => 'scroll_bg_scale',
						'is_empty' => true,
					),
					'group'       => $addon_group,
				),
				array(
					'type'        => 'colorpicker',
					'heading'     => __( 'Outside Background Color', 'porto' ),
					'param_name'  => 'scroll_bg_inout',
					'description' => esc_html__( 'Background Color for entering or exit.', 'porto' ),
					'dependency'  => array(
						'element'  => 'scroll_bg_scale',
						'is_empty' => true,
					),
					'group'       => $addon_group,
				),
				array(
					'type'        => 'porto_number',
					'heading'     => __( 'Top Offset(px)', 'porto' ),
					'param_name'  => 'scroll_top_mode',
					'description' => esc_html__( 'Background Color for entering or exit.', 'porto' ),
					'dependency'  => array(
						'element'  => 'scroll_bg_scale',
						'is_empty' => true,
					),
					'group'       => $addon_group,
				),
				array(
					'type'       => 'porto_number',
					'heading'    => __( 'Bottom Offset(px)', 'porto' ),
					'param_name' => 'scroll_bottom_mode',
					'dependency' => array(
						'element'  => 'scroll_bg_scale',
						'is_empty' => true,
					),
					'group'      => $addon_group,
				),
				array(
					'type'       => 'colorpicker',
					'heading'    => __( 'Background Color', 'porto' ),
					'param_name' => 'scale_bg',
					'dependency' => array(
						'element'   => 'scroll_bg_scale',
						'not_empty' => true,
					),
					'group'      => $addon_group,
				),
				array(
					'type'        => 'checkbox',
					'heading'     => __( 'Rounded Background?', 'porto' ),
					'param_name'  => 'set_round',
					'description' => esc_html__( 'To make the shape in a circle when scrolling page.', 'porto' ),
					'dependency'  => array(
						'element'   => 'scroll_bg_scale',
						'not_empty' => true,
					),
					'group'       => $addon_group,
				),
				array(
					'type'       => 'textfield',
					'heading'    => __( 'Extra Class', 'porto' ),
					'param_name' => 'scale_extra_class',
					'dependency' => array(
						'element'   => 'scroll_bg_scale',
						'not_empty' => true,
					),
					'group'      => $addon_group,
				),
			)
		);
		/* ---------------------------- */
		/* Customize Inner Row
		/* ---------------------------- */

		// add sticky options
		vc_update_shortcode_param( 
			'vc_row_inner',
			array(
				'type' => 'dropdown',
				'heading' => esc_html__( 'Columns gap', 'js_composer' ),
				'param_name' => 'gap',
				'value' => array(
					'Theme Default' => '0',
					'1px' => '1',
					'2px' => '2',
					'3px' => '3',
					'4px' => '4',
					'5px' => '5',
					'10px' => '10',
					'15px' => '15',
					'20px' => '20',
					'25px' => '25',
					'30px' => '30',
					'35px' => '35',
				),
				'std' => '0',
				'weight' => 2,
				'description' => esc_html__( 'Select gap between columns in row.', 'js_composer' ),
				'dependency' => array(
					'element'   => 'no_padding',
					'is_empty' => true,
				),
			)
		);
		vc_add_params(
			'vc_row_inner',
			array(
				array(
					'type'        => 'checkbox',
					'heading'     => __( 'Wrap as Container', 'porto' ),
					'param_name'  => 'wrap_container',
					'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
					'admin_label' => true,
					'weight'      => 3,
				),
				array(
					'type'        => 'checkbox',
					'heading'     => __( 'No Space between Columns?', 'porto' ),
					'param_name'  => 'no_padding',
					'hint'        => '<img src="' . PORTO_HINT_URL . 'row-no_padding.gif"/>',
					'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
					'weight'      => 3,
					'admin_label' => true,
					'qa_selector' => '>.vc_row',
					'description' => sprintf( esc_html__( 'Stretch row and content (no paddings) for full width, if set %1$sPage layout & Sidebar%2$s in Meta Field as \'Wide Width\' (Container Fluid) layout.%3$sRemove only paddings in Container Layout (Without Sidebar).', 'porto' ), '<a href="#view-meta-box">', '</a>', '<br/>' ),
				),
				array(
					'type'        => 'checkbox',
					'heading'     => __( 'Enable Sticky Options?', 'porto' ),
					'param_name'  => 'is_sticky',
					'hint'        => '<img src="' . PORTO_HINT_URL . 'row-is_sticky.gif"/>',
					'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
					'group'       => $addon_group,
					'admin_label' => true,
					'qa_selector' => '>.vc_row',
				),
				array(
					'type'       => 'textfield',
					'heading'    => __( 'Container Selector', 'porto' ),
					'param_name' => 'sticky_container_selector',
					'value'      => '.vc_row',
					'dependency' => array(
						'element'   => 'is_sticky',
						'not_empty' => true,
					),
					'group'      => $addon_group,
				),
				array(
					'type'       => 'textfield',
					'heading'    => __( 'Min Width (unit: px)', 'porto' ),
					'param_name' => 'sticky_min_width',
					''           => __( 'Wll be disabled if window width is smaller than min width', 'porto' ),
					'value'      => 768,
					'dependency' => array(
						'element'   => 'is_sticky',
						'not_empty' => true,
					),
					'group'      => $addon_group,
				),
				array(
					'type'       => 'textfield',
					'heading'    => __( 'Top (unit: px)', 'porto' ),
					'param_name' => 'sticky_top',
					''           => __( 'Top position when active', 'porto' ),
					'value'      => 110,
					'dependency' => array(
						'element'   => 'is_sticky',
						'not_empty' => true,
					),
					'group'      => $addon_group,
				),
				array(
					'type'       => 'textfield',
					'heading'    => __( 'Bottom (unit: px)', 'porto' ),
					'param_name' => 'sticky_bottom',
					''           => __( 'Bottom position when active', 'porto' ),
					'value'      => 0,
					'dependency' => array(
						'element'   => 'is_sticky',
						'not_empty' => true,
					),
					'group'      => $addon_group,
				),
				array(
					'type'       => 'textfield',
					'heading'    => __( 'Active Class', 'porto' ),
					'param_name' => 'sticky_active_class',
					'value'      => 'sticky-active',
					'dependency' => array(
						'element'   => 'is_sticky',
						'not_empty' => true,
					),
					'group'      => $addon_group,
				),
			)
		);
		// add animation options
		vc_add_params(
			'vc_row_inner',
			array(
				$animation_type,
				$animation_duration,
				$animation_delay,
				$animation_reveal_clr,
			)
		);

		/* ---------------------------- */
		/* Customize Column
		/* ---------------------------- */
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Text Align', 'porto' ),
				'param_name' => 'text_align',
				'value'      => porto_vc_commons( 'align' ),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'porto_param_heading',
				'param_name' => 'dsc_section',
				'text'       => esc_html__( 'Section', 'porto' ),
				'group'      => $section_group,
			)
		);		
		vc_add_param(
			'vc_column',
			array(
				'type'        => 'checkbox',
				'heading'     => __( 'Is Section?', 'porto' ),
				'param_name'  => 'is_section',
				'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'       => $section_group,
				'admin_label' => true,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Section & Parallax Text Color', 'porto' ),
				'param_name' => 'section_text_color',
				'value'      => porto_vc_commons( 'section_text_color' ),
				'group'      => $section_group,
				'dependency' => array(
					'element'   => 'is_section',
					'not_empty' => true,
				),
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Section Skin Color', 'porto' ),
				'param_name' => 'section_skin',
				'value'      => porto_vc_commons( 'section_skin' ),
				'group'      => $section_group,
				'dependency' => array(
					'element'   => 'is_section',
					'not_empty' => true,
				),
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Section Default Color Scale', 'porto' ),
				'param_name' => 'section_color_scale',
				'value'      => porto_vc_commons( 'section_color_scale' ),
				'dependency' => array(
					'element' => 'section_skin',
					'value'   => array( 'default' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Section Color Scale', 'porto' ),
				'param_name' => 'section_skin_scale',
				'dependency' => array(
					'element' => 'section_skin',
					'value'   => array( 'primary', 'secondary', 'tertiary', 'quaternary', 'dark', 'light' ),
				),
				'group'      => $section_group,
				'value'      => array(
					__( 'Default', 'porto' ) => '',
					__( 'Scale 2', 'porto' ) => 'scale-2',
				),
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Remove Margin Top', 'porto' ),
				'param_name' => 'remove_margin_top',
				'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'      => $section_group,
				'dependency' => array(
					'element' => 'is_section',
					'not_empty' => true,
				),
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Remove Margin Bottom', 'porto' ),
				'param_name' => 'remove_margin_bottom',
				'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'      => $section_group,
				'dependency' => array(
					'element' => 'is_section',
					'not_empty' => true,
				),
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Remove Padding Top', 'porto' ),
				'param_name' => 'remove_padding_top',
				'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'      => $section_group,
				'dependency' => array(
					'element' => 'is_section',
					'not_empty' => true,
				),
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Remove Padding Bottom', 'porto' ),
				'param_name' => 'remove_padding_bottom',
				'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'      => $section_group,
				'dependency' => array(
					'element' => 'is_section',
					'not_empty' => true,
				),
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Remove Border', 'porto' ),
				'param_name' => 'remove_border',
				'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'      => $section_group,
				'dependency' => array(
					'element'   => 'is_section',
					'not_empty' => true,
				),
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'porto_param_heading',
				'param_name' => 'dsc_divider',
				'text'       => esc_html__( 'Divider', 'porto' ),
				'group'      => $section_group,
				'dependency' => array(
					'element'   => 'is_section',
					'not_empty' => true,
				),
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Show Divider', 'porto' ),
				'param_name' => 'show_divider',
				'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'dependency' => array(
					'element'   => 'is_section',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Divider Position', 'porto' ),
				'param_name' => 'divider_pos',
				'value'      => array(
					__( 'Top', 'porto' )    => '',
					__( 'Bottom', 'porto' ) => 'bottom',
				),
				'dependency' => array(
					'element'   => 'show_divider',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Divider Color', 'porto' ),
				'param_name' => 'divider_color',
				'dependency' => array(
					'element'   => 'show_divider',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'textfield',
				'heading'    => __( 'Divider Height', 'porto' ),
				'param_name' => 'divider_height',
				'dependency' => array(
					'element'   => 'show_divider',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Show Divider Icon', 'porto' ),
				'param_name' => 'show_divider_icon',
				'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'dependency' => array(
					'element'   => 'show_divider',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Icon library', 'js_composer' ),
				'value'      => array(
					__( 'Font Awesome', 'porto' )      => 'fontawesome',
					__( 'Simple Line Icon', 'porto' )  => 'simpleline',
					__( 'Custom Image Icon', 'porto' ) => 'image',
				),
				'param_name' => 'divider_icon_type',
				'dependency' => array(
					'element'   => 'show_divider_icon',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'attach_image',
				'heading'    => __( 'Select Icon', 'porto' ),
				'dependency' => array(
					'element' => 'divider_icon_type',
					'value'   => 'image',
				),
				'param_name' => 'divider_icon_image',
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'iconpicker',
				'heading'    => __( 'Select Icon', 'porto' ),
				'param_name' => 'divider_icon',
				'dependency' => array(
					'element' => 'divider_icon_type',
					'value'   => 'fontawesome',
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'iconpicker',
				'heading'    => __( 'Select Icon', 'porto' ),
				'param_name' => 'divider_icon_simpleline',
				'value'      => '',
				'settings'   => array(
					'type'         => 'simpleline',
					'iconsPerPage' => 4000,
				),
				'dependency' => array(
					'element' => 'divider_icon_type',
					'value'   => 'simpleline',
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Icon Skin Color', 'porto' ),
				'param_name' => 'divider_icon_skin',
				'std'        => 'custom',
				'value'      => porto_vc_commons( 'colors' ),
				'dependency' => array(
					'element'   => 'show_divider_icon',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Icon Color', 'porto' ),
				'param_name' => 'divider_icon_color',
				'dependency' => array(
					'element' => 'divider_icon_skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Icon Background Color', 'porto' ),
				'param_name' => 'divider_icon_bg_color',
				'dependency' => array(
					'element' => 'divider_icon_skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Icon Border Color', 'porto' ),
				'param_name' => 'divider_icon_border_color',
				'dependency' => array(
					'element' => 'divider_icon_skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Icon Wrap Border Color', 'porto' ),
				'param_name' => 'divider_icon_wrap_border_color',
				'dependency' => array(
					'element' => 'divider_icon_skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Icon Style', 'porto' ),
				'param_name' => 'divider_icon_style',
				'value'      => porto_vc_commons( 'separator_icon_style' ),
				'dependency' => array(
					'element'   => 'show_divider_icon',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Icon Position', 'porto' ),
				'param_name' => 'divider_icon_pos',
				'value'      => porto_vc_commons( 'separator_icon_pos' ),
				'dependency' => array(
					'element'   => 'show_divider_icon',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Icon Size', 'porto' ),
				'param_name' => 'divider_icon_size',
				'value'      => porto_vc_commons( 'separator_icon_size' ),
				'dependency' => array(
					'element'   => 'show_divider_icon',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'porto_param_heading',
				'param_name' => 'dsc_half_container',
				'text'       => esc_html__( 'Half Container', 'porto' ),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'        => 'checkbox',
				'heading'     => __( 'Is Half Container?', 'porto' ),
				'param_name'  => 'is_half',
				'hint'        => '<img src="' . PORTO_HINT_URL . 'column-is_half.gif"/>',
				'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'       => $section_group,
				'admin_label' => true,
				'qa_selector' => '>.vc_column_container',
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Is Right Aligned?', 'porto' ),
				'param_name' => 'is_half_right',
				'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'      => $section_group,
				'dependency' => array(
					'element'   => 'is_half',
					'not_empty' => true,
				),
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'textfield',
				'heading'    => __( 'Custom CSS Class for Half container', 'porto' ),
				'param_name' => 'half_css',
				'group'      => $section_group,
				'dependency' => array(
					'element'   => 'is_half',
					'not_empty' => true,
				),
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'porto_param_heading',
				'param_name' => 'desc_column_addon',
				'text'       => sprintf( esc_html__( 'Read this %1$sarticle%2$s to find out more about Porto Addons.', 'porto' ), '<a target="_blank" href="https://www.portotheme.com/wordpress/porto/documentation/porto-addons-for-wpbakery-column/">', '</a>' ),
				'group'      => $addon_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'        => 'checkbox',
				'heading'     => __( 'Enable Sticky Options?', 'porto' ),
				'param_name'  => 'is_sticky',
				'hint'        => '<img src="' . PORTO_HINT_URL . 'row-is_sticky.gif"/>',
				'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'       => $addon_group,
				'admin_label' => true,
			)
		);

		vc_add_param(
			'vc_column',
			array(
				'type'       => 'textfield',
				'heading'    => __( 'Container Selector', 'porto' ),
				'param_name' => 'sticky_container_selector',
				'value'      => '.vc_row',
				'dependency' => array(
					'element'   => 'is_sticky',
					'not_empty' => true,
				),
				'group'      => $addon_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'textfield',
				'heading'    => __( 'Min Width (unit: px)', 'porto' ),
				'param_name' => 'sticky_min_width',
				''           => __( 'Wll be disabled if window width is smaller than min width', 'porto' ),
				'value'      => 768,
				'dependency' => array(
					'element'   => 'is_sticky',
					'not_empty' => true,
				),
				'group'      => $addon_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'textfield',
				'heading'    => __( 'Top (unit: px)', 'porto' ),
				'param_name' => 'sticky_top',
				''           => __( 'Top position when active', 'porto' ),
				'value'      => 110,
				'dependency' => array(
					'element'   => 'is_sticky',
					'not_empty' => true,
				),
				'group'      => $addon_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'textfield',
				'heading'    => __( 'Bottom (unit: px)', 'porto' ),
				'param_name' => 'sticky_bottom',
				''           => __( 'Bottom position when active', 'porto' ),
				'value'      => 0,
				'dependency' => array(
					'element'   => 'is_sticky',
					'not_empty' => true,
				),
				'group'      => $addon_group,
			)
		);
		vc_add_param(
			'vc_column',
			array(
				'type'       => 'textfield',
				'heading'    => __( 'Active Class', 'porto' ),
				'param_name' => 'sticky_active_class',
				'value'      => 'sticky-active',
				'dependency' => array(
					'element'   => 'is_sticky',
					'not_empty' => true,
				),
				'group'      => $addon_group,
			)
		);

		// add mouse hover split effect
		vc_add_params(
			'vc_column',
			array(
				array(
					'type'        => 'checkbox',
					'heading'     => __( 'Hover Split Layer', 'porto' ),
					'hint'        => '<img src="' . PORTO_HINT_URL . 'row-hover_split.gif"/>',
					'param_name'  => 'split_layer',
					'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
					'description' => sprintf( esc_html__( 'The Hover Split option of the parent row should be selected. For more information, read this %1$sarticle%2$s.', 'porto' ), '<a href="https://www.portotheme.com/wordpress/porto/documentation/how-to-use-hover-split-effect/" target="_blank">', '</a>' ),
					'group'       => $addon_group,
				),
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'content_collapse_heading',
					'text'       => __( 'Content Collapse', 'porto' ),
					'group'      => $addon_group,
				),
				array(
					'type'        => 'checkbox',
					'heading'     => __( 'Enable Content Collapse', 'porto' ),
					'hint'        => '<img src="' . PORTO_HINT_URL . 'wd_content_collapse.gif"/>',
					'param_name'  => 'content_collapse',
					'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
					'description' => sprintf( __( '%1$sNotice%2$s: You need to add "VC Button" or "Porto Advanced Button" to the end of column. Use button as %1$s"Content collapse action"%2$s on the "Porto Options" tab.', 'porto' ), '<b>', '</b>' ) ,
					'group'       => $addon_group,
				),
				array(
					'type'        => 'porto_number',
					'heading'     => __( 'Collapse Content Height (px)', 'porto' ),
					'param_name'  => 'content_collapse_height',
					'responsive'  => true,
					'dependency'  => array(
						'element'   => 'content_collapse',
						'not_empty' => true,
					),
					'selectors'   => array(
						'{{WRAPPER}}.content-collapse-wrap.wpb_wrapper' => 'max-height: {{VALUE}}px;',
					),
					'group'       => $addon_group,
				),
				array(
					'type'       => 'colorpicker',
					'heading'    => __( 'Overlay Color', 'porto' ),
					'param_name' => 'content_collapse_color',
					'dependency' => array(
						'element'   => 'content_collapse',
						'not_empty' => true,
					),
					'selectors'  => array(
						'{{WRAPPER}}.content-collapse-wrap.wpb_wrapper:not(.opened):after' => 'color: {{VALUE}};',
					),
					'group'      => $addon_group,
				),
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'dsc_animation',
					'text'       => esc_html__( 'Animation', 'porto' ),
					'group'      => __( 'Animation', 'porto' ),
					'with_group' => true,
				),
				$animation_type,
				$animation_duration,
				$animation_delay,
				$animation_reveal_clr,
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'dsc_flt_clr',
					'text'       => esc_html__( 'Rotate with Scroll', 'porto' ),
					'group'      => __( 'Animation', 'porto' ),
					'with_group' => true,
					'dependency'  => array(
						'element' => 'animation_type',
						'value'   => array( '' ),
					),
				),
				$floating_circle,
				$floatcircle_transition,
				$floatcircle_duration,
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'dsc_flt_scroll',
					'text'       => esc_html__( 'Floating with Scroll', 'porto' ),
					'group'      => __( 'Animation', 'porto' ),
					'with_group' => true,
					'dependency' => array(
						'element'  => 'floating_circle',
						'is_empty' => true,
					),
				),
				$floating_start_pos,
				$floating_speed,
				$floating_transition,
				$floating_horizontal,
				$floating_duration,
			)
		);

		vc_add_param(
			'vc_column_inner',
			array(
				'type'       => 'porto_param_heading',
				'param_name' => 'dsc_half_container',
				'text'       => esc_html__( 'Half Container', 'porto' ),
				'group'      => $addon_group,
			)
		);
		vc_add_param(
			'vc_column_inner',
			array(
				'type'        => 'checkbox',
				'heading'     => __( 'Is Half Container?', 'porto' ),
				'param_name'  => 'is_half',
				'hint'        => '<img src="' . PORTO_HINT_URL . 'column-is_half.gif"/>',
				'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'       => $addon_group,
				'admin_label' => true,
				'qa_selector' => '>.vc_column_container',
			)
		);
		vc_add_param(
			'vc_column_inner',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Is Right Aligned?', 'porto' ),
				'param_name' => 'is_half_right',
				'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'      => $addon_group,
				'dependency' => array(
					'element'   => 'is_half',
					'not_empty' => true,
				),
			)
		);
		vc_add_param(
			'vc_column_inner',
			array(
				'type'       => 'textfield',
				'heading'    => __( 'Custom CSS Class for Half container', 'porto' ),
				'param_name' => 'half_css',
				'group'      => $addon_group,
				'dependency' => array(
					'element'   => 'is_half',
					'not_empty' => true,
				),
			)
		);

		vc_add_param(
			'vc_column_inner',
			array(
				'type'        => 'checkbox',
				'heading'     => __( 'Enable Sticky Options?', 'porto' ),
				'param_name'  => 'is_sticky',
				'hint'        => '<img src="' . PORTO_HINT_URL . 'row-is_sticky.gif"/>',
				'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'       => $addon_group,
				'admin_label' => true,
				'qa_selector' => '.vc_column_container',
			)
		);
		vc_add_param(
			'vc_column_inner',
			array(
				'type'       => 'textfield',
				'heading'    => __( 'Container Selector', 'porto' ),
				'param_name' => 'sticky_container_selector',
				'value'      => '.vc_row',
				'dependency' => array(
					'element'   => 'is_sticky',
					'not_empty' => true,
				),
				'group'      => $addon_group,
			)
		);
		vc_add_param(
			'vc_column_inner',
			array(
				'type'       => 'textfield',
				'heading'    => __( 'Min Width (unit: px)', 'porto' ),
				'param_name' => 'sticky_min_width',
				''           => __( 'Wll be disabled if window width is smaller than min width', 'porto' ),
				'value'      => 768,
				'dependency' => array(
					'element'   => 'is_sticky',
					'not_empty' => true,
				),
				'group'      => $addon_group,
			)
		);
		vc_add_param(
			'vc_column_inner',
			array(
				'type'       => 'textfield',
				'heading'    => __( 'Top (unit: px)', 'porto' ),
				'param_name' => 'sticky_top',
				''           => __( 'Top position when active', 'porto' ),
				'value'      => 110,
				'dependency' => array(
					'element'   => 'is_sticky',
					'not_empty' => true,
				),
				'group'      => $addon_group,
			)
		);
		vc_add_param(
			'vc_column_inner',
			array(
				'type'       => 'textfield',
				'heading'    => __( 'Bottom (unit: px)', 'porto' ),
				'param_name' => 'sticky_bottom',
				''           => __( 'Bottom position when active', 'porto' ),
				'value'      => 0,
				'dependency' => array(
					'element'   => 'is_sticky',
					'not_empty' => true,
				),
				'group'      => $addon_group,
			)
		);
		vc_add_params(
			'vc_column_inner',
			array(
				array(
					'type'       => 'textfield',
					'heading'    => __( 'Active Class', 'porto' ),
					'param_name' => 'sticky_active_class',
					'value'      => 'sticky-active',
					'dependency' => array(
						'element'   => 'is_sticky',
						'not_empty' => true,
					),
					'group'      => $addon_group,
				),
				$animation_type,
				$animation_duration,
				$animation_delay,
        		$animation_reveal_clr,
			)
		);

		/* ---------------------------- */
		/* Customize Custom Heading
		/* ---------------------------- */
		if ( version_compare( $porto_cur_version, '6.3.0', '>=' ) ) {
			vc_remove_param( 'vc_custom_heading', 'source' );
			$param               = WPBMap::getParam( 'vc_custom_heading', 'text' );
			$param['dependency'] = array(
				'element'  => 'enable_field_dynamic',
				'is_empty' => true,
			);
			$param['weight']     = 2;
			vc_update_shortcode_param( 'vc_custom_heading', $param );
			porto_dynamic_vc_param( 'vc_custom_heading', 'field', 3 );
			porto_dynamic_vc_param( 'vc_custom_heading', 'link', 1 );
			$param               = WPBMap::getParam( 'vc_custom_heading', 'link' );
			$param['dependency'] = array(
				'element'  => 'enable_link_dynamic',
				'is_empty' => true,
			);
			vc_update_shortcode_param( 'vc_custom_heading', $param );
		}
		vc_add_params(
			'vc_custom_heading',
			array(
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'dsc_skin',
					'text'       => esc_html__( 'Skin', 'porto' ),
					'group'      => $section_group,
					'with_group' => true,
				),
				array(
					'type'       => 'dropdown',
					'heading'    => __( 'Font Family', 'porto' ),
					'param_name' => 'font_family',
					'value'      => $fonts,
					'std'        => '',
					'selectors'  => array(
						'{{WRAPPER}}' => 'font-family: {{VALUE}};',
					),
					'dependency' => array(
						'element' => 'use_theme_fonts',
						'value' => 'yes',
					),
					'group'      => $section_group,
				),
				array(
					'type'       => 'dropdown',
					'heading'    => __( 'Text Transform', 'porto' ),
					'param_name' => 'text_transform',
					'std'        => '',
					'value'      => array(
						__( 'None', 'porto' )       => '',
						__( 'Uppercase', 'porto' )  => 'text-uppercase',
						__( 'Lowercase', 'porto' )  => 'text-lowercase',
						__( 'Capitalize', 'porto' ) => 'text-capitalize',
					),
					'group'      => $section_group,
				),
				array(
					'type'       => 'dropdown',
					'heading'    => __( 'Font Weight', 'porto' ),
					'param_name' => 'font_weight',
					'std'        => '',
					'value'      => array(
						__( 'Default', 'porto' ) => '',
						'100'                    => '100',
						'200'                    => '200',
						'300'                    => '300',
						'400'                    => '400',
						'500'                    => '500',
						'600'                    => '600',
						'700'                    => '700',
						'800'                    => '800',
						'900'                    => '900',
					),
					'group'      => $section_group,
				),
				array(
					'type'       => 'dropdown',
					'heading'    => __( 'Skin Color', 'porto' ),
					'param_name' => 'skin',
					'std'        => 'custom',
					'value'      => porto_vc_commons( 'colors' ),
					'group'      => $section_group,
				),
				array(
					'type'       => 'textfield',
					'heading'    => __( 'Letter Spacing', 'porto' ),
					'param_name' => 'letter_spacing',
					'std'        => '',
					'group'      => $section_group,
				),	
				array(
					'type'       => 'colorpicker',
					'heading'    => __( 'Hover Color', 'porto' ),
					'param_name' => 'hover_color',
					'std'        => '',
					'selectors'  => array(
						'{{WRAPPER}}:hover' => 'color: {{VALUE}} !important; cursor: pointer;'
					),
					'group'      => $section_group,
				),	
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'dsc_typewriter',
					'text'       => esc_html__( 'Heading Effect', 'porto' ),
					'group'      => $section_group,
					'with_group' => true,
				),
				array(
					'type'        => 'checkbox',
					'heading'     => __( 'Enable Marquee Effect', 'porto' ),
					'param_name'  => 'enable_marquee',
					'hint'        => '<img src="' . PORTO_HINT_URL . 'wd_marquee.gif"/>',
					'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
					'group'       => $section_group,
					'dependency'  => array(
						'element'  => 'enable_typewriter',
						'is_empty' => true,
					),
				),
				array(
					'type'       => 'checkbox',
					'heading'    => __( 'Overflow Hidden?', 'porto' ),
					'param_name' => 'ov_hidden',
					'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
					'group'      => $section_group,
					'selectors'  => array(
						'{{WRAPPER}}.marquee' => 'overflow: hidden;'
					),
					'dependency'    => array(
						'element'   => 'enable_marquee',
						'not_empty' => true,
					),
				),				
				array(
					'type'       => 'textfield',
					'heading'    => __( 'Marquee Duration(ms)', 'porto' ),
					'param_name' => 'marquee_duration',
					'value'      => '',
					'group'      => $section_group,
					'dependency' => array(
						'element'   => 'enable_marquee',
						'not_empty' => true,
					),
				),					
				array(
					'type'        => 'checkbox',
					'heading'     => __( 'Enable Typewriter Effect', 'porto' ),
					'param_name'  => 'enable_typewriter',
					'hint'        => '<img src="' . PORTO_HINT_URL . 'vc_cu_hd_typewriter.gif"/>',
					'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
					'group'       => $section_group,
					'qa_selector' => '.vc_custom_heading',
				),
				array(
					'type'        => 'checkbox',
					'heading'     => __( 'Effect By Words', 'porto' ),
					'description' => __( 'Animate the words one by one.', 'porto' ),
					'param_name'  => 'enable_typeword',
					'hint'        => '<img src="' . PORTO_HINT_URL . 'vc_cu_hd_typeword.gif"/>',
					'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
					'dependency'  => array(
						'element'   => 'enable_typewriter',
						'not_empty' => true,
					),
					'group'       => $section_group,
				),
				array(
					'type'       => 'textfield',
					'heading'    => __( 'Animation Name e.g: typeWriter, fadeIn and so on.', 'porto' ),
					'param_name' => 'typewriter_animation',
					'hint'        => '<img src="' . PORTO_HINT_URL . 'enable_typewriter_fadeup.gif"/>',
					'value'      => 'fadeIn',
					'dependency' => array(
						'element'   => 'enable_typewriter',
						'not_empty' => true,
					),
					'group'      => $section_group,
				),
				array(
					'type'       => 'textfield',
					'heading'    => __( 'Start Delay(ms)', 'porto' ),
					'param_name' => 'typewriter_delay',
					'value'      => '',
					'dependency' => array(
						'element'   => 'enable_typewriter',
						'not_empty' => true,
					),
					'group'      => $section_group,
				),
				array(
					'type'       => 'textfield',
					'heading'    => __( 'Animation Speed(ms)', 'porto' ),
					'param_name' => 'typewriter_speed',
					'std'        => '50',
					'dependency' => array(
						'element'   => 'enable_typewriter',
						'not_empty' => true,
					),
					'group'      => $section_group,
				),
				array(
					'type'       => 'textfield',
					'heading'    => __( 'Please input min width that can work. (px)', 'porto' ),
					'param_name' => 'typewriter_width',
					'value'      => '',
					'dependency' => array(
						'element'   => 'enable_typewriter',
						'not_empty' => true,
					),
					'group'      => $section_group,
				),
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'dsc_bd',
					'text'       => esc_html__( 'Border', 'porto' ),
					'group'      => $section_group,
					'with_group' => true,
				),
				array(
					'type'       => 'checkbox',
					'heading'    => __( 'Show Border', 'porto' ),
					'param_name' => 'show_border',
					'hint'        => '<img src="' . PORTO_HINT_URL . 'vc_cu_hd_show_border.jpg"/>',
					'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
					'group'      => $section_group,
				),
				array(
					'type'       => 'dropdown',
					'heading'    => __( 'Border Skin Color', 'porto' ),
					'param_name' => 'border_skin',
					'std'        => 'custom',
					'value'      => porto_vc_commons( 'colors' ),
					'dependency' => array(
						'element'   => 'show_border',
						'not_empty' => true,
					),
					'group'      => $section_group,
				),
				array(
					'type'       => 'colorpicker',
					'heading'    => __( 'Border Color', 'porto' ),
					'param_name' => 'border_color',
					'dependency' => array(
						'element' => 'border_skin',
						'value'   => array( 'custom' ),
					),
					'group'      => $section_group,
				),
				array(
					'type'       => 'dropdown',
					'heading'    => __( 'Border Type', 'porto' ),
					'param_name' => 'border_type',
					'value'      => porto_vc_commons( 'heading_border_type' ),
					'dependency' => array(
						'element'   => 'show_border',
						'not_empty' => true,
					),
					'group'      => $section_group,
				),
				array(
					'type'       => 'dropdown',
					'heading'    => __( 'Border Size', 'porto' ),
					'param_name' => 'border_size',
					'value'      => array_merge(
						porto_vc_commons( 'heading_border_size' ),
						array(
							esc_html__( 'Custom', 'porto' ) => 'custom',
						)
					),
					'dependency' => array(
						'element'   => 'show_border',
						'not_empty' => true,
					),
					'group'      => $section_group,
				),
				array(
					'type'       => 'number',
					'heading'    => __( 'Border Size (px)', 'porto' ),
					'param_name' => 'border_size_px',
					'min'        => 1,
					'max'        => 30,
					'step'       => 1,
					'selectors'  => array(
						'{{WRAPPER}} .heading-tag:before' => 'border-top-width: {{VALUE}}px;',
						'{{WRAPPER}} .heading-tag:after'  => 'border-top-width: {{VALUE}}px;',
						'{{WRAPPER}}.heading-bottom-border .heading-tag, {{WRAPPER}}.heading-bottom-double-border .heading-tag' => 'border-bottom-width: {{VALUE}}px;',
					),
					'dependency' => array(
						'element' => 'border_size',
						'value'   => array( 'custom' ),
					),
					'group'      => $section_group,
				),
				array(
					'type'       => 'porto_number',
					'heading'    => __( 'Spacing Between Text & Border', 'porto' ),
					'param_name' => 'border_spacing',
					'units'      => array( 'px', 'em', 'rem' ),
					'selectors'  => array(
						'{{WRAPPER}} .heading-tag:before' => 'margin-' . $right . ': {{VALUE}}{{UNIT}};',
						'{{WRAPPER}} .heading-tag:after'  => 'margin-' . $left . ': {{VALUE}}{{UNIT}};',
						'{{WRAPPER}}.heading-bottom-border .heading-tag, {{WRAPPER}}.heading-bottom-double-border .heading-tag' => 'padding-bottom: {{VALUE}}{{UNIT}};',
					),
					'dependency' => array(
						'element'   => 'show_border',
						'not_empty' => true,
					),
					'group'      => $section_group,
				),
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'dsc_animation',
					'text'       => esc_html__( 'Animation', 'porto' ),
					'group'      => __( 'Animation', 'porto' ),
					'with_group' => true,
				),
				$animation_type,
				$animation_duration,
				$animation_delay,
          		$animation_reveal_clr,
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'dsc_flt_img',
					'text'       => esc_html__( 'Image Floating with Mouse Tracking', 'porto' ),
					'group'      => __( 'Animation', 'porto' ),
					'with_group' => true,
				),
				array(
					'type'       => 'attach_image',
					'heading'    => __( 'Floating Image', 'porto' ),
					'param_name' => 'floating_img',
					'hint'        => '<img src="' . PORTO_HINT_URL . 'hd_floating_img.gif"/>',
					'group'      => __( 'Animation', 'porto' ),
				),
				array(
					'type'        => 'number',
					'heading'     => __( 'Floating Offset', 'porto' ),
					'param_name'  => 'floating_offset',
					'description' => __( 'Control the offset from the cursor.', 'porto' ),
					'dependency'  => array(
						'element'   => 'floating_img',
						'not_empty' => true,
					),
					'group'       => __( 'Animation', 'porto' ),
				),
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'dsc_flt_clr',
					'text'       => esc_html__( 'Rotate with Scroll', 'porto' ),
					'group'      => __( 'Animation', 'porto' ),
					'with_group' => true,
					'dependency'  => array(
						'element' => 'animation_type',
						'value'   => array( '' ),
					),
				),
				$floating_circle,
				$floatcircle_transition,
				$floatcircle_duration,
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'dsc_flt_scroll',
					'text'       => esc_html__( 'Floating with Scroll', 'porto' ),
					'group'      => __( 'Animation', 'porto' ),
					'with_group' => true,
					'dependency' => array(
						'element'  => 'floating_circle',
						'is_empty' => true,
					),
				),
				$floating_start_pos,
				$floating_speed,
				$floating_transition,
				$floating_horizontal,
				$floating_duration,
			)
		);
		vc_remove_param( 'vc_custom_heading', 'css_animation' );

		/* ---------------------------- */
		/* Customize Tabs, Tab
		/* ---------------------------- */
		vc_remove_param( 'vc_tabs', 'interval' );
		vc_add_param(
			'vc_tabs',
			array(
				'type'        => 'dropdown',
				'heading'     => __( 'Position', 'porto' ),
				'param_name'  => 'position',
				'value'       => porto_vc_commons( 'tabs' ),
				'description' => __( 'Select the position of the tab header.', 'porto' ),
				'group'       => $section_group,
				'admin_label' => true,
			)
		);
		vc_add_param(
			'vc_tabs',
			array(
				'type'        => 'dropdown',
				'heading'     => __( 'Skin Color', 'porto' ),
				'param_name'  => 'skin',
				'std'         => 'custom',
				'value'       => porto_vc_commons( 'colors' ),
				'group'       => $section_group,
				'admin_label' => true,
			)
		);
		vc_add_param(
			'vc_tabs',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Color', 'porto' ),
				'param_name' => 'color',
				'dependency' => array(
					'element' => 'skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_tabs',
			array(
				'type'        => 'dropdown',
				'heading'     => __( 'Type', 'porto' ),
				'param_name'  => 'type',
				'value'       => porto_vc_commons( 'tabs_type' ),
				'group'       => $section_group,
				'admin_label' => true,
			)
		);
		vc_add_param(
			'vc_tabs',
			array(
				'type'        => 'dropdown',
				'heading'     => __( 'Icon Style', 'porto' ),
				'param_name'  => 'icon_style',
				'value'       => porto_vc_commons( 'tabs_icon_style' ),
				'admin_label' => true,
				'dependency'  => array(
					'element' => 'type',
					'value'   => array( 'tabs-simple' ),
				),
				'group'       => $section_group,
			)
		);
		vc_add_param(
			'vc_tabs',
			array(
				'type'        => 'dropdown',
				'heading'     => __( 'Icon Effect', 'porto' ),
				'param_name'  => 'icon_effect',
				'value'       => porto_vc_commons( 'tabs_icon_effect' ),
				'group'       => $section_group,
				'admin_label' => true,
				'dependency'  => array(
					'element' => 'type',
					'value'   => array( 'tabs-simple' ),
				),
			)
		);
		vc_add_param(
			'vc_tab',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Show Icon', 'porto' ),
				'param_name' => 'show_icon',
				'hint'       => '<img src="' . PORTO_HINT_URL . 'wd_tab-show_icon.gif"/>',
				'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_tab',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Icon library', 'js_composer' ),
				'value'      => array(
					__( 'Font Awesome', 'porto' )      => 'fontawesome',
					__( 'Simple Line Icon', 'porto' )  => 'simpleline',
					__( 'Custom Image Icon', 'porto' ) => 'image',
				),
				'param_name' => 'icon_type',
				'dependency' => array(
					'element'   => 'show_icon',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_tab',
			array(
				'type'       => 'attach_image',
				'heading'    => __( 'Select Icon', 'porto' ),
				'dependency' => array(
					'element' => 'icon_type',
					'value'   => 'image',
				),
				'param_name' => 'icon_image',
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_tab',
			array(
				'type'       => 'iconpicker',
				'heading'    => __( 'Select Icon', 'porto' ),
				'param_name' => 'icon',
				'dependency' => array(
					'element' => 'icon_type',
					'value'   => 'fontawesome',
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_tab',
			array(
				'type'       => 'iconpicker',
				'heading'    => __( 'Select Icon', 'porto' ),
				'param_name' => 'icon_simpleline',
				'value'      => '',
				'settings'   => array(
					'type'         => 'simpleline',
					'iconsPerPage' => 4000,
				),
				'dependency' => array(
					'element' => 'icon_type',
					'value'   => 'simpleline',
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_tab',
			array(
				'type'       => 'label',
				'heading'    => __( 'Please configure the following options when Tabs Type is Simple.', 'porto' ),
				'param_name' => 'label',
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_tab',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Icon Skin Color', 'porto' ),
				'param_name' => 'icon_skin',
				'std'        => 'custom',
				'value'      => porto_vc_commons( 'colors' ),
				'dependency' => array(
					'element'   => 'show_icon',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_tab',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Icon Color', 'porto' ),
				'param_name' => 'icon_color',
				'dependency' => array(
					'element' => 'icon_skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_tab',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Icon Background Color', 'porto' ),
				'param_name' => 'icon_bg_color',
				'dependency' => array(
					'element' => 'icon_skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_tab',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Icon Border Color', 'porto' ),
				'param_name' => 'icon_border_color',
				'dependency' => array(
					'element' => 'icon_skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_tab',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Icon Wrap Border Color', 'porto' ),
				'param_name' => 'icon_wrap_border_color',
				'dependency' => array(
					'element' => 'icon_skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_tab',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Icon Box Shadow Color', 'porto' ),
				'param_name' => 'icon_shadow_color',
				'dependency' => array(
					'element' => 'icon_skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_tab',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Icon Hover Color', 'porto' ),
				'param_name' => 'icon_hcolor',
				'dependency' => array(
					'element' => 'icon_skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_tab',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Icon Hover Background Color', 'porto' ),
				'param_name' => 'icon_hbg_color',
				'dependency' => array(
					'element' => 'icon_skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_tab',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Icon Hover Border Color', 'porto' ),
				'param_name' => 'icon_hborder_color',
				'dependency' => array(
					'element' => 'icon_skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_tab',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Icon Wrap Hover Border Color', 'porto' ),
				'param_name' => 'icon_wrap_hborder_color',
				'dependency' => array(
					'element' => 'icon_skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_tab',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Icon Hover Box Shadow Color', 'porto' ),
				'param_name' => 'icon_hshadow_color',
				'dependency' => array(
					'element' => 'icon_skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);

		/* ---------------------------- */
		/* Customize Tour
		/* ---------------------------- */
		vc_remove_param( 'vc_tour', 'interval' );
		vc_add_param(
			'vc_tour',
			array(
				'type'        => 'dropdown',
				'heading'     => __( 'Position', 'porto' ),
				'param_name'  => 'position',
				'value'       => porto_vc_commons( 'tour' ),
				'description' => __( 'Select the position of the tab header.', 'porto' ),
				'group'       => $section_group,
				'admin_label' => true,
			)
		);
		vc_add_param(
			'vc_tour',
			array(
				'type'        => 'dropdown',
				'heading'     => __( 'Skin Color', 'porto' ),
				'param_name'  => 'skin',
				'std'         => 'custom',
				'value'       => porto_vc_commons( 'colors' ),
				'group'       => $section_group,
				'admin_label' => true,
			)
		);
		vc_add_param(
			'vc_tour',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Color', 'porto' ),
				'param_name' => 'color',
				'group'      => $section_group,
				'dependency' => array(
					'element' => 'skin',
					'value'   => array( 'custom' ),
				),
			)
		);
		vc_add_param(
			'vc_tour',
			array(
				'type'        => 'dropdown',
				'heading'     => __( 'Type', 'porto' ),
				'param_name'  => 'type',
				'value'       => porto_vc_commons( 'tour_type' ),
				'group'       => $section_group,
				'admin_label' => true,
			)
		);

		/* ---------------------------- */
		/* Customize Separator
		/* ---------------------------- */
		vc_remove_param( 'vc_separator', 'style' );
		vc_add_param(
			'vc_separator',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Type', 'porto' ),
				'param_name' => 'type',
				'value'      => porto_vc_commons( 'separator_type' ),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_separator',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Style', 'porto' ),
				'param_name' => 'style',
				'value'      => porto_vc_commons( 'separator_style' ),
				'dependency' => array(
					'element' => 'type',
					'value'   => array( '' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_separator',
			array(
				'type'       => 'attach_image',
				'heading'    => __( 'Pattern', 'porto' ),
				'param_name' => 'pattern',
				'dependency' => array(
					'element' => 'style',
					'value'   => array( 'pattern' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_separator',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Pattern Repeat', 'porto' ),
				'param_name' => 'pattern_repeat',
				'value'      => porto_vc_commons( 'separator_repeat' ),
				'dependency' => array(
					'element' => 'style',
					'value'   => array( 'pattern' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_separator',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Pattern Position', 'porto' ),
				'param_name' => 'pattern_position',
				'value'      => porto_vc_commons( 'separator_position' ),
				'dependency' => array(
					'element' => 'style',
					'value'   => array( 'pattern' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_separator',
			array(
				'type'       => 'textfield',
				'heading'    => __( 'Pattern Height (unit: px)', 'porto' ),
				'param_name' => 'pattern_height',
				'dependency' => array(
					'element' => 'style',
					'value'   => array( 'pattern' ),
				),
				'value'      => '15',
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_separator',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Show Icon', 'porto' ),
				'param_name' => 'show_icon',
				'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_separator',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Icon library', 'js_composer' ),
				'value'      => array(
					__( 'Font Awesome', 'porto' )      => 'fontawesome',
					__( 'Simple Line Icon', 'porto' )  => 'simpleline',
					__( 'Custom Image Icon', 'porto' ) => 'image',
				),
				'param_name' => 'icon_type',
				'dependency' => array(
					'element'   => 'show_icon',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_separator',
			array(
				'type'       => 'attach_image',
				'heading'    => __( 'Select Icon', 'porto' ),
				'dependency' => array(
					'element' => 'icon_type',
					'value'   => 'image',
				),
				'param_name' => 'icon_image',
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_separator',
			array(
				'type'       => 'iconpicker',
				'heading'    => __( 'Select Icon', 'porto' ),
				'param_name' => 'icon',
				'dependency' => array(
					'element' => 'icon_type',
					'value'   => 'fontawesome',
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_separator',
			array(
				'type'       => 'iconpicker',
				'heading'    => __( 'Select Icon', 'porto' ),
				'param_name' => 'icon_simpleline',
				'value'      => '',
				'settings'   => array(
					'type'         => 'simpleline',
					'iconsPerPage' => 4000,
				),
				'dependency' => array(
					'element' => 'icon_type',
					'value'   => 'simpleline',
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_separator',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Icon Skin Color', 'porto' ),
				'param_name' => 'icon_skin',
				'std'        => 'custom',
				'value'      => porto_vc_commons( 'colors' ),
				'dependency' => array(
					'element'   => 'show_icon',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_separator',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Icon Color', 'porto' ),
				'param_name' => 'icon_color',
				'dependency' => array(
					'element' => 'icon_skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_separator',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Icon Background Color', 'porto' ),
				'param_name' => 'icon_bg_color',
				'dependency' => array(
					'element' => 'icon_skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_separator',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Icon Border Color', 'porto' ),
				'param_name' => 'icon_border_color',
				'dependency' => array(
					'element' => 'icon_skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_separator',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Icon Wrap Border Color', 'porto' ),
				'param_name' => 'icon_wrap_border_color',
				'dependency' => array(
					'element' => 'icon_skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_separator',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Icon Style', 'porto' ),
				'param_name' => 'icon_style',
				'value'      => porto_vc_commons( 'separator_icon_style' ),
				'dependency' => array(
					'element'   => 'show_icon',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_separator',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Icon Position', 'porto' ),
				'param_name' => 'icon_pos',
				'value'      => porto_vc_commons( 'separator_icon_pos' ),
				'dependency' => array(
					'element'   => 'show_icon',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_separator',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Icon Size', 'porto' ),
				'param_name' => 'icon_size',
				'value'      => porto_vc_commons( 'separator_icon_size' ),
				'dependency' => array(
					'element'   => 'show_icon',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_separator',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Gap Size', 'porto' ),
				'param_name' => 'gap',
				'value'      => porto_vc_commons( 'separator' ),
				'group'      => $section_group,
			)
		);

		/* ---------------------------- */
		/* Customize Text Separator
		/* ---------------------------- */
		vc_remove_param( 'vc_text_separator', 'style' );
		vc_add_param(
			'vc_text_separator',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Style', 'porto' ),
				'param_name' => 'style',
				'value'      => porto_vc_commons( 'separator_style' ),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_text_separator',
			array(
				'type'       => 'attach_image',
				'heading'    => __( 'Pattern', 'porto' ),
				'param_name' => 'pattern',
				'dependency' => array(
					'element' => 'style',
					'value'   => array( 'pattern' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_text_separator',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Element Tag', 'porto' ),
				'param_name' => 'element',
				'std'        => 'h4',
				'value'      => porto_vc_commons( 'separator_elements' ),
				'group'      => $section_group,
			)
		);

		/* ---------------------------- */
		/* Customize Accordion, Accordion Tab
		/* ---------------------------- */
		vc_remove_param( 'vc_accordion', 'disable_keyboard' );
		vc_add_param(
			'vc_accordion',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Open only a section?', 'porto' ),
				'param_name' => 'use_accordion',
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_accordion',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Type', 'porto' ),
				'param_name' => 'type',
				'value'      => porto_vc_commons( 'accordion' ),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_accordion',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Size', 'porto' ),
				'param_name' => 'size',
				'value'      => porto_vc_commons( 'accordion_size' ),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_accordion',
			array(
				'type'        => 'dropdown',
				'heading'     => __( 'Skin Color', 'porto' ),
				'param_name'  => 'skin',
				'std'         => 'custom',
				'value'       => porto_vc_commons( 'colors' ),
				'admin_label' => true,
				'dependency'  => array(
					'element' => 'type',
					'value'   => array( 'custom' ),
				),
				'group'       => $section_group,
			)
		);
		vc_add_param(
			'vc_accordion',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Heading Color', 'porto' ),
				'param_name' => 'heading_color',
				'dependency' => array(
					'element' => 'skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_accordion',
			array(
				'type'       => 'colorpicker',
				'heading'    => __( 'Heading Background Color', 'porto' ),
				'param_name' => 'heading_bg_color',
				'dependency' => array(
					'element' => 'skin',
					'value'   => array( 'custom' ),
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_accordion_tab',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Show Icon', 'porto' ),
				'param_name' => 'show_icon',
				'hint'       => '<img src="' . PORTO_HINT_URL . 'wd_tab-show_icon.gif"/>',
				'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_accordion_tab',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Icon library', 'js_composer' ),
				'value'      => array(
					__( 'Font Awesome', 'porto' )      => 'fontawesome',
					__( 'Simple Line Icon', 'porto' )  => 'simpleline',
					__( 'Custom Image Icon', 'porto' ) => 'image',
				),
				'param_name' => 'icon_type',
				'dependency' => array(
					'element'   => 'show_icon',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_accordion_tab',
			array(
				'type'       => 'attach_image',
				'heading'    => __( 'Select Icon', 'porto' ),
				'dependency' => array(
					'element' => 'icon_type',
					'value'   => 'image',
				),
				'param_name' => 'icon_image',
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_accordion_tab',
			array(
				'type'       => 'iconpicker',
				'heading'    => __( 'Select Icon', 'porto' ),
				'param_name' => 'icon',
				'dependency' => array(
					'element' => 'icon_type',
					'value'   => 'fontawesome',
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_accordion_tab',
			array(
				'type'       => 'iconpicker',
				'heading'    => __( 'Select Icon', 'porto' ),
				'param_name' => 'icon_simpleline',
				'value'      => '',
				'settings'   => array(
					'type'         => 'simpleline',
					'iconsPerPage' => 4000,
				),
				'dependency' => array(
					'element' => 'icon_type',
					'value'   => 'simpleline',
				),
				'group'      => $section_group,
			)
		);

		/* ---------------------------- */
		/* Customize Toggle
		/* ---------------------------- */
		vc_remove_param( 'vc_toggle', 'style' );
		vc_remove_param( 'vc_toggle', 'color' );
		vc_remove_param( 'vc_toggle', 'size' );
		vc_add_param(
			'vc_toggle',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Show Icon', 'porto' ),
				'param_name' => 'show_icon',
				'hint'       => '<img src="' . PORTO_HINT_URL . 'wd_tab-show_icon.gif"/>',
				'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_toggle',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Icon library', 'js_composer' ),
				'value'      => array(
					__( 'Font Awesome', 'porto' )      => 'fontawesome',
					__( 'Simple Line Icon', 'porto' )  => 'simpleline',
					__( 'Custom Image Icon', 'porto' ) => 'image',
				),
				'param_name' => 'icon_type',
				'dependency' => array(
					'element'   => 'show_icon',
					'not_empty' => true,
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_toggle',
			array(
				'type'       => 'attach_image',
				'heading'    => __( 'Select Icon', 'porto' ),
				'dependency' => array(
					'element' => 'icon_type',
					'value'   => 'image',
				),
				'param_name' => 'icon_image',
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_toggle',
			array(
				'type'       => 'iconpicker',
				'heading'    => __( 'Select Icon', 'porto' ),
				'param_name' => 'icon',
				'dependency' => array(
					'element' => 'icon_type',
					'value'   => 'fontawesome',
				),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_toggle',
			array(
				'type'       => 'iconpicker',
				'heading'    => __( 'Select Icon', 'porto' ),
				'param_name' => 'icon_simpleline',
				'value'      => '',
				'settings'   => array(
					'type'         => 'simpleline',
					'iconsPerPage' => 4000,
				),
				'dependency' => array(
					'element' => 'icon_type',
					'value'   => 'simpleline',
				),
				'group'      => $section_group,
			)
		);

		/* ---------------------------- */
		/* Customize Buttons
		/* ---------------------------- */
		vc_add_param(
			'vc_button',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Disable', 'porto' ),
				'param_name' => 'disabled',
				'value'      => array( __( 'Disable button.', 'porto' ) => 'yes' ),
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_button',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Show as Label', 'porto' ),
				'param_name' => 'label',
				'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'      => $section_group,
			)
		);
		/* ---------------------------- */
		/* Customize Button
		/* ---------------------------- */
		if ( version_compare( $porto_cur_version, '6.3.0', '>=' ) ) {
			// Dynamic Field
			porto_dynamic_vc_param( 'vc_btn', 'field', 3 );
			$param               = WPBMap::getParam( 'vc_btn', 'title' );
			$param['dependency'] = array(
				'element'  => 'enable_field_dynamic',
				'is_empty' => true,
			);
			$param['weight']     = 2;
			vc_update_shortcode_param( 'vc_btn', $param );
			// Dynamic Link
			porto_dynamic_vc_param( 'vc_btn', 'link', 1 );
			$param               = WPBMap::getParam( 'vc_btn', 'link' );
			$param['dependency'] = array(
				'element'  => 'enable_link_dynamic',
				'is_empty' => true,
			);
			$param['weight'] = 1;
			vc_update_shortcode_param( 'vc_btn', $param );
		}

		vc_add_params(
			'vc_btn', 
			array(
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'dsc_btn_link',
					'text'       => esc_html__( 'Button Link', 'porto' ),
					'weight'     => 2,
					'with_group' => true
				),
				array(
					'type'        => 'autocomplete',
					'heading'     => __( 'Products', 'js_composer' ),
					'param_name'  => 'product_ids',
					'settings'    => array(
						'multiple'      => true,
						'sortable'      => true,
						'unique_values' => true,
					),
					'description' => __( 'Enter List of Products', 'js_composer' ),
					'admin_label' => true,
					'dependency'  => array(
						'element'  => 'link',
						'is_empty' => true,
					),
					'weight'      => 1
				),
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'dsc_btn_style',
					'text'       => esc_html__( 'Button Style', 'porto' ),
					'weight'     => 1,
					'with_group' => true
				),
			) 
		);

		vc_add_params(
			'vc_btn',
			array(
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'dsc_skin',
					'text'       => esc_html__( 'Skin', 'porto' ),
					'with_group' => true,
					'group'      => $section_group,
				),
				array(
					'type'       => 'dropdown',
					'heading'    => __( 'Skin Color', 'porto' ),
					'param_name' => 'skin',
					'std'        => 'custom',
					'value'      => array_merge(
						porto_vc_commons( 'colors' ),
						array(
							__( 'Default', 'porto' ) => 'default',
						)
					),
					'group'      => $section_group,
				),
				array(
					'type'       => 'dropdown',
					'heading'    => __( 'Contextual Classes', 'porto' ),
					'param_name' => 'contextual',
					'value'      => porto_vc_commons( 'contextual' ),
					'group'      => $section_group,
				),
				array(
					'type'       => 'textfield',
					'heading'    => __( 'Font Size', 'porto' ),
					'param_name' => 'btn_fs',
					'value'      => '',
					'group'      => $section_group,
				),
				array(
					'type'       => 'dropdown',
					'heading'    => __( 'Font Weight', 'porto' ),
					'param_name' => 'btn_fw',
					'std'        => '',
					'value'      => array(
						__( 'Default', 'porto' ) => '',
						'100'                    => '100',
						'200'                    => '200',
						'300'                    => '300',
						'400'                    => '400',
						'500'                    => '500',
						'600'                    => '600',
						'700'                    => '700',
						'800'                    => '800',
						'900'                    => '900',
					),
					'group'      => $section_group,
				),
				array(
					'type'       => 'textfield',
					'heading'    => __( 'Letter Spacing', 'porto' ),
					'param_name' => 'btn_ls',
					'value'      => '',
					'group'      => $section_group,
				),
				array(
					'type'       => 'textfield',
					'heading'    => __( 'Button Left / Right Padding', 'porto' ),
					'param_name' => 'btn_px',
					'group'      => $section_group,
				),
				array(
					'type'       => 'textfield',
					'heading'    => __( 'Button Top / Bottom Padding', 'porto' ),
					'param_name' => 'btn_py',
					'group'      => $section_group,
				),
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'dsc_icon',
					'text'       => esc_html__( 'Icon', 'porto' ),
					'with_group' => true,
					'group'      => $section_group,
					'dependency' => array(
						'element' => 'add_icon',
						'value'   => 'true',
					),
				),
				array(
					'type'       => 'porto_number',
					'heading'    => __( 'Icon Size', 'porto' ),
					'param_name' => 'btn_icon_size',
					'units'      => array( 'px', 'rem', 'em' ),
					'group'      => $section_group,
					'selectors'  => array(
						'{{WRAPPER}}.btn .vc_btn3-icon' => 'font-size: {{VALUE}}{{UNIT}};',
					),
					'dependency' => array(
						'element' => 'add_icon',
						'value'   => 'true',
					),
				),
				array(
					'type'       => 'porto_number',
					'heading'    => __( 'Spacing between Icon and Text', 'porto' ),
					'param_name' => 'btn_icon_spacing',
					'units'      => array( 'px', 'rem', 'em' ),
					'group'      => $section_group,
					'selectors'  => array(
						'{{WRAPPER}}.btn.vc_btn3-icon-right:not(.vc_btn3-o-empty) .vc_btn3-icon' => 'padding-' . $left . ': {{VALUE}}{{UNIT}};',
						'{{WRAPPER}}.btn.vc_btn3-icon-left:not(.vc_btn3-o-empty) .vc_btn3-icon' => 'padding-' . $right . ': {{VALUE}}{{UNIT}};',
					),
					'dependency' => array(
						'element' => 'add_icon',
						'value'   => 'true',
					),
				),
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'dsc_extra',
					'text'       => esc_html__( 'Extra', 'porto' ),
					'with_group' => true,
					'group'      => $section_group,
				),
				array(
					'type'        => 'checkbox',
					'heading'     => __( 'Show as Label', 'porto' ),
					'description' => __( 'Show button as general link.', 'porto' ),
					'param_name'  => 'label',
					'hint'        => '<img src="' . PORTO_HINT_URL . 'vc_btn-label.gif"/>',
					'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
					'group'       => $section_group,
					'dependency'  => array(
						'element'  => 'hover_text_effect',
						'is_empty' => true,
					),
				),
				array(
					'type'        => 'checkbox',
					'heading'     => __( 'Show Pointer Arrow', 'porto' ),
					'description' => __( 'Turn on to show pointer animation arrow.', 'porto' ),
					'param_name'  => 'show_arrow',
					'hint'        => '<img src="' . PORTO_HINT_URL . 'vc_btn-show_arrow.gif"/>',
					'value'       => array( __( 'Yes', 'porto' ) => 'yes' ),
					'group'       => $section_group,
					'dependency'  => array(
						'element'  => 'hover_text_effect',
						'is_empty' => true,
					),
				),
				array(
					'type'        => 'checkbox',
					'heading'     => __( 'Is Arrow Button?', 'porto' ),
					'description' => __( 'Show arrow button instead of icon.', 'porto' ),
					'param_name'  => 'btn_arrow',
					'hint'        => '<img src="' . PORTO_HINT_URL . 'vc_btn-btn_arrow.jpg"/>',
					'value'       => array( __( 'Yes', 'porto' ) => 'yes' ),
					'group'       => $section_group,
					'dependency'  => array(
						'element'            => 'add_icon',
						'value_not_equal_to' => 'true',
					),
				),
				array(
					'type'        => 'checkbox',
					'heading'     => sprintf( __( 'Use as %1$sContent collapsible action%2$s', 'porto' ), '<b>', '</b>' ),
					'hint'        => '<img src="' . PORTO_HINT_URL . 'wd_content_collapse.gif"/>',
					'param_name'  => 'use_collapse',
					'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
					'description' => sprintf( __( 'You need to switch on the %1$sCollapsible Content%2$s on the %1$sPorto Addons%2$s tab of parent Column.', 'porto' ), '<b>', '</b>' ),
					'group'       => $section_group,
				),
				array(
					'type'        => 'textfield',
					'heading'     => __( 'Extra Class', 'porto' ),
					'description' => __( 'This class is appended to the button tag, not to its wrapper.', 'porto' ),
					'param_name'  => 'el_cls',
					'value'       => '',
					'group'       => $section_group,
				),
			)
		);

		$param = WPBMap::getParam( 'vc_btn', 'size' );
		$param['value'][ __( 'Extra Large', 'porto' ) ] = 'xl';
		vc_update_shortcode_param( 'vc_btn', $param );

		$param                                      = WPBMap::getParam( 'vc_btn', 'shape' );
		$param['value'][ __( 'Default', 'porto' ) ] = 'default';
		$param['std']                               = 'default';
		vc_update_shortcode_param( 'vc_btn', $param );

		$param        = WPBMap::getParam( 'vc_btn', 'style' );
		$param['std'] = 'classic';
		vc_update_shortcode_param( 'vc_btn', $param );

		vc_remove_param( 'vc_btn', 'css_animation' );
		vc_add_params( 'vc_btn', 
			array( 
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'dsc_animation',
					'text'       => esc_html__( 'Animation', 'porto' ),
					'group'      => __( 'Animation', 'porto' ),
					'with_group' => true,
				),
				$animation_type, 
				$animation_duration, 
				$animation_delay,
          		$animation_reveal_clr,
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'dsc_flt_clr',
					'text'       => esc_html__( 'Rotate with Scroll', 'porto' ),
					'group'      => __( 'Animation', 'porto' ),
					'with_group' => true,
					'dependency'  => array(
						'element' => 'animation_type',
						'value'   => array( '' ),
					),
				),
				$floating_circle, 
				$floatcircle_transition, 
				$floatcircle_duration, 
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'dsc_flt_scroll',
					'text'       => esc_html__( 'Floating with Scroll', 'porto' ),
					'group'      => __( 'Animation', 'porto' ),
					'with_group' => true,
					'dependency' => array(
						'element'  => 'floating_circle',
						'is_empty' => true,
					),
				),
				$floating_start_pos, 
				$floating_speed, 
				$floating_transition, 
				$floating_horizontal, 
				$floating_duration 
			) 
		);

		$param = WPBMap::getParam( 'vc_btn', 'i_type' );
		$param['value'][ __( 'Porto Icon', 'porto' ) ] = 'porto';
		vc_update_shortcode_param( 'vc_btn', $param );
		vc_add_params(
			'vc_btn',
			array(
				array(
					'type'       => 'iconpicker',
					'heading'    => __( 'Icon', 'porto' ),
					'param_name' => 'i_icon_porto',
					'settings'   => array(
						'type'         => 'porto',
						'iconsPerPage' => 4000,
					),
					'dependency' => array(
						'element' => 'i_type',
						'value'   => 'porto',
					),
				),
				array(
					'type'        => 'dropdown',
					'class'       => '',
					'heading'     => __( 'Select Hover Icon Effect', 'porto' ),
					'param_name'  => 'hover_effect',
					'value'       => array(
						__( 'No Effect', 'porto' )        => '',
						__( 'Icon Zoom', 'porto' )        => 'hover-icon-zoom',
						__( 'Icon Slide Up', 'porto' )    => 'hover-icon-up',
						__( 'Icon Slide Left', 'porto' )  => 'hover-icon-left',
						__( 'Icon Slide Right', 'porto' ) => 'hover-icon-right',
						__( 'Icon Slide Right & Left', 'porto' ) => 'hover-icon-pulse-left-right',
						__( 'Icon Slide Infinite', 'porto' ) => 'hover-icon-pulse-infnite',
					),
					'dependency'  => array(
						'element' => 'add_icon',
						'value'   => 'true',
					),
					'description' => __( 'Select the type of effct you want on hover', 'porto' ),
				),
				array(
					'type'        => 'dropdown',
					'class'       => '',
					'heading'     => __( 'Select Hover Text Effect', 'porto' ),
					'param_name'  => 'hover_text_effect',
					'value'       => array(
						__( 'No Effect', 'porto' )    => '',
						__( 'Switch Left', 'porto' )  => 'hover-text-switch-left',
						__( 'Switch Up', 'porto' )    => 'hover-text-switch-up',
						__( 'Marquee Left', 'porto' ) => 'hover-text-marquee-left',
						__( 'Marquee Up', 'porto' )   => 'hover-text-marquee-up',
						__( 'Marquee Down', 'porto' ) => 'hover-text-marquee-down',
					),
					'description' => __( 'Select the type of effct you want on hover', 'porto' ),
				),
			)
		);

		$update_params = array( 'custom_onclick', 'custom_onclick_code', 'el_id', 'el_class' );
		foreach ( $update_params as $p_name ) {
			$param = WPBMap::getParam( 'vc_btn', $p_name );
			if ( ! empty( $param ) && isset( $param['param_name'] ) ) {
				vc_remove_param( 'vc_btn', $p_name );
				vc_add_param( 'vc_btn', $param );
			}
		}

		/* ---------------------------- */
		/* Add Single Image Parameters
		/* ---------------------------- */
		if ( version_compare( $porto_cur_version, '6.3.0', '>=' ) ) {
			// Dynamic Image
			//Title
			$param           = WPBMap::getParam( 'vc_single_image', 'title' );
			$param['weight'] = 3;
			vc_update_shortcode_param( 'vc_single_image', $param );
			// Image source
			$param           = WPBMap::getParam( 'vc_single_image', 'source' );
			$param['weight'] = 3;
			vc_update_shortcode_param( 'vc_single_image', $param );

			// Dynamic Switcher
			porto_dynamic_vc_param( 'vc_single_image', 'image', 2, 'source', 'media_library' );

			$param               = WPBMap::getParam( 'vc_single_image', 'image' );
			$param['dependency'] = array(
				'element'  => 'enable_image_dynamic',
				'is_empty' => true,
			);
			vc_update_shortcode_param( 'vc_single_image', $param );
		}
		vc_add_param(
			'vc_single_image',
			array(
				'type'        => 'porto_number',
				'heading'     => __( 'Width', 'porto' ),
				'param_name'  => 'img_width',
				'units'       => array( 'px', 'em', 'rem', '%' ),
				'selectors'   => array(
					'{{WRAPPER}} .wpb_wrapper img' => 'width: {{VALUE}}{{UNIT}};',
					'{{WRAPPER}} .vc_single_image-wrapper' => 'width: 100%',
				),
				'responsive'  => true,
				'group'       => __( 'Width & Height', 'porto' ),
			),
		);
		vc_add_param(
			'vc_single_image',
			array(
				'type'        => 'porto_number',
				'heading'     => __( 'Max Width', 'porto' ),
				'param_name'  => 'img_mwidth',
				'units'       => array( 'px', 'em', 'rem', '%' ),
				'selectors'   => array(
					'{{WRAPPER}} .wpb_wrapper img' => 'max-width: {{VALUE}}{{UNIT}};',
				),
				'responsive'  => true,
				'group'       => __( 'Width & Height', 'porto' ),
			),
		);
		vc_add_param(
			'vc_single_image',
			array(
				'type'        => 'porto_number',
				'heading'     => __( 'Height', 'porto' ),
				'param_name'  => 'img_height',
				'units'       => array( 'px', 'em', 'rem', '%' ),
				'selectors'   => array(
					'{{WRAPPER}} .wpb_wrapper img' => 'height: {{VALUE}}{{UNIT}};',
				),
				'responsive'  => true,
				'group'       => __( 'Width & Height', 'porto' ),
			),
		);
		vc_add_param(
			'vc_single_image',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Object Fit', 'porto' ),
				'param_name' => 'img_object',
				'value'      => array(
					__( 'Default', 'porto-functionality' ) => '',
					__( 'Fill', 'porto-functionality' )    => 'fill',
					__( 'Contain', 'porto-functionality' ) => 'contain',
					__( 'Cover', 'porto-functionality' )   => 'cover',
				),
				'selectors'  => array(
					'{{WRAPPER}} .wpb_wrapper img' => 'object-fit: {{VALUE}};',
				),
				'group'      => __( 'Width & Height', 'porto' ),
			),
		);
		vc_add_param(
			'vc_single_image',
			array(
				'type'       => 'dropdown',
				'heading'    => __( 'Object Position', 'porto' ),
				'param_name' => 'img_pos',
				'value'      => array(
					__( 'Default', 'porto' )       => '',
					__( 'Top left', 'porto' )      => 'top left',
					__( 'Top right', 'porto' )     => 'top right',
					__( 'Top center', 'porto' )    => 'top center',
					__( 'Center left', 'porto' )   => 'center left',
					__( 'Center right', 'porto' )  => 'center right',
					__( 'Center center', 'porto' ) => 'center center',
					__( 'Bottom left', 'porto' )   => 'bottom left',
					__( 'Bottom right', 'porto' )  => 'bottom right',
					__( 'Bottom center', 'porto' ) => 'bottom center',
				),
				'selectors'  => array(
					'{{WRAPPER}} .wpb_wrapper img' => 'object-position: {{VALUE}};',
				),
				'dependency' => array(
					'element' => 'img_object',
					'value'   => 'cover',
				),
				'group'      => __( 'Width & Height', 'porto' ),
			),
		);
		vc_add_param(
			'vc_single_image',
			array(
				'type'       => 'label',
				'heading'    => __( 'Please select "On click action" as "Link to Large Image" in "Design Section" before configure.', 'porto' ),
				'param_name' => 'label',
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_single_image',
			array(
				'type'        => 'checkbox',
				'heading'     => __( 'LightBox', 'porto' ),
				'param_name'  => 'lightbox',
				'hint'        => '<img src="' . PORTO_HINT_URL . 'single_image-lightbox.jpg"/>',
				'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'description' => __( 'Check it if you want to link to the lightbox with the large image.', 'porto' ),
				'group'       => $section_group,
			)
		);
		vc_add_param(
			'vc_single_image',
			array(
				'type'        => 'checkbox',
				'heading'     => __( 'Show as Image Gallery', 'porto' ),
				'param_name'  => 'image_gallery',
				'hint'        => '<img src="' . PORTO_HINT_URL . 'single_image-image_gallery.jpg"/>',
				'description' => __( 'Show all the images inside of same row.', 'porto' ),
				'value'       => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'       => $section_group,
			)
		);
		vc_add_param(
			'vc_single_image',
			array(
				'type'       => 'textfield',
				'heading'    => __( 'Container Class', 'porto' ),
				'param_name' => 'container_class',
				'dependency' => array(
					'element'   => 'image_gallery',
					'not_empty' => true,
				),
				'value'      => 'vc_row',
				'group'      => $section_group,
			)
		);
		vc_add_param(
			'vc_single_image',
			array(
				'type'       => 'checkbox',
				'heading'    => __( 'Show Zoom Icon', 'porto' ),
				'param_name' => 'zoom_icon',
				'hint'        => '<img src="' . PORTO_HINT_URL . 'single_image-zoom_icon.gif"/>',
				'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
				'group'      => $section_group,
			)
		);
		vc_add_params(
			'vc_single_image',
			array(
				array(
					'type'       => 'checkbox',
					'heading'    => __( 'Show Hover Effect', 'porto' ),
					'param_name' => 'hover_effect',
					'hint'        => '<img src="' . PORTO_HINT_URL . 'single_image-hover_effect.gif"/>',
					'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
					'group'      => $section_group,
				),
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'dsc_animation',
					'text'       => esc_html__( 'Animation', 'porto' ),
					'group'      => __( 'Animation', 'porto' ),
					'with_group' => true,
				),
				$animation_type,
				$animation_duration,
				$animation_delay,
				$animation_reveal_clr,
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'dsc_flt_clr',
					'text'       => esc_html__( 'Rotate with Scroll', 'porto' ),
					'group'      => __( 'Animation', 'porto' ),
					'with_group' => true,
					'dependency'  => array(
						'element' => 'animation_type',
						'value'   => array( '' ),
					),
				),
				$floating_circle,
				$floatcircle_transition,
				$floatcircle_duration,
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'dsc_flt_scroll',
					'text'       => esc_html__( 'Floating with Scroll', 'porto' ),
					'group'      => __( 'Animation', 'porto' ),
					'with_group' => true,
					'dependency' => array(
						'element'  => 'floating_circle',
						'is_empty' => true,
					),
				),
				$floating_start_pos,
				$floating_speed,
				$floating_transition,
				$floating_horizontal,
				$floating_duration,
			)
		);

		vc_add_params(
			'vc_single_image',
			array(
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'desc_focus_slider',
					'text'       => esc_html__( 'Focus on the Slider Item', 'porto' ),
					'group'      => $section_group,
					'with_group' => true,
					'dependency' => array(
						'element'  => 'onclick',
						'is_empty' => true,
					),
				),
				array(
					'type'       => 'checkbox',
					'heading'    => __( 'Enable/Disable', 'porto' ),
					'param_name' => 'to_slide_item',
					'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
					'group'      => $section_group,
					'dependency' => array(
						'element'  => 'onclick',
						'is_empty' => true,
					),
				),
				array(
					'type'        => 'textfield',
					'param_name'  => 'slider_selector',
					'heading'     => __( 'Slider Selector', 'porto' ),
					'description' => __( 'Input Selector of Owl Carousel or Swiper Wrap. ex: .product-slider, #product-slider', 'porto' ),
					'dependency'  => array(
						'element'   => 'to_slide_item',
						'not_empty' => true,
					),
					'group'       => $section_group,
				),
				array(
					'type'       => 'number',
					'param_name' => 'item_order',
					'heading'    => __( 'Item Order(> 0)', 'porto' ),
					'dependency' => array(
						'element'   => 'slider_selector',
						'not_empty' => true,
					),
					'group'      => $section_group,
				)
			)
		);

		vc_remove_param( 'vc_single_image', 'css_animation' );

		/* ---------------------------- */
		/* Customize Progress Bar
		/* ---------------------------- */
		vc_add_params(
			'vc_progress_bar',
			array(
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'pb_style',
					'text'       => esc_html__( 'Progress Bars', 'porto' ),
					'group'      => $section_group,
				),
				array(
					'type'       => 'colorpicker',
					'heading'    => __( 'Progress Background Color', 'porto' ),
					'param_name' => 'pb_clr',
					'selectors'  => array(
						'{{WRAPPER}}.vc_progress_bar .progress' => 'background-color: {{VALUE}};',
					),
					'group'      => $section_group,
				),
				array(
					'type'        => 'dropdown',
					'heading'     => __( 'Contextual Classes', 'porto' ),
					'param_name'  => 'contextual',
					'value'       => porto_vc_commons( 'contextual' ),
					'admin_label' => true,
					'group'       => $section_group,
				),
				array(
					'type'       => 'checkbox',
					'heading'    => __( 'Enable Animation', 'porto' ),
					'param_name' => 'animation',
					'std'        => 'yes',
					'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
					'group'      => $section_group,
				),
				array(
					'type'       => 'dropdown',
					'heading'    => __( 'Border Radius', 'porto' ),
					'param_name' => 'border_radius',
					'value'      => array_merge(
						porto_vc_commons( 'progress_border_radius' ),
						array(
							__( 'Custom', 'porto' ) => 'custom',
						)
					),
					'group'      => $section_group,
				),
				array(
					'type'       => 'porto_dimension',
					'heading'    => __( 'Bar Border Radius', 'porto' ),
					'param_name' => 'bar_br',
					'selectors'  => array(
						'{{WRAPPER}} .vc_single_bar.progress' => 'border-top-left-radius:{{TOP}}; border-top-right-radius:{{RIGHT}}; border-bottom-right-radius:{{BOTTOM}}; border-bottom-left-radius:{{LEFT}};',
						'{{WRAPPER}} .vc_single_bar.progress .progress-bar' => 'border-top-left-radius: {{TOP}};border-top-right-radius: {{RIGHT}}; border-bottom-right-radius: {{BOTTOM}}; border-bottom-left-radius: {{LEFT}};',
					),
					'dependency' => array(
						'element' => 'border_radius',
						'value'   => array( 'custom' ),
					),
					'group'      => $section_group,
				),
				array(
					'type'       => 'dropdown',
					'heading'    => __( 'Size', 'porto' ),
					'param_name' => 'size',
					'value'      => array_merge(
						porto_vc_commons( 'progress_size' ),
						array(
							__( 'Custom', 'porto' ) => 'custom',
						)
					),
					'group'      => $section_group,
				),
				array(
					'type'       => 'porto_number',
					'heading'    => __( 'Bar height', 'porto' ),
					'param_name' => 'bar_h',
					'units'      => array( 'px', 'em', 'rem' ),
					'selectors'  => array(
						'{{WRAPPER}} .vc_single_bar.progress' => 'height: {{VALUE}}{{UNIT}};',
					),
					'dependency' => array(
						'element' => 'size',
						'value'   => array( 'custom' ),
					),
					'group'      => $section_group,
				),
				array(
					'type'        => 'textfield',
					'heading'     => __( 'Start Width of Progress Bar', 'porto' ),
					'description' => 'ex: 2em or 30px, etc',
					'param_name'  => 'min_width',
					'group'       => $section_group,
				),
				array(
					'type'       => 'porto_number',
					'heading'    => __( 'Spacing Between', 'porto' ),
					'param_name' => 'spacing',
					'units'      => array( 'px', 'em', 'rem' ),
					'selectors'  => array(
						'{{WRAPPER}} .vc_single_bar.progress' => 'margin-bottom: {{VALUE}}{{UNIT}};',
					),
					'group'      => $section_group,
				),

				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'pb_title_style',
					'text'       => esc_html__( 'Title', 'porto' ),
					'group'      => $section_group,
				),
				array(
					'type'       => 'porto_typography',
					'heading'    => __( 'Title Typography', 'porto' ),
					'param_name' => 'title_tg',
					'selectors'  => array(
						'{{WRAPPER}} .progress-label',
					),
					'group'      => $section_group,
				),
				array(
					'type'       => 'colorpicker',
					'heading'    => __( 'Title Color', 'porto' ),
					'param_name' => 'title_clr',
					'selectors'  => array(
						'{{WRAPPER}} .progress-label' => 'color: {{VALUE}};',
					),
					'group'      => $section_group,
				),

				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'pb_percent_style',
					'text'       => esc_html__( 'Percent Text', 'porto' ),
					'group'      => $section_group,
					'dependency' => array(
						'element'   => 'units',
						'not_empty' => true,
					),
				),
				array(
					'type'       => 'checkbox',
					'heading'    => __( 'Show Percentage as Tooltip', 'porto' ),
					'param_name' => 'tooltip',
					'std'        => 'yes',
					'value'      => array( __( 'Yes, please', 'js_composer' ) => 'yes' ),
					'group'      => $section_group,
					'dependency' => array(
						'element'   => 'units',
						'not_empty' => true,
					),
				),
				array(
					'type'       => 'porto_button_group',
					'heading'    => __( 'Percent Alignment', 'porto' ),
					'param_name' => 'percent_align',
					'value'      => array(
						'flex-start' => array(
							'title' => esc_html__( 'Left', 'porto' ),
							'icon'  => 'fas fa-align-left',
							'label' => esc_html__( 'Left', 'porto' ),
						),
						''           => array(
							'title' => esc_html__( 'Center', 'porto' ),
							'icon'  => 'fas fa-align-center',
							'label' => esc_html__( 'Center', 'porto' ),
						),
						'flex-end'   => array(
							'title' => esc_html__( 'Right', 'porto' ),
							'icon'  => 'fas fa-align-right',
							'label' => esc_html__( 'Right', 'porto' ),
						),
					),
					'std'        => '',
					'dependency' => array(
						'element'  => 'tooltip',
						'is_empty' => true,
					),
					'selectors'  => array(
						'{{WRAPPER}} .progress-bar' => 'justify-content: {{VALUE}};',
					),
					'group'      => $section_group,
				),
				array(
					'type'       => 'porto_dimension',
					'heading'    => __( 'Percent Padding', 'porto' ),
					'param_name' => 'percent_pd',
					'selectors'  => array(
						'{{WRAPPER}} .progress-bar-tooltip, {{WRAPPER}} .vc_label_units' => 'padding-top:{{TOP}}; padding-right:{{RIGHT}}; padding-bottom:{{BOTTOM}}; padding-left:{{LEFT}};',
					),
					'group'      => $section_group,
					'dependency' => array(
						'element'   => 'units',
						'not_empty' => true,
					),
				),
				array(
					'type'       => 'porto_typography',
					'heading'    => __( 'Percent Typography', 'porto' ),
					'param_name' => 'percent_tg',
					'selectors'  => array(
						'{{WRAPPER}} .vc_label_units',
					),
					'group'      => $section_group,
					'dependency' => array(
						'element'   => 'units',
						'not_empty' => true,
					),
				),
				array(
					'type'       => 'colorpicker',
					'heading'    => __( 'Percent Color', 'porto' ),
					'param_name' => 'percent_clr',
					'selectors'  => array(
						'{{WRAPPER}} .vc_label_units' => 'color: {{VALUE}};',
					),
					'group'      => $section_group,
					'dependency' => array(
						'element'   => 'units',
						'not_empty' => true,
					),
				),
			)
		);

		// move Design Options tab to the end
		$css_param = WPBMap::getParam( 'vc_progress_bar', 'css' );
		vc_remove_param( 'vc_progress_bar', 'css' );
		vc_add_param( 'vc_progress_bar', $css_param );

		/* ---------------------------- */
		/* Customize Pie Chart
		/* ---------------------------- */
		vc_remove_param( 'vc_pie', 'color' );

		// Used in 'Button', 'Call __( 'Blue', 'js_composer' )to Action', 'Pie chart' blocks
		$colors_arr = array(
			__( 'Grey', 'js_composer' )      => 'wpb_button',
			__( 'Blue', 'js_composer' )      => 'btn-primary',
			__( 'Turquoise', 'js_composer' ) => 'btn-info',
			__( 'Green', 'js_composer' )     => 'btn-success',
			__( 'Orange', 'js_composer' )    => 'btn-warning',
			__( 'Red', 'js_composer' )       => 'btn-danger',
			__( 'Black', 'js_composer' )     => 'btn-inverse',
		);

		vc_add_params(
			'vc_pie',
			array(
				array(
					'type'        => 'dropdown',
					'heading'     => __( 'Type', 'porto' ),
					'param_name'  => 'type',
					'std'         => 'custom',
					'value'       => array(
						__( 'Porto Circular Bar', 'porto' ) => 'custom',
						__( 'VC Pie Chart', 'porto' ) => 'default',
					),
					'description' => __( 'Select pie chart type.', 'porto' ),
					'admin_label' => true,
					'group'       => $section_group,
				),
				array(
					'type'               => 'dropdown',
					'heading'            => __( 'Bar color', 'porto' ),
					'param_name'         => 'color',
					'value'              => $colors_arr, //$pie_colors,
					'description'        => __( 'Select pie chart color.', 'js_composer' ),
					'dependency'         => array(
						'element' => 'type',
						'value'   => array( 'default' ),
					),
					'param_holder_class' => 'vc_colored-dropdown',
					'group'              => $section_group,
				),
				array(
					'type'       => 'dropdown',
					'heading'    => __( 'View Type', 'porto' ),
					'param_name' => 'view',
					'dependency' => array(
						'element' => 'type',
						'value'   => array( 'custom' ),
					),
					'value'      => porto_vc_commons( 'circular_view_type' ),
					'group'      => $section_group,
				),
				array(
					'type'       => 'iconpicker',
					'heading'    => __( 'Select FontAwesome Icon', 'porto' ),
					'param_name' => 'icon',
					'value'      => 'fas fa-star',
					'dependency' => array(
						'element' => 'view',
						'value'   => array( 'only-icon' ),
					),
					'group'      => $section_group,
				),
				array(
					'type'        => 'dropdown',
					'heading'     => __( 'View Size', 'porto' ),
					'description' => __( 'Instead of this, you would better use options in style tab.', 'porto' ),
					'param_name'  => 'view_size',
					'dependency'  => array(
						'element'            => 'view',
						'value_not_equal_to' => 'only-icon',
					),
					'value'       => porto_vc_commons( 'circular_view_size' ),
					'group'       => $section_group,
				),
				array(
					'type'        => 'textfield',
					'heading'     => __( 'Bar Size', 'porto' ),
					'param_name'  => 'size',
					'std'         => 175,
					'dependency'  => array(
						'element' => 'type',
						'value'   => array( 'custom' ),
					),
					'description' => __( 'Enter the size of the chart in px.', 'porto' ),
					'group'       => $section_group,
				),
				array(
					'type'        => 'colorpicker',
					'heading'     => __( 'Track Color', 'porto' ),
					'param_name'  => 'trackcolor',
					'std'         => $dark ? '#2e353e' : '#eeeeee',
					'dependency'  => array(
						'element' => 'type',
						'value'   => array( 'custom' ),
					),
					'description' => __( 'Choose the color of the track. Please clear this if you want to use the default color.', 'porto' ),
					'group'       => $section_group,
				),
				array(
					'type'        => 'colorpicker',
					'heading'     => __( 'Bar color', 'porto' ),
					'param_name'  => 'barcolor',
					'dependency'  => array(
						'element' => 'type',
						'value'   => array( 'custom' ),
					),
					'description' => __( 'Select pie chart color. Please clear this if you want to use the default color.', 'porto' ),
					'group'       => $section_group,
				),
				array(
					'type'        => 'colorpicker',
					'heading'     => __( 'Scale color', 'porto' ),
					'param_name'  => 'scalecolor',
					'dependency'  => array(
						'element' => 'type',
						'value'   => array( 'custom' ),
					),
					'description' => __( 'Choose the color of the scale. Please clear this if you want to hide the scale.', 'porto' ),
					'group'       => $section_group,
				),
				array(
					'type'        => 'textfield',
					'heading'     => __( 'Animation Speed', 'porto' ),
					'param_name'  => 'speed',
					'std'         => 2500,
					'dependency'  => array(
						'element' => 'type',
						'value'   => array( 'custom' ),
					),
					'description' => __( 'Enter the animation speed in milliseconds.', 'porto' ),
					'group'       => $section_group,
				),
				array(
					'type'        => 'textfield',
					'heading'     => __( 'Line Width', 'porto' ),
					'param_name'  => 'line',
					'std'         => 14,
					'dependency'  => array(
						'element' => 'type',
						'value'   => array( 'custom' ),
					),
					'description' => __( 'Enter the width of the line bar in px.', 'porto' ),
					'group'       => $section_group,
				),
				array(
					'type'        => 'dropdown',
					'heading'     => __( 'Line Cap', 'porto' ),
					'param_name'  => 'linecap',
					'std'         => 'round',
					'value'       => array(
						__( 'Round', 'porto' )  => 'round',
						__( 'Square', 'porto' ) => 'square',
					),
					'dependency'  => array(
						'element' => 'type',
						'value'   => array( 'custom' ),
					),
					'description' => __( 'Choose how the ending of the bar line looks like.', 'porto' ),
					'group'       => $section_group,
				),
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'heading_title',
					'text'       => __( 'Title Style', 'porto' ),
					'dependency' => array(
						'element'            => 'view',
						'value_not_equal_to' => 'only-icon',
					),
					'group'      => __( 'Style', 'porto' ),
				),
				array(
					'type'        => 'porto_typography',
					'heading'     => __( 'Title Typography', 'porto' ),
					'description' => __( 'Controls the typography of the title.', 'porto' ),
					'param_name'  => 'title_porto_typography',
					'selectors'   => array(
						'{{WRAPPER}} strong',
					),
					'group'       => __( 'Style', 'porto' ),
					'dependency'  => array(
						'element'            => 'view',
						'value_not_equal_to' => 'only-icon',
					),
				),
				array(
					'type'       => 'colorpicker',
					'heading'    => __( 'Title Color', 'porto' ),
					'param_name' => 'title_color',
					'selectors'  => array(
						'{{WRAPPER}} strong' => 'color: {{VALUE}};',
					),
					'group'      => __( 'Style', 'porto' ),
					'dependency' => array(
						'element'            => 'view',
						'value_not_equal_to' => 'only-icon',
					),
				),
				array(
					'type'        => 'porto_number',
					'heading'     => __( 'Top Position', 'porto' ),
					'description' => __( 'Controls the top position of title.', 'porto' ),
					'param_name'  => 'title_pos',
					'units'       => array( '%', 'px' ),
					'group'       => __( 'Style', 'porto' ),
					'selectors'   => array(
						'{{WRAPPER}}.circular-bar strong' => 'top: {{VALUE}}{{UNIT}};',
					),
					'dependency'  => array(
						'element'            => 'view',
						'value_not_equal_to' => 'only-icon',
					),
				),
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'heading_value',
					'text'       => __( 'Value Style', 'porto' ),
					'dependency' => array(
						'element'  => 'view',
						'is_empty' => true,
					),
					'group'      => __( 'Style', 'porto' ),
				),
				array(
					'type'        => 'porto_typography',
					'heading'     => __( 'Value Typography', 'porto' ),
					'description' => __( 'Controls the typography of the value.', 'porto' ),
					'param_name'  => 'value_porto_typography',
					'selectors'   => array(
						'{{WRAPPER}} label',
					),
					'group'       => __( 'Style', 'porto' ),
					'dependency'  => array(
						'element'  => 'view',
						'is_empty' => true,
					),
				),
				array(
					'type'       => 'colorpicker',
					'heading'    => __( 'Value Color', 'porto' ),
					'param_name' => 'value_color',
					'selectors'  => array(
						'{{WRAPPER}} label' => 'color: {{VALUE}};',
					),
					'group'      => __( 'Style', 'porto' ),
					'dependency' => array(
						'element'  => 'view',
						'is_empty' => true,
					),
				),
				array(
					'type'        => 'porto_number',
					'heading'     => __( 'Value Position', 'porto' ),
					'description' => __( 'Controls the top position of value.', 'porto' ),
					'param_name'  => 'value_pos',
					'units'       => array( '%', 'px' ),
					'group'       => __( 'Style', 'porto' ),
					'selectors'   => array(
						'{{WRAPPER}} label' => 'top: {{VALUE}}{{UNIT}};',
					),
					'dependency'  => array(
						'element'  => 'view',
						'is_empty' => true,
					),
				),
				array(
					'type'       => 'porto_param_heading',
					'param_name' => 'heading_icon',
					'text'       => __( 'Icon Style', 'porto' ),
					'dependency' => array(
						'element' => 'view',
						'value'   => 'only-icon',
					),
					'group'      => __( 'Style', 'porto' ),
				),
				array(
					'type'        => 'porto_number',
					'heading'     => __( 'Icon Size', 'porto' ),
					'description' => __( 'Controls the size of the icon.', 'porto' ),
					'param_name'  => 'icon_size',
					'units'       => array( 'px' ),
					'group'       => __( 'Style', 'porto' ),
					'selectors'   => array(
						'{{WRAPPER}}.only-icon i' => 'font-size: {{VALUE}}{{UNIT}};',
					),
					'dependency'  => array(
						'element' => 'view',
						'value'   => 'only-icon',
					),
				),
				array(
					'type'       => 'colorpicker',
					'heading'    => __( 'Icon Color', 'porto' ),
					'param_name' => 'icon_color',
					'selectors'  => array(
						'{{WRAPPER}} i' => 'color: {{VALUE}};',
					),
					'group'      => __( 'Style', 'porto' ),
					'dependency' => array(
						'element' => 'view',
						'value'   => 'only-icon',
					),
				),
			)
		);

		// Add font and color to Text Block
		vc_add_params(
			'vc_column_text',
			array(
				array(
					'type'       => 'porto_typography',
					'heading'    => __( 'Typography', 'porto' ),
					'param_name' => 'text_typography',
					'selectors'  => array(
						'{{WRAPPER}} > .wpb_wrapper > *',
					),
					'group'      => __( 'Style', 'porto' ),
				),
				array(
					'type'       => 'colorpicker',
					'class'      => '',
					'heading'    => __( 'Font Color', 'porto' ),
					'param_name' => 'text_color',
					'value'      => '',
					'selectors'  => array(
						'{{WRAPPER}} > .wpb_wrapper > *' => 'color: {{VALUE}};',
					),
					'group'      => __( 'Style', 'porto' ),
				),
			)
		);

		// remove unwanted shortcodes
		/*vc_remove_element('vc_posts_grid');
		vc_remove_element('vc_carousel');
		vc_remove_element('vc_message');
		vc_remove_element('vc_hoverbox');

		vc_remove_element('vc_gmaps');
		vc_remove_element('vc_posts_slider');
		vc_remove_element('vc_zigzag');
		vc_remove_element('vc_round_chart');
		vc_remove_element('vc_line_chart');*/

		vc_update_shortcode_param(
			'vc_custom_heading',
			array(
				'type' => 'css_editor',
				'heading' => esc_html__( 'CSS box', 'js_composer' ),
				'param_name' => 'css',
				'group' => esc_html__( 'Design Options', 'js_composer' ),
				'value' => '',
			),
		);
		vc_update_shortcode_param(
			'vc_btn',
			array(
				'type' => 'css_editor',
				'heading' => esc_html__( 'CSS box', 'js_composer' ),
				'param_name' => 'css',
				'group' => esc_html__( 'Design Options', 'js_composer' ),
				'value' => '',
			),
		);		
	}
}
function porto_dynamic_vc_param( $widget, $dynamic_type, $weight, $dependency = '', $flag = '' ) {
	if ( ! class_exists( 'Porto_Wpb_Dynamic_Tags' ) ) {
		return;
	}
	$params = Porto_Wpb_Dynamic_Tags::get_instance()->dynamic_wpb_tags( $dynamic_type );
	foreach ( $params as $key => $value ) {
		$value['weight'] = $weight;
		if ( 0 == $key && 'image' == $dynamic_type ) {
			$value['dependency'] = array(
				'element' => $dependency,
				'value'   => array( $flag ),
			);
		}
		vc_add_param( $widget, $value );
	}
}
add_action( 'vc_after_init', 'porto_vc_enable_deprecated_shortcodes' );

function porto_vc_enable_deprecated_shortcodes() {
	if ( class_exists( 'WPBMap' ) ) {
		$category = __( 'Porto', 'porto' );
		$desc     = __( ' with porto style', 'porto' );
		WPBMap::modify( 'vc_tabs', 'deprecated', false );
		WPBMap::modify( 'vc_tabs', 'category', $category );
		WPBMap::modify( 'vc_tabs', 'name', __( 'Porto Tabs', 'porto' ) );
		WPBMap::modify( 'vc_tab', 'name', __( 'Porto Tab', 'porto' ) );
		WPBMap::modify( 'vc_tabs', 'description', __( 'Tabbed content', 'js_composer' ) . $desc );
		WPBMap::modify( 'vc_tour', 'deprecated', false );
		WPBMap::modify( 'vc_tour', 'category', $category );
		WPBMap::modify( 'vc_tour', 'name', __( 'Porto Tour', 'porto' ) );
		WPBMap::modify( 'vc_tour', 'description', __( 'Vertical tabbed content', 'js_composer' ) . $desc );
		WPBMap::modify( 'vc_accordion', 'deprecated', false );
		WPBMap::modify( 'vc_accordion', 'category', $category );
		WPBMap::modify( 'vc_accordion', 'name', __( 'Porto Accordion', 'porto' ) );
		WPBMap::modify( 'vc_accordion', 'description', __( 'Collapsible content panels', 'js_composer' ) . $desc );
		WPBMap::modify( 'vc_accordion_tab', 'name', __( 'Accordion Section', 'porto' ) );

		/*$all_shortcodes = WPBMap::getAllShortCodes();
		foreach( $all_shortcodes as $key => $s ) {
			echo '\''.$key .'\' => \'' . $s['name'] . '\',<br />';
		}*/
	}
}

add_filter( 'vc_add_element_box_buttons', 'porto_vc_remove_deprecated_css_class', 10, 1 );
function porto_vc_remove_deprecated_css_class( $output ) {
	$porto_elements = array( 'vc_tabs', 'vc_tour', 'vc_accordion' );
	foreach ( $porto_elements as $e ) {
		preg_match_all( '/<li data-element="' . $e . '"([^class]*)class="([^"]*)vc_element-deprecated([^"]*)"([^>]*)>/', $output, $matches );
		if ( isset( $matches[0] ) && ! empty( $matches[0] ) ) {
			$str    = str_replace( ' vc_element-deprecated', '', $matches[0] );
			$output = str_replace( $matches[0], $str, $output );
		}
	}
	return $output;
}

if ( is_admin() ) :
	add_action( 'vc_after_init', 'porto_update_vc_shortcodes_settings', 20 );

	if ( ! function_exists( 'porto_update_vc_shortcodes_settings' ) ) :

		/**
		 * Update WPBakery elements' icon settings
		 */
		function porto_update_vc_shortcodes_settings() {
			global $pagenow;
			if ( ( vc_user_access()->part( 'backend_editor' )->can()->get() && ( 'post-new.php' == $pagenow || 'post.php' == $pagenow ) ) || vc_is_inline() ) {
				// add_filter(
				// 	'vc_add_element_box_buttons',
				// 	function( $output ) {
				// 		return preg_replace( '/(<i class="vc_general vc_element-icon[^>]*><\/i>)/', '$1$1', $output );
				// 	},
				// 	20
				// );

				// WordPress elements
				// vc_map_update( 'vc_wp_search', 'icon', 'fab fa-wordpress' );
				// vc_map_update( 'vc_wp_meta', 'icon', 'fab fa-wordpress' );
				// vc_map_update( 'vc_wp_recentcomments', 'icon', 'fab fa-wordpress' );
				// vc_map_update( 'vc_wp_calendar', 'icon', 'fab fa-wordpress' );
				// vc_map_update( 'vc_wp_pages', 'icon', 'fab fa-wordpress' );
				// vc_map_update( 'vc_wp_tagcloud', 'icon', 'fab fa-wordpress' );
				// vc_map_update( 'vc_wp_custommenu', 'icon', 'fab fa-wordpress' );
				// vc_map_update( 'vc_wp_text', 'icon', 'fab fa-wordpress' );
				// vc_map_update( 'vc_wp_posts', 'icon', 'fab fa-wordpress' );
				// vc_map_update( 'vc_wp_categories', 'icon', 'fab fa-wordpress' );
				// vc_map_update( 'vc_wp_archives', 'icon', 'fab fa-wordpress' );
				// vc_map_update( 'vc_wp_rss', 'icon', 'fab fa-wordpress' );

				// WPBakery elements
				// vc_map_update( 'vc_row', 'icon', 'fas fa-align-justify' );
				vc_map_update( 'vc_custom_heading', 'description', __( 'Text with Google fonts including marquee, animated text, typewriter and floating image.', 'porto' ) );
				vc_map_update( 'vc_section', 'description', __( 'Group multiple rows in section with Shape Divider, Section separator.', 'porto' ) );
				// vc_map_update( 'vc_message', 'icon', 'fas fa-exclamation-triangle' );
				// vc_map_update( 'contact-form-7', 'icon', 'far fa-envelope' );
				// vc_map_update( 'vc_column_text', 'icon', 'fas fa-font' );
				// vc_map_update( 'vc_gutenberg', 'icon', 'fab fa-google' );

				// WPBakery elements updated in Porto
				vc_map_update( 'vc_tabs', 'icon', PORTO_WIDGET_URL . 'tabs.gif' );
				vc_map_update( 'vc_tabs', 'class', 'porto-wpb-widget' );

				vc_map_update( 'vc_accordion', 'icon', PORTO_WIDGET_URL . 'accordion.gif' );
				vc_map_update( 'vc_accordion', 'class', 'porto-wpb-widget' );

				vc_map_update( 'vc_tour', 'icon', PORTO_WIDGET_URL . 'tour.gif' );
				vc_map_update( 'vc_tour', 'class', 'porto-wpb-widget' );

				// vc_map_update( 'vc_btn', 'icon', 'fas fa-minus' );
				// vc_map_update( 'vc_separator', 'icon', 'fas fa-align-center' );
				// vc_map_update( 'vc_progress_bar', 'icon', 'far fa-chart-bar' );
				// vc_map_update( 'vc_pie', 'icon', 'fas fa-chart-pie' );
			}
		}
	endif;
endif;

/**
 * Update column offset template path to add xxl settings (> 1400px) to column
 *
 * @since 6.3.0
 */
add_filter( 'vc_path_filter', 'porto_vc_path_filter' );
if ( ! function_exists( 'porto_vc_path_filter' ) ) :
	function porto_vc_path_filter( $path ) {
		if ( false !== strpos( $path, 'params/column_offset/template.tpl.php' ) ) {
			$path = PORTO_DIR . '/vc_templates/params/column_offset/template.tpl.php';
		}
		return $path;
	}
endif;

function porto_shortcode_products_detail_product_ids_render( $query ) {
	if ( isset( $query['value'] ) ) {
		$product_object = wc_get_product( $query['value'] );
		if ( ! $product_object ) {
			return '';
		}
		$formatted_name = $product_object->get_formatted_name();
		$options = array(
			'label' => rawurldecode( wp_strip_all_tags( $formatted_name ) ),
			'value' => $query['value']
		);
		return $options;
	}
	return '';
}

function porto_shortcode_products_detail_product_ids_callback( $query ) {
	$options = array();
	$data_store = WC_Data_Store::load( 'product' );
	$ids = $data_store->search_products( $query, '', true, false, 10, array(), array() );
	foreach ( $ids as $id ) {
		$product_object = wc_get_product( $id );
		if ( ! $product_object ) {
			continue;
		}
		$formatted_name = $product_object->get_formatted_name();

		$options[] = array(
			'label' => rawurldecode( wp_strip_all_tags( $formatted_name ) ),
			'value' => $id,
		);
	}
	return $options;
}
add_filter( 'vc_autocomplete_vc_btn_product_ids_callback', 'porto_shortcode_products_detail_product_ids_callback', 10, 1 );
add_filter( 'vc_autocomplete_vc_btn_product_ids_render', 'porto_shortcode_products_detail_product_ids_render', 10, 1 );
Back to Directory File Manager