<?php
/**
 * Class to Build the RowLayout Block.
 *
 * @package Kadence Blocks
 */

// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class to Build the RowLayout Block.
 *
 * @category class
 */
class Kadence_Blocks_Rowlayout_Block extends Kadence_Blocks_Abstract_Block {
	/**
	 * Instance of this class
	 *
	 * @var null
	 */
	private static $instance = null;

	/**
	 * Block name within this namespace.
	 *
	 * @var string
	 */
	protected $block_name = 'rowlayout';

	/**
	 * Allowed HTML tags for front end output
	 *
	 * @var string[]
	 */
	protected $allowed_html_tags = array( 'div', 'header', 'section', 'article', 'main', 'aside', 'footer' );


	/**
	 * Instance Control
	 */
	public static function get_instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}
	/**
	 * Render for block scripts block.
	 *
	 * @param array   $attributes the blocks attributes.
	 * @param boolean $inline true or false based on when called.
	 */
	public function render_scripts( $attributes, $inline = false ) {
		// Figure out which scripts need to be enqueued.
		if ( $this->has_style ) {
			if ( ! wp_style_is( 'kadence-blocks-' . $this->block_name, 'enqueued' ) ) {
				$this->enqueue_style( 'kadence-blocks-' . $this->block_name );
				if ( $inline ) {
					$this->should_render_inline_stylesheet( 'kadence-blocks-' . $this->block_name );
				}
			}
		}
		if ( ( isset( $attributes['bgImg'] ) && ! empty( $attributes['bgImg'] ) && isset( $attributes['bgImgAttachment'] ) && 'parallax' === $attributes['bgImgAttachment'] ) || ( isset( $attributes['overlayBgImg'] ) && ! empty( $attributes['overlayBgImg'] ) && isset( $attributes['overlayBgImgAttachment'] ) && 'parallax' === $attributes['overlayBgImgAttachment'] ) ) {
			$this->enqueue_script( 'kadence-blocks-parallax-js' );
		}
		if ( isset( $attributes['backgroundSettingTab'] ) && 'slider' === $attributes['backgroundSettingTab'] ) {
			$this->enqueue_style( 'kadence-blocks-splide' );
			if ( $inline ) {
				$this->should_render_inline_stylesheet( 'kadence-blocks-splide' );
			}
			$this->enqueue_script( 'kadence-blocks-splide-init' );
		}

		$is_background_video = isset( $attributes['backgroundSettingTab'] ) && 'video' === $attributes['backgroundSettingTab'];
		$has_background_video_content = $is_background_video && isset( $attributes['backgroundVideo'] ) && isset( $attributes['backgroundVideo'][0] );
		$show_play_pause = $has_background_video_content && isset( $attributes['backgroundVideo'][0]['btns'] ) && true === $attributes['backgroundVideo'][0]['btns'];
		$show_audio_is_default = ( $has_background_video_content && ( ! isset( $attributes['backgroundVideo'][0]['btnsMute'] ) ) );
		$show_audio = $has_background_video_content && ( ( $show_audio_is_default && $show_play_pause && isset( $attributes['backgroundVideo'][0]['mute'] ) && false === $attributes['backgroundVideo'][0]['mute'] ) || ( isset( $attributes['backgroundVideo'][0]['btnsMute'] ) && $attributes['backgroundVideo'][0]['btnsMute'] ) );
		if ( $show_play_pause || $show_audio ) {
			$this->enqueue_script( 'kadence-blocks-video-bg' );
		}
	}

	/**
	 * Return a grid tempate coulmns string for custom column widths.
	 *
	 * @param object $css the css object.
	 * @param int    $columns the amount of columns.
	 * @param string $gap the gap.
	 * @param int    $column1 the first column width.
	 * @param int    $column2 the second column width.
	 * @param int    $column3 the third column width.
	 * @param int    $column4 the fourth column width.
	 * @param int    $column5 the fifth column width.
	 * @param int    $column6 the sixth column width.
	 */
	public function get_custom_layout( $css, $columns, $gap = '', $column1 = null, $column2 = null, $column3 = null, $column4 = null, $column5 = null, $column6 = null ) {
		$grid_layout_string = '';
		if ( $columns > 1 ) {
			$gap_string = ! empty( $gap ) ? $gap : 'var(--kb-default-row-gutter, var(--global-row-gutter-md, 2rem))';
			$column_widths = array( $column1, $column2, $column3, $column4, $column5, $column6 );
			$column_width_sum = 0;

			foreach ( range( 0, $columns - 1 ) as $column ) {
				$column_width = $column_widths[ $column ];
				if ( $column == $columns - 1 ) {
					//assume the last column width to make 100
					$column_width = abs( $column_width_sum - 100 );
				}
				$grid_layout_string .= 'minmax(0, calc(' . $column_width . '% - ((' . $gap_string . ' * ' . ($columns - 1) . ' )/' . $columns . ')))';
				$column_width_sum += $column_width;
			}
		}
		return $grid_layout_string;
	}

	/**
	 * Render for block scripts block.
	 *
	 * @param object $css the css object.
	 * @param int    $columns the amount of columns.
	 * @param string $layout the layout of the row.
	 * @param string $inner_selector the inner selector.
	 * @param string $gap the gap.
	 * @param int    $column1 the first column width.
	 * @param int    $column2 the second column width.
	 * @param int    $column3 the third column width.
	 * @param int    $column4 the fourth column width.
	 * @param int    $column5 the fifth column width.
	 * @param int    $column6 the sixth column width.
	 */
	public function get_template_columns( $css, $columns, $layout, $inner_selector, $gap = '', $column1 = null, $column2 = null, $column3 = null, $column4 = null, $column5 = null, $column6 = null ) {
		$grid_layout = 'minmax(0, 1fr)';
		switch ( $columns ) {
			case 1:
				switch ( $layout ) {
					case 'grid-layout':
						$grid_layout = 'repeat(12, minmax(0, 1fr))';
						break;
				}
				break;
			case 2:
				if ( ! empty( $column1 ) ) {
					$grid_layout = $this->get_custom_layout( $css, $columns, $gap, $column1, $column2, $column3, $column4, $column5, $column6 );
				} else {
					switch ( $layout ) {
						case 'left-golden':
							$grid_layout = 'minmax(0, 2fr) minmax(0, 1fr)';
							break;
						case 'right-golden':
							$grid_layout = 'minmax(0, 1fr) minmax(0, 2fr)';
							break;
						case 'row':
							$grid_layout = 'minmax(0, 1fr)';
							break;
						default:
							$grid_layout = 'repeat(2, minmax(0, 1fr))';
							break;
					}
				}
				break;
			case 3:
				if ( ! empty( $column1 ) && ! empty( $column2 ) ) {
					if ( abs( $column1 ) === 50 && abs( $column2 ) === 25 ) {
						$grid_layout = 'minmax(0, 2fr) minmax(0, 1fr) minmax(0, 1fr)';
					} else if ( abs( $column1 ) === 25 && abs( $column2 ) === 50 ) {
						$grid_layout = 'minmax(0, 1fr) minmax(0, 2fr) minmax(0, 1fr)';
					} else if ( abs( $column1 ) === 25 && abs( $column2 ) === 25 ) {
						$grid_layout = 'minmax(0, 1fr) minmax(0, 1fr) minmax(0, 2fr)';
					} else {
						$grid_layout = $this->get_custom_layout( $css, $columns, $gap, $column1, $column2, $column3, $column4, $column5, $column6 );
					}
				} else {
					switch ( $layout ) {
						case 'left-half':
							$this->reset_grid_colum_for_template_columns( $css, $inner_selector );
							$grid_layout = 'minmax(0, 2fr) minmax(0, 1fr) minmax(0, 1fr)';
							break;
						case 'right-half':
							$this->reset_grid_colum_for_template_columns( $css, $inner_selector );
							$grid_layout = 'minmax(0, 1fr) minmax(0, 1fr) minmax(0, 2fr)';
							break;
						case 'center-half':
							$this->reset_grid_colum_for_template_columns( $css, $inner_selector );
							$grid_layout = 'minmax(0, 1fr) minmax(0, 2fr) minmax(0, 1fr)';
							break;
						case 'center-wide':
							$this->reset_grid_colum_for_template_columns( $css, $inner_selector );
							$grid_layout = 'minmax(0, 1fr) minmax(0, 3fr) minmax(0, 1fr)';
							break;
						case 'center-exwide':
							$this->reset_grid_colum_for_template_columns( $css, $inner_selector );
							$grid_layout = 'minmax(0, 1fr) minmax(0, 6fr) minmax(0, 1fr)';
							break;
						case 'first-row':
							$grid_layout = 'repeat(2, minmax(0, 1fr))';
							$css->set_selector( $inner_selector . ' > *:nth-child(3n+1 of *:not(style))' );
							$css->add_property( 'grid-column', '1 / -1' );
							$css->set_selector( $inner_selector );
							break;
						case 'last-row':
							$grid_layout = 'repeat(2, minmax(0, 1fr))';
							$css->set_selector( $inner_selector . ' > *:nth-child(3n of *:not(style))' );
							$css->add_property( 'grid-column', '1 / -1' );
							$css->set_selector( $inner_selector );
							break;
						case 'two-grid':
							$this->reset_grid_colum_for_template_columns( $css, $inner_selector );
							$grid_layout = 'repeat(2, minmax(0, 1fr))';
							break;
						case 'row':
							$this->reset_grid_colum_for_template_columns( $css, $inner_selector );
							$grid_layout = 'minmax(0, 1fr)';
							break;
						default:
							$this->reset_grid_colum_for_template_columns( $css, $inner_selector );
							$grid_layout = 'repeat(3, minmax(0, 1fr))';
							break;
					}
				}
				break;
			case 4:
				if ( ! empty( $column1 ) && ! empty( $column2 ) && ! empty( $column3 ) ) {
					$grid_layout = $this->get_custom_layout( $css, $columns, $gap, $column1, $column2, $column3, $column4, $column5, $column6 );
				} else {
					switch ( $layout ) {
						case 'left-forty':
							$this->reset_grid_colum_for_template_columns( $css, $inner_selector );
							$grid_layout = 'minmax(0, 2fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr)';
							break;
						case 'right-forty':
							$this->reset_grid_colum_for_template_columns( $css, $inner_selector );
							$grid_layout = 'minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 2fr)';
							break;
						case 'two-grid':
							$this->reset_grid_colum_for_template_columns( $css, $inner_selector );
							$grid_layout = 'repeat(2, minmax(0, 1fr))';
							break;
						case 'row':
							$this->reset_grid_colum_for_template_columns( $css, $inner_selector );
							$grid_layout = 'minmax(0, 1fr)';
							break;
						default:
							$this->reset_grid_colum_for_template_columns( $css, $inner_selector );
							$grid_layout = 'repeat(4, minmax(0, 1fr))';
							break;
					}
				}
				break;
			case 5:
				if ( ! empty( $column1 ) && ! empty( $column2 ) && ! empty( $column3 ) && ! empty( $column4 ) ) {
					$grid_layout = $this->get_custom_layout( $css, $columns, $gap, $column1, $column2, $column3, $column4, $column5, $column6 );
				} else {
					switch ( $layout ) {
						case 'first-row':
							$grid_layout = 'repeat(4, minmax(0, 1fr))';
							$css->set_selector( $inner_selector . ' > *:nth-child(5n+1 of *:not(style))' );
							$css->add_property( 'grid-column', '1 / -1' );
							$css->set_selector( $inner_selector );
							break;
						case 'last-row':
							$grid_layout = 'repeat(4, minmax(0, 1fr))';
							$css->set_selector( $inner_selector . ' > *:nth-child(5n of *:not(style))' );
							$css->add_property( 'grid-column', '1 / -1' );
							$css->set_selector( $inner_selector );
							break;
						case 'two-grid':
							$this->reset_grid_colum_for_template_columns( $css, $inner_selector );
							$grid_layout = 'repeat(2, minmax(0, 1fr))';
							break;
						case 'three-grid':
							$this->reset_grid_colum_for_template_columns( $css, $inner_selector );
							$grid_layout = 'repeat(3, minmax(0, 1fr))';
							break;
						case 'row':
							$this->reset_grid_colum_for_template_columns( $css, $inner_selector );
							$grid_layout = 'minmax(0, 1fr)';
							break;
						default:
							$this->reset_grid_colum_for_template_columns( $css, $inner_selector );
							$grid_layout = 'repeat(5, minmax(0, 1fr))';
							break;
					}
				}
				break;
			case 6:
				if ( ! empty( $column1 ) && ! empty( $column2 ) && ! empty( $column3 ) && ! empty( $column4 ) && ! empty( $column5 ) ) {
					$grid_layout = $this->get_custom_layout( $css, $columns, $gap, $column1, $column2, $column3, $column4, $column5, $column6 );
				} else {
					switch ( $layout ) {
						case 'two-grid':
							$grid_layout = 'repeat(2, minmax(0, 1fr))';
							break;
						case 'three-grid':
							$grid_layout = 'repeat(3, minmax(0, 1fr))';
							break;
						case 'row':
							$grid_layout = 'minmax(0, 1fr)';
							break;
						default:
							$grid_layout = 'repeat(6, minmax(0, 1fr))';
							break;
					}
				}
				break;
		}
		return $grid_layout;
	}

	/**
	 * A reset helper for the template columns
	 */
	public function reset_grid_colum_for_template_columns( $css, $inner_selector ) {
		$css->set_selector( $inner_selector . ' > div:not(.added-for-specificity)' );
		$css->add_property( 'grid-column', 'initial' );
		$css->set_selector( $inner_selector );
	}

	/**
	 * Builds CSS for block.
	 *
	 * @param array  $attributes the blocks attributes.
	 * @param string $css the css class for blocks.
	 * @param string $unique_id the blocks attr ID.
	 * @param string $unique_style_id the blocks alternate ID for queries.
	 */
	public function build_css( $attributes, $css, $unique_id, $unique_style_id ) {
		$css->set_style_id( 'kb-' . $this->block_name . $unique_style_id );
		$updated_version = ! empty( $attributes['kbVersion'] ) && $attributes['kbVersion'] > 1 ? true : false;
		if ( ! empty( $attributes['kbVersion'] ) && $attributes['kbVersion'] > 1 ) {
			$margin_selector = '.kb-row-layout-wrap.wp-block-kadence-rowlayout.kb-row-layout-id' . $unique_id;
			$base_selector = '.kb-row-layout-id' . $unique_id;
			$inner_selector = '.kb-row-layout-id' . $unique_id . ' > .kt-row-column-wrap';
		} else {
			$margin_selector = '#kt-layout-id' . $unique_id;
			$base_selector = '#kt-layout-id' . $unique_id;
			$inner_selector = '#kt-layout-id' . $unique_id . ' > .kt-row-column-wrap';
		}
		// Margin, check for old attributes and use if present.
		$css->set_selector( $margin_selector );
		// Fix to prevent generatepress from breaking things with their css.
		if ( class_exists( 'GeneratePress_CSS' ) ) {
			$css->add_property( 'margin-bottom', '0px' );
		}
		if ( $css->is_number( $attributes['topMargin'] ) || $css->is_number( $attributes['bottomMargin'] ) || $css->is_number( $attributes['topMarginT'] ) || $css->is_number( $attributes['bottomMarginT'] ) || $css->is_number( $attributes['topMarginM'] ) || $css->is_number( $attributes['bottomMarginM'] ) ) {
			if ( $css->is_number( $attributes['topMargin'] ) ) {
				$css->add_property( 'margin-top', $attributes['topMargin'] . ( ! empty( $attributes['marginUnit'] ) ? $attributes['marginUnit'] : 'px' ) );
			}
			if ( $css->is_number( $attributes['bottomMargin'] ) ) {
				$css->add_property( 'margin-bottom', $attributes['bottomMargin'] . ( ! empty( $attributes['marginUnit'] ) ? $attributes['marginUnit'] : 'px' ) );
			}
			$css->set_media_state( 'tablet' );
			if ( $css->is_number( $attributes['topMarginT'] ) ) {
				$css->add_property( 'margin-top', $attributes['topMarginT'] . ( ! empty( $attributes['marginUnit'] ) ? $attributes['marginUnit'] : 'px' ) );
			}
			if ( $css->is_number( $attributes['bottomMarginT'] ) ) {
				$css->add_property( 'margin-bottom', $attributes['bottomMarginT'] . ( ! empty( $attributes['marginUnit'] ) ? $attributes['marginUnit'] : 'px' ) );
			}
			$css->set_media_state( 'mobile' );
			if ( $css->is_number( $attributes['topMarginM'] ) ) {
				$css->add_property( 'margin-top', $attributes['topMarginM'] . ( ! empty( $attributes['marginUnit'] ) ? $attributes['marginUnit'] : 'px' ) );
			}
			if ( $css->is_number( $attributes['bottomMarginM'] ) ) {
				$css->add_property( 'margin-bottom', $attributes['bottomMarginM'] . ( ! empty( $attributes['marginUnit'] ) ? $attributes['marginUnit'] : 'px' ) );
			}
			$css->set_media_state( 'desktop' );
		} else {
			$args = array(
				'unit_key' => 'marginUnit',
			);
			$css->render_measure_output( $attributes, 'margin', 'margin', $args );
		}
		// Vertical Alignment.
		$css->set_selector( $inner_selector );
		if ( ! $updated_version && ( ( ! empty( $attributes['topSep'] ) && 'none' !== $attributes['topSep'] ) || ( ! empty( $attributes['bottomSep'] ) && 'none' !== $attributes['bottomSep'] ) ) ) {
			$css->add_property( 'z-index', '10' );
			$css->add_property( 'position', 'relative' );
		}
		if ( ! empty( $attributes['verticalAlignment'] ) ) {
			switch ( $attributes['verticalAlignment'] ) {
				case 'middle':
					$css->add_property( 'align-content', 'center' );
					$css->set_selector( ':where(' . $inner_selector . ') > .wp-block-kadence-column' );
					$css->add_property( 'justify-content', 'center' );
					$css->set_selector( $inner_selector );
					break;
				case 'bottom':
					$css->add_property( 'align-content', 'end' );
					$css->set_selector( ':where(' . $inner_selector . ') > .wp-block-kadence-column' );
					$css->add_property( 'justify-content', 'end' );
					$css->set_selector( $inner_selector );
					break;
				case 'top':
					$css->add_property( 'align-content', 'start' );
					$css->set_selector( ':where(' . $inner_selector . ') > .wp-block-kadence-column' );
					$css->add_property( 'justify-content', 'start' );
					$css->set_selector( $inner_selector );
					break;
			}
		}
		// Gutter.
		$css->render_row_gap( $attributes, array( 'columnGutter', 'tabletGutter', 'mobileGutter' ), 'column-gap', 'customGutter', 'gutterType' );
		$css->render_row_gap( $attributes, array( 'collapseGutter', 'tabletRowGutter', 'mobileRowGutter' ), 'row-gap', 'customRowGutter', 'rowGutterType' );
		// Max Width.
		if ( isset( $attributes['inheritMaxWidth'] ) && true === $attributes['inheritMaxWidth'] ) {
			global $content_width;
			if ( isset( $content_width ) ) {
				if ( class_exists( 'Kadence\Theme' ) ) {
					$css->add_property( 'max-width', 'var( --global-content-width, ' . absint( $content_width ) . 'px )' );
					$css->add_property( 'padding-left', 'var(--global-content-edge-padding)' );
					$css->add_property( 'padding-right', 'var(--global-content-edge-padding)' );
				} else {
					$css->add_property( 'max-width', absint( $content_width ) . 'px' );
				}
			} else {
				$css->add_property( 'max-width', 'var(--wp--style--global--content-size)' );
			}
		} else {
			if ( $css->is_number( $attributes['maxWidth'] ) ) {
				$css->add_property( 'max-width', $attributes['maxWidth'] . ( ! empty( $attributes['maxWidthUnit'] ) ? $attributes['maxWidthUnit'] : 'px' ) );
				$css->add_property( 'margin-left', 'auto' );
				$css->add_property( 'margin-right', 'auto' );
			}
			if ( $css->is_number( $attributes['responsiveMaxWidth'][0] ) ) {
				$css->set_media_state( 'tablet' );
				$css->add_property( 'max-width', $attributes['responsiveMaxWidth'][0] . ( ! empty( $attributes['maxWidthUnit'] ) ? $attributes['maxWidthUnit'] : 'px' ) );
				$css->add_property( 'margin-left', 'auto' );
				$css->add_property( 'margin-right', 'auto' );
				$css->set_media_state( 'desktop' );
			}
			if ( $css->is_number( $attributes['responsiveMaxWidth'][1] ) ) {
				$css->set_media_state( 'mobile' );
				$css->add_property( 'max-width', $attributes['responsiveMaxWidth'][1] . ( ! empty( $attributes['maxWidthUnit'] ) ? $attributes['maxWidthUnit'] : 'px' ) );
				$css->add_property( 'margin-left', 'auto' );
				$css->add_property( 'margin-right', 'auto' );
				$css->set_media_state( 'desktop' );
			}
		}
		// Padding, check for old attributes and use if present.
		if ( empty( $attributes['kbVersion'] ) ) {
			// Add old defaults back in.
			$css->add_property( 'padding-top', 'var( --global-kb-row-default-top, 25px )' );
			$css->add_property( 'padding-bottom', 'var( --global-kb-row-default-bottom, 25px )' );
		}
		if ( $css->is_number( $attributes['topPadding'] ) || $css->is_number( $attributes['bottomPadding'] ) || $css->is_number( $attributes['leftPadding'] ) || $css->is_number( $attributes['rightPadding'] ) || $css->is_number( $attributes['topPaddingM'] ) || $css->is_number( $attributes['bottomPaddingM'] ) || $css->is_number( $attributes['leftPaddingM'] ) || $css->is_number( $attributes['rightPaddingM'] ) ) {
			if ( $css->is_number( $attributes['topPadding'] ) || ( ! empty( $attributes['paddingUnit'] ) && 'px' !== $attributes['paddingUnit'] ) ) {
				$css->add_property( 'padding-top', ( $css->is_number( $attributes['topPadding'] ) ? $attributes['topPadding'] : '25' ) . ( ! empty( $attributes['paddingUnit'] ) ? $attributes['paddingUnit'] : 'px' ) );
			}
			if ( $css->is_number( $attributes['bottomPadding'] ) || ( ! empty( $attributes['paddingUnit'] ) && 'px' !== $attributes['paddingUnit'] ) ) {
				$css->add_property( 'padding-bottom', ( $css->is_number( $attributes['bottomPadding'] ) ? $attributes['bottomPadding'] : '25' ) . ( ! empty( $attributes['paddingUnit'] ) ? $attributes['paddingUnit'] : 'px' ) );
			}
			if ( $css->is_number( $attributes['leftPadding'] ) ) {
				$css->add_property( 'padding-left', $attributes['leftPadding'] . ( ! empty( $attributes['paddingUnit'] ) ? $attributes['paddingUnit'] : 'px' ) );
			}
			if ( $css->is_number( $attributes['rightPadding'] ) ) {
				$css->add_property( 'padding-right', $attributes['rightPadding'] . ( ! empty( $attributes['paddingUnit'] ) ? $attributes['paddingUnit'] : 'px' ) );
			}
			$css->set_media_state( 'tablet' );
			if ( $css->is_number( $attributes['tabletPadding'][0] ) ) {
				$css->add_property( 'padding-top', $attributes['tabletPadding'][0] . ( ! empty( $attributes['paddingUnit'] ) ? $attributes['paddingUnit'] : 'px' ) );
			}
			if ( $css->is_number( $attributes['tabletPadding'][1] ) ) {
				$css->add_property( 'padding-right', $attributes['tabletPadding'][1] . ( ! empty( $attributes['paddingUnit'] ) ? $attributes['paddingUnit'] : 'px' ) );
			}
			if ( $css->is_number( $attributes['tabletPadding'][2] ) ) {
				$css->add_property( 'padding-bottom', $attributes['tabletPadding'][2] . ( ! empty( $attributes['paddingUnit'] ) ? $attributes['paddingUnit'] : 'px' ) );
			}
			if ( $css->is_number( $attributes['tabletPadding'][3] ) ) {
				$css->add_property( 'padding-left', $attributes['tabletPadding'][3] . ( ! empty( $attributes['paddingUnit'] ) ? $attributes['paddingUnit'] : 'px' ) );
			}
			$css->set_media_state( 'mobile' );
			if ( $css->is_number( $attributes['topPaddingM'] ) ) {
				$css->add_property( 'padding-top', $attributes['topPaddingM'] . ( ! empty( $attributes['paddingUnit'] ) ? $attributes['paddingUnit'] : 'px' ) );
			}
			if ( $css->is_number( $attributes['bottomPaddingM'] ) ) {
				$css->add_property( 'padding-bottom', $attributes['bottomPaddingM'] . ( ! empty( $attributes['paddingUnit'] ) ? $attributes['paddingUnit'] : 'px' ) );
			}
			if ( $css->is_number( $attributes['leftPaddingM'] ) ) {
				$css->add_property( 'padding-left', $attributes['leftPaddingM'] . ( ! empty( $attributes['paddingUnit'] ) ? $attributes['paddingUnit'] : 'px' ) );
			}
			if ( $css->is_number( $attributes['rightPaddingM'] ) ) {
				$css->add_property( 'padding-right', $attributes['rightPaddingM'] . ( ! empty( $attributes['paddingUnit'] ) ? $attributes['paddingUnit'] : 'px' ) );
			}
			$css->set_media_state( 'desktop' );
		} else {
			$args = array(
				'unit_key' => 'paddingUnit',
			);
			// If no padding is set, use the default.
			if ( ! isset( $attributes['padding'] ) ) {
				// $attributes['padding'] = [
				// 	'sm', '', 'sm', ''
				// ];
				$css->add_property( 'padding-top', 'var( --global-kb-row-default-top, var(--global-kb-spacing-sm, 1.5rem) )' );
				$css->add_property( 'padding-bottom', 'var( --global-kb-row-default-bottom, var(--global-kb-spacing-sm, 1.5rem) )' );
			}
			$css->render_measure_output( $attributes, 'padding', 'padding', $args );
		}
		// Min Height.
		if ( ! empty( $attributes['minHeight'] ) ) {
			$css->add_property( 'min-height', $attributes['minHeight'] . ( ! empty( $attributes['minHeightUnit'] ) ? $attributes['minHeightUnit'] : 'px' ) );
		}
		if ( $css->is_number( $attributes['minHeightTablet'] ) ) {
			$css->set_media_state( 'tablet' );
			$css->add_property( 'min-height', $attributes['minHeightTablet'] . ( ! empty( $attributes['minHeightUnit'] ) ? $attributes['minHeightUnit'] : 'px' ) );
			$css->set_media_state( 'desktop' );
		}
		if ( $css->is_number( $attributes['minHeightMobile'] ) ) {
			$css->set_media_state( 'mobile' );
			$css->add_property( 'min-height', $attributes['minHeightMobile'] . ( ! empty( $attributes['minHeightUnit'] ) ? $attributes['minHeightUnit'] : 'px' ) );
			$css->set_media_state( 'desktop' );
		}

		// Layout.
		$columns = ( ! empty( $attributes['columns'] ) ? $attributes['columns'] : 2 );
		$layout  = ( ! empty( $attributes['colLayout'] ) ? $attributes['colLayout'] : 'equal' );
		$column1  = ( ! empty( $attributes['firstColumnWidth'] ) ? $attributes['firstColumnWidth'] : '' );
		$column2  = ( ! empty( $attributes['secondColumnWidth'] ) ? $attributes['secondColumnWidth'] : '' );
		$column3  = ( ! empty( $attributes['thirdColumnWidth'] ) ? $attributes['thirdColumnWidth'] : '' );
		$column4  = ( ! empty( $attributes['fourthColumnWidth'] ) ? $attributes['fourthColumnWidth'] : '' );
		$column5  = ( ! empty( $attributes['fifthColumnWidth'] ) ? $attributes['fifthColumnWidth'] : '' );
		$column6  = ( ! empty( $attributes['sixthColumnWidth'] ) ? $attributes['sixthColumnWidth'] : '' );
		$column1_tablet  = ( ! empty( $attributes['firstColumnWidthTablet'] ) ? $attributes['firstColumnWidthTablet'] : '' );
		$column2_tablet  = ( ! empty( $attributes['secondColumnWidthTablet'] ) ? $attributes['secondColumnWidthTablet'] : '' );
		$column3_tablet  = ( ! empty( $attributes['thirdColumnWidthTablet'] ) ? $attributes['thirdColumnWidthTablet'] : '' );
		$column4_tablet  = ( ! empty( $attributes['fourthColumnWidthTablet'] ) ? $attributes['fourthColumnWidthTablet'] : '' );
		$column5_tablet  = ( ! empty( $attributes['fifthColumnWidthTablet'] ) ? $attributes['fifthColumnWidthTablet'] : '' );
		$column6_tablet  = ( ! empty( $attributes['sixthColumnWidthTablet'] ) ? $attributes['sixthColumnWidthTablet'] : '' );
		$column1_mobile  = ( ! empty( $attributes['firstColumnWidthMobile'] ) ? $attributes['firstColumnWidthMobile'] : '' );
		$column2_mobile  = ( ! empty( $attributes['secondColumnWidthMobile'] ) ? $attributes['secondColumnWidthMobile'] : '' );
		$column3_mobile  = ( ! empty( $attributes['thirdColumnWidthMobile'] ) ? $attributes['thirdColumnWidthMobile'] : '' );
		$column4_mobile  = ( ! empty( $attributes['fourthColumnWidthMobile'] ) ? $attributes['fourthColumnWidthMobile'] : '' );
		$column5_mobile  = ( ! empty( $attributes['fifthColumnWidthMobile'] ) ? $attributes['fifthColumnWidthMobile'] : '' );
		$column6_mobile  = ( ! empty( $attributes['sixthColumnWidthMobile'] ) ? $attributes['sixthColumnWidthMobile'] : '' );
		$collapse_layouts = array( 'row', 'two-grid', 'three-grid', 'last-row', 'first-row' );
		$has_custom_widths = $this->has_custom_widths( $columns, $column1, $column2, $column3, $column4, $column5, $column6 );
		$has_custom_widths_tablet = $this->has_custom_widths( $columns, $column1_tablet, $column2_tablet, $column3_tablet, $column4_tablet, $column5_tablet, $column6_tablet );
		$has_custom_widths_mobile = $this->has_custom_widths( $columns, $column1_mobile, $column2_mobile, $column3_mobile, $column4_mobile, $column5_mobile, $column6_mobile );

		//base desktop layout.
		$grid_layout = $this->get_template_columns( $css, $columns, $layout, $inner_selector, $css->render_row_gap_property( $attributes, array( 'columnGutter', 'tabletGutter', 'mobileGutter' ), 'desktop', 'customGutter', 'gutterType' ), $column1, $column2, $column3, $column4, $column5, $column6 );
		$css->add_property( 'grid-template-columns', $grid_layout );

		//Desktop ordering
		if ( ! empty( $attributes['collapseOrder'] ) && 'left-to-right' !== $attributes['collapseOrder'] && in_array( $layout, $collapse_layouts ) ) {
			$css->set_media_state( 'tablet' );
			foreach ( range( 1, $columns ) as $item_count ) {
				$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(' . $item_count . ' of *:not(style))' );
				$css->add_property( 'order', ( $columns - $item_count + 1 ) );
			}
			// Row Two.
			foreach ( range( 1, $columns ) as $item_count ) {
				$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(' . ( $item_count + $columns ) . ' of *:not(style))' );
				$css->add_property( 'order', ( $columns - $item_count + 11 ) );
			}
			// Row Three.
			foreach ( range( 1, $columns ) as $item_count ) {
				$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(' . ( $item_count + $columns + $columns ) . ' of *:not(style))' );
				$css->add_property( 'order', ( $columns - $item_count + 21 ) );
			}
			// Row Four.
			foreach ( range( 1, $columns ) as $item_count ) {
				$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(' . ( $item_count + $columns + $columns + $columns ) . ' of *:not(style))' );
				$css->add_property( 'order', ( $columns - $item_count + 31 ) );
			}
			$css->set_media_state( 'desktop' );
		}

		//Tablet layout
		if ( empty( $attributes['tabletLayout'] ) && ! empty( $css->render_row_gap_property( $attributes, array( 'columnGutter', 'tabletGutter', 'mobileGutter' ), 'tablet', 'customGutter', 'gutterType' ) ) ) {
			//no tablet layout, but we have a tablet guttter width, so render the inherited column layout from desktop, potentially with custom widths.
			$css->set_media_state( 'tablet' );
			$css->set_selector( $inner_selector );

			//if no custom widths, need to use desktop widths
			if ( $has_custom_widths_tablet ) {
				$grid_layout = $this->get_template_columns( $css, $columns, $layout, $inner_selector, $css->render_row_gap_property( $attributes, array( 'columnGutter', 'tabletGutter', 'mobileGutter' ), 'tablet', 'customGutter', 'gutterType' ), $column1_tablet, $column2_tablet, $column3_tablet, $column4_tablet, $column5_tablet, $column6_tablet );
			} else {
				$grid_layout = $this->get_template_columns( $css, $columns, $layout, $inner_selector, $css->render_row_gap_property( $attributes, array( 'columnGutter', 'tabletGutter', 'mobileGutter' ), 'tablet', 'customGutter', 'gutterType' ), $column1, $column2, $column3, $column4, $column5, $column6 );
			}
			$css->add_property( 'grid-template-columns', $grid_layout );
		}
		if ( ! empty( $attributes['tabletLayout'] ) || $column1_tablet ) {
			//use tablet layout. Potentially with custom widths
			$layout  = ( ! empty( $attributes['colLayout'] ) ? $attributes['colLayout'] : 'equal' );
			$tabletLayout  = ( ! empty( $attributes['tabletLayout'] ) && $attributes['tabletLayout'] !== 'inherit' ? $attributes['tabletLayout'] : $layout );
			$css->set_media_state( 'tablet' );
			$css->set_selector( $inner_selector );
			$grid_layout = $this->get_template_columns( $css, $columns, $tabletLayout, $inner_selector, $css->render_row_gap_property( $attributes, array( 'columnGutter', 'tabletGutter', 'mobileGutter' ), 'tablet', 'customGutter', 'gutterType' ), $column1_tablet, $column2_tablet, $column3_tablet, $column4_tablet, $column5_tablet, $column6_tablet );
			$css->add_property( 'grid-template-columns', $grid_layout );
			//tablet ordering
			if ( ! empty( $attributes['collapseOrder'] ) && 'left-to-right' !== $attributes['collapseOrder'] && in_array( $tabletLayout, $collapse_layouts ) ) {
				foreach ( range( 1, $columns ) as $item_count ) {
					$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(' . $item_count . ' of *:not(style))' );
					$css->add_property( 'order', ( $columns - $item_count + 1 ) );
				}
				// Row Two.
				foreach ( range( 1, $columns ) as $item_count ) {
					$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(' . ( $item_count + $columns ) . ' of *:not(style))' );
					$css->add_property( 'order', ( $columns - $item_count + 11 ) );
				}
				// Row Three.
				foreach ( range( 1, $columns ) as $item_count ) {
					$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(' . ( $item_count + $columns + $columns ) . ' of *:not(style))' );
					$css->add_property( 'order', ( $columns - $item_count + 21 ) );
				}
				// Row Four.
				foreach ( range( 1, $columns ) as $item_count ) {
					$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(' . ( $item_count + $columns + $columns + $columns ) . ' of *:not(style))' );
					$css->add_property( 'order', ( $columns - $item_count + 31 ) );
				}
			}
			$css->set_media_state( 'desktop' );
		} elseif ( $columns > 4 ) {
			//If no tablet layout and more than 4 columns use mobile layout. (this does not match editor behavior)
			$collapse_tab_layout  = ( ! empty( $attributes['mobileLayout'] ) ? $attributes['mobileLayout'] : 'row' );
			$css->set_media_state( 'tablet' );
			$css->set_selector( $inner_selector );
			$grid_layout = $this->get_template_columns( $css, $columns, $collapse_tab_layout, $inner_selector, $css->render_row_gap_property( $attributes, array( 'columnGutter', 'tabletGutter', 'mobileGutter' ), 'tablet', 'customGutter', 'gutterType' ), $column1_mobile, $column2_mobile, $column3_mobile, $column4_mobile, $column5_mobile, $column6_mobile );
			$css->add_property( 'grid-template-columns', $grid_layout );
			//tablet collapse ordering
			if ( ! empty( $attributes['collapseOrder'] ) && 'left-to-right' !== $attributes['collapseOrder'] && in_array( $collapse_tab_layout, $collapse_layouts ) ) {
				foreach ( range( 1, $columns ) as $item_count ) {
					$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(' . $item_count . ' of *:not(style))' );
					$css->add_property( 'order', ( $columns - $item_count + 1 ) );
				}
				// Row Two.
				foreach ( range( 1, $columns ) as $item_count ) {
					$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(' . ( $item_count + $columns ) . ' of *:not(style))' );
					$css->add_property( 'order', ( $columns - $item_count + 11 ) );
				}
				// Row Three.
				foreach ( range( 1, $columns ) as $item_count ) {
					$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(' . ( $item_count + $columns + $columns ) . ' of *:not(style))' );
					$css->add_property( 'order', ( $columns - $item_count + 21 ) );
				}
				// Row Four.
				foreach ( range( 1, $columns ) as $item_count ) {
					$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(' . ( $item_count + $columns + $columns + $columns ) . ' of *:not(style))' );
					$css->add_property( 'order', ( $columns - $item_count + 31 ) );
				}
			}
			$css->set_media_state( 'desktop' );
		}

		//mobile layout
		$mobile_layout  = ( ! empty( $attributes['mobileLayout'] ) ? $attributes['mobileLayout'] : 'row' );
		$css->set_media_state( 'mobile' );
		$css->set_selector( $inner_selector );
		$grid_layout = $this->get_template_columns( $css, $columns, $mobile_layout, $inner_selector, $css->render_row_gap_property( $attributes, array( 'columnGutter', 'tabletGutter', 'mobileGutter' ), 'mobile', 'customGutter', 'gutterType' ), $column1_mobile, $column2_mobile, $column3_mobile, $column4_mobile, $column5_mobile, $column6_mobile );
		$css->add_property( 'grid-template-columns', $grid_layout );
		//mobile ordering
		if ( ! empty( $attributes['collapseOrder'] ) && 'left-to-right' !== $attributes['collapseOrder'] && in_array( $mobile_layout, $collapse_layouts ) ) {
			foreach ( range( 1, $columns ) as $item_count ) {
				$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(' . $item_count . ' of *:not(style))' );
				$css->add_property( 'order', ( $columns - $item_count + 1 ) );
			}
			// Row Two.
			foreach ( range( 1, $columns ) as $item_count ) {
				$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(' . ( $item_count + $columns ) . ' of *:not(style))' );
				$css->add_property( 'order', ( $columns - $item_count + 11 ) );
			}
			// Row Three.
			foreach ( range( 1, $columns ) as $item_count ) {
				$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(' . ( $item_count + $columns + $columns ) . ' of *:not(style))' );
				$css->add_property( 'order', ( $columns - $item_count + 21 ) );
			}
			// Row Four.
			foreach ( range( 1, $columns ) as $item_count ) {
				$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(' . ( $item_count + $columns + $columns + $columns ) . ' of *:not(style))' );
				$css->add_property( 'order', ( $columns - $item_count + 31 ) );
			}
		}

		$css->set_media_state( 'desktop' );
		if ( isset( $attributes['inheritMaxWidth'] ) && true === $attributes['inheritMaxWidth'] && ! empty( $attributes['align'] ) && 'full' === $attributes['align'] && 2 === $columns && 'row' !== $layout && ( ( isset( $attributes['breakoutLeft'] ) && true === $attributes['breakoutLeft'] ) || ( isset( $attributes['breakoutRight'] ) && true === $attributes['breakoutRight'] ) ) ) {
			global $content_width;
			if ( isset( $content_width ) ) {
				if ( class_exists( 'Kadence\Theme' ) ) {
					$inherit_content_width = 'var( --global-content-width, ' . absint( $content_width ) . 'px )';
				} else {
					$inherit_content_width = absint( $content_width ) . 'px';
				}
			} else {
				$inherit_content_width = 'var(--wp--style--global--content-size)';
			}
			$padding_left = '0px';
			$padding_right = '0px';
			if ( class_exists( 'Kadence\Theme' ) ) {
				$padding_left = 'var(--global-content-edge-padding)';
				$padding_right = 'var(--global-content-edge-padding)';
			}
			if ( isset( $attributes['padding'][1] ) && $css->is_number( $attributes['padding'][1] ) ) {
				$padding_right = $attributes['padding'][1] . ( ! empty( $attributes['paddingUnit'] ) ? $attributes['paddingUnit'] : 'px' );
			} else if ( isset( $attributes['padding'][1] ) && $css->is_variable_value( $attributes['padding'][1] ) ) {
				$padding_right = $css->get_variable_value( $attributes['padding'][1] );
			}
			if ( isset( $attributes['padding'][3] ) && $css->is_number( $attributes['padding'][3] ) ) {
				$padding_left = $attributes['padding'][3] . ( ! empty( $attributes['paddingUnit'] ) ? $attributes['paddingUnit'] : 'px' );
			} else if ( isset( $attributes['padding'][3] ) && $css->is_variable_value( $attributes['padding'][3] ) ) {
				$padding_left = $css->get_variable_value( $attributes['padding'][3] );
			}
			$css->set_selector( $base_selector );
			$css->add_property( '--breakout-negative-margin-right', 'calc( ( ( ( var(--global-vw, 100vw) - ( ' . $inherit_content_width . ' - ( ' . $padding_right . '*2 ) ) ) / 2 ) *-1) + -1px)' );
			$css->add_property( '--breakout-negative-margin-left', 'calc( ( ( ( var(--global-vw, 100vw) - ( ' . $inherit_content_width . ' - ( ' . $padding_left . '*2 ) ) ) / 2 ) *-1) + -1px)' );
			if ( apply_filters( 'kadence_blocks_css_output_media_queries', true ) ) {
				$css->set_media_state( 'desktopOnly' );
			}
			if ( ( isset( $attributes['breakoutLeft'] ) && true === $attributes['breakoutLeft'] ) ) {
				$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(1 of *:not(style))' );
				$css->add_property( 'margin-inline-start', 'calc( ' . $padding_left . ' *-1 )' );
			}
			if ( ( isset( $attributes['breakoutRight'] ) && true === $attributes['breakoutRight'] ) ) {
				$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(2 of *:not(style))' );
				$css->add_property( 'margin-inline-end', 'calc( ' . $padding_right . ' *-1 )' );
			}
			$css->set_media_state( 'desktop' );
			if ( apply_filters( 'kadence_blocks_css_output_media_queries', true ) ) {
				if ( isset( $content_width ) && ! empty( $content_width ) ) {
					$css->start_media_query( '(min-width:' . absint( $content_width ) . 'px)' );
					if ( ( isset( $attributes['breakoutLeft'] ) && true === $attributes['breakoutLeft'] ) ) {
						$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(1 of *:not(style)):not(.specificity)' );
						$css->add_property( 'margin-inline-start', 'var(--breakout-negative-margin-left)' );
					}
					if ( ( isset( $attributes['breakoutRight'] ) && true === $attributes['breakoutRight'] ) ) {
						$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(2 of *:not(style)):not(.specificity)' );
						$css->add_property( 'margin-inline-end', 'var(--breakout-negative-margin-right)' );
					}
					$css->stop_media_query();
				} else {
					$css->set_media_state( 'desktopOnly' );
					if ( ( isset( $attributes['breakoutLeft'] ) && true === $attributes['breakoutLeft'] ) ) {
						$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(1 of *:not(style))' );
						$css->add_property( 'margin-inline-start', 'var(--breakout-negative-margin-left)' );
					}
					if ( ( isset( $attributes['breakoutRight'] ) && true === $attributes['breakoutRight'] ) ) {
						$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(2 of *:not(style))' );
						$css->add_property( 'margin-inline-end', 'var(--breakout-negative-margin-right)' );
					}
					$css->set_media_state( 'desktop' );
				}
			} else {
				if ( ( isset( $attributes['breakoutLeft'] ) && true === $attributes['breakoutLeft'] ) ) {
					$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(1 of *:not(style)):not(.specificity)' );
					$css->add_property( 'margin-inline-start', 'var(--breakout-negative-margin-left, calc( ' . $padding_left . ' *-1 ) )' );
				}
				if ( ( isset( $attributes['breakoutRight'] ) && true === $attributes['breakoutRight'] ) ) {
					$css->set_selector( $inner_selector . ' > .wp-block-kadence-column:nth-child(2 of *:not(style)):not(.specificity)' );
					$css->add_property( 'margin-inline-end', 'var(--breakout-negative-margin-right, calc( ' . $padding_right . ' *-1 ))' );
				}
			}
			$css->set_media_state( 'tabletOnly' );
			if ( ( isset( $attributes['breakoutLeft'] ) && true === $attributes['breakoutLeft'] ) ) {
				$css->set_selector( $inner_selector . ':not(.kt-tab-layout-row) > .wp-block-kadence-column:nth-child(1 of *:not(style))' );
				$css->add_property( 'margin-inline-start', 'calc( ' . $padding_left . ' *-1 )' );
			}
			if ( ( isset( $attributes['breakoutRight'] ) && true === $attributes['breakoutRight'] ) ) {
				$css->set_selector( $inner_selector . ':not(.kt-tab-layout-row) > .wp-block-kadence-column:nth-child(2 of *:not(style))' );
				$css->add_property( 'margin-inline-end', 'calc( ' . $padding_right . ' *-1 )' );
			}
			$css->set_media_state( 'desktop' );
		}

		// Border radius.
		$css->set_selector( $base_selector );
		$css->render_measure_output( $attributes, 'borderRadius', 'border-radius', array( 'unit_key' => 'borderRadiusUnit' ) );
		$has_radius = false;
		if ( isset( $attributes['borderRadius'][0] ) && $css->is_number( $attributes['borderRadius'][0] ) && 0 !== $attributes['borderRadius'][0] ) {
			$has_radius = true;
		}
		if ( isset( $attributes['borderRadius'][1] ) && $css->is_number( $attributes['borderRadius'][1] ) && 0 !== $attributes['borderRadius'][1] ) {
			$has_radius = true;
		}
		if ( isset( $attributes['borderRadius'][2] ) && $css->is_number( $attributes['borderRadius'][2] ) && 0 !== $attributes['borderRadius'][2] ) {
			$has_radius = true;
		}
		if ( isset( $attributes['borderRadius'][3] ) && $css->is_number( $attributes['borderRadius'][3] ) && 0 !== $attributes['borderRadius'][3] ) {
			$has_radius = true;
		}
		if ( $has_radius ) {
			if ( ! isset( $attributes['borderRadiusOverflow'] ) || ( isset( $attributes['borderRadiusOverflow'] ) && false !== $attributes['borderRadiusOverflow'] ) ) {
				$css->add_property( 'overflow', 'clip' );
			}
			$css->add_property( 'isolation', 'isolate' );
			$css->set_selector( $base_selector . ' > .kt-row-layout-overlay' );
			$css->render_measure_output( $attributes, 'borderRadius', 'border-radius', array( 'unit_key' => 'borderRadiusUnit' ) );
		}
		$css->set_selector( $base_selector );
		// Box shadow
		if ( isset( $attributes['displayBoxShadow'] ) && true == $attributes['displayBoxShadow'] ) {
			if ( isset( $attributes['boxShadow'] ) && is_array( $attributes['boxShadow'] ) && isset( $attributes['boxShadow'][0] ) && is_array( $attributes['boxShadow'][0] ) ) {
				$css->add_property( 'box-shadow', ( isset( $attributes['boxShadow'][0]['inset'] ) && true === $attributes['boxShadow'][0]['inset'] ? 'inset ' : '' ) . ( isset( $attributes['boxShadow'][0]['hOffset'] ) && is_numeric( $attributes['boxShadow'][0]['hOffset'] ) ? $attributes['boxShadow'][0]['hOffset'] : '0' ) . 'px ' . ( isset( $attributes['boxShadow'][0]['vOffset'] ) && is_numeric( $attributes['boxShadow'][0]['vOffset'] ) ? $attributes['boxShadow'][0]['vOffset'] : '0' ) . 'px ' . ( isset( $attributes['boxShadow'][0]['blur'] ) && is_numeric( $attributes['boxShadow'][0]['blur'] ) ? $attributes['boxShadow'][0]['blur'] : '14' ) . 'px ' . ( isset( $attributes['boxShadow'][0]['spread'] ) && is_numeric( $attributes['boxShadow'][0]['spread'] ) ? $attributes['boxShadow'][0]['spread'] : '0' ) . 'px ' . $css->render_color( ( isset( $attributes['boxShadow'][0]['color'] ) && ! empty( $attributes['boxShadow'][0]['color'] ) ? $attributes['boxShadow'][0]['color'] : '#000000' ), ( isset( $attributes['boxShadow'][0]['opacity'] ) && is_numeric( $attributes['boxShadow'][0]['opacity'] ) ? $attributes['boxShadow'][0]['opacity'] : 0.2 ) ) );
			} else {
				$css->add_property( 'box-shadow', 'rgba(0, 0, 0, 0.2) 0px 0px 14px 0px' );
			}
		}
		// Border, have to check for old styles first.
		if ( ! empty( $attributes['border'] ) || ! empty( $attributes['tabletBorder'] ) || ! empty( $attributes['mobileBorder'] ) || $css->is_number( $attributes['borderWidth'][0] ) || $css->is_number( $attributes['borderWidth'][1] ) || $css->is_number( $attributes['borderWidth'][2] ) || $css->is_number( $attributes['borderWidth'][3] ) || $css->is_number( $attributes['tabletBorderWidth'][0] ) || $css->is_number( $attributes['tabletBorderWidth'][1] ) || $css->is_number( $attributes['tabletBorderWidth'][2] ) || $css->is_number( $attributes['tabletBorderWidth'][3] ) || $css->is_number( $attributes['mobileBorderWidth'][0] ) || $css->is_number( $attributes['mobileBorderWidth'][1] ) || $css->is_number( $attributes['mobileBorderWidth'][2] ) || $css->is_number( $attributes['mobileBorderWidth'][3] ) ) {
			if ( ! empty( $attributes['border'] ) ) {
				$css->add_property( 'border-color', $css->render_color( $attributes['border'] ) );
			}
			$css->render_measure_output( $attributes, 'borderWidth', 'border-width' );
			if ( ! empty( $attributes['tabletBorder'] ) ) {
				$css->set_media_state( 'tablet' );
				$css->add_property( 'border-color', $css->render_color( $attributes['tabletBorder'] ) );
				$css->set_media_state( 'desktop' );
			}
			if ( ! empty( $attributes['mobileBorder'] ) ) {
				$css->set_media_state( 'mobile' );
				$css->add_property( 'border-color', $css->render_color( $attributes['mobileBorder'] ) );
				$css->set_media_state( 'desktop' );
			}
		} else {
			$css->render_border_styles( $attributes, 'borderStyle' );
		}
		// Background.
		$background_type = ! empty( $attributes['backgroundSettingTab'] ) ? $attributes['backgroundSettingTab'] : 'normal';
		$css->set_selector( $base_selector );
		switch ( $background_type ) {
			case 'normal':
				if ( ! empty( $attributes['bgColor'] ) ) {
					if ( class_exists( 'Kadence\Theme' ) ) {
						if ( empty( $attributes['bgColorClass'] ) ) {
							$css->render_color_output( $attributes, 'bgColor', 'background-color' );
						}
					} else if ( strpos( $attributes['bgColor'], 'palette' ) === 0 ) {
						$css->render_color_output( $attributes, 'bgColor', 'background-color' );
					} else if ( empty( $attributes['bgColorClass'] ) ) {
						$css->render_color_output( $attributes, 'bgColor', 'background-color' );
					}
				}
				if ( ! empty( $attributes['bgImg'] ) ) {
					if ( isset( $attributes['bgImgAttachment'] ) ) {
						if ( 'parallax' === $attributes['bgImgAttachment'] ) {
							$bg_attach = 'fixed';
						} else {
							$bg_attach = $attributes['bgImgAttachment'];
						}
					} else {
						$bg_attach = 'scroll';
					}
					$css->add_property( 'background-image', sprintf( "url('%s')", $attributes['bgImg'] ) );
					$css->add_property( 'background-size', ( isset( $attributes['bgImgSize'] ) ? $attributes['bgImgSize'] : 'cover' ) );
					$css->add_property( 'background-position', ( isset( $attributes['bgImgPosition'] ) ? $attributes['bgImgPosition'] : 'center center' ) );
					$css->add_property( 'background-attachment', $bg_attach );
					$css->add_property( 'background-repeat', ( isset( $attributes['bgImgRepeat'] ) ? $attributes['bgImgRepeat'] : 'no-repeat' ) );
					if ( 'fixed' === $bg_attach && ! apply_filters( 'kadence_blocks_attachment_fixed_on_mobile', false ) ) {
						$css->set_media_state( 'tabletPro' );
						$css->add_property( 'background-attachment', 'scroll' );
						$css->set_media_state( 'desktop' );
					}
				}
				break;
			case 'gradient':
				if ( ! empty( $attributes['gradient'] ) ) {
					$css->add_property( 'background-image', $css->render_gradient( $attributes['gradient'] ) );
				}
				break;
		}
		// Tablet Background.
		$tablet_background = ( isset( $attributes['tabletBackground'][0] ) && is_array( $attributes['tabletBackground'][0] ) ? $attributes['tabletBackground'][0] : array() );
		if ( isset( $tablet_background['enable'] ) && $tablet_background['enable'] ) {
			$css->set_media_state( 'tabletPro' );
			$css->set_selector( $margin_selector );
			$tablet_background_type = ! empty( $tablet_background['type'] ) ? $tablet_background['type'] : 'normal';
			switch ( $tablet_background_type ) {
				case 'normal':
					if ( ! empty( $tablet_background['bgImg'] ) ) {
						$bg_selector = 'background-color';
					} else {
						$bg_selector = 'background';
					}
					if ( ! empty( $tablet_background['bgColor'] ) ) {
						$css->render_color_output( $tablet_background, 'bgColor', $bg_selector );
					}
					if ( ! empty( $tablet_background['bgImg'] ) ) {
						if ( ! empty( $tablet_background['bgImgAttachment'] ) ) {
							if ( 'parallax' === $tablet_background['bgImgAttachment'] ) {
								$bg_attach = 'fixed';
							} else {
								$bg_attach = $tablet_background['bgImgAttachment'];
							}
						} else {
							$bg_attach = 'scroll';
						}
						$is_important = ( 'normal' === $background_type && ! empty( $attributes['bgImg'] ) && isset( $attributes['bgImgAttachment'] ) && 'parallax' === $attributes['bgImgAttachment'] && isset( $tablet_background['bgImgAttachment'] ) && 'parallax' !== $tablet_background['bgImgAttachment'] ? '!important' : '' );
						if ( isset( $attributes['backgroundInline'] ) && true === $attributes['backgroundInline'] ) {
							$is_important = '!important';
						}
						$css->add_property( 'background-image', sprintf( "url('%s')", $tablet_background['bgImg'] ) . $is_important );
						$css->add_property( 'background-size', ( ! empty( $tablet_background['bgImgSize'] ) ? $tablet_background['bgImgSize'] : 'cover' ) );
						$css->add_property( 'background-position', ( ! empty( $tablet_background['bgImgPosition'] ) ? $tablet_background['bgImgPosition'] : 'center center' ) );
						$css->add_property( 'background-attachment', $bg_attach );
						$css->add_property( 'background-repeat', ( ! empty( $tablet_background['bgImgRepeat'] ) ? $tablet_background['bgImgRepeat'] : 'no-repeat' ) );
					} else if ( isset( $tablet_background['forceOverDesk'] ) && $tablet_background['forceOverDesk'] ) {
						// Force No image for tablet.
						//$css->set_media_state( 'tabletOnly' );
						$css->set_selector( $base_selector );
						$css->add_property( 'background-image', 'none !important' );
						$css->set_selector( $base_selector  . ' [id*="jarallax-container-"]' );
						$css->add_property( 'display', 'none !important' );
						//$css->set_media_state( 'tablet' );
					}
					if ( 'normal' === $background_type && ! empty( $attributes['bgImg'] ) && ! empty( $attributes['bgImgAttachment'] ) && 'parallax' === $attributes['bgImgAttachment'] && ! empty( $tablet_background['bgImg'] ) && ! empty( $tablet_background['bgImgAttachment'] ) && 'parallax' !== $tablet_background['bgImgAttachment'] ) {
						$css->set_selector( $base_selector . ' [id*="jarallax-container-"]' );
						$css->add_property( 'display', 'none !important' );
					}
					break;
				case 'gradient':
					if ( ! empty( $tablet_background['gradient'] ) ) {
						$is_important = ( 'normal' === $background_type && ! empty( $attributes['bgImg'] ) && ! empty( $attributes['bgImgAttachment'] ) && 'parallax' === $attributes['bgImgAttachment'] ? '!important' : '' );
						if ( isset( $attributes['backgroundInline'] ) && true === $attributes['backgroundInline'] ) {
							$is_important = '!important';
						}
						$css->add_property( 'background-image', $css->render_gradient( $tablet_background['gradient'] ) . $is_important );
						if ( 'normal' === $background_type && ! empty( $attributes['bgImg'] ) && ! empty( $attributes['bgImgAttachment'] ) && 'parallax' === $attributes['bgImgAttachment'] ) {
							$css->set_selector( $base_selector . ' [id*="jarallax-container-"]' );
							$css->add_property( 'display', 'none !important' );
						}
					}
					break;
			}
			if ( 'normal' !== $background_type ) {
				$css->set_selector( $base_selector . ' .kb-blocks-bg-video-container,' . $base_selector . ' .kb-blocks-bg-slider' );
				$css->add_property( 'display', 'none' );
			}
			$css->set_media_state( 'desktop' );
		}
		// Mobile Background.
		$mobile_background = ( isset( $attributes['mobileBackground'][0] ) && is_array( $attributes['mobileBackground'][0] ) ? $attributes['mobileBackground'][0] : array() );
		if ( isset( $mobile_background['enable'] ) && $mobile_background['enable'] ) {
			$css->set_media_state( 'mobile' );
			$css->set_selector( $margin_selector );
			$mobile_background_type = ! empty( $mobile_background['type'] ) ? $mobile_background['type'] : 'normal';
			switch ( $mobile_background_type ) {
				case 'normal':
					if ( ! empty( $mobile_background['bgImg'] ) ) {
						$bg_selector = 'background-color';
					} else {
						$bg_selector = 'background';
					}
					if ( ! empty( $mobile_background['bgColor'] ) ) {
						$css->render_color_output( $mobile_background, 'bgColor', $bg_selector );
					}
					if ( ! empty( $mobile_background['bgImg'] ) ) {
						if ( ! empty( $mobile_background['bgImgAttachment'] ) ) {
							if ( 'parallax' === $mobile_background['bgImgAttachment'] ) {
								$bg_attach = 'fixed';
							} else {
								$bg_attach = $mobile_background['bgImgAttachment'];
							}
						} else {
							$bg_attach = 'scroll';
						}
						$is_important = ( isset( $attributes['bgImg'] ) && ! empty( $attributes['bgImg'] ) && isset( $attributes['bgImgAttachment'] ) && 'parallax' === $attributes['bgImgAttachment'] && isset( $mobile_background['bgImgAttachment'] ) && 'parallax' !== $mobile_background['bgImgAttachment'] ? '!important' : '' );
						if ( 'normal' === $mobile_background_type && ! empty( $tablet_background['bgImg'] ) && isset( $tablet_background['bgImgAttachment'] ) && 'parallax' === $tablet_background['bgImgAttachment'] && isset( $mobile_background['bgImgAttachment'] ) && 'parallax' !== $mobile_background['bgImgAttachment'] ) {
							$is_important = '!important';
						}
						if ( isset( $attributes['backgroundInline'] ) && true === $attributes['backgroundInline'] ) {
							$is_important = '!important';
						}
						$css->add_property( 'background-image', sprintf( "url('%s')", $mobile_background['bgImg'] ) . $is_important );
						$css->add_property( 'background-size', ( ! empty( $mobile_background['bgImgSize'] ) ? $mobile_background['bgImgSize'] : 'cover' ) );
						$css->add_property( 'background-position', ( ! empty( $mobile_background['bgImgPosition'] ) ? $mobile_background['bgImgPosition'] : 'center center' ) );
						$css->add_property( 'background-attachment', $bg_attach );
						$css->add_property( 'background-repeat', ( ! empty( $mobile_background['bgImgRepeat'] ) ? $mobile_background['bgImgRepeat'] : 'no-repeat' ) );
					} else if ( isset( $mobile_background['forceOverDesk'] ) && $mobile_background['forceOverDesk'] ) {
						$css->add_property( 'background-image', 'none !important' );
						$css->set_selector( $base_selector . ' [id*="jarallax-container-"]' );
						$css->add_property( 'display', 'none !important' );
					}
					if ( ( ( 'normal' === $background_type && ! empty( $attributes['bgImg'] ) && ! empty( $attributes['bgImgAttachment'] ) && 'parallax' === $attributes['bgImgAttachment'] ) || ( 'normal' === $mobile_background_type && ! empty( $tablet_background['bgImg'] ) && isset( $tablet_background['bgImgAttachment'] ) && 'parallax' === $tablet_background['bgImgAttachment'] ) ) && isset( $mobile_background['bgImg'] ) && ! empty( $mobile_background['bgImg'] ) && isset( $mobile_background['bgImgAttachment'] ) && 'parallax' !== $mobile_background['bgImgAttachment'] ) {
						$css->set_selector( $base_selector . ' [id*="jarallax-container-"]' );
						$css->add_property( 'display', 'none !important' );
					}
					break;
				case 'gradient':
					if ( ! empty( $mobile_background['gradient'] ) ) {
						$is_important = ( ! empty( $attributes['bgImg'] ) && ! empty( $attributes['bgImgAttachment'] ) && 'parallax' === $attributes['bgImgAttachment'] ? '!important' : '' );
						if ( 'normal' === $mobile_background_type && ! empty( $tablet_background['bgImg'] ) && isset( $tablet_background['bgImgAttachment'] ) && 'parallax' === $tablet_background['bgImgAttachment'] ) {
							$is_important = '!important';
						}
						if ( isset( $attributes['backgroundInline'] ) && true === $attributes['backgroundInline'] ) {
							$is_important = '!important';
						}
						$css->add_property( 'background-image', $css->render_gradient( $mobile_background['gradient'] ) . $is_important );
						if ( ( 'normal' === $background_type && ! empty( $attributes['bgImg'] ) && ! empty( $attributes['bgImgAttachment'] ) && 'parallax' === $attributes['bgImgAttachment'] ) || ( 'normal' === $mobile_background_type && ! empty( $tablet_background['bgImg'] ) && isset( $tablet_background['bgImgAttachment'] ) && 'parallax' === $tablet_background['bgImgAttachment'] ) ) {
							$css->set_selector( $base_selector . ' [id*="jarallax-container-"]' );
							$css->add_property( 'display', 'none !important' );
						}
					}
					break;
			}
			if ( 'normal' !== $background_type ) {
				$css->set_selector( $base_selector . ' .kb-blocks-bg-video-container,' . $base_selector . ' .kb-blocks-bg-slider' );
				$css->add_property( 'display', 'none' );
			}
			$css->set_media_state( 'desktop' );
		}
		// Overlay.
		if ( ! empty( $attributes['overlay'] ) || ! empty( $attributes['overlayBgImg'] ) || ! empty( $attributes['overlaySecond'] ) || ! empty( $attributes['overlayGradient'] ) ) {
			$css->set_selector( $base_selector . ' > .kt-row-layout-overlay' );
			$css->render_opacity_from_100( $attributes, 'overlayOpacity' );
			$overlay_type = ! empty( $attributes['currentOverlayTab'] ) ? $attributes['currentOverlayTab'] : 'normal';
			switch ( $overlay_type ) {
				case 'normal':
					if ( isset( $attributes['overlay'] ) ) {
						$css->add_property( 'background-color', $css->render_color( $attributes['overlay'], ( isset( $attributes['overlayFirstOpacity'] ) && is_numeric( $attributes['overlayFirstOpacity'] ) ? $attributes['overlayFirstOpacity'] : 1 ) ) );
					}
					if ( ! empty( $attributes['overlayBgImg'] ) ) {
						if ( isset( $attributes['overlayBgImgAttachment'] ) ) {
							if ( 'parallax' === $attributes['overlayBgImgAttachment'] ) {
								$overbg_attach = 'fixed';
							} else {
								$overbg_attach = $attributes['overlayBgImgAttachment'];
							}
						} else {
							$overbg_attach = 'scroll';
						}
						$css->add_property( 'background-image', sprintf( "url('%s')", $attributes['overlayBgImg'] ) );
						$css->add_property( 'background-size', ( isset( $attributes['overlayBgImgSize'] ) ? $attributes['overlayBgImgSize'] : 'cover' ) );
						$css->add_property( 'background-position', ( isset( $attributes['overlayBgImgPosition'] ) ? $attributes['overlayBgImgPosition'] : 'center center' ) );
						$css->add_property( 'background-attachment', $overbg_attach );
						$css->add_property( 'background-repeat', ( isset( $attributes['overlayBgImgRepeat'] ) ? $attributes['overlayBgImgRepeat'] : 'no-repeat' ) );
						if ( 'fixed' === $overbg_attach && ! apply_filters( 'kadence_blocks_attachment_fixed_on_mobile', false ) ) {
							$css->set_media_state( 'tabletPro' );
							$css->add_property( 'background-attachment', 'scroll' );
							$css->set_media_state( 'desktop' );
						}
					}
					break;
				case 'gradient':
					if ( ! empty( $attributes['overlayGradient'] ) ) {
						$css->add_property( 'background', $css->render_gradient( $attributes['overlayGradient'] ) );
					}

					break;
				case 'grad':
					// Old Gradient Support.
					$type = ( isset( $attributes['overlayGradType'] ) ? $attributes['overlayGradType'] : 'linear' );
					if ( 'radial' === $type ) {
						$angle = ( isset( $attributes['overlayBgImgPosition'] ) ? 'at ' . $attributes['overlayBgImgPosition'] : 'at center center' );
					} else {
						$angle = ( isset( $attributes['overlayGradAngle'] ) ? $attributes['overlayGradAngle'] . 'deg' : '180deg' );
					}
					$loc         = ( isset( $attributes['overlayGradLoc'] ) ? $attributes['overlayGradLoc'] : '0' );
					$color       = ( isset( $attributes['overlay'] ) ? $css->render_color( $attributes['overlay'], ( isset( $attributes['overlayFirstOpacity'] ) && is_numeric( $attributes['overlayFirstOpacity'] ) ? $attributes['overlayFirstOpacity'] : 1 ) ) : 'transparent' );
					$locsecond   = ( isset( $attributes['overlayGradLocSecond'] ) ? $attributes['overlayGradLocSecond'] : '100' );
					$colorsecond = ( isset( $attributes['overlaySecond'] ) ? $css->render_color( $attributes['overlaySecond'], ( isset( $attributes['overlaySecondOpacity'] ) && is_numeric( $attributes['overlaySecondOpacity'] ) ? $attributes['overlaySecondOpacity'] : 1 ) ) : '#00B5E2' );
					$css->add_property( 'background-image', $type . '-gradient(' . $angle . ', ' . $color . ' ' . $loc . '%, ' . $colorsecond . ' ' . $locsecond . '%)' );
					break;
			}
			if ( ! empty( $attributes['overlayBlendMode'] ) && 'none' !== $attributes['overlayBlendMode'] ) {
				$css->add_property( 'mix-blend-mode', $attributes['overlayBlendMode'] );
			}
		}
		$tablet_overlay    = ( isset( $attributes['tabletOverlay'] ) && is_array( $attributes['tabletOverlay'] ) && isset( $attributes['tabletOverlay'][0] ) && is_array( $attributes['tabletOverlay'][0] ) ? $attributes['tabletOverlay'][0] : array() );
		if ( isset( $tablet_overlay['enable'] ) && $tablet_overlay['enable'] ) {
			$css->set_media_state( 'tablet' );
			$css->set_selector( $base_selector . ' > .kt-row-layout-overlay' );
			$css->render_opacity_from_100( $tablet_overlay, 'overlayOpacity' );
			$overlay_type = ! empty( $tablet_overlay['currentOverlayTab'] ) ? $tablet_overlay['currentOverlayTab'] : 'normal';
			switch ( $overlay_type ) {
				case 'normal':
					if ( ! empty( $tablet_overlay['overlayBgImg'] ) ) {
						$bg_selector = 'background-color';
					} else {
						$bg_selector = 'background';
					}
					if ( ! empty( $tablet_overlay['overlay'] ) ) {
						$css->render_color_output( $tablet_overlay, 'overlay', $bg_selector );
					}
					if ( ! empty( $tablet_overlay['overlayBgImg'] ) ) {
						if ( ! empty( $tablet_overlay['overlayBgImgAttachment'] ) ) {
							if ( 'parallax' === $tablet_overlay['overlayBgImgAttachment'] ) {
								$overbg_attach = 'fixed';
							} else {
								$overbg_attach = $tablet_overlay['overlayBgImgAttachment'];
							}
						} else {
							$overbg_attach = 'scroll';
						}
						$css->add_property( 'background-image', sprintf( "url('%s')", $tablet_overlay['overlayBgImg'] ) );
						$css->add_property( 'background-size', ( ! empty( $tablet_overlay['overlayBgImgSize'] ) ? $tablet_overlay['overlayBgImgSize'] : 'cover' ) );
						$css->add_property( 'background-position', ( ! empty( $tablet_overlay['overlayBgImgPosition'] ) ? $tablet_overlay['overlayBgImgPosition'] : 'center center' ) );
						$css->add_property( 'background-attachment', $overbg_attach );
						$css->add_property( 'background-repeat', ( ! empty( $tablet_overlay['overlayBgImgRepeat'] ) ? $tablet_overlay['overlayBgImgRepeat'] : 'no-repeat' ) );
					}
					break;
				case 'gradient':
					$css->add_property( 'background', $css->render_gradient( $tablet_overlay['gradient'] ) );
					break;
				case 'grad':
					// Old Gradient Support.
					$type = ( ! empty( $tablet_overlay['overlayGradType'] ) ? $tablet_overlay['overlayGradType'] : 'linear' );
					if ( 'radial' === $type ) {
						$angle = ( ! empty( $tablet_overlay['overlayBgImgPosition'] ) ? 'at ' . $tablet_overlay['overlayBgImgPosition'] : 'at center center' );
					} else {
						$angle = ( ! empty( $tablet_overlay['overlayGradAngle'] ) ? $tablet_overlay['overlayGradAngle'] . 'deg' : '180deg' );
					}
					$loc         = ( ! empty( $tablet_overlay['overlayGradLoc'] ) ? $tablet_overlay['overlayGradLoc'] : '0' );
					$color       = ( ! empty( $tablet_overlay['overlay'] ) ? $css->render_color( $tablet_overlay['overlay'] ) : 'transparent' );
					$locsecond   = ( ! empty( $tablet_overlay['overlayGradLocSecond'] ) ? $tablet_overlay['overlayGradLocSecond'] : '100' );
					$colorsecond = ( ! empty( $tablet_overlay['overlaySecond'] ) ? $css->render_color( $tablet_overlay['overlaySecond'] ) : '#00B5E2' );
					$css->add_property( 'background-image', $type . '-gradient(' . $angle . ', ' . $color . ' ' . $loc . '%, ' . $colorsecond . ' ' . $locsecond . '%)' );
					break;
			}
			if ( ! empty( $tablet_overlay['overlayBlendMode'] ) ) {
				$css->add_property( 'mix-blend-mode', $tablet_overlay['overlayBlendMode'] );
			}
			$css->set_media_state( 'desktop' );
		}
		$mobile_overlay    = ( isset( $attributes['mobileOverlay'] ) && is_array( $attributes['mobileOverlay'] ) && isset( $attributes['mobileOverlay'][0] ) && is_array( $attributes['mobileOverlay'][0] ) ? $attributes['mobileOverlay'][0] : array() );
		if ( isset( $mobile_overlay['enable'] ) && $mobile_overlay['enable'] ) {
			$css->set_media_state( 'mobile' );
			$css->set_selector( $base_selector . ' > .kt-row-layout-overlay' );
			$css->render_opacity_from_100( $mobile_overlay, 'overlayOpacity' );
			$overlay_type = ! empty( $mobile_overlay['currentOverlayTab'] ) ? $mobile_overlay['currentOverlayTab'] : 'normal';
			switch ( $overlay_type ) {
				case 'normal':
					if ( ! empty( $mobile_overlay['overlayBgImg'] ) ) {
						$bg_selector = 'background-color';
					} else {
						$bg_selector = 'background';
					}
					if ( ! empty( $mobile_overlay['overlay'] ) ) {
						$css->render_color_output( $mobile_overlay, 'overlay', $bg_selector );
					}
					if ( ! empty( $mobile_overlay['overlayBgImg'] ) ) {
						if ( ! empty( $mobile_overlay['overlayBgImgAttachment'] ) ) {
							if ( 'parallax' === $mobile_overlay['overlayBgImgAttachment'] ) {
								$overbg_attach = 'fixed';
							} else {
								$overbg_attach = $mobile_overlay['overlayBgImgAttachment'];
							}
						} else {
							$overbg_attach = 'scroll';
						}
						$css->add_property( 'background-image', sprintf( "url('%s')", $mobile_overlay['overlayBgImg'] ) );
						$css->add_property( 'background-size', ( ! empty( $mobile_overlay['overlayBgImgSize'] ) ? $mobile_overlay['overlayBgImgSize'] : 'cover' ) );
						$css->add_property( 'background-position', ( ! empty( $mobile_overlay['overlayBgImgPosition'] ) ? $mobile_overlay['overlayBgImgPosition'] : 'center center' ) );
						$css->add_property( 'background-attachment', $overbg_attach );
						$css->add_property( 'background-repeat', ( ! empty( $mobile_overlay['overlayBgImgRepeat'] ) ? $mobile_overlay['overlayBgImgRepeat'] : 'no-repeat' ) );
					}
					break;
				case 'gradient':
					$css->add_property( 'background', $css->render_gradient( $mobile_overlay['gradient'] ) );
					break;
				case 'grad':
					$type = ( ! empty( $mobile_overlay['overlayGradType'] ) ? $mobile_overlay['overlayGradType'] : 'linear' );
					if ( 'radial' === $type ) {
						$angle = ( ! empty( $mobile_overlay['overlayBgImgPosition'] ) ? 'at ' . $mobile_overlay['overlayBgImgPosition'] : 'at center center' );
					} else {
						$angle = ( ! empty( $mobile_overlay['overlayGradAngle'] ) ? $mobile_overlay['overlayGradAngle'] . 'deg' : '180deg' );
					}
					$loc         = ( ! empty( $mobile_overlay['overlayGradLoc'] ) ? $mobile_overlay['overlayGradLoc'] : '0' );
					$color       = ( ! empty( $mobile_overlay['overlay'] ) ? $css->render_color( $mobile_overlay['overlay'] ) : 'transparent' );
					$locsecond   = ( ! empty( $mobile_overlay['overlayGradLocSecond'] ) ? $mobile_overlay['overlayGradLocSecond'] : '100' );
					$colorsecond = ( ! empty( $mobile_overlay['overlaySecond'] ) ? $css->render_color( $mobile_overlay['overlaySecond'] ) : '#00B5E2' );
					$css->add_property( 'background-image', $type . '-gradient(' . $angle . ', ' . $color . ' ' . $loc . '%, ' . $colorsecond . ' ' . $locsecond . '%)' );
					break;
			}
			if ( ! empty( $mobile_overlay['overlayBlendMode'] ) ) {
				$css->add_property( 'mix-blend-mode', $mobile_overlay['overlayBlendMode'] );
			}
			$css->set_media_state( 'desktop' );
		}
		if ( $css->is_number( $attributes['zIndex'] ) ) {
			if ( ! empty( $attributes['kbVersion'] ) && $attributes['kbVersion'] > 1 ) {
				$css->set_selector( $base_selector );
			} else {
				$css->set_selector( $inner_selector );
			}
			$css->add_property( 'z-index', $attributes['zIndex'] );
			$css->add_property( 'position', 'relative' );
		}
		// Text Color.
		if ( ! empty( $attributes['textColor'] ) ) {
			$css->set_selector( $base_selector . ' ,' . $base_selector . ' h1,' . $base_selector . ' h2,' . $base_selector . ' h3,' . $base_selector . ' h4,' . $base_selector . ' h5,' . $base_selector . ' h6' );
			$css->render_color_output( $attributes, 'textColor', 'color' );
		}
		if ( ! empty( $attributes['linkColor'] ) ) {
			$css->set_selector( $base_selector . ' a' );
			$css->render_color_output( $attributes, 'linkColor', 'color' );
		}
		if ( ! empty( $attributes['linkHoverColor'] ) ) {
			$css->set_selector( $base_selector . ' a:hover' );
			$css->render_color_output( $attributes, 'linkHoverColor', 'color' );
		}
		// Bottom Sep.
		if ( isset( $attributes['bottomSep'] ) && 'none' != $attributes['bottomSep'] ) {
			$bottomSepUnit   = ! empty( $attributes['bottomSepHeightUnit'] ) ? $attributes['bottomSepHeightUnit'] : 'px';
			$bottomSepHeight = ! empty( $attributes['bottomSepHeight'] ) ? $attributes['bottomSepHeight'] : '100';

			$css->set_selector( $base_selector . ' .kt-row-layout-bottom-sep' );
			$css->add_property( 'height', $bottomSepHeight . $bottomSepUnit );

				if ( isset( $attributes['bottomSepWidth'] ) ) {
					$css->set_selector( $base_selector . ' .kt-row-layout-bottom-sep svg' );
					$css->add_property( 'width', $attributes['bottomSepWidth'] . '%' );
				}
			if ( ! empty( $attributes['bottomSepColor'] ) ) {
				$css->set_selector( $base_selector . ' .kt-row-layout-bottom-sep svg' );
				$css->add_property( 'fill', $css->render_color( $attributes['bottomSepColor'] ) . '!important' );
			}
			if ( isset( $attributes['bottomSepHeightTab'] ) || isset( $attributes['bottomSepWidthTab'] ) ) {
				$css->set_media_state( 'tablet' );
				if ( isset( $attributes['bottomSepHeightTab'] ) ) {
					$css->set_selector( $base_selector . ' .kt-row-layout-bottom-sep' );
					$css->add_property( 'height', $attributes['bottomSepHeightTab'] . $bottomSepUnit );
				}
				if ( isset( $attributes['bottomSepWidthTab'] ) ) {
					$css->set_selector( $base_selector . ' .kt-row-layout-bottom-sep svg' );
					$css->add_property( 'width', $attributes['bottomSepWidthTab'] . '%' );
				}
				$css->set_media_state( 'desktop' );
			}
			if ( isset( $attributes['bottomSepHeightMobile'] ) || isset( $attributes['bottomSepWidthMobile'] ) ) {
				$css->set_media_state( 'mobile' );
				if ( isset( $attributes['bottomSepHeightMobile'] ) ) {
					$css->set_selector( $base_selector . ' .kt-row-layout-bottom-sep' );
					$css->add_property( 'height', $attributes['bottomSepHeightMobile'] . $bottomSepUnit );
				}
				if ( isset( $attributes['bottomSepWidthMobile'] ) ) {
					$css->set_selector( $base_selector . ' .kt-row-layout-bottom-sep svg' );
					$css->add_property( 'width', $attributes['bottomSepWidthMobile'] . '%' );
				}
				$css->set_media_state( 'desktop' );
			}
		}
		// Top Sep.
		if ( isset( $attributes['topSep'] ) && 'none' != $attributes['topSep'] ) {
			$topSepUnit = !empty( $attributes['topSepHeightUnit']) ? $attributes['topSepHeightUnit'] : 'px';
			$topSepHeight = !empty ($attributes['topSepHeight']) ? $attributes['topSepHeight'] : '100';
				$css->set_selector( $base_selector . ' .kt-row-layout-top-sep' );
				$css->add_property( 'height', $topSepHeight . $topSepUnit );
			if ( $css->is_number( $attributes['topSepWidth'] ) ) {
				$css->set_selector( $base_selector . ' .kt-row-layout-top-sep svg' );
				$css->add_property( 'width', $attributes['topSepWidth'] . '%' );
			}
			if ( ! empty( $attributes['topSepColor'] ) ) {
				$css->set_selector( $base_selector . ' .kt-row-layout-top-sep svg'  );
				$css->add_property( 'fill', $css->render_color( $attributes['topSepColor'] ) . '!important' );
			}
			$css->set_media_state( 'tablet' );
			if ( $css->is_number( $attributes['topSepHeightTab'] ) ) {
				$css->set_selector( $base_selector . ' .kt-row-layout-top-sep' );
				$css->add_property( 'height', $attributes['topSepHeightTab'] . $topSepUnit );
			}
			if ( $css->is_number( $attributes['topSepWidthTab'] ) ) {
				$css->set_selector( $base_selector . ' .kt-row-layout-top-sep svg' );
				$css->add_property( 'width', $attributes['topSepWidthTab'] . '%' );
			}
			$css->set_media_state( 'mobile' );
			if ( $css->is_number( $attributes['topSepHeightMobile'] ) ) {
				$css->set_selector( $base_selector . ' .kt-row-layout-top-sep' );
				$css->add_property( 'height', $attributes['topSepHeightMobile'] . $topSepUnit );
			}
			if ( $css->is_number( $attributes['topSepWidthMobile'] ) ) {
				$css->set_selector( $base_selector . ' .kt-row-layout-top-sep svg' );
				$css->add_property( 'width', $attributes['topSepWidthMobile'] . '%' );
			}
			$css->set_media_state( 'desktop' );
		}
		if ( isset( $attributes['vsdesk'] ) && $attributes['vsdesk'] ) {
			$css->set_media_state( 'desktopOnly' );
			$css->set_selector( $base_selector );
			$css->add_property( 'display', 'none !important' );
		}
		if ( isset( $attributes['vstablet'] ) && $attributes['vstablet'] ) {
			$css->set_media_state( 'tabletOnly' );
			$css->set_selector( $base_selector );
			$css->add_property( 'display', 'none !important' );
		}
		if ( isset( $attributes['vsmobile'] ) && $attributes['vsmobile'] ) {
			$css->set_media_state( 'mobile' );
			$css->set_selector( $base_selector );
			$css->add_property( 'display', 'none !important' );
		}
		$css->set_media_state( 'desktop' );

		// Background Slider Pause Button Styles.
		if ( isset( $attributes['backgroundSettingTab'] ) && 'slider' === $attributes['backgroundSettingTab'] ) {
			$arrow_style = ! empty( $attributes['backgroundSliderSettings'][0]['arrowStyle'] ) ? $attributes['backgroundSliderSettings'][0]['arrowStyle'] : 'none';
			$show_pause_button = isset( $attributes['backgroundSliderSettings'][0]['showPauseButton'] ) ? $attributes['backgroundSliderSettings'][0]['showPauseButton'] : false;

			if ( $show_pause_button ) {
				$css->set_selector( $base_selector . ' .kb-blocks-bg-slider .kb-gallery-pause-button' );

				// Set styles based on arrow style.
				switch ( $arrow_style ) {
					case 'blackonlight':
						$css->add_property( 'background-color', 'rgba(255, 255, 255, 0.8)' );
						$css->add_property( 'color', '#000' );
						$css->add_property( 'border', 'none' );
						break;
					case 'outlineblack':
						$css->add_property( 'background-color', 'transparent' );
						$css->add_property( 'color', '#000' );
						$css->add_property( 'border', '2px solid #000' );
						break;
					case 'outlinewhite':
						$css->add_property( 'background-color', 'transparent' );
						$css->add_property( 'color', '#fff' );
						$css->add_property( 'border', '2px solid #fff' );
						break;
					case 'none':
					default:
						$css->add_property( 'background-color', 'rgba(0, 0, 0, 0.8)' );
						$css->add_property( 'color', '#fff' );
						$css->add_property( 'border', 'none' );
						break;
				}
			}
		}

		if ( isset( $attributes['kadenceBlockCSS'] ) && ! empty( $attributes['kadenceBlockCSS'] ) ) {
			$css->add_css_string( str_replace( 'selector', $base_selector, $attributes['kadenceBlockCSS'] ) );
		}
		return $css->css_output();
	}
	/**
	 * Render svg divider.
	 *
	 * @param string $divider the divider slug.
	 * @param string $location - top or bottom.
	 */
	public function get_divider_render( $divider, $location ) {
		$paths = array();
		$paths['ct'] = '<path d="M1000,0l-500,98l-500,-98l0,100l1000,0l0,-100Z" />';
		$paths['cti'] = '<path d="M500,2l500,98l-1000,0l500,-98Z" />';
		$paths['ctd'] = '<path d="M1000,0l-500,98l-500,-98l0,100l1000,0l0,-100Z" style="opacity: 0.4" /><path d="M1000,20l-500,78l-500,-78l0,80l1000,0l0,-80Z" />';
		$paths['ctdi'] = '<path d="M500,2l500,78l0,20l-1000,0l0,-20l500,-78Z" style="opacity: 0.4" /><path d="M500,2l500,98l-1000,0l500,-98Z" />';
		$paths['sltl'] = '<path d="M1000,0l-1000,100l1000,0l0,-100Z" />';
		$paths['sltli'] = '<path d="M0,100l1000,-100l-1000,0l0,100Z" />';
		$paths['sltr'] = '<path d="M0,0l1000,100l-1000,0l0,-100Z" />';
		$paths['sltri'] = '<path d="M1000,100l-1000,-100l1000,0l0,100Z" />';
		$paths['crv'] = '<path d="M1000,100c0,0 -270.987,-98 -500,-98c-229.013,0 -500,98 -500,98l1000,0Z" />';
		$paths['crvi'] = '<path d="M1000,0c0,0 -270.987,98 -500,98c-229.013,0 -500,-98 -500,-98l0,100l1000,0l0,-100Z" />';
		$paths['crvl'] = '<path d="M1000,100c0,0 -420.987,-98 -650,-98c-229.013,0 -350,98 -350,98l1000,0Z" />';
		$paths['crvli'] = '<path d="M1000,0c0,0 -420.987,98 -650,98c-229.013,0 -350,-98 -350,-98l0,100l1000,0l0,-100Z" />';
		$paths['crvr'] = '<path d="M1000,100c0,0 -120.987,-98 -350,-98c-229.013,0 -650,98 -650,98l1000,0Z" />';
		$paths['crvri'] = '<path d="M1000,0c0,0 -120.987,98 -350,98c-229.013,0 -650,-98 -650,-98l0,100l1000,0l0,-100Z" />';
		$paths['wave'] = '<path d="M1000,40c0,0 -120.077,-38.076 -250,-38c-129.923,0.076 -345.105,78 -500,78c-154.895,0 -250,-30 -250,-30l0,50l1000,0l0,-60Z" />';
		$paths['wavei'] = '<path d="M0,40c0,0 120.077,-38.076 250,-38c129.923,0.076 345.105,78 500,78c154.895,0 250,-30 250,-30l0,50l-1000,0l0,-60Z" />';
		$paths['waves'] = '<path d="M1000,40c0,0 -120.077,-38.076 -250,-38c-129.923,0.076 -345.105,78 -500,78c-154.895,0 -250,-30 -250,-30l0,50l1000,0l0,-60Z" /><path d="M1000,40c0,0 -120.077,-38.076 -250,-38c-129.923,0.076 -345.105,73 -500,73c-154.895,0 -250,-45 -250,-45l0,70l1000,0l0,-60Z" style="opacity: 0.4" /><path d="M1000,40c0,0 -120.077,-38.076 -250,-38c-129.923,0.076 -345.105,68 -500,68c-154.895,0 -250,-65 -250,-65l0,95l1000,0l0,-60Z" style="opacity: 0.4" />';
		$paths['wavesi'] = '<path d="M0,40c0,0 120.077,-38.076 250,-38c129.923,0.076 345.105,78 500,78c154.895,0 250,-30 250,-30l0,50l-1000,0l0,-60Z" /><path d="M0,40c0,0 120.077,-38.076 250,-38c129.923,0.076 345.105,73 500,73c154.895,0 250,-45 250,-45l0,70l-1000,0l0,-60Z" style="opacity: 0.4" /><path d="M0,40c0,0 120.077,-38.076 250,-38c129.923,0.076 345.105,68 500,68c154.895,0 250,-65 250,-65l0,95l-1000,0l0,-60Z" style="opacity: 0.4" />';
		$paths['mtns'] = '<path d="M1000,50l-182.69,-45.286l-292.031,61.197l-190.875,-41.075l-143.748,28.794l-190.656,-23.63l0,70l1000,0l0,-50Z" style="opacity: 0.4" /><path d="M1000,57l-152.781,-22.589l-214.383,19.81l-159.318,-21.471l-177.44,25.875l-192.722,5.627l-103.356,-27.275l0,63.023l1000,0l0,-43Z" />';
		$paths['littri'] = '<path d="M500,2l25,98l-50,0l25,-98Z" />';
		$paths['littrii'] = '<path d="M1000,100l-1000,0l0,-100l475,0l25,98l25,-98l475,0l0,100Z" />';
		$paths['threelevels'] = '<path style="opacity: 0.33" d="M0 95L1000 0v100H0v-5z"></path><path style="opacity: 0.66" d="M0 95l1000-67.944V100H0v-5z"></path><path d="M0 95l1000-40.887V100H0v-5z"></path>';
		$paths['threelevelsi'] = '<path style="opacity: 0.33" d="M1000 95L0 0v100h1000v-5z"></path><path style="opacity: 0.66" d="M1000 95L0 27.056V100h1000v-5z"></path><path d="M1000 95L0 54.113V100h1000v-5z"></path>';
		$paths = apply_filters( 'kadence_blocks_row_divider_paths', $paths, $location );
		$output = '';
		if ( isset( $paths[ $divider ] ) ) {
			$output .= '<div class="kt-row-layout-' . esc_attr( $location ) . '-sep kt-row-sep-type-' . esc_attr( $divider ) . '">';
			$output .= '<svg viewBox="0 0 1000 100" preserveAspectRatio="none">';
			$output .= $paths[ $divider ];
			$output .= '</svg>';
			$output .= '</div>';
		}
		return $output;
	}
	/**
	 * Checks to see if we should render an overlay.
	 *
	 * @param array $attributes for the block.
	 */
	public function has_overlay( $attributes ) {
		$has_overlay = false;
		$overlay_type = ( ! empty( $attributes['currentOverlayTab'] ) ? $attributes['currentOverlayTab'] : 'normal' );
		switch ( $overlay_type ) {
			case 'normal':
				$has_overlay = ( ! empty( $attributes['overlay'] ) || ! empty( $attributes['overlayBgImg'] ) ? true : false );
				break;
			case 'gradient':
				$has_overlay = ( ! empty( $attributes['overlayGradient'] ) ? true : false );
				break;
			case 'grad':
				$has_overlay = ( ! empty( $attributes['overlay'] ) ? true : false );
				break;
		}
		if ( ! $has_overlay ) {
			$tablet_overlay    = ( isset( $attributes['tabletOverlay'] ) && is_array( $attributes['tabletOverlay'] ) && isset( $attributes['tabletOverlay'][0] ) && is_array( $attributes['tabletOverlay'][0] ) ? $attributes['tabletOverlay'][0] : array() );
			if ( isset( $tablet_overlay['enable'] ) && $tablet_overlay['enable'] ) {
				$tablet_overlay_type = ( ! empty( $tablet_overlay['currentOverlayTab'] ) ? $tablet_overlay['currentOverlayTab'] : 'normal' );
				switch ( $tablet_overlay_type ) {
					case 'normal':
						$has_overlay = ( ! empty( $tablet_overlay['overlay'] ) || ! empty( $tablet_overlay['overlayBgImg'] ) ? true : false );
						break;
					case 'gradient':
						$has_overlay = ( ! empty( $tablet_overlay['gradient'] ) ? true : false );
						break;
					case 'grad':
						$has_overlay = ( ! empty( $tablet_overlay['overlay'] ) ? true : false );
						break;
				}
			}
		}
		if ( ! $has_overlay ) {
			$mobile_overlay    = ( isset( $attributes['mobileOverlay'] ) && is_array( $attributes['mobileOverlay'] ) && isset( $attributes['mobileOverlay'][0] ) && is_array( $attributes['mobileOverlay'][0] ) ? $attributes['mobileOverlay'][0] : array() );
			if ( isset( $mobile_overlay['enable'] ) && $mobile_overlay['enable'] ) {
				$mobile_overlay_type = ( ! empty( $mobile_overlay['currentOverlayTab'] ) ? $mobile_overlay['currentOverlayTab'] : 'normal' );
				switch ( $mobile_overlay_type ) {
					case 'normal':
						$has_overlay = ( ! empty( $mobile_overlay['overlay'] ) || ! empty( $mobile_overlay['overlayBgImg'] ) ? true : false );
						break;
					case 'gradient':
						$has_overlay = ( ! empty( $mobile_overlay['gradient'] ) ? true : false );
						break;
					case 'grad':
						$has_overlay = ( ! empty( $mobile_overlay['overlay'] ) ? true : false );
						break;
				}
			}
		}
		return $has_overlay;
	}
	/**
	 * Generates the color output.
	 *
	 * @param string $color any color attribute.
	 * @return string
	 */
	public function output_color( $color, $opacity = null ) {
		if ( empty( $color ) ) {
			return false;
		}
		if ( ! is_array( $color ) && strpos( $color, 'palette' ) === 0 ) {
			switch ( $color ) {
				case 'palette2':
					$fallback = '#2B6CB0';
					break;
				case 'palette3':
					$fallback = '#1A202C';
					break;
				case 'palette4':
					$fallback = '#2D3748';
					break;
				case 'palette5':
					$fallback = '#4A5568';
					break;
				case 'palette6':
					$fallback = '#718096';
					break;
				case 'palette7':
					$fallback = '#EDF2F7';
					break;
				case 'palette8':
					$fallback = '#F7FAFC';
					break;
				case 'palette9':
					$fallback = '#ffffff';
					break;
				default:
					$fallback = '#3182CE';
					break;
			}
			$color = 'var(--global-' . $color . ', ' . $fallback . ')';
		} elseif ( isset( $opacity ) && is_numeric( $opacity ) && 1 !== (int) $opacity ) {
			$color = kadence_blocks_hex2rgba( $color, $opacity );
		}
		return $color;
	}
	/**
	 * Renders out the background slider.
	 *
	 * @param array $attributes for the block.
	 */
	public function get_slider_render( $attributes ) {
		if ( empty( $attributes['backgroundSliderCount'] ) || empty( $attributes['backgroundSlider'] ) ) {
			return '';
		}
		$output = '';
		$dot_style = ! empty( $attributes['backgroundSliderSettings'][0]['dotStyle'] ) ? $attributes['backgroundSliderSettings'][0]['dotStyle'] : 'dark';
		$arrow_style = ! empty( $attributes['backgroundSliderSettings'][0]['arrowStyle'] ) ? $attributes['backgroundSliderSettings'][0]['arrowStyle'] : 'none';
		$tran_speed = ! empty( $attributes['backgroundSliderSettings'][0]['tranSpeed'] ) ? $attributes['backgroundSliderSettings'][0]['tranSpeed'] : 400;
		$speed = ! empty( $attributes['backgroundSliderSettings'][0]['speed'] ) ? $attributes['backgroundSliderSettings'][0]['speed'] : 7000;
		$fade = isset( $attributes['backgroundSliderSettings'][0]['fade'] ) ? $attributes['backgroundSliderSettings'][0]['fade'] : true;
		$auto = isset( $attributes['backgroundSliderSettings'][0]['autoPlay'] ) ? $attributes['backgroundSliderSettings'][0]['autoPlay'] : true;
		$show_pause_button = isset( $attributes['backgroundSliderSettings'][0]['showPauseButton'] ) ? $attributes['backgroundSliderSettings'][0]['showPauseButton'] : false;
		$output .= '<div class="kt-blocks-carousel kb-blocks-bg-slider kt-carousel-container-dotstyle-' . esc_attr( $dot_style ) . '">';
		// Output proper Splide.js structure: splide > splide__track > splide__list > splide__slide
		$output .= '<div class="kt-blocks-carousel-init splide kb-blocks-bg-slider-init kt-carousel-arrowstyle-' . esc_attr( $arrow_style ) . ' kt-carousel-dotstyle-' . esc_attr( $dot_style ) . '" data-slider-anim-speed="' . esc_attr( $tran_speed ) . '" data-slider-type="slider" data-slider-scroll="1" data-slider-arrows="' . ( 'none' === $arrow_style ? 'false' : 'true' ) . '" data-slider-fade="' . ( $fade ? 'true' : 'false' ) . '" data-slider-dots="' . ( 'none' === $dot_style ? 'false' : 'true' ) . '" data-slider-hover-pause="false" data-slider-auto="' . ( $auto ? 'true' : 'false' ) . '" data-slider-speed="' . esc_attr( $speed ) . '" data-show-pause-button="' . esc_attr( $show_pause_button ? 'true' : 'false' ) . '">';
		$output .= '<div class="splide__track">';
		$output .= '<ul class="splide__list">';
		$item = 1;
		foreach ( $attributes['backgroundSlider'] as $key => $slide ) {
			$style_args = array();
			if ( ! empty( $slide['bgColor'] ) ) {
				$style_args['background-color'] = $this->output_color( $slide['bgColor'] );
			}
			if ( ! empty( $slide['bgImg'] ) ) {
				$style_args['background-image'] = 'url(' . $slide['bgImg'] . ')';
				if ( ! empty( $attributes['bgImgSize'] ) ) {
					$style_args['background-size'] = $attributes['bgImgSize'];
				}
				if ( ! empty( $attributes['bgImgPosition'] ) ) {
					$style_args['background-position'] = $attributes['bgImgPosition'];
				}
				if ( ! empty( $attributes['bgImgRepeat'] ) ) {
					$style_args['background-repeat'] = $attributes['bgImgRepeat'];
				}
			}

			$style_output = [];

			foreach ( $style_args as $sub_key => $value ) {
				$style_output[] = $sub_key . ':' . esc_attr( $value ) . ';';
			}

			$attrs = [
				'class' => 'kb-bg-slide kb-bg-slide-' . $key,
				'style' => implode( ' ', $style_output ),
			];

			/**
			 * DO NOT REMOVE: The optimizer uses this.
			 *
			 * @param array<string, mixed> $attrs The HTML attributes.
			 * @param array<string, mixed> $attributes The row block attributes.
			 */
			$attrs = apply_filters( 'kadence_blocks_row_slider_attrs', $attrs, $attributes );

			$output .= sprintf(
				'<li class="splide__slide kb-bg-slide-contain"><div %s></div></li>',
				$this->build_escaped_html_attributes( $attrs )
			);

			if ( $attributes['backgroundSliderCount'] == $item ) {
				break;
			}
			$item ++;
		}
		$output .= '</ul>';
		$output .= '</div>';
		if ( $auto && $show_pause_button ) {
			$output .= '<button class="kb-gallery-pause-button splide__toggle" type="button" aria-label="' . esc_attr( __( 'Toggle autoplay', 'kadence-blocks' ) ) . '">';
			$output .= '<span class="kb-gallery-pause-icon splide__toggle__pause"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="6" y="4" width="4" height="16" fill="currentColor"/><rect x="14" y="4" width="4" height="16" fill="currentColor"/></svg></span>';
			$output .= '<span class="kb-gallery-play-icon splide__toggle__play"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8 5v14l11-7z" fill="currentColor"/></svg></span>';
			$output .= '</button>';
		}
		$output .= '</div>';
		$output .= '</div>';
		return $output;
	}
	/**
	 * Renders out the background video.
	 *
	 * @param array $attributes for the block.
	 */
	public function prevent_preload_when_hidden( $attributes ) {
		if ( ( ( ! empty( $attributes['tabletBackground'][0]['enable'] ) && true == $attributes['tabletBackground'][0]['enable'] ) || ( ! empty( $attributes['mobileBackground'][0]['enable'] ) && true == $attributes['mobileBackground'][0]['enable'] ) ) && apply_filters( 'kadence_blocks_rowlayout_prevent_preload_for_mobile', true ) ) {
			return true;
		}
		return false;
	}
	/**
	 * Renders out the background video.
	 *
	 * @param array $attributes for the block.
	 */
	public function get_video_render( $attributes ) {
		if ( empty( $attributes['backgroundVideo'][0]['local'] ) && empty( $attributes['backgroundVideo'][0]['vimeo'] ) && empty( $attributes['backgroundVideo'][0]['youTube'] ) ) {
			return '';
		}
		$output = '';
		$video_attributes = $attributes['backgroundVideo'][0];
		$background_video_type = isset( $attributes['backgroundVideoType'] ) && $attributes['backgroundVideoType'] ? $attributes['backgroundVideoType'] : 'local';
		$prevent_preload = $this->prevent_preload_when_hidden( $attributes );

		if ( 'local' == $background_video_type ) {
			$video_args = array(
				'class' => 'kb-blocks-bg-video',
				'id' => 'bg-row-video-' . esc_attr( $attributes['uniqueID'] ),
				'playsinline' => '',
				'muted' => ( isset( $video_attributes['mute'] ) && false === $video_attributes['mute'] ? 'false' : '' ),
				'loop' => ( isset( $video_attributes['loop'] ) && false === $video_attributes['loop'] ? 'false' : '' ),
				'src' => $video_attributes['local'],
			);
		} else {
			$src_base = 'youtube' == $background_video_type ? 'https://www.youtube.com/embed/' : 'https://player.vimeo.com/video/';
			$video_id = 'youtube' == $background_video_type ? $video_attributes['youTube'] : $video_attributes['vimeo'];

			// Vimeo and youtube share a bunch of params, that's convienent.
			$src_query_string = '?' . http_build_query(
				array(
					'autoplay' => 1,
					'controls' => 0,
					'mute' => ( isset( $video_attributes['mute'] ) && false === $video_attributes['mute'] ? 0 : 1 ),
					'muted' => ( isset( $video_attributes['mute'] ) && false === $video_attributes['mute'] ? 0 : 1 ),
					'loop' => ( isset( $video_attributes['loop'] ) && false === $video_attributes['loop'] ? 0 : 1 ),
					'playlist' => $video_id,
					'disablekb' => 1,
					'modestbranding' => 1,
					'playsinline' => 1,
					'rel' => 0,
					'background' => 1,
				)
			);

			$video_args = array(
				'class' => 'kb-blocks-bg-video ' . $background_video_type,
				'id' => 'bg-row-video-' . esc_attr( $attributes['uniqueID'] ),
				'src' => $src_base . $video_id . $src_query_string,
			);
		}
		if ( ! empty( $attributes['bgImg'] ) && 'local' === $background_video_type ) {
			$video_args['poster'] = $attributes['bgImg'];
		}
		if ( $prevent_preload ) {
			$video_args['preload'] = 'none';
		}
		if ( ! $prevent_preload ) {
			$video_args['autoplay'] = '';
		}
		if ( isset( $video_args['loop'] ) && $video_args['loop'] == 'false' ) {
			unset( $video_args['loop'] );
		}
		if ( isset( $video_args['muted'] ) && $video_args['muted'] == 'false' ) {
			unset( $video_args['muted'] );
		}

		/**
		 * DO NOT REMOVE: The optimizer uses this.
		 *
		 * @param array<string, mixed> $video_args The HTML attributes.
		 * @param array<string, mixed> $attributes The row block attributes.
		 */
		$video_args = apply_filters( 'kadence_blocks_row_video_attrs', $video_args, $attributes );

		$video_html_attributes = array();
		foreach ( $video_args as $key => $value ) {
			if ( empty( $value ) ) {
				$video_html_attributes[] = $key;
			} else {
				$video_html_attributes[] = $key . '="' . esc_attr( $value ) . '"';
			}
		}
		$ratio = '16-9';
		if ( ! empty( $video_attributes['ratio'] ) ) {
			$ratio = str_replace( '/', '-', $video_attributes['ratio'] );
		}

		$btns_output = '';
		$show_play_pause = ( isset( $video_attributes['btns'] ) && $video_attributes['btns'] );
		$show_audio_is_default = ( ! isset( $video_attributes['btnsMute'] ) );
		$is_unmuted = ( isset( $video_attributes['mute'] ) && false === $video_attributes['mute'] );
		$show_audio = ( $show_audio_is_default && $show_play_pause && $is_unmuted ) || ( isset( $video_attributes['btnsMute'] ) && $video_attributes['btnsMute'] );
		if ( $show_play_pause || $show_audio ) {
			$btns_output .= '<div class="kb-background-video-buttons-wrapper kb-background-video-buttons-html5">';
			if ( $show_play_pause ) {
				$btns_output .= '<button class="kb-background-video-play kb-toggle-video-btn" aria-label="' . __( 'Play', 'kadence-blocks' ) . '" aria-hidden="true" style="display: none;"><svg viewBox="0 0 448 512" height="16" width="16" fill="currentColor" xmlns="https://www.w3.org/2000/svg"><path d="M424.4 214.7L72.4 6.6C43.8-10.3 0 6.1 0 47.9V464c0 37.5 40.7 60.1 72.4 41.3l352-208c31.4-18.5 31.5-64.1 0-82.6z"></path></svg></button>';
				$btns_output .= '<button class="kb-background-video-pause kb-toggle-video-btn" aria-label="' . __( 'Pause', 'kadence-blocks' ) . '" aria-hidden="false"><svg viewBox="0 0 448 512" height="16" width="16" fill="currentColor" xmlns="https://www.w3.org/2000/svg"><path d="M144 479H48c-26.5 0-48-21.5-48-48V79c0-26.5 21.5-48 48-48h96c26.5 0 48 21.5 48 48v352c0 26.5-21.5 48-48 48zm304-48V79c0-26.5-21.5-48-48-48h-96c-26.5 0-48 21.5-48 48v352c0 26.5 21.5 48 48 48h96c26.5 0 48-21.5 48-48z"></path></svg></button>';
			}
			if ( $show_audio ) {
				$hidden_attrs = 'aria-hidden="true" style="display: none;"';
				$unhidden_attrs = 'aria-hidden="false"';
				$btns_output .= '<button class="kb-background-video-unmute kb-toggle-video-btn" aria-label="' . __( 'Unmute', 'kadence-blocks' ) . '" ' . ( $is_unmuted ? $hidden_attrs : $unhidden_attrs ) . '><svg viewBox="0 0 256 512" height="16" width="16" fill="currentColor" xmlns="https://www.w3.org/2000/svg"><path d="M256 88.017v335.964c0 21.438-25.943 31.998-40.971 16.971L126.059 352H24c-13.255 0-24-10.745-24-24V184c0-13.255 10.745-24 24-24h102.059l88.971-88.954c15.01-15.01 40.97-4.49 40.97 16.971z"></path></svg></button>';
				$btns_output .= '<button class="kb-background-video-mute kb-toggle-video-btn" aria-label="' . __( 'Mute', 'kadence-blocks' ) . '" ' . ( $is_unmuted ? $unhidden_attrs : $hidden_attrs ) . '><svg viewBox="0 0 576 512" height="16" width="16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M256 88.017v335.964c0 21.438-25.943 31.998-40.971 16.971L126.059 352H24c-13.255 0-24-10.745-24-24V184c0-13.255 10.745-24 24-24h102.059l88.971-88.954c15.01-15.01 40.97-4.49 40.97 16.971zm182.056-77.876C422.982.92 403.283 5.668 394.061 20.745c-9.221 15.077-4.473 34.774 10.604 43.995C468.967 104.063 512 174.983 512 256c0 73.431-36.077 142.292-96.507 184.206-14.522 10.072-18.129 30.01-8.057 44.532 10.076 14.528 30.016 18.126 44.531 8.057C529.633 438.927 576 350.406 576 256c0-103.244-54.579-194.877-137.944-245.859zM480 256c0-68.547-36.15-129.777-91.957-163.901-15.076-9.22-34.774-4.471-43.994 10.607-9.22 15.078-4.471 34.774 10.607 43.994C393.067 170.188 416 211.048 416 256c0 41.964-20.62 81.319-55.158 105.276-14.521 10.073-18.128 30.01-8.056 44.532 6.216 8.96 16.185 13.765 26.322 13.765a31.862 31.862 0 0 0 18.21-5.709C449.091 377.953 480 318.938 480 256zm-96 0c0-33.717-17.186-64.35-45.972-81.944-15.079-9.214-34.775-4.463-43.992 10.616s-4.464 34.775 10.615 43.992C314.263 234.538 320 244.757 320 256a32.056 32.056 0 0 1-13.802 26.332c-14.524 10.069-18.136 30.006-8.067 44.53 10.07 14.525 30.008 18.136 44.53 8.067C368.546 316.983 384 287.478 384 256z"></path></svg></button>';
			}
			$btns_output .= '</div>';
		}

		// if ( 'local' == $attributes['backgroundVideoType'] ) {
		if ( 'local' == $background_video_type ) {
			$output = sprintf( '<div class="kb-blocks-bg-video-container"><video %1$s></video>%2$s</div>', implode( ' ', $video_html_attributes ), $btns_output );
		} else {
			$output = sprintf( '<div class="kb-blocks-bg-video-container embedded"><div class="kb-bg-video-iframe kb-bg-video-ratio-%1$s"><iframe frameborder="0" %2$s></iframe></div></div>', esc_attr( $ratio ), implode( ' ', $video_html_attributes ) );
		}
		return $output;
	}

	/**
	 * Do we have any custom column width for the amount of rows in this block.
	 *
	 * @param mixed $columns The number of columns.
	 * @param mixed $column1 The first column width.
	 * @param mixed $column2 The second column width.
	 * @param mixed $column3 The third column width.
	 * @param mixed $column4 The fourth column width.
	 * @param mixed $column5 The fifth column width.
	 * @param mixed $column6 The sixth column width.
	 */
	public function has_custom_widths( $columns, $column1, $column2, $column3, $column4, $column5, $column6 ) {
		switch( $columns ) {
			case 1:
				return !empty($column1);
			case 2:
				return !empty($column1) || !empty($column2);
			case 3:
				return !empty($column1) || !empty($column2) || !empty($column3);
			case 4:
				return !empty($column1) || !empty($column2) || !empty($column3) || !empty($column4);
			case 5:
				return !empty($column1) || !empty($column2) || !empty($column3) || !empty($column4) || !empty($column5);
			case 6:
				return !empty($column1) || !empty($column2) || !empty($column3) || !empty($column4) || !empty($column5) || !empty($column6);
		}
	}

	/**
	 * Build HTML for dynamic blocks
	 *
	 * @param $attributes
	 * @param $unique_id
	 * @param $content
	 * @param WP_Block $block_instance The instance of the WP_Block class that represents the block being rendered.
	 *
	 * @return mixed
	 */
	public function build_html( $attributes, $unique_id, $content, $block_instance ) {
		if ( ! empty( $attributes['kbVersion'] ) && $attributes['kbVersion'] > 1 ) {
			$html_tag = $this->get_html_tag( $attributes, 'htmlTag', 'div', $this->allowed_html_tags );
			$outer_classes = array( 'kb-row-layout-wrap', 'kb-row-layout-id' . $unique_id );
			$outer_classes[] = ! empty( $attributes['align'] ) ? 'align' . $attributes['align'] : 'alignnone';
			if ( isset( $attributes['vsdesk'] ) && $attributes['vsdesk'] ) {
				$outer_classes[] = 'kb-v-lg-hidden';
			}
			if ( isset( $attributes['vstablet'] ) && $attributes['vstablet'] ) {
				$outer_classes[] = 'kb-v-md-hidden';
			}
			if ( isset( $attributes['vsmobile'] ) && $attributes['vsmobile'] ) {
				$outer_classes[] = 'kb-v-sm-hidden';
			}
			if ( ! empty( $attributes['bgColorClass'] ) ) {
				$outer_classes[] = 'has-' . $attributes['bgColorClass'] . '-background-color';
			}
			if ( ! empty( $attributes['bgImg'] ) || ! empty( $attributes['bgColor'] ) || ! empty( $attributes['gradient'] ) || ! empty( $attributes['overlay'] ) || ! empty( $attributes['overlayBgImg'] ) || ! empty( $attributes['overlayGradient'] ) ) {
				$outer_classes[] = 'kt-row-has-bg';
			}
			if ( ! empty( $attributes['bgImg'] ) && ! empty( $attributes['bgImgAttachment'] ) && 'parallax' === $attributes['bgImgAttachment'] ) {
				$outer_classes[] = 'kt-jarallax';
			}
			$inner_classes = array( 'kt-row-column-wrap' );
			$inner_classes[] = ! empty( $attributes['columns'] ) ? 'kt-has-' . $attributes['columns'] . '-columns' : 'kt-has-2-columns';
			$inner_classes[] = ! empty( $attributes['colLayout'] ) ? 'kt-row-layout-' . $attributes['colLayout'] : 'kt-row-layout-equal';
			$inner_classes[] = ! empty( $attributes['tabletLayout'] ) ? 'kt-tab-layout-' . $attributes['tabletLayout'] : 'kt-tab-layout-inherit';
			$inner_classes[] = ! empty( $attributes['mobileLayout'] ) ? 'kt-mobile-layout-' . $attributes['mobileLayout'] : 'kt-mobile-layout-inherit';

			if ( ! empty( $attributes['verticalAlignment'] ) ) {
				$inner_classes[] = 'kt-row-valign-' . $attributes['verticalAlignment'];
			}
			if ( isset( $attributes['columnsInnerHeight'] ) && $attributes['columnsInnerHeight'] ) {
				$inner_classes[] = 'kt-inner-column-height-full';
			}
			if ( isset( $attributes['inheritMaxWidth'] ) && $attributes['inheritMaxWidth'] ) {
				$inner_classes[] = 'kb-theme-content-width';
			}
			$wrapper_args = array(
				'class' => implode( ' ', $outer_classes ),
			);
			$background_type = ! empty( $attributes['backgroundSettingTab'] ) ? $attributes['backgroundSettingTab'] : 'normal';
			if ( 'normal' === $background_type && ! empty( $attributes['bgImg'] ) && isset( $attributes['backgroundInline'] ) && $attributes['backgroundInline'] ) {
				$wrapper_args['style'] = 'background-image: url(' . $attributes['bgImg'] . ');';
			}
			if ( ! empty( $attributes['anchor'] ) ) {
				$wrapper_args['id'] = $attributes['anchor'];
			}
			$inner_args = array(
				'class' => implode( ' ', $inner_classes ),
			);
			$inner_wrap_attributes = array();
			foreach ( $inner_args as $key => $value ) {
				$inner_wrap_attributes[] = $key . '="' . esc_attr( $value ) . '"';
			}
			$extra_content = '';
			if ( 'slider' === $background_type ) {
				$extra_content .= $this->get_slider_render( $attributes );
			}
			if ( 'video' === $background_type ) {
				$extra_content .= $this->get_video_render( $attributes );
			}
			if ( $this->has_overlay( $attributes ) ) {
				$overlay_type = ( ! empty( $attributes['currentOverlayTab'] ) ? $attributes['currentOverlayTab'] : 'normal' );
				$extra_content .= '<div class="kt-row-layout-overlay kt-row-overlay-' . esc_attr( $overlay_type ) . '' . ( 'normal' === $overlay_type && ! empty( $attributes['overlayBgImg'] ) && ! empty( $attributes['overlayBgImgAttachment'] ) && 'parallax' === $attributes['overlayBgImgAttachment'] ? ' kt-jarallax' : '' ) . '"></div>';
			}
			if ( ! empty( $attributes['topSep'] ) && 'none' !== $attributes['topSep'] ) {
				$extra_content .= $this->get_divider_render( $attributes['topSep'], 'top' );
			}
			if ( ! empty( $attributes['bottomSep'] ) && 'none' !== $attributes['bottomSep'] ) {
				$extra_content .= $this->get_divider_render( $attributes['bottomSep'], 'bottom' );
			}
			if ( ! empty( $attributes['bgImg'] ) && !empty($attributes['bgImgAttachment']) && $attributes['bgImgAttachment'] == 'parallax' ) {
				if ( ! empty( $attributes['bgImgPosition'] ) ) {
					$wrapper_args['data-img-position'] = $attributes['bgImgPosition'];
				}
				if ( ! empty( $attributes['bgImgSize'] ) ) {
					$wrapper_args['data-img-size'] = $attributes['bgImgSize'];
					if ( $attributes['bgImgSize'] !== 'cover' && ! empty( $attributes['bgImgRepeat'] ) ) {
						$wrapper_args['data-img-repeat'] = $attributes['bgImgRepeat'];
					}
				}
			}

			/**
			 * DO NOT REMOVE: The Optimizer uses this.
			 *
			 * @param array<string, mixed> $wrapper_args The wrapper div HTML attributes.
			 * @param array<string, mixed> $attributes The current block attributes.
			 */
			$wrapper_args       = apply_filters( 'kadence_blocks_row_wrapper_args', $wrapper_args, $attributes );
			$wrapper_attributes = get_block_wrapper_attributes( $wrapper_args );
			$inner_wrapper_attributes = implode( ' ', $inner_wrap_attributes );
			$content = sprintf( '<%1$s %2$s>%3$s<div %4$s>%5$s</div></%1$s>', $html_tag, $wrapper_attributes, $extra_content, $inner_wrapper_attributes, $content );
			// Disable preloading if no video on mobile or tablet.
			if ( ! empty( $attributes['backgroundSettingTab'] ) && 'video' === $attributes['backgroundSettingTab'] && ! empty( $attributes['backgroundVideo'][0]['local'] ) && $this->prevent_preload_when_hidden( $attributes ) ) {
				if ( ! empty( $attributes['tabletBackground'][0]['enable'] ) && 'true' == $attributes['tabletBackground'][0]['enable'] ) {
					$size = 1024;
				} else {
					$size = 767;
				}
				$content = $content . '<script>if( window.innerWidth > ' . $size . ' ){document.getElementById("bg-row-video-' . esc_attr( $attributes['uniqueID'] ) . '").removeAttribute("preload");document.getElementById("bg-row-video-' . esc_attr( $attributes['uniqueID'] ) . '").setAttribute("autoplay","");}</script>';
			}
		} else {
			if ( ! empty( $attributes['backgroundSettingTab'] ) && 'video' === $attributes['backgroundSettingTab'] && ! empty( $attributes['backgroundVideo'][0]['local'] ) && ( ( ! empty( $attributes['tabletBackground'][0]['enable'] ) && true == $attributes['tabletBackground'][0]['enable'] ) || ( ! empty( $attributes['mobileBackground'][0]['enable'] ) && true == $attributes['mobileBackground'][0]['enable'] ) ) && apply_filters( 'kadence_blocks_rowlayout_prevent_preload_for_mobile', true ) ) {
				if ( ! empty( $attributes['tabletBackground'][0]['enable'] ) && 'true' == $attributes['tabletBackground'][0]['enable'] ) {
					$size = 1024;
				} else {
					$size = 767;
				}
				if ( ! empty( $attributes['bgImg'] ) ) {
					$content = str_replace( 'kt-layout-id' . esc_attr( $attributes['uniqueID'] ). '"><div class="kb-blocks-bg-video-container"><video class="kb-blocks-bg-video" poster="' . $attributes['bgImg'] . '" playsinline autoplay', 'kt-layout-id' . esc_attr( $attributes['uniqueID'] ) . '"><div class="kb-blocks-bg-video-container"><video id="bg-row-video-' . esc_attr( $attributes['uniqueID'] ) . '" class="kb-blocks-bg-video" poster=" ' . $attributes['bgImg'] . '" playsinline preload="none"', $content );
				} else {
					$content = str_replace( 'kt-layout-id' . esc_attr( $attributes['uniqueID'] ) . '"><div class="kb-blocks-bg-video-container"><video class="kb-blocks-bg-video" playsinline autoplay', 'kt-layout-id' . esc_attr( $attributes['uniqueID'] ) . '"><div class="kb-blocks-bg-video-container"><video id="bg-row-video-' . esc_attr( $attributes['uniqueID'] ) . '" class="kb-blocks-bg-video" playsinline preload="none"', $content );
				}
				$content = $content . '<script>if( window.innerWidth > ' . $size . ' ){document.getElementById("bg-row-video-' . esc_attr( $attributes['uniqueID'] ) . '").removeAttribute("preload");document.getElementById("bg-row-video-' . esc_attr( $attributes['uniqueID'] ). '").setAttribute("autoplay","");}</script>';
			}
		}
		return $content;
	}
	/**
	 * Registers scripts and styles.
	 */
	public function register_scripts() {
		parent::register_scripts();
		// If in the backend, bail out.
		if ( is_admin() ) {
			return;
		}
		if ( apply_filters( 'kadence_blocks_check_if_rest', false ) && kadence_blocks_is_rest() ) {
			return;
		}
		wp_register_script( 'jarallax', KADENCE_BLOCKS_URL . 'includes/assets/js/jarallax.min.js', array(), KADENCE_BLOCKS_VERSION, true );
		wp_register_script( 'kadence-blocks-parallax-js', KADENCE_BLOCKS_URL . 'includes/assets/js/kt-init-parallax.min.js', array( 'jarallax' ), KADENCE_BLOCKS_VERSION, true );
		wp_localize_script(
			'kadence-blocks-parallax-js',
			'kadence_blocks_parallax',
			array(
				'speed' => apply_filters( 'kadence_blocks_parallax_speed', -0.1 ),
			)
		);
		wp_register_style( 'kadence-kb-splide', KADENCE_BLOCKS_URL . 'includes/assets/css/kadence-splide.min.css', array(), KADENCE_BLOCKS_VERSION );
		wp_register_style( 'kadence-blocks-splide', KADENCE_BLOCKS_URL . 'includes/assets/css/kb-blocks-splide.min.css', array( 'kadence-kb-splide' ), KADENCE_BLOCKS_VERSION );
		wp_register_script( 'kad-splide', KADENCE_BLOCKS_URL . 'includes/assets/js/splide.min.js', array(), KADENCE_BLOCKS_VERSION, true );
		wp_register_script( 'kadence-blocks-splide-init', KADENCE_BLOCKS_URL . 'includes/assets/js/kb-splide-init.min.js', array( 'kad-splide' ), KADENCE_BLOCKS_VERSION, true );
		wp_register_script( 'kadence-blocks-video-bg', KADENCE_BLOCKS_URL . 'includes/assets/js/kb-init-html-bg-video.min.js', array(), KADENCE_BLOCKS_VERSION, true );
		wp_localize_script(
			'kadence-blocks-splide-init',
			'kb_splide',
			array(
				'i18n' => array(
					'prev' => __( 'Previous slide', 'kadence-blocks' ),
					'next' => __( 'Next slide', 'kadence-blocks' ),
					'first' => __( 'Go to first slide', 'kadence-blocks' ),
					'last' => __( 'Go to last slide', 'kadence-blocks' ),
					'slideX' => __( 'Go to slide %s', 'kadence-blocks' ),
					'pageX' => __( 'Go to page %s', 'kadence-blocks' ),
					'play' => __( 'Start autoplay', 'kadence-blocks' ),
					'pause' => __( 'Pause autoplay', 'kadence-blocks' ),
					'carousel' => __( 'carousel', 'kadence-blocks' ),
					'slide' => __( 'slide', 'kadence-blocks' ),
					'select' => __( 'Select a slide to show', 'kadence-blocks' ),
					'slideLabel' => __( '%s of %s', 'kadence-blocks' ),
				),
			)
		);
	}
}

Kadence_Blocks_Rowlayout_Block::get_instance();
