<?php
/**
 * Elementor Pro widget catalog data.
 *
 * Harvested from the Pro convenience-tool registrations in class-widget-abilities.php.
 * Plain data — see EMCP_Tools_Widget_Catalog for the read API.
 *
 * @package EMCP_Tools
 * @since   3.0.0
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

return array(
	'form' => array(
		'tier'     => 'pro',
		'title'    => 'Form',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Contact and lead-capture forms with configurable field types, submit actions (email, redirect, webhook, integrations), and full button styling.',
		'keywords' => array( 'form', 'contact', 'lead', 'input', 'submit' ),
		'params'   => array(
			'form_name'                     => array( 'type' => 'string', 'description' => 'Form name.' ),
			'form_fields'                   => array(
				'type'        => 'array',
				'description' => 'Array of field definitions.',
				'items'       => array(
					'type'       => 'object',
					'properties' => array(
						'field_type'            => array( 'type' => 'string', 'enum' => array( 'text', 'email', 'textarea', 'url', 'tel', 'select', 'radio', 'checkbox', 'number', 'date', 'time', 'upload', 'acceptance', 'password', 'html', 'hidden', 'step' ) ),
						'field_label'           => array( 'type' => 'string' ),
						'placeholder'           => array( 'type' => 'string' ),
						'required'              => array( 'type' => 'string', 'enum' => array( 'yes', '' ) ),
						'width'                 => array( 'type' => 'string', 'enum' => array( '100', '80', '75', '66', '50', '33', '25', '20' ) ),
						'field_options'         => array( 'type' => 'string' ),
						'field_value'           => array( 'type' => 'string' ),
						'field_html'            => array( 'type' => 'string' ),
						'allow_multiple_upload' => array( 'type' => 'string', 'enum' => array( 'yes', '' ) ),
						'file_sizes'            => array( 'type' => 'integer' ),
						'file_types'            => array( 'type' => 'string' ),
						'acceptance_text'       => array( 'type' => 'string' ),
						'checked_by_default'    => array( 'type' => 'string', 'enum' => array( 'yes', '' ) ),
					),
				),
			),
			'button_text'                   => array( 'type' => 'string', 'description' => 'Submit button text.' ),
			'button_size'                   => array( 'type' => 'string', 'enum' => array( 'xs', 'sm', 'md', 'lg', 'xl' ), 'description' => 'Submit button size.' ),
			'button_width'                  => array( 'type' => 'string', 'enum' => array( '', '100' ), 'description' => 'Full-width button. Set to "100" for full width.' ),
			'button_align'                  => array( 'type' => 'string', 'enum' => array( 'start', 'center', 'end', 'stretch' ), 'description' => 'Button alignment.' ),
			'selected_button_icon'          => array( 'type' => 'object', 'description' => 'Button icon: {value, library}.' ),
			'button_icon_align'             => array( 'type' => 'string', 'enum' => array( 'left', 'right' ), 'description' => 'Button icon position.' ),
			'submit_actions'                => array( 'type' => 'array', 'items' => array( 'type' => 'string' ), 'description' => 'Actions after submit: ["email","redirect","webhook"]. Default: ["email"].' ),
			'email_to'                      => array( 'type' => 'string', 'description' => 'Email recipient.' ),
			'email_subject'                 => array( 'type' => 'string', 'description' => 'Email subject.' ),
			'email_from'                    => array( 'type' => 'string', 'description' => 'Email from address.' ),
			'email_from_name'               => array( 'type' => 'string', 'description' => 'Email from name.' ),
			'email_reply_to'                => array( 'type' => 'string', 'description' => 'Reply-to email (use field shortcode like [field id="email"]).' ),
			'email_content_type'            => array( 'type' => 'string', 'enum' => array( 'html', 'plain' ), 'description' => 'Email content type. Default: html.' ),
			'redirect_to'                   => array( 'type' => 'string', 'description' => 'Redirect URL after submit (requires "redirect" in submit_actions).' ),
			'webhooks'                      => array( 'type' => 'string', 'description' => 'Webhook URL (requires "webhook" in submit_actions).' ),
			'success_message'               => array( 'type' => 'string', 'description' => 'Success message after submit.' ),
			'error_message'                 => array( 'type' => 'string', 'description' => 'Error message on failure.' ),
			'required_field_message'        => array( 'type' => 'string', 'description' => 'Required field validation message.' ),
			'input_size'                    => array( 'type' => 'string', 'enum' => array( 'xs', 'sm', 'md', 'lg', 'xl' ), 'description' => 'Input field size.' ),
			'show_labels'                   => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Show field labels. Default: yes.' ),
			'mark_required'                 => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Show asterisk on required fields. Default: yes.' ),
			'button_background_color'       => array( 'type' => 'string', 'description' => 'Button background color.' ),
			'button_text_color'             => array( 'type' => 'string', 'description' => 'Button text color.' ),
			'button_hover_background_color' => array( 'type' => 'string', 'description' => 'Button hover background color.' ),
			'button_hover_color'            => array( 'type' => 'string', 'description' => 'Button hover text color.' ),
			'button_typography_typography'  => array( 'type' => 'string', 'description' => 'Set to "custom" to enable button typography.' ),
			'button_typography_font_family' => array( 'type' => 'string', 'description' => 'Button font family.' ),
			'button_typography_font_size'   => array( 'type' => 'object', 'description' => 'Button font size: {size, unit}.' ),
			'button_typography_font_weight' => array( 'type' => 'string', 'description' => 'Button font weight.' ),
		),
		'required' => array( 'form_name' ),
		'defaults' => array( 'button_text' => 'Send', 'submit_actions' => array( 'email' ) ),
	),
	'posts' => array(
		'tier'     => 'pro',
		'title'    => 'Posts Grid',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Displays a queryable grid of posts/pages with column count and pagination.',
		'keywords' => array( 'posts', 'grid', 'blog', 'archive', 'query' ),
		'params'   => array(
			'posts_post_type' => array( 'type' => 'string', 'enum' => array( 'post', 'page', 'any' ), 'description' => 'Post type to query.' ),
			'posts_per_page'  => array( 'type' => 'integer', 'description' => 'Number of posts to show.' ),
			'columns'         => array( 'type' => 'integer', 'description' => 'Number of grid columns.' ),
			'pagination_type' => array( 'type' => 'string', 'enum' => array( '', 'numbers', 'prev_next', 'numbers_and_prev_next', 'load_more_on_click' ), 'description' => 'Pagination type.' ),
		),
		'required' => array(),
		'defaults' => array( 'posts_post_type' => 'post', 'posts_per_page' => 6, 'columns' => 3 ),
	),
	'countdown' => array(
		'tier'     => 'pro',
		'title'    => 'Countdown',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Countdown timer in due-date or evergreen mode with custom labels, expire actions, and digit/label styling.',
		'keywords' => array( 'countdown', 'timer', 'clock', 'evergreen', 'deadline' ),
		'params'   => array(
			'countdown_type'                => array( 'type' => 'string', 'enum' => array( 'due_date', 'evergreen' ), 'description' => 'Countdown mode.' ),
			'due_date'                      => array( 'type' => 'string', 'description' => 'Due date in Y-m-d H:i format.' ),
			'evergreen_counter_hours'       => array( 'type' => 'integer', 'description' => 'Evergreen hours.' ),
			'evergreen_counter_minutes'     => array( 'type' => 'integer', 'description' => 'Evergreen minutes.' ),
			'show_days'                     => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Show days.' ),
			'show_hours'                    => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Show hours.' ),
			'show_minutes'                  => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Show minutes.' ),
			'show_seconds'                  => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Show seconds.' ),
			'show_labels'                   => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Show labels. Default: yes.' ),
			'custom_labels'                 => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Use custom label text.' ),
			'label_days'                    => array( 'type' => 'string', 'description' => 'Custom days label.' ),
			'label_hours'                   => array( 'type' => 'string', 'description' => 'Custom hours label.' ),
			'label_minutes'                 => array( 'type' => 'string', 'description' => 'Custom minutes label.' ),
			'label_seconds'                 => array( 'type' => 'string', 'description' => 'Custom seconds label.' ),
			'expire_actions'                => array( 'type' => 'array', 'items' => array( 'type' => 'string' ), 'description' => 'Actions on expiry: ["hide","redirect","message"].' ),
			'message_after_expire'          => array( 'type' => 'string', 'description' => 'Message to show after expire.' ),
			'expire_redirect_url'           => array( 'type' => 'string', 'description' => 'Redirect URL after expire.' ),
			'digits_color'                  => array( 'type' => 'string', 'description' => 'Digit text color.' ),
			'digits_background_color'       => array( 'type' => 'string', 'description' => 'Digit background color.' ),
			'label_color'                   => array( 'type' => 'string', 'description' => 'Label text color.' ),
			'digits_typography_typography'  => array( 'type' => 'string', 'description' => 'Set to "custom" for digit typography.' ),
			'digits_typography_font_family' => array( 'type' => 'string', 'description' => 'Digit font family.' ),
			'digits_typography_font_size'   => array( 'type' => 'object', 'description' => 'Digit font size: {size, unit}.' ),
			'label_typography_typography'   => array( 'type' => 'string', 'description' => 'Set to "custom" for label typography.' ),
			'label_typography_font_family'  => array( 'type' => 'string', 'description' => 'Label font family.' ),
			'label_typography_font_size'    => array( 'type' => 'object', 'description' => 'Label font size: {size, unit}.' ),
		),
		'required' => array(),
		'defaults' => array(
			'countdown_type' => 'due_date',
			'show_days'      => 'yes',
			'show_hours'     => 'yes',
			'show_minutes'   => 'yes',
			'show_seconds'   => 'yes',
			'show_labels'    => 'yes',
		),
	),
	'price-table' => array(
		'tier'     => 'pro',
		'title'    => 'Price Table',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Pricing plan table with currency, sale price, feature list, ribbon, CTA button, and full styling.',
		'keywords' => array( 'price', 'pricing', 'table', 'plan', 'subscription' ),
		'params'   => array(
			'heading'                       => array( 'type' => 'string', 'description' => 'Plan name/heading.' ),
			'sub_heading'                   => array( 'type' => 'string', 'description' => 'Sub-heading text.' ),
			'currency_symbol'               => array( 'type' => 'string', 'enum' => array( 'dollar', 'euro', 'baht', 'franc', 'krona', 'lira', 'peseta', 'peso', 'pound', 'real', 'ruble', 'rupee', 'indian_rupee', 'shekel', 'won', 'yen', 'custom' ), 'description' => 'Currency symbol preset.' ),
			'currency_symbol_custom'        => array( 'type' => 'string', 'description' => 'Custom currency symbol (when currency_symbol=custom).' ),
			'price'                         => array( 'type' => 'string', 'description' => 'Price amount.' ),
			'currency_format'               => array( 'type' => 'string', 'enum' => array( '', ',', '.' ), 'description' => 'Price format: comma or dot separator.' ),
			'period'                        => array( 'type' => 'string', 'description' => 'Billing period (e.g. "/month").' ),
			'sale'                          => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Enable sale pricing.' ),
			'original_price'                => array( 'type' => 'string', 'description' => 'Original price (shown crossed out when sale=yes).' ),
			'features_list'                 => array(
				'type'        => 'array',
				'description' => 'Feature list. Each item: {item_text, selected_item_icon, item_icon_color}.',
				'items'       => array(
					'type'       => 'object',
					'properties' => array(
						'item_text'          => array( 'type' => 'string' ),
						'selected_item_icon' => array( 'type' => 'object' ),
						'item_icon_color'    => array( 'type' => 'string' ),
					),
				),
			),
			'button_text'                   => array( 'type' => 'string', 'description' => 'CTA button text.' ),
			'link'                          => array( 'type' => 'object', 'description' => 'Button link: {url, is_external, nofollow}.' ),
			'button_css_id'                 => array( 'type' => 'string', 'description' => 'Button CSS ID for tracking.' ),
			'button_size'                   => array( 'type' => 'string', 'enum' => array( 'xs', 'sm', 'md', 'lg', 'xl' ), 'description' => 'Button size.' ),
			'footer_additional_info'        => array( 'type' => 'string', 'description' => 'Footer text below button (e.g. "30-day money back").' ),
			'show_ribbon'                   => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Show ribbon/badge.' ),
			'ribbon_title'                  => array( 'type' => 'string', 'description' => 'Ribbon text (e.g. "Popular", "Best Value").' ),
			'ribbon_horizontal_position'    => array( 'type' => 'string', 'enum' => array( 'left', 'right' ), 'description' => 'Ribbon position.' ),
			'header_bg_color'               => array( 'type' => 'string', 'description' => 'Header background color.' ),
			'heading_color'                 => array( 'type' => 'string', 'description' => 'Heading text color.' ),
			'sub_heading_color'             => array( 'type' => 'string', 'description' => 'Sub-heading text color.' ),
			'pricing_element_bg_color'      => array( 'type' => 'string', 'description' => 'Pricing area background color.' ),
			'price_color'                   => array( 'type' => 'string', 'description' => 'Price text color.' ),
			'button_background_color'       => array( 'type' => 'string', 'description' => 'Button background color.' ),
			'button_text_color'             => array( 'type' => 'string', 'description' => 'Button text color.' ),
			'button_hover_background_color' => array( 'type' => 'string', 'description' => 'Button hover background color.' ),
			'button_hover_color'            => array( 'type' => 'string', 'description' => 'Button hover text color.' ),
			'ribbon_bg_color'               => array( 'type' => 'string', 'description' => 'Ribbon background color.' ),
			'ribbon_text_color'             => array( 'type' => 'string', 'description' => 'Ribbon text color.' ),
		),
		'required' => array( 'heading', 'price' ),
		'defaults' => array( 'currency_symbol' => 'dollar', 'button_text' => 'Get Started' ),
	),
	'flip-box' => array(
		'tier'     => 'pro',
		'title'    => 'Flip Box',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Two-sided card that flips on hover, each side with graphic, title, description, and colors.',
		'keywords' => array( 'flip', 'box', 'card', 'hover', 'flipbox' ),
		'params'   => array(
			'title_text_a'            => array( 'type' => 'string', 'description' => 'Front side title.' ),
			'description_text_a'      => array( 'type' => 'string', 'description' => 'Front side description.' ),
			'title_text_b'            => array( 'type' => 'string', 'description' => 'Back side title.' ),
			'description_text_b'      => array( 'type' => 'string', 'description' => 'Back side description.' ),
			'graphic_element'         => array( 'type' => 'string', 'enum' => array( 'none', 'image', 'icon' ), 'description' => 'Front graphic type.' ),
			'selected_icon'           => array( 'type' => 'object', 'description' => 'Front icon: {value, library}.' ),
			'image'                   => array( 'type' => 'object', 'description' => 'Front image: {url, id}.' ),
			'graphic_element_b'       => array( 'type' => 'string', 'enum' => array( 'none', 'image', 'icon' ), 'description' => 'Back graphic type.' ),
			'selected_icon_b'         => array( 'type' => 'object', 'description' => 'Back icon: {value, library}.' ),
			'button_text'             => array( 'type' => 'string', 'description' => 'Back button text.' ),
			'link'                    => array( 'type' => 'object', 'description' => 'Link: {url, is_external, nofollow}.' ),
			'flip_effect'             => array( 'type' => 'string', 'enum' => array( 'flip', 'slide', 'push', 'zoom-in', 'zoom-out', 'fade' ), 'description' => 'Flip animation.' ),
			'flip_direction'          => array( 'type' => 'string', 'enum' => array( 'left', 'right', 'up', 'down' ), 'description' => 'Flip direction.' ),
			'flip_3d'                 => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Enable 3D depth effect.' ),
			'height'                  => array( 'type' => 'object', 'description' => 'Box height: {size, unit}.' ),
			'border_radius'           => array( 'type' => 'object', 'description' => 'Border radius: {size, unit}.' ),
			'background_color_a'      => array( 'type' => 'string', 'description' => 'Front background color.' ),
			'title_color_a'           => array( 'type' => 'string', 'description' => 'Front title color.' ),
			'description_color_a'     => array( 'type' => 'string', 'description' => 'Front description color.' ),
			'icon_color_a'            => array( 'type' => 'string', 'description' => 'Front icon color.' ),
			'background_color_b'      => array( 'type' => 'string', 'description' => 'Back background color.' ),
			'title_color_b'           => array( 'type' => 'string', 'description' => 'Back title color.' ),
			'description_color_b'     => array( 'type' => 'string', 'description' => 'Back description color.' ),
			'button_background_color' => array( 'type' => 'string', 'description' => 'Back button background color.' ),
			'button_color'            => array( 'type' => 'string', 'description' => 'Back button text color.' ),
			'button_size'             => array( 'type' => 'string', 'enum' => array( 'xs', 'sm', 'md', 'lg', 'xl' ), 'description' => 'Button size.' ),
		),
		'required' => array( 'title_text_a' ),
		'defaults' => array( 'flip_effect' => 'flip', 'flip_direction' => 'left' ),
	),
	'animated-headline' => array(
		'tier'     => 'pro',
		'title'    => 'Animated Headline',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Eye-catching headline with highlight or rotating-text animation effects.',
		'keywords' => array( 'animated', 'headline', 'rotating', 'highlight', 'heading' ),
		'params'   => array(
			'headline_style'   => array( 'type' => 'string', 'enum' => array( 'highlight', 'rotate' ), 'description' => 'Headline animation style.' ),
			'animation_type'   => array( 'type' => 'string', 'enum' => array( 'typing', 'clip', 'flip', 'swirl', 'blinds', 'drop-in', 'wave', 'slide', 'slide-down' ), 'description' => 'Rotation animation type.' ),
			'marker'           => array( 'type' => 'string', 'enum' => array( 'circle', 'curly', 'underline', 'double', 'double_underline', 'underline_zigzag', 'diagonal', 'strikethrough', 'x' ), 'description' => 'Highlight marker style.' ),
			'before_text'      => array( 'type' => 'string', 'description' => 'Text before animated portion.' ),
			'highlighted_text' => array( 'type' => 'string', 'description' => 'Highlighted text (for highlight style).' ),
			'rotating_text'    => array( 'type' => 'string', 'description' => 'Line-separated rotating text entries.' ),
			'after_text'       => array( 'type' => 'string', 'description' => 'Text after animated portion.' ),
			'tag'              => array( 'type' => 'string', 'enum' => array( 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' ), 'description' => 'HTML heading tag.' ),
		),
		'required' => array(),
		'defaults' => array( 'headline_style' => 'highlight', 'tag' => 'h3' ),
	),
	'call-to-action' => array(
		'tier'     => 'pro',
		'title'    => 'Call to Action',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'CTA block with title, description, button, and optional graphic or ribbon.',
		'keywords' => array( 'cta', 'call', 'action', 'banner', 'conversion' ),
		'params'   => array(
			'title'           => array( 'type' => 'string', 'description' => 'CTA heading text.' ),
			'description'     => array( 'type' => 'string', 'description' => 'CTA description text.' ),
			'button'          => array( 'type' => 'string', 'description' => 'Button text. Default: Click Here.' ),
			'link'            => array( 'type' => 'object', 'description' => 'Button link object with url key.' ),
			'graphic_element' => array( 'type' => 'string', 'enum' => array( 'none', 'image', 'icon' ), 'description' => 'Graphic type.' ),
			'graphic_image'   => array( 'type' => 'object', 'description' => 'Image object with url and optional id.' ),
			'selected_icon'   => array( 'type' => 'object', 'description' => 'Icon object with value and library.' ),
			'ribbon_title'    => array( 'type' => 'string', 'description' => 'Optional ribbon/badge text.' ),
			'title_tag'       => array( 'type' => 'string', 'enum' => array( 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'span', 'p' ), 'description' => 'Title HTML tag. Default: h2.' ),
		),
		'required' => array( 'title' ),
		'defaults' => array( 'title_tag' => 'h2', 'button' => 'Click Here' ),
	),
	'slides' => array(
		'tier'     => 'pro',
		'title'    => 'Slides',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Full-width hero slider with per-slide heading, description, button, background image/overlay, Ken Burns, and navigation.',
		'keywords' => array( 'slides', 'slider', 'hero', 'carousel', 'banner' ),
		'params'   => array(
			'slides'                             => array(
				'type'        => 'array',
				'description' => 'Array of slide items.',
				'items'       => array(
					'type'       => 'object',
					'properties' => array(
						'heading'                  => array( 'type' => 'string' ),
						'description'              => array( 'type' => 'string' ),
						'button_text'              => array( 'type' => 'string' ),
						'link'                     => array( 'type' => 'object' ),
						'background_color'         => array( 'type' => 'string' ),
						'background_image'         => array( 'type' => 'object' ),
						'background_overlay'       => array( 'type' => 'string', 'enum' => array( 'yes', '' ) ),
						'background_overlay_color' => array( 'type' => 'string' ),
						'background_ken_burns'     => array( 'type' => 'string', 'enum' => array( 'yes', '' ) ),
						'zoom_direction'           => array( 'type' => 'string', 'enum' => array( 'in', 'out' ) ),
						'content_animation'        => array( 'type' => 'string', 'description' => 'Content entrance animation (e.g. fadeInUp, zoomIn).' ),
						'custom_css_class'         => array( 'type' => 'string' ),
						'horizontal_position'      => array( 'type' => 'string', 'enum' => array( 'left', 'center', 'right' ) ),
						'vertical_position'        => array( 'type' => 'string', 'enum' => array( 'top', 'middle', 'bottom' ) ),
						'text_align'               => array( 'type' => 'string', 'enum' => array( 'left', 'center', 'right' ) ),
					),
				),
			),
			'navigation'                         => array( 'type' => 'string', 'enum' => array( 'both', 'arrows', 'dots', 'none' ), 'description' => 'Navigation type.' ),
			'autoplay'                           => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Autoplay. Default: yes.' ),
			'autoplay_speed'                     => array( 'type' => 'integer', 'description' => 'Autoplay interval in ms. Default: 5000.' ),
			'pause_on_hover'                     => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Pause autoplay on hover.' ),
			'pause_on_interaction'               => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Pause autoplay on interaction.' ),
			'infinite'                           => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Infinite loop. Default: yes.' ),
			'transition'                         => array( 'type' => 'string', 'enum' => array( 'slide', 'fade' ), 'description' => 'Transition effect.' ),
			'transition_speed'                   => array( 'type' => 'integer', 'description' => 'Transition speed in ms.' ),
			'slides_height'                      => array( 'type' => 'object', 'description' => 'Slider height: {size, unit}. Responsive.' ),
			'content_max_width'                  => array( 'type' => 'object', 'description' => 'Content max width percentage: {size, unit}.' ),
			'slides_padding'                     => array( 'type' => 'object', 'description' => 'Content padding: {top, right, bottom, left, unit, isLinked}.' ),
			'slides_horizontal_position'         => array( 'type' => 'string', 'enum' => array( 'left', 'center', 'right' ), 'description' => 'Default horizontal position.' ),
			'slides_vertical_position'           => array( 'type' => 'string', 'enum' => array( 'top', 'middle', 'bottom' ), 'description' => 'Default vertical position.' ),
			'slides_text_align'                  => array( 'type' => 'string', 'enum' => array( 'left', 'center', 'right' ), 'description' => 'Default text alignment.' ),
			'heading_spacing'                    => array( 'type' => 'object', 'description' => 'Heading bottom spacing: {size, unit}.' ),
			'heading_color'                      => array( 'type' => 'string', 'description' => 'Heading text color.' ),
			'heading_typography_typography'      => array( 'type' => 'string', 'description' => 'Set to "custom" for heading typography.' ),
			'heading_typography_font_family'     => array( 'type' => 'string', 'description' => 'Heading font family.' ),
			'heading_typography_font_size'       => array( 'type' => 'object', 'description' => 'Heading font size: {size, unit}.' ),
			'heading_typography_font_weight'     => array( 'type' => 'string', 'description' => 'Heading font weight.' ),
			'description_spacing'                => array( 'type' => 'object', 'description' => 'Description bottom spacing: {size, unit}.' ),
			'description_color'                  => array( 'type' => 'string', 'description' => 'Description text color.' ),
			'description_typography_typography'  => array( 'type' => 'string', 'description' => 'Set to "custom" for description typography.' ),
			'description_typography_font_family' => array( 'type' => 'string', 'description' => 'Description font family.' ),
			'description_typography_font_size'   => array( 'type' => 'object', 'description' => 'Description font size: {size, unit}.' ),
			'button_size'                        => array( 'type' => 'string', 'enum' => array( 'xs', 'sm', 'md', 'lg', 'xl' ), 'description' => 'Button size.' ),
			'button_color'                       => array( 'type' => 'string', 'description' => 'Button text color.' ),
			'button_background_color'            => array( 'type' => 'string', 'description' => 'Button background color.' ),
			'button_border_width'                => array( 'type' => 'integer', 'description' => 'Button border width in px.' ),
			'button_border_color'                => array( 'type' => 'string', 'description' => 'Button border color.' ),
			'button_border_radius'               => array( 'type' => 'object', 'description' => 'Button border radius: {size, unit}.' ),
			'button_typography_typography'       => array( 'type' => 'string', 'description' => 'Set to "custom" for button typography.' ),
			'button_typography_font_family'      => array( 'type' => 'string', 'description' => 'Button font family.' ),
			'button_typography_font_size'        => array( 'type' => 'object', 'description' => 'Button font size: {size, unit}.' ),
			'arrows_size'                        => array( 'type' => 'object', 'description' => 'Arrow size: {size, unit}.' ),
			'arrows_color'                       => array( 'type' => 'string', 'description' => 'Arrow color.' ),
			'dots_size'                          => array( 'type' => 'object', 'description' => 'Dot size: {size, unit}.' ),
			'dots_color'                         => array( 'type' => 'string', 'description' => 'Dot color.' ),
		),
		'required' => array( 'slides' ),
		'defaults' => array( 'autoplay' => 'yes', 'autoplay_speed' => 5000, 'infinite' => 'yes' ),
	),
	'testimonial-carousel' => array(
		'tier'     => 'pro',
		'title'    => 'Testimonial Carousel',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Rotating carousel of testimonials with skins, layouts, navigation, and per-element styling.',
		'keywords' => array( 'testimonial', 'carousel', 'review', 'slider', 'quote' ),
		'params'   => array(
			'slides'                         => array(
				'type'        => 'array',
				'description' => 'Array of testimonial items with content, image, name, and title.',
				'items'       => array(
					'type'       => 'object',
					'properties' => array(
						'content' => array( 'type' => 'string' ),
						'image'   => array( 'type' => 'object' ),
						'name'    => array( 'type' => 'string' ),
						'title'   => array( 'type' => 'string' ),
					),
				),
			),
			'skin'                           => array( 'type' => 'string', 'enum' => array( 'default', 'bubble' ), 'description' => 'Skin variant. Default: default.' ),
			'layout'                         => array( 'type' => 'string', 'enum' => array( 'image_inline', 'image_stacked', 'image_above', 'image_left', 'image_right' ), 'description' => 'Layout mode.' ),
			'alignment'                      => array( 'type' => 'string', 'enum' => array( 'left', 'center', 'right' ), 'description' => 'Content alignment.' ),
			'slides_per_view'                => array( 'type' => 'string', 'enum' => array( '1', '2', '3', '4' ), 'description' => 'Slides visible at once.' ),
			'autoplay'                       => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Autoplay. Default: yes.' ),
			'autoplay_speed'                 => array( 'type' => 'integer', 'description' => 'Autoplay interval in ms.' ),
			'navigation'                     => array( 'type' => 'string', 'enum' => array( 'both', 'arrows', 'dots', 'none' ), 'description' => 'Navigation type.' ),
			'infinite'                       => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Infinite loop.' ),
			'speed'                          => array( 'type' => 'integer', 'description' => 'Transition speed in ms.' ),
			'space_between'                  => array( 'type' => 'object', 'description' => 'Space between slides: {size, unit}.' ),
			'slide_background_color'         => array( 'type' => 'string', 'description' => 'Slide background color.' ),
			'slide_padding'                  => array( 'type' => 'object', 'description' => 'Slide padding: {top, right, bottom, left, unit, isLinked}.' ),
			'slide_border_radius'            => array( 'type' => 'object', 'description' => 'Slide border radius: {top, right, bottom, left, unit, isLinked}.' ),
			'slide_border_border'            => array( 'type' => 'string', 'enum' => array( '', 'solid', 'double', 'dotted', 'dashed' ), 'description' => 'Slide border style.' ),
			'slide_border_width'             => array( 'type' => 'object', 'description' => 'Slide border width.' ),
			'slide_border_color'             => array( 'type' => 'string', 'description' => 'Slide border color.' ),
			'content_color'                  => array( 'type' => 'string', 'description' => 'Content/quote text color.' ),
			'name_color'                     => array( 'type' => 'string', 'description' => 'Author name color.' ),
			'title_color'                    => array( 'type' => 'string', 'description' => 'Author title/role color.' ),
			'image_size'                     => array( 'type' => 'object', 'description' => 'Author image size: {size, unit}.' ),
			'image_gap'                      => array( 'type' => 'object', 'description' => 'Gap between image and text: {size, unit}.' ),
			'image_border_radius'            => array( 'type' => 'object', 'description' => 'Image border radius: {top, right, bottom, left, unit, isLinked}.' ),
			'content_typography_typography'  => array( 'type' => 'string', 'description' => 'Set to "custom" for content typography.' ),
			'content_typography_font_family' => array( 'type' => 'string', 'description' => 'Content font family.' ),
			'content_typography_font_size'   => array( 'type' => 'object', 'description' => 'Content font size: {size, unit}.' ),
			'name_typography_typography'     => array( 'type' => 'string', 'description' => 'Set to "custom" for name typography.' ),
			'name_typography_font_family'    => array( 'type' => 'string', 'description' => 'Name font family.' ),
			'name_typography_font_size'      => array( 'type' => 'object', 'description' => 'Name font size: {size, unit}.' ),
			'name_typography_font_weight'    => array( 'type' => 'string', 'description' => 'Name font weight.' ),
		),
		'required' => array( 'slides' ),
		'defaults' => array( 'skin' => 'default', 'layout' => 'image_inline', 'slides_per_view' => '1', 'autoplay' => 'yes' ),
	),
	'price-list' => array(
		'tier'     => 'pro',
		'title'    => 'Price List',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Menu-style list of items with title, price, description, image, and link.',
		'keywords' => array( 'price', 'list', 'menu', 'services', 'pricing' ),
		'params'   => array(
			'price_list' => array(
				'type'        => 'array',
				'description' => 'Array of list items with title, price, item_description, image, and link.',
				'items'       => array(
					'type'       => 'object',
					'properties' => array(
						'title'            => array( 'type' => 'string' ),
						'price'            => array( 'type' => 'string' ),
						'item_description' => array( 'type' => 'string' ),
						'image'            => array( 'type' => 'object' ),
						'link'             => array( 'type' => 'object' ),
					),
				),
			),
			'title_tag'  => array( 'type' => 'string', 'enum' => array( 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'span', 'p' ), 'description' => 'Title HTML tag. Default: span.' ),
		),
		'required' => array( 'price_list' ),
		'defaults' => array( 'title_tag' => 'span' ),
	),
	'gallery' => array(
		'tier'     => 'pro',
		'title'    => 'Gallery',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Advanced image gallery with grid/justified/masonry layouts, filtering, lightbox, and hover effects.',
		'keywords' => array( 'gallery', 'images', 'masonry', 'grid', 'lightbox' ),
		'params'   => array(
			'gallery'                 => array(
				'type'        => 'array',
				'description' => 'Array of image objects with id and url.',
				'items'       => array(
					'type'       => 'object',
					'properties' => array(
						'id'  => array( 'type' => 'integer' ),
						'url' => array( 'type' => 'string' ),
					),
				),
			),
			'gallery_layout'          => array( 'type' => 'string', 'enum' => array( 'grid', 'justified', 'masonry' ), 'description' => 'Gallery layout. Default: grid.' ),
			'columns'                 => array( 'type' => 'integer', 'description' => 'Number of columns. Default: 4. Responsive: columns_tablet, columns_mobile.' ),
			'gap'                     => array( 'type' => 'object', 'description' => 'Gap between items: {size, unit}.' ),
			'link_to'                 => array( 'type' => 'string', 'enum' => array( 'file', 'custom', 'none' ), 'description' => 'Link behavior.' ),
			'gallery_type'            => array( 'type' => 'string', 'enum' => array( 'single', 'multiple' ), 'description' => 'Single or multiple galleries (with filter bar).' ),
			'galleries'               => array(
				'type'        => 'array',
				'description' => 'For gallery_type=multiple: array of {gallery_title, gallery (array of images)}.',
				'items'       => array(
					'type'       => 'object',
					'properties' => array(
						'gallery_title' => array( 'type' => 'string' ),
						'gallery'       => array( 'type' => 'array', 'items' => array( 'type' => 'object' ) ),
					),
				),
			),
			'aspect_ratio'            => array( 'type' => 'string', 'enum' => array( '1:1', '3:2', '4:3', '9:16', '16:9', '21:9' ), 'description' => 'Image aspect ratio (grid layout).' ),
			'ideal_row_height'        => array( 'type' => 'object', 'description' => 'Ideal row height for justified layout: {size, unit}.' ),
			'order_by'                => array( 'type' => 'string', 'enum' => array( '', 'random' ), 'description' => 'Image order: default or random.' ),
			'lazyload'                => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Lazy load images.' ),
			'overlay_background'      => array( 'type' => 'string', 'description' => 'Overlay background color on hover.' ),
			'content_hover_animation' => array( 'type' => 'string', 'description' => 'Overlay content hover animation.' ),
			'open_lightbox'           => array( 'type' => 'string', 'enum' => array( 'default', 'yes', 'no' ), 'description' => 'Open in lightbox.' ),
			'image_border_radius'     => array( 'type' => 'object', 'description' => 'Image border radius: {top, right, bottom, left, unit, isLinked}.' ),
			'image_border_border'     => array( 'type' => 'string', 'enum' => array( '', 'solid', 'double', 'dotted', 'dashed' ), 'description' => 'Image border style.' ),
			'image_border_width'      => array( 'type' => 'object', 'description' => 'Image border width: {top, right, bottom, left, unit, isLinked}.' ),
			'image_border_color'      => array( 'type' => 'string', 'description' => 'Image border color.' ),
		),
		'required' => array( 'gallery' ),
		'defaults' => array( 'gallery_layout' => 'grid', 'columns' => 4 ),
	),
	'share-buttons' => array(
		'tier'     => 'pro',
		'title'    => 'Share Buttons',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Social share buttons for the current page with skins, shapes, and display modes.',
		'keywords' => array( 'share', 'social', 'buttons', 'facebook', 'twitter' ),
		'params'   => array(
			'share_buttons' => array(
				'type'        => 'array',
				'description' => 'Array of share buttons with button (network name) and optional text.',
				'items'       => array(
					'type'       => 'object',
					'properties' => array(
						'button' => array( 'type' => 'string', 'description' => 'Network: facebook, twitter, linkedin, pinterest, reddit, etc.' ),
						'text'   => array( 'type' => 'string' ),
					),
				),
			),
			'view'          => array( 'type' => 'string', 'enum' => array( 'icon-text', 'icon', 'text' ), 'description' => 'Display mode. Default: icon-text.' ),
			'skin'          => array( 'type' => 'string', 'enum' => array( 'gradient', 'minimal', 'framed', 'boxed', 'flat' ), 'description' => 'Button skin/style.' ),
			'shape'         => array( 'type' => 'string', 'enum' => array( 'square', 'rounded', 'circle' ), 'description' => 'Button shape. Default: square.' ),
			'columns'       => array( 'type' => 'integer', 'description' => 'Number of columns.' ),
		),
		'required' => array( 'share_buttons' ),
		'defaults' => array( 'view' => 'icon-text', 'shape' => 'square' ),
	),
	'table-of-contents' => array(
		'tier'     => 'pro',
		'title'    => 'Table of Contents',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Auto-generated table of contents built from the page headings, with marker style and hierarchy.',
		'keywords' => array( 'toc', 'table', 'contents', 'headings', 'navigation' ),
		'params'   => array(
			'title'             => array( 'type' => 'string', 'description' => 'TOC title. Default: Table of Contents.' ),
			'headings_by_tags'  => array( 'type' => 'array', 'items' => array( 'type' => 'string' ), 'description' => 'Which heading tags to include (e.g. ["h2", "h3"]).' ),
			'marker_view'       => array( 'type' => 'string', 'enum' => array( 'numbers', 'bullets', 'none' ), 'description' => 'Marker style. Default: numbers.' ),
			'hierarchical_view' => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Hierarchical display. Default: yes.' ),
		),
		'required' => array(),
		'defaults' => array( 'title' => 'Table of Contents', 'marker_view' => 'numbers', 'hierarchical_view' => 'yes' ),
	),
	'blockquote' => array(
		'tier'     => 'pro',
		'title'    => 'Blockquote',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Styled blockquote with quote text, author attribution, optional tweet button, and skins.',
		'keywords' => array( 'blockquote', 'quote', 'tweet', 'citation', 'pullquote' ),
		'params'   => array(
			'blockquote_content'             => array( 'type' => 'string', 'description' => 'Quote/blockquote text.' ),
			'author_name'                    => array( 'type' => 'string', 'description' => 'Author/attribution name.' ),
			'blockquote_skin'                => array( 'type' => 'string', 'enum' => array( 'border', 'quotation', 'boxed', 'clean' ), 'description' => 'Skin variant. Default: border.' ),
			'alignment'                      => array( 'type' => 'string', 'enum' => array( 'left', 'center', 'right' ), 'description' => 'Text alignment.' ),
			'tweet_button'                   => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Show tweet button.' ),
			'tweet_button_view'              => array( 'type' => 'string', 'enum' => array( 'icon-text', 'icon', 'text' ), 'description' => 'Tweet button display mode.' ),
			'tweet_button_skin'              => array( 'type' => 'string', 'enum' => array( 'classic', 'bubble', 'link' ), 'description' => 'Tweet button style.' ),
			'tweet_button_label'             => array( 'type' => 'string', 'description' => 'Custom tweet button label.' ),
			'url_type'                       => array( 'type' => 'string', 'enum' => array( 'current_page', 'custom' ), 'description' => 'URL to share: current page or custom.' ),
			'url'                            => array( 'type' => 'string', 'description' => 'Custom URL to share (when url_type=custom).' ),
			'user_name'                      => array( 'type' => 'string', 'description' => 'Twitter @username for "via" attribution.' ),
			'content_text_color'             => array( 'type' => 'string', 'description' => 'Quote text color.' ),
			'content_gap'                    => array( 'type' => 'object', 'description' => 'Gap between quote and author: {size, unit}.' ),
			'content_typography_typography'  => array( 'type' => 'string', 'description' => 'Set to "custom" for quote typography.' ),
			'content_typography_font_family' => array( 'type' => 'string', 'description' => 'Quote font family.' ),
			'content_typography_font_size'   => array( 'type' => 'object', 'description' => 'Quote font size: {size, unit}.' ),
			'author_text_color'              => array( 'type' => 'string', 'description' => 'Author name color.' ),
			'author_typography_typography'   => array( 'type' => 'string', 'description' => 'Set to "custom" for author typography.' ),
			'author_typography_font_family'  => array( 'type' => 'string', 'description' => 'Author font family.' ),
			'author_typography_font_size'    => array( 'type' => 'object', 'description' => 'Author font size: {size, unit}.' ),
			'border_color'                   => array( 'type' => 'string', 'description' => 'Border color (border skin) or quotation mark color (quotation skin).' ),
			'border_width'                   => array( 'type' => 'object', 'description' => 'Border width: {size, unit}.' ),
			'border_gap'                     => array( 'type' => 'object', 'description' => 'Gap between border and content: {size, unit}.' ),
			'quote_size'                     => array( 'type' => 'object', 'description' => 'Quotation mark size (quotation skin): {size, unit}.' ),
			'box_color'                      => array( 'type' => 'string', 'description' => 'Box background color (boxed skin).' ),
			'button_color'                   => array( 'type' => 'string', 'description' => 'Tweet button text/icon color.' ),
			'button_text_color'              => array( 'type' => 'string', 'description' => 'Tweet button background color.' ),
		),
		'required' => array( 'blockquote_content' ),
		'defaults' => array( 'blockquote_skin' => 'border' ),
	),
	'lottie' => array(
		'tier'     => 'pro',
		'title'    => 'Lottie Animation',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Embeds a Lottie JSON animation with triggers, loop, speed, renderer, sizing, and CSS filters.',
		'keywords' => array( 'lottie', 'animation', 'json', 'svg', 'motion' ),
		'params'   => array(
			'source'                 => array( 'type' => 'string', 'enum' => array( 'media_file', 'external_url' ), 'description' => 'Source type. Default: external_url.' ),
			'source_external_url'    => array( 'type' => 'string', 'description' => 'External Lottie JSON URL.' ),
			'source_json'            => array( 'type' => 'object', 'description' => 'Media library file: {url, id}.' ),
			'trigger'                => array( 'type' => 'string', 'enum' => array( 'arriving_to_viewport', 'on_click', 'on_hover', 'bind_to_scroll', 'none' ), 'description' => 'Animation trigger. Default: arriving_to_viewport.' ),
			'loop'                   => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Loop animation. Default: yes.' ),
			'number_of_times'        => array( 'type' => 'integer', 'description' => 'Loop count (0 = infinite).' ),
			'play_speed'             => array( 'type' => 'object', 'description' => 'Playback speed: {size, unit}.' ),
			'start_point'            => array( 'type' => 'object', 'description' => 'Animation start point (0-100): {size, unit}.' ),
			'end_point'              => array( 'type' => 'object', 'description' => 'Animation end point (0-100): {size, unit}.' ),
			'reverse_animation'      => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Play animation in reverse.' ),
			'renderer'               => array( 'type' => 'string', 'enum' => array( 'svg', 'canvas' ), 'description' => 'Render method. Default: svg.' ),
			'lazyload'               => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Lazy load animation.' ),
			'link_to'                => array( 'type' => 'string', 'enum' => array( 'none', 'custom' ), 'description' => 'Link type.' ),
			'custom_link'            => array( 'type' => 'object', 'description' => 'Link object: {url, is_external, nofollow}.' ),
			'viewport_start'         => array( 'type' => 'string', 'description' => 'Viewport offset start (e.g. "bottom").' ),
			'viewport_end'           => array( 'type' => 'string', 'description' => 'Viewport offset end.' ),
			'caption_source'         => array( 'type' => 'string', 'enum' => array( 'none', 'title', 'caption', 'custom' ), 'description' => 'Caption source.' ),
			'caption'                => array( 'type' => 'string', 'description' => 'Custom caption text.' ),
			'align'                  => array( 'type' => 'string', 'enum' => array( 'left', 'center', 'right' ), 'description' => 'Alignment.' ),
			'width'                  => array( 'type' => 'object', 'description' => 'Width: {size, unit}.' ),
			'opacity'                => array( 'type' => 'object', 'description' => 'Opacity (0-1): {size, unit}.' ),
			'css_filters_css_filter' => array( 'type' => 'string', 'description' => 'Set to "custom" for CSS filters.' ),
			'css_filters_blur'       => array( 'type' => 'object', 'description' => 'Blur filter: {size, unit}.' ),
			'css_filters_brightness' => array( 'type' => 'object', 'description' => 'Brightness filter: {size, unit}.' ),
			'css_filters_contrast'   => array( 'type' => 'object', 'description' => 'Contrast filter: {size, unit}.' ),
			'css_filters_saturate'   => array( 'type' => 'object', 'description' => 'Saturate filter: {size, unit}.' ),
			'opacity_hover'          => array( 'type' => 'object', 'description' => 'Hover opacity: {size, unit}.' ),
		),
		'required' => array(),
		'defaults' => array( 'source' => 'external_url', 'trigger' => 'arriving_to_viewport', 'loop' => 'yes', 'renderer' => 'svg' ),
	),
	'hotspot' => array(
		'tier'     => 'pro',
		'title'    => 'Hotspot',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Interactive image with clickable/hoverable hotspot points and configurable tooltips.',
		'keywords' => array( 'hotspot', 'image', 'tooltip', 'interactive', 'marker' ),
		'params'   => array(
			'image'                               => array( 'type' => 'object', 'description' => 'Background image object with url and optional id.' ),
			'hotspot'                             => array(
				'type'        => 'array',
				'description' => 'Array of hotspot items.',
				'items'       => array(
					'type'       => 'object',
					'properties' => array(
						'hotspot_label'           => array( 'type' => 'string' ),
						'hotspot_link'            => array( 'type' => 'object', 'description' => '{url, is_external, nofollow}.' ),
						'hotspot_icon'            => array( 'type' => 'object', 'description' => 'Icon: {value, library}.' ),
						'hotspot_icon_position'   => array( 'type' => 'string', 'enum' => array( 'before', 'after' ) ),
						'hotspot_horizontal'      => array( 'type' => 'string', 'enum' => array( 'left', 'right' ) ),
						'hotspot_offset_x'        => array( 'type' => 'object', 'description' => 'Horizontal offset %: {size, unit}.' ),
						'hotspot_vertical'        => array( 'type' => 'string', 'enum' => array( 'top', 'bottom' ) ),
						'hotspot_offset_y'        => array( 'type' => 'object', 'description' => 'Vertical offset %: {size, unit}.' ),
						'hotspot_tooltip_content' => array( 'type' => 'string' ),
						'hotspot_custom_size'     => array( 'type' => 'string', 'enum' => array( 'yes', '' ) ),
						'hotspot_width'           => array( 'type' => 'object' ),
						'hotspot_height'          => array( 'type' => 'object' ),
					),
				),
			),
			'image_size'                          => array( 'type' => 'string', 'description' => 'Image size (e.g. full, large, medium).' ),
			'image_custom_dimension'              => array( 'type' => 'object', 'description' => 'Custom image dimensions: {width, height}.' ),
			'tooltip_trigger'                     => array( 'type' => 'string', 'enum' => array( 'mouseenter', 'click', 'none' ), 'description' => 'Tooltip trigger event. Default: mouseenter.' ),
			'tooltip_position'                    => array( 'type' => 'string', 'enum' => array( 'top', 'bottom', 'left', 'right' ), 'description' => 'Default tooltip position.' ),
			'tooltip_animation'                   => array( 'type' => 'string', 'enum' => array( 'e--animation-fadeIn', 'e--animation-zoomIn', 'e--animation-slideInUp', 'e--animation-slideInDown', 'e--animation-slideInLeft', 'e--animation-slideInRight' ), 'description' => 'Tooltip entrance animation.' ),
			'tooltip_animation_duration'          => array( 'type' => 'object', 'description' => 'Tooltip animation duration: {size, unit}.' ),
			'hotspot_animation'                   => array( 'type' => 'string', 'enum' => array( 'none', 'soft-beat', 'expand', 'shadow' ), 'description' => 'Hotspot point animation.' ),
			'hotspot_sequenced_animation'         => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Staggered animation sequence.' ),
			'image_width'                         => array( 'type' => 'object', 'description' => 'Image width: {size, unit}.' ),
			'image_opacity'                       => array( 'type' => 'object', 'description' => 'Image opacity (0-1): {size, unit}.' ),
			'image_border_radius'                 => array( 'type' => 'object', 'description' => 'Image border radius: {top, right, bottom, left, unit, isLinked}.' ),
			'hotspot_color'                       => array( 'type' => 'string', 'description' => 'Hotspot label/icon color.' ),
			'hotspot_background_color'            => array( 'type' => 'string', 'description' => 'Hotspot background color.' ),
			'hotspot_size'                        => array( 'type' => 'object', 'description' => 'Hotspot point size: {size, unit}.' ),
			'hotspot_padding'                     => array( 'type' => 'object', 'description' => 'Hotspot padding: {top, right, bottom, left, unit, isLinked}.' ),
			'hotspot_border_radius'               => array( 'type' => 'object', 'description' => 'Hotspot border radius: {top, right, bottom, left, unit, isLinked}.' ),
			'hotspot_box_shadow_box_shadow_type'  => array( 'type' => 'string', 'description' => 'Set to "yes" for hotspot box shadow.' ),
			'hotspot_box_shadow_box_shadow'       => array( 'type' => 'object', 'description' => 'Hotspot box shadow: {horizontal, vertical, blur, spread, color}.' ),
			'tooltip_text_color'                  => array( 'type' => 'string', 'description' => 'Tooltip text color.' ),
			'tooltip_background_color'            => array( 'type' => 'string', 'description' => 'Tooltip background color.' ),
			'tooltip_border_radius'               => array( 'type' => 'object', 'description' => 'Tooltip border radius: {size, unit}.' ),
			'tooltip_padding'                     => array( 'type' => 'object', 'description' => 'Tooltip padding: {top, right, bottom, left, unit, isLinked}.' ),
			'tooltip_width'                       => array( 'type' => 'object', 'description' => 'Tooltip width: {size, unit}.' ),
			'tooltip_typography_typography'       => array( 'type' => 'string', 'description' => 'Set to "custom" for tooltip typography.' ),
			'tooltip_typography_font_family'      => array( 'type' => 'string', 'description' => 'Tooltip font family.' ),
			'tooltip_typography_font_size'        => array( 'type' => 'object', 'description' => 'Tooltip font size: {size, unit}.' ),
		),
		'required' => array( 'image', 'hotspot' ),
		'defaults' => array( 'tooltip_trigger' => 'mouseenter', 'tooltip_position' => 'top' ),
	),
	'nav-menu' => array(
		'tier'     => 'pro',
		'title'    => 'Navigation Menu',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'WordPress navigation menu with layouts, hover pointers, dropdown breakpoint, colors, and typography.',
		'keywords' => array( 'nav', 'menu', 'navigation', 'header', 'dropdown' ),
		'params'   => array(
			'menu_name'                      => array( 'type' => 'string', 'description' => 'Menu name (as registered in WP Menus).' ),
			'layout'                         => array( 'type' => 'string', 'enum' => array( 'horizontal', 'vertical', 'dropdown' ), 'description' => 'Menu layout. Default: horizontal.' ),
			'align_items'                    => array( 'type' => 'string', 'enum' => array( 'start', 'center', 'end', 'justify' ), 'description' => 'Menu alignment.' ),
			'pointer'                        => array( 'type' => 'string', 'enum' => array( 'none', 'underline', 'overline', 'double-line', 'framed', 'background', 'text' ), 'description' => 'Hover pointer style. Default: underline.' ),
			'animation_line'                 => array( 'type' => 'string', 'enum' => array( 'fade', 'slide', 'grow', 'drop-in', 'drop-out', 'none' ), 'description' => 'Line pointer animation.' ),
			'dropdown'                       => array( 'type' => 'string', 'enum' => array( 'mobile', 'tablet', 'none' ), 'description' => 'Breakpoint for dropdown toggle. Default: tablet.' ),
			'full_width'                     => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Full width dropdown.' ),
			'text_align'                     => array( 'type' => 'string', 'enum' => array( 'aside', 'center' ), 'description' => 'Dropdown text alignment.' ),
			'toggle'                         => array( 'type' => 'string', 'enum' => array( '', 'burger' ), 'description' => 'Toggle button type.' ),
			'toggle_align'                   => array( 'type' => 'string', 'enum' => array( 'left', 'center', 'right' ), 'description' => 'Toggle button alignment.' ),
			'color_menu_item'                => array( 'type' => 'string', 'description' => 'Menu text color (hex).' ),
			'color_menu_item_hover'          => array( 'type' => 'string', 'description' => 'Menu hover text color (hex).' ),
			'pointer_color_menu_item_hover'  => array( 'type' => 'string', 'description' => 'Pointer hover color (hex).' ),
			'color_menu_item_active'         => array( 'type' => 'string', 'description' => 'Active item text color (hex).' ),
			'pointer_color_menu_item_active' => array( 'type' => 'string', 'description' => 'Active item pointer color (hex).' ),
			'padding_horizontal_menu_item'   => array( 'type' => 'object', 'description' => 'Horizontal padding: { "size": 20, "unit": "px" }.' ),
			'padding_vertical_menu_item'     => array( 'type' => 'object', 'description' => 'Vertical padding: { "size": 15, "unit": "px" }.' ),
			'menu_space_between'             => array( 'type' => 'object', 'description' => 'Space between items: { "size": 10, "unit": "px" }.' ),
			'menu_typography_typography'     => array( 'type' => 'string', 'description' => 'Set to "yes" for custom typography.' ),
			'menu_typography_font_family'    => array( 'type' => 'string', 'description' => 'Font family name.' ),
			'menu_typography_font_size'      => array( 'type' => 'object', 'description' => 'Font size: { "size": 16, "unit": "px" }.' ),
			'menu_typography_font_weight'    => array( 'type' => 'string', 'description' => 'Font weight.' ),
		),
		'required' => array(),
		'defaults' => array( 'layout' => 'horizontal', 'pointer' => 'underline' ),
	),
	'loop-grid' => array(
		'tier'     => 'pro',
		'title'    => 'Loop Grid',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Displays posts/pages/CPTs in a grid rendered by a loop template, with full query controls.',
		'keywords' => array( 'loop', 'grid', 'posts', 'template', 'query' ),
		'params'   => array(
			'_skin'                => array( 'type' => 'string', 'enum' => array( 'post', 'post_taxonomy' ), 'description' => 'Template type. Default: post.' ),
			'template_id'          => array( 'type' => 'string', 'description' => 'Loop template ID.' ),
			'columns'              => array( 'type' => 'number', 'description' => 'Number of columns. Default: 3.' ),
			'columns_tablet'       => array( 'type' => 'number', 'description' => 'Columns on tablet. Default: 2.' ),
			'columns_mobile'       => array( 'type' => 'number', 'description' => 'Columns on mobile. Default: 1.' ),
			'posts_per_page'       => array( 'type' => 'number', 'description' => 'Items per page. Default: 6.' ),
			'masonry'              => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Enable masonry layout.' ),
			'equal_height'         => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Equal height items.' ),
			'post_query_post_type' => array( 'type' => 'string', 'enum' => array( 'post', 'page', 'by_id', 'current_query', 'related' ), 'description' => 'Query source. Default: post.' ),
			'post_query_include'   => array( 'type' => 'string', 'enum' => array( 'terms', 'authors' ), 'description' => 'Include by terms or authors.' ),
			'post_query_exclude'   => array( 'type' => 'string', 'enum' => array( 'current_post', 'manual_selection', 'terms', 'authors' ), 'description' => 'Exclude criteria.' ),
			'post_query_orderby'   => array( 'type' => 'string', 'enum' => array( 'post_date', 'post_title', 'menu_order', 'modified', 'comment_count', 'rand' ), 'description' => 'Order by field. Default: post_date.' ),
			'post_query_order'     => array( 'type' => 'string', 'enum' => array( 'asc', 'desc' ), 'description' => 'Sort order. Default: desc.' ),
			'post_query_offset'    => array( 'type' => 'number', 'description' => 'Query offset.' ),
		),
		'required' => array(),
		'defaults' => array( 'columns' => 3, 'posts_per_page' => 6 ),
	),
	'loop-carousel' => array(
		'tier'     => 'pro',
		'title'    => 'Loop Carousel',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Displays posts in a carousel rendered by a loop template, with responsive slides and query controls.',
		'keywords' => array( 'loop', 'carousel', 'posts', 'template', 'slider' ),
		'params'   => array(
			'_skin'                 => array( 'type' => 'string', 'enum' => array( 'post', 'post_taxonomy' ), 'description' => 'Template type. Default: post.' ),
			'template_id'           => array( 'type' => 'string', 'description' => 'Loop template ID.' ),
			'posts_per_page'        => array( 'type' => 'number', 'description' => 'Number of slides. Default: 6.' ),
			'slides_to_show'        => array( 'type' => 'string', 'enum' => array( '', '1', '2', '3', '4', '5', '6', '7', '8' ), 'description' => 'Slides on display. Default: 3.' ),
			'slides_to_show_tablet' => array( 'type' => 'string', 'description' => 'Slides on tablet. Default: 2.' ),
			'slides_to_show_mobile' => array( 'type' => 'string', 'description' => 'Slides on mobile. Default: 1.' ),
			'slides_to_scroll'      => array( 'type' => 'string', 'description' => 'Slides to scroll per step. Default: 1.' ),
			'equal_height'          => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Equal height slides. Default: yes.' ),
			'post_query_post_type'  => array( 'type' => 'string', 'enum' => array( 'post', 'page', 'by_id', 'current_query', 'related' ), 'description' => 'Query source. Default: post.' ),
			'post_query_orderby'    => array( 'type' => 'string', 'enum' => array( 'post_date', 'post_title', 'menu_order', 'modified', 'comment_count', 'rand' ), 'description' => 'Order by. Default: post_date.' ),
			'post_query_order'      => array( 'type' => 'string', 'enum' => array( 'asc', 'desc' ), 'description' => 'Sort order. Default: desc.' ),
		),
		'required' => array(),
		'defaults' => array( 'posts_per_page' => 6, 'slides_to_show' => '3', 'equal_height' => 'yes' ),
	),
	'media-carousel' => array(
		'tier'     => 'pro',
		'title'    => 'Media Carousel',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Carousel of images/videos with carousel, slideshow, or coverflow skins and navigation.',
		'keywords' => array( 'media', 'carousel', 'slideshow', 'coverflow', 'slider' ),
		'params'   => array(
			'skin'                   => array( 'type' => 'string', 'enum' => array( 'carousel', 'slideshow', 'coverflow' ), 'description' => 'Carousel skin. Default: carousel.' ),
			'slides'                 => array(
				'type'        => 'array',
				'description' => 'Array of slide items with image/video.',
				'items'       => array(
					'type'       => 'object',
					'properties' => array(
						'image' => array( 'type' => 'object', 'description' => '{ "url": "...", "id": 0 }' ),
						'type'  => array( 'type' => 'string', 'description' => 'Slide type: image or video.' ),
					),
				),
			),
			'effect'                 => array( 'type' => 'string', 'enum' => array( 'slide', 'fade', 'cube' ), 'description' => 'Transition effect. Default: slide.' ),
			'slides_per_view'        => array( 'type' => 'string', 'description' => 'Slides visible at once.' ),
			'slides_to_scroll'       => array( 'type' => 'string', 'description' => 'Slides to scroll per step.' ),
			'height'                 => array( 'type' => 'object', 'description' => 'Carousel height: { "size": 400, "unit": "px" }.' ),
			'width'                  => array( 'type' => 'object', 'description' => 'Carousel width: { "size": 100, "unit": "%" }.' ),
			'show_arrows'            => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Show navigation arrows. Default: yes.' ),
			'pagination'             => array( 'type' => 'string', 'enum' => array( '', 'bullets', 'fraction', 'progressbar' ), 'description' => 'Pagination type. Default: bullets.' ),
			'speed'                  => array( 'type' => 'number', 'description' => 'Transition duration ms. Default: 500.' ),
			'autoplay'               => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Enable autoplay. Default: yes.' ),
			'autoplay_speed'         => array( 'type' => 'number', 'description' => 'Autoplay speed ms. Default: 5000.' ),
			'loop'                   => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Infinite loop. Default: yes.' ),
			'pause_on_hover'         => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Pause on hover. Default: yes.' ),
			'overlay'                => array( 'type' => 'string', 'enum' => array( '', 'text', 'icon' ), 'description' => 'Overlay type on hover.' ),
			'caption'                => array( 'type' => 'string', 'enum' => array( 'title', 'caption', 'description' ), 'description' => 'Caption source. Default: title.' ),
			'image_size_size'        => array( 'type' => 'string', 'enum' => array( 'thumbnail', 'medium', 'medium_large', 'large', 'full', 'custom' ), 'description' => 'Image resolution. Default: full.' ),
			'image_fit'              => array( 'type' => 'string', 'enum' => array( '', 'contain', 'auto' ), 'description' => 'Image fit mode.' ),
			'centered_slides'        => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Center the active slide.' ),
			'slide_background_color' => array( 'type' => 'string', 'description' => 'Slide background color (hex).' ),
			'slide_border_radius'    => array( 'type' => 'object', 'description' => 'Slide border radius.' ),
			'arrows_size'            => array( 'type' => 'object', 'description' => 'Arrow size: { "size": 20, "unit": "px" }.' ),
			'arrows_color'           => array( 'type' => 'string', 'description' => 'Arrow color (hex).' ),
			'space_between'          => array( 'type' => 'object', 'description' => 'Space between slides: { "size": 10, "unit": "px" }.' ),
		),
		'required' => array(),
		'defaults' => array( 'skin' => 'carousel', 'autoplay' => 'yes', 'loop' => 'yes' ),
	),
	'nested-tabs' => array(
		'tier'     => 'pro',
		'title'    => 'Nested Tabs',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Modern tabs where each tab content is a container you can populate with child elements.',
		'keywords' => array( 'nested', 'tabs', 'container', 'tabbed', 'content' ),
		'params'   => array(
			'tabs_direction'                        => array( 'type' => 'string', 'enum' => array( 'block-start', 'block-end', 'inline-end', 'inline-start' ), 'description' => 'Tab direction. block-start=top, block-end=bottom, inline-start=left, inline-end=right.' ),
			'tabs_justify_horizontal'               => array( 'type' => 'string', 'enum' => array( 'start', 'center', 'end', 'stretch' ), 'description' => 'Horizontal tab justify.' ),
			'tabs_justify_vertical'                 => array( 'type' => 'string', 'enum' => array( 'start', 'center', 'end', 'stretch' ), 'description' => 'Vertical tab justify.' ),
			'tabs_width'                            => array( 'type' => 'object', 'description' => 'Tab width: { "size": 200, "unit": "px" }.' ),
			'title_alignment'                       => array( 'type' => 'string', 'enum' => array( 'start', 'center', 'end' ), 'description' => 'Title alignment within tab.' ),
			'horizontal_scroll'                     => array( 'type' => 'string', 'enum' => array( 'disable', 'enable' ), 'description' => 'Enable horizontal scroll for tabs. Default: disable.' ),
			'breakpoint_selector'                   => array( 'type' => 'string', 'enum' => array( 'none', 'mobile', 'tablet' ), 'description' => 'Breakpoint for accordion mode. Default: mobile.' ),
			'tabs_title_space_between'              => array( 'type' => 'object', 'description' => 'Gap between tabs: { "size": 0, "unit": "px" }.' ),
			'tabs_title_spacing'                    => array( 'type' => 'object', 'description' => 'Distance from content: { "size": 0, "unit": "px" }.' ),
			'tabs_title_background_color_background' => array( 'type' => 'string', 'enum' => array( 'classic', 'gradient' ), 'description' => 'Tab background type.' ),
			'tabs_title_background_color_color'     => array( 'type' => 'string', 'description' => 'Tab background color (hex).' ),
			'tabs_title_typography_typography'      => array( 'type' => 'string', 'description' => 'Set to "yes" for custom tab typography.' ),
			'tabs_title_typography_font_family'     => array( 'type' => 'string', 'description' => 'Tab font family.' ),
			'tabs_title_typography_font_size'       => array( 'type' => 'object', 'description' => 'Tab font size: { "size": 16, "unit": "px" }.' ),
			'tabs_title_typography_font_weight'     => array( 'type' => 'string', 'description' => 'Tab font weight.' ),
		),
		'required' => array(),
		'defaults' => array(),
	),
	'nested-accordion' => array(
		'tier'     => 'pro',
		'title'    => 'Nested Accordion',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Modern accordion where each item content is a container you can populate with child elements.',
		'keywords' => array( 'nested', 'accordion', 'container', 'faq', 'collapse' ),
		'params'   => array(
			'accordion_item_title_position_horizontal'  => array( 'type' => 'string', 'enum' => array( 'start', 'center', 'end', 'stretch' ), 'description' => 'Title position.' ),
			'accordion_item_title_icon_position'        => array( 'type' => 'string', 'enum' => array( 'start', 'end' ), 'description' => 'Icon position. Default: end.' ),
			'accordion_item_title_icon'                 => array( 'type' => 'object', 'description' => 'Expand icon object.' ),
			'accordion_item_title_icon_active'          => array( 'type' => 'object', 'description' => 'Collapse icon object.' ),
			'title_tag'                                 => array( 'type' => 'string', 'enum' => array( 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'span', 'p' ), 'description' => 'Title HTML tag. Default: div.' ),
			'faq_schema'                                => array( 'type' => 'string', 'enum' => array( 'yes', '' ), 'description' => 'Enable FAQ Schema markup.' ),
			'default_state'                             => array( 'type' => 'string', 'enum' => array( 'expanded', 'all_collapsed' ), 'description' => 'Default state. Default: expanded (first item open).' ),
			'max_items_expended'                        => array( 'type' => 'string', 'enum' => array( 'one', 'multiple' ), 'description' => 'Max items expanded at once. Default: one.' ),
			'n_accordion_animation_duration'            => array( 'type' => 'object', 'description' => 'Animation duration: { "size": 400, "unit": "ms" }.' ),
			'accordion_item_title_space_between'        => array( 'type' => 'object', 'description' => 'Space between items: { "size": 0, "unit": "px" }.' ),
			'accordion_item_title_distance_from_content' => array( 'type' => 'object', 'description' => 'Distance from content: { "size": 0, "unit": "px" }.' ),
			'accordion_border_normal_border'            => array( 'type' => 'string', 'enum' => array( '', 'none', 'solid', 'double', 'dotted', 'dashed', 'groove' ), 'description' => 'Border type.' ),
			'accordion_border_normal_color'             => array( 'type' => 'string', 'description' => 'Border color (hex).' ),
			'accordion_border_normal_width'             => array( 'type' => 'object', 'description' => 'Border width.' ),
			'accordion_background_normal_background'     => array( 'type' => 'string', 'enum' => array( 'classic', 'gradient' ), 'description' => 'Background type.' ),
			'accordion_background_normal_color'         => array( 'type' => 'string', 'description' => 'Background color (hex).' ),
		),
		'required' => array(),
		'defaults' => array( 'default_state' => 'expanded', 'max_items_expended' => 'one' ),
	),
	'portfolio' => array(
		'tier'     => 'pro',
		'title'    => 'Portfolio',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Filterable grid of posts or CPTs for showcasing portfolio/work, with masonry and title overlay.',
		'keywords' => array( 'portfolio', 'grid', 'gallery', 'projects', 'work' ),
		'params'   => array(
			'columns'             => array( 'type' => 'integer', 'description' => 'Number of columns. Default: 3.' ),
			'posts_per_page'      => array( 'type' => 'integer', 'description' => 'Number of posts to display. Default: 6.' ),
			'show_filter_bar'     => array( 'type' => 'string', 'enum' => array( 'yes', 'no' ), 'description' => 'Show category filter bar. Default: no.' ),
			'masonry'             => array( 'type' => 'string', 'enum' => array( 'yes', 'no' ), 'description' => 'Enable masonry layout. Default: no.' ),
			'show_title'          => array( 'type' => 'string', 'enum' => array( 'yes', 'no' ), 'description' => 'Show post title overlay. Default: yes.' ),
			'title_tag'           => array( 'type' => 'string', 'enum' => array( 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'span', 'p' ), 'description' => 'HTML tag for the title. Default: h3.' ),
			'thumbnail_size_size' => array( 'type' => 'string', 'enum' => array( 'thumbnail', 'medium', 'medium_large', 'large', 'full' ), 'description' => 'Image size. Default: medium.' ),
		),
		'required' => array(),
		'defaults' => array(
			'columns'             => 3,
			'posts_per_page'      => 6,
			'show_filter_bar'     => 'no',
			'masonry'             => 'no',
			'show_title'          => 'yes',
			'title_tag'           => 'h3',
			'thumbnail_size_size' => 'medium',
		),
	),
	'author-box' => array(
		'tier'     => 'pro',
		'title'    => 'Author Box',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Displays the post author avatar, name, bio, and a link to their posts.',
		'keywords' => array( 'author', 'box', 'bio', 'avatar', 'profile' ),
		'params'   => array(
			'show_avatar'     => array( 'type' => 'string', 'enum' => array( 'yes', 'no' ), 'description' => 'Show author avatar. Default: yes.' ),
			'avatar_size'     => array( 'type' => 'integer', 'description' => 'Avatar size in pixels. Default: 96.' ),
			'show_name'       => array( 'type' => 'string', 'enum' => array( 'yes', 'no' ), 'description' => 'Show author name. Default: yes.' ),
			'author_name_tag' => array( 'type' => 'string', 'enum' => array( 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'span', 'p' ), 'description' => 'HTML tag for the author name. Default: h3.' ),
			'show_biography'  => array( 'type' => 'string', 'enum' => array( 'yes', 'no' ), 'description' => 'Show author biography. Default: yes.' ),
			'show_link'       => array( 'type' => 'string', 'enum' => array( 'yes', 'no' ), 'description' => 'Show link button to author posts. Default: yes.' ),
			'link_text'       => array( 'type' => 'string', 'description' => 'Button label for the author posts link. Default: More Posts.' ),
			'alignment'       => array( 'type' => 'string', 'enum' => array( 'left', 'center', 'right' ), 'description' => 'Content alignment. Default: left.' ),
		),
		'required' => array(),
		'defaults' => array(
			'show_avatar'     => 'yes',
			'avatar_size'     => 96,
			'show_name'       => 'yes',
			'author_name_tag' => 'h3',
			'show_biography'  => 'yes',
			'show_link'       => 'yes',
			'link_text'       => 'More Posts',
			'alignment'       => 'left',
		),
	),
	'login' => array(
		'tier'     => 'pro',
		'title'    => 'Login',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Front-end login form with labels, remember-me, lost-password link, and post-login redirect.',
		'keywords' => array( 'login', 'form', 'signin', 'auth', 'account' ),
		'params'   => array(
			'show_labels'          => array( 'type' => 'string', 'enum' => array( 'yes', 'no' ), 'description' => 'Show field labels. Default: yes.' ),
			'show_remember_me'     => array( 'type' => 'string', 'enum' => array( 'yes', 'no' ), 'description' => 'Show "Remember Me" checkbox. Default: yes.' ),
			'show_lost_password'   => array( 'type' => 'string', 'enum' => array( 'yes', 'no' ), 'description' => 'Show "Lost Password" link. Default: yes.' ),
			'button_text'          => array( 'type' => 'string', 'description' => 'Submit button label. Default: Log In.' ),
			'button_size'          => array( 'type' => 'string', 'enum' => array( 'xs', 'sm', 'md', 'lg', 'xl' ), 'description' => 'Button size preset. Default: sm.' ),
			'redirect_after_login' => array( 'type' => 'string', 'enum' => array( 'yes', 'no' ), 'description' => 'Enable custom redirect after login. Default: no.' ),
			'redirect_url'         => array( 'type' => 'string', 'description' => 'URL to redirect to after login (requires redirect_after_login=yes).' ),
			'align'                => array( 'type' => 'string', 'enum' => array( 'left', 'center', 'right', 'justify' ), 'description' => 'Button alignment. Default: left.' ),
		),
		'required' => array(),
		'defaults' => array(
			'show_labels'          => 'yes',
			'show_remember_me'     => 'yes',
			'show_lost_password'   => 'yes',
			'button_text'          => 'Log In',
			'button_size'          => 'sm',
			'redirect_after_login' => 'no',
			'redirect_url'         => '',
			'align'                => 'left',
		),
	),
	'code-highlight' => array(
		'tier'     => 'pro',
		'title'    => 'Code Highlight',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Syntax-highlighted code block with language, theme, line numbers, and copy button.',
		'keywords' => array( 'code', 'highlight', 'syntax', 'snippet', 'prism' ),
		'params'   => array(
			'code'              => array( 'type' => 'string', 'description' => 'The code content to display.' ),
			'language'          => array( 'type' => 'string', 'enum' => array( 'php', 'javascript', 'css', 'html', 'python', 'bash' ), 'description' => 'Syntax language. Default: php.' ),
			'theme'             => array( 'type' => 'string', 'enum' => array( 'default', 'dark', 'funky', 'okaidia', 'twilight', 'coy' ), 'description' => 'Color theme. Default: default.' ),
			'line_numbers'      => array( 'type' => 'string', 'enum' => array( 'yes', 'no' ), 'description' => 'Show line numbers. Default: yes.' ),
			'copy_to_clipboard' => array( 'type' => 'string', 'enum' => array( 'yes', 'no' ), 'description' => 'Show copy-to-clipboard button. Default: yes.' ),
		),
		'required' => array(),
		'defaults' => array(
			'code'              => '',
			'language'          => 'php',
			'theme'             => 'default',
			'line_numbers'      => 'yes',
			'copy_to_clipboard' => 'yes',
		),
	),
	'reviews' => array(
		'tier'     => 'pro',
		'title'    => 'Reviews',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Reviews/testimonials carousel with slides per view, autoplay, loop, and navigation.',
		'keywords' => array( 'reviews', 'testimonials', 'carousel', 'ratings', 'slider' ),
		'params'   => array(
			'slides_per_view' => array( 'type' => 'integer', 'description' => 'Number of slides visible at once. Default: 3.' ),
			'autoplay'        => array( 'type' => 'string', 'enum' => array( 'yes', 'no' ), 'description' => 'Enable autoplay. Default: no.' ),
			'autoplay_speed'  => array( 'type' => 'integer', 'description' => 'Autoplay speed in milliseconds. Default: 3000.' ),
			'loop'            => array( 'type' => 'string', 'enum' => array( 'yes', 'no' ), 'description' => 'Enable infinite loop. Default: yes.' ),
			'show_arrows'     => array( 'type' => 'string', 'enum' => array( 'yes', 'no' ), 'description' => 'Show navigation arrows. Default: yes.' ),
			'pause_on_hover'  => array( 'type' => 'string', 'enum' => array( 'yes', 'no' ), 'description' => 'Pause autoplay on hover. Default: yes.' ),
		),
		'required' => array(),
		'defaults' => array(
			'slides_per_view' => 3,
			'autoplay'        => 'no',
			'autoplay_speed'  => 3000,
			'loop'            => 'yes',
			'show_arrows'     => 'yes',
			'pause_on_hover'  => 'yes',
		),
	),
	'off-canvas' => array(
		'tier'     => 'pro',
		'title'    => 'Off-Canvas',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Slide-in off-canvas panel with position, width, entrance animation, overlay, and scroll lock.',
		'keywords' => array( 'off-canvas', 'panel', 'drawer', 'sidebar', 'slide' ),
		'params'   => array(
			'horizontal_position' => array( 'type' => 'string', 'enum' => array( 'left', 'right' ), 'description' => 'Panel side. Default: left.' ),
			'vertical_position'   => array( 'type' => 'string', 'enum' => array( 'top', 'center', 'bottom' ), 'description' => 'Vertical alignment. Default: center.' ),
			'width'               => array( 'type' => 'integer', 'description' => 'Panel width in pixels. Default: 300.' ),
			'entrance_animation'  => array( 'type' => 'string', 'enum' => array( 'none', 'slideInLeft', 'slideInRight', 'fadeIn' ), 'description' => 'Open animation. Default: slideInLeft.' ),
			'has_overlay'         => array( 'type' => 'string', 'enum' => array( 'yes', 'no' ), 'description' => 'Show background overlay. Default: yes.' ),
			'prevent_scroll'      => array( 'type' => 'string', 'enum' => array( 'yes', 'no' ), 'description' => 'Lock body scroll when open. Default: yes.' ),
		),
		'required' => array(),
		'defaults' => array(
			'horizontal_position' => 'left',
			'vertical_position'   => 'center',
			'width'               => 300,
			'entrance_animation'  => 'slideInLeft',
			'has_overlay'         => 'yes',
			'prevent_scroll'      => 'yes',
		),
	),
	'progress-tracker' => array(
		'tier'     => 'pro',
		'title'    => 'Progress Tracker',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Scroll progress indicator (horizontal or circular) tracking page or element scroll.',
		'keywords' => array( 'progress', 'tracker', 'scroll', 'indicator', 'reading' ),
		'params'   => array(
			'type'           => array( 'type' => 'string', 'enum' => array( 'horizontal', 'circular' ), 'description' => 'Tracker style. Default: horizontal.' ),
			'relative_to'    => array( 'type' => 'string', 'enum' => array( 'page', 'element' ), 'description' => 'What to track. Default: page.' ),
			'align'          => array( 'type' => 'string', 'enum' => array( 'left', 'center', 'right' ), 'description' => 'Alignment. Default: left.' ),
			'circular_size'  => array( 'type' => 'integer', 'description' => 'Circle diameter in pixels (circular type). Default: 200.' ),
			'circular_width' => array( 'type' => 'integer', 'description' => 'Circle stroke width in pixels (circular type). Default: 8.' ),
		),
		'required' => array(),
		'defaults' => array(
			'type'           => 'horizontal',
			'relative_to'    => 'page',
			'align'          => 'left',
			'circular_size'  => 200,
			'circular_width' => 8,
		),
	),
	'search' => array(
		'tier'     => 'pro',
		'title'    => 'Search',
		'category' => 'pro',
		'requires' => 'elementor-pro',
		'use_case' => 'Site search input with optional live-results dropdown and post-type targeting.',
		'keywords' => array( 'search', 'live', 'find', 'query', 'input' ),
		'params'   => array(
			'search_input_placeholder_text' => array( 'type' => 'string', 'description' => 'Placeholder text for the search input. Default: Search...' ),
			'submit_trigger'                => array( 'type' => 'string', 'enum' => array( 'button', 'auto' ), 'description' => 'Search trigger method. Default: button.' ),
			'submit_button_text'            => array( 'type' => 'string', 'description' => 'Submit button label. Default: Search.' ),
			'live_results'                  => array( 'type' => 'string', 'enum' => array( 'yes', 'no' ), 'description' => 'Enable live search results dropdown. Default: no.' ),
			'number_of_items'               => array( 'type' => 'integer', 'description' => 'Max results to show. Default: 5.' ),
			'search_query_post_type'        => array( 'type' => 'string', 'description' => 'Post type to search. Default: any.' ),
		),
		'required' => array(),
		'defaults' => array(
			'search_input_placeholder_text' => 'Search...',
			'submit_trigger'                => 'button',
			'submit_button_text'            => 'Search',
			'live_results'                  => 'no',
			'number_of_items'               => 5,
			'search_query_post_type'        => 'any',
		),
	),
);
