Your IP : 216.73.217.143


Current Path : /home/ereika83/public_html/wp-content/plugins/bbpowerpack/modules/pp-reviews/
Upload File :
Current File : /home/ereika83/public_html/wp-content/plugins/bbpowerpack/modules/pp-reviews/pp-reviews.php

<?php

/**
 * @class PPImageCarouselModule
 */
class PPReviewsModule extends FLBuilderModule {
	/**
	 * Class constructor.
	 *
	 * @since 2.7.11
	 *
	 * @return void
	 */
	public function __construct() {
		parent::__construct(
			array(
				'name'            => __( 'Reviews', 'bb-powerpack' ),
				'description'     => __( 'A module for reviews.', 'bb-powerpack' ),
				'group'           => pp_get_modules_group(),
				'category'        => pp_get_modules_cat( 'content' ),
				'dir'             => BB_POWERPACK_DIR . 'modules/pp-reviews/',
				'url'             => BB_POWERPACK_URL . 'modules/pp-reviews/',
				'editor_export'   => true, // Defaults to true and can be omitted.
				'enabled'         => true, // Defaults to true and can be omitted.
				'partial_refresh' => true,
			)
		);
	}

	public function enqueue_scripts() {
		$this->add_css( 'jquery-swiper' );
		$this->add_js( 'jquery-swiper' );
	}

	public function enqueue_icon_styles() {
		$enqueue = false;
		$settings = $this->settings;
		$items = $settings->reviews;

		if ( 'default' === $settings->review_source && is_array( $items ) && count( $items ) ) {
			foreach ( $items as $item ) {
				if ( ! is_object( $item ) ) {
					continue;
				}

				if ( isset( $item->icon ) && ! empty( $item->icon ) ) {
					$enqueue = true;
					break;
				}
			}
		}

		if ( $enqueue && is_callable( parent::class . '::enqueue_icon_styles' ) ) {
			parent::enqueue_icon_styles();
		}
	}

	/**
	 * Get reviews.
	 * 
	 * Retrieve reviews based on selected source.
	 *
	 * @since 2.7.11
	 *
	 * @return array|WP_Error
	 */
	public function get_reviews() {
		$source = $this->settings->review_source;
		$reviews = array();

		if ( 'google' === $source ) {
			$reviews = $this->get_google_reviews();
			$reviews = $this->parse_reviews( $reviews, $source );
		}
		if ( 'yelp' === $source ) {
			$reviews = $this->get_yelp_reviews();
			$reviews = $this->parse_reviews( $reviews, $source );
		}
		if ( 'all' === $source ) {
			$reviews = $this->get_google_reviews();
			$google_reviews = $this->parse_reviews( $reviews, 'google' );
			$reviews = $this->get_yelp_reviews();
			$yelp_reviews = $this->parse_reviews( $reviews, 'yelp' );

			$reviews = array();

			if ( is_wp_error( $google_reviews ) ) {
				return $google_reviews;
			}
			if ( is_wp_error( $yelp_reviews ) ) {
				return $yelp_reviews;
			}

			if ( ! empty( $google_reviews ) ) {
				for ( $i = 0; $i < count( $google_reviews ); $i++ ) {
					$reviews[] = $google_reviews[ $i ];
					if ( isset( $yelp_reviews[ $i ] ) ) {
						$reviews[] = $yelp_reviews[ $i ];
					}
				}
			}
			if ( empty( $reviews ) && ! empty( $yelp_reviews ) ) {
				$reviews = $yelp_reviews;
			}
		}

		$reviews = apply_filters( 'pp_reviews_data', $reviews, $source, $this->settings );

		if ( is_array( $reviews ) && ! empty( $reviews ) ) {
			if ( 'rating' == $this->settings->reviews_filter_by ) {
				usort( $reviews, array( $this, 'sort_by_rating' ) );
			} elseif ( 'date' == $this->settings->reviews_filter_by ) {
				usort( $reviews, array( $this, 'sort_by_time' ) );
			}

			$max_reviews	 = 8;
			$reviews_to_show = $max_reviews;

			if ( 'google' === $source ) {
				$max_reviews        = 5;
				$reviews_to_show 	= $this->settings->google_reviews_count;
			} elseif ( 'yelp' === $source ) {
				$max_reviews        = 3;
				$reviews_to_show 	= $this->settings->yelp_reviews_count;
			} elseif ( 'all' === $source ) {
				$max_reviews        = 8;
				$reviews_to_show 	= $this->settings->total_reviews_count;
			}

			$reviews_to_show = ( '' !== $reviews_to_show ) ? $reviews_to_show : $max_reviews;

			if ( $max_reviews !== $reviews_to_show ) {
				$display_number = (int) $reviews_to_show;
				$reviews        = array_slice( $reviews, 0, $display_number );
			}
		}

		return $reviews;
	}

	/**
	 * Parse reviews.
	 * 
	 * Build array of reviews based on provided raw data.
	 *
	 * @since 2.7.11
	 * @param array 	$reviews	Array of reviews data.
	 * @param string 	$source		Review source.
	 *
	 * @return array|WP_Error
	 */
	private function parse_reviews( $reviews, $source ) {
		if ( is_wp_error( $reviews['error'] ) ) {
			return $reviews['error'];
		}
		if ( empty( $reviews['data'] ) ) {
			return;
		}

		$parsed_reviews = array();
		$filter_by_min_rating = false;

		$data = $reviews['data'];

		if ( 'google' === $source ) {
			$data = $data['reviews'];
		}

		if ( '' !== $this->settings->reviews_min_rating ) {
			$filter_by_min_rating = true;
		}

		foreach ( $data as $review ) {
			$_review = array();

			if ( 'google' === $source ) {
				$review_url = explode( '/reviews', $review->author_url );
				$review_url = $review_url[0] . '/place/' . $this->get_google_place_id();

				if ( isset( $reviews['data']['location'] ) && ! empty( $reviews['data']['location'] ) ) {
					$location = $reviews['data']['location'];
					$review_url = $review_url . '/' . $location->lat . ',' . $location->lng;
				}

				$_review['source']                    = 'google';
				$_review['author_name']               = $review->author_name;
				$_review['author_url']                = $review->author_url;
				$_review['profile_photo_url']         = $review->profile_photo_url;
				$_review['rating']                    = $review->rating;
				$_review['relative_time_description'] = $review->relative_time_description;
				$_review['text']                      = $review->text;
				$_review['time']                      = $review->time;
				$_review['title']              		  = $review->relative_time_description;
				$_review['review_url']                = $review_url;
			}

			if ( 'yelp' === $source ) {
				$_review['source']                    = 'yelp';
				$_review['author_name']               = $review->user->name;
				$_review['author_url']                = $review->user->profile_url;
				$_review['profile_photo_url']         = $review->user->image_url;
				$_review['rating']                    = $review->rating;
				$_review['relative_time_description'] = '';
				$_review['text']                      = $review->text;
				$_review['time']                      = $review->time_created;
				$_review['title']              		  = $this->get_readable_time( $_review['time'] );
				$_review['review_url']                = $review->url;
			}

			if ( $filter_by_min_rating ) {
				if ( $review->rating >= $this->settings->reviews_min_rating ) {
					$parsed_reviews[] = $_review;
				}
			} else {
				$parsed_reviews[] = $_review;
			}
		}

		return $parsed_reviews;
	}

	/**
	 * Get readable time.
	 *
	 * Convert time into human readable format.
	 *
	 * @since 2.7.11
	 *
	 * @uses human_time_diff to convert time in human readable format.
	 *
	 * @return string
	 */
	private function get_readable_time( $time ) {
		$time = human_time_diff( strtotime( $time ), current_time( 'timestamp' ) );

		return sprintf( __( '%s ago', 'bb-powerpack' ), $time );
	}

	/**
	 * Get API data.
	 * 
	 * Handles review source remote API calls.
	 *
	 * @since 2.7.11
	 * @param string 	$source		Review source.
	 *
	 * @return array	$response	API response.
	 */
	public function get_api_data( $source ) {
		$api_args = array(
			'method'      => 'POST',
			'timeout'     => 60,
			'httpversion' => '1.0',
			'sslverify'   => false,
		);

		if ( 'google' === $source ) {
			$api_key = pp_get_google_api_key();
			$place_id = $this->get_google_place_id();

			if ( empty( $api_key ) ) {
				return new WP_Error( 'missing_api_key', __( 'To display Google Reviews, you need to setup API key.', 'bb-powerpack' ) );
			}
			if ( empty( $place_id ) ) {
				return new WP_Error( 'missing_place_id', __( 'To display Google Reviews, you need to provide valid Place ID.', 'bb-powerpack' ) );
			}

			$url = add_query_arg(
				array(
					'key'     => $api_key,
					'placeid' => $this->get_google_place_id(),
					'fields'  => 'reviews,geometry',
					'language' => get_locale(),
				),
				'https://maps.googleapis.com/maps/api/place/details/json'
			);

			//$url = pp_get_google_places_api_url();
		}

		if ( 'yelp' === $source ) {
			$business_id = $this->get_yelp_business_id();

			if ( empty( $business_id ) ) {
				return new WP_Error( 'missing_business_id', __( 'To display Yelp Reviews, you need to provide valid Business ID.', 'bb-powerpack' ) );
			}

			$url = 'https://api.yelp.com/v3/businesses/' . $business_id . '/reviews';
			
			$api_args['method'] = 'GET';
			$api_args['user-agent'] = '';
			$api_args['headers'] = array(
				'Authorization' => 'Bearer ' . pp_get_yelp_api_key(),
			);
		}

		$response = wp_remote_post(
			esc_url_raw( $url ),
			$api_args
		);

		if ( ! is_wp_error( $response ) ) {
			$body = json_decode( wp_remote_retrieve_body( $response ) );
			if ( isset( $body->error_message ) && ! empty( $body->error_message ) ) {
				$status = isset( $body->status ) ? $body->status : $source . '_api_error';
				return new WP_Error( $status, $body->error_message );
			}
		}

		return $response;
	}

	/**
	 * Get google reviews.
	 * 
	 * Get reviews from Google Place API and store it in transient.
	 *
	 * @since 2.7.11
	 *
	 * @return array $response Reviews data.
	 */
	private function get_google_reviews() {
		$response = array(
			'data'	=> array(),
			'error' => false,
		);

		$transient_name = 'pp_reviews_' . $this->get_google_place_id();

		$response['data'] = get_transient( $transient_name );
		
		if ( empty( $response['data'] ) ) {
			$api_data = $this->get_api_data( 'google' );

			if ( is_wp_error( $api_data ) ) {
				
				$response['error'] = $api_data;

			} else {
				if ( 200 === wp_remote_retrieve_response_code( $api_data ) ) {
					
					$data = json_decode( wp_remote_retrieve_body( $api_data ) );
					
					if ( 'OK' !== $data->status ) {
						$response['error'] = isset( $data->error_message ) ? $data->error_message : __( 'No reviews found.', 'bb-powerpack' );
					} else {
						if ( isset( $data->result ) && isset( $data->result->reviews ) ) {
							$response['data'] = array(
								'reviews' => $data->result->reviews,
								'location' => array(),
							);

							if ( isset( $data->result->geometry->location ) ) {
								$response['data']['location'] = $data->result->geometry->location;
							}

							set_transient( $transient_name, $response['data'], $this->get_transient_time() );

							$response['error'] = false;
						} else {
							$response['error'] = __( 'This place doesn\'t have any reviews.', 'bb-powerpack' );
						}
					}
				}
			}	
		}

		return $response;
	}

	/**
	 * Get yelp reviews.
	 * 
	 * Get reviews from Yelp Business API and store it in transient.
	 *
	 * @since 2.7.11
	 *
	 * @return array $response Reviews data.
	 */
	private function get_yelp_reviews() {
		$response = array(
			'data'	=> array(),
			'error' => false,
		);

		$transient_name = 'pp_reviews_' . $this->get_yelp_business_id();

		$response['data'] = get_transient( $transient_name );

		if ( empty( $response['data'] ) ) {
			$api_data = $this->get_api_data( 'yelp' );

			if ( is_wp_error( $api_data ) ) {
				
				$response['error'] = $api_data;

			} else {
				if ( 200 !== wp_remote_retrieve_response_code( $api_data ) ) {
					$data = json_decode( wp_remote_retrieve_body( $api_data ) );

					if ( isset( $data->error ) ) {
						if ( 'VALIDATION_ERROR' === $data->error->code ) {
							$response['error'] = __( 'Yelp Reviews Error: Invalid or empty API key.', 'bb-powerpack' );
						}
						if ( 'BUSINESS_NOT_FOUND' === $data->error->code ) {
							$response['error'] = __( 'Yelp Reviews Error: Incorrect or empty Business ID.', 'bb-powerpack' );
						}
						if ( 'INTERNAL_SERVER_ERROR' === $data->error->code ) {
							$response['error'] = __( 'Yelp Reviews Error: Something is wrong with Yelp.', 'bb-powerpack' );
						}
					} else {
						$response['error'] = __( 'Yelp Reviews Error: Unknown error occurred.', 'bb-powerpack' );
					}
				} else {
					$data = json_decode( wp_remote_retrieve_body( $api_data ) );

					if ( empty( $data ) || ! isset( $data->reviews ) || empty( $data->reviews ) ) {
						$response['error'] = __( 'This business doesn\'t have any reviews.', 'bb-powerpack' );
					} else {
						$response['data'] = $data->reviews;

						set_transient( $transient_name, $response['data'], $this->get_transient_time() );

						$response['error'] = false;
					}
				}
			}	
		}

		return $response;
	}

	/**
	 * Get transient time.
	 * 
	 * Get transient time from module settings.
	 *
	 * @since 2.7.11
	 *
	 * @return string Time in seconds.
	 */
	private function get_transient_time() {
		// 24 hours.
		$transient_time = 24;

		if ( isset( $this->settings->transient_time ) && ! empty( $this->settings->transient_time ) ) {
			$transient_time = $this->settings->transient_time;
		}
		
		return $transient_time * MINUTE_IN_SECONDS;
	}

	/**
	 * Sort by rating.
	 *
	 * Sort reviews by rating.
	 *
	 * @since 2.7.9
	 * @param array $reviews_1	A review array item.
	 * @param array $reviews_2	A review array item.
	 *
	 * @return boolean
	 */
	private function sort_by_rating( $review_1, $review_2 ) {
		return strcmp( $review_2['rating'], $review_1['rating'] );
	}

	/**
	 * Sort by time.
	 *
	 * Sort reviews by time.
	 *
	 * @since 2.7.9
	 * @param array $reviews_1	A review array item.
	 * @param array $reviews_2	A review array item.
	 *
	 * @return boolean
	 */
	private function sort_by_time( $review_1, $review_2 ) {
		return strcmp( $review_2['time'], $review_1['time'] );
	}

	/**
	 * Get source icon.
	 *
	 * Get icon based on review source.
	 *
	 * @since 2.7.9
	 * @param string $source Review source.
	 * 
	 * @return string|array
	 */
	public function get_source_icon( $source = false ) {
		$icon = apply_filters( 'pp_reviews_source_icon', array(
			'google' => 'fab fa-google',
			'yelp'	=> 'fab fa-yelp',
		) );

		if ( ! empty( $source ) ) {
			if ( isset( $icon[ $source ] ) ) {
				$icon = $icon[ $source ];
			} else {
				$icon = '';
			}
		}

		return $icon;
	}

	public function get_review_text( $review ) {
		$settings = $this->settings;
		$has_link = isset( $settings->link_to_review ) && 'yes' === $settings->link_to_review && 'default' !== $settings->review_source;
		$text = $review['text'];

		if ( $has_link && isset( $settings->content_length ) && ! empty( $settings->content_length ) ) {
			$text = wp_trim_words( $text, $settings->content_length );
		}

		return $text;
	}

	private function get_google_place_id() {
		return do_shortcode( $this->settings->google_place_id );
	}

	private function get_yelp_business_id() {
		return do_shortcode( $this->settings->yelp_business_id );
	}

	/**
	 * Get review source notice.
	 *
	 * API keys notice to display in module setting
	 * based on review source.
	 *
	 * @since 2.7.9
	 *
	 * @return string
	 */
	static public function get_review_source_notice() {
		$notice = '';
		$setting_page = BB_PowerPack_Admin_Settings::get_form_action( '&tab=integration' );
		
		$notice .= sprintf(
			__( '<span class="google-notice">To display Google Places reviews, you must have a Google API key. <a href="%s" target="_blank">Click here</a> to setup your Google API key.</span> ', 'bb-powerpack' ),
			$setting_page
		);

		$notice .= sprintf(
			__( '<span class="yelp-notice">To display Yelp reviews, you must have a Yelp API key. <a href="%s" target="_blank">Click here</a> to setup your Yelp API key.</span> ', 'bb-powerpack' ),
			$setting_page
		);
		
		$notice .= sprintf(
			__( '<span class="all-notice">You need Google Places and Yelp API keys configured to display Google and Yelp reviews. <a href="%s" target="_blank">Click here</a> to setup API keys.</span>', 'bb-powerpack' ),
			$setting_page
		);

		return $notice;
	}
}

/**
 * Register the module and its form settings.
 */
BB_PowerPack::register_module(
	'PPReviewsModule',
	array(
		'reviews'    => array( // Tab.
			'title'    => __( 'Reviews', 'bb-powerpack' ), // Tab title.
			'description'		=> PPReviewsModule::get_review_source_notice(),
			'sections' => array( // Tab Sections.
				'general'      => array( // Section.
					'title'       => '', // Section Title.
					'description' => '',
					'fields'      => array( // Section Fields.
						'review_source'    => array(
							'type'    => 'select',
							'label'   => __( 'Review Source', 'bb-powerpack' ),
							'default' => 'default',
							'options' => array(
								'default'  => __( 'Default', 'bb-powerpack' ),
								'google'   => __( 'Google', 'bb-powerpack' ),
								'yelp'     => __( 'Yelp', 'bb-powerpack' ),
								'all'      => __( 'Google + Yelp', 'bb-powerpack' ),
							),
							'toggle'  => array(
								'default'  => array(
									'sections' => array( 'reviews_form' ),
								),
								'google'   => array(
									'sections' => array( 'filter', 'link', 'link_style', 'link_fonts' ),
									'fields'   => array( 'google_place_id', 'google_reviews_count', 'transient_time' ),
								),
								'yelp'     => array(
									'sections' => array( 'filter', 'link', 'link_style', 'link_fonts' ),
									'fields'   => array( 'yelp_business_id', 'yelp_reviews_count', 'transient_time' ),
								),
								'all'      => array(
									'sections' => array( 'filter', 'link', 'link_style', 'link_fonts' ),
									'fields'   => array( 'yelp_business_id', 'google_place_id', 'total_reviews_count', 'transient_time' ),
								),
							),
						),
						'google_place_id'  => array(
							'type'        => 'text',
							'label'       => __( 'Google Place ID', 'bb-powerpack' ),
							'default'     => '',
							'description' => sprintf( __( '<a href="%s" target="_blank"><em>Click here</em></a> to get your Google Place ID.', 'bb-powerpack' ), 'https://developers.google.com/places/place-id' ),
							'connections' => array( 'string' ),
						),
						'yelp_business_id' => array(
							'type'        => 'text',
							'label'       => __( 'Yelp Business ID', 'bb-powerpack' ),
							'default'     => '',
							'description' => sprintf( __( '<a href="%s" target="_blank"><em>Click here</em></a> to get your Yelp Business ID.', 'bb-powerpack' ), 'https://www.yelp-support.com/article/What-is-my-Yelp-Business-ID' ),
							'connections' => array( 'string' ),
						),
					),
				),
				'reviews_form' => array( // Section.
					'title'  => '', // Section Title.
					'fields' => array( // Section Fields.
						'reviews' => array(
							'type'         => 'form',
							'label'        => __( 'Review', 'bb-powerpack' ),
							'form'         => 'pp_reviews_form', // ID from registered form below.
							'preview_text' => 'name', // Name of a field to use for the preview text.
							'multiple'     => true,
							'default'		=> array(
								array(
									'name'	=> __( 'John Doe', 'bb-powerpack' ),
									'title'	=> __( 'Customer', 'bb-powerpack' ),
									'rating' => '5',
									'review' => __( 'Proin eget tortor risus. Nulla quis lorem ut libero malesuada feugiat. Proin eget tortor risus.', 'bb-powerpack' ),
								),
								array(
									'name'	=> __( 'John Doe', 'bb-powerpack' ),
									'title'	=> __( 'Customer', 'bb-powerpack' ),
									'rating' => '4',
									'review' => __( 'Vivamus magna justo, lacinia eget consectetur sed, convallis at tellus. Proin eget tortor risus.', 'bb-powerpack' ),
								),
								array(
									'name'	=> __( 'John Doe', 'bb-powerpack' ),
									'title'	=> __( 'Customer', 'bb-powerpack' ),
									'rating' => '5',
									'review' => __( 'Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Nulla porttitor accumsan tincidunt.', 'bb-powerpack' ),
								),
							),
						),
					),
				),
			),
		),
		'settings'   => array(
			'title'    => __( 'Settings', 'bb-powerpack' ),
			'sections' => array(
				'general'        => array( // Section.
					'title'  => '',
					'fields' => array( // Section Fields.
						'google_reviews_count' => array(
							'type'        => 'unit',
							'label'       => __( 'Number of Reviews', 'bb-powerpack' ),
							'default'     => '3',
							'help' => __( 'Google only serves 5 reviews total over their API.', 'bb-powerpack' ),
							'slider'      => array(
								'min'  => 1,
								'step' => 1,
								'max'  => 5,
							),
						),
						'yelp_reviews_count'  => array(
							'type'        => 'unit',
							'label'       => __( 'Number of Reviews', 'bb-powerpack' ),
							'default'     => '3',
							'help' => __( 'Google only serves 3 reviews total over their API.', 'bb-powerpack' ),
							'slider'      => array(
								'min'  => 1,
								'step' => 1,
								'max'  => 3,
							),
						),
						'total_reviews_count' => array(
							'type'        => 'unit',
							'label'       => __( 'Number of Reviews', 'bb-powerpack' ),
							'default'     => '5',
							'help' => __( 'Google only serves 5 reviews & Yelp only serves 3 reviews total over their API.', 'bb-powerpack' ),
							'slider'      => array(
								'min'  => 1,
								'step' => 1,
								'max'  => 8,
							),
						),
						'show_image'             => array(
							'type'    => 'pp-switch',
							'label'   => __( 'Show Image', 'bb-powerpack' ),
							'default' => 'yes',
							'toggle'  => array(
								'yes' => array(
									'fields' => array( 'autoplay_speed' ),
									'sections' => array( 'image' ),
								),
							),
						),
						'transient_time'   => array(
							'type'    	=> 'unit',
							'label'   	=> __( 'Refresh Reviews after', 'bb-powerpack' ),
							'default' 	=> '24',
							'units'		=> array( 'hrs' ),
						),
					),
				),
				'filter'         => array( // Section.
					'title'     => __( 'Filters', 'bb-powerpack' ), // Section Title.
					'collapsed'	=> true,
					'fields'    => array( // Section Fields.
						'reviews_filter_by'  => array(
							'type'    => 'select',
							'label'   => __( 'Filter By', 'bb-powerpack' ),
							'default' => 'rating',
							'options' => array(
								'default' => __( 'None', 'bb-powerpack' ),
								'rating'  => __( 'Minimum Rating', 'bb-powerpack' ),
								'date'    => __( 'Review Date', 'bb-powerpack' ),
							),
						),
						'reviews_min_rating' => array(
							'type'        => 'select',
							'label'       => __( 'Minimum Rating', 'bb-powerpack' ),
							'default'     => '',
							'help' 		=> __( 'Display reviews of ratings greater than or equal to this.', 'bb-powerpack' ),
							'options'     => array(
								'' 	 => __( 'No Minimum Rating', 'bb-powerpack' ),
								'2'  => __( '2 stars', 'bb-powerpack' ),
								'3'  => __( '3 stars', 'bb-powerpack' ),
								'4'  => __( '4 stars', 'bb-powerpack' ),
								'5'  => __( '5 stars', 'bb-powerpack' ),
							),
						),
					),
				),
				'link' => array(
					'title'     => __( 'Link', 'bb-powerpack' ),
					'collapsed'	=> true,
					'fields'    => array(
						'link_to_review' => array(
							'type'    => 'pp-switch',
							'label'   => __( 'Link to Review', 'bb-powerpack' ),
							'default' => 'no',
							'toggle'  => array(
								'yes' => array(
									'fields' => array( 'content_length' ),
								),
							),
						),
						'link_text' => array(
							'type'    => 'text',
							'label'   => __( 'Link Text', 'bb-powerpack' ),
							'default' => __( 'Read More', 'bb-powerpack' ),
						),
						'content_length' => array(
							'type'  => 'unit',
							'label' => __( 'Content Length', 'bb-powerpack' ),
							'description' => __( 'Please note that Yelp already provides trimmed text.', 'bb-powerpack' ),
							'units' => array( 'words' ),
						),
					),
				),
				'carousel'	=> array(
					'title'		=> __( 'Carousel', 'bb-powerpack' ),
					'collapsed'	=> true,
					'fields'	=> array(
						'carousel_type'        => array(
							'type'    => 'select',
							'label'   => __( 'Type', 'bb-powerpack' ),
							'default' => 'carousel',
							'options' => array(
								'carousel'  => __( 'Carousel', 'bb-powerpack' ),
								'coverflow' => __( 'Coverflow', 'bb-powerpack' ),
							),
							'toggle'  => array(
								'carousel'  => array(
									'fields' => array( 'pagination_type', 'effect' ),
								),
								'coverflow' => array(
									'fields' => array( 'pagination_type', 'columns' ),
								),
							),
						),
						'effect'               => array(
							'type'    => 'select',
							'label'   => __( 'Effect', 'bb-powerpack' ),
							'default' => 'slide',
							'options' => array(
								'slide' => __( 'Slide', 'bb-powerpack' ),
								'fade'  => __( 'Fade', 'bb-powerpack' ),
								'cube'  => __( 'Cube', 'bb-powerpack' ),
							),
							'toggle'  => array(
								'slide' => array(
									'fields' => array( 'columns' ),
								),
							),
						),
						'columns'              => array(
							'type'       => 'unit',
							'label'      => __( 'Slides Per View', 'bb-powerpack' ),
							'default'    => 3,
							'slide'      => true,
							'responsive' => true,
						),
						'slides_to_scroll'     => array(
							'type'       => 'unit',
							'label'      => __( 'Slides to Scroll', 'bb-powerpack' ),
							'default'    => 1,
							'slide'      => true,
							'responsive' => true,
							'help'       => __( 'Set numbers of slides to move at a time.', 'bb-powerpack' ),
						),
						'spacing'              => array(
							'type'       => 'unit',
							'label'      => __( 'Spacing', 'bb-powerpack' ),
							'default'    => 20,
							'units'      => array( 'px' ),
							'slide'      => true,
							'responsive' => true,
						),
						'carousel_height'      => array(
							'type'       => 'unit',
							'label'      => __( 'Height', 'bb-powerpack' ),
							'units'      => array( 'px' ),
							'slide'      => true,
							'responsive' => true,
							'preview'    => array(
								'type'     => 'css',
								'selector' => '.pp-review',
								'property' => 'height',
								'unit'     => 'px',
							),
						),
					),
				),
				'slide_settings' => array(
					'title'     => __( 'Slide Settings', 'bb-powerpack' ),
					'collapsed' => true,
					'fields'    => array(
						'transition_speed'     => array(
							'type'        => 'text',
							'label'       => __( 'Transition Speed', 'bb-powerpack' ),
							'default'     => '1000',
							'size'        => '5',
							'description' => _x( 'ms', 'Value unit for form field of time in mili seconds. Such as: "500 ms"', 'bb-powerpack' ),
						),
						'autoplay'             => array(
							'type'    => 'pp-switch',
							'label'   => __( 'Auto Play', 'bb-powerpack' ),
							'default' => 'yes',
							'options' => array(
								'yes' => __( 'Yes', 'bb-powerpack' ),
								'no'  => __( 'No', 'bb-powerpack' ),
							),
							'toggle'  => array(
								'yes' => array(
									'fields' => array( 'autoplay_speed' ),
								),
							),
						),
						'autoplay_speed'       => array(
							'type'        => 'text',
							'label'       => __( 'Auto Play Speed', 'bb-powerpack' ),
							'default'     => '5000',
							'size'        => '5',
							'description' => _x( 'ms', 'Value unit for form field of time in mili seconds. Such as: "500 ms"', 'bb-powerpack' ),
						),
						'pause_on_interaction' => array(
							'type'    => 'pp-switch',
							'label'   => __( 'Pause on Interaction', 'bb-powerpack' ),
							'default' => 'yes',
							'options' => array(
								'yes' => __( 'Yes', 'bb-powerpack' ),
								'no'  => __( 'No', 'bb-powerpack' ),
							),
						),
						'loop' => array(
							'type'    => 'pp-switch',
							'label'   => __( 'Loop', 'bb-powerpack' ),
							'default' => 'yes',
						),
					),
				),
				'navigation'     => array( // Section.
					'title'     => __( 'Navigation', 'bb-powerpack' ), // Section Title.
					'collapsed' => true,
					'fields'    => array( // Section Fields.
						'slider_navigation' => array(
							'type'    => 'pp-switch',
							'label'   => __( 'Show Navigation Arrows?', 'bb-powerpack' ),
							'default' => 'no',
							'options' => array(
								'yes' => __( 'Yes', 'bb-powerpack' ),
								'no'  => __( 'No', 'bb-powerpack' ),
							),
							'toggle'  => array(
								'yes' => array(
									'sections' => array( 'arrow_style' ),
								),
							),
						),
						'pagination_type'   => array(
							'type'    => 'pp-switch',
							'label'   => __( 'Pagination Type', 'bb-powerpack' ),
							'default' => 'bullets',
							'options' => array(
								'none'     => __( 'None', 'bb-powerpack' ),
								'bullets'  => __( 'Dots', 'bb-powerpack' ),
								'fraction' => __( 'Fraction', 'bb-powerpack' ),
							),
							'toggle'  => array(
								'bullets'  => array(
									'sections' => array( 'pagination_style' ),
									'fields'   => array( 'bullets_width', 'bullets_border_radius' ),
								),
								'fraction' => array(
									'sections' => array( 'pagination_style' ),
								),
							),
						),
					),
				),
			),
		),
		'style'      => array(
			'title'    => __( 'Style', 'bb-powerpack' ),
			'sections' => array(
				'general'          => array(
					'title'     => __( 'Slide', 'bb-powerpack' ),
					'fields'    => array(
						'slide_border'           => array(
							'type'       => 'border',
							'label'      => __( 'Border', 'bb-powerpack' ),
							'responsive' => true,
							'preview'    => array(
								'type'     => 'css',
								'selector' => '.pp-review',
								'property' => 'border',
							),
						),
						'slide_padding'          => array(
							'type'       => 'unit',
							'label'      => __( 'Padding', 'bb-powerpack' ),
							'units'      => array( 'px' ),
							'slider'     => true,
							'responsive' => true,
							'preview'    => array(
								'type'     => 'css',
								'selector' => '.pp-review',
								'property' => 'padding',
								'unit'     => 'px',
							),
						),
						'separator'              => array(
							'type'    => 'pp-switch',
							'label'   => __( 'Separator', 'bb-powerpack' ),
							'default' => 'show',
							'options' => array(
								'show' => __( 'Show', 'bb-powerpack' ),
								'hide' => __( 'Hide', 'bb-powerpack' ),
							),
						),
						'slide_background'       => array(
							'type'        => 'color',
							'label'       => __( 'Background color', 'bb-powerpack' ),
							'preview'     => array(
								'type'     => 'css',
								'selector' => '.pp-review',
								'property' => 'background-color',
							),
							'show_alpha'  => true,
							'show_reset'  => true,
							'connections' => array( 'color' ),
						),
						'slide_background_hover' => array(
							'type'        => 'color',
							'label'       => __( 'Background Hover color', 'bb-powerpack' ),
							'preview'     => array(
								'type'     => 'css',
								'selector' => '.pp-review:hover',
								'property' => 'background-color',
							),
							'show_alpha'  => true,
							'show_reset'  => true,
							'connections' => array( 'color' ),
						),
						'separator_color'        => array(
							'type'        => 'color',
							'label'       => __( 'Separator Color', 'bb-powerpack' ),
							'default'     => '',
							'show_reset'  => true,
							'show_alpha'  => true,
							'connections' => array( 'color' ),
							'preview'     => array(
								'type'     => 'css',
								'selector' => '.pp-review-header',
								'property' => 'border-bottom-color',
							),
						),
						'separator_color_hover'  => array(
							'type'        => 'color',
							'label'       => __( 'Separator Hover Color', 'bb-powerpack' ),
							'show_reset'  => true,
							'show_alpha'  => true,
							'connections' => array( 'color' ),
						),
						'header_position' => array(
							'type'    => 'pp-switch',
							'label'   => __( 'Header Position', 'bb-powerpack' ),
							'default' => 'top',
							'options' => array(
								'top'    => __( 'Top', 'bb-powerpack' ),
								'bottom' => __( 'Bottom', 'bb-powerpack' ),
							),
						),
					),
				),
				'name_style' => array(
					'title'	 => __( 'Name', 'bb-powerpack' ),
					'collapsed' => true,
					'fields' => array(
						'name_color'         => array(
							'type'        => 'color',
							'label'       => __( 'Color', 'bb-powerpack' ),
							'show_reset'  => true,
							'connections' => array( 'color' ),
							'preview'     => array(
								'type'     => 'css',
								'selector' => '.pp-review-name',
								'property' => 'color',
							),
						),
						'name_margin_top'    => array(
							'type'    => 'unit',
							'label'   => __( 'Top Margin', 'bb-powerpack' ),
							'units'   => array( 'px' ),
							'default' => '',
							'slider'	=> true,
							'preview' => array(
								'type'     => 'css',
								'selector' => '.pp-review-name',
								'property' => 'margin-top',
								'unit'     => 'px',
							),
						),
						'name_margin_bottom' => array(
							'type'    => 'unit',
							'label'   => __( 'Bottom Margin', 'bb-powerpack' ),
							'units'   => array( 'px' ),
							'default' => '',
							'slider'	=> true,
							'preview' => array(
								'type'     => 'css',
								'selector' => '.pp-review-name',
								'property' => 'margin-bottom',
								'unit'     => 'px',
							),
						),
					),
				),
				'title_style' => array(
					'title'		=> __( 'Title', 'bb-powerpack' ),
					'collapsed' => true,
					'fields'	=> array(
						'title_color'         => array(
							'type'        => 'color',
							'label'       => __( 'Color', 'bb-powerpack' ),
							'show_reset'  => true,
							'connections' => array( 'color' ),
							'preview'     => array(
								'type'     => 'css',
								'selector' => '.pp-review-title',
								'property' => 'color',
							),
						),
						'title_margin_top'    => array(
							'type'    => 'unit',
							'label'   => __( 'Top Margin', 'bb-powerpack' ),
							'units'   => array( 'px' ),
							'default' => '',
							'slider'	=> true,
							'preview' => array(
								'type'     => 'css',
								'selector' => '.pp-review-title',
								'property' => 'margin-top',
								'unit'     => 'px',
							),
						),
						'title_margin_bottom' => array(
							'type'    => 'unit',
							'label'   => __( 'Bottom Margin', 'bb-powerpack' ),
							'units'   => array( 'px' ),
							'default' => '',
							'slider'	=> true,
							'preview' => array(
								'type'     => 'css',
								'selector' => '.pp-review-title',
								'property' => 'margin-bottom',
								'unit'     => 'px',
							),
						),
					),
				),
				'review_style'     => array(
					'title'		=> __( 'Review', 'bb-powerpack' ),
					'collapsed' => true,
					'fields'    => array(
						'content_color'         => array(
							'type'        => 'color',
							'label'       => __( 'Color', 'bb-powerpack' ),
							'show_reset'  => true,
							'connections' => array( 'color' ),
							'preview'     => array(
								'type'     => 'css',
								'selector' => '.pp-review-text',
								'property' => 'color',
							),
						),
						'content_margin_top'    => array(
							'type'    => 'unit',
							'label'   => __( 'Top Margin', 'bb-powerpack' ),
							'units'   => array( 'px' ),
							'default' => '',
							'slider'	=> true,
							'preview' => array(
								'type'     => 'css',
								'selector' => '.pp-review-text',
								'property' => 'margin-top',
								'unit'     => 'px',
							),
						),
						'content_margin_bottom' => array(
							'type'    => 'unit',
							'label'   => __( 'Bottom Margin', 'bb-powerpack' ),
							'units'   => array( 'px' ),
							'default' => '',
							'slider'	=> true,
							'preview' => array(
								'type'     => 'css',
								'selector' => '.pp-review-text',
								'property' => 'margin-bottom',
								'unit'     => 'px',
							),
						),
					),
				),
				'link_style' => array(
					'title'     => __( 'Link', 'bb-powerpack' ),
					'collapsed' => true,
					'fields'    => array(
						'link_color' => array(
							'type'        => 'color',
							'label'       => __( 'Color', 'bb-powerpack' ),
							'show_reset'  => true,
							'connections' => array( 'color' ),
							'preview'     => array(
								'type'     => 'css',
								'selector' => '.pp-review-link a',
								'property' => 'color',
							),
						),
						'link_hover_color' => array(
							'type'        => 'color',
							'label'       => __( 'Hover Color', 'bb-powerpack' ),
							'show_reset'  => true,
							'connections' => array( 'color' ),
							'preview'     => array(
								'type'     => 'css',
								'selector' => '.pp-review-link a:hover',
								'property' => 'color',
							),
						),
					),
				),
				'image'      => array(
					'title'  => __( 'Image', 'bb-powerpack' ),
					'collapsed' => true,
					'fields' => array(
						'image_size'    => array(
							'type'       => 'unit',
							'label'      => __( 'Size', 'bb-powerpack' ),
							'units'      => array( 'px' ),
							'default'    => 36,
							'slider'     => true,
							'responsive' => true,
							'preview'    => array(
								'type'  => 'css',
								'rules' => array(
									array(
										'selector' => '.pp-review-image img',
										'property' => 'height',
										'unit'     => 'px',
									),
									array(
										'selector' => '.pp-review-image img',
										'property' => 'width',
										'unit'     => 'px',
									),
								),
							),
						),
						'image_border'  => array(
							'type'       => 'border',
							'label'      => __( 'Border', 'bb-powerpack' ),
							'responsive' => true,
							'preview'    => array(
								'type'     => 'css',
								'selector' => '.pp-review-image img',
								'property' => 'border',
							),
						),
						'image_vertical_alignment'	=> array(
							'type'    => 'select',
							'label'   => __( 'Vertical Alignment', 'bb-powerpack' ),
							'default' => 'top',
							'options' => array(
								'flex-start'   	=> __( 'Top', 'bb-powerpack' ),
								'center' 	=> __( 'Middle', 'bb-powerpack' ),
								'flex-end' 	=> __( 'Bottom', 'bb-powerpack' ),
							),
							'preview' => array(
								'type'     => 'css',
								'selector' => '.pp-review-image',
								'property' => 'align-self',
							),
						),
						'image_spacing' => array(
							'type'       => 'unit',
							'label'      => __( 'Spacing', 'bb-powerpack' ),
							'default'	=> '10',
							'units'      => array( 'px' ),
							'slider'     => true,
							'responsive' => true,
							'preview'    => array(
								'type'     => 'css',
								'selector' => '.pp-review-cite',
								'property' => 'margin-left',
								'unit'     => 'px',
							),
						),
					),
				),
				'icon'       => array(
					'title'  => __( 'Icon', 'bb-powerpack' ),
					'collapsed' => true,
					'fields' => array(
						'icon_size' => array(
							'type'    => 'unit',
							'label'   => __( 'Size', 'bb-powerpack' ),
							'default' => '',
							'units'   => array( 'px' ),
							'slider'  => true,
							'preview' => array(
								'type'     => 'css',
								'selector' => '.pp-review-icon i, .pp-review-icon i:before',
								'property' => 'font-size',
								'unit'     => 'px',
							),
						),
						'icon_spacing' => array(
							'type'       => 'unit',
							'label'      => __( 'Spacing', 'bb-powerpack' ),
							'units'      => array( 'px' ),
							'slider'     => true,
							'responsive' => true,
							'preview'    => array(
								'type'     => 'css',
								'selector' => '.pp-review-icon',
								'property' => 'margin-left',
								'unit'     => 'px',
							),
						),
						'icon_vertical_alignment'	=> array(
							'type'    => 'select',
							'label'   => __( 'Vertical Alignment', 'bb-powerpack' ),
							'default' => 'top',
							'options' => array(
								'flex-start'   	=> __( 'Top', 'bb-powerpack' ),
								'center' 	=> __( 'Middle', 'bb-powerpack' ),
								'flex-end' 	=> __( 'Bottom', 'bb-powerpack' ),
							),
							'preview' => array(
								'type'     => 'css',
								'selector' => '.pp-review-icon',
								'property' => 'align-self',
							),
						),
						'icon_color'          => array(
							'type'       => 'color',
							'label'      => __( 'Color', 'bb-powerpack' ),
							'default'    => '',
							'show_reset' => true,
							'show_alpha' => true,
							'preview'    => array(
								'type'     => 'css',
								'selector' => '.pp-review-icon i',
								'property' => 'color',

							),
							'connections' => array( 'color' ),
						),
						'icon_color_hover'          => array(
							'type'       => 'color',
							'label'      => __( 'Hover Color', 'bb-powerpack' ),
							'default'    => '',
							'show_reset' => true,
							'show_alpha' => true,
							'preview'    => array(
								'type'     => 'css',
								'selector' => '.pp-review:hover .pp-review-icon i',
								'property' => 'color',

							),
							'connections' => array( 'color' ),
						),
					),
				),
				'rating_section'     => array(
					'title'  => __( 'Rating', 'bb-powerpack' ),
					'collapsed' => true,
					'fields' => array(
						'star_style'          => array(
							'type'    => 'pp-switch',
							'label'   => __( 'Style', 'bb-powerpack' ),
							'default' => 'solid',
							'options' => array(
								'solid'   => __( 'Solid', 'bb-powerpack' ),
								'outline' => __( 'Outline', 'bb-powerpack' ),
							),
						),
						'star_size'           => array(
							'type'    => 'unit',
							'label'   => __( 'Size', 'bb-powerpack' ),
							'default' => '',
							'responsive'  => 'true',
							'preview' => array(
								'type'     => 'css',
								'selector' => '.pp-rating i',
								'property' => 'font-size',
								'unit'     => 'px',
							),
							'slider'  => true,
						),
						'star_color'          => array(
							'type'       => 'color',
							'label'      => __( 'Color', 'bb-powerpack' ),
							'default'    => 'f0ad4e',
							'show_reset' => true,
							'show_alpha' => true,
							'preview'    => array(
								'type'     => 'css',
								'selector' => '.pp-rating > i:before',
								'property' => 'color',

							),
						),
						'star_unmarked_color' => array(
							'type'       => 'color',
							'label'      => __( 'Unmarked Color', 'bb-powerpack' ),
							'default'    => 'efecdc',
							'show_reset' => true,
							'show_alpha' => true,
							'preview'    => array(
								'type'     => 'css',
								'selector' => '.pp-rating > i',
								'property' => 'color',

							),
						),
						'star_spacing'        => array(
							'type'        => 'unit',
							'label'       => __( 'Spacing', 'bb-powerpack' ),
							'default'     => '',
							'units' 	=> array( 'px' ),
							'slider'      => 'true',
							'responsive'  => 'true',
							'preview'     => array(
								'type'     => 'css',
								'selector' => '.pp-rating > i',
								'property' => 'margin-right',
								'unit'     => 'px',
							),
						),
						'star_alignment'      => array(
							'type'    => 'align',
							'label'   => __( 'Alignment', 'bb-powerpack' ),
							'default' => 'left',
							'preview' => array(
								'type'     => 'css',
								'selector' => '.pp-rating',
								'property' => 'text-align',
							),
						),
					),
				),
				'arrow_style'      => array( // Section.
					'title'  => __( 'Arrow', 'bb-powerpack' ), // Section Title.
					'collapsed' => true,
					'fields' => array( // Section Fields.
						'arrow_font_size'          => array(
							'type'    => 'unit',
							'label'   => __( 'Size', 'bb-powerpack' ),
							'units'   => array( 'px' ),
							'slider'  => true,
						),
						'arrow_bg_color'           => array(
							'type'        => 'color',
							'label'       => __( 'Background Color', 'bb-powerpack' ),
							'show_reset'  => true,
							'show_alpha'  => true,
							'default'     => '',
							'connections' => array( 'color' ),
						),
						'arrow_bg_hover'           => array(
							'type'        => 'color',
							'label'       => __( 'Background Hover Color', 'bb-powerpack' ),
							'show_reset'  => true,
							'show_alpha'  => true,
							'default'     => '',
							'connections' => array( 'color' ),
						),
						'arrow_color'              => array(
							'type'        => 'color',
							'label'       => __( 'Color', 'bb-powerpack' ),
							'show_reset'  => true,
							'default'     => '000000',
							'connections' => array( 'color' ),
						),
						'arrow_color_hover'        => array(
							'type'        => 'color',
							'label'       => __( 'Hover Color', 'bb-powerpack' ),
							'show_reset'  => true,
							'default'     => '',
							'connections' => array( 'color' ),
						),
						'arrow_border'             => array(
							'type'       => 'border',
							'label'      => __( 'Border', 'bb-powerpack' ),
							'responsive' => true,
							'preview'    => array(
								'type'     => 'css',
								'selector' => '.pp-swiper-button',
								'property' => 'border',
							),
						),
						'arrow_border_hover'       => array(
							'type'        => 'color',
							'label'       => __( 'Border Hover Color', 'bb-powerpack' ),
							'show_reset'  => true,
							'default'     => '',
							'connections' => array( 'color' ),
						),
						'arrow_horizontal_padding' => array(
							'type'    => 'unit',
							'label'   => __( 'Horizontal Padding', 'bb-powerpack' ),
							'default' => '13',
							'units'   => array( 'px' ),
							'slider'  => true,
							'preview' => array(
								'type'  => 'css',
								'rules' => array(
									array(
										'selector' => '.pp-swiper-button',
										'property' => 'padding-left',
										'unit'     => 'px',
									),
									array(
										'selector' => '.pp-swiper-button',
										'property' => 'padding-right',
										'unit'     => 'px',
									),
								),
							),
						),
						'arrow_vertical_padding'   => array(
							'type'    => 'unit',
							'label'   => __( 'Vertical Padding', 'bb-powerpack' ),
							'default' => '5',
							'units'   => array( 'px' ),
							'slider'  => true,
							'preview' => array(
								'type'  => 'css',
								'rules' => array(
									array(
										'selector' => '.pp-swiper-button',
										'property' => 'padding-top',
										'unit'     => 'px',
									),
									array(
										'selector' => '.pp-swiper-button',
										'property' => 'padding-bottom',
										'unit'     => 'px',
									),
								),
							),
						),
						'arrow_spacing'            => array(
							'type'    => 'unit',
							'label'   => __( 'Spacing', 'bb-powerpack' ),
							'default' => '',
							'slider'  => true,
						),
						'arrow_opacity'            => array(
							'type'    => 'unit',
							'label'   => __( 'Opacity', 'bb-powerpack' ),
							'default' => '1',
							'slider'  => array(
								'min'  => 0,
								'max'  => 1,
								'step' => .1,
							),
						),
					),
				),
				'pagination_style' => array(
					'title'  => __( 'Pagination', 'bb-powerpack' ),
					'collapsed' => true,
					'fields' => array(
						'pagination_bg_color'   => array(
							'type'        => 'color',
							'label'       => __( 'Color', 'bb-powerpack' ),
							'default'     => '999999',
							'show_reset'  => true,
							'show_alpha'  => true,
							'connections' => array( 'color' ),
							'preview'     => array(
								'type'     => 'css',
								'selector' => '.pp-reviews-swiper .swiper-pagination-bullet',
								'property' => 'background-color',
							),
						),
						'pagination_bg_hover'   => array(
							'type'        => 'color',
							'label'       => __( 'Active Color', 'bb-powerpack' ),
							'default'     => '000000',
							'show_reset'  => true,
							'show_alpha'  => true,
							'connections' => array( 'color' ),
							'preview'     => array(
								'type'     => 'css',
								'selector' => '.pp-reviews-swiper .swiper-pagination-bullet:hover, .pp-reviews-swiper .swiper-pagination-bullet-active',
								'property' => 'background',
							),
						),
						'bullets_width'         => array(
							'type'    => 'unit',
							'label'   => __( 'Size', 'bb-powerpack' ),
							'default' => '10',
							'units'   => array( 'px' ),
							'slider'  => true,
							'preview' => array(
								'type'  => 'css',
								'rules' => array(
									array(
										'selector' => '.pp-reviews-swiper .swiper-pagination-bullet',
										'property' => 'width',
										'unit'     => 'px',
									),
									array(
										'selector' => '.pp-reviews-swiper .swiper-pagination-bullet',
										'property' => 'height',
										'unit'     => 'px',
									),
								),
							),
						),
						'bullets_border_radius' => array(
							'type'    => 'unit',
							'label'   => __( 'Border Radius', 'bb-powerpack' ),
							'default' => '100',
							'units'   => array( 'px' ),
							'slider'  => true,
							'preview' => array(
								'type'     => 'css',
								'selector' => '.pp-reviews-swiper .swiper-pagination-bullet',
								'property' => 'border-radius',
								'unit'     => 'px',
							),
						),
						'bullets_spacing'      => array(
							'type'       => 'unit',
							'label'      => __( 'Spacing', 'bb-powerpack' ),
							'default'    => '5',
							'units'      => array( 'px' ),
							'slider'     => true,
							'responsive' => true,
							'preview'    => array(
								'type'  => 'css',
								'rules' => array(
									array(
										'selector' => '.swiper-pagination-bullets .swiper-pagination-bullet',
										'property' => 'margin-left',
										'unit'     => 'px !important',
									),
									array(
										'selector' => '.swiper-pagination-bullets .swiper-pagination-bullet',
										'property' => 'margin-right',
										'unit'     => 'px !important',
									),
								),
							),
						),
						'bullets_top_margin' => array(
							'type'       => 'unit',
							'label'      => __( 'Top Margin', 'bb-powerpack' ),
							'default'    => '5',
							'units'      => array( 'px' ),
							'slider'     => true,
							'responsive' => true,
							'preview'    => array(
								'type'     => 'css',
								'selector' => '.swiper-pagination',
								'property' => 'margin-top',
								'unit'     => 'px',
							),
						),
					),
				),
			),
		),
		'typography' => array(
			'title'    => __( 'Typography', 'bb-powerpack' ),
			'sections' => array(
				'name_fonts'   => array(
					'title'  => __( 'Name', 'bb-powerpack' ),
					'collapsed' => true,
					'fields' => array(
						'name_typography' => array(
							'type'       => 'typography',
							'label'      => __( 'Typography', 'bb-powerpack' ),
							'responsive' => true,
							'preview'    => array(
								'type'     => 'css',
								'selector' => '.pp-review-name',
							),
						),
					),
				),
				'title_fonts'  => array(
					'title'  => __( 'Title', 'bb-powerpack' ),
					'collapsed' => true,
					'fields' => array(
						'title_typography' => array(
							'type'       => 'typography',
							'label'      => __( 'Typography', 'bb-powerpack' ),
							'responsive' => true,
							'preview'    => array(
								'type'     => 'css',
								'selector' => '.pp-review-title',
							),
						),
					),
				),
				'review_fonts' => array(
					'title'     => __( 'Review', 'bb-powerpack' ),
					'collapsed' => true,
					'fields'    => array(
						'content_typography' => array(
							'type'       => 'typography',
							'label'      => __( 'Typography', 'bb-powerpack' ),
							'responsive' => true,
							'preview'    => array(
								'type'     => 'css',
								'selector' => '.pp-review-text',
							),
						),
					),
				),
				'link_fonts' => array(
					'title'     => __( 'Link', 'bb-powerpack' ),
					'collapsed' => true,
					'fields'    => array(
						'link_typography' => array(
							'type'       => 'typography',
							'label'      => __( 'Typography', 'bb-powerpack' ),
							'responsive' => true,
							'preview'    => array(
								'type'     => 'css',
								'selector' => '.pp-review-link a',
							),
						),
					),
				),
			),
		),
	)
);


/**
 * Register a settings form to use in the "form" field type above.
 */
FLBuilder::register_settings_form(
	'pp_reviews_form',
	array(
		'title' => __( 'Add Review', 'bb-powerpack' ),
		'tabs'  => array(
			'general'     => array( // Tab.
				'title'    => __( 'General', 'bb-powerpack' ), // Tab title.
				'sections' => array( // Tab Section.
					'review_fields' => array(
						'title'  => '',
						'fields' => array(
							'image'  => array(
								'type'        => 'photo',
								'label'       => __( 'Image', 'bb-powerpack' ),
								'show_remove' => true,
								'connections' => array( 'photo' ),
							),
							'name'   => array(
								'type'        => 'text',
								'label'       => __( 'Name', 'bb-powerpack' ),
								'connections' => array( 'string', 'html', 'url' ),
							),
							'title'  => array(
								'type'        => 'text',
								'label'       => __( 'Title', 'bb-powerpack' ),
								'connections' => array( 'string', 'html', 'url' ),
							),
							'rating' => array(
								'type'    => 'unit',
								'label'   => __( 'Rating', 'bb-powerpack' ),
								'default' => '',
							),
							'icon'   => array(
								'type'        => 'icon',
								'label'       => __( 'Icon', 'bb-powerpack' ),
								'show_remove' => true,
								'default'	=> 'fas fa-quote-right'
							),
							'review' => array(
								'type'        => 'editor',
								'label'       => __( 'Review', 'bb-powerpack' ),
								'connections' => array( 'string', 'html', 'url' ),
							),

						),
					),
				),
			),
			'review_styles' => array(
				'title'    => __( 'Style', 'bb-powerpack' ),
				'sections' => array(
					'styles'    => array(
						'title'  => '',
						'fields' => array(
							'slide_background'       => array(
								'type'        => 'color',
								'label'       => __( 'Background color', 'bb-powerpack' ),
								'preview'     => array(
									'type'     => 'css',
									'selector' => '.pp-review',
									'property' => 'background-color',
								),
								'show_alpha'  => true,
								'show_reset'  => true,
								'connections' => array( 'color' ),
							),
							'slide_background_hover' => array(
								'type'        => 'color',
								'label'       => __( 'Background Hover Color', 'bb-powerpack' ),
								'preview'     => array(
									'type'     => 'css',
									'selector' => '.pp-review:hover',
									'property' => 'background-color',
								),
								'show_alpha'  => true,
								'show_reset'  => true,
								'connections' => array( 'color' ),
							),
						),
					),
					'separator' => array(
						'title'  => 'Separator',
						'fields' => array(
							'separator_color'       => array(
								'type'        => 'color',
								'label'       => __( 'Color', 'bb-powerpack' ),
								'default'     => '',
								'show_reset'  => true,
								'show_alpha'  => true,
								'connections' => array( 'color' ),
								'preview'     => array(
									'type'     => 'css',
									'selector' => '.pp-review-header',
									'property' => 'border-bottom-color',
								),
							),
							'separator_color_hover' => array(
								'type'        => 'color',
								'label'       => __( 'Hover Color', 'bb-powerpack' ),
								'show_reset'  => true,
								'show_alpha'  => true,
								'connections' => array( 'color' ),
							),
						),
					),
					'icon'      => array(
						'title'  => 'Icon',
						'fields' => array(
							'icon_color'       => array(
								'type'        => 'color',
								'label'       => __( 'Color', 'bb-powerpack' ),
								'default'     => '',
								'show_alpha'  => true,
								'show_reset'  => true,
								'connections' => array( 'color' ),
								'preview'     => array(
									'type'     => 'css',
									'selector' => '.pp-review-icon',
									'property' => 'color',
								),
							),
							'icon_color_hover' => array(
								'type'        => 'color',
								'label'       => __( 'Hover Color', 'bb-powerpack' ),
								'show_alpha'  => true,
								'show_reset'  => true,
								'connections' => array( 'color' ),
							),
						),
					),
					'name'      => array(
						'title'  => 'Name',
						'fields' => array(
							'name_color'       => array(
								'type'        => 'color',
								'label'       => __( 'Name Color', 'bb-powerpack' ),
								'default'     => '',
								'show_alpha'  => true,
								'show_reset'  => true,
								'connections' => array( 'color' ),
								'preview'     => array(
									'type'     => 'css',
									'selector' => '.pp-review-name',
									'property' => 'color',
								),
							),
							'name_color_hover' => array(
								'type'        => 'color',
								'label'       => __( 'Name Hover Color', 'bb-powerpack' ),
								'show_alpha'  => true,
								'show_reset'  => true,
								'connections' => array( 'color' ),
							),
						),
					),
					'title'     => array(
						'title'  => 'Title',
						'fields' => array(
							'title_color'       => array(
								'type'        => 'color',
								'label'       => __( 'Color', 'bb-powerpack' ),
								'default'     => '',
								'show_alpha'  => true,
								'show_reset'  => true,
								'connections' => array( 'color' ),
								'preview'     => array(
									'type'     => 'css',
									'selector' => '.pp-review-title',
									'property' => 'color',
								),
							),
							'title_color_hover' => array(
								'type'        => 'color',
								'label'       => __( 'Hover Color', 'bb-powerpack' ),
								'show_alpha'  => true,
								'show_reset'  => true,
								'connections' => array( 'color' ),
							),
						),
					),
					'content'   => array(
						'title'  => __( 'Content', 'bb-powerpack' ),
						'fields' => array(
							'content_color'       => array(
								'type'        => 'color',
								'label'       => __( 'Color', 'bb-powerpack' ),
								'default'     => '',
								'show_alpha'  => true,
								'show_reset'  => true,
								'connections' => array( 'color' ),
								'preview'     => array(
									'type'     => 'css',
									'selector' => '.pp-review-title',
									'property' => 'color',
								),
							),
							'content_color_hover' => array(
								'type'        => 'color',
								'label'       => __( 'Hover Color', 'bb-powerpack' ),
								'show_alpha'  => true,
								'show_reset'  => true,
								'connections' => array( 'color' ),
							),
						),
					),
				),
			),
		),
	)
);