HEX
Server: LiteSpeed
System: Linux eko108.isimtescil.net 4.18.0-477.21.1.lve.1.el8.x86_64 #1 SMP Tue Sep 5 23:08:35 UTC 2023 x86_64
User: uyarreklamcomtr (11202)
PHP: 7.4.33
Disabled: opcache_get_status
Upload Files
File: /var/www/vhosts/uyarreklam.com.tr/httpdocs/compat.tar
beaver-builder/beaver-builder.php000064400000005077151534575400013057 0ustar00<?php

class SiteOrigin_Widgets_Bundle_Beaver_Builder {
	/**
	 * Get the singleton instance
	 *
	 * @return SiteOrigin_Widgets_Bundle_Beaver_Builder
	 */
	public static function single() {
		static $single;

		return empty( $single ) ? $single = new self() : $single;
	}

	public function __construct() {
		add_action( 'wp', array( $this, 'init' ), 9 );
	}

	public function init() {
		if ( ! FLBuilderModel::is_builder_active() ) {
			return;
		}

		if ( isset( $_GET['fl_builder_ui'] ) ) {
			add_action( 'fl_builder_ui_enqueue_scripts', array( $this, 'enqueue_active_widgets_scripts' ) );
		} else {
			add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_active_widgets_scripts' ) );
		}
		add_action( 'wp_print_footer_scripts', array( $this, 'print_footer_templates' ) );

		// Don't want to show the form preview button when using Beaver Builder
		add_filter( 'siteorigin_widgets_form_show_preview_button', '__return_false' );
	}

	public function enqueue_active_widgets_scripts() {
		global $wp_widget_factory;

		// Beaver Builder does it's editing in the front end so enqueue required form scripts for active widgets.
		$so_widgets_bundle = SiteOrigin_Widgets_Bundle::single();
		$so_widgets_bundle->register_general_scripts();
		$so_widgets_bundle->enqueue_registered_widgets_scripts( true, true );

		$any_widgets_active = false;

		foreach ( $wp_widget_factory->widgets as $class => $widget_obj ) {
			if ( ! empty( $widget_obj ) && is_object( $widget_obj ) && is_subclass_of( $widget_obj, 'SiteOrigin_Widget' ) ) {
				$any_widgets_active = true;
				break;
			}
		}

		// No widgets active. :/ Let's get outta here.
		if ( ! $any_widgets_active ) {
			return;
		}

		wp_enqueue_style(
			'sowb-styles-for-beaver',
			plugin_dir_url( __FILE__ ) . 'styles.css'
		);

		wp_enqueue_script(
			'sowb-js-for-beaver',
			plugin_dir_url( __FILE__ ) . 'sowb-beaver-builder' . SOW_BUNDLE_JS_SUFFIX . '.js',
			array( 'jquery', 'siteorigin-widget-admin' )
		);

		wp_enqueue_style(
			'siteorigin-widget-admin',
			plugin_dir_url( SOW_BUNDLE_BASE_FILE ) . 'base/css/admin.css',
			array( 'media-views' ),
			SOW_BUNDLE_VERSION
		);
	}

	public function print_footer_templates() {
		global $wp_widget_factory;

		// Beaver Builder does it's editing in the front end so print required footer templates for active widgets.
		foreach ( $wp_widget_factory->widgets as $class => $widget_obj ) {
			if ( ! empty( $widget_obj ) && is_object( $widget_obj ) && is_subclass_of( $widget_obj, 'SiteOrigin_Widget' ) ) {
				$widget_obj->footer_admin_templates();
			}
		}
	}
}

SiteOrigin_Widgets_Bundle_Beaver_Builder::single();
beaver-builder/sowb-beaver-builder.js000064400000007526151534575400013655 0ustar00/* globals jQuery, FLBuilder, sowb, sowbForms */

var sowb = window.sowb || {};

( function($){
	if( typeof FLBuilder !== 'undefined') {
		// If you're going to override jQuery's `ready` function, at least make sure it still works. :/
		sowb.orig_FLBuilder_initJQueryReadyFix = FLBuilder._initJQueryReadyFix;
		FLBuilder._initJQueryReadyFix = function() {
			return;
		};

		sowb.orig_FLBuilder_getSettings = FLBuilder._getSettings;

		/**
		 * Replace Beaver Builder's form data collection function with our modified version.
		 */
		FLBuilder._getSettings = function(form) {
			FLBuilder._updateEditorFields();
			
			var data     	= form.serializeArray(),
				i        	= 0,
				k        	= 0,
				value	 	= '',
				name     	= '',
				key      	= '',
				keys      	= [],
				matches	 	= [],
				settings 	= {};
			
			// Loop through the form data.
			for ( i = 0; i < data.length; i++ ) {
				
				value = data[ i ].value.replace( /\r/gm, '' ).replace( /&#39;/g, "'" );
				
				// Don't save text editor textareas.
				if ( data[ i ].name.indexOf( 'flrich' ) > -1 ) {
					continue;
				}
				// Support foo[]... setting keys.
				else if ( data[ i ].name.indexOf( '[' ) > -1 ) {
					
					name 	= data[ i ].name.replace( /\[(.*)\]/, '' );
					key  	= data[ i ].name.replace( name, '' );
					keys	= [];
					matches = key.match( /\[[^\]]*\]/g );
					
					// Remove [] from the keys.
					for ( k = 0; k < matches.length; k++ ) {
						
						if ( '[]' === matches[ k ] ) {
							continue;
						}
						
						keys.push( matches[ k ].replace( /[\[\]]/g, '' ) );
					}


					var f = function(object, val, head, tail) {
						if( tail.length === 0) {
							object[ head ] = val;
						} else {
							if( 'undefined' === typeof object [ head ] ) {
								object [ head ] = {};
							}
							f(object[ head ], val, tail.shift(), tail);
						}
					};

					if(keys.length > 0) {

						var keysCopy = keys.slice();
						if ( 'undefined' === typeof settings[ name ] ) {
							settings[ name ] = {};
						}
						f(settings[ name ], value, keysCopy.shift(), keysCopy);
					} else {

						if ( 'undefined' === typeof settings[ name ] ) {
							settings[ name ] = [];
						}

						settings[ name ].push( value );
					}
				}
				// Standard name/value pair.
				else {
					settings[ data[ i ].name ] = value;
				}
			}
			
			// Update auto suggest values.
			for ( key in settings ) {
				
				if ( 'undefined' !== typeof settings[ 'as_values_' + key ] ) {
					
					settings[ key ] = $.grep(
						settings[ 'as_values_' + key ].split( ',' ),
						function( n ) {
							return n !== '';
						}
					).join( ',' );
					
					try {
						delete settings[ 'as_values_' + key ];
					}
					catch( e ) {}
				}
			}
			
			// In the case of multi-select or checkboxes we need to put the blank setting back in.
			$.each( form.find( '[name]' ), function( key, input ) {
				var name = $( input ).attr( 'name' ).replace( /\[(.*)\]/, '' );
				if ( ! ( name in settings ) ) {
					settings[ name ] = '';
				}
			});
			
			if ( typeof FLBuilder._getOriginalSettings === 'function' ) {
				// Merge in the original settings in case legacy fields haven't rendered yet.
				settings = $.extend( {}, FLBuilder._getOriginalSettings( form ), settings );
			}
			
			var widgetForm = form.find( '.siteorigin-widget-form' );
			if ( widgetForm.length ) {
				var widgetSettingKey = 'widget-' + sowbForms.getWidgetIdBase( widgetForm );
				settings[ widgetSettingKey ] = sowbForms.getWidgetFormValues( widgetForm );
			}
			// Return the settings.
			return settings;
		}
	}

	// To ensure necessary scripts are executed again when settings are changed
	$( document ).on( 'fl-builder.preview-rendered fl-builder.layout-rendered', '.fl-builder-content', function() {
		// Trigger Widgets Bundle widgets to setup
		$( sowb ).trigger( 'setup_widgets', { preview: true } );
	} );

})(jQuery);

window.sowb = sowb;
beaver-builder/sowb-beaver-builder.min.js000064400000003111151534575400014421 0ustar00var sowb=window.sowb||{};!function(e){"undefined"!=typeof FLBuilder&&(sowb.orig_FLBuilder_initJQueryReadyFix=FLBuilder._initJQueryReadyFix,FLBuilder._initJQueryReadyFix=function(){},sowb.orig_FLBuilder_getSettings=FLBuilder._getSettings,FLBuilder._getSettings=function(i){FLBuilder._updateEditorFields();var r=i.serializeArray(),t=0,n=0,d="",l="",a="",o=[],u=[],s={};for(t=0;t<r.length;t++)if(d=r[t].value.replace(/\r/gm,"").replace(/&#39;/g,"'"),!(r[t].name.indexOf("flrich")>-1))if(r[t].name.indexOf("[")>-1){for(l=r[t].name.replace(/\[(.*)\]/,""),o=[],u=(a=r[t].name.replace(l,"")).match(/\[[^\]]*\]/g),n=0;n<u.length;n++)"[]"!==u[n]&&o.push(u[n].replace(/[\[\]]/g,""));var g=function(e,i,r,t){0===t.length?e[r]=i:(void 0===e[r]&&(e[r]={}),g(e[r],i,t.shift(),t))};if(o.length>0){var f=o.slice();void 0===s[l]&&(s[l]={}),g(s[l],d,f.shift(),f)}else void 0===s[l]&&(s[l]=[]),s[l].push(d)}else s[r[t].name]=d;for(a in s)if(void 0!==s["as_values_"+a]){s[a]=e.grep(s["as_values_"+a].split(","),(function(e){return""!==e})).join(",");try{delete s["as_values_"+a]}catch(e){}}e.each(i.find("[name]"),(function(i,r){var t=e(r).attr("name").replace(/\[(.*)\]/,"");t in s||(s[t]="")})),"function"==typeof FLBuilder._getOriginalSettings&&(s=e.extend({},FLBuilder._getOriginalSettings(i),s));var c=i.find(".siteorigin-widget-form");if(c.length){var w="widget-"+sowbForms.getWidgetIdBase(c);s[w]=sowbForms.getWidgetFormValues(c)}return s}),e(document).on("fl-builder.preview-rendered fl-builder.layout-rendered",".fl-builder-content",(function(){e(sowb).trigger("setup_widgets",{preview:!0})}))}(jQuery),window.sowb=sowb;beaver-builder/styles.css000064400000046744151534575400011521 0ustar00.fl-lightbox .siteorigin-widget-form .wp-picker-container .wp-color-result.button,.siteorigin-widgets-query-builder.media-modal .wp-picker-container .wp-color-result.button{height:30px;margin:0 6px 6px 0;padding:0 0 0 30px}.fl-lightbox .siteorigin-widget-form .wp-picker-container .wp-color-result.button .wp-color-result-text,.siteorigin-widgets-query-builder.media-modal .wp-picker-container .wp-color-result.button .wp-color-result-text{font-size:11px;background:#f7f7f7;border-radius:0 2px 2px 0;border-left:1px solid #ccc;color:#555;display:block;height:100%;line-height:29.8px;padding:0 6px;text-align:center}.fl-lightbox .siteorigin-widget-form.siteorigin-widget-form-main,.siteorigin-widgets-query-builder.media-modal.siteorigin-widget-form-main{min-width:inherit}.fl-lightbox .siteorigin-widget-form .siteorigin-widget-teaser .dashicons,.siteorigin-widgets-query-builder.media-modal .siteorigin-widget-teaser .dashicons{font-family:dashicons}.fl-lightbox .siteorigin-widget-form .siteorigin-widget-field input,.siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field input{margin:0 !important}.fl-lightbox .siteorigin-widget-form .siteorigin-widget-field input[type="checkbox"],.siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field input[type="checkbox"]{vertical-align:middle}.fl-lightbox .siteorigin-widget-form .siteorigin-widget-field input.siteorigin-widget-input-color,.siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field input.siteorigin-widget-input-color{height:inherit !important}.fl-lightbox .siteorigin-widget-form .siteorigin-widget-field input.siteorigin-widget-input-measurement,.siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field input.siteorigin-widget-input-measurement{margin:1px !important;height:inherit}.fl-lightbox .siteorigin-widget-form .siteorigin-widget-field select.siteorigin-widget-input,.siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field select.siteorigin-widget-input{height:inherit;padding:3px}.fl-lightbox .siteorigin-widget-form .siteorigin-widget-field .siteorigin-widget-field-type-slider input[type="number"],.siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field .siteorigin-widget-field-type-slider input[type="number"]{display:none !important}.fl-lightbox .siteorigin-widget-form .siteorigin-widget-field .clear,.siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field .clear{clear:both}.fl-lightbox .siteorigin-widget-form .siteorigin-widget-field.siteorigin-widget-field-type-media .media-fallback-external,.siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field.siteorigin-widget-field-type-media .media-fallback-external{margin-top:4px !important;margin-left:15px !important;max-width:220px}.fl-lightbox .siteorigin-widget-form .siteorigin-widget-field.siteorigin-widget-field-type-autocomplete .select-content-button,.siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field.siteorigin-widget-field-type-autocomplete .select-content-button,.fl-lightbox .siteorigin-widget-form .siteorigin-widget-field.siteorigin-widget-field-type-link .select-content-button,.siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field.siteorigin-widget-field-type-link .select-content-button{height:36px;padding:6px 0}.fl-lightbox .siteorigin-widget-form .siteorigin-widget-field .siteorigin-widget-field-repeater .siteorigin-widget-field-repeater-items .siteorigin-widget-field-repeater-item .siteorigin-widget-field-repeater-item-top>h4,.siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field .siteorigin-widget-field-repeater .siteorigin-widget-field-repeater-items .siteorigin-widget-field-repeater-item .siteorigin-widget-field-repeater-item-top>h4{padding:initial}.fl-lightbox .siteorigin-widget-form .sow-icon-elegantline,.siteorigin-widgets-query-builder.media-modal .sow-icon-elegantline,.fl-lightbox .siteorigin-widget-form .sow-icon-fontawesome,.siteorigin-widgets-query-builder.media-modal .sow-icon-fontawesome,.fl-lightbox .siteorigin-widget-form .sow-icon-genericons,.siteorigin-widgets-query-builder.media-modal .sow-icon-genericons,.fl-lightbox .siteorigin-widget-form .sow-icon-icomoon,.siteorigin-widgets-query-builder.media-modal .sow-icon-icomoon,.fl-lightbox .siteorigin-widget-form .sow-icon-ionicons,.siteorigin-widgets-query-builder.media-modal .sow-icon-ionicons,.fl-lightbox .siteorigin-widget-form .sow-icon-typicons,.siteorigin-widgets-query-builder.media-modal .sow-icon-typicons{display:inline-block;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fl-lightbox .siteorigin-widget-form .sow-icon-elegantline,.siteorigin-widgets-query-builder.media-modal .sow-icon-elegantline{font-family:'sow-elegantline' !important}.fl-lightbox .siteorigin-widget-form .sow-fas,.siteorigin-widgets-query-builder.media-modal .sow-fas{font-family:'sow-fontawesome-free' !important;font-weight:900}.fl-lightbox .siteorigin-widget-form .sow-fab,.siteorigin-widgets-query-builder.media-modal .sow-fab{font-family:'sow-fontawesome-brands' !important}.fl-lightbox .siteorigin-widget-form .sow-far,.siteorigin-widgets-query-builder.media-modal .sow-far{font-family:'sow-fontawesome-free' !important;font-weight:400}.fl-lightbox .siteorigin-widget-form .sow-icon-genericons,.siteorigin-widgets-query-builder.media-modal .sow-icon-genericons{font-family:'sow-genericons' !important}.fl-lightbox .siteorigin-widget-form .sow-icon-icomoon,.siteorigin-widgets-query-builder.media-modal .sow-icon-icomoon{font-family:'sow-icomoon' !important}.fl-lightbox .siteorigin-widget-form .sow-icon-ionicons,.siteorigin-widgets-query-builder.media-modal .sow-icon-ionicons{font-family:'sow-ionicons' !important}.fl-lightbox .siteorigin-widget-form .sow-icon-typicons,.siteorigin-widgets-query-builder.media-modal .sow-icon-typicons{font-family:'sow-typicons' !important}.fl-lightbox .siteorigin-widget-form .button,.siteorigin-widgets-query-builder.media-modal .button,.fl-lightbox .siteorigin-widget-form .button-secondary,.siteorigin-widgets-query-builder.media-modal .button-secondary{display:inline-block;text-decoration:none;font-size:13px;line-height:26px;height:28px;margin:0;padding:0 10px 1px;cursor:pointer;border:1px solid #cccccc;border-radius:3px;white-space:nowrap;box-sizing:border-box;font-family:inherit;font-weight:normal;text-transform:capitalize;color:#555;background:#f7f7f7}.fl-lightbox .siteorigin-widget-form .button:hover,.siteorigin-widgets-query-builder.media-modal .button:hover,.fl-lightbox .siteorigin-widget-form .button-secondary:hover,.siteorigin-widgets-query-builder.media-modal .button-secondary:hover,.fl-lightbox .siteorigin-widget-form .button:focus,.siteorigin-widgets-query-builder.media-modal .button:focus,.fl-lightbox .siteorigin-widget-form .button-secondary:focus,.siteorigin-widgets-query-builder.media-modal .button-secondary:focus{background:#fafafa;border-color:#999;color:#23282d}.fl-lightbox .siteorigin-widget-form .button:active,.siteorigin-widgets-query-builder.media-modal .button:active,.fl-lightbox .siteorigin-widget-form .button-secondary:active,.siteorigin-widgets-query-builder.media-modal .button-secondary:active,.fl-lightbox .siteorigin-widget-form .button:focus,.siteorigin-widgets-query-builder.media-modal .button:focus,.fl-lightbox .siteorigin-widget-form .button-secondary:focus,.siteorigin-widgets-query-builder.media-modal .button-secondary:focus{outline:none}.fl-lightbox .siteorigin-widget-form .button.hidden,.siteorigin-widgets-query-builder.media-modal .button.hidden,.fl-lightbox .siteorigin-widget-form .button-secondary.hidden,.siteorigin-widgets-query-builder.media-modal .button-secondary.hidden{display:none}.fl-lightbox .siteorigin-widget-form .button.button-small,.siteorigin-widgets-query-builder.media-modal .button.button-small{height:23px;line-height:22px;padding:0 8px 1px;font-size:11px}.fl-lightbox .siteorigin-widget-form select,.siteorigin-widgets-query-builder.media-modal select,.fl-lightbox .siteorigin-widget-form input[type=text],.siteorigin-widgets-query-builder.media-modal input[type=text]{margin:1px;border-radius:0;font-weight:inherit;border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,0.07);background-color:#fff;color:#32373c;outline:0;transition:50ms border-color ease-in-out}.fl-lightbox .siteorigin-widget-form .ui-autocomplete,.siteorigin-widgets-query-builder.media-modal .ui-autocomplete{padding:0;margin:0;list-style:none;position:absolute;z-index:10000;border:1px solid #5b9dd9;box-shadow:0 1px 2px rgba(30,140,190,0.8);background-color:#fff}.fl-lightbox .siteorigin-widget-form .ui-autocomplete li,.siteorigin-widgets-query-builder.media-modal .ui-autocomplete li{margin-bottom:0;padding:4px 10px;white-space:nowrap;text-align:left}.fl-lightbox .siteorigin-widget-form .ui-autocomplete li.ui-state-focus,.siteorigin-widgets-query-builder.media-modal .ui-autocomplete li.ui-state-focus{background-color:#ddd;cursor:pointer}.so-widgets-dialog .so-widgets-search-input{width:100%}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form-notification,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal-notification{background-color:#383f46;border-color:transparent}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-widget>label,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-widget>label,.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-section>label,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-section>label{background:#383f46;border-color:#676d72}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-posts .siteorigin-widget-section,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-posts .siteorigin-widget-section,.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-widget .siteorigin-widget-section,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-widget .siteorigin-widget-section,.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-section .siteorigin-widget-section,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-section .siteorigin-widget-section{background-color:transparent;border-color:#676d72}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-icon .siteorigin-widget-icon-selector-current,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-icon .siteorigin-widget-icon-selector-current,.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-icon .siteorigin-widget-icon-selector,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-icon .siteorigin-widget-icon-selector{background:#383f46;border-color:#676d72}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-icon .siteorigin-widget-icon-selector-current .siteorigin-widget-icon,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-icon .siteorigin-widget-icon-selector-current .siteorigin-widget-icon,.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-icon .siteorigin-widget-icon-selector .siteorigin-widget-icon,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-icon .siteorigin-widget-icon-selector .siteorigin-widget-icon,.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-icon .siteorigin-widget-icon-selector-current .siteorigin-widget-icon-icons-icon,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-icon .siteorigin-widget-icon-selector-current .siteorigin-widget-icon-icons-icon,.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-icon .siteorigin-widget-icon-selector .siteorigin-widget-icon-icons-icon,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-icon .siteorigin-widget-icon-selector .siteorigin-widget-icon-icons-icon{background-color:#131a22;border-color:#676d72}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-icon .siteorigin-widget-icon-selector-current>label,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-icon .siteorigin-widget-icon-selector-current>label,.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-icon .siteorigin-widget-icon-selector>label,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-icon .siteorigin-widget-icon-selector>label{text-shadow:none}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .wp-picker-container .wp-color-result.button,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .wp-picker-container .wp-color-result.button{min-height:0}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .wp-picker-container .wp-color-result.button .wp-color-result-text,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .wp-picker-container .wp-color-result.button .wp-color-result-text{border-color:#424242;background-color:#131a22}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .wp-picker-container .wp-picker-holder .iris-border,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .wp-picker-container .wp-picker-holder .iris-border{border-color:#424242;background-color:#131a22}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-media .media-field-wrapper,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-media .media-field-wrapper{background:#383f46;border-color:#676d72}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-media .media-field-wrapper>.current,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-media .media-field-wrapper>.current{border-right:1px solid #676d72;box-shadow:none}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-media .media-field-wrapper>.current .thumbnail-wrapper,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-media .media-field-wrapper>.current .thumbnail-wrapper{background:#131a22;border-color:#676d72}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-media .media-field-wrapper .find-image-button,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-media .media-field-wrapper .find-image-button{border-left:1px solid #676d72}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-media .media-field-wrapper>a,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-media .media-field-wrapper>a{text-shadow:none}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-media .media-field-wrapper>a:hover,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-media .media-field-wrapper>a:hover{background-color:transparent}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-repeater .siteorigin-widget-field-repeater-top,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-repeater .siteorigin-widget-field-repeater-top{background:#383f46;border-color:#676d72}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-repeater .siteorigin-widget-field-repeater-items,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-repeater .siteorigin-widget-field-repeater-items{background:#383f46;border-color:#676d72}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-repeater .siteorigin-widget-field-repeater-items .siteorigin-widget-field-repeater-item,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-repeater .siteorigin-widget-field-repeater-items .siteorigin-widget-field-repeater-item{background:#383f46;border-color:#676d72}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-repeater .siteorigin-widget-field-repeater-items .siteorigin-widget-field-repeater-item .siteorigin-widget-field-repeater-item-top,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-repeater .siteorigin-widget-field-repeater-items .siteorigin-widget-field-repeater-item .siteorigin-widget-field-repeater-item-top{background:#383f46;border-color:#676d72}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-repeater .siteorigin-widget-field-repeater-items .siteorigin-widget-field-repeater-item .siteorigin-widget-field-repeater-item-form,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-repeater .siteorigin-widget-field-repeater-items .siteorigin-widget-field-repeater-item .siteorigin-widget-field-repeater-item-form{border-top:1px solid #676d72}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-repeater .siteorigin-widget-field-repeater-add,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-repeater .siteorigin-widget-field-repeater-add{background:#383f46;border-color:#676d72}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-posts .posts-container-label-wrapper,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-posts .posts-container-label-wrapper{background:#383f46;border-color:#676d72}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-posts .siteorigin-widget-section,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-posts .siteorigin-widget-section,.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-widget .siteorigin-widget-section,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-widget .siteorigin-widget-section,.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .siteorigin-widget-field-type-section .siteorigin-widget-section,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .siteorigin-widget-field-type-section .siteorigin-widget-section{background:#32373c;border-color:#424242}.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .button,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .button,.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .wp-color-result-text,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .wp-color-result-text,.fl-builder-ui-skin--dark .fl-lightbox .siteorigin-widget-form .button.button-small,.fl-builder-ui-skin--dark .siteorigin-widgets-query-builder.media-modal .button.button-small{border-color:#424242;background-color:#131a22}block-editor/assets/icon.svg000064400000005136151534575400012113 0ustar00<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="256" height="256"><defs><linearGradient id="b" x1="50%" x2="97.955%" y1="66.059%" y2="100%"><stop offset="0%" stop-color="#ED8A00"/><stop offset="29.273%" stop-color="#F49B1E"/><stop offset="100%" stop-color="#FCB044"/><stop offset="100%" stop-color="#FCAF45"/><stop offset="100%" stop-color="#FCB044"/></linearGradient><linearGradient id="d" x1="50%" x2="50%" y1="0%" y2="100%"><stop offset="0%" stop-color="#FFF"/><stop offset="100%" stop-color="#FFF" stop-opacity=".364"/></linearGradient><rect id="a" width="256" height="256" x="0" y="0" rx="64"/><rect id="c" width="256" height="256" x="0" y="0" rx="64"/></defs><g fill="none" fill-rule="evenodd"><g fill="url(#b)"><use xlink:href="#a"/><use xlink:href="#c"/></g><g transform="translate(45.827 56.889)"><path fill="#FDEED8" d="M34.603 49.374v25.639h-15.21zM128.106 49.374l15.21 25.639h-15.21z"/><path fill="#FADEB6" d="m16.985 34.048 17.609 15.339-15.201 25.626L0 50.004zM145.912 34.017l16.853 15.987-19.449 25.009-15.25-25.656z"/><path fill="#F8C479" d="M34.603 49.374h93.503v25.639H34.603z"/><circle cx="80.593" cy="41.086" r="8.217" fill="#FFF" fill-rule="nonzero" opacity=".703"/><path fill="url(#d)" fill-rule="nonzero" d="M116.2 32.87h-6.628a29.349 29.349 0 0 0-2.794-6.63l4.766-4.765c2.137-2.137 2.137-5.643 0-7.78l-3.89-3.889c-2.136-2.137-5.642-2.137-7.778 0L95 14.682c-1.972-1.041-4.054-1.918-6.19-2.52V5.478C88.81 2.465 86.345 0 83.332 0h-5.479c-3.013 0-5.478 2.465-5.478 5.478v6.629c-2.246.602-4.382 1.534-6.41 2.63L60.982 9.75c-2.137-2.136-5.643-2.136-7.78 0l-3.889 3.89c-2.136 2.136-2.136 5.642 0 7.779l4.985 4.985a27.227 27.227 0 0 0-2.63 6.41h-6.683c-3.013.054-5.478 2.52-5.478 5.532v5.479c0 3.013 2.465 5.478 5.478 5.478h6.629c.603 2.136 1.424 4.218 2.52 6.19l-4.876 4.876c-2.136 2.136-2.136 5.642 0 7.779l3.89 3.89c2.136 2.136 5.642 2.136 7.779 0l4.766-4.767a29.349 29.349 0 0 0 6.629 2.794v6.629c0 3.013 2.465 5.478 5.478 5.478h5.478c3.013 0 5.478-2.465 5.478-5.478v-6.629c2.246-.603 4.383-1.534 6.41-2.63l4.656 4.657c2.137 2.136 5.643 2.136 7.78 0l3.889-3.89c2.136-2.136 2.136-5.642 0-7.779l-4.657-4.656a27.227 27.227 0 0 0 2.63-6.41h6.738c3.013 0 5.478-2.465 5.478-5.478v-5.533c0-3.013-2.465-5.478-5.478-5.478ZM80.594 57.52a16.413 16.413 0 0 1-16.435-16.435c0-9.093 7.34-16.434 16.435-16.434 9.093 0 16.434 7.34 16.434 16.434 0 9.094-7.34 16.435-16.434 16.435Z"/><path fill="#FFF" d="M19.393 75.013h123.923l-6.779 63.832a3.776 3.776 0 0 1-3.755 3.377H30.223a3.776 3.776 0 0 1-3.753-3.36l-7.077-63.85Z"/><path fill="#FADBB6" d="M19.393 75.013h123.923l-17.993 26.884H38.091z"/></g></g></svg>block-editor/register-widget-blocks.js000064400000043570151534575400014062 0ustar00const soRegisterWidgetBlocks = async ( widgets ) => {
	const { __ } = wp.i18n;
	const { el } = wp.element;

	if ( widgets['siteorigin-widget-accordion-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-accordion-widget', {
			title: __( 'SiteOrigin Accordion', 'so-widgets-bundle' ),
			description: __( 'Efficiently display content in expandable sections, maximizing space for improved organization.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-anything-carousel-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-anything-carousel-widget', {
			title: __( 'SiteOrigin Anything Carousel', 'so-widgets-bundle' ),
			description: __( 'Display images, text, or any content in a highly customizable and responsive carousel slider.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-author-box-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-author-box-widget', {
			title: __( 'SiteOrigin Author Box', 'so-widgets-bundle' ),
			description: __( 'Display author information, including avatar, name, bio, and post links in a customizable box.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-blog-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-blog-widget', {
			title: __( 'SiteOrigin Blog', 'so-widgets-bundle' ),
			description: __( 'Showcase blog content in personalized list or grid layouts with flexible design and display settings.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-button-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-button-widget', {
			title: __( 'SiteOrigin Button', 'so-widgets-bundle' ),
			description: __( 'Create a custom button with flexible styling, icon support, and click tracking functionality.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-button-grid-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-button-grid-widget', {
			title: __( 'SiteOrigin Button Grid', 'so-widgets-bundle' ),
			description: __( 'Add multiple buttons in one go, customize individually, and present them in a neat grid layout.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-cta-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-cta-widget', {
			title: __( 'SiteOrigin Call To Action', 'so-widgets-bundle' ),
			description: __( 'Prompt visitors to take action with a customizable title, subtitle, button, and design settings.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widgets-contactform-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widgets-contactform-widget', {
			title: __( 'SiteOrigin Contact Form', 'so-widgets-bundle' ),
			description: __( 'Add a contact form with custom fields, design options, spam protection, and email notifications.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-editor-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-editor-widget', {
			title: __( 'SiteOrigin Editor', 'so-widgets-bundle' ),
			description: __( 'Insert and customize content with a rich text editor offering extensive formatting options.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-features-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-features-widget', {
			title: __( 'SiteOrigin Features', 'so-widgets-bundle' ),
			description: __( 'Showcase features with icons, titles, text, and links in a customizable grid layout.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-googlemap-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-googlemap-widget', {
			title: __( 'SiteOrigin Google Maps', 'so-widgets-bundle' ),
			description: __( 'Embed a customizable Google Map with markers, directions, styling options, and interactive elements.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-headline-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-headline-widget', {
			title: __( 'SiteOrigin Headline', 'so-widgets-bundle' ),
			description: __( 'Engage visitors with a prominent, stylish headline and optional divider and sub-headline to convey key messages.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-hero-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-hero-widget', {
			title: __( 'SiteOrigin Hero Image', 'so-widgets-bundle' ),
			description: __( 'Build an impressive hero image section with custom content, buttons, background image, color, and video.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-icon-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-icon-widget', {
			title: __( 'SiteOrigin Icon', 'so-widgets-bundle' ),
			description: __( 'Display a customizable icon with color, size, alignment, and optional link settings.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-image-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-image-widget', {
			title: __( 'SiteOrigin Image', 'so-widgets-bundle' ),
			description: __( 'Add a responsive image with custom dimensions, positioning, caption, link, and styling options.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widgets-imagegrid-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widgets-imagegrid-widget', {
			title: __( 'SiteOrigin Image Grid', 'so-widgets-bundle' ),
			description: __( 'Showcase images in a responsive grid layout with custom size, spacing, alignment, and captions.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-layoutslider-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-layoutslider-widget', {
			title: __( 'SiteOrigin Layout Slider', 'so-widgets-bundle' ),
			description: __( 'Design responsive slider frames with unique layouts, backgrounds, and content built with Page Builder.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-lottie-player-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-lottie-player-widget', {
			title: __( 'SiteOrigin Lottie Player', 'so-widgets-bundle' ),
			description: __( 'Bring your content to life using interactive Lottie animations with personalized settings and links.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-postcarousel-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-postcarousel-widget', {
			title: __( 'SiteOrigin Post Carousel', 'so-widgets-bundle' ),
			description: __( 'Display blog posts or custom post types in a responsive, customizable carousel layout.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-pricetable-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-pricetable-widget', {
			title: __( 'SiteOrigin Price Table', 'so-widgets-bundle' ),
			description: __( 'Display pricing plans in a professional table format with custom columns, features, and design.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-recent-posts-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-recent-posts-widget', {
			title: __( 'SiteOrigin Recent Posts', 'so-widgets-bundle' ),
			description: __( 'Drive traffic to your latest content with a visually appealing, fully customizable recent posts showcase.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-simple-masonry-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-simple-masonry-widget', {
			title: __( 'SiteOrigin Simple Masonry Layout', 'so-widgets-bundle' ),
			description: __( 'Display images in an attractive masonry grid with adjustable columns, gutters, and optional captions.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-slider-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-slider-widget', {
			title: __( 'SiteOrigin Image Slider', 'so-widgets-bundle' ),
			description: __( 'Create a responsive slider with customizable image and video frames, navigation, and appearance settings.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-socialmediabuttons-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-socialmediabuttons-widget', {
			title: __( 'SiteOrigin Social Media Buttons', 'so-widgets-bundle' ),
			description: __( 'Add social media buttons to your site with personalized icons, colors, and design settings.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-tabs-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-tabs-widget', {
			title: __( 'SiteOrigin Tabs', 'so-widgets-bundle' ),
			description: __( 'Create tabbed content panels with customizable titles, content, initial tab, and design settings.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-taxonomy-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-taxonomy-widget', {
			title: __( 'SiteOrigin Taxonomy', 'so-widgets-bundle' ),
			description: __( 'Automatically display the taxonomies of the current post with customizable labels, colors, and link settings.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widgets-testimonials-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widgets-testimonials-widget', {
			title: __( 'SiteOrigin Testimonials', 'so-widgets-bundle' ),
			description: __( 'Feature testimonials from satisfied customers with tailored layouts, images, text, colors, and mobile compatibility.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}

	if ( widgets['siteorigin-widget-video-widget'] ) {
		wp.blocks.registerBlockType( 'sowb/siteorigin-widget-video-widget', {
			title: __( 'SiteOrigin Video Player', 'so-widgets-bundle' ),
			description: __( 'Embed self-hosted or externally hosted videos with a customizable player, controls, and responsive sizing.', 'so-widgets-bundle' ),
			attributes: {
				widgetClass: { type: 'string' },
				anchor: { type: 'string' },
				widgetData: { type: 'object' },
				widgetMarkup: { type: 'string' },
				widgetIcons: { type: 'array' },
			},
			edit: () => el( 'div', {}, __( 'Loading Widget', 'so-widgets-bundle' ) ),
			save: () => null
		} );
	}
}
block-editor/register-widget-blocks.min.js000064400000034711151534575400014641 0ustar00const soRegisterWidgetBlocks=async t=>{const{__:i}=wp.i18n,{el:e}=wp.element;t["siteorigin-widget-accordion-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-accordion-widget",{title:i("SiteOrigin Accordion","so-widgets-bundle"),description:i("Efficiently display content in expandable sections, maximizing space for improved organization.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-anything-carousel-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-anything-carousel-widget",{title:i("SiteOrigin Anything Carousel","so-widgets-bundle"),description:i("Display images, text, or any content in a highly customizable and responsive carousel slider.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-author-box-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-author-box-widget",{title:i("SiteOrigin Author Box","so-widgets-bundle"),description:i("Display author information, including avatar, name, bio, and post links in a customizable box.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-blog-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-blog-widget",{title:i("SiteOrigin Blog","so-widgets-bundle"),description:i("Showcase blog content in personalized list or grid layouts with flexible design and display settings.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-button-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-button-widget",{title:i("SiteOrigin Button","so-widgets-bundle"),description:i("Create a custom button with flexible styling, icon support, and click tracking functionality.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-button-grid-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-button-grid-widget",{title:i("SiteOrigin Button Grid","so-widgets-bundle"),description:i("Add multiple buttons in one go, customize individually, and present them in a neat grid layout.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-cta-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-cta-widget",{title:i("SiteOrigin Call To Action","so-widgets-bundle"),description:i("Prompt visitors to take action with a customizable title, subtitle, button, and design settings.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widgets-contactform-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widgets-contactform-widget",{title:i("SiteOrigin Contact Form","so-widgets-bundle"),description:i("Add a contact form with custom fields, design options, spam protection, and email notifications.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-editor-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-editor-widget",{title:i("SiteOrigin Editor","so-widgets-bundle"),description:i("Insert and customize content with a rich text editor offering extensive formatting options.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-features-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-features-widget",{title:i("SiteOrigin Features","so-widgets-bundle"),description:i("Showcase features with icons, titles, text, and links in a customizable grid layout.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-googlemap-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-googlemap-widget",{title:i("SiteOrigin Google Maps","so-widgets-bundle"),description:i("Embed a customizable Google Map with markers, directions, styling options, and interactive elements.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-headline-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-headline-widget",{title:i("SiteOrigin Headline","so-widgets-bundle"),description:i("Engage visitors with a prominent, stylish headline and optional divider and sub-headline to convey key messages.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-hero-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-hero-widget",{title:i("SiteOrigin Hero Image","so-widgets-bundle"),description:i("Build an impressive hero image section with custom content, buttons, background image, color, and video.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-icon-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-icon-widget",{title:i("SiteOrigin Icon","so-widgets-bundle"),description:i("Display a customizable icon with color, size, alignment, and optional link settings.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-image-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-image-widget",{title:i("SiteOrigin Image","so-widgets-bundle"),description:i("Add a responsive image with custom dimensions, positioning, caption, link, and styling options.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widgets-imagegrid-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widgets-imagegrid-widget",{title:i("SiteOrigin Image Grid","so-widgets-bundle"),description:i("Showcase images in a responsive grid layout with custom size, spacing, alignment, and captions.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-layoutslider-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-layoutslider-widget",{title:i("SiteOrigin Layout Slider","so-widgets-bundle"),description:i("Design responsive slider frames with unique layouts, backgrounds, and content built with Page Builder.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-lottie-player-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-lottie-player-widget",{title:i("SiteOrigin Lottie Player","so-widgets-bundle"),description:i("Bring your content to life using interactive Lottie animations with personalized settings and links.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-postcarousel-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-postcarousel-widget",{title:i("SiteOrigin Post Carousel","so-widgets-bundle"),description:i("Display blog posts or custom post types in a responsive, customizable carousel layout.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-pricetable-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-pricetable-widget",{title:i("SiteOrigin Price Table","so-widgets-bundle"),description:i("Display pricing plans in a professional table format with custom columns, features, and design.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-recent-posts-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-recent-posts-widget",{title:i("SiteOrigin Recent Posts","so-widgets-bundle"),description:i("Drive traffic to your latest content with a visually appealing, fully customizable recent posts showcase.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-simple-masonry-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-simple-masonry-widget",{title:i("SiteOrigin Simple Masonry Layout","so-widgets-bundle"),description:i("Display images in an attractive masonry grid with adjustable columns, gutters, and optional captions.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-slider-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-slider-widget",{title:i("SiteOrigin Image Slider","so-widgets-bundle"),description:i("Create a responsive slider with customizable image and video frames, navigation, and appearance settings.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-socialmediabuttons-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-socialmediabuttons-widget",{title:i("SiteOrigin Social Media Buttons","so-widgets-bundle"),description:i("Add social media buttons to your site with personalized icons, colors, and design settings.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-tabs-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-tabs-widget",{title:i("SiteOrigin Tabs","so-widgets-bundle"),description:i("Create tabbed content panels with customizable titles, content, initial tab, and design settings.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-taxonomy-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-taxonomy-widget",{title:i("SiteOrigin Taxonomy","so-widgets-bundle"),description:i("Automatically display the taxonomies of the current post with customizable labels, colors, and link settings.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widgets-testimonials-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widgets-testimonials-widget",{title:i("SiteOrigin Testimonials","so-widgets-bundle"),description:i("Feature testimonials from satisfied customers with tailored layouts, images, text, colors, and mobile compatibility.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null}),t["siteorigin-widget-video-widget"]&&wp.blocks.registerBlockType("sowb/siteorigin-widget-video-widget",{title:i("SiteOrigin Video Player","so-widgets-bundle"),description:i("Embed self-hosted or externally hosted videos with a customizable player, controls, and responsive sizing.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:()=>e("div",{},i("Loading Widget","so-widgets-bundle")),save:()=>null})};block-editor/widget-block.css000064400000003027151534575400012222 0ustar00.editor-styles-wrapper .so-widget-block-container h1,.editor-styles-wrapper .so-widget-preview-container h1,.editor-styles-wrapper .so-widget-block-container h2,.editor-styles-wrapper .so-widget-preview-container h2,.editor-styles-wrapper .so-widget-block-container h3,.editor-styles-wrapper .so-widget-preview-container h3,.editor-styles-wrapper .so-widget-block-container h4,.editor-styles-wrapper .so-widget-preview-container h4,.editor-styles-wrapper .so-widget-block-container h5,.editor-styles-wrapper .so-widget-preview-container h5,.editor-styles-wrapper .so-widget-block-container,.editor-styles-wrapper .so-widget-preview-container{color:#1e1e1e}.editor-styles-wrapper .so-widget-block-container ul.components-form-token-field__suggestions-list{margin:0;padding:0}.editor-styles-wrapper .so-widget-block-container .components-base-control__label{display:none}.editor-styles-wrapper .so-widget-block-container input[type="checkbox"]{appearance:checkbox}.editor-styles-wrapper .so-widget-block-container input[type="checkbox"]::before{content:none}.editor-styles-wrapper .so-widget-block-container .mce-edit-area{padding:5px;padding-right:0}.editor-styles-wrapper .so-widget-block-container .wp-picker-container .iris-picker{width:256px !important;max-width:100%;height:227px !important}.editor-styles-wrapper .so-widget-block-container a{color:#2271b1}.editor-styles-wrapper .so-widget-block-container a:hover,.editor-styles-wrapper .so-widget-block-container a:focus{color:#1e1e1e}.editor-styles-wrapper .so-widget-preview-container{min-height:50px}block-editor/widget-block.js000064400000074265151534575400012062 0ustar00( async function( blocks, i18n, element, components, blockEditor ) {

	const el = element.createElement;
	const registerBlockType = blocks.registerBlockType;
	const BlockControls = blockEditor.BlockControls;
	const {
		Component,
		useMemo
	} = element;

	const {
		Toolbar,
		ToolbarButton,
		Placeholder,
		Button,
		Spinner
	} = components;

	const { __, sprintf } = i18n;

	const { updateCategory } = blocks;

	const getAjaxErrorMsg = ( response ) => {
		let errorMessage = '';
		if ( response.hasOwnProperty( 'responseJSON' ) ) {
			errorMessage = response.responseJSON.message;
		} else if ( response.hasOwnProperty( 'responseText' ) ) {
			errorMessage = response.responseText;
		}
		return errorMessage;
	}

	// Certain widgets are excluded from the content check as
	// they don't contain "standard" content indicators.
	const widgetsExcludedFromContentCheck = [
		'sowb/siteorigin-widget-googlemap-widget',
		'sowb/siteorigin-widget-icon-widget',
	];

	/**
	 * Generate a widget preview.
	 *
	 * This function generates a preview for the widget by making
	 * an AJAX request to the server. It sets the loading state,
	 * sends the request, and updates the state with the preview
	 * HTML or an error message based on the response.
	 *
	 * @param {Object} props - The properties passed to the function.
	 * @param {boolean} loadingWidgetPreview - Indicates if the widget preview is currently loading.
	 * @param {Function} setState - The setState function to update the component's state.
	 * @param {Object} [widgetData=false] - The data for the widget. Defaults to false.
	 * @param {string} [widgetClass=false] - The class of the widget. Defaults to false.
	 */
	const sowbGenerateWidgetPreview = ( props, loadingWidgetPreview, setState, widgetData = false, widgetClass = false ) => {
		if ( loadingWidgetPreview ) {
			return;
		}

		setState( {
			loadingWidgetPreview: true,
			widgetPreviewHtml: null,
		} );

		const canLockPostSaving = typeof wp.data.select( 'core/editor' ) == 'object' &&
			typeof wp.data.dispatch( 'core/editor' ) == 'object';

		if ( canLockPostSaving ) {
			wp.data.dispatch( 'core/editor' ).lockPostSaving();
		}

		/**
		 * Check if the provided HTML contains any text or images.
		 *
		 * This function creates a temporary DOM element with the provided HTML,
		 * checks if there is any text content or images present, and returns
		 * a boolean indicating whether the HTML should be rendered.
		 *
		 * @param {string} html - The HTML string to check for content.
		 *
		 * @returns {boolean} - Returns true if the HTML contains text or images,
		 * false otherwise.
		 */
		const checkHtmlForContent = ( html ) => {
			const tempElement = jQuery( '<div>' + html + '</div>' );
			let renderPreviewHtml = false;

			const widgetContent = tempElement.find( 'div:first-of-type' );
			if ( widgetContent.length > 0 ) {
				// Is there any text present?
				if ( widgetContent.text().trim() !== '' ) {
					renderPreviewHtml = true;

				// No text is present. Check for anything that
				// could be considered content.
				} else if ( widgetContent.find( 'img, video, a' ).length > 0 ) {
					renderPreviewHtml = true;
				}
			}

			tempElement.remove();

			return renderPreviewHtml;
		};

		jQuery.post( {
			url: sowbBlockEditorAdmin.restUrl + 'sowb/v1/widgets/previews',
			beforeSend: ( xhr ) => {
				xhr.setRequestHeader( 'X-WP-Nonce', sowbBlockEditorAdmin.nonce );
			},
			data: {
				anchor: props.attributes.anchor,
				widgetClass: widgetClass,
				widgetData: widgetData ? widgetData : props.attributes.widgetData || {}
			}
		} )
		.done( ( widgetPreview ) => {
			let renderPreviewHtml = false;

			// Is the preview empty?
			if ( widgetPreview.html ) {
				// Is this widget excluded from the content check?
				if ( widgetsExcludedFromContentCheck.includes( props.name ) ) {
					renderPreviewHtml = true;
				} else {
					renderPreviewHtml = checkHtmlForContent( widgetPreview.html );
				}
			}

			if ( ! renderPreviewHtml ) {
				widgetPreview.html = '<div class="so-widget-preview-empty">' + __( 'No widget preview available.', 'so-widgets-bundle' ) + '</div>';
			}

			setState( {
				widgetPreviewHtml: widgetPreview.html,
				previewInitialized: false,
			} );

			props.setAttributes( {
				widgetMarkup: widgetPreview.html,
				widgetIcons: widgetPreview.icons
			} );
		} )
		.fail( ( response ) => {
			setState( { widgetFormHtml: '<div>' + getAjaxErrorMsg( response ) + '</div>' } );
		} )
		.always( () => {
			if ( canLockPostSaving ) {
				wp.data.dispatch( 'core/editor' ).unlockPostSaving();
			}
			setState( { loadingWidgetPreview: false } );
		} );
	}

	/**
	 * Memoized component for WidgetBlockEdit.
	 *
	 * This function memoizes the WidgetBlockEdit component to
	 * prevent unnecessary re-renders. It uses the useMemo hook to
	 * only re-render the component when the props or widget change.
	 *
	 * @param {Object} params - The parameters passed to the function.
	 * @param {Object} params.props - The properties passed to the WidgetBlockEdit component.
	 * @param {Object} params.widget - The widget data passed to the WidgetBlockEdit component.
	 *
	 * @returns {Object} The memoized WidgetBlockEdit component.
	 */
	const memoizedWidgetBlockEdit = ( { props, widget } ) => {
		return useMemo( () =>
			el(
				WidgetBlockEdit,
				{ ...props, widget }
			),
			[ props, widget ]
		);
	};

	/**
	 * Set up the widget form.
	 *
	 * This function sets up the widget form by initializing the
	 * form, setting widget data, and handles triggering
	 * componentDidUpdate. It ensures that the form is only set up
	 * once and prevents unnecessary re-renders.
	 *
	 * @param {Object} props - The properties passed to the function.
	 * @param {Object} state - The current state of the component.
	 * @param {Function} setState - The setState function to update the component's state.
	 */
	const sowbSetupWidgetForm = ( props, state, setState ) => {
		const $mainForm = jQuery( '[data-block="' + props.clientId + '"]' ).find( '.siteorigin-widget-form-main' );

		if ( $mainForm.length > 0 && ! state.formInitialized ) {
			const $previewContainer = $mainForm.siblings( '.siteorigin-widget-preview' );
			$previewContainer.find( '> a' ).on( 'click', function( event ) {
				event.stopImmediatePropagation();

				setState( {
					editing: false,
					previewInitialized: false,
					widgetPreviewHtml: false,
				} );
			} );

			$mainForm.data( 'backupDisabled', true );

			if ( props.attributes.widgetData ) {
				// If we call `setWidgetFormValues` with the last parameter
				// ( `triggerChange` ) set to false, it won't show the correct values
				// for some fields e.g. color and media fields.
				sowbForms.setWidgetFormValues( $mainForm, props.attributes.widgetData );
			} else {
				props.setAttributes( { widgetData: sowbForms.getWidgetFormValues( $mainForm ) } );
			}

			$mainForm.sowSetupForm();

			$mainForm.on( 'change', function() {
				// As setAttributes doesn't support callbacks, we have to manually
				// pass the widgetData to the preview.
				var widgetData = sowbForms.getWidgetFormValues( $mainForm );
				props.setAttributes( { widgetData: widgetData } );

				// Set up a preview debounce timer to prevent multiple requests.
				clearTimeout( state.previewDebounceTimer );

				state.previewDebounceTimer = setTimeout( () => {
					sowbGenerateWidgetPreview(
						props,
						state.loadingWidgetPreview,
						setState,
						widgetData,
						props.widget.class
					);
				}, 300 );
			} );
			setState( { formInitialized: true } );
		}
	}

	/**
	 * WidgetBlockEdit component.
	 *
	 * This component handles the editing and previewing of SiteOrigin
	 * Widget Blocks. It manages:
	 * - the state of the widget form.
	 * - the state of the widget preview.
	 * - the initialization and loading of the widget form and preview.
	 *
	 */
	class WidgetBlockEdit extends Component {

		constructor( props ) {
			super( props );

			this.initialState = {
				// If this widget was just added, show the form.
				editing: props.attributes.widgetData === undefined,
				formInitialized: false,
				loadingForm: false,
				loadingWidgetPreview: false,
				previewInitialized: false,
				widgetFormHtml: '',
				widgetPreviewHtml: '',
				widgetSettingsChanged: false,
				previewDebounceTimer: null,
			};

			this.state = {
				... this.initialState,
				isStillMounted: true
			};

			// Store the widget class if it's not already set.
			if ( ! props.attributes.widgetClass ) {
				this.props.setAttributes( { widgetClass: props.widget.class } );
			}
		}

		componentDidMount() {
			this.setState( {
				...this.initialState,
				isStillMounted: true
			} );

			this.loadWidgetData();
		}

		componentWillUnmount() {
			this.setState( {
				...this.initialState,
				isStillMounted: false
			} );
		}

		componentDidUpdate( prevProps, prevState ) {
			if ( ! this.state.isStillMounted ) {
				return;
			}

			if (
				this.state.editing !== prevState.editing ||
				this.props.attributes.widgetData !== prevProps.attributes.widgetData
			) {
				// If there's been an update, clear the preview.
				this.setState( {
					widgetSettingsChanged: true,
					widgetPreviewHtml: null,
					previewInitialized: false
				} );

				this.loadWidgetData();
			}
		}

		loadWidgetData() {
			if ( ! this.state.isStillMounted ) {
				return;
			}

			const {
				editing,
				widgetFormHtml,
				loadingForm,
				loadingWidgetPreview
			} = this.state;
			const { attributes } = this.props;

			if (
				editing ||
				! attributes.widgetData
			) {
				const loadWidgetForm = ! widgetFormHtml.length;

				if ( loadWidgetForm && ! loadingForm ) {
					this.setState( { loadingForm: true });
					jQuery.post( {
						url: sowbBlockEditorAdmin.restUrl + 'sowb/v1/widgets/forms',
						beforeSend: (xhr) => {
							xhr.setRequestHeader( 'X-WP-Nonce', sowbBlockEditorAdmin.nonce );
						},
						data: {
							widgetClass: this.props.widget.class,
							widgetData: attributes.widgetData,
						}
					} )
					.done( ( widgetForm ) => {
						this.setState( {
							widgetFormHtml: widgetForm
						} );

						setTimeout( () => {
							this.setState( {
								loadingForm: false,
								formInitialized: false,
							} );
						}, 0 );
					} )
					.fail( ( response) => {
						this.setState( { widgetFormHtml: '<div>' + getAjaxErrorMsg( response ) + '</div>' } );
					} );
				}
				return;
			}

			const loadWidgetPreview = ! loadingWidgetPreview && ! editing;

			if ( loadWidgetPreview ) {
				this.props.setAttributes( {
					widgetMarkup: null,
					widgetIcons: null
				} );

				sowbGenerateWidgetPreview(
					this.props,
					this.state.loadingWidgetPreview,
					this.setState.bind( this ),
					false,
					this.props.widget.class
				);
			}
		}

		render() {
			const { editing, widgetFormHtml, loadingForm, widgetPreviewHtml, loadingWidgetPreview, previewInitialized } = this.state;
			const { attributes } = this.props;

			return el(
				'div',
				null,
				editing || ! attributes.widgetData ? [
					!! widgetFormHtml && el(
						BlockControls,
						{ key: 'controls' },
						el(
							Toolbar,
							{ label: __( 'Preview widget.' + editing, 'so-widgets-bundle' ) },
							el(
								ToolbarButton,
								{
									className: 'components-icon-button components-toolbar__control',
									label: __( 'Preview widget.', 'so-widgets-bundle' ),
									onClick: () => this.setState( {
										editing: false,
									} ),
									icon: 'visibility'
								}
							)
						)
					),
					el(
						Placeholder,
						{
							key: 'placeholder',
							className: 'so-widget-block-form',
							label: this.props.widget.name,
							instructions: this.props.widget.description
						},
						loadingForm ?
						el( 'div',
							{
								className: 'so-widgets-spinner-container'
							},
							el(
								'span',
								null,
								el( Spinner )
							)
						) :
						el( 'div', {
							className: 'so-widget-block-container',
							dangerouslySetInnerHTML: { __html: widgetFormHtml },
							ref: () => sowbSetupWidgetForm(
								this.props,
								this.state,
								this.setState.bind( this ),
								this.props.widget.class
							)
						} )
					)
				] : [
					el(
						BlockControls,
						{ key: 'controls' },
						el(
							Toolbar,
							{ label: __( 'Edit widget.', 'so-widgets-bundle' ) },
							el(
								ToolbarButton,
								{
									className: 'components-icon-button components-toolbar__control',
									label: __( 'Edit widget.', 'so-widgets-bundle' ),
									onClick: () => this.setState( {
										editing: true,
										loadingForm: false,
										widgetFormHtml: '',
										formInitialized: false,
									} ),
									icon: 'edit'
								}
							)
						)
					),
					el(
						'div',
						{
							key: 'preview',
							className: 'so-widget-preview-container'
						},
						loadingWidgetPreview ?
						el( 'div',
							{ className: 'so-widgets-spinner-container' },
							el(
								'span',
								null,
								el( Spinner )
							)
						) :
						el( 'div', {
							dangerouslySetInnerHTML: {
								__html: widgetPreviewHtml
							},
							ref: () => {
								if ( ! previewInitialized ) {
									jQuery( window.sowb ).trigger( 'setup_widgets', { preview: true } );
									this.setState( { previewInitialized: true } );
								}
							}
						} )
					)
				]
			);
		}
	}


	registerBlockType( 'sowb/widget-block', {
		title: __( 'SiteOrigin Widgets Block', 'so-widgets-bundle' ),
		description: __( 'This block is intended as a legacy placeholder.', 'so-widgets-bundle' ),
		attributes: {
			widgetClass: {
				type: 'string',
			},
			anchor: {
				type: 'string',
			},
			widgetData: {
				type: 'object',
			},
			widgetMarkup: {
				type: 'string',
			},
			widgetIcons: {
				type: 'array',
			},
			widgetNotFound: {
				type: 'boolean',
			}
		},
		supports: {
			inserter: false,
		},
		icon: function() {
			return el(
				'span',
				{
					className: 'widget-icon so-widget-icon so-block-editor-icon so-widget-icon-default'
				}
			)
		},
		edit: function( props ) {
			const [ isAdmin, setIsAdmin ] = element.useState( false );
			const [ isLoading, setIsLoading ] = element.useState( true );

			element.useEffect( () => {
				doesUserHaveAdminPermissions().then( hasPermission => {
					setIsAdmin( hasPermission );
					setIsLoading( false );
				} );
			}, [] );

			if ( props.attributes.widgetNotFound ) {
				return el(
					Placeholder,
					{
						label: __( 'SiteOrigin Widget', 'so-widgets-bundle' ),
						className: 'so-widget-block-form'
					},
					el(
						'p',
						null,
						sprintf(
							__( 'The widget for %s cannot be found.', 'so-widgets-bundle' ),
							props.attributes.widgetClass
						)
					)
				);
			}

			if ( isLoading ) {
				return el( 'div',
					{
						className: 'so-widget-block-form so-widgets-spinner-container'
					},
					el(
						'span',
						null,
						el( Spinner )
					)
				);
			}

			return el(
				'div',
				{
					className: 'so-widget-block-form'
				},
				el(
					Placeholder,
					{
						label: __( 'Legacy SiteOrigin Widget', 'so-widgets-bundle' ),
					},
					el( 'p', {
						dangerouslySetInnerHTML: {
							__html: sowbBlockEditorAdmin.legacyNotice
						}
					} ),
					isAdmin ?
					el(
						Button,
						{
							isPrimary: true,
							onClick: () => {
								setIsLoading(true);

								// Migrate the blocks.
								setTimeout( () => {
									sowbBlockEditorAdmin.consent = true;
									sowbBlockEditorAdmin.consentGiven = true;
									sowbMigrateOldBlocks();
								}, 0 );

								// Log the user's consent.
								jQuery.post( ajaxurl, {
									action: 'so_widgets_block_migration_notice_consent',
									nonce: sowbBlockEditorAdmin.migrationNotice
								} );
							},
						},
						__( 'Migrate to New Block Format', 'so-widgets-bundle' )
					) :
					el(
						'span',
						null,
						__( 'Please contact your site administrator to migrate this block.', 'so-widgets-bundle' )
					)
				)
			);
		},
		save: function () {
			return null;
		},
	} );

	let adminPermissionCheck = null;
	/**
	 * Checks if current user has admin permissions to migrate widgets.
	 * Uses a Promise to cache the result and prevent multiple API calls.
	 *
	 * @return {Promise<boolean>} Promise that resolves to true if user has permissions.
	 */
	const doesUserHaveAdminPermissions = () => {
		// If we already have a permission check in progress, return that promise.
		if ( adminPermissionCheck !== null ) {
			return adminPermissionCheck;
		}

		adminPermissionCheck = new Promise( ( resolve, reject ) => {
			jQuery.post( {
				url: sowbBlockEditorAdmin.restUrl + 'sowb/v1/widgets/permission',
				beforeSend: ( xhr ) => {
					xhr.setRequestHeader( 'X-WP-Nonce', sowbBlockEditorAdmin.nonce );
				},
			} )
			.done( ( canMigrateWidgets ) => {
				resolve(canMigrateWidgets);
			} )
			.fail( ( error ) => {
				console.error('Failed to check admin permissions:', error);
				resolve( false );
			} );
		} );

		return adminPermissionCheck;
	};

	const sowbManuallyRegisteredBlocks = {};
	const sowbWidgets = [ ...Object.values( sowbBlockEditorAdmin.widgets ) ];

	/**
	 * Identifies widgets that need manual block registration.
	 *
	 * This function examines each widget to determine if it needs special handling:
	 * 1. Skips and removes widgets without a blockName.
	 * 2. Identifies widgets marked for manual registration and adds them to the
	 *    sowbManuallyRegisteredBlocks object.
	 * 3. Removes manually registered widgets from the general widgets list to
	 *    prevent duplicate registration.
	 *
	 * @param {Object} widget - The widget configuration object.
	 * @param {string} widget.blockName - Block identifier name.
	 * @param {boolean} [widget.manuallyRegister] - Whether widget needs manual registration.
	 * @param {string} widget.class - PHP class of the widget.
	 * @param {key} key - The key of the widget in the widgets list.
	 *
	 * @return {void}
	 */
	const identifyBlocksThatNeedManualRegistration = async ( widget, key ) => {
		// Don't register any blocks that don't have a blockName.
		if ( ! widget.blockName ) {
			delete sowbWidgets[ key ];
			return;
		}

		// Skip any blocks that are manually registered.
		if (
			widget.manuallyRegister !== undefined &&
			widget.manuallyRegister
		) {
			sowbManuallyRegisteredBlocks[ widget.blockName ] = widget;
			delete sowbWidgets[ key ];
			return;
		}
	}

	// Register all Widget Bundle widgets, and build `sowbManuallyRegisteredBlocks`.
	await Promise.all(
		Object.entries( sowbWidgets ).map( async ( [ key, widget ] ) => {
			identifyBlocksThatNeedManualRegistration( widget, key );
		} )
	);

	// Register all of our manually registered blocks.
	await soRegisterWidgetBlocks( sowbManuallyRegisteredBlocks );

	// Modify all of the manually registered blocks with additional properties.
	Object.entries( sowbManuallyRegisteredBlocks ).forEach( ( [ key, widget ] ) => {
		wp.hooks.addFilter(
			'blocks.registerBlockType',
			'sowb/' + widget.blockName,
			function ( settings, name ) {
				if ( name !== 'sowb/' + widget.blockName ) {
					return settings;
				}

				return {
					...settings,
					icon: function() {
						return widget.icon ?
							el(
								'img',
								{
									className: 'widget-icon so-widget-icon so-block-editor-icon',
									src: widget.icon,
									alt: widget.name
								}
							)
							: el(
								'span',
								{
									className: 'widget-icon so-widget-icon so-block-editor-icon so-widget-icon-default'
								}
							)
					},
					category: 'siteorigin',
					supports: {
						html: false,
						anchor: true,
					},
					edit: ( props ) => el(
						memoizedWidgetBlockEdit, { props, widget }
					)
				};
			}
		);
	} );

	/**
	 * Registers a SiteOrigin Widget as a block.
	 *
	 * This function takes a widget configuration object and registers it as
	 * a block using the block editor API.
	 *
	 * @param {Object} widget - The widget configuration object
	 * @param {string} widget.class - PHP class name of the widget
	 * @param {string} widget.blockName - Block identifier (without the 'sowb/' prefix)
	 * @param {string} widget.name - Display name shown in the block inserter
	 * @param {string} widget.description - Block description text
	 * @param {string} [widget.icon] - URL to the widget's icon image
	 * @param {Array} [widget.keywords] - Search keywords for the block inserter
	 * @return {void}
	 */
	const setupSoWidgetBlock = ( widget ) => {
		registerBlockType( 'sowb/' + widget.blockName, {
			title: widget.name,
			description: widget.description,
			icon: function() {
				return widget.icon ?
				el(
					'img',
					{
						className: 'widget-icon so-widget-icon so-block-editor-icon',
						src: widget.icon,
						alt: widget.name
					}
				)
				: el(
					'span',
					{
						className: 'widget-icon so-widget-icon so-block-editor-icon so-widget-icon-default'
					}
				)
			},
			category: 'siteorigin',
			keywords: widget.keywords ? widget.keywords : '',
			supports: {
				html: false,
				anchor: true,
			},
			attributes: {
				widgetClass: {
					type: 'string',
				},
				anchor: {
					type: 'string',
				},
				widgetData: {
					type: 'object',
				},
				widgetMarkup: {
					type: 'string',
				},
				widgetIcons: {
					type: 'array',
				},
			},
			edit: ( props ) => el( memoizedWidgetBlockEdit, { props, widget } ),
			save: function( context ) {
				// This block is dynamic and rendered on the server.
				return null;
			},
		} );
	};

	// Register all blocks that haven't been manually registered.
	await sowbWidgets.forEach( setupSoWidgetBlock );

  // Add SiteOrigin Widgets Bundle Block Category Meta.
	updateCategory( 'siteorigin', {
		icon: el( 'img', {
			src: sowbBlockEditorAdmin.categoryIcon,
			alt: __( 'SiteOrigin Widgets Bundle Blocks Category', 'so-widgets-bundle' ),
			style: {
				height: '20px',
				width: '20px',
			}
		} )
	} );
} )( window.wp.blocks, window.wp.i18n, window.wp.element, window.wp.components, window.wp.blockEditor );

/**
 * Find all legacy SiteOrigin widget blocks in the editor.
 *
 * Recursively traverses blocks and their inner blocks to find all legacy
 * SiteOrigin widget blocks. Handles widget areas differently by directly
 * accessing their blocks through the block editor store.
 *
 * @param {Array} blocks Array of blocks to check.
 *
 * @returns {Array} Array of found legacy widget blocks.
 */
const sowbFindLegacyBlocks = ( blocks ) => {
	return blocks.reduce( ( legacyBlocks, block ) => {
		 // If the current block is widget area, we need to handle
		 // things slightly different.
		if ( block.name === 'core/widget-area' ) {
			const innerBlocks = wp.data.select( 'core/block-editor' ).getBlocks( block.clientId );

			innerBlocks.forEach( widget => {
				if ( widget.name === 'sowb/widget-block' ) {
					legacyBlocks.push( widget );
				}
			} );

			return legacyBlocks;
		}

		if ( block.name === 'sowb/widget-block' ) {
			legacyBlocks.push( block );
		}

		// Recursively check innerBlocks if they exist.
		if ( block.innerBlocks && block.innerBlocks.length > 0 ) {
			legacyBlocks.push( ...sowbFindLegacyBlocks( block.innerBlocks ) );
		}

		return legacyBlocks;
	}, [] );
};

const sowbIsWidgetActive = ( widgetClass ) => {
	return sowbBlockEditorAdmin.widgets.find(widget => widget.class === widgetClass)
};

let sowbMigrateBlockSubscribe = false;
let sowbMigrationInProgress = false;
/**
 * Migrate SiteOrigin Widget Blocks to their dedicated widget block.
 *
 * This function subscribes to the block editor data store and
 * migrates any legacy 'sowb/widget-block' blocks to their new block types.
 * After migration, it removes the legacy widget block and unsubscribes
 * from the data store.
 */
const sowbMigrateOldBlocks = () => {
	if ( sowbMigrationInProgress === true ) {
		return;
	}

	const blocks = wp.data.select( 'core/block-editor' ).getBlocks();
	if ( blocks.length === 0 ) {
		return;
	}

	// Find any legacy WB blocks.
	const legacyBlocks = sowbFindLegacyBlocks( blocks );
	if ( legacyBlocks.length === 0 ) {
		return;
	}

	// Confirm consent, or admin status.
	if ( ! sowbBlockEditorAdmin.consent ) {
		// If this is the initial check, we might be able to stop
		// further attempts to process this.
		if ( typeof sowbMigrateBlockSubscribe === 'function' ) {
			sowbMigrateBlockSubscribe();
		}
		return;
	}

	sowbMigrationInProgress = true;

	try {
		legacyBlocks.forEach( currentBlock => {
			try {
				// Before migrating widget, confirm the widget is active.
				if ( ! sowbIsWidgetActive( currentBlock.attributes.widgetClass ) ) {
					// We need to update the widgetNotFound flag to indicate
					// the widget is no longer available.
					const attributes = { ...currentBlock.attributes };
					attributes.widgetNotFound = true;
					wp.data.dispatch( 'core/block-editor' ).updateBlock(
						currentBlock.clientId,
						{ attributes }
					);
					return;
				}

				const newBlock = wp.blocks.createBlock(
					'sowb/' + currentBlock.attributes.widgetClass.toLowerCase().replace( /_/g, '-' ),
					currentBlock.attributes
				);

				if ( newBlock ) {
					wp.data.dispatch( 'core/block-editor' ).replaceBlock(
						currentBlock.clientId,
						newBlock
					);
				}
			} catch ( err ) {
				console.error( 'SiteOrigin Widget Block migration failed:', err );
			}
		} );
	} finally {
		// Finished migrating, reset the flag.
		setTimeout( () => {
			sowbMigrationInProgress = false;
		}, 100 );
	}

	if ( sowbBlockEditorAdmin.consentGiven ) {
		return false;
	}

	return sowbRemoveLegacyWidgetBlock();
};

/**
 * Remove the legacy widget block, and prevent further migration attempts.
 *
 * This function prevents further migration attempts by unsubscribing
 * the migration process.
 *
 * @returns {boolean} Returns false to prevent further execution.
 */
const sowbRemoveLegacyWidgetBlock = () => {
	setTimeout( () => {
		if ( typeof sowbMigrateBlockSubscribe === 'function' ) {
			sowbMigrateBlockSubscribe();
		}
	}, 0 );

	return false;
};

/**
 * Check if a block is a missing SiteOrigin widget block.
 *
 * @param {Object} block Block to check.
 *
 * @return {boolean} True if block is a missing SiteOrigin widget.
 */
const sowbIsMissingBlockSowb = ( block ) => {
	return block.name === 'core/missing' &&
		block.isValid &&
		block.attributes &&
		block.attributes.originalName.startsWith( 'sowb/' )
};

/**
 * Find all missing SiteOrigin widget blocks in the editor.
 *
 * Recursively traverses blocks and their inner blocks to find missing
 * SiteOrigin widgets. Handles widget areas differently by directly
 * accessing their blocks through the block editor store.
 *
 * @param {Array} inactiveBlocks Array of blocks to check.
 *
 * @return {Array} Array of found missing SiteOrigin widget blocks.
 */
const sowbFindInactiveBlock = ( inactiveBlocks ) => {
	return inactiveBlocks.reduce( ( blocks, block ) => {
		 // If the current block is widget area, we need to handle
		 // things slightly different.
		if ( block.name === 'core/widget-area' ) {
			const innerBlocks = wp.data.select( 'core/block-editor' ).getBlocks( block.clientId );

			innerBlocks.forEach( block => {
				if ( sowbIsMissingBlockSowb( block ) ) {
					blocks.push( block );
				}
			} );

			return blocks;
		}

		if ( sowbIsMissingBlockSowb( block ) ) {
			blocks.push( block );
		}

		// Recursively check innerBlocks if present.
		if ( block.innerBlocks && block.innerBlocks.length > 0 ) {
			blocks.push( ...sowbFindInactiveBlock( block.innerBlocks ) );
		}

		return blocks;
	}, [] );
};

jQuery( function( $ ) {
	if ( ! $( 'body.block-editor-page' ).length ) {
		return;
	}

	if ( sowbBlockEditorAdmin.consent ) {
		sowbMigrateBlockSubscribe = wp.data.subscribe( sowbMigrateOldBlocks );
	}

	/**
	 * Update warning messages for inactive SiteOrigin widget blocks.
	 *
	 * @param {Array} blocks Array of inactive blocks to update.
	 */
	const sowbUpdateInactiveBlocksMessage = ( blocks ) => {
		blocks.forEach( block => {
			const message = document.querySelector( `[data-block="${ block.clientId }"] .block-editor-warning__message` );
			if ( ! message ) {
				return;
			}

			message.innerHTML = sprintf(
				wp.i18n.__( 'The "%s" block is currently not available. The plugin or theme that powers the block might be deactivated or not installed. You can leave it as is or remove it. %sRead our troubleshooting guide for more details%s.', 'so-widgets-bundle' ),
				`<strong>${block.attributes.originalName}</strong>`,
				'<a href="https://siteorigin.com/widgets-bundle/troubleshooting/" target="_blank" rel="noopener noreferrer">',
				'</a>'
			);
		} );
	};

	/**
	 * Handle inactive SiteOrigin widget blocks in the editor.
	 *
	 * Sets up subscription to monitor for missing widget
	 * blocks and updates their warning messages with
	 * helpful information. Uses setTimeout to
	 * ensure DOM is ready before modifying messages.
	 *
	 * @return {Function} Cleanup function that unsubscribes from block editor.
 	*/
	const sowbHandleInactiveWidgets = wp.data.subscribe( () => {
		// Are we good to start checking?
		const blocks = wp.data.select( 'core/block-editor' ).getBlocks();
		if ( blocks.length === 0 ) {
			return;
		}

		const inactiveBlocks = sowbFindInactiveBlock( blocks );
		if ( ! inactiveBlocks.length ) {
			return;
		}

		setTimeout( () => {
			sowbUpdateInactiveBlocksMessage( inactiveBlocks );
		}, 0 );

		sowbHandleInactiveWidgets();
	} );
} );

if (
	typeof adminpage != 'undefined' &&
	adminpage != 'widgets-php' &&
	typeof wp.data.select == 'function'
) {

	let sowbTimeoutSetup = false;
	// Setup SiteOrigin Widgets Block Validation.
	wp.data.subscribe( function() {
		if (
			! sowbTimeoutSetup &&
			typeof wp.data.select( 'core/editor' ) == 'object' &&
			wp.data.select( 'core/editor' ).isSavingPost()
		) {
			sowbTimeoutSetup = true;
			var saveCheck = setInterval( function() {

				if (
					! wp.data.select( 'core/editor' ).isSavingPost() &&
					! wp.data.select( 'core/editor' ).isAutosavingPost() &&
					wp.data.select( 'core/editor' ).didPostSaveRequestSucceed()
				) {
					clearInterval( saveCheck );
					var showPrompt = true;
					var sowbCurrentBlocks = wp.data.select( 'core/block-editor' ).getBlocks();
					for ( var i = 0; i < sowbCurrentBlocks.length; i++ ) {
						if ( sowbCurrentBlocks[ i ].name.startsWith( 'sowb/' ) && sowbCurrentBlocks[ i ].isValid ) {
							$form = jQuery( '#block-' + sowbCurrentBlocks[ i ].clientId ).find( '.so-widget-block-form' );
							if ( ! sowbForms.validateFields( $form, showPrompt) ) {
							 	showPrompt = false;
							}
							$form.find( '.siteorigin-widget-field-is-required input' ).on( 'change', function() {
								sowbForms.validateFields( $form );
							} );
						}
					}
					sowbTimeoutSetup = false;
				}
			}, 250 );
		}
	} );
}
block-editor/widget-block.min.js000064400000030542151534575400012632 0ustar00!async function(e,t,i,o,s){const n=i.createElement,r=e.registerBlockType,a=s.BlockControls,{Component:d,useMemo:l}=i,{Toolbar:c,ToolbarButton:g,Placeholder:w,Button:b,Spinner:u}=o,{__:p,sprintf:m}=t,{updateCategory:k}=e,h=e=>{let t="";return e.hasOwnProperty("responseJSON")?t=e.responseJSON.message:e.hasOwnProperty("responseText")&&(t=e.responseText),t},f=["sowb/siteorigin-widget-googlemap-widget","sowb/siteorigin-widget-icon-widget"],v=(e,t,i,o=!1,s=!1)=>{if(t)return;i({loadingWidgetPreview:!0,widgetPreviewHtml:null});const n="object"==typeof wp.data.select("core/editor")&&"object"==typeof wp.data.dispatch("core/editor");n&&wp.data.dispatch("core/editor").lockPostSaving();jQuery.post({url:sowbBlockEditorAdmin.restUrl+"sowb/v1/widgets/previews",beforeSend:e=>{e.setRequestHeader("X-WP-Nonce",sowbBlockEditorAdmin.nonce)},data:{anchor:e.attributes.anchor,widgetClass:s,widgetData:o||(e.attributes.widgetData||{})}}).done(t=>{let o=!1;t.html&&(o=!!f.includes(e.name)||(e=>{const t=jQuery("<div>"+e+"</div>");let i=!1;const o=t.find("div:first-of-type");return o.length>0&&(""!==o.text().trim()||o.find("img, video, a").length>0)&&(i=!0),t.remove(),i})(t.html)),o||(t.html='<div class="so-widget-preview-empty">'+p("No widget preview available.","so-widgets-bundle")+"</div>"),i({widgetPreviewHtml:t.html,previewInitialized:!1}),e.setAttributes({widgetMarkup:t.html,widgetIcons:t.icons})}).fail(e=>{i({widgetFormHtml:"<div>"+h(e)+"</div>"})}).always(()=>{n&&wp.data.dispatch("core/editor").unlockPostSaving(),i({loadingWidgetPreview:!1})})},y=({props:e,widget:t})=>l(()=>n(B,{...e,widget:t}),[e,t]);class B extends d{constructor(e){super(e),this.initialState={editing:void 0===e.attributes.widgetData,formInitialized:!1,loadingForm:!1,loadingWidgetPreview:!1,previewInitialized:!1,widgetFormHtml:"",widgetPreviewHtml:"",widgetSettingsChanged:!1,previewDebounceTimer:null},this.state={...this.initialState,isStillMounted:!0},e.attributes.widgetClass||this.props.setAttributes({widgetClass:e.widget.class})}componentDidMount(){this.setState({...this.initialState,isStillMounted:!0}),this.loadWidgetData()}componentWillUnmount(){this.setState({...this.initialState,isStillMounted:!1})}componentDidUpdate(e,t){this.state.isStillMounted&&(this.state.editing===t.editing&&this.props.attributes.widgetData===e.attributes.widgetData||(this.setState({widgetSettingsChanged:!0,widgetPreviewHtml:null,previewInitialized:!1}),this.loadWidgetData()))}loadWidgetData(){if(!this.state.isStillMounted)return;const{editing:e,widgetFormHtml:t,loadingForm:i,loadingWidgetPreview:o}=this.state,{attributes:s}=this.props;if(e||!s.widgetData){return void(!t.length&&!i&&(this.setState({loadingForm:!0}),jQuery.post({url:sowbBlockEditorAdmin.restUrl+"sowb/v1/widgets/forms",beforeSend:e=>{e.setRequestHeader("X-WP-Nonce",sowbBlockEditorAdmin.nonce)},data:{widgetClass:this.props.widget.class,widgetData:s.widgetData}}).done(e=>{this.setState({widgetFormHtml:e}),setTimeout(()=>{this.setState({loadingForm:!1,formInitialized:!1})},0)}).fail(e=>{this.setState({widgetFormHtml:"<div>"+h(e)+"</div>"})})))}!o&&!e&&(this.props.setAttributes({widgetMarkup:null,widgetIcons:null}),v(this.props,this.state.loadingWidgetPreview,this.setState.bind(this),!1,this.props.widget.class))}render(){const{editing:e,widgetFormHtml:t,loadingForm:i,widgetPreviewHtml:o,loadingWidgetPreview:s,previewInitialized:r}=this.state,{attributes:d}=this.props;return n("div",null,e||!d.widgetData?[!!t&&n(a,{key:"controls"},n(c,{label:p("Preview widget."+e,"so-widgets-bundle")},n(g,{className:"components-icon-button components-toolbar__control",label:p("Preview widget.","so-widgets-bundle"),onClick:()=>this.setState({editing:!1}),icon:"visibility"}))),n(w,{key:"placeholder",className:"so-widget-block-form",label:this.props.widget.name,instructions:this.props.widget.description},i?n("div",{className:"so-widgets-spinner-container"},n("span",null,n(u))):n("div",{className:"so-widget-block-container",dangerouslySetInnerHTML:{__html:t},ref:()=>((e,t,i)=>{const o=jQuery('[data-block="'+e.clientId+'"]').find(".siteorigin-widget-form-main");if(o.length>0&&!t.formInitialized){o.siblings(".siteorigin-widget-preview").find("> a").on("click",(function(e){e.stopImmediatePropagation(),i({editing:!1,previewInitialized:!1,widgetPreviewHtml:!1})})),o.data("backupDisabled",!0),e.attributes.widgetData?sowbForms.setWidgetFormValues(o,e.attributes.widgetData):e.setAttributes({widgetData:sowbForms.getWidgetFormValues(o)}),o.sowSetupForm(),o.on("change",(function(){var s=sowbForms.getWidgetFormValues(o);e.setAttributes({widgetData:s}),clearTimeout(t.previewDebounceTimer),t.previewDebounceTimer=setTimeout(()=>{v(e,t.loadingWidgetPreview,i,s,e.widget.class)},300)})),i({formInitialized:!0})}})(this.props,this.state,this.setState.bind(this),this.props.widget.class)}))]:[n(a,{key:"controls"},n(c,{label:p("Edit widget.","so-widgets-bundle")},n(g,{className:"components-icon-button components-toolbar__control",label:p("Edit widget.","so-widgets-bundle"),onClick:()=>this.setState({editing:!0,loadingForm:!1,widgetFormHtml:"",formInitialized:!1}),icon:"edit"}))),n("div",{key:"preview",className:"so-widget-preview-container"},s?n("div",{className:"so-widgets-spinner-container"},n("span",null,n(u))):n("div",{dangerouslySetInnerHTML:{__html:o},ref:()=>{r||(jQuery(window.sowb).trigger("setup_widgets",{preview:!0}),this.setState({previewInitialized:!0}))}}))])}}r("sowb/widget-block",{title:p("SiteOrigin Widgets Block","so-widgets-bundle"),description:p("This block is intended as a legacy placeholder.","so-widgets-bundle"),attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"},widgetNotFound:{type:"boolean"}},supports:{inserter:!1},icon:function(){return n("span",{className:"widget-icon so-widget-icon so-block-editor-icon so-widget-icon-default"})},edit:function(e){const[t,o]=i.useState(!1),[s,r]=i.useState(!0);return i.useEffect(()=>{I().then(e=>{o(e),r(!1)})},[]),e.attributes.widgetNotFound?n(w,{label:p("SiteOrigin Widget","so-widgets-bundle"),className:"so-widget-block-form"},n("p",null,m(p("The widget for %s cannot be found.","so-widgets-bundle"),e.attributes.widgetClass))):s?n("div",{className:"so-widget-block-form so-widgets-spinner-container"},n("span",null,n(u))):n("div",{className:"so-widget-block-form"},n(w,{label:p("Legacy SiteOrigin Widget","so-widgets-bundle")},n("p",{dangerouslySetInnerHTML:{__html:sowbBlockEditorAdmin.legacyNotice}}),t?n(b,{isPrimary:!0,onClick:()=>{r(!0),setTimeout(()=>{sowbBlockEditorAdmin.consent=!0,sowbBlockEditorAdmin.consentGiven=!0,sowbMigrateOldBlocks()},0),jQuery.post(ajaxurl,{action:"so_widgets_block_migration_notice_consent",nonce:sowbBlockEditorAdmin.migrationNotice})}},p("Migrate to New Block Format","so-widgets-bundle")):n("span",null,p("Please contact your site administrator to migrate this block.","so-widgets-bundle"))))},save:function(){return null}});let S=null;const I=()=>(null!==S||(S=new Promise((e,t)=>{jQuery.post({url:sowbBlockEditorAdmin.restUrl+"sowb/v1/widgets/permission",beforeSend:e=>{e.setRequestHeader("X-WP-Nonce",sowbBlockEditorAdmin.nonce)}}).done(t=>{e(t)}).fail(t=>{console.error("Failed to check admin permissions:",t),e(!1)})})),S),F={},P=[...Object.values(sowbBlockEditorAdmin.widgets)];await Promise.all(Object.entries(P).map(async([e,t])=>{(async(e,t)=>{if(e.blockName)return void 0!==e.manuallyRegister&&e.manuallyRegister?(F[e.blockName]=e,void delete P[t]):void 0;delete P[t]})(t,e)})),await soRegisterWidgetBlocks(F),Object.entries(F).forEach(([e,t])=>{wp.hooks.addFilter("blocks.registerBlockType","sowb/"+t.blockName,(function(e,i){return i!=="sowb/"+t.blockName?e:{...e,icon:function(){return t.icon?n("img",{className:"widget-icon so-widget-icon so-block-editor-icon",src:t.icon,alt:t.name}):n("span",{className:"widget-icon so-widget-icon so-block-editor-icon so-widget-icon-default"})},category:"siteorigin",supports:{html:!1,anchor:!0},edit:e=>n(y,{props:e,widget:t})}}))});await P.forEach(e=>{r("sowb/"+e.blockName,{title:e.name,description:e.description,icon:function(){return e.icon?n("img",{className:"widget-icon so-widget-icon so-block-editor-icon",src:e.icon,alt:e.name}):n("span",{className:"widget-icon so-widget-icon so-block-editor-icon so-widget-icon-default"})},category:"siteorigin",keywords:e.keywords?e.keywords:"",supports:{html:!1,anchor:!0},attributes:{widgetClass:{type:"string"},anchor:{type:"string"},widgetData:{type:"object"},widgetMarkup:{type:"string"},widgetIcons:{type:"array"}},edit:t=>n(y,{props:t,widget:e}),save:function(e){return null}})}),k("siteorigin",{icon:n("img",{src:sowbBlockEditorAdmin.categoryIcon,alt:p("SiteOrigin Widgets Bundle Blocks Category","so-widgets-bundle"),style:{height:"20px",width:"20px"}})})}(window.wp.blocks,window.wp.i18n,window.wp.element,window.wp.components,window.wp.blockEditor);const sowbFindLegacyBlocks=e=>e.reduce((e,t)=>{if("core/widget-area"===t.name){return wp.data.select("core/block-editor").getBlocks(t.clientId).forEach(t=>{"sowb/widget-block"===t.name&&e.push(t)}),e}return"sowb/widget-block"===t.name&&e.push(t),t.innerBlocks&&t.innerBlocks.length>0&&e.push(...sowbFindLegacyBlocks(t.innerBlocks)),e},[]),sowbIsWidgetActive=e=>sowbBlockEditorAdmin.widgets.find(t=>t.class===e);let sowbMigrateBlockSubscribe=!1,sowbMigrationInProgress=!1;const sowbMigrateOldBlocks=()=>{if(!0===sowbMigrationInProgress)return;const e=wp.data.select("core/block-editor").getBlocks();if(0===e.length)return;const t=sowbFindLegacyBlocks(e);if(0!==t.length){if(sowbBlockEditorAdmin.consent){sowbMigrationInProgress=!0;try{t.forEach(e=>{try{if(t=e.attributes.widgetClass,!sowbBlockEditorAdmin.widgets.find(e=>e.class===t)){const t={...e.attributes};return t.widgetNotFound=!0,void wp.data.dispatch("core/block-editor").updateBlock(e.clientId,{attributes:t})}const i=wp.blocks.createBlock("sowb/"+e.attributes.widgetClass.toLowerCase().replace(/_/g,"-"),e.attributes);i&&wp.data.dispatch("core/block-editor").replaceBlock(e.clientId,i)}catch(e){console.error("SiteOrigin Widget Block migration failed:",e)}var t})}finally{setTimeout(()=>{sowbMigrationInProgress=!1},100)}return!sowbBlockEditorAdmin.consentGiven&&sowbRemoveLegacyWidgetBlock()}"function"==typeof sowbMigrateBlockSubscribe&&sowbMigrateBlockSubscribe()}},sowbRemoveLegacyWidgetBlock=()=>(setTimeout(()=>{"function"==typeof sowbMigrateBlockSubscribe&&sowbMigrateBlockSubscribe()},0),!1),sowbIsMissingBlockSowb=e=>"core/missing"===e.name&&e.isValid&&e.attributes&&e.attributes.originalName.startsWith("sowb/"),sowbFindInactiveBlock=e=>e.reduce((e,t)=>{if("core/widget-area"===t.name){return wp.data.select("core/block-editor").getBlocks(t.clientId).forEach(t=>{sowbIsMissingBlockSowb(t)&&e.push(t)}),e}return sowbIsMissingBlockSowb(t)&&e.push(t),t.innerBlocks&&t.innerBlocks.length>0&&e.push(...sowbFindInactiveBlock(t.innerBlocks)),e},[]);if(jQuery((function(e){if(!e("body.block-editor-page").length)return;sowbBlockEditorAdmin.consent&&(sowbMigrateBlockSubscribe=wp.data.subscribe(sowbMigrateOldBlocks));const t=wp.data.subscribe(()=>{const e=wp.data.select("core/block-editor").getBlocks();if(0===e.length)return;const i=sowbFindInactiveBlock(e);i.length&&(setTimeout(()=>{(e=>{e.forEach(e=>{const t=document.querySelector(`[data-block="${e.clientId}"] .block-editor-warning__message`);t&&(t.innerHTML=sprintf(wp.i18n.__('The "%s" block is currently not available. The plugin or theme that powers the block might be deactivated or not installed. You can leave it as is or remove it. %sRead our troubleshooting guide for more details%s.',"so-widgets-bundle"),`<strong>${e.attributes.originalName}</strong>`,'<a href="https://siteorigin.com/widgets-bundle/troubleshooting/" target="_blank" rel="noopener noreferrer">',"</a>"))})})(i)},0),t())})})),"undefined"!=typeof adminpage&&"widgets-php"!=adminpage&&"function"==typeof wp.data.select){let e=!1;wp.data.subscribe((function(){if(!e&&"object"==typeof wp.data.select("core/editor")&&wp.data.select("core/editor").isSavingPost()){e=!0;var t=setInterval((function(){if(!wp.data.select("core/editor").isSavingPost()&&!wp.data.select("core/editor").isAutosavingPost()&&wp.data.select("core/editor").didPostSaveRequestSucceed()){clearInterval(t);for(var i=!0,o=wp.data.select("core/block-editor").getBlocks(),s=0;s<o.length;s++)o[s].name.startsWith("sowb/")&&o[s].isValid&&($form=jQuery("#block-"+o[s].clientId).find(".so-widget-block-form"),sowbForms.validateFields($form,i)||(i=!1),$form.find(".siteorigin-widget-field-is-required input").on("change",(function(){sowbForms.validateFields($form)})));e=!1}}),250)}}))}block-editor/widget-block.php000064400000044376151534575400012235 0ustar00<?php

class SiteOrigin_Widgets_Bundle_Widget_Block {
	public $widgetAnchor;
	public $widgetBlocks = array();
	public $hasMigrationConsent = false;
	/**
	 * Get the singleton instance
	 *
	 * @return SiteOrigin_Widgets_Bundle_Widget_Block
	 */
	public static function single() {
		static $single;

		return empty( $single ) ? $single = new self() : $single;
	}

	public function __construct() {
		$this->register_widget_block();
		$this->setup_rest_validation();

		if ( get_option( 'sowb_block_migration', false ) ) {
			$this->hasMigrationConsent = true;
		}

		add_action( 'enqueue_block_editor_assets', array( $this, 'enqueue_widget_block_editor_assets' ) );

		add_action( 'wp_ajax_so_widgets_block_migration_notice_consent', array( $this, 'block_migration_consent' ) );
	}

	/**
	 * Setup REST API validation for SiteOrigin widgets.
	 *
	 * This method sets up server-side validation for SiteOrigin widgets
	 * in the REST API. It retrieves all public post types and adds a
	 * REST API pre-insert action for each post type to perform
	 * server-side validation.
	 *
	 * @return void
	 */
	public function setup_rest_validation() {
		$post_types = get_post_types( array( 'public' => true ), 'names' );
		if ( empty( $post_types ) ) {
			$post_types = array( 'post', 'page' );
		}

		foreach ( $post_types as $post_type ) {
			add_action( 'rest_pre_insert_' . $post_type, array( $this, 'server_side_validation' ), 10, 2 );
		}
	}

	/**
	 * Register SiteOrigin Widget blocks.
	 *
	 * This method registers block types for all SiteOrigin widgets
	 * that have a block name. It also registers a legacy widget block to allow for unmigrated widgets to still be rendered.
	 *
	 * @return void
	 */
	public function register_widget_block() {
		$so_widgets = $this->get_all_widgets();

		foreach( $so_widgets as $widget ) {
			if ( empty( $widget['blockName'] ) ) {
				continue;
			}

			register_block_type( 'sowb/' . $widget['blockName'], array(
				'render_callback' => array( $this, 'render_widget_block' ),
			) );
		}

		// Register legacy widget block. This will allow for unmigrated
		// widgets to still be rendered.
		register_block_type( 'sowb/widget-block', array(
			'render_callback' => array( $this, 'render_widget_block' ),
		) );

		add_filter( 'block_categories_all', array( $this, 'setup_block_category' ), 1, 1 );
	}

	/**
	 * Register a new block category for SiteOrigin widgets.
	 *
	 * @param array $categories - The existing block categories.
	 * @return array - The updated block categories.
	 */
	public function setup_block_category( $categories ) {
		$categories[] = array(
			'slug'  => 'siteorigin',
			'title' => __( 'SiteOrigin', 'so-widgets-bundle' ),
		);
		return $categories;
	}

	/**
	 * Get the icon for a widget.
	 *
	 * This function retrieves the icon for a widget by checking if a banner.svg exists
	 * in the widget's assets directory. If the file exists, it constructs the URL
	 * to the icon.
	 *
	 * The icon URL can be filtered using the 'siteorigin_widgets_block_icon'
	 * filter.
	 *
	 * @param string $widget_file - The full widget file path.
	 *
	 * @return string - The URL to the widget's icon.
	 */
	public static function get_widget_icon( $widget_file ) {
		$icon = '';
		$widget_dir = wp_normalize_path( dirname( $widget_file ) );

		if ( file_exists( $widget_dir . '/assets/icon.svg' ) ) {
			$icon = str_replace(
				wp_normalize_path( WP_CONTENT_DIR ),
				content_url(),
				$widget_dir
			) . '/assets/icon.svg';
		}

		$icon = apply_filters(
			'siteorigin_widgets_block_icon',
			$icon,
			$widget_file
		);

		return $icon;
	}

	/**
	 * Retrieve all widgets.
	 *
	 * This method retrieves all widgets, including inactive
	 * SiteOrigin widgets and third-party widgets. It loads
	 * inactive widgets, extracts their metadata, and
	 * combines them with active widgets. The resulting list is sorted
	 * with SiteOrigin widgets at the top, followed by third-party widgets.
	 *
	 * @return array An array of widgets with their metadata, including name, class, description, icon, and keywords.
	 */
	private function get_all_widgets() {
		$widgets_metadata_list = SiteOrigin_Widgets_Bundle::single()->get_widgets_list();
		$widgets_manager = SiteOrigin_Widgets_Widget_Manager::single();

		$so_widgets = array();

		global $wp_widget_factory;
		$third_party_widgets = array();

		foreach ( $wp_widget_factory->widgets as $class => $widget_obj ) {
			if (
				empty( $widget_obj ) ||
				! is_object( $widget_obj ) ||
				! is_subclass_of( $widget_obj, 'SiteOrigin_Widget' )
			) {
				continue;
			}

			$is_so_widget = false;
			$file = '';

			/** @var SiteOrigin_Widget $widget_obj */
			$author = '';
			// Try to find a widget's author from its file metadata, by matching the filename to the ID (which is derived from the filename).
			foreach ( $widgets_metadata_list as $widget_metadata ) {
				if ( $widgets_manager->get_class_from_path( wp_normalize_path( $widget_metadata['File'] ) ) == $class ) {
					$author = $widget_metadata['Author'];
					if ( ! empty( $widget_metadata['Description'] ) ) {
						$description = $widget_metadata['Description'];
					}

					if ( ! empty( $widget_metadata['Keywords'] ) ) {
						$keywords = $widget_metadata['Keywords'];
					}

					$file = $widget_metadata['File'];

					break;
				}
			}

			// Ensure every widget has a description.
			if ( empty( $description ) ) {
				$description = __( 'No description available.', 'so-widgets-bundle' );
			}

			$block_name = strtolower( str_replace( '_', '-', $class ) );

			// For SiteOrigin authored widgets, display the widget's name directly. For third-party widgets, append the author's name to the widget name to avoid confusion when multiple widgets have the same name.
			if (
				preg_match( '/^SiteOrigin /', $widget_obj->name ) == 1 &&
				$author == 'SiteOrigin'
			) {
				$widget_name = $widget_obj->name;
				$is_so_widget = true;
			} else {
				$widget_name = sprintf( __( '%s by %s', 'so-widgets-bundle' ), $widget_obj->name, $author );
			}

			$widget_data = array(
				'name' => esc_html( $widget_name ),
				'class' => esc_html( $class ),
				'description' => esc_html( $description ),
				'blockName' => esc_html( $block_name ),
				'keywords' => ! empty( $keywords ) ? $keywords : array(),
				'icon' => ! empty( $file ) ? esc_url( self::get_widget_icon( $file ) ) : '',
			);

			if ( $is_so_widget ) {
				// str starts with
				if ( strpos( $class, 'SiteOrigin_Widget' ) === 0 ) {
					$widget_data['manuallyRegister'] = true;
				}

				$so_widgets[] = $widget_data;
			} else {
				$third_party_widgets[] = $widget_data;
			}
		}

		// Sort the list of widgets so SiteOrigin widgets are at the top and then third party widgets.
		sort( $so_widgets );
		sort( $third_party_widgets );
		return array_merge( $so_widgets, $third_party_widgets );
	}

	public function enqueue_widget_block_editor_assets() {
		$current_screen = function_exists( 'get_current_screen' ) ? get_current_screen() : false;

		wp_enqueue_script(
			'sowb-register-widget-blocks',
			plugins_url( 'register-widget-blocks' . SOW_BUNDLE_JS_SUFFIX . '.js', __FILE__ ),
			array(
				'wp-blocks',
				'wp-i18n',
			),
			SOW_BUNDLE_VERSION
		);

		wp_enqueue_script(
			'sowb-widget-block',
			plugins_url( 'widget-block' . SOW_BUNDLE_JS_SUFFIX . '.js', __FILE__ ),
			array(
				'sowb-register-widget-blocks',
				// The WP 5.8 Widget Area requires a specific editor script to be used.
				is_object( $current_screen ) && $current_screen->base == 'widgets' ? 'wp-edit-widgets' : 'wp-editor',
				'wp-blocks',
				'wp-i18n',
				'wp-element',
				'wp-components',
				'wp-compose',
				'wp-data',
			),
			SOW_BUNDLE_VERSION
		);

		wp_enqueue_style(
			'sowb-widget-block',
			plugins_url( 'widget-block.css', __FILE__ )
		);

		$so_widgets = $this->get_all_widgets();

		wp_localize_script(
			'sowb-widget-block',
			'sowbBlockEditorAdmin',
			array(
				'widgets' => $so_widgets,
				'categoryIcon' => plugins_url( 'assets/icon.svg', __FILE__ ),
				'restUrl' => esc_url_raw( rest_url() ),
				'nonce' => wp_create_nonce( 'wp_rest' ),
				'consent' => $this->hasMigrationConsent,
				'migrationNotice' => wp_create_nonce( 'so_block_migration_consent' ),
				'legacyNotice' => sprintf(
					__( 'For improved block navigation, individual SiteOrigin Widget Blocks are now available. The multi-select SiteOrigin Widget Block will be automatically converted sitewide to the new individual SiteOrigin Widget Block format on page save; this action requires your consent to proceed. %sFind out more about this migration%s.', 'so-widgets-bundle' ),
					'<a href="https://siteorigin.com/smarter-blocks-smoother-workflow-individual-siteorigin-widget-blocks-arrive" target="_blank" rel="noopener noreferrer">',
					'</a>'
				),
			)
		);

		if ( function_exists( 'wp_set_script_translations' ) ) {
			wp_set_script_translations( 'sowb-widget-block', 'so-widgets-bundle' );
		}

		$so_widgets_bundle = SiteOrigin_Widgets_Bundle::single();
		// This is to ensure necessary scripts can be enqueued for previews.
		$so_widgets_bundle->register_general_scripts();
		$so_widgets_bundle->enqueue_registered_widgets_scripts();
	}

	public function add_widget_id( $id, $instance, $widget ) {
		return $this->widgetAnchor;
	}

	private function wpml_render_check() {
		$current_page_id = get_the_ID();
		return defined( 'ICL_LANGUAGE_CODE' ) &&
		is_numeric(
			apply_filters(
				'wpml_object_id',
				$current_page_id,
				get_post_type( $current_page_id ),
				false,
				ICL_LANGUAGE_CODE
			)
		);
	}

	public function render_widget_block( $block_content, $block, $instance ) {
		if (
			empty( $block_content['widgetClass'] ) &&
			substr( $instance->parsed_block['blockName'], 0, 5 ) !== 'sowb/'
		) {
			return '<div>' .
				__( 'You need to select a widget type before you\'ll see anything here. :)', 'so-widgets-bundle' ) .
				'</div>';
		}

		$widget_class = $block_content['widgetClass'];
		global $wp_widget_factory;

		$widget = ! empty( $wp_widget_factory->widgets[ $widget_class ] ) ? $wp_widget_factory->widgets[ $widget_class ] : false;
		// Attempt to activate the widget if it's not already active.
		if ( ! empty( $widget_class ) && empty( $widget ) ) {
			$widget = SiteOrigin_Widgets_Bundle::single()->load_missing_widget( false, $widget_class );
		}

		// Support for Additional CSS classes.
		$add_custom_class_name = function ( $class_names ) use ( $block_content ) {
			if ( ! empty( $block_content['className'] ) ) {
				$class_names = array_merge( $class_names, explode( ' ', $block_content['className'] ) );
			}

			return $class_names;
		};

		if (
			empty( $widget ) ||
			! is_object( $widget ) ||
			! is_subclass_of( $widget, 'SiteOrigin_Widget' )
		) {
			return
				'<div>' .
					sprintf(
						__( 'Invalid widget class %s. Please make sure the widget has been activated in %sSiteOrigin Widgets%s.', 'so-widgets-bundle' ),
						$widget_class,
						'<a href="' . admin_url( 'plugins.php?page=so-widgets-plugins' ) . '">',
						'</a>'
					) .
				'</div>';
		}

		$GLOBALS['SITEORIGIN_WIDGET_BLOCK_RENDER'] = true;
		$instance = $block_content['widgetData'];
		add_filter( 'siteorigin_widgets_wrapper_classes_' . $widget->id_base, $add_custom_class_name );

		ob_start();

		$always_render_widget_list = array(
			'SiteOrigin_Widget_PostCarousel_Widget',
			'SiteOrigin_Widgets_ContactForm_Widget',
			'SiteOrigin_Widget_Blog_Widget',
		);

		/*
		* Generate widget markup if:
		* - No pre-generated widgetMarkup exists.
		* - widgetMarkup contains "No widget preview available".
		* - POST data exists (widget settings likely changed).
		* - Widget is in always_render_widget_list.
		* - Widget excluded via siteorigin_widgets_block_exclude_widget filter.
		* - Active WPML translation exists.
		*/
		if (
			(
				empty( $block_content['widgetMarkup'] ) ||
				// Does widgetMarkup contain the string No widget preview available?
				strpos( $block_content['widgetMarkup'], __( 'No widget preview available.', 'so-widgets-bundle' ) ) !== false
			) ||
			! empty( $_POST ) ||
			in_array( $block_content['widgetClass'], $always_render_widget_list ) ||
			apply_filters( 'siteorigin_widgets_block_exclude_widget', false, $block_content['widgetClass'], $instance ) ||
			$this->wpml_render_check()
		) {
			// Add anchor to widget wrapper.
			if ( ! empty( $block_content['anchor'] ) ) {
				$this->widgetAnchor = $block_content['anchor'];
				add_filter( 'siteorigin_widgets_wrapper_id_' . $widget->id_base, array( $this, 'add_widget_id' ), 10, 3 );
			}

			/* @var $widget SiteOrigin_Widget */
			$instance = $widget->update( $instance, $instance );
			$widget->widget( array(
				'before_widget' => '',
				'after_widget' => '',
				'before_title' => '<h3 class="widget-title">',
				'after_title' => '</h3>',
			), $instance );

			if ( ! empty( $block_content['anchor'] ) ) {
				remove_filter( 'siteorigin_widgets_wrapper_id_' . $widget->id_base, array( $this, 'add_widget_id' ), 10 );
			}
		} else {
			$widget->generate_and_enqueue_instance_styles( $instance );
			$widget->enqueue_frontend_scripts( $instance );

			// Check if this widget uses any icons that need to be enqueued.
			if ( ! empty( $block_content['widgetIcons'] ) ) {
				$widget_icon_families = apply_filters( 'siteorigin_widgets_icon_families', array() );

				foreach ( $block_content['widgetIcons'] as $icon_font ) {
					if ( ! wp_style_is( $icon_font ) ) {
						$font_family = explode( 'siteorigin-widget-icon-font-', $icon_font )[1];
						wp_enqueue_style( $icon_font, $widget_icon_families[ $font_family ]['style_uri'] );
					}
				}
			}
			echo $block_content['widgetMarkup'];
		}

		$rendered_widget = ob_get_clean();
		remove_filter( 'siteorigin_widgets_wrapper_classes_' . $widget->id_base, $add_custom_class_name );
		unset( $GLOBALS['SITEORIGIN_WIDGET_BLOCK_RENDER'] );
		return $rendered_widget;
	}

	public function server_side_validation( $prepared_post, $request ) {
		if ( empty( $prepared_post->post_content ) ) {
			return $prepared_post;
		}

		$blocks = parse_blocks( $prepared_post->post_content );
		if ( empty( $blocks ) ) {
			return $prepared_post;
		}

		foreach( $blocks as &$block ) {
			$block = $this->sanitize_blocks( $block, true );
		}
		$prepared_post->post_content = serialize_blocks( $blocks );

		return $prepared_post;
	}

	public function sanitize_blocks( $block ) {
		if ( is_wp_error( $block ) ) {
			return rest_ensure_response( $block );
		}

		if (
			! empty( $block['blockName'] ) &&
			$block['blockName'] === 'sowb/'
		) {
			$block = $this->sanitize_block( $block );
		}

		if (
			is_array( $block['innerBlocks'] ) &&
			! empty( $block['innerBlocks'] )
		) {
			foreach( $block['innerBlocks'] as $i => $inner ) {
				$block['innerBlocks'][$i] = $this->sanitize_blocks( $inner );
			}
		}

		return $block;
	}

	public function sanitize_block( $block ) {
		if (
			empty( $block['attrs'] ) ||
			empty( $block['attrs']['widgetClass'] )
		) {
			return $block;
		}

		$rendered_widget = $this->get_widget_preview( $block['attrs'], false );
		if ( is_wp_error( $rendered_widget ) ) {
			return rest_ensure_response( $rendered_widget );
		}

		if ( empty( $rendered_widget ) ) {
			return new WP_Error( 'rest_invalid_param', __( 'Invalid Widgets Bundle data', 'so-widgets-bundle' ), array( 'status' => 400 ) );
		}

		$block['attrs'] = $rendered_widget;
		return $block;
	}

	public function get_widget_preview( $block, $just_html = true ) {
		$widget_class = $block['widgetClass'];
		$widget_data = $block['widgetData'];

		$widget = SiteOrigin_Widgets_Widget_Manager::get_widget_instance( $widget_class );
		// Attempt to activate the widget if it's not already active.
		if ( ! empty( $widget_class ) && empty( $widget ) ) {
			$widget = SiteOrigin_Widgets_Bundle::single()->load_missing_widget( false, $widget_class );
		}

		// This ensures styles are added inline.
		add_filter( 'siteorigin_widgets_is_preview', '__return_true' );
		$GLOBALS[ 'SO_WIDGETS_BUNDLE_PREVIEW_RENDER' ] = true;

		$valid_widget_class = ! empty( $widget ) &&
							  is_object( $widget ) &&
							  is_subclass_of( $widget, 'SiteOrigin_Widget' );

		if ( $valid_widget_class && ! empty( $widget_data ) ) {
			ob_start();
			// Add anchor to widget wrapper.
			if ( ! empty( $block['anchor'] ) ) {
				$this->widgetAnchor = $block['anchor'];
				add_filter( 'siteorigin_widgets_wrapper_id_' . $widget->id_base, array( $this, 'add_widget_id' ), 10, 3 );
			}
			/* @var $widget SiteOrigin_Widget */
			$instance = $widget->update( $widget_data, $widget_data );
			$widget->widget( array(), $instance );
			$rendered_widget = array();
			$rendered_widget['html'] = ob_get_clean();

			if ( ! empty( $block['anchor'] ) ) {
				remove_filter( 'siteorigin_widgets_wrapper_id_' . $widget->id_base, array( $this, 'add_widget_id' ), 10 );
			}

			// Check if this widget loaded any icons, and if it has, store them.
			$styles = wp_styles();

			if ( ! empty( $styles->queue ) ) {
				$rendered_widget['widgetIcons'] = array();

				foreach ( $styles->queue as $style ) {
					if ( strpos( $style, 'siteorigin-widget-icon-font' ) !== false ) {
						$rendered_widget['widgetIcons'][] = $style;
					}
				}
			}
		} else {
			if ( empty( $valid_widget_class ) ) {
				$rendered_widget = new WP_Error(
					400,
					'Invalid or missing widget class: ' . $widget_class,
					array(
						'status' => 400,
					)
				);
			} elseif ( empty( $widget_data ) ) {
				$rendered_widget = new WP_Error(
					400,
					'Unable to render preview. Invalid or missing widget data.',
					array(
						'status' => 400,
					)
				);
			}
		}

		unset( $GLOBALS['SO_WIDGETS_BUNDLE_PREVIEW_RENDER'] );

		if ( $just_html || is_wp_error( $rendered_widget ) ) {
			return $rendered_widget;
		}

		// If there's a style tag, we can't set set widgetMarkup.
		if ( strpos( $rendered_widget['html'], '<style' ) !== false ) {
			$rendered_widget['widgetMarkup'] = '';
		} else {
			$rendered_widget['widgetMarkup'] = $rendered_widget['html'];
		}

		return array(
			'widgetClass' => $widget_class,
			'widgetData' => $widget_data,
			'widgetMarkup' => $rendered_widget['widgetMarkup'],
			'html' => $rendered_widget['html'],
			'widgetIcons' => isset( $rendered_widget['css'] ) ? $rendered_widget['widgetIcons'] : array(),
		);
	}

	public function block_migration_consent() {
		if (
			! empty( $_POST['nonce'] ) &&
			! wp_verify_nonce( $_REQUEST['nonce'], 'so_block_migration_consent' )
		) {
			die();
		}

		if ( ! current_user_can( 'manage_options' ) ) {
			die();
		}

		update_option(
			'sowb_block_migration',
			(int) get_current_user_id(),
			false
		);
	}
}

SiteOrigin_Widgets_Bundle_Widget_Block::single();
builders.php000064400000001017151534575400007076 0ustar00<?php

return array(
	'beaver_builder' => array(
		'name' => __( 'Beaver Builder', 'so-widgets-bundle' ),
		'file_path' => plugin_dir_path( __FILE__ ) . 'beaver-builder/beaver-builder.php',
	),
	'elementor' => array(
		'name' => __( 'Elementor', 'so-widgets-bundle' ),
		'file_path' => plugin_dir_path( __FILE__ ) . 'elementor/elementor.php',
	),
	'visual_composer' => array(
		'name' => __( 'Visual Composer', 'so-widgets-bundle' ),
		'file_path' => plugin_dir_path( __FILE__ ) . 'visual-composer/visual-composer.php',
	),
);
compat.php000064400000013172151534575400006555 0ustar00<?php

class SiteOrigin_Widgets_Bundle_Compatibility {
	/**
	 * Get the singleton instance
	 *
	 * @return SiteOrigin_Widgets_Bundle_Compatibility
	 */
	public static function single() {
		static $single;

		return empty( $single ) ? $single = new self() : $single;
	}

	public function __construct() {
		add_action( 'init' , array( $this, 'init' ) );
	}

	public function init() {
		$builder = $this->get_active_builder();

		if ( ! empty( $builder ) ) {
			require_once $builder['file_path'];
		}

		if ( function_exists( 'register_block_type' ) ) {
			require_once plugin_dir_path( __FILE__ ) . 'block-editor/widget-block.php';
		}

		// These actions handle alerting cache plugins that they need to regenerate a page cache.
		if ( apply_filters( 'siteorigin_widgets_load_cache_compatibility', true ) ) {
			add_action( 'siteorigin_widgets_stylesheet_deleted', array( $this, 'clear_page_cache' ) );
			add_action( 'siteorigin_widgets_stylesheet_added', array( $this, 'clear_page_cache' ) );
			add_action( 'siteorigin_widgets_stylesheet_cleared', array( $this, 'clear_all_cache' ) );
		}

		// Compatibility with AMP plugin.
		if (
			function_exists( 'amp_is_enabled' ) &&
			amp_is_enabled()
		) {
			// AMP plugin is installed and enabled. Remove Slider Lazy Loading.
			add_filter( 'siteorigin_widgets_slider_attr', function ( $attr ) {
				if ( ! empty( $attr['class'] ) ) {
					$attr['class'] = str_replace( ' skip-lazy', '', $attr['class'] );
				}
				$attr['loading'] = false;

				return $attr;
			} );
		}

		// Compatibility with WooCommerce.
		if ( function_exists( 'WC' ) ) {
			add_filter( 'woocommerce_format_content', array( $this, 'woocommerce_shop_page_content' ), 10, 2 );
		}
	}

	public function get_active_builder() {
		$builders = include_once 'builders.php';

		foreach ( $builders as $builder ) {
			if ( $this->is_builder_active( $builder ) ) {
				return $builder;
			}
		}

		return null;
	}

	public function is_builder_active( $builder ) {
		switch ( $builder[ 'name' ] ) {
			case 'Beaver Builder':
				return class_exists( 'FLBuilderModel', false );
				break;

			case 'Elementor':
				return class_exists( 'Elementor\\Plugin', false );
				break;

			case 'Visual Composer':
				return class_exists( 'Vc_Manager' );
				break;
		}
	}

	/**
	 * Tell cache plugins that they need to regenerate a page cache.
	 *
	 * @param $name The name of the file that's been deleted.
	 * @param $instance The current instance of the related widget.
	 */
	public function clear_page_cache( $name, $instance = array() ) {
		$id = explode( '-', $name );
		$id = end( $id );
		$id = explode( '.', $id )[0];

		if ( is_numeric( $id ) ) {
			if ( function_exists( 'w3tc_flush_post' ) ) {
				w3tc_flush_post( $id );
			}

			if ( class_exists( 'Swift_Performance_Cache' ) ) {
				Swift_Performance_Cache::clear_post_cache( $id );
			}

			if ( class_exists( '\Hummingbird\\WP_Hummingbird' ) ) {
				do_action( 'wphb_clear_page_cache', $id );
			}

			if ( function_exists( 'breeze_varnish_purge_cache' ) ) {
				breeze_varnish_purge_cache( get_the_permalink( $id ) );
			}

			if ( function_exists( 'run_litespeed_cache' ) ) {
				$url = parse_url( get_the_permalink( $id ) );

				if ( ! empty( $url ) ) {
					header( 'x-litespeed-purge: ' . $url['path'] );
				}
			}

			if ( function_exists( 'rocket_clean_post' ) ) {
				rocket_clean_post( $id );
			}

			if ( class_exists( 'WP_Optimize' ) ) {
				WPO_Page_Cache::instance()->delete_single_post_cache( $id );
			}
		}
	}

	/**
	 * Tell cache plugins that they need to regenerate their all page cache.
	 */
	public function clear_all_cache() {
		if ( function_exists( 'w3tc_flush_all' ) ) {
			w3tc_flush_all();
		}

		if ( class_exists( 'Swift_Performance_Cache' ) ) {
			Swift_Performance_Cache::clear_all_cache();
		}

		if ( class_exists( '\Hummingbird\\WP_Hummingbird' ) ) {
			do_action( 'wphb_clear_page_cache' );
		}

		if ( class_exists( 'Breeze_PurgeCache' ) ) {
			Breeze_PurgeCache::breeze_cache_flush();
		}

		if ( function_exists( 'run_litespeed_cache' ) && ! headers_sent() ) {
			header( 'x-litespeed-purge: *' );
		}

		if ( function_exists( 'rocket_clean_domain' ) && function_exists( 'rocket_clean_minify' ) ) {
			rocket_clean_domain();
			rocket_clean_minify( 'css' );
		}

		if ( class_exists( 'WP_Optimize' ) ) {
			// WP Optimize does a filter check to see if it should purge the cache.
			// This filter will allow us to bypass that check.
			add_filter( 'wpo_purge_page_cache_on_activate_deactivate_plugin', '__return_true' );
			WPO_Page_Cache::instance()->purge();
		}
	}

	/**
	 * Filter the content of the WooCommerce shop page to ensure that our widgets are rendered correctly.
	 *
	 * @param $content
	 *
	 * @return string
	 */
	public function woocommerce_shop_page_content( $content ) {
		if ( is_search() ) {
			return $content;
		}

		if (
			! is_post_type_archive( 'product' ) ||
			! in_array( absint( get_query_var( 'paged' ) ), array( 0, 1 ), true )
		) {
			return $content;
		}

		$shop_page = get_post( wc_get_page_id( 'shop' ) );
		if ( empty( $shop_page ) ) {
			return $content;
		}

		$blocks = parse_blocks( $shop_page->post_content );

		// Check if any SiteOrigin Widgets Bundle blocks.
		$blocks = array_filter( $blocks, array( $this, 'find_sowb_block' ) );
		if ( ! empty( $blocks ) ) {
			$content = do_blocks( $shop_page->post_content );
		}

		return $content;
	}

	public function find_sowb_block( $block ) {
		if (
			! empty( $block['blockName'] ) &&
			strpos( $block['blockName'], 'sowb/' ) === 0
		) {
			return true;
		}

		foreach ( $block['innerBlocks'] as $inner ) {
			if ( $this->find_sowb_block( $inner ) ) {
				return true;
			}
		}

		return false;
	}
}

SiteOrigin_Widgets_Bundle_Compatibility::single();
elementor/elementor.php000064400000011102151534575400011245 0ustar00<?php

class SiteOrigin_Widgets_Bundle_Elementor {
	/**
	 * Get the singleton instance
	 *
	 * @return SiteOrigin_Widgets_Bundle_Elementor
	 */
	public static function single() {
		static $single;

		return empty( $single ) ? $single = new self() : $single;
	}

	private $plugin;

	public function __construct() {
		add_action( 'admin_action_elementor', array( $this, 'init_editor' ) );
		add_action( 'template_redirect', array( $this, 'init_preview' ) );

		add_filter( 'siteorigin_widgets_is_preview', array( $this, 'is_elementor_preview' ) );
		add_action( 'wp_ajax_elementor_editor_get_wp_widget_form', array( $this, 'ajax_render_widget_form' ) );

		add_filter( 'elementor/frontend/builder_content/before_print_css', array( $this, 'remove_post_type_filter' ), 10, 1 );
		add_filter( 'elementor/frontend/the_content', array( $this, 'restore_post_type_filter' ), 10, 1 );
	}

	public function init_editor() {
		add_action( 'elementor/editor/before_enqueue_scripts', array( $this, 'enqueue_active_widgets_scripts' ) );
	}

	public function init_preview() {
		$this->plugin = Elementor\Plugin::instance();

		if ( ! empty( $this->plugin->preview ) && method_exists( $this->plugin->preview, 'is_preview_mode' ) && $this->plugin->preview->is_preview_mode() ) {
			add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_frontend_scripts' ) );
			add_action( 'elementor/preview/enqueue_styles', array( $this, 'enqueue_frontend_scripts' ) );
		}
	}

	public function enqueue_frontend_scripts() {
		$so_widgets_bundle = SiteOrigin_Widgets_Bundle::single();
		$so_widgets_bundle->register_general_scripts();
		$so_widgets_bundle->enqueue_registered_widgets_scripts( true, false );
	}

	public function enqueue_active_widgets_scripts() {
		add_action( 'wp_print_footer_scripts', array( $this, 'print_footer_templates' ) );

		$so_widgets_bundle = SiteOrigin_Widgets_Bundle::single();
		$so_widgets_bundle->register_general_scripts();
		$so_widgets_bundle->enqueue_registered_widgets_scripts( false, true );

		wp_enqueue_style( 'sowb-styles-for-elementor', plugin_dir_url( __FILE__ ) . 'styles.css' );

		wp_enqueue_script(
			'sowb-js-for-elementor',
			plugin_dir_url( __FILE__ ) . 'sowb-elementor' . SOW_BUNDLE_JS_SUFFIX . '.js',
			array( 'jquery' )
		);
	}

	public function print_footer_templates() {
		global $wp_widget_factory;

		// Elementor does it's editing in the front end so print required footer templates for active widgets.
		foreach ( $wp_widget_factory->widgets as $class => $widget_obj ) {
			if ( ! empty( $widget_obj ) && is_object( $widget_obj ) && is_subclass_of( $widget_obj, 'SiteOrigin_Widget' ) ) {
				/* @var $widget_obj SiteOrigin_Widget */
				$widget_obj->footer_admin_templates();
			}
		}
	}

	public function is_elementor_preview( $is_preview ) {
		$this->plugin = Elementor\Plugin::instance();
		$is_elementor_preview = ! empty( $this->plugin->preview ) && method_exists( $this->plugin->preview, 'is_preview_mode' ) && $this->plugin->preview->is_preview_mode();
		$is_elementor_edit_mode = $this->plugin->editor->is_edit_mode();

		return $is_preview || $is_elementor_preview || $is_elementor_edit_mode ||
			   ( ! empty( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor_ajax' );
	}

	public function ajax_render_widget_form() {
		// Don't want to show the form preview button when using Elementor
		add_filter( 'siteorigin_widgets_form_show_preview_button', array( $this, '__return_false' ) );
	}

	/**
	 * Temporarily removes the Posts Form Field post type permission check
	 * before Elementor renderers the page.
	 *
	 * Elementor sanitizes post content when rendering the page.
	 * To prevent issues for guests who won't have permission to
	 * use any non-standard post types, we temporarily remove the check.
	 *
	 * The `elementor/frontend/builder_content/before_print_css` filter
	 * is used because it's the last filter Elementor applies before
	 * rendering the page.
	 *
	 * @param string $css The CSS content being generated by Elementor.
	 *
	 * @return string Unchanged CSS content.
	 */
	public function remove_post_type_filter( $css  ) {
		add_filter( 'siteorigin_widgets_post_selector_post_type_permission_check', '__return_false' );

		return $css;
	}

	/**
	 * Restores the Posts Form Field post type permission check after
	 * Elementor has finished rendering the page.
	 *
	 * @param string $content The processed content.
	 *
	 * @return string Unchanged processed content.
	 */
	public function restore_post_type_filter( $content  ) {
		remove_filter( 'siteorigin_widgets_post_selector_post_type_permission_check', '__return_false' );
		return $content;
	}
}

SiteOrigin_Widgets_Bundle_Elementor::single();
elementor/sowb-elementor.js000064400000001351151534575400012047 0ustar00var sowb = window.sowb || {};

( function($){

	// To ensure necessary scripts are executed again when settings are changed
	$( window ).on( 'elementor:init', function() {
		elementor.on( 'preview:loaded', function () {
			var preview_window = elementor.$preview.get( 0 ).contentWindow;
			var $sowb = preview_window.jQuery( preview_window.sowb );
			var timeoutId;
			elementorFrontend.hooks.addAction( 'frontend/element_ready/widget', function(){
				// Debounce
				if ( timeoutId ) {
					clearTimeout( timeoutId );
				}
				timeoutId = setTimeout( function () {
					// Trigger Widgets Bundle widgets to setup
					$sowb.trigger( 'setup_widgets', { preview: true } );
					timeoutId = null;
				}, 300 );
			} );
		} );
	} );

})(jQuery);
elementor/sowb-elementor.min.js000064400000000556151534575400012637 0ustar00var sowb=window.sowb||{};jQuery(window).on("elementor:init",(function(){elementor.on("preview:loaded",(function(){var e,n=elementor.$preview.get(0).contentWindow,o=n.jQuery(n.sowb);elementorFrontend.hooks.addAction("frontend/element_ready/widget",(function(){e&&clearTimeout(e),e=setTimeout((function(){o.trigger("setup_widgets",{preview:!0}),e=null}),300)}))}))}));elementor/styles.css000064400000027244151534575400010615 0ustar00.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form{min-width:inherit}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form a{border-bottom:none}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .wp-picker-container{float:none}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .wp-picker-container.wp-picker-active{transform:none;float:none;position:relative;padding:0;border:none;background:none}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .wp-picker-container.wp-picker-active .wp-color-result{float:left;margin:0}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .wp-picker-container.wp-picker-active .wp-picker-input-wrap{padding:0;float:left}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .wp-picker-container.wp-picker-active .wp-picker-input-wrap .siteorigin-widget-input-color,.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .wp-picker-container.wp-picker-active .wp-picker-input-wrap .button.wp-picker-default{font-size:12px;height:32px}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .wp-picker-container.wp-picker-active .wp-picker-input-wrap .button.wp-picker-default{float:right;width:auto}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .wp-picker-container.wp-picker-active .wp-picker-holder:before{clear:both;content:"";display:table}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .wp-picker-container.wp-picker-active .iris-picker.iris-border{background:none}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .wp-picker-container.wp-picker-active .iris-picker.iris-border .iris-picker-inner{left:0;right:0}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .wp-picker-container.wp-picker-active .wp-picker-clear{height:28px}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .siteorigin-widget-field.siteorigin-widget-field-type-autocomplete .existing-content-selector,.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .siteorigin-widget-field.siteorigin-widget-field-type-link .existing-content-selector{width:inherit}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .siteorigin-widget-field .siteorigin-widget-input-color{width:120px;margin:0 3px}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .siteorigin-widget-field .ui-draggable-handle{transition:none}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .siteorigin-widget-field.siteorigin-widget-field-type-icon .siteorigin-widget-icon-selector .siteorigin-widget-icon-search{box-shadow:inset 0 1px 2px rgba(0,0,0,0.07);background-color:#fff;color:#32373c;width:100%}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .siteorigin-widget-field.siteorigin-widget-field-type-icon .siteorigin-widget-icon-selector .siteorigin-widget-icon-search::placeholder,.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .siteorigin-widget-field.siteorigin-widget-field-type-icon .siteorigin-widget-icon-selector .siteorigin-widget-icon-search::-webkit-input-placeholder{color:#32373c}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .siteorigin-widget-field.siteorigin-widget-field-type-icon .siteorigin-widget-icon-icons-icon{color:#444}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .siteorigin-widget-field.siteorigin-widget-field-type-measurement .siteorigin-widget-input-measurement,.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .siteorigin-widget-field.siteorigin-widget-field-type-measurement .sow-measurement-select-unit{max-width:inherit;height:28px;margin:0}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .siteorigin-widget-field.siteorigin-widget-field-type-measurement .siteorigin-widget-input-measurement{width:100%;max-width:58px;margin-right:1px}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .siteorigin-widget-field.siteorigin-widget-field-type-measurement .sow-measurement-select-unit{min-width:inherit;width:32%;margin-left:1px;max-width:73px}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .siteorigin-widget-field.siteorigin-widget-field-type-posts select[multiple]{height:inherit}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .siteorigin-widget-field.siteorigin-widget-field-type-posts .siteorigin-widget-field-type-date-range>div input[type="text"].datepicker{width:100%}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .siteorigin-widget-field .siteorigin-widget-field-type-slider input[type="number"]{display:none !important}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .siteorigin-widget-field .clear{clear:both}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .siteorigin-widget-field.siteorigin-widget-field-type-media .media-fallback-external{margin-top:4px !important;margin-left:15px !important;max-width:220px}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .siteorigin-widget-field .siteorigin-widget-input[type="text"]{height:30px}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .siteorigin-widget-field .siteorigin-widget-input[type="checkbox"]{display:inline-block;vertical-align:middle}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .siteorigin-widget-field .siteorigin-widget-description{color:inherit}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .siteorigin-widget-field-type-section{color:#000}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .button.wp-color-result{font-size:12px;height:32px;padding:0 0 0 30px}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .button.button-small{height:25px;line-height:30px;padding:0 8px;font-size:11px}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form select,.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form input[type=text]{margin:1px;border-radius:0;font-weight:inherit;border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,0.07);background-color:#fff;color:#32373c;outline:0;transition:50ms border-color ease-in-out;max-width:100%}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form select[multiple]{min-height:83px}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form input[type="text"].datepicker{width:auto;max-width:100%}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .ui-autocomplete{padding:0;margin:0;list-style:none;position:absolute;z-index:10000;border:1px solid #5b9dd9;box-shadow:0 1px 2px rgba(30,140,190,0.8);background-color:#fff}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .ui-autocomplete li{margin-bottom:0;padding:4px 10px;white-space:nowrap;text-align:left}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .ui-autocomplete li.ui-state-focus{background-color:#ddd;cursor:pointer}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .media-toolbar-primary{margin-top:15px}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .query-builder-content .query-builder-form-field small{margin-top:5px}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .button,#so-widgets-image-search-frame .button,.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .button-secondary,#so-widgets-image-search-frame .button-secondary{display:inline-block;text-decoration:none;font-size:13px;line-height:28px;height:28px;margin:0;padding:0 10px 1px;cursor:pointer;border:1px solid #cccccc;border-radius:3px;white-space:nowrap;box-sizing:border-box;font-family:inherit;font-weight:normal;text-transform:capitalize;color:#555;background:#f7f7f7}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .button:hover,#so-widgets-image-search-frame .button:hover,.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .button-secondary:hover,#so-widgets-image-search-frame .button-secondary:hover,.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .button:focus,#so-widgets-image-search-frame .button:focus,.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .button-secondary:focus,#so-widgets-image-search-frame .button-secondary:focus{background:#fafafa;border-color:#999;color:#23282d}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .button:active,#so-widgets-image-search-frame .button:active,.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .button-secondary:active,#so-widgets-image-search-frame .button-secondary:active,.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .button:focus,#so-widgets-image-search-frame .button:focus,.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .button-secondary:focus,#so-widgets-image-search-frame .button-secondary:focus{outline:none}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .button.hidden,#so-widgets-image-search-frame .button.hidden,.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .button-secondary.hidden,#so-widgets-image-search-frame .button-secondary.hidden{display:none}.elementor-panel #elementor-panel-page-editor .elementor-control-content .siteorigin-widget-form .button-primary,#so-widgets-image-search-frame .button-primary{background:#007cba;border-color:#007cba;color:#fff;text-decoration:none;text-shadow:none}#so-widgets-image-search-frame .so-widgets-search-input{background:#fff;color:#32373c;border:1px solid #7e8993;line-height:1;min-height:47px;font-size:14px}#so-widgets-image-search-frame .so-widgets-image-search-powered{font-size:11px}#so-widgets-image-search-frame a{color:#0073aa;text-decoration:underline}#so-widgets-image-search-frame a:active,#so-widgets-image-search-frame a:hover{color:#006799}#so-widgets-image-search-frame .so-widgets-results-loading{color:#444}.so-widgets-dialog .so-widgets-toolbar h3{color:#23282d;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16.9px;font-weight:600;margin:15px 0 15px 20px}visual-composer/front_enqueue_js.js000064400000001216151534575400013616 0ustar00jQuery( function ( $ ) {
	var ajaxData = vc.EditElementPanelView.prototype.ajaxData;
	vc.EditElementPanelView.prototype.ajaxData = function() {
		if ( this.model.get( 'shortcode' ) === 'siteorigin_widget_vc' && this.model.get( 'from_content' ) ) {
			var widgetData = this.model.get( 'params' ).so_widget_data;
			// Need to add slashes for frontend the first time after data is parsed from content, due to shortcode
			// processing removing slashes.
			widgetData = widgetData.replace( /\\/g, '\\\\' );
			this.model.set( 'params', { so_widget_data: widgetData } );
			this.model.unset( 'from_content' );
		}
		return ajaxData.apply( this );
	};

} );
visual-composer/front_enqueue_js.min.js000064400000000602151534575400014376 0ustar00jQuery((function(t){var e=vc.EditElementPanelView.prototype.ajaxData;vc.EditElementPanelView.prototype.ajaxData=function(){if("siteorigin_widget_vc"===this.model.get("shortcode")&&this.model.get("from_content")){var t=this.model.get("params").so_widget_data;t=t.replace(/\\/g,"\\\\"),this.model.set("params",{so_widget_data:t}),this.model.unset("from_content")}return e.apply(this)}}));visual-composer/siteorigin_widget_vc_template.php000064400000000275151534575400016524 0ustar00<?php

if ( empty( $atts ) ) {
	return;
}
$widget_settings = $this->get_widget_settings( $atts );
$this->render_widget( $widget_settings['widget_class'], $widget_settings['widget_data'] );
visual-composer/sowb-vc-widget.js000064400000004617151534575400013114 0ustar00/* globals jQuery, sowbForms, confirm, soWidgetsVC */
var sowbForms = window.sowbForms || {};

sowbForms.setupVcWidgetForm = function () {
	var $ = jQuery;
	var $widgetDropdown = $( '[name="so_widget_class"]' );
	var $formContainer = $( '.siteorigin_widget_form_container' );
	var formDirty = false;
	$formContainer.on( 'change', '.siteorigin-widget-field', function () {
		formDirty = true;
		var widgetData = sowbForms.getWidgetFormValues( $formContainer );
		var widgetClass = $widgetDropdown.val();

		var jsonString = JSON.stringify( { widget_class: widgetClass, widget_data: widgetData } );
		jsonString = jsonString.replace( /\\/g, '\\\\' );
		$( '[name="so_widget_data"]' ).val( jsonString );
	} );

	var prevWidget;
	$widgetDropdown.on( 'mousedown', function() {
		prevWidget = $widgetDropdown.find( 'option:selected' );
	} );

	$widgetDropdown.on( 'change', function ( event ) {
		if ( formDirty && !confirm( soWidgetsVC.confirmChangeWidget ) ) {
			prevWidget.attr( 'selected', true );
			return;
		}

		formDirty = false;

		var widget = $widgetDropdown.val();

		var data = {
			'action': 'sowb_vc_widget_render_form',
			'widget': widget,
		};

		$.post(
			soWidgetsVC.ajaxUrl,
			data,
			function ( result ) {
				$formContainer.html( result );
				// To ensure data is updated.
				$formContainer.trigger( 'change' );
			},
			'html'
		);
	} );
	vc.atts.sowb_json_escaped = {
		parse: function ( param ) {
			var $field = this.content().find( '.wpb_vc_param_value[name=' + param.param_name + ']' );
			// We double encode in the front end to prevent accidental decoding when the content is set on the
			// WP visual editor.
			return _.escape( _.escape( $field.val().toString() ).replace( /\[/g, '&#91;' ).replace( /\]/g, '&#93;' ) );
		},
		render: function ( param, value ) {
			return _.unescape( _.unescape( value ) ).replace( /&#91;/g, '[' ).replace( /&#93;/g, ']' );
		}
	};
	vc.events.on( "shortcodeView:updated:siteorigin_widget_vc", function () {

		if ( typeof vc.frame_window !== 'undefined' && typeof vc.frame_window.sowb !== 'undefined' ) {

			// Have to use jQuery from iframe window for triggered events to be detected there.
			var $ = vc.frame_window.jQuery;
			var sowb = vc.frame_window.sowb;

			// Trigger Widgets Bundle widgets to setup
			$( sowb ).trigger( 'setup_widgets', { preview: true } );
		}
	} );

};

jQuery( function ( $ ) {
	sowbForms.setupVcWidgetForm();
} );

window.sowbForms = sowbForms;
visual-composer/sowb-vc-widget.min.js000064400000002434151534575400013671 0ustar00var sowbForms=window.sowbForms||{};sowbForms.setupVcWidgetForm=function(){var e,o=jQuery,n=o('[name="so_widget_class"]'),i=o(".siteorigin_widget_form_container"),t=!1;i.on("change",".siteorigin-widget-field",(function(){t=!0;var e=sowbForms.getWidgetFormValues(i),r=n.val(),s=JSON.stringify({widget_class:r,widget_data:e});s=s.replace(/\\/g,"\\\\"),o('[name="so_widget_data"]').val(s)})),n.on("mousedown",(function(){e=n.find("option:selected")})),n.on("change",(function(r){if(!t||confirm(soWidgetsVC.confirmChangeWidget)){t=!1;var s={action:"sowb_vc_widget_render_form",widget:n.val()};o.post(soWidgetsVC.ajaxUrl,s,(function(e){i.html(e),i.trigger("change")}),"html")}else e.attr("selected",!0)})),vc.atts.sowb_json_escaped={parse:function(e){var o=this.content().find(".wpb_vc_param_value[name="+e.param_name+"]");return _.escape(_.escape(o.val().toString()).replace(/\[/g,"&#91;").replace(/\]/g,"&#93;"))},render:function(e,o){return _.unescape(_.unescape(o)).replace(/&#91;/g,"[").replace(/&#93;/g,"]")}},vc.events.on("shortcodeView:updated:siteorigin_widget_vc",(function(){void 0!==vc.frame_window&&void 0!==vc.frame_window.sowb&&(0,vc.frame_window.jQuery)(vc.frame_window.sowb).trigger("setup_widgets",{preview:!0})}))},jQuery((function(e){sowbForms.setupVcWidgetForm()})),window.sowbForms=sowbForms;visual-composer/styles.css000064400000000577151534575400011753 0ustar00.siteorigin-widget-form .siteorigin-widget-field input{margin:1px;padding:2px 5px}.siteorigin-widget-form .siteorigin-widget-field input[type="radio"]{width:inherit}.siteorigin-widget-form .siteorigin-widget-field select{padding:2px;height:28px;width:inherit;margin:1px}.vc_element-icon.so-widget-icon{background-size:cover;background-image:url("../../base/css/img/bundle-icon.png")}visual-composer/visual-composer.php000064400000021671151534575400013555 0ustar00<?php

class SiteOrigin_Widgets_Bundle_Visual_Composer {
	/**
	 * Get the singleton instance
	 *
	 * @return SiteOrigin_Widgets_Bundle_Visual_Composer
	 */
	public static function single() {
		static $single;

		return empty( $single ) ? $single = new self() : $single;
	}

	public function __construct() {
		add_action( 'vc_after_init', array( $this, 'init' ) );

		add_action( 'admin_print_scripts-post-new.php', array( $this, 'enqueue_active_widgets_scripts' ) );
		add_action( 'admin_print_scripts-post.php', array( $this, 'enqueue_active_widgets_scripts' ) );

		add_action( 'wp_ajax_sowb_vc_widget_render_form', array( $this, 'sowb_vc_widget_render_form' ) );

		add_filter( 'siteorigin_widgets_form_show_preview_button', '__return_false' );

		add_filter( 'content_save_pre', array( $this, 'update_widget_data' ) );
	}

	public function init() {
		vc_add_shortcode_param(
			'sowb_json_escaped',
			array( $this, 'siteorigin_widget_form' ),
			plugin_dir_url( __FILE__ ) . 'sowb-vc-widget' . SOW_BUNDLE_JS_SUFFIX . '.js'
		);

		$settings = array(
			'name'                    => __( 'SiteOrigin Widget', 'so-widgets-bundle' ),
			'base'                    => 'siteorigin_widget_vc',
			'category'                => __( 'SiteOrigin Widgets', 'so-widgets-bundle' ),
			'icon'                    => 'so-widget-icon',
			'description'             => __( 'Allows you to add any active SiteOrigin Widgets Bundle widgets.', 'so-widgets-bundle' ),
			// element description in add elements view
			'show_settings_on_create' => true,
			'weight'                  => - 5,
			// Depends on ordering in list, Higher weight first
			'html_template'           => __DIR__ . '/siteorigin_widget_vc_template.php',
			'admin_enqueue_css'       => preg_replace( '/\s/', '%20', plugins_url( 'styles.css', __FILE__ ) ),
			'front_enqueue_css'       => preg_replace( '/\s/', '%20', plugins_url( 'styles.css', __FILE__ ) ),
			'front_enqueue_js'        => preg_replace( '/\s/', '%20', plugins_url( 'front_enqueue_js.js', __FILE__ ) ),
			'params'                  => array(
				array(
					'type'       => 'sowb_json_escaped',
					'heading'    => __( 'SiteOrigin Widget', 'so-widgets-bundle' ),
					'param_name' => 'so_widget_data',
				),
			),
		);
		vc_map( $settings );
	}

	public function enqueue_active_widgets_scripts() {
		global $wp_widget_factory;

		foreach ( $wp_widget_factory->widgets as $class => $widget_obj ) {
			if ( ! empty( $widget_obj ) && is_object( $widget_obj ) && is_subclass_of( $widget_obj, 'SiteOrigin_Widget' ) ) {
				/* @var $widget_obj SiteOrigin_Widget */
				ob_start();
				$widget_obj->form( array() );
				ob_clean();
			}
		}

		wp_localize_script( 'siteorigin-widget-admin', 'soWidgetsVC', array(
			'ajaxUrl' => wp_nonce_url( admin_url( 'admin-ajax.php' ), 'sowb_vc_widget_render_form', '_sowbnonce' ),
			'confirmChangeWidget' => __( 'Selecting a different widget will revert any changes. Continue?', 'so-widgets-bundle' ),
		) );
	}

	public function siteorigin_widget_form( $settings, $value ) {
		$so_widget_names = array();

		global $wp_widget_factory;

		foreach ( $wp_widget_factory->widgets as $class => $widget_obj ) {
			if ( ! empty( $widget_obj ) && is_object( $widget_obj ) && is_subclass_of( $widget_obj, 'SiteOrigin_Widget' ) ) {
				$so_widget_names[ $class ] = preg_replace( '/^SiteOrigin /', '', $widget_obj->name );
			}
		}
		asort( $so_widget_names );

		/* @var $select SiteOrigin_Widget_Field_Select */
		$select = new SiteOrigin_Widget_Field_Select(
			'so_widget_class',
			'so_widget_class',
			'so_widget_class',
			array(
				'type'    => 'select',
				'options' => $so_widget_names,
			)
		);

		global $wp_widget_factory;

		$parsed_value = json_decode( html_entity_decode( stripslashes( $value ) ), true );

		if ( empty( $parsed_value ) ) {
			//Get the first value as the default.
			reset( $so_widget_names );
			$widget_class = key( $so_widget_names );
		} else {
			$widget_class = $parsed_value['widget_class'];
		}

		$widget = ! empty( $wp_widget_factory->widgets[ $widget_class ] ) ? $wp_widget_factory->widgets[ $widget_class ] : false;

		ob_start();
		$select->render( $widget_class ); ?>
		<input type="hidden" name="so_widget_data" class="wpb_vc_param_value" value="<?php echo esc_attr( $value ); ?>">
		<div class="siteorigin_widget_form_container">
			<?php
			if ( ! empty( $widget ) && is_object( $widget ) && is_subclass_of( $widget, 'SiteOrigin_Widget' ) ) {
				/* @var $widget SiteOrigin_Widget */
				$widget->form( $parsed_value['widget_data'] );
			}
			?>
		</div>
		<?php
		return ob_get_clean();
	}

	public function sowb_vc_widget_render_form() {
		if ( empty( $_REQUEST['widget'] ) ) {
			wp_die();
		}

		if ( empty( $_REQUEST['_sowbnonce'] ) || ! wp_verify_nonce( $_REQUEST['_sowbnonce'], 'sowb_vc_widget_render_form' ) ) {
			wp_die();
		}

		$request = array_map( 'stripslashes_deep', $_REQUEST );
		$widget_class = $request['widget'];

		global $wp_widget_factory;

		$widget = ! empty( $wp_widget_factory->widgets[ $widget_class ] ) ? $wp_widget_factory->widgets[ $widget_class ] : false;

		if ( ! empty( $widget ) && is_object( $widget ) && is_subclass_of( $widget, 'SiteOrigin_Widget' ) ) {
			/* @var $widget SiteOrigin_Widget */
			$widget->form( array() );
		}

		wp_die();
	}

	public function update_widget_data( $content ) {
		$content = preg_replace_callback(
			'/\[siteorigin_widget_vc [^\]]*\]/',
			array( $this, 'update_shortcode' ),
			$content
		);

		return $content;
	}

	public function update_shortcode( $shortcode ) {
		preg_match(
			'/so_widget_data="([^"]*)"/',
			stripslashes( stripslashes( $shortcode[0] ) ),
			$widget_json
		);

		// We double encode in the front end to prevent accidental decoding when the content is set on the
		// WP visual editor.
		$widget_json = html_entity_decode( html_entity_decode( $widget_json[1] ) );

		$widget_atts = json_decode( $widget_json, true );

		global $wp_widget_factory;

		$widget = ! empty( $wp_widget_factory->widgets[ $widget_atts['widget_class'] ] ) ? $wp_widget_factory->widgets[ $widget_atts['widget_class'] ] : false;

		if ( ! empty( $widget ) && is_object( $widget ) && is_subclass_of( $widget, 'SiteOrigin_Widget' ) ) {
			/* @var $widget SiteOrigin_Widget */
			$widget_atts['widget_data'] = $widget->update( $widget_atts['widget_data'], $widget_atts['widget_data'] );
		}

		$widget_json = json_encode( $widget_atts );

		$widget_json = htmlentities( htmlentities( $widget_json ) );

		$widget_json = str_replace(
			array( '[', ']' ),
			array( '&#91;', '&#93;' ),
			$widget_json
		);

		$slashed = addslashes( 'so_widget_data="' . addslashes( $widget_json ) . '"' );

		preg_replace( '/so_widget_data="([^"]*)"/', $slashed, $shortcode );

		return '[siteorigin_widget_vc ' . $slashed . ']';
	}
}

SiteOrigin_Widgets_Bundle_Visual_Composer::single();

if ( class_exists( 'WPBakeryShortCode' ) ) {
	class WPBakeryShortCode_SiteOrigin_Widget_VC extends WPBakeryShortCode {
	public function __construct( $settings ) {
			parent::__construct( $settings );
		}

		public function contentInline( $atts, $content ) {
			if ( empty( $atts ) ) {
				return '';
			}
			$widget_settings = $this->get_widget_settings( $atts );
			ob_start();
			$instance = $this->update_widget( $widget_settings['widget_class'], $widget_settings['widget_data'] );
			$this->render_widget( $widget_settings['widget_class'], $instance );

			return ob_get_clean();
		}

		public function get_widget_settings( $atts ) {
			if ( empty( $atts ) || empty( $atts['so_widget_data'] ) ) {
				return array();
			}
			$unesc = $atts['so_widget_data'];

			return json_decode( $unesc, true );
		}

		private function get_so_widget( $widget_class ) {
			global $wp_widget_factory;

			$widget = ! empty( $wp_widget_factory->widgets[ $widget_class ] ) ? $wp_widget_factory->widgets[ $widget_class ] : false;

			if ( ! empty( $widget ) && is_object( $widget ) && is_subclass_of( $widget, 'SiteOrigin_Widget' ) ) {
				/* @var $widget SiteOrigin_Widget */
				return $widget;
			} else {
				return null;
			}
		}

		public function render_widget( $widget_class, $widget_instance ) {
			if ( empty( $widget_instance ) ) {
				return;
			}

			/* @var $widget SiteOrigin_Widget */
			$widget = $this->get_so_widget( $widget_class );

			if ( ! empty( $widget ) ) {
				$widget->widget( array(), $widget_instance );
			}
		}

		public function update_widget( $widget_class, $widget_instance ) {
			if ( empty( $widget_instance ) ) {
				return;
			}

			/* @var $widget SiteOrigin_Widget */
			$widget = $this->get_so_widget( $widget_class );

			if ( ! empty( $widget ) ) {
				return $widget->update( $widget_instance, $widget_instance );
			} else {
				return $widget_instance;
			}
		}

		/**
		 * @return array
		 */
		protected function prepareAtts( $atts ) {
			$return = array();

			if ( is_array( $atts ) ) {
				foreach ( $atts as $key => $val ) {
					// We double encode in the front end to prevent accidental decoding when the content is set on the
					// WP visual editor.
					$return[ $key ] = html_entity_decode( html_entity_decode( $val ) );
				}
			}

			return $return;
		}
	}
}
amp.php000064400000000451151535352170006041 0ustar00<?php
/**
 * Add AMP Text widget as a Core JS Widget.
 *
 * @param $panels_data
 *
 * @return mixed
 */
function siteorigin_panels_add_amp_text( $widgets ) {
	$widgets[] = 'AMP_Widget_Text';

	return $widgets;
}
add_filter( 'siteorigin_panels_core_js_widgets', 'siteorigin_panels_add_amp_text' );
js/siteorigin-panels-layout-block.js000064400000035651151535352170013576 0ustar00"use strict";

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }

function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }

function _createSuper(Derived) {
  function isNativeReflectConstruct() {
    if (typeof Reflect === "undefined" || !Reflect.construct) return false;
    if (Reflect.construct.sham) return false;
    if (typeof Proxy === "function") return true;

    try {
      Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
      return true;
    } catch (e) {
      return false;
    }
  }

  return function () {
    var Super = _getPrototypeOf(Derived),
        result;

    if (isNativeReflectConstruct()) {
      var NewTarget = _getPrototypeOf(this).constructor;

      result = Reflect.construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }

    return _possibleConstructorReturn(this, result);
  };
}

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }

var SiteOriginPanelsLayoutBlock =
/*#__PURE__*/
function (_wp$element$Component) {
  _inherits(SiteOriginPanelsLayoutBlock, _wp$element$Component);

  var _super = _createSuper(SiteOriginPanelsLayoutBlock);

  function SiteOriginPanelsLayoutBlock(props) {
    var _this;

    _classCallCheck(this, SiteOriginPanelsLayoutBlock);

    _this = _super.call(this, props);
    var editMode = window.soPanelsBlockEditorAdmin.defaultMode === 'edit' || lodash.isEmpty(props.panelsData);
    _this.state = {
      editing: editMode,
      loadingPreview: !editMode,
      previewHtml: '',
      previewInitialized: !editMode
    };
    _this.panelsContainer = wp.element.createRef();
    _this.previewContainer = wp.element.createRef();
    _this.panelsInitialized = false;
    return _this;
  }

  _createClass(SiteOriginPanelsLayoutBlock, [{
    key: "componentDidMount",
    value: function componentDidMount() {
      this.isStillMounted = true;

      if (this.state.editing) {
        this.setupPanels();
      } else if (!this.state.editing && !this.previewInitialized) {
        this.fetchPreview(this.props);
        this.fetchPreview = lodash.debounce(this.fetchPreview, 500);
      }
    }
  }, {
    key: "componentWillUnmount",
    value: function componentWillUnmount() {
      this.isStillMounted = false;

      if (this.builderView) {
        this.builderView.off('content_change');
      }
    }
  }, {
    key: "componentDidUpdate",
    value: function componentDidUpdate(prevProps) {
      if (this.state.editing && !this.panelsInitialized) {
        this.setupPanels();
      } else if (this.state.loadingPreview) {
        this.fetchPreview(this.props);
        this.fetchPreview = lodash.debounce(this.fetchPreview, 500);
      } else if (!this.state.previewInitialized) {
        jQuery(document).trigger('panels_setup_preview');
        this.setState({
          previewInitialized: true
        });
      }
    }
  }, {
    key: "setupPanels",
    value: function setupPanels() {
      var _this2 = this;

      var $panelsContainer = jQuery(this.panelsContainer.current);
      var config = {
        editorType: 'standalone',
        loadLiveEditor: false,
        postId: window.soPanelsBlockEditorAdmin.postId,
        liveEditorPreview: window.soPanelsBlockEditorAdmin.liveEditor
      };
      var builderModel = new panels.model.builder();
      this.builderView = new panels.view.builder({
        model: builderModel,
        config: config
      }); // Make sure panelsData is defined and clone so that we don't alter the underlying attribute.

      var panelsData = JSON.parse(JSON.stringify(jQuery.extend({}, this.props.panelsData))); // Disable block selection while dragging rows or widgets.

      var rowOrWidgetMouseDown = function rowOrWidgetMouseDown() {
        if (lodash.isFunction(_this2.props.onRowOrWidgetMouseDown)) {
          _this2.props.onRowOrWidgetMouseDown();
        }

        var rowOrWidgetMouseUp = function rowOrWidgetMouseUp() {
          jQuery(document).off('mouseup', rowOrWidgetMouseUp);

          if (lodash.isFunction(_this2.props.onRowOrWidgetMouseUp)) {
            _this2.props.onRowOrWidgetMouseUp();
          }
        };

        jQuery(document).on('mouseup', rowOrWidgetMouseUp);
      };

      this.builderView.on('row_added', function () {
        _this2.builderView.$('.so-row-move').off('mousedown', rowOrWidgetMouseDown);

        _this2.builderView.$('.so-row-move').on('mousedown', rowOrWidgetMouseDown);

        _this2.builderView.$('.so-widget').off('mousedown', rowOrWidgetMouseDown);

        _this2.builderView.$('.so-widget').on('mousedown', rowOrWidgetMouseDown);
      });
      this.builderView.on('widget_added', function () {
        _this2.builderView.$('.so-widget').off('mousedown', rowOrWidgetMouseDown);

        _this2.builderView.$('.so-widget').on('mousedown', rowOrWidgetMouseDown);
      });
      this.builderView.render().attach({
        container: $panelsContainer
      }).setData(panelsData);
      this.builderView.trigger('builder_resize');
      this.builderView.on('content_change', function () {
        var newPanelsData = _this2.builderView.getData();

        _this2.panelsDataChanged = !lodash.isEqual(panelsData, newPanelsData);

        if (_this2.panelsDataChanged) {
          if (_this2.props.onContentChange && lodash.isFunction(_this2.props.onContentChange)) {
            _this2.props.onContentChange(newPanelsData);
          }

          _this2.setState({
            loadingPreview: true,
            previewHtml: ''
          });
        }
      });
      jQuery(document).trigger('panels_setup', this.builderView);

      if (typeof window.soPanelsBuilderView == 'undefined') {
        window.soPanelsBuilderView = [];
      }

      window.soPanelsBuilderView.push(this.builderView);
      this.panelsInitialized = true;
    }
  }, {
    key: "fetchPreview",
    value: function fetchPreview(props) {
      var _this3 = this;

      if (!this.isStillMounted) {
        return;
      }

      this.setState({
        previewInitialized: false
      });
      var fetchRequest = this.currentFetchRequest = jQuery.post({
        url: window.soPanelsBlockEditorAdmin.previewUrl,
        data: {
          action: 'so_panels_layout_block_preview',
          panelsData: JSON.stringify(props.panelsData)
        }
      }).then(function (preview) {
        if (_this3.isStillMounted && fetchRequest === _this3.currentFetchRequest && preview) {
          _this3.setState({
            previewHtml: preview,
            loadingPreview: false,
            previewInitialized: false
          });
        }
      });
      return fetchRequest;
    }
  }, {
    key: "render",
    value: function render() {
      var _this4 = this;

      var panelsData = this.props.panelsData;

      var switchToEditing = function switchToEditing() {
        _this4.panelsInitialized = false;

        _this4.setState({
          editing: true
        });
      };

      var switchToPreview = function switchToPreview() {
        if (panelsData) {
          _this4.setState({
            editing: false,
            loadingPreview: !_this4.state.previewHtml,
            previewInitialized: false
          });
        }
      };

      if (this.state.editing) {
        return React.createElement(wp.element.Fragment, null, React.createElement(wp.blockEditor.BlockControls, null, React.createElement(wp.components.Toolbar, {
          label: wp.i18n.__('Page Builder Mode.', 'siteorigin-panels')
        }, React.createElement(wp.components.ToolbarButton, {
          icon: "visibility",
          className: "components-icon-button components-toolbar__control",
          label: wp.i18n.__('Preview layout.', 'siteorigin-panels'),
          onClick: switchToPreview
        }))), React.createElement("div", {
          key: "layout-block",
          className: "siteorigin-panels-layout-block-container",
          ref: this.panelsContainer
        }));
      } else {
        var loadingPreview = this.state.loadingPreview;
        return React.createElement(wp.element.Fragment, null, React.createElement(wp.blockEditor.BlockControls, null, React.createElement(wp.components.Toolbar, {
          label: wp.i18n.__('Page Builder Mode.', 'siteorigin-panels')
        }, React.createElement(wp.components.ToolbarButton, {
          icon: "edit",
          className: "components-icon-button components-toolbar__control",
          label: wp.i18n.__('Edit layout.', 'siteorigin-panels'),
          onClick: switchToEditing
        }))), React.createElement("div", {
          key: "preview",
          className: "so-panels-block-layout-preview-container"
        }, loadingPreview ? React.createElement("div", {
          className: "so-panels-spinner-container"
        }, React.createElement("span", null, React.createElement(wp.components.Spinner, null))) : React.createElement("div", {
          className: "so-panels-raw-html-container",
          ref: this.previewContainer
        }, React.createElement(wp.element.RawHTML, null, this.state.previewHtml))));
      }
    }
  }]);

  return SiteOriginPanelsLayoutBlock;
}(wp.element.Component);

var hasLayoutCategory = wp.blocks.getCategories().some(function (category) {
  return category.slug === 'layout';
});
wp.blocks.registerBlockType('siteorigin-panels/layout-block', {
  title: wp.i18n.__('SiteOrigin Layout', 'siteorigin-panels'),
  description: wp.i18n.__("Build a layout using SiteOrigin's Page Builder.", 'siteorigin-panels'),
  icon: function icon() {
    return React.createElement("span", {
      className: "siteorigin-panels-block-icon"
    });
  },
  category: hasLayoutCategory ? 'layout' : 'design',
  keywords: ['page builder', 'column,grid', 'panel'],
  supports: {
    html: false
  },
  attributes: {
    panelsData: {
      type: 'object'
    },
    contentPreview: {
      type: 'string'
    }
  },
  edit: function edit(_ref) {
    var attributes = _ref.attributes,
        setAttributes = _ref.setAttributes,
        toggleSelection = _ref.toggleSelection;

    var onLayoutBlockContentChange = function onLayoutBlockContentChange(newPanelsData) {
      if (!lodash.isEmpty(newPanelsData.widgets)) {
        // Send panelsData to server for sanitization.
        wp.data.dispatch('core/editor').lockPostSaving();
        jQuery.post(panelsOptions.ajaxurl, {
          action: 'so_panels_builder_content_json',
          panels_data: JSON.stringify(newPanelsData),
          post_id: wp.data.select("core/editor").getCurrentPostId()
        }, function (content) {
          var panelsAttributes = {};

          if (content.sanitized_panels_data !== '') {
            panelsAttributes.panelsData = content.sanitized_panels_data;
          }

          if (content.preview !== '') {
            panelsAttributes.contentPreview = content.preview;
          }

          setAttributes(panelsAttributes);
          wp.data.dispatch('core/editor').unlockPostSaving();
        });
      }
    };

    var disableSelection = function disableSelection() {
      toggleSelection(false);
    };

    var enableSelection = function enableSelection() {
      toggleSelection(true);
    };

    return React.createElement(SiteOriginPanelsLayoutBlock, {
      panelsData: attributes.panelsData,
      onContentChange: onLayoutBlockContentChange,
      onRowOrWidgetMouseDown: disableSelection,
      onRowOrWidgetMouseUp: enableSelection
    });
  },
  save: function save(_ref2) {
    var attributes = _ref2.attributes;
    return attributes.hasOwnProperty('contentPreview') ? React.createElement(wp.element.RawHTML, null, attributes.contentPreview) : null;
  }
});

(function (jQuery) {
  if (window.soPanelsBlockEditorAdmin.showAddButton) {
    jQuery(function () {
      setTimeout(function () {
        var editorDispatch = wp.data.dispatch('core/editor');
        var editorSelect = wp.data.select('core/editor');
        var tmpl = jQuery('#siteorigin-panels-add-layout-block-button').html();
        var $addButton = jQuery(tmpl).insertAfter('.editor-writing-flow > div:first, .block-editor-writing-flow > div:not([tabindex])');
        $addButton.on('click', function () {
          var layoutBlock = wp.blocks.createBlock('siteorigin-panels/layout-block', {});
          var isEmpty = editorSelect.isEditedPostEmpty();

          if (isEmpty) {
            var blocks = editorSelect.getBlocks();

            if (blocks.length) {
              editorDispatch.replaceBlock(blocks[0].clientId, layoutBlock);
            } else {
              editorDispatch.insertBlock(layoutBlock);
            }
          } else {
            editorDispatch.insertBlock(layoutBlock);
          }
        });

        var hideButtonIfBlocks = function hideButtonIfBlocks() {
          var isEmpty = wp.data.select('core/editor').isEditedPostEmpty();

          if (isEmpty) {
            $addButton.show();
          } else {
            $addButton.hide();
          }
        };

        wp.data.subscribe(hideButtonIfBlocks);
        hideButtonIfBlocks();
      }, 100);
    });
  }
})(jQuery); // Detect preview mode changes, and trigger resize.


jQuery(document).on('click', '.block-editor-post-preview__button-resize', function (e) {
  if (!jQuery(this).hasClass('has-icon')) {
    jQuery(window).trigger('resize');
  }
});js/siteorigin-panels-layout-block.min.js000064400000021562151535352170014354 0ustar00"use strict";function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&_setPrototypeOf(e,t)}function _setPrototypeOf(e,t){return(_setPrototypeOf=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function _createSuper(e){function t(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}return function(){var n,i=_getPrototypeOf(e);if(t()){var o=_getPrototypeOf(this).constructor;n=Reflect.construct(i,arguments,o)}else n=i.apply(this,arguments);return _possibleConstructorReturn(this,n)}}function _possibleConstructorReturn(e,t){return!t||"object"!==_typeof(t)&&"function"!=typeof t?_assertThisInitialized(e):t}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _getPrototypeOf(e){return(_getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var SiteOriginPanelsLayoutBlock=function(e){_inherits(n,wp.element.Component);var t=_createSuper(n);function n(e){var i;_classCallCheck(this,n),i=t.call(this,e);var o="edit"===window.soPanelsBlockEditorAdmin.defaultMode||lodash.isEmpty(e.panelsData);return i.state={editing:o,loadingPreview:!o,previewHtml:"",previewInitialized:!o},i.panelsContainer=wp.element.createRef(),i.previewContainer=wp.element.createRef(),i.panelsInitialized=!1,i}return _createClass(n,[{key:"componentDidMount",value:function(){this.isStillMounted=!0,this.state.editing?this.setupPanels():this.state.editing||this.previewInitialized||(this.fetchPreview(this.props),this.fetchPreview=lodash.debounce(this.fetchPreview,500))}},{key:"componentWillUnmount",value:function(){this.isStillMounted=!1,this.builderView&&this.builderView.off("content_change")}},{key:"componentDidUpdate",value:function(e){this.state.editing&&!this.panelsInitialized?this.setupPanels():this.state.loadingPreview?(this.fetchPreview(this.props),this.fetchPreview=lodash.debounce(this.fetchPreview,500)):this.state.previewInitialized||(jQuery(document).trigger("panels_setup_preview"),this.setState({previewInitialized:!0}))}},{key:"setupPanels",value:function(){var e=this,t=jQuery(this.panelsContainer.current),n={editorType:"standalone",loadLiveEditor:!1,postId:window.soPanelsBlockEditorAdmin.postId,liveEditorPreview:window.soPanelsBlockEditorAdmin.liveEditor},i=new panels.model.builder;this.builderView=new panels.view.builder({model:i,config:n});var o=JSON.parse(JSON.stringify(jQuery.extend({},this.props.panelsData))),r=function(){lodash.isFunction(e.props.onRowOrWidgetMouseDown)&&e.props.onRowOrWidgetMouseDown();jQuery(document).on("mouseup",(function t(){jQuery(document).off("mouseup",t),lodash.isFunction(e.props.onRowOrWidgetMouseUp)&&e.props.onRowOrWidgetMouseUp()}))};this.builderView.on("row_added",(function(){e.builderView.$(".so-row-move").off("mousedown",r),e.builderView.$(".so-row-move").on("mousedown",r),e.builderView.$(".so-widget").off("mousedown",r),e.builderView.$(".so-widget").on("mousedown",r)})),this.builderView.on("widget_added",(function(){e.builderView.$(".so-widget").off("mousedown",r),e.builderView.$(".so-widget").on("mousedown",r)})),this.builderView.render().attach({container:t}).setData(o),this.builderView.trigger("builder_resize"),this.builderView.on("content_change",(function(){var t=e.builderView.getData();e.panelsDataChanged=!lodash.isEqual(o,t),e.panelsDataChanged&&(e.props.onContentChange&&lodash.isFunction(e.props.onContentChange)&&e.props.onContentChange(t),e.setState({loadingPreview:!0,previewHtml:""}))})),jQuery(document).trigger("panels_setup",this.builderView),void 0===window.soPanelsBuilderView&&(window.soPanelsBuilderView=[]),window.soPanelsBuilderView.push(this.builderView),this.panelsInitialized=!0}},{key:"fetchPreview",value:function(e){var t=this;if(this.isStillMounted){this.setState({previewInitialized:!1});var n=this.currentFetchRequest=jQuery.post({url:window.soPanelsBlockEditorAdmin.previewUrl,data:{action:"so_panels_layout_block_preview",panelsData:JSON.stringify(e.panelsData)}}).then((function(e){t.isStillMounted&&n===t.currentFetchRequest&&e&&t.setState({previewHtml:e,loadingPreview:!1,previewInitialized:!1})}));return n}}},{key:"render",value:function(){var e=this,t=this.props.panelsData;if(this.state.editing)return React.createElement(wp.element.Fragment,null,React.createElement(wp.blockEditor.BlockControls,null,React.createElement(wp.components.Toolbar,{label:wp.i18n.__("Page Builder Mode.","siteorigin-panels")},React.createElement(wp.components.ToolbarButton,{icon:"visibility",className:"components-icon-button components-toolbar__control",label:wp.i18n.__("Preview layout.","siteorigin-panels"),onClick:function(){t&&e.setState({editing:!1,loadingPreview:!e.state.previewHtml,previewInitialized:!1})}}))),React.createElement("div",{key:"layout-block",className:"siteorigin-panels-layout-block-container",ref:this.panelsContainer}));var n=this.state.loadingPreview;return React.createElement(wp.element.Fragment,null,React.createElement(wp.blockEditor.BlockControls,null,React.createElement(wp.components.Toolbar,{label:wp.i18n.__("Page Builder Mode.","siteorigin-panels")},React.createElement(wp.components.ToolbarButton,{icon:"edit",className:"components-icon-button components-toolbar__control",label:wp.i18n.__("Edit layout.","siteorigin-panels"),onClick:function(){e.panelsInitialized=!1,e.setState({editing:!0})}}))),React.createElement("div",{key:"preview",className:"so-panels-block-layout-preview-container"},n?React.createElement("div",{className:"so-panels-spinner-container"},React.createElement("span",null,React.createElement(wp.components.Spinner,null))):React.createElement("div",{className:"so-panels-raw-html-container",ref:this.previewContainer},React.createElement(wp.element.RawHTML,null,this.state.previewHtml))))}}]),n}(),hasLayoutCategory=wp.blocks.getCategories().some((function(e){return"layout"===e.slug}));wp.blocks.registerBlockType("siteorigin-panels/layout-block",{title:wp.i18n.__("SiteOrigin Layout","siteorigin-panels"),description:wp.i18n.__("Build a layout using SiteOrigin's Page Builder.","siteorigin-panels"),icon:function(){return React.createElement("span",{className:"siteorigin-panels-block-icon"})},category:hasLayoutCategory?"layout":"design",keywords:["page builder","column,grid","panel"],supports:{html:!1},attributes:{panelsData:{type:"object"},contentPreview:{type:"string"}},edit:function(e){var t=e.attributes,n=e.setAttributes,i=e.toggleSelection;return React.createElement(SiteOriginPanelsLayoutBlock,{panelsData:t.panelsData,onContentChange:function(e){lodash.isEmpty(e.widgets)||(wp.data.dispatch("core/editor").lockPostSaving(),jQuery.post(panelsOptions.ajaxurl,{action:"so_panels_builder_content_json",panels_data:JSON.stringify(e),post_id:wp.data.select("core/editor").getCurrentPostId()},(function(e){var t={};""!==e.sanitized_panels_data&&(t.panelsData=e.sanitized_panels_data),""!==e.preview&&(t.contentPreview=e.preview),n(t),wp.data.dispatch("core/editor").unlockPostSaving()})))},onRowOrWidgetMouseDown:function(){i(!1)},onRowOrWidgetMouseUp:function(){i(!0)}})},save:function(e){var t=e.attributes;return t.hasOwnProperty("contentPreview")?React.createElement(wp.element.RawHTML,null,t.contentPreview):null}}),function(e){window.soPanelsBlockEditorAdmin.showAddButton&&e((function(){setTimeout((function(){var t=wp.data.dispatch("core/editor"),n=wp.data.select("core/editor"),i=e("#siteorigin-panels-add-layout-block-button").html(),o=e(i).insertAfter(".editor-writing-flow > div:first, .block-editor-writing-flow > div:not([tabindex])");o.on("click",(function(){var e=wp.blocks.createBlock("siteorigin-panels/layout-block",{});if(n.isEditedPostEmpty()){var i=n.getBlocks();i.length?t.replaceBlock(i[0].clientId,e):t.insertBlock(e)}else t.insertBlock(e)}));var r=function(){wp.data.select("core/editor").isEditedPostEmpty()?o.show():o.hide()};wp.data.subscribe(r),r()}),100)}))}(jQuery),jQuery(document).on("click",".block-editor-post-preview__button-resize",(function(e){jQuery(this).hasClass("has-icon")||jQuery(window).trigger("resize")}));layout-block.php000064400000011161151535352170007671 0ustar00<?php

class SiteOrigin_Panels_Compat_Layout_Block {
	
	const BLOCK_NAME = 'siteorigin-panels/layout-block';
	
	/**
	 * Get the singleton instance
	 *
	 * @return SiteOrigin_Panels_Compat_Layout_Block
	 */
	public static function single() {
		static $single;
		
		return empty( $single ) ? $single = new self() : $single;
	}
	
	public function __construct() {
		add_action( 'init', array( $this, 'register_layout_block' ) );
		// This action is slightly later than `enqueue_block_editor_assets`,
		// which we need to use to ensure our templates are loaded at the right time.
		add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_layout_block_editor_assets' ) );

		// We need to override the container when using the Block Editor to allow for resizing.
		add_filter( 'siteorigin_panels_full_width_container', array( $this, 'override_container' ) );
	}
	
	public function register_layout_block() {
		register_block_type( self::BLOCK_NAME, array(
			'render_callback' => array( $this, 'render_layout_block' ),
		) );
	}
	
	public function enqueue_layout_block_editor_assets() {
		if (  SiteOrigin_Panels_Admin::is_block_editor() ) {
			$panels_admin = SiteOrigin_Panels_Admin::single();
			$panels_admin->enqueue_admin_scripts();
			$panels_admin->enqueue_admin_styles();
			$panels_admin->js_templates();
			
			wp_enqueue_script(
				'siteorigin-panels-layout-block',
				plugins_url( 'js/siteorigin-panels-layout-block' . SITEORIGIN_PANELS_JS_SUFFIX . '.js', __FILE__ ),
				array(
					'wp-editor',
					'wp-blocks',
					'wp-i18n',
					'wp-element',
					'wp-components',
					'wp-compose',
					'so-panels-admin'
				),
				SITEORIGIN_PANELS_VERSION
			);
			
			$current_screen = get_current_screen();
			$is_panels_post_type = in_array( $current_screen->id, siteorigin_panels_setting( 'post-types' ) );
			wp_localize_script(
				'siteorigin-panels-layout-block',
				'soPanelsBlockEditorAdmin',
				array(
					'sanitizeUrl' => wp_nonce_url( admin_url( 'admin-ajax.php' ), 'layout-block-sanitize', '_panelsnonce' ),
					'previewUrl' => wp_nonce_url( admin_url( 'admin-ajax.php' ), 'layout-block-preview', '_panelsnonce' ),
					'postId' => get_the_ID(),
					'liveEditor' => SiteOrigin_Panels::preview_url(),
					'defaultMode' => siteorigin_panels_setting( 'layout-block-default-mode' ),
					'showAddButton' => apply_filters( 'siteorigin_layout_block_show_add_button', $is_panels_post_type ),
				)
			);
			// This is only available in WP5.
			if ( function_exists( 'wp_set_script_translations' ) ) {
				wp_set_script_translations( 'siteorigin-panels-layout-block', 'siteorigin-panels' );
			}
			SiteOrigin_Panels_Styles::register_scripts();
			wp_enqueue_script( 'siteorigin-panels-front-styles' );
			
			// Enqueue front end scripts for our widgets bundle.
			if ( class_exists( 'SiteOrigin_Widgets_Bundle' ) ) {
				$sowb = SiteOrigin_Widgets_Bundle::single();
				$sowb->register_general_scripts();
				if ( method_exists( $sowb, 'enqueue_registered_widgets_scripts' ) ) {
					$sowb->enqueue_registered_widgets_scripts( true, false );
				}
			}
		}
	}
	
	public function render_layout_block( $attributes ) {
		
		if ( empty( $attributes['panelsData'] ) ) {
			return '<div>'.
				   __( "You need to add a widget, row, or prebuilt layout before you'll see anything here. :)", 'siteorigin-panels' ) .
				   '</div>';
		}
		$panels_data = $attributes['panelsData'];
		$panels_data = $this->sanitize_panels_data( $panels_data );
		$builder_id = isset( $attributes['builder_id'] ) ? $attributes['builder_id'] : uniqid( 'gb' . get_the_ID() . '-' );

		// Support for custom CSS classes
		$add_custom_class_name = function( $class_names ) use ($attributes) {
			if ( ! empty( $attributes['className'] ) ) {
				$class_names[] = $attributes['className'];
			}
			return $class_names;
		};
		add_filter( 'siteorigin_panels_layout_classes', $add_custom_class_name );
		$rendered_layout = SiteOrigin_Panels::renderer()->render( $builder_id, true, $panels_data );
		remove_filter( 'siteorigin_panels_layout_classes', $add_custom_class_name );
		return $rendered_layout;
	}
	
	private function sanitize_panels_data( $panels_data ) {
		// We force calling widgets' update functions here, but a better solution is to ensure these are called when
		// the block is saved, but there is currently no simple method to do so.
		$panels_data['widgets'] = SiteOrigin_Panels_Admin::single()->process_raw_widgets( $panels_data['widgets'], false, true );
		$panels_data = SiteOrigin_Panels_Styles_Admin::single()->sanitize_all( $panels_data );
		return $panels_data;
	}

	function override_container( $container ) {
		return SiteOrigin_Panels_Admin::is_block_editor() ? '.editor-styles-wrapper' : $container;
	}
}
widget-options.php000064400000002055151535352170010242 0ustar00<?php

/**
 * Filter panels_data so it's compatible with Widget Options plugin.
 *
 * @param $panels_data
 *
 * @return mixed
 */
function siteorigin_panels_widget_options_compat_panels_data( $panels_data ) {
	if( !empty($panels_data['widgets']) && is_array($panels_data['widgets']) ) {
		foreach( $panels_data['widgets'] as & $widget ) {
			if( !empty($widget['extended_widget_opts']) ) {
				$widget['extended_widget_opts'] = siteorigin_panels_widget_options_compat_filter($widget['extended_widget_opts']);
			}
		}
	}
	
	return $panels_data;
}
add_filter('siteorigin_panels_data', 'siteorigin_panels_widget_options_compat_panels_data');

/**
 * Filter that removes any empty strings so they pass an !isset test.
 *
 * @param $value
 *
 * @return array
 */
function siteorigin_panels_widget_options_compat_filter($value){
	if( is_array($value) ) {
		foreach($value as $k => & $v) {
			if(is_array($v)) {
				$v = siteorigin_panels_widget_options_compat_filter($v);
			}
			else if( is_string($v) && empty($v) ) {
				unset($value[$k]);
			}
		}
	}
	
	return $value;
}yoast-sitemap.php000064400000001710151535352170010062 0ustar00<?php

/**
 * Returns a list of all images added using Page Builder.
 *
 * @param $images an array of all detected images used in the current post.
 * @param $post_id the current post id.
 *
 * @return array
 */
function siteorigin_yoast_sitemap_images_compat( $images, $post_id ) {
	if (
		get_post_meta( $post_id, 'panels_data', true ) &&
		extension_loaded( 'xml' ) &&
		class_exists( 'DOMDocument' )
	) {
		$content = SiteOrigin_Panels::renderer()->render(
			$post_id,
			false
		);

		libxml_use_internal_errors( true );
		$dom = new DOMDocument();
		$dom->loadHTML( '<?xml encoding="UTF-8">' . $content );
		libxml_clear_errors();

		foreach ( $dom->getElementsByTagName( 'img' ) as $img ) {
			$src = $img->getAttribute( 'src' );

			if ( ! empty( $src ) && $src == esc_url( $src ) ) {
				$images[] = array(
					'src'   => $src,
				);
			}
		}
	}

	return $images;
}
add_filter( 'wpseo_sitemap_urlimages', 'siteorigin_yoast_sitemap_images_compat', 10, 2 );