"animated-heading", "args" => ['render_callback' => array(DynamicBlockAssets::class, 'EnqueueAnimatedHeader')]],
['path' => "author-box", "args" => []],
['path' => "ratings", "args" => []],
['path' => "table-of-contents", "args" => []],
['path' => "recent-posts", "args" => ['render_callback' => array(RecentPostsController::class, 'DynamicRender')]],
['path' => "cover-image", "args" => []],
['path' => "google-maps", "args" => []],
['path' => "reveal-buttons", "args" => []],
['path' => "reveal-button", "args" => ['render_callback' => array(DynamicBlockAssets::class, 'EnqueueRevealButton')]],
['path' => "accordion", "args" => ['render_callback' => array(DynamicBlockAssets::class, 'EnqueueAccordion')]]
);
public function __construct()
{
WizardRestorationPointController::Initialize();
if (!self::is_compatible()) {
return;
}
add_action('block_categories_all', array($this, 'RegisterBlockCategory'), defined('PHP_INT_MAX') ? PHP_INT_MAX : 999, 2);
add_action('init', array($this, 'RegisterBlocksAndStyles'), 0);
add_action('enqueue_block_editor_assets', array($this, 'EnqueueBlockEditorAssets'));
add_action("enqueue_block_assets", array($this, 'EnqueueEditorIframeAssets'));
add_action("wp_enqueue_scripts", array($this, 'EnqueuePatternAssets'));
add_action('enqueue_block_editor_assets', array($this, 'EnqueueVariableFallbacks'), PHP_INT_MIN);
add_action("wp_enqueue_scripts", array($this, 'EnqueueVariableFallbacks'), PHP_INT_MIN);
add_action('wp_print_styles', array($this, 'ReorderVariableFallbacks'), PHP_INT_MAX);
GutenbergEnhancementsController::Initialize();
WizardController::Initialize();
}
public static function is_compatible()
{
// Check for required WP version
if (version_compare(get_bloginfo('version'), self::MINIMUM_WORDPRESS_VERSION, '<')) {
return false;
}
// Check for required PHP version
if (version_compare(PHP_VERSION, self::MINIMUM_PHP_VERSION, '<')) {
return false;
}
return true;
}
public static function is_block_theme()
{
if (!function_exists('wp_is_block_theme')) {
return false;
}
if (!wp_is_block_theme()) {
return false;
}
return true;
}
public static function GetGutenbergLibraryMenuItems()
{
return array(
array(
"id" => "patterns",
"premium_url" => AdminLinkUtil::GetLink(AdminLinkSource::LIBRARY_ITEM),
"title" => esc_html__('Patterns', "superb-blocks"),
"routes" => array(
"list" => LibraryRequestController::GUTENBERG_LIST_ROUTE . LibraryRequestController::GUTENBERG_ROUTE_TYPE_PATTERNS,
"insert" => LibraryRequestController::GUTENBERG_INSERT_ROUTE . LibraryRequestController::GUTENBERG_ROUTE_TYPE_PATTERNS
),
"hidden" => false
),
array(
"id" => "pages",
"premium_url" => AdminLinkUtil::GetLink(AdminLinkSource::LIBRARY_PAGE_ITEM),
"title" => esc_html__('Pages', "superb-blocks"),
"routes" => array(
"list" => LibraryRequestController::GUTENBERG_LIST_ROUTE . LibraryRequestController::GUTENBERG_ROUTE_TYPE_PAGES,
"insert" => LibraryRequestController::GUTENBERG_INSERT_ROUTE . LibraryRequestController::GUTENBERG_ROUTE_TYPE_PAGES
),
"hidden" => false
)
);
}
public function EnqueuePatternAssets()
{
wp_enqueue_style(
'superb-addons-patterns'
);
}
public function EnqueueVariableFallbacks()
{
$fallbacks = ":root{--wp--preset--color--primary:#1f7cec;--wp--preset--color--primary-hover:#3993ff;--wp--preset--color--base:#fff;--wp--preset--color--featured:#0a284b;--wp--preset--color--contrast-light:#fff;--wp--preset--color--contrast-dark:#000;--wp--preset--color--mono-1:#0d3c74;--wp--preset--color--mono-2:#64748b;--wp--preset--color--mono-3:#e2e8f0;--wp--preset--color--mono-4:#f8fafc;--wp--preset--spacing--superbspacing-xxsmall:clamp(5px,1vw,10px);--wp--preset--spacing--superbspacing-xsmall:clamp(10px,2vw,20px);--wp--preset--spacing--superbspacing-small:clamp(20px,4vw,40px);--wp--preset--spacing--superbspacing-medium:clamp(30px,6vw,60px);--wp--preset--spacing--superbspacing-large:clamp(40px,8vw,80px);--wp--preset--spacing--superbspacing-xlarge:clamp(50px,10vw,100px);--wp--preset--spacing--superbspacing-xxlarge:clamp(60px,12vw,120px);--wp--preset--font-size--superbfont-tiny:clamp(10px,0.625rem + ((1vw - 3.2px) * 0.227),12px);--wp--preset--font-size--superbfont-xxsmall:clamp(12px,0.75rem + ((1vw - 3.2px) * 0.227),14px);--wp--preset--font-size--superbfont-xsmall:clamp(16px,1rem + ((1vw - 3.2px) * 1),16px);--wp--preset--font-size--superbfont-small:clamp(16px,1rem + ((1vw - 3.2px) * 0.227),18px);--wp--preset--font-size--superbfont-medium:clamp(18px,1.125rem + ((1vw - 3.2px) * 0.227),20px);--wp--preset--font-size--superbfont-large:clamp(24px,1.5rem + ((1vw - 3.2px) * 0.909),32px);--wp--preset--font-size--superbfont-xlarge:clamp(32px,2rem + ((1vw - 3.2px) * 1.818),48px);--wp--preset--font-size--superbfont-xxlarge:clamp(40px,2.5rem + ((1vw - 3.2px) * 2.727),64px)}.has-primary-color{color:var(--wp--preset--color--primary)!important}.has-primary-hover-color{color:var(--wp--preset--color--primary-hover)!important}.has-base-color{color:var(--wp--preset--color--base)!important}.has-featured-color{color:var(--wp--preset--color--featured)!important}.has-contrast-light-color{color:var(--wp--preset--color--contrast-light)!important}.has-contrast-dark-color{color:var(--wp--preset--color--contrast-dark)!important}.has-mono-1-color{color:var(--wp--preset--color--mono-1)!important}.has-mono-2-color{color:var(--wp--preset--color--mono-2)!important}.has-mono-3-color{color:var(--wp--preset--color--mono-3)!important}.has-mono-4-color{color:var(--wp--preset--color--mono-4)!important}.has-primary-background-color{background-color:var(--wp--preset--color--primary)!important}.has-primary-hover-background-color{background-color:var(--wp--preset--color--primary-hover)!important}.has-base-background-color{background-color:var(--wp--preset--color--base)!important}.has-featured-background-color{background-color:var(--wp--preset--color--featured)!important}.has-contrast-light-background-color{background-color:var(--wp--preset--color--contrast-light)!important}.has-contrast-dark-background-color{background-color:var(--wp--preset--color--contrast-dark)!important}.has-mono-1-background-color{background-color:var(--wp--preset--color--mono-1)!important}.has-mono-2-background-color{background-color:var(--wp--preset--color--mono-2)!important}.has-mono-3-background-color{background-color:var(--wp--preset--color--mono-3)!important}.has-mono-4-background-color{background-color:var(--wp--preset--color--mono-4)!important}.has-superbfont-tiny-font-size{font-size:var(--wp--preset--font-size--superbfont-tiny)!important}.has-superbfont-xxsmall-font-size{font-size:var(--wp--preset--font-size--superbfont-xxsmall)!important}.has-superbfont-xsmall-font-size{font-size:var(--wp--preset--font-size--superbfont-xsmall)!important}.has-superbfont-small-font-size{font-size:var(--wp--preset--font-size--superbfont-small)!important}.has-superbfont-medium-font-size{font-size:var(--wp--preset--font-size--superbfont-medium)!important}.has-superbfont-large-font-size{font-size:var(--wp--preset--font-size--superbfont-large)!important}.has-superbfont-xlarge-font-size{font-size:var(--wp--preset--font-size--superbfont-xlarge)!important}.has-superbfont-xxlarge-font-size{font-size:var(--wp--preset--font-size--superbfont-xxlarge)!important}";
wp_add_inline_style(self::VARIABLE_FALLBACKS_HANDLE, $fallbacks);
wp_enqueue_style(self::VARIABLE_FALLBACKS_HANDLE);
}
public function ReorderVariableFallbacks()
{
// Some themes/plugins may incorrectly call wp_enqueue_global_styles outside of the enqueue phase, causing our fallbacks to be enqueued in the wrong order.
// To fix this, we will move our fallbacks to the front of the queue
global $wp_styles;
if (!isset($wp_styles) || !is_object($wp_styles)) {
return;
}
if (!isset($wp_styles->queue) || !is_array($wp_styles->queue) || empty($wp_styles->queue)) {
return;
}
if (!isset($wp_styles->registered[self::VARIABLE_FALLBACKS_HANDLE])) {
return;
}
if (!in_array(self::VARIABLE_FALLBACKS_HANDLE, $wp_styles->queue)) {
return;
}
if ($wp_styles->queue[0] === self::VARIABLE_FALLBACKS_HANDLE) {
return;
}
$wp_styles->queue = array_diff($wp_styles->queue, array(self::VARIABLE_FALLBACKS_HANDLE));
array_unshift($wp_styles->queue, self::VARIABLE_FALLBACKS_HANDLE);
}
public function EnqueueEditorIframeAssets()
{
global $pagenow;
// Enqueues as block assets - check the current page to make sure we only enqueue on the site editor page and not on the frontend
if ('site-editor.php' === $pagenow) {
wp_enqueue_style(
'superb-gutenberg-layout-library',
SUPERBADDONS_ASSETS_PATH . '/css/layout-library-preview.min.css',
array(),
SUPERBADDONS_VERSION
);
// Enhancements
wp_enqueue_style(
'superb-addons-editor-enhancements',
SUPERBADDONS_ASSETS_PATH . '/css/editor-enhancements.min.css',
array(),
SUPERBADDONS_VERSION
);
// Patterns
$this->EnqueuePatternAssets();
$this->EnqueueVariableFallbacks();
}
}
public function EnqueueBlockEditorAssets()
{
self::AddonsLibrary();
self::EditorEnhancements();
$this->EnqueuePatternAssets();
wp_enqueue_script(
'superb-addons-gutenberg-library',
SUPERBADDONS_ASSETS_PATH . '/js/gutenberg/pattern-library.js',
array("jquery", "wp-plugins", "wp-hooks", "wp-data", "wp-element", "wp-i18n", "wp-components", "wp-compose", "wp-blocks", "wp-editor"),
SUPERBADDONS_VERSION,
true
);
ScriptTranslations::Set('superb-addons-gutenberg-library');
wp_localize_script('superb-addons-gutenberg-library', 'superblayoutlibrary_g', array(
"style_placeholder" => esc_html__('All themes', "superb-blocks"),
"category_placeholder" => esc_html__('All categories', "superb-blocks"),
"snacks" => array(
"settings_save_message" => esc_html__("Settings saved successfully.", "superb-blocks"),
"settings_save_error" => esc_html__("Something went wrong while attempting to save your settings. Please try again or contact support if the problem persists.", "superb-blocks"),
"insert_error" => esc_html__('Something went wrong while attempting to insert this element. Please try again or contact support if the problem persists.', "superb-blocks"),
"list_error" => esc_html__('Something went wrong while attempting to list elements. Please try again or contact support if the problem persists.', "superb-blocks")
),
"menu_items" => self::GetGutenbergLibraryMenuItems(),
"rest" => array(
"base" => \get_rest_url(),
"namespace" => RestController::NAMESPACE,
"nonce" => wp_create_nonce("wp_rest")
),
"addons_link_id" => AdminLinkUtil::GetLinkID()
));
wp_enqueue_style(
'superb-addons-elements',
SUPERBADDONS_ASSETS_PATH . '/css/framework.min.css',
array(),
SUPERBADDONS_VERSION
);
wp_enqueue_style(
'superb-addons-font-manrope',
SUPERBADDONS_ASSETS_PATH . '/fonts/manrope/manrope.css',
array(),
SUPERBADDONS_VERSION
);
wp_enqueue_style(
'superb-gutenberg-editor-layout-library',
SUPERBADDONS_ASSETS_PATH . '/css/layout-library-editor.min.css',
array(),
SUPERBADDONS_VERSION
);
wp_enqueue_style(
'superb-gutenberg-layout-library',
SUPERBADDONS_ASSETS_PATH . '/css/layout-library-preview.min.css',
array(),
SUPERBADDONS_VERSION
);
wp_enqueue_style(
'superbaddons-js-snackbar',
SUPERBADDONS_ASSETS_PATH . '/lib/js-snackbar.min.css',
array(),
SUPERBADDONS_VERSION
);
wp_enqueue_script('superb-addons-select2', SUPERBADDONS_ASSETS_PATH . '/lib/select2.min.js', array('jquery'), SUPERBADDONS_VERSION, true);
wp_enqueue_style(
'superbaddons-select2',
SUPERBADDONS_ASSETS_PATH . '/lib/select2.min.css',
array(),
SUPERBADDONS_VERSION
);
wp_enqueue_script(
'superbaddons-animated-heading',
SUPERBADDONS_ASSETS_PATH . '/js/dynamic-blocks/animated-heading.js',
[],
SUPERBADDONS_VERSION,
true
);
// Enhancements
wp_enqueue_style(
'superb-addons-editor-enhancements',
SUPERBADDONS_ASSETS_PATH . '/css/editor-enhancements.min.css',
array(),
SUPERBADDONS_VERSION
);
/// Compatibility
if (SettingsController::IsCompatibilitySettingRelevantAndEnabled(CompatibilitySettingsOptionKey::SPECTRA_BLOCK_SPACING)) {
wp_enqueue_script(
'superb-addons-block-spacing-compatibility-fix',
SUPERBADDONS_ASSETS_PATH . '/js/compatibility/block-spacing.js',
array('jquery'),
SUPERBADDONS_VERSION,
true
);
}
}
public function RegisterBlockCategory($block_categories, $block_editor_context)
{
return array_merge(
array(
array(
'slug' => 'superb-addons-blocks',
'title' => __('Superb Addons', "superb-blocks"),
),
),
$block_categories
);
}
public function RegisterBlocksAndStyles()
{
foreach (self::BLOCKS as $block) {
if (isset($block['args'][self::PATTERN_BLOCK_ARG])) {
$block['args']['category'] = 'superb-addons-blocks-patterns';
unset($block['args'][self::PATTERN_BLOCK_ARG]);
}
register_block_type(SUPERBADDONS_PLUGIN_DIR . 'blocks/' . $block['path'], $block['args']);
}
wp_register_style(self::VARIABLE_FALLBACKS_HANDLE, false, array(), SUPERBADDONS_VERSION);
wp_register_style(
'superb-addons-patterns',
SUPERBADDONS_ASSETS_PATH . '/css/patterns.min.css',
array(),
SUPERBADDONS_VERSION
);
}
private static function EditorEnhancements()
{
add_action('admin_footer', function () {
AllowedTemplateHTMLUtil::enable_safe_styles();
ob_start();
include(SUPERBADDONS_PLUGIN_DIR . 'src/gutenberg/templates/block-quick-options.php');
$template = ob_get_clean();
echo '';
AllowedTemplateHTMLUtil::disable_safe_styles();
});
}
public static function AddonsLibrary()
{
add_action('admin_footer', function () {
AllowedTemplateHTMLUtil::enable_safe_styles();
///// Buttons
ob_start();
include(SUPERBADDONS_PLUGIN_DIR . 'src/gutenberg/templates/library-button.php');
$template = ob_get_clean();
echo '';
//
ob_start();
include(SUPERBADDONS_PLUGIN_DIR . 'src/gutenberg/templates/pattern-tab-library-button.php');
$template = ob_get_clean();
echo '';
//
ob_start();
include(SUPERBADDONS_PLUGIN_DIR . 'src/gutenberg/templates/appender-button.php');
$template = ob_get_clean();
echo '';
AllowedTemplateHTMLUtil::disable_safe_styles();
////// Library
LibraryController::InsertTemplatesWithWrapper();
});
}
public static function GutenbergDataImportAction($data)
{
if (!isset($data['content'])) {
return $data;
}
$options_controller = new OptionController();
$preferred_domain = $options_controller->GetPreferredDomain();
// Proxy is preferred if domain starts with https://superbthemes.com
$is_proxy_preferred = strpos($preferred_domain, 'https://superbthemes.com') === 0;
$content = $data['content'];
$content = preg_replace_callback("/(http)?s?:?(\/\/[^\"']*\.(?:png|jpg|jpeg|gif|png|webp))/", function ($matches) use ($preferred_domain, $is_proxy_preferred) {
// Get the URL
$url = $matches[0];
if ($is_proxy_preferred) {
$url = $preferred_domain . "image-library/theme-designer-images?path=" . $url;
}
$basename = pathinfo($url, PATHINFO_BASENAME);
$title = sanitize_title($basename);
// Check if attachment exists based on the file slug
$posts = get_posts(
array(
'post_type' => 'attachment',
'title' => $title,
'numberposts' => 1,
)
);
if (!empty($posts)) {
// Return existing attachment URL
$attachment = $posts[0];
return wp_get_attachment_image_url($attachment->ID, 'full');
}
if (!function_exists('media_sideload_image')) {
require_once(ABSPATH . 'wp-admin/includes/image.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/media.php');
}
// Create new attachment
$attachment_id = \media_sideload_image($url, 0, $title, 'id');
if (is_wp_error($attachment_id) || !is_numeric($attachment_id)) {
// Return original URL if any error occurred
return $url;
}
// Return new attachment URL
return wp_get_attachment_image_url($attachment_id, 'full');
}, $content);
$data['content'] = $content;
return $data;
}
}