├── .compressignore ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .mocharc.json ├── .phpcs.xml ├── .stylelintrc.json ├── README.md ├── admin ├── class-ultimate-blocks-admin.php ├── class-ultimate-blocks-help.php ├── css │ ├── src │ │ ├── base │ │ │ ├── _colors.scss │ │ │ ├── _common.scss │ │ │ └── themes │ │ │ │ └── _admin-menu-theme.scss │ │ ├── inc │ │ │ ├── block-control-card.scss │ │ │ ├── blocks-content-styles.scss │ │ │ ├── box-content.scss │ │ │ ├── button-link.scss │ │ │ ├── controls-container.scss │ │ │ ├── extension-control-card.scss │ │ │ ├── extensions-content-styles.scss │ │ │ ├── navigation.scss │ │ │ ├── screen-center-mark.scss │ │ │ └── welcome-content-styles.scss │ │ └── ub-admin-settings.scss │ ├── ultimate-blocks-admin.css │ └── ultimate-blocks-help.css ├── data │ ├── Block_Menu_Info_Data.php │ ├── Settings_Menu_Content_Data.php │ ├── Settings_Menu_Pro_Manager_Asset_Data.php │ ├── block_demos │ │ ├── Block_Demos_Data.php │ │ └── block-demos.json │ └── savedStyles.ubdata ├── images │ ├── banners │ │ ├── banner-772x250.png │ │ ├── help-bg.png │ │ └── ultimate_blocks_logo.png │ └── logos │ │ ├── icon-128x128.png │ │ ├── menu-icon-colored.svg │ │ └── menu-icon.svg ├── index.php ├── js │ ├── src │ │ ├── components │ │ │ ├── ActiveFilterIndicator.js │ │ │ ├── AdminMenuWrapper.js │ │ │ ├── Animation.js │ │ │ ├── AnimationAppear.js │ │ │ ├── AssetProvider.js │ │ │ ├── BlockCardProInfoControl.js │ │ │ ├── BlockControlCard.js │ │ │ ├── BlockControlsContainer.js │ │ │ ├── BlockStatusFilterControl.js │ │ │ ├── BoxContent │ │ │ │ ├── BoxContent.js │ │ │ │ ├── BoxContentInc.js │ │ │ │ ├── BoxContentProvider.js │ │ │ │ └── BoxContentTitle.js │ │ │ ├── ButtonLink.js │ │ │ ├── ButtonLinkGroup.js │ │ │ ├── Content.js │ │ │ ├── ContentPhrase.js │ │ │ ├── ExtensionCardProInfoControl.js │ │ │ ├── ExtensionControlCard.js │ │ │ ├── ExtensionsControlContainer.js │ │ │ ├── FilterControlItem.js │ │ │ ├── HamburgerMenu.js │ │ │ ├── HeaderVersionInfo.js │ │ │ ├── LineWrapper.js │ │ │ ├── LocalStorageProvider.js │ │ │ ├── MainContentPhrase.js │ │ │ ├── MenuButton.js │ │ │ ├── MenuContext.js │ │ │ ├── MenuHeader.js │ │ │ ├── Navigation.js │ │ │ ├── NavigationHeaderButton.js │ │ │ ├── Portal.js │ │ │ ├── ProBlockCardTitle.js │ │ │ ├── ProContent.js │ │ │ ├── ProExtensionCardTitle.js │ │ │ ├── ProFilter.js │ │ │ ├── RightContainerItem.js │ │ │ ├── Router.js │ │ │ ├── RouterProvider.js │ │ │ ├── ScreenCenterMarks.js │ │ │ ├── TextIndicate.js │ │ │ ├── ToggleControl.js │ │ │ ├── UpgradeBoxContent.js │ │ │ ├── UpsellModalSettingsMenu.js │ │ │ ├── VersionControl.js │ │ │ ├── VersionControlPopup.js │ │ │ ├── VisibilityWrapper.js │ │ │ └── YouTubeEmbed.js │ │ ├── containers │ │ │ ├── AdminMenuContainer.js │ │ │ ├── BlocksContent.js │ │ │ ├── ExtensionsContent.js │ │ │ ├── MainContent.js │ │ │ └── WelcomeContent.js │ │ ├── hoc │ │ │ ├── withIcon.js │ │ │ └── withStore.js │ │ ├── inc │ │ │ ├── Route.js │ │ │ ├── err │ │ │ │ ├── ButtonLinkNoUrlError.js │ │ │ │ ├── ContentNotFoundError.js │ │ │ │ └── NoRouterComponentFoundError.js │ │ │ └── routes.js │ │ ├── stores │ │ │ └── settings-menu │ │ │ │ ├── actions.js │ │ │ │ ├── initialState.js │ │ │ │ ├── settingsMenuStore.js │ │ │ │ └── slices │ │ │ │ ├── app.js │ │ │ │ ├── assets.js │ │ │ │ ├── blocks.js │ │ │ │ ├── extension.js │ │ │ │ ├── pluginStatus.js │ │ │ │ └── versionControl.js │ │ └── ub-admin-settings.js │ ├── ultimate-blocks-admin.js │ └── ultimate-blocks-help.js ├── partials │ └── ultimate-blocks-admin-display.php └── templates │ ├── help │ └── help-page.php │ └── menus │ └── main-menu.php ├── babel.config.js ├── composer.json ├── composer.lock ├── dist ├── .gitinclude └── deactivator.build.js ├── includes ├── Admin_Notices_Manager.php ├── Editor_Data_Manager.php ├── Env_Manager.php ├── Saved_Styles_Manager.php ├── Static_Styles_Manager.php ├── Ultimate_Blocks_Version_Control.php ├── Version_Control_Upgrader_Skin.php ├── Version_Sync_Manager.php ├── class-ultimate-blocks-activator.php ├── class-ultimate-blocks-category.php ├── class-ultimate-blocks-constants.php ├── class-ultimate-blocks-deactivator.php ├── class-ultimate-blocks-i18n.php ├── class-ultimate-blocks-loader.php ├── class-ultimate-blocks-util.php ├── class-ultimate-blocks.php ├── common │ ├── base │ │ └── Version_Sync_Base.php │ ├── factory │ │ └── Rest_Response_Factory.php │ ├── interfaces │ │ └── I_Plugin_Data.php │ └── traits │ │ ├── Ajax_Response_Trait.php │ │ ├── Manager_Base_Trait.php │ │ └── Singleton_Trait.php ├── index.php ├── managers │ ├── Render_Assistant.php │ └── Ub_Fs_Handler.php ├── pro_manager │ ├── Pro_Manager.php │ ├── assets │ │ └── img │ │ │ ├── advanced-video │ │ │ └── channelDetails.png │ │ │ ├── animation │ │ │ └── animation.png │ │ │ ├── button │ │ │ └── transitionAnimation.gif │ │ │ ├── buttons │ │ │ └── transitionAnimation.gif │ │ │ ├── common │ │ │ └── savedStylesMain.png │ │ │ ├── content-toggle-block │ │ │ ├── highlightColor.png │ │ │ ├── search.png │ │ │ └── searchSummary.png │ │ │ ├── content-toggle-panel-block │ │ │ ├── highlightColor.png │ │ │ ├── search.png │ │ │ └── searchSummary.png │ │ │ ├── divider │ │ │ └── icon.png │ │ │ ├── expand │ │ │ ├── buttonStyle.png │ │ │ └── fade.png │ │ │ ├── image-slider │ │ │ └── thumbnails.png │ │ │ ├── post-grid │ │ │ ├── pagination.png │ │ │ └── postType.gif │ │ │ ├── review │ │ │ ├── prosCons.png │ │ │ └── prosConsGraphLayout.png │ │ │ ├── single-button │ │ │ └── transitionAnimation.gif │ │ │ ├── tabbed-content-block │ │ │ ├── callToAction.png │ │ │ ├── titleIcon.png │ │ │ └── titleSecondaryText.png │ │ │ ├── table-of-contents-block │ │ │ ├── icon.png │ │ │ └── stickyTOC.gif │ │ │ └── visibility-control │ │ │ └── visibilityControl.png │ ├── base │ │ ├── All_Blocks_Pro_Extension_Upsell.php │ │ ├── Pro_Block_Upsell.php │ │ └── Pro_Extension_Upsell.php │ ├── blocks │ │ ├── coupon │ │ │ ├── Coupon_Pro_Block.php │ │ │ ├── assets │ │ │ │ └── coupon-ss.png │ │ │ └── icon.php │ │ └── timeline │ │ │ ├── Timeline_Pro_Block.php │ │ │ ├── assets │ │ │ └── timeline-ss.png │ │ │ └── icon.php │ ├── extensions │ │ ├── Advanced_Video_Extension.php │ │ ├── Animation_Extension.php │ │ ├── Button_Extension.php │ │ ├── Buttons_Extension.php │ │ ├── Content_Toggle_Extension.php │ │ ├── Divider_Extension.php │ │ ├── Expand_Extension.php │ │ ├── Image_Slider_Extension.php │ │ ├── Post_Grid_Extension.php │ │ ├── Review_Extension.php │ │ ├── Saved_Styles_Common.php │ │ ├── Single_Button_Extension.php │ │ ├── Social_Share_Extension.php │ │ ├── Tabbed_Content_Extension.php │ │ ├── Table_Of_Contents_Extension.php │ │ └── Visibility_Control_Extension.php │ └── inc │ │ └── Pro_Editor_Control_Data.php ├── svg_sanitizer │ ├── DomDocumentLoadHtmlException.php │ ├── SvgSanitizeInvalidRootElement.php │ └── Svg_Sanitizer.php └── ultimate-blocks-styles-css-generator.php ├── languages └── ultimate-blocks.pot ├── library ├── freemius │ ├── LICENSE.txt │ ├── README.md │ ├── assets │ │ ├── css │ │ │ ├── admin │ │ │ │ ├── account.css │ │ │ │ ├── add-ons.css │ │ │ │ ├── affiliation.css │ │ │ │ ├── checkout.css │ │ │ │ ├── clone-resolution.css │ │ │ │ ├── common.css │ │ │ │ ├── connect.css │ │ │ │ ├── debug.css │ │ │ │ ├── dialog-boxes.css │ │ │ │ ├── gdpr-optin-notice.css │ │ │ │ ├── index.php │ │ │ │ ├── optout.css │ │ │ │ └── plugins.css │ │ │ ├── customizer.css │ │ │ └── index.php │ │ ├── img │ │ │ ├── index.php │ │ │ ├── plugin-icon.png │ │ │ └── theme-icon.png │ │ ├── index.php │ │ └── js │ │ │ ├── index.php │ │ │ ├── nojquery.ba-postmessage.js │ │ │ └── postmessage.js │ ├── config.php │ ├── includes │ │ ├── class-freemius-abstract.php │ │ ├── class-freemius.php │ │ ├── class-fs-admin-notices.php │ │ ├── class-fs-api.php │ │ ├── class-fs-garbage-collector.php │ │ ├── class-fs-lock.php │ │ ├── class-fs-logger.php │ │ ├── class-fs-options.php │ │ ├── class-fs-plugin-updater.php │ │ ├── class-fs-security.php │ │ ├── class-fs-storage.php │ │ ├── class-fs-user-lock.php │ │ ├── customizer │ │ │ ├── class-fs-customizer-support-section.php │ │ │ ├── class-fs-customizer-upsell-control.php │ │ │ └── index.php │ │ ├── debug │ │ │ ├── class-fs-debug-bar-panel.php │ │ │ ├── debug-bar-start.php │ │ │ └── index.php │ │ ├── entities │ │ │ ├── class-fs-affiliate-terms.php │ │ │ ├── class-fs-affiliate.php │ │ │ ├── class-fs-billing.php │ │ │ ├── class-fs-entity.php │ │ │ ├── class-fs-payment.php │ │ │ ├── class-fs-plugin-info.php │ │ │ ├── class-fs-plugin-license.php │ │ │ ├── class-fs-plugin-plan.php │ │ │ ├── class-fs-plugin-tag.php │ │ │ ├── class-fs-plugin.php │ │ │ ├── class-fs-pricing.php │ │ │ ├── class-fs-scope-entity.php │ │ │ ├── class-fs-site.php │ │ │ ├── class-fs-subscription.php │ │ │ ├── class-fs-user.php │ │ │ └── index.php │ │ ├── fs-core-functions.php │ │ ├── fs-essential-functions.php │ │ ├── fs-html-escaping-functions.php │ │ ├── fs-plugin-info-dialog.php │ │ ├── index.php │ │ ├── l10n.php │ │ ├── managers │ │ │ ├── class-fs-admin-menu-manager.php │ │ │ ├── class-fs-admin-notice-manager.php │ │ │ ├── class-fs-cache-manager.php │ │ │ ├── class-fs-clone-manager.php │ │ │ ├── class-fs-gdpr-manager.php │ │ │ ├── class-fs-key-value-storage.php │ │ │ ├── class-fs-license-manager.php │ │ │ ├── class-fs-option-manager.php │ │ │ ├── class-fs-permission-manager.php │ │ │ ├── class-fs-plan-manager.php │ │ │ ├── class-fs-plugin-manager.php │ │ │ └── index.php │ │ ├── sdk │ │ │ ├── Exceptions │ │ │ │ ├── ArgumentNotExistException.php │ │ │ │ ├── EmptyArgumentException.php │ │ │ │ ├── Exception.php │ │ │ │ ├── InvalidArgumentException.php │ │ │ │ ├── OAuthException.php │ │ │ │ └── index.php │ │ │ ├── FreemiusBase.php │ │ │ ├── FreemiusWordPress.php │ │ │ ├── LICENSE.txt │ │ │ └── index.php │ │ └── supplements │ │ │ ├── fs-essential-functions-1.1.7.1.php │ │ │ ├── fs-essential-functions-2.2.1.php │ │ │ ├── fs-migration-2.5.1.php │ │ │ └── index.php │ ├── index.php │ ├── languages │ │ ├── freemius-cs_CZ.mo │ │ ├── freemius-da_DK.mo │ │ ├── freemius-de_DE.mo │ │ ├── freemius-es_ES.mo │ │ ├── freemius-fr_FR.mo │ │ ├── freemius-he_IL.mo │ │ ├── freemius-hu_HU.mo │ │ ├── freemius-it_IT.mo │ │ ├── freemius-ja.mo │ │ ├── freemius-nl_NL.mo │ │ ├── freemius-ru_RU.mo │ │ ├── freemius-ta.mo │ │ ├── freemius-zh_CN.mo │ │ ├── freemius.pot │ │ └── index.php │ ├── require.php │ ├── start.php │ └── templates │ │ ├── account.php │ │ ├── account │ │ ├── billing.php │ │ ├── index.php │ │ ├── partials │ │ │ ├── activate-license-button.php │ │ │ ├── addon.php │ │ │ ├── deactivate-license-button.php │ │ │ ├── disconnect-button.php │ │ │ ├── index.php │ │ │ └── site.php │ │ └── payments.php │ │ ├── add-ons.php │ │ ├── add-trial-to-pricing.php │ │ ├── admin-notice.php │ │ ├── ajax-loader.php │ │ ├── api-connectivity-message-js.php │ │ ├── auto-installation.php │ │ ├── checkout.php │ │ ├── clone-resolution-js.php │ │ ├── connect.php │ │ ├── connect │ │ ├── index.php │ │ ├── permission.php │ │ └── permissions-group.php │ │ ├── contact.php │ │ ├── debug.php │ │ ├── debug │ │ ├── api-calls.php │ │ ├── index.php │ │ ├── logger.php │ │ ├── plugins-themes-sync.php │ │ └── scheduled-crons.php │ │ ├── email.php │ │ ├── forms │ │ ├── affiliation.php │ │ ├── data-debug-mode.php │ │ ├── deactivation │ │ │ ├── contact.php │ │ │ ├── form.php │ │ │ ├── index.php │ │ │ └── retry-skip.php │ │ ├── email-address-update.php │ │ ├── index.php │ │ ├── license-activation.php │ │ ├── optout.php │ │ ├── premium-versions-upgrade-handler.php │ │ ├── premium-versions-upgrade-metadata.php │ │ ├── resend-key.php │ │ ├── subscription-cancellation.php │ │ ├── trial-start.php │ │ └── user-change.php │ │ ├── gdpr-optin-js.php │ │ ├── index.php │ │ ├── js │ │ ├── index.php │ │ ├── jquery.content-change.php │ │ ├── open-license-activation.php │ │ ├── permissions.php │ │ └── style-premium-theme.php │ │ ├── partials │ │ ├── index.php │ │ └── network-activation.php │ │ ├── plugin-icon.php │ │ ├── plugin-info │ │ ├── description.php │ │ ├── features.php │ │ ├── index.php │ │ └── screenshots.php │ │ ├── powered-by.php │ │ ├── pricing.php │ │ ├── secure-https-header.php │ │ ├── sticky-admin-notice-js.php │ │ ├── tabs-capture-js.php │ │ └── tabs.php └── ub-common │ ├── .Chunks │ └── e2c2858e.js │ ├── Components │ ├── client.css │ ├── client.js │ ├── editor.css │ ├── editor.js │ └── index.js │ ├── Inc │ └── index.js │ └── info.json ├── package-lock.json ├── package.json ├── phpunit.xml ├── pluginCompress.js ├── public ├── class-ultimate-blocks-public.php ├── css │ └── ultimate-blocks-public.css ├── index.php ├── js │ └── ultimate-blocks-public.js └── partials │ └── ultimate-blocks-public-display.php ├── readme.txt ├── recompile.js ├── recompileOnChange.js ├── src ├── __development │ ├── components │ │ ├── ActivateBlockOnStartup.js │ │ └── DevelopmentComponent.js │ └── webpack │ │ └── plugin │ │ └── DevelopmentComponentIgnorePlugin.js ├── blocks.js ├── blocks │ ├── advanced-heading │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── components.js │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── fonts.js │ │ ├── formats │ │ │ ├── highlight.js │ │ │ └── register-formats.js │ │ ├── icons.js │ │ ├── settings-options.js │ │ ├── style.css │ │ ├── style.scss │ │ └── transforms.js │ ├── advanced-video │ │ ├── block-controls.js │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── components.js │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── front.build.js │ │ ├── front.js │ │ ├── get-styles.js │ │ ├── icon.js │ │ ├── placeholder.js │ │ ├── style.css │ │ └── style.scss │ ├── button │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── components.js │ │ ├── components │ │ │ ├── ButtonColorSettings.js │ │ │ └── UpsellInspectorDummy.js │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── front.build.js │ │ ├── front.js │ │ ├── icons │ │ │ └── icons.js │ │ ├── oldVersions.js │ │ ├── style.css │ │ └── style.scss │ ├── call-to-action │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── components.js │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── get-styles.js │ │ ├── icons │ │ │ └── icon.js │ │ ├── oldVersions.js │ │ ├── style.css │ │ └── style.scss │ ├── click-to-tweet │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── get-styles.js │ │ ├── icons │ │ │ ├── icon.js │ │ │ └── sprite-twitter.png │ │ ├── style.css │ │ └── style.scss │ ├── components │ │ ├── BorderControl.js │ │ ├── BorderRadiusControl.js │ │ ├── ColorSettings.js │ │ ├── ColorSettingsWithGradient.js │ │ ├── FontAppearanceControl.js │ │ ├── FontFamilyControl.js │ │ ├── FontSizePicker.js │ │ ├── LetterSpacingControl.js │ │ ├── LineHeightControl.js │ │ ├── SelectControl.js │ │ ├── SpacingControl.js │ │ ├── SpacingControlWithToolsPanel.js │ │ ├── TabsPanelControl.js │ │ ├── TextDecorationControl.js │ │ ├── ToggleGroupControl.js │ │ └── index.js │ ├── content-filter │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── components │ │ │ ├── block.json │ │ │ ├── content-filter-entry.js │ │ │ ├── editorDisplay.js │ │ │ └── get-styles.js │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── front.build.js │ │ ├── front.js │ │ ├── icon.js │ │ ├── style.css │ │ └── style.scss │ ├── content-toggle │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── components │ │ │ ├── editorDisplay.js │ │ │ ├── inspector.js │ │ │ ├── panel.js │ │ │ └── panel │ │ │ │ └── block.json │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── front.build.js │ │ ├── front.js │ │ ├── get-styles.js │ │ ├── icons │ │ │ ├── icon.js │ │ │ └── icons.json │ │ ├── oldVersions.js │ │ ├── style.css │ │ └── style.scss │ ├── countdown │ │ ├── CircularCountdown.js │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── blocks-styles.js │ │ ├── components.js │ │ ├── front.build.js │ │ ├── front.js │ │ ├── get-styles.js │ │ ├── icon.js │ │ ├── odometer.js │ │ ├── style.css │ │ └── style.scss │ ├── counter │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── edit.js │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── front.build.js │ │ ├── front.js │ │ ├── get-styles.js │ │ ├── hooks │ │ │ └── use-counter.js │ │ ├── icon.js │ │ ├── inspector.js │ │ ├── style.css │ │ └── style.scss │ ├── divider │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── get-styles.js │ │ ├── icons │ │ │ └── icon.js │ │ ├── oldVersions.js │ │ ├── style.css │ │ └── style.scss │ ├── expand │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── components.js │ │ ├── expand-portion │ │ │ └── block.json │ │ ├── front.build.js │ │ ├── front.js │ │ ├── get-styles.js │ │ ├── icon.js │ │ ├── style.css │ │ └── style.scss │ ├── feature-box │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── components.js │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── icons │ │ │ ├── icon.js │ │ │ └── remove_icon.js │ │ ├── oldVersions.js │ │ ├── style.css │ │ └── style.scss │ ├── how-to │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── components.js │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── get-styles.js │ │ ├── icon.js │ │ ├── style.css │ │ └── style.scss │ ├── icon-inner │ │ ├── block.js │ │ ├── block.php │ │ ├── components │ │ │ ├── UbIcon.js │ │ │ └── UbIconInspector.js │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── inc │ │ │ └── iconOperations.js │ │ ├── style.css │ │ └── style.scss │ ├── icon │ │ ├── block-controls.js │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── blocks-styles.js │ │ ├── components │ │ │ ├── CustomSvgInserter.js │ │ │ ├── LinkControl.js │ │ │ ├── MediaReplaceControl.js │ │ │ ├── Placeholder.js │ │ │ └── icon-library │ │ │ │ ├── LibraryContent.js │ │ │ │ ├── LibrarySidebar.js │ │ │ │ └── index.js │ │ ├── edit.js │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── get-styles.js │ │ ├── icons │ │ │ ├── block-icon.js │ │ │ ├── font-awesome │ │ │ │ ├── categories.js │ │ │ │ ├── icons.js │ │ │ │ └── index.js │ │ │ ├── index.js │ │ │ └── wordpress │ │ │ │ ├── social │ │ │ │ ├── amazon.js │ │ │ │ ├── bandcamp.js │ │ │ │ ├── behance.js │ │ │ │ ├── chain.js │ │ │ │ ├── codepen.js │ │ │ │ ├── deviantart.js │ │ │ │ ├── dribbble.js │ │ │ │ ├── dropbox.js │ │ │ │ ├── etsy.js │ │ │ │ ├── facebook.js │ │ │ │ ├── feed.js │ │ │ │ ├── fivehundredpx.js │ │ │ │ ├── flickr.js │ │ │ │ ├── foursquare.js │ │ │ │ ├── github.js │ │ │ │ ├── goodreads.js │ │ │ │ ├── google.js │ │ │ │ ├── index.js │ │ │ │ ├── instagram.js │ │ │ │ ├── lastfm.js │ │ │ │ ├── linkedin.js │ │ │ │ ├── mail.js │ │ │ │ ├── mastodon.js │ │ │ │ ├── medium.js │ │ │ │ ├── meetup.js │ │ │ │ ├── patreon.js │ │ │ │ ├── pinterest.js │ │ │ │ ├── pocket.js │ │ │ │ ├── reddit-solid.js │ │ │ │ ├── reddit.js │ │ │ │ ├── skype.js │ │ │ │ ├── snapchat.js │ │ │ │ ├── soundcloud.js │ │ │ │ ├── spotify.js │ │ │ │ ├── telegram.js │ │ │ │ ├── tiktok.js │ │ │ │ ├── tumblr.js │ │ │ │ ├── twitch.js │ │ │ │ ├── twitter.js │ │ │ │ ├── vimeo.js │ │ │ │ ├── vk.js │ │ │ │ ├── wordpress.js │ │ │ │ ├── yelp.js │ │ │ │ └── youtube.js │ │ │ │ └── temp.js │ │ ├── inspector.js │ │ ├── save.js │ │ ├── style.css │ │ ├── style.scss │ │ └── utils.js │ ├── image-slider │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── components.js │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── front.build.js │ │ ├── front.js │ │ ├── get-styles.js │ │ ├── icon.js │ │ ├── oldVersions.js │ │ ├── style.css │ │ ├── style.scss │ │ └── swiper-bundle.js │ ├── notification-box │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── components.js │ │ ├── icons │ │ │ ├── icon.js │ │ │ ├── info.js │ │ │ ├── success.js │ │ │ └── warning.js │ │ ├── oldVersions.js │ │ ├── style.css │ │ └── style.scss │ ├── number-box │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── components.js │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── icons │ │ │ └── icon.js │ │ ├── oldVersions.js │ │ ├── style.css │ │ └── style.scss │ ├── post-grid │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── editor.css │ │ ├── editor.js │ │ ├── editor.scss │ │ ├── icons.js │ │ ├── image.js │ │ ├── inspector.js │ │ ├── style.css │ │ └── style.scss │ ├── progress-bar │ │ ├── Circle.js │ │ ├── HalfCircle.js │ │ ├── Line.js │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── blocks-styles.js │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── front.build.js │ │ ├── front.js │ │ ├── get-styles.js │ │ ├── icons.js │ │ ├── style.css │ │ └── style.scss │ ├── review │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── components.js │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── get-styles.js │ │ ├── icon.js │ │ ├── oldVersions.js │ │ ├── responsive.scss │ │ ├── save.js │ │ ├── style.css │ │ └── style.scss │ ├── scrollby-polyfill.js │ ├── social-share │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── get-styles.js │ │ ├── icons │ │ │ ├── icons.js │ │ │ └── icons.php │ │ ├── inspector.js │ │ ├── style.css │ │ └── style.scss │ ├── star-rating │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── components.js │ │ ├── get-styles.js │ │ ├── icons.js │ │ ├── oldVersions.js │ │ ├── style.css │ │ └── style.scss │ ├── styled-box │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── get-styles.js │ │ ├── icon.js │ │ ├── style.css │ │ ├── style.scss │ │ ├── styled-box-border │ │ │ └── block.json │ │ ├── styled-box-notification │ │ │ └── block.json │ │ ├── styled-box-number │ │ │ └── block.json │ │ └── styled-box-numbered-box-column │ │ │ └── block.json │ ├── styled-list │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── colorlist.js │ │ ├── components.js │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── get-styles.js │ │ ├── icon.js │ │ ├── style-list-item │ │ │ └── block.json │ │ ├── style.css │ │ └── style.scss │ ├── tabbed-content │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── components │ │ │ ├── block.json │ │ │ ├── editorDisplay.js │ │ │ ├── inspector.js │ │ │ └── tab.js │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── front.build.js │ │ ├── front.js │ │ ├── get-style.js │ │ ├── icons │ │ │ └── icon.js │ │ ├── oldVersions.js │ │ ├── style.css │ │ └── style.scss │ ├── table-of-contents │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── components.js │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── front.build.js │ │ ├── front.js │ │ ├── get-style.js │ │ ├── icon.js │ │ ├── languageTables │ │ │ └── cyrillic.json │ │ ├── localToLatin.js │ │ ├── oldVersions.js │ │ ├── removeDiacritics.js │ │ ├── style.css │ │ └── style.scss │ ├── testimonial │ │ ├── block.js │ │ ├── block.json │ │ ├── block.php │ │ ├── components.js │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── get-styles.js │ │ ├── icons.js │ │ ├── oldVersions.js │ │ ├── style.css │ │ └── style.scss │ └── utils │ │ └── styling-helpers.js ├── common.js ├── common.php ├── common.scss ├── defaults.php ├── editor.css ├── editor.scss ├── extensions │ ├── components │ │ ├── code-editor │ │ │ └── index.js │ │ └── index.js │ ├── custom-css │ │ ├── class-custom-css.php │ │ ├── common.scss │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── index.js │ │ ├── inspector.js │ │ ├── style.css │ │ └── style.scss │ ├── extension-manager.php │ ├── index.js │ ├── responsive-control │ │ ├── class-responsive-control.php │ │ ├── common.scss │ │ ├── editor.css │ │ ├── editor.scss │ │ ├── index.js │ │ ├── inspector.js │ │ ├── style.css │ │ └── style.scss │ ├── style.css │ ├── style.scss │ └── utils │ │ ├── index.js │ │ └── replace-selector.js ├── inc │ ├── components │ │ ├── ProPass.js │ │ ├── SavedStyles │ │ │ ├── DefaultItemIndicator.js │ │ │ ├── ListItemPill.js │ │ │ ├── ListItemPreview.js │ │ │ ├── SavedStyleItemCardContainer.js │ │ │ ├── SavedStyleListButtonRow.js │ │ │ ├── SavedStyleListItem.js │ │ │ ├── SavedStylesAdvancedButton.js │ │ │ ├── SavedStylesAdvancedControls.js │ │ │ ├── SavedStylesInspector.js │ │ │ ├── SavedStylesInspectorPanel.js │ │ │ ├── SavedStylesListing.js │ │ │ ├── SavedStylesListingFilter.js │ │ │ ├── SavedStylesSaveRow.js │ │ │ ├── SelectedSavedStyleControls.js │ │ │ ├── StylePreviewModal.js │ │ │ └── UbProInspectorTextInput.js │ │ └── Upsell │ │ │ ├── ActiveBlockIcon.js │ │ │ ├── Controls │ │ │ ├── UpsellButtonGroupControl.js │ │ │ ├── UpsellColorControl.js │ │ │ ├── UpsellControlSelector.js │ │ │ ├── UpsellControlWrapper.js │ │ │ ├── UpsellIconControl.js │ │ │ ├── UpsellSelectControl.js │ │ │ └── UpsellToggleControl.js │ │ │ ├── ModalNavigation.js │ │ │ ├── UpsellInspectorDummy.js │ │ │ ├── UpsellInspectorNotice.js │ │ │ ├── UpsellInspectorPanelBody.js │ │ │ ├── UpsellMain.js │ │ │ ├── UpsellModalBase.js │ │ │ ├── UpsellModalButton.js │ │ │ ├── UpsellModalContent.js │ │ │ ├── UpsellModalEditor.js │ │ │ ├── UpsellProPanel.js │ │ │ └── VitalizeText.js │ ├── helpers │ │ └── modeCheck.js │ ├── hoc │ │ └── withUpsellControlWrapper.js │ ├── managers │ │ ├── ProManager.js │ │ ├── SavedStylesManager.js │ │ └── UpsellManager.js │ └── registerPluginBlock.js ├── init.php ├── pre-register.js ├── priority.js ├── simple_html_dom.php ├── stores │ ├── mainStore │ │ ├── actions.js │ │ ├── hoc │ │ │ └── connectWithMainStore.js │ │ ├── index.js │ │ ├── reducer.js │ │ ├── selectors.js │ │ ├── state.js │ │ └── types.js │ └── savedStyles │ │ ├── actions.js │ │ ├── hoc │ │ └── withBusyStatus.js │ │ ├── index.js │ │ ├── reducer.js │ │ ├── selectors.js │ │ ├── state.js │ │ └── types.js ├── style.css ├── style.scss └── styles │ ├── SavedStyles │ └── SavedStylesEditor.sass │ ├── Upsell │ ├── UpsellControlWrapper.scss │ ├── UpsellEditor.scss │ ├── UpsellInspectorNotice.scss │ ├── UpsellModal.scss │ └── UpsellTheme.scss │ └── base │ ├── __colors.scss │ ├── __common.scss │ └── themes │ ├── __saved-styles-colors.sass │ └── __saved-styles-inspector-theme.scss ├── ultimate-blocks.php ├── vendor ├── autoload.php ├── composer │ ├── ClassLoader.php │ ├── InstalledVersions.php │ ├── LICENSE │ ├── autoload_classmap.php │ ├── autoload_files.php │ ├── autoload_namespaces.php │ ├── autoload_psr4.php │ ├── autoload_real.php │ ├── autoload_static.php │ ├── installed.json │ ├── installed.php │ └── platform_check.php ├── graham-campbell │ └── result-type │ │ ├── LICENSE │ │ ├── composer.json │ │ └── src │ │ ├── Error.php │ │ ├── Result.php │ │ └── Success.php ├── phpoption │ └── phpoption │ │ ├── LICENSE │ │ ├── composer.json │ │ └── src │ │ └── PhpOption │ │ ├── LazyOption.php │ │ ├── None.php │ │ ├── Option.php │ │ └── Some.php ├── symfony │ ├── polyfill-ctype │ │ ├── Ctype.php │ │ ├── LICENSE │ │ ├── README.md │ │ ├── bootstrap.php │ │ ├── bootstrap80.php │ │ └── composer.json │ ├── polyfill-mbstring │ │ ├── LICENSE │ │ ├── Mbstring.php │ │ ├── README.md │ │ ├── Resources │ │ │ └── unidata │ │ │ │ ├── lowerCase.php │ │ │ │ ├── titleCaseRegexp.php │ │ │ │ └── upperCase.php │ │ ├── bootstrap.php │ │ ├── bootstrap80.php │ │ └── composer.json │ └── polyfill-php80 │ │ ├── LICENSE │ │ ├── Php80.php │ │ ├── PhpToken.php │ │ ├── README.md │ │ ├── Resources │ │ └── stubs │ │ │ ├── Attribute.php │ │ │ ├── PhpToken.php │ │ │ ├── Stringable.php │ │ │ ├── UnhandledMatchError.php │ │ │ └── ValueError.php │ │ ├── bootstrap.php │ │ └── composer.json └── vlucas │ └── phpdotenv │ ├── LICENSE │ ├── composer.json │ └── src │ ├── Dotenv.php │ ├── Exception │ ├── ExceptionInterface.php │ ├── InvalidEncodingException.php │ ├── InvalidFileException.php │ ├── InvalidPathException.php │ └── ValidationException.php │ ├── Loader │ ├── Loader.php │ ├── LoaderInterface.php │ └── Resolver.php │ ├── Parser │ ├── Entry.php │ ├── EntryParser.php │ ├── Lexer.php │ ├── Lines.php │ ├── Parser.php │ ├── ParserInterface.php │ └── Value.php │ ├── Repository │ ├── Adapter │ │ ├── AdapterInterface.php │ │ ├── ApacheAdapter.php │ │ ├── ArrayAdapter.php │ │ ├── EnvConstAdapter.php │ │ ├── GuardedWriter.php │ │ ├── ImmutableWriter.php │ │ ├── MultiReader.php │ │ ├── MultiWriter.php │ │ ├── PutenvAdapter.php │ │ ├── ReaderInterface.php │ │ ├── ReplacingWriter.php │ │ ├── ServerConstAdapter.php │ │ └── WriterInterface.php │ ├── AdapterRepository.php │ ├── RepositoryBuilder.php │ └── RepositoryInterface.php │ ├── Store │ ├── File │ │ ├── Paths.php │ │ └── Reader.php │ ├── FileStore.php │ ├── StoreBuilder.php │ ├── StoreInterface.php │ └── StringStore.php │ ├── Util │ ├── Regex.php │ └── Str.php │ └── Validator.php ├── webpack.config.js └── zip └── .gitinclude /.compressignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .vscode/ 3 | node_modules/ 4 | .node_modules/ 5 | .DS_Store 6 | .idea 7 | .swp 8 | .parcel-cache 9 | .env 10 | .nyc_output/ 11 | babel.config.js 12 | package.json 13 | package-lock.json 14 | pluginCompress.js 15 | README.md 16 | recompile.js 17 | recompileOnChange.js 18 | webpack.config.js 19 | composer.json 20 | composer.lock 21 | **/*.scss 22 | **/*.sass 23 | **/*.map 24 | admin/js/src/ 25 | src/__development/ 26 | src/**/!(front.build|swiper-bundle|scrollby-polyfill|tiktok-script).js 27 | vendor/bin/ 28 | __tests__/ 29 | phpunit.xml 30 | zip/ 31 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # This file is for unifying the coding style for different editors and IDEs 2 | # editorconfig.org 3 | 4 | # WordPress Coding Standards 5 | # https://make.wordpress.org/core/handbook/coding-standards/ 6 | 7 | root = true 8 | 9 | [*] 10 | charset = utf-8 11 | end_of_line = lf 12 | insert_final_newline = true 13 | trim_trailing_whitespace = true 14 | indent_style = tab 15 | 16 | [*.yml] 17 | indent_style = space 18 | indent_size = 2 19 | 20 | [*.md] 21 | trim_trailing_whitespace = false 22 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | **/*.min.js 2 | **/*.build.js 3 | **/node_modules/** 4 | **/vendor/** 5 | build 6 | coverage 7 | cypress 8 | node_modules 9 | vendor 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .vscode/ 3 | node_modules/ 4 | .node_modules/ 5 | .DS_Store 6 | .idea 7 | .swp 8 | .parcel-cache 9 | .env 10 | .nyc_output/ 11 | bundle-dist/ 12 | dist/ 13 | zip/ 14 | -------------------------------------------------------------------------------- /.mocharc.json: -------------------------------------------------------------------------------- 1 | { 2 | "recursive": true, 3 | "require": [ 4 | "@babel/register", 5 | "global-jsdom/register", 6 | "./__tests__/js/test-inc/hooks.js" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /.phpcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Ultimate Blocks PHP Coding Standard 4 | 5 | 6 | 7 | 8 | 9 | *\.php$ 10 | 11 | 12 | -------------------------------------------------------------------------------- /.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "stylelint-config-standard-scss" 3 | } 4 | -------------------------------------------------------------------------------- /admin/css/src/base/_colors.scss: -------------------------------------------------------------------------------- 1 | $white: #FFF; 2 | $black: #000; 3 | $wp-gray: #CCC; 4 | $wp-black: #2F2F2F; 5 | $gray-100: #FBFBFB; 6 | $gray-300: #E5E5E5; 7 | $gray-400: #DFDFDF; 8 | $gray-500: #B4A7A7; 9 | $gray-600: #7B6D6D; 10 | $gray-800: #938181; 11 | $red-100: #FFF0F0; 12 | $red-500: #E11B4C; 13 | $yellow-500: #EAB308; 14 | $green-500: #22C55E; 15 | $positive: $green-500; 16 | $negative: $red-500; 17 | $gold: #FFD700; 18 | $logo-color: #F64646; 19 | 20 | // overhaul colors 21 | // gray 22 | $o-gray-50: #FFF3F6; 23 | $neutral-gray-50: #F8FAFC; 24 | $o-gray-200: #E2E8F0; 25 | $o-gray-500: #64748B; 26 | 27 | // blue 28 | $o-blue-100: #BBCAF3; 29 | $o-blue-300: #6183E4; 30 | $o-blue-500: #1D4ED8; 31 | 32 | 33 | -------------------------------------------------------------------------------- /admin/css/src/inc/blocks-content-styles.scss: -------------------------------------------------------------------------------- 1 | 2 | .ub-blocks-content { 3 | width: 100%; 4 | display: flex; 5 | align-items: flex-start; 6 | flex-flow: column wrap; 7 | gap: 36px; 8 | } 9 | -------------------------------------------------------------------------------- /admin/css/src/inc/controls-container.scss: -------------------------------------------------------------------------------- 1 | @import '../base/common'; 2 | @import '../base/themes/admin-menu-theme'; 3 | 4 | .controls-container { 5 | display: flex; 6 | justify-content: center; 7 | align-items: flex-start; 8 | flex-wrap: wrap; 9 | width: 100%; 10 | height: fit-content; 11 | gap: 28px 32px; 12 | 13 | 14 | &[data-show-info="false"] .block-control { 15 | & > div:not(.block-title) { 16 | display: none; 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /admin/css/src/inc/extensions-content-styles.scss: -------------------------------------------------------------------------------- 1 | @import "../base/themes/admin-menu-theme"; 2 | @import "../base/common"; 3 | 4 | .ub-extensions-content { 5 | @extend %size-full; 6 | 7 | display: flex; 8 | flex-direction: column; 9 | gap: 36px; 10 | } 11 | -------------------------------------------------------------------------------- /admin/css/src/inc/navigation.scss: -------------------------------------------------------------------------------- 1 | @import "../base/common"; 2 | @import "../base/themes/admin-menu-theme"; 3 | 4 | .ub-menu-navigation { 5 | height: 100%; 6 | display: grid; 7 | grid-template-rows: 1fr; 8 | grid-template-columns: minmax(0, 1fr); 9 | grid-gap: 10px; 10 | background-color: $white; 11 | 12 | .ub-menu-navigation-header-button { 13 | @extend %default-transition; 14 | @extend %flex-center-all; 15 | @extend %pointer; 16 | @extend %size-full; 17 | 18 | padding: 0 10px; 19 | border: solid rgb(0 0 0 / 0%); 20 | border-width: 0 0 2px; 21 | 22 | @include screen-max($screen-xl) { 23 | padding: 0 10px; 24 | } 25 | 26 | &[data-active="true"] { 27 | border-color: $red-500; 28 | } 29 | 30 | &[data-active="false"] { 31 | color: $text-faded-color; 32 | } 33 | 34 | &:hover[data-active="false"] { 35 | border-color: $border-color; 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /admin/css/src/inc/screen-center-mark.scss: -------------------------------------------------------------------------------- 1 | .ub-screen-center { 2 | padding: 0 !important; 3 | 4 | .ub-screen-center-vertical { 5 | position: absolute; 6 | top: 0; 7 | width: 50%; 8 | height: 100%; 9 | border-right: 1px solid red; 10 | z-index: 10000; 11 | padding: 0 !important; 12 | } 13 | 14 | .ub-screen-center-horizontal { 15 | position: absolute; 16 | bottom: 0; 17 | width: 100%; 18 | height: 50%; 19 | border-top: 1px solid red; 20 | z-index: 10000; 21 | padding: 0 !important; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /admin/css/src/inc/welcome-content-styles.scss: -------------------------------------------------------------------------------- 1 | @import "../base/common"; 2 | 3 | .ub-welcome-content { 4 | display: flex; 5 | align-items: flex-start; 6 | gap: 32px; 7 | 8 | &__main { 9 | flex-basis: 70%; 10 | display: grid; 11 | grid-template-columns: 1fr; 12 | grid-template-rows: auto; 13 | grid-auto-rows: auto; 14 | grid-gap: 24px; 15 | } 16 | 17 | &__right-sidebar { 18 | flex-basis: 30%; 19 | display: grid; 20 | grid-template-columns: 1fr; 21 | grid-template-rows: auto; 22 | grid-auto-rows: auto; 23 | grid-gap: 24px; 24 | } 25 | 26 | @include screen-max($screen-sm){ 27 | &__right-sidebar { 28 | flex-flow: column nowrap !important; 29 | } 30 | } 31 | 32 | @include screen-max($screen-md2) { 33 | flex-flow: row wrap; 34 | 35 | &__main { 36 | flex-basis: 100%; 37 | 38 | } 39 | 40 | &__right-sidebar { 41 | flex-basis: 100%; 42 | display: flex; 43 | flex-flow: column nowrap !important; 44 | justify-content: center; 45 | gap: 10px; 46 | 47 | & > div { 48 | flex-basis: 40%; 49 | } 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /admin/data/Settings_Menu_Pro_Manager_Asset_Data.php: -------------------------------------------------------------------------------- 1 | 'https://ultimateblocks.com/pricing/', 25 | 'youtubeVideoId' => 'I1LEsUvxGDc', 26 | 'documentsUrl' => 'https://ultimateblocks.com/docs/', 27 | 'supportUrl' => 'https://ultimateblocks.com/community/', 28 | 'facebookUrl' => 'https://www.facebook.com/UltimateBlocks', 29 | 'twitterUrl' => 'https://twitter.com/Ultimate_Blocks', 30 | 'youtubeUrl' => 'https://www.youtube.com/@ultimateblockswp', 31 | ); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /admin/data/block_demos/Block_Demos_Data.php: -------------------------------------------------------------------------------- 1 | { 15 | const wpContent = document.querySelector('#wpcontent'); 16 | const wpBody = document.querySelector('#wpbody'); 17 | const adminBar = document.querySelector('#wpadminbar'); 18 | 19 | if (wpBody) { 20 | const adminBarAdjustment = adminBar ? adminBar.offsetHeight : 0; 21 | 22 | wpBody.style.height = `calc( 100vh - ${adminBarAdjustment}px)`; 23 | wpContent.style.padding = 0; 24 | } 25 | }, []); 26 | 27 | return
{children}
; 28 | } 29 | 30 | /** 31 | * @module AdminMenuWrapper 32 | */ 33 | export default AdminMenuWrapper; 34 | -------------------------------------------------------------------------------- /admin/js/src/components/Animation.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | /** 4 | * Component for animating its children. 5 | * 6 | * This component relies on @keyframes animations. 7 | * 8 | * @param {Object} props component properties 9 | * @param {JSX.Element | Array | string} props.children component children 10 | * @param {string} props.animationKeyframeName keyframe name 11 | * @param {number} [props.duration=1000] duration in milliseconds 12 | * @param {number} [props.delay=0] delay in milliseconds 13 | */ 14 | function Animation({ 15 | children, 16 | animationKeyframeName, 17 | duration = 1000, 18 | delay = 0, 19 | }) { 20 | return ( 21 | 27 | {children} 28 | 29 | ); 30 | } 31 | 32 | /** 33 | * @module Animation 34 | */ 35 | export default Animation; 36 | -------------------------------------------------------------------------------- /admin/js/src/components/AnimationAppear.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Animation from '$Components/Animation'; 3 | 4 | /** 5 | * Animation appear component. 6 | * 7 | * This is a wrapper for Animation component. You can use its props for more customization. 8 | * `animationKeyframeName` is set to `appear` by default and will override any other value provided. 9 | * 10 | * @param {Object} props component properties 11 | */ 12 | function AnimationAppear(props) { 13 | const { children, ...rest } = props; 14 | rest.animationKeyframeName = 'appear'; 15 | 16 | return {children}; 17 | } 18 | 19 | /** 20 | * @module AnimationAppear 21 | */ 22 | export default AnimationAppear; 23 | -------------------------------------------------------------------------------- /admin/js/src/components/BlockCardProInfoControl.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; 3 | 4 | /** 5 | * Info control button for pro block cards. 6 | * 7 | * @param {Object} props component properties 8 | * @param {Function} props.handleClick click callback 9 | */ 10 | function BlockCardProInfoControl({ handleClick }) { 11 | return ( 12 | // eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions,jsx-a11y/interactive-supports-focus 13 |
18 | 19 |
20 | ); 21 | } 22 | 23 | /** 24 | * @module BlockCardProInfoControl 25 | */ 26 | export default BlockCardProInfoControl; 27 | -------------------------------------------------------------------------------- /admin/js/src/components/BoxContent/BoxContentInc.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | /** 4 | * Box content inc component. 5 | * 6 | * @param {Object} props component properties 7 | * @param {Function | string} props.children component children 8 | */ 9 | function BoxContentInc({ children }) { 10 | return
{children}
; 11 | } 12 | 13 | /** 14 | * @module BoxContentInc 15 | */ 16 | export default BoxContentInc; 17 | -------------------------------------------------------------------------------- /admin/js/src/components/BoxContent/BoxContentTitle.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | /** 4 | * Box content title component. 5 | * 6 | * @param {Object} props component properties 7 | * @param {Function | string} props.children component children 8 | * @class 9 | */ 10 | function BoxContentTitle({ children }) { 11 | return
{children}
; 12 | } 13 | 14 | /** 15 | * @module BoxContentTitle 16 | */ 17 | export default BoxContentTitle; 18 | -------------------------------------------------------------------------------- /admin/js/src/components/ButtonLinkGroup.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | /** 4 | * Button link group component. 5 | * 6 | * @param {Object} props component properties 7 | * @param {Function} props.children component children 8 | * @class 9 | */ 10 | function ButtonLinkGroup({ children }) { 11 | return
{children}
; 12 | } 13 | 14 | /** 15 | * @module ButtonLinkGroup 16 | */ 17 | export default ButtonLinkGroup; 18 | -------------------------------------------------------------------------------- /admin/js/src/components/Content.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Router from '$Components/Router'; 3 | import RouterProvider from '$Components/RouterProvider'; 4 | 5 | /** 6 | * Contents of menu page. 7 | */ 8 | function Content() { 9 | return ( 10 | 11 | 12 | 13 | ); 14 | } 15 | 16 | /** 17 | * @module Content 18 | */ 19 | export default Content; 20 | -------------------------------------------------------------------------------- /admin/js/src/components/ContentPhrase.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | /** 4 | * Content phrase component. 5 | * 6 | * @param {Object} props component properties 7 | * @param {JSX.Element | Array | string} props.children component children 8 | */ 9 | function ContentPhrase({ children }) { 10 | return
{children}
; 11 | } 12 | 13 | /** 14 | * @module ContentPhrase 15 | */ 16 | export default ContentPhrase; 17 | -------------------------------------------------------------------------------- /admin/js/src/components/ExtensionCardProInfoControl.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; 3 | 4 | /** 5 | * Info control button for pro extension cards. 6 | * 7 | * @param {Object} props component properties 8 | * @param {Function} props.handleClick click callback 9 | */ 10 | function ExtensionCardProInfoControl({ handleClick }) { 11 | return ( 12 | // eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions,jsx-a11y/interactive-supports-focus 13 |
18 | 19 |
20 | ); 21 | } 22 | 23 | /** 24 | * @module ExtensionCardProInfoControl 25 | */ 26 | export default ExtensionCardProInfoControl; 27 | -------------------------------------------------------------------------------- /admin/js/src/components/LineWrapper.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | /** 4 | * Line wrapper component. 5 | * 6 | * @param {Object} props component properties 7 | * @param {JSX.Element | Array | string} props.children component children 8 | */ 9 | function LineWrapper({ children }) { 10 | return
{children}
; 11 | } 12 | 13 | /** 14 | * @module LineWrapper 15 | */ 16 | export default LineWrapper; 17 | -------------------------------------------------------------------------------- /admin/js/src/components/MainContentPhrase.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line no-unused-vars 2 | import React from 'react'; 3 | import TextIndicate from '$Components/TextIndicate'; 4 | import ContentPhrase from '$Components/ContentPhrase'; 5 | import LineWrapper from '$Components/LineWrapper'; 6 | 7 | /** 8 | * Content phrase component. 9 | * 10 | * @function Object() { [native code] } 11 | */ 12 | function MainContentPhrase() { 13 | return ( 14 | 15 | 16 | Manage Your{' '} 17 | Blocks As 18 | 19 | 20 | Your Preferences 21 | 22 | 23 | ); 24 | } 25 | 26 | /** 27 | * @module MainContentPhrase 28 | */ 29 | export default MainContentPhrase; 30 | -------------------------------------------------------------------------------- /admin/js/src/components/NavigationHeaderButton.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | /** 4 | * Navigation header button component. 5 | * 6 | * @param {Object} props component properties 7 | * @param {string} props.title button title 8 | * @param {string} props.targetPath target path 9 | * @param {Function} props.onClickHandler click handler, will call with targetPath as first argument 10 | * @param {boolean} props.isActive button active status 11 | * @class 12 | */ 13 | function NavigationHeaderButton({ 14 | title, 15 | targetPath, 16 | onClickHandler, 17 | isActive = false, 18 | }) { 19 | const onClickHandlerDefault = () => onClickHandler(targetPath); 20 | 21 | return ( 22 |
31 | {title} 32 |
33 | ); 34 | } 35 | 36 | /** 37 | * @module NavigationHeaderButton 38 | */ 39 | export default NavigationHeaderButton; 40 | -------------------------------------------------------------------------------- /admin/js/src/components/Portal.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line no-unused-vars 2 | import React from 'react'; 3 | import { createPortal } from 'react-dom'; 4 | 5 | /** 6 | * Portal component. 7 | * 8 | * @param {Object} props component properties 9 | * @param {React.ElementType} props.children component children 10 | * @param {Element} props.target portal parent 11 | * @class 12 | */ 13 | function Portal({ children, target }) { 14 | return createPortal(children, target); 15 | } 16 | 17 | /** 18 | * @module Portal 19 | */ 20 | export default Portal; 21 | -------------------------------------------------------------------------------- /admin/js/src/components/ProBlockCardTitle.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | /** 4 | * Pro block card control title. 5 | * 6 | * @param {Object} props component properties 7 | * @param {boolean} props.isPro block pro status 8 | */ 9 | function ProBlockCardTitle({ isPro }) { 10 | return isPro && PRO; 11 | } 12 | 13 | /** 14 | * @module CouponCardProTitle 15 | */ 16 | export default ProBlockCardTitle; 17 | -------------------------------------------------------------------------------- /admin/js/src/components/ProExtensionCardTitle.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | /** 4 | * Pro block card control title. 5 | * 6 | * @param {Object} props component properties 7 | * @param {boolean} props.isPro block pro status 8 | */ 9 | function ProExtensionCardTitle({ isPro }) { 10 | return isPro && PRO; 11 | } 12 | 13 | /** 14 | * @module ProTitle 15 | */ 16 | export default ProExtensionCardTitle; 17 | -------------------------------------------------------------------------------- /admin/js/src/components/RightContainerItem.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line no-unused-vars 2 | import React from 'react'; 3 | 4 | /** 5 | * Menu right container item. 6 | * 7 | * @param {Object} props component properties 8 | * @param {React.ElementType} props.children component children 9 | * @param {Array} props.classNames component class names 10 | * @class 11 | */ 12 | function RightContainerItem({ children, classNames = [] }) { 13 | return ( 14 |
15 | {children} 16 |
17 | ); 18 | } 19 | 20 | /** 21 | * @module RightContainerItem 22 | */ 23 | export default RightContainerItem; 24 | -------------------------------------------------------------------------------- /admin/js/src/components/ScreenCenterMarks.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | /** 4 | * Component to show screen center marks for layout testing. 5 | * 6 | * @class 7 | */ 8 | function ScreenCenterMarks() { 9 | return ( 10 |
11 |
12 |
13 |
14 | ); 15 | } 16 | 17 | /** 18 | * @module ScreenCenterMarks 19 | */ 20 | export default ScreenCenterMarks; 21 | -------------------------------------------------------------------------------- /admin/js/src/components/TextIndicate.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line no-unused-vars 2 | import React from 'react'; 3 | 4 | /** 5 | * Component for indicating given text. 6 | * 7 | * @param {Object} props component properties 8 | * @param {React.ElementType} props.children children 9 | * @class 10 | */ 11 | function TextIndicate({ children }) { 12 | return {children}; 13 | } 14 | 15 | /** 16 | * @module TextIndicate 17 | */ 18 | export default TextIndicate; 19 | -------------------------------------------------------------------------------- /admin/js/src/containers/AdminMenuContainer.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line no-unused-vars 2 | import React from 'react'; 3 | import MenuHeader from '$Components/MenuHeader'; 4 | import Content from '$Components/Content'; 5 | import UpsellModalSettingsMenu from '$Components/UpsellModalSettingsMenu'; 6 | 7 | /** 8 | * Container for admin menu. 9 | * 10 | * @return {JSX.Element} container component 11 | * @function Object() { [native code] } 12 | */ 13 | function AdminMenuContainer() { 14 | return ( 15 |
16 | 17 | 18 | 19 |
20 | ); 21 | } 22 | 23 | /** 24 | * @module AdminMenuContainer 25 | */ 26 | export default AdminMenuContainer; 27 | -------------------------------------------------------------------------------- /admin/js/src/hoc/withIcon.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line no-unused-vars 2 | import React, { createElement } from 'react'; 3 | 4 | /** 5 | * Hoc for creating and adding icon element by using Gutenberg block icon attribute object. 6 | * 7 | * @param {React.ElementType} BaseComponent target component 8 | * @return {Function} function to use as HOC 9 | */ 10 | const withIcon = (BaseComponent) => (props) => { 11 | let iconElement = 'x'; 12 | if (!props.iconObject) { 13 | throw new Error( 14 | 'invalid type of icon object is supplied to withIcon HOC' 15 | ); 16 | } else if (typeof props.iconObject === 'string') { 17 | iconElement = ( 18 | 19 | ); 20 | } else if (typeof props.iconObject === 'object') { 21 | const { iconObject } = props; 22 | const { type, props: iconProps } = iconObject; 23 | 24 | iconElement = createElement(type, iconProps); 25 | } 26 | 27 | return ; 28 | }; 29 | 30 | /** 31 | * @module withIcon 32 | */ 33 | export default withIcon; 34 | -------------------------------------------------------------------------------- /admin/js/src/inc/err/ButtonLinkNoUrlError.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ButtonLinkNoUrlError. 3 | */ 4 | function ButtonLinkNoUrlError() { 5 | this.name = 'ButtonLinkNoUrlError'; 6 | this.message = 'No URL is provided for ButtonLink component.'; 7 | } 8 | 9 | ButtonLinkNoUrlError.prototype = Object.create(Error.prototype); 10 | 11 | /** 12 | * @module ContentNotFound 13 | */ 14 | export default ButtonLinkNoUrlError; 15 | -------------------------------------------------------------------------------- /admin/js/src/inc/err/ContentNotFoundError.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ContentNotFoundError error. 3 | * 4 | * @param {string} contentKey target not found content key 5 | */ 6 | function ContentNotFoundError(contentKey) { 7 | this.name = 'ContentNotFoundError'; 8 | this.message = `Content not found for key: [${contentKey}]`; 9 | } 10 | 11 | ContentNotFoundError.prototype = Object.create(Error.prototype); 12 | 13 | /** 14 | * @module ContentNotFound 15 | */ 16 | export default ContentNotFoundError; 17 | -------------------------------------------------------------------------------- /admin/js/src/inc/err/NoRouterComponentFoundError.js: -------------------------------------------------------------------------------- 1 | function NoRouterComponentFoundError() { 2 | this.name = 'NoRouterComponentFoundError'; 3 | this.message = 4 | 'No router component found within RouterProvider. Please make sure you have passed Router component as a child of RouterProvider.'; 5 | } 6 | 7 | NoRouterComponentFoundError.prototype = Error.prototype; 8 | 9 | export default NoRouterComponentFoundError; 10 | -------------------------------------------------------------------------------- /admin/js/src/inc/routes.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Route, { generateRouteArray } from '$AdminInc/Route'; 3 | import WelcomeContent from '$Containers/WelcomeContent'; 4 | import BlocksContent from '$Containers/BlocksContent'; 5 | import ExtensionsContent from '$Containers/ExtensionsContent'; 6 | 7 | /** 8 | * Routes for admin menu. 9 | * 10 | * Last route is reserved for 404 page. 11 | * 12 | * @type {Array} routes array 13 | */ 14 | const routes = [ 15 | { 16 | path: 'welcome', 17 | title: 'Welcome', 18 | element: , 19 | }, 20 | { 21 | path: 'blocks', 22 | title: 'Blocks', 23 | element: , 24 | }, 25 | { 26 | path: 'extensions', 27 | title: 'Extensions', 28 | element: , 29 | }, 30 | { 31 | path: '404', 32 | title: '404', 33 | element:
404
, 34 | }, 35 | ]; 36 | 37 | /** 38 | * Generated route objects array. 39 | * 40 | * @type {Array} 41 | */ 42 | export const routeObjects = generateRouteArray(routes); 43 | 44 | /** 45 | * @module routes 46 | */ 47 | export default routes; 48 | -------------------------------------------------------------------------------- /admin/js/src/stores/settings-menu/initialState.js: -------------------------------------------------------------------------------- 1 | import { FILTER_TYPES } from '$Components/BlockStatusFilterControl'; 2 | 3 | /** 4 | * Initial store state. 5 | * 6 | * @type {Object} 7 | */ 8 | const initialState = { 9 | app: { 10 | blockFilter: FILTER_TYPES._DEFAULT, 11 | showBlockInfo: false, 12 | upsellPopup: { 13 | show: false, 14 | targetBlock: null, 15 | }, 16 | content: {}, 17 | router: { 18 | current: 'welcome', 19 | }, 20 | }, 21 | versionControl: { 22 | currentVersion: '1.0.0', 23 | versions: {}, 24 | ajax: {}, 25 | }, 26 | pluginStatus: { 27 | isPro: false, 28 | }, 29 | }; 30 | 31 | /** 32 | * @module initialState 33 | */ 34 | export default initialState; 35 | -------------------------------------------------------------------------------- /admin/js/src/stores/settings-menu/slices/pluginStatus.js: -------------------------------------------------------------------------------- 1 | import initialState from '$Stores/settings-menu/initialState'; 2 | import { createSlice } from '@reduxjs/toolkit'; 3 | 4 | /** 5 | * Plugin status slice. 6 | * 7 | * @type {Object} 8 | */ 9 | const pluginStatusSliceOptions = { 10 | name: 'pluginStatus', 11 | initialState: initialState.pluginStatus, 12 | reducers: {}, 13 | }; 14 | 15 | const pluginStatusSlice = createSlice(pluginStatusSliceOptions); 16 | 17 | /** 18 | * Get plugin pro status. 19 | * 20 | * @param {Object} state store state 21 | * @return {boolean} plugin pro status 22 | */ 23 | export const isPluginPro = (state) => { 24 | return state.pluginStatus.isPro; 25 | }; 26 | 27 | /** 28 | * @module pluginStatusSlice 29 | */ 30 | export default pluginStatusSlice.reducer; 31 | -------------------------------------------------------------------------------- /admin/js/src/ub-admin-settings.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line no-unused-vars 2 | import React from 'react'; 3 | import { Provider } from 'react-redux'; 4 | import { createRoot } from 'react-dom/client'; 5 | import AdminMenuContainer from '$Containers/AdminMenuContainer'; 6 | import '$Styles/ub-admin-settings.scss'; 7 | import AdminMenuWrapper from '$Components/AdminMenuWrapper'; 8 | import settingsMenuStore from './stores/settings-menu/settingsMenuStore'; 9 | 10 | const mountPoint = document.querySelector('#ub-admin-menu'); 11 | 12 | if (mountPoint) { 13 | const root = createRoot(mountPoint); 14 | 15 | root.render( 16 | 17 | 18 | 19 | 20 | 21 | ); 22 | } else { 23 | throw new Error('no mount point found for settings menu'); 24 | } 25 | -------------------------------------------------------------------------------- /admin/js/ultimate-blocks-help.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DotCamp/ultimate-blocks-legacy/2b16e312c3baef65100147ae9487022d771b81b5/admin/js/ultimate-blocks-help.js -------------------------------------------------------------------------------- /admin/partials/ultimate-blocks-admin-display.php: -------------------------------------------------------------------------------- 1 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /admin/templates/menus/main-menu.php: -------------------------------------------------------------------------------- 1 | 15 |
16 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = function ( api ) { 2 | api.cache( true ); 3 | return { 4 | presets: [ '@babel/preset-env', '@babel/preset-react' ], 5 | plugins: [ 6 | '@babel/plugin-proposal-class-properties', 7 | [ 8 | 'babel-plugin-module-resolver', 9 | { 10 | alias: { 11 | $Containers: './admin/js/src/containers', 12 | $Components: './admin/js/src/components', 13 | $AdminInc: './admin/js/src/inc', 14 | $Data: './admin/js/src/data', 15 | $HOC: './admin/js/src/hoc', 16 | $Stores: './admin/js/src/stores', 17 | $Styles: './admin/css/src/', 18 | $Library: './library', 19 | $EditorComponents: './src/inc/components', 20 | }, 21 | }, 22 | ], 23 | ], 24 | }; 25 | }; 26 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ultimate-blocks/ultimate-blocks", 3 | "description": "Ultimate blocks", 4 | "type": "project", 5 | "license": "GPL3+", 6 | "scripts": { 7 | "test": "phpunit", 8 | "lint": "@phpcs-check", 9 | "phpcs-check": "phpcs -p --standard=.phpcs.xml --extensions=php --ignore=vendor/*,node_modules/*,__tests__/*,dist/*,bundle-dist/*,zip/*,library/*,.parcel-cache/*,.idea/*,languages/*,src/common.php ." 10 | }, 11 | "require": { 12 | "vlucas/phpdotenv": "^5.5", 13 | "ext-dom": "*", 14 | "ext-libxml": "*", 15 | "ext-json": "*" 16 | }, 17 | "require-dev": { 18 | "phpunit/phpunit": "^10.3", 19 | "brain/monkey": "^2.6", 20 | "wp-coding-standards/wpcs": "^3.0", 21 | "phpcompatibility/phpcompatibility-wp": "*" 22 | }, 23 | "autoload": { 24 | "psr-4": { 25 | "Ultimate_Blocks\\": [ 26 | "./", 27 | "./__tests__/php/unit" 28 | ] 29 | } 30 | }, 31 | "config": { 32 | "allow-plugins": { 33 | "dealerdirect/phpcodesniffer-composer-installer": true 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /dist/.gitinclude: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DotCamp/ultimate-blocks-legacy/2b16e312c3baef65100147ae9487022d771b81b5/dist/.gitinclude -------------------------------------------------------------------------------- /dist/deactivator.build.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | if (window.ultimate_blocks) { 4 | window.ultimate_blocks.forEach((block) => { 5 | if (!block.active) { 6 | wp.blocks.unregisterBlockType(block.name); 7 | } 8 | }); 9 | } 10 | -------------------------------------------------------------------------------- /includes/Env_Manager.php: -------------------------------------------------------------------------------- 1 | safeLoad(); 24 | } 25 | } 26 | 27 | /** 28 | * Get value from .env file. 29 | * 30 | * @param string $key key to get value for 31 | * 32 | * @return string|null value for given key, null if not set 33 | */ 34 | public static function get( $key ) { 35 | return isset( $_ENV[ $key ] ) ? $_ENV[ $key ] : null; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /includes/common/interfaces/I_Plugin_Data.php: -------------------------------------------------------------------------------- 1 | [ 20 | __( 'Saved Styles', 'ultimate-blocks' ), 21 | __( 'Upgrade your editor with the new style saving and updating feature. Save time by reusing styles assigned to blocks and automatically applying default styles to related blocks.', 22 | 'ultimate-blocks' ), 23 | 'common/savedStylesMain.png' 24 | ] 25 | ]; 26 | 27 | return array_merge( $base_data, $saved_styles_upsell_data ); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /includes/pro_manager/extensions/Social_Share_Extension.php: -------------------------------------------------------------------------------- 1 | 19 | * [feature_name, feature_description, feature_screenshot(can be omitted for auto search)] 20 | * ], 21 | * ... 22 | * ] 23 | * 24 | * Beside feature_id, remaining data should match arguments of `generate_upsell_data` method. 25 | * 26 | * @return array data 27 | */ 28 | public function add_upsell_data() { 29 | return Saved_Styles_Common::inject_upsell_data( [] ); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /includes/svg_sanitizer/DomDocumentLoadHtmlException.php: -------------------------------------------------------------------------------- 1 | 21 | -------------------------------------------------------------------------------- /library/freemius/templates/ajax-loader.php: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /library/freemius/templates/connect/index.php: -------------------------------------------------------------------------------- 1 | get_slug(); 18 | 19 | echo fs_text_inline( 'Sorry for the inconvenience and we are here to help if you give us a chance.', 'contact-support-before-deactivation', $slug ) 20 | . sprintf(" %s", 21 | $fs->contact_url( 'technical_support' ), 22 | fs_text_inline( 'Contact Support', 'contact-support', $slug ) 23 | ); 24 | -------------------------------------------------------------------------------- /library/freemius/templates/forms/deactivation/index.php: -------------------------------------------------------------------------------- 1 | 20 |
21 | 22 |
-------------------------------------------------------------------------------- /library/freemius/templates/plugin-info/index.php: -------------------------------------------------------------------------------- 1 | 22 |
    23 | $url ) : ?> 25 |
  1. 26 | 27 |
  2. 28 | 29 |
30 | -------------------------------------------------------------------------------- /library/ub-common/Components/client.css: -------------------------------------------------------------------------------- 1 | .ultimate-blocks-icon-component{display:flex;justify-content:center;align-items:center}.ultimate-blocks-icon-component .ultimate-blocks-icon-component-svg-base{width:100%;height:100%}@keyframes linearGradientMove{to{background-position:6px 0,-6px 100%,0 -6px,100% 6px}}.ub-preview-provider{display:none} 2 | -------------------------------------------------------------------------------- /library/ub-common/Components/client.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlcyI6W10sInNvdXJjZXNDb250ZW50IjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 3 | -------------------------------------------------------------------------------- /library/ub-common/Components/editor.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmpzIiwic291cmNlcyI6W10sInNvdXJjZXNDb250ZW50IjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 3 | -------------------------------------------------------------------------------- /library/ub-common/info.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.1.3" 3 | } -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | __tests__/php/unit 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /public/css/ultimate-blocks-public.css: -------------------------------------------------------------------------------- 1 | /** 2 | * All of the CSS for your public-facing functionality should be 3 | * included in this file. 4 | */ -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/__development/components/DevelopmentComponent.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from 'react'; 2 | import { modeCheckDev } from '$Inc/helpers/modeCheck'; 3 | 4 | /** 5 | * DEVELOPMENT 6 | * 7 | * Base development component. 8 | * 9 | * @param {Object} props component properties 10 | * @param {Function | Array | JSX.Element} props.children component children 11 | */ 12 | function DevelopmentComponent({ children }) { 13 | /** 14 | * useEffect hook 15 | */ 16 | useEffect(() => { 17 | // eslint-disable-next-line no-console 18 | console.warn( 19 | `A development component is found, if this is a production version, remove it. %c\n\nComponent Name: [${children.type.name}]`, 20 | 'font-weight: bold' 21 | ); 22 | }, []); 23 | 24 | return React.Children.map(children, (child) => { 25 | if (React.isValidElement(child)) { 26 | return React.cloneElement(child, { 27 | ...child.props, 28 | isDevelopment: modeCheckDev(), 29 | }); 30 | } 31 | return child; 32 | }); 33 | } 34 | 35 | /** 36 | * @module DevelopmentComponent 37 | */ 38 | export default DevelopmentComponent; 39 | -------------------------------------------------------------------------------- /src/blocks/advanced-heading/block.js: -------------------------------------------------------------------------------- 1 | import icon from "./icons"; 2 | import edit from "./components"; 3 | import transforms from "./transforms"; 4 | import metadata from "./block.json"; 5 | const { registerBlockType } = wp.blocks; 6 | 7 | registerBlockType(metadata.name, { 8 | ...metadata, 9 | icon, 10 | transforms, 11 | attributes: metadata.attributes, 12 | example: { 13 | attributes: { 14 | level: "h1", 15 | content: "Ultimate Blocks Advanced Heading", 16 | alignment: "center", 17 | textColor: "red", 18 | fontFamily: "inherit", 19 | }, 20 | }, 21 | edit, 22 | save: () => null, 23 | }); 24 | -------------------------------------------------------------------------------- /src/blocks/advanced-heading/editor.css: -------------------------------------------------------------------------------- 1 | .ub_advanced_heading_toolbar_level_selector{align-self:center} -------------------------------------------------------------------------------- /src/blocks/advanced-heading/editor.scss: -------------------------------------------------------------------------------- 1 | .ub_advanced_heading_toolbar_level_selector { 2 | align-self: center; 3 | } 4 | -------------------------------------------------------------------------------- /src/blocks/advanced-heading/formats/register-formats.js: -------------------------------------------------------------------------------- 1 | import highlight from "./highlight"; 2 | 3 | const { registerFormatType } = wp.richText; 4 | 5 | /* register the formats */ 6 | function registerFormats() { 7 | [highlight].forEach(({ name, ...settings }) => 8 | registerFormatType(name, settings) 9 | ); 10 | } 11 | 12 | registerFormats(); 13 | -------------------------------------------------------------------------------- /src/blocks/advanced-heading/settings-options.js: -------------------------------------------------------------------------------- 1 | import fontsList from "./fonts"; 2 | const { __ } = wp.i18n; 3 | 4 | export const textTransformOptions = [ 5 | { 6 | value: "none", 7 | label: __("None", "ultimate-blocks"), 8 | }, 9 | { 10 | value: "uppercase", 11 | label: __("Uppercase", "ultimate-blocks"), 12 | }, 13 | { 14 | value: "lowercase", 15 | label: __("Lowercase", "ultimate-blocks"), 16 | }, 17 | { 18 | value: "capitalize", 19 | label: __("Capitalize", "ultimate-blocks"), 20 | }, 21 | ]; 22 | 23 | export const fontWeightOptions = [ 24 | "Normal", 25 | "Bold", 26 | "100", 27 | "200", 28 | "300", 29 | "400", 30 | "500", 31 | "600", 32 | "700", 33 | "800", 34 | "900", 35 | ].map((o) => ({ value: o, label: __(o, "ultimate-blocks") })); 36 | 37 | export const fontFamilyOptions = fontsList.map((fontFamilyOption) => ({ 38 | value: fontFamilyOption, 39 | label: __(fontFamilyOption, "ultimate-blocks"), 40 | })); 41 | -------------------------------------------------------------------------------- /src/blocks/advanced-heading/style.css: -------------------------------------------------------------------------------- 1 | .nope{color:rgba(0,0,0,0)} -------------------------------------------------------------------------------- /src/blocks/advanced-heading/style.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * #.# Styles 3 | * 4 | * CSS for both Frontend+Backend. 5 | */ 6 | 7 | 8 | .nope { 9 | color: transparent; 10 | } 11 | -------------------------------------------------------------------------------- /src/blocks/advanced-video/block-controls.js: -------------------------------------------------------------------------------- 1 | import { MediaReplaceFlow, BlockControls } from "@wordpress/block-editor"; 2 | 3 | function AdvancedVideoBlockControls(props) { 4 | const { value, url, onSelectVideo, onSelectURL, onUploadError } = props; 5 | return ( 6 | 7 | 16 | 17 | ); 18 | } 19 | export default AdvancedVideoBlockControls; 20 | -------------------------------------------------------------------------------- /src/blocks/advanced-video/block.js: -------------------------------------------------------------------------------- 1 | const { registerBlockType } = wp.blocks; 2 | const { createBlock } = wp.blocks; 3 | 4 | import metadata from "./block.json"; 5 | 6 | import icon from "./icon"; 7 | import { AdvancedVideoBlock } from "./components"; 8 | 9 | registerBlockType(metadata.name, { 10 | ...metadata, 11 | icon, 12 | example: { 13 | attributes: { 14 | videoEmbedCode: 15 | '', 16 | }, 17 | }, 18 | edit: AdvancedVideoBlock, 19 | transforms: { 20 | from: [ 21 | { 22 | type: "block", 23 | blocks: ["core/embed"], 24 | transform: (attributes) => 25 | createBlock("ub/advanced-video", { 26 | url: attributes.url, 27 | autofit: true, 28 | videoSource: attributes.providerNameSlug, 29 | isTransformed: true, 30 | }), 31 | }, 32 | ], 33 | }, 34 | save: () => null, 35 | }); 36 | -------------------------------------------------------------------------------- /src/blocks/advanced-video/get-styles.js: -------------------------------------------------------------------------------- 1 | import { omitBy, isUndefined, trim, isEmpty } from "lodash"; 2 | import { getSpacingCss } from "../utils/styling-helpers"; 3 | 4 | export function getStyles(attributes) { 5 | const { padding, margin } = attributes; 6 | const paddingObj = getSpacingCss(padding); 7 | const marginObj = getSpacingCss(margin); 8 | 9 | let styles = { 10 | paddingTop: paddingObj?.top, 11 | paddingRight: paddingObj?.right, 12 | paddingBottom: paddingObj?.bottom, 13 | paddingLeft: paddingObj?.left, 14 | marginTop: !isEmpty(marginObj?.top) ? marginObj?.top : "", 15 | marginRight: !isEmpty(marginObj?.right) ? marginObj?.right : " ", 16 | marginBottom: !isEmpty(marginObj?.bottom) ? marginObj?.bottom : "", 17 | marginLeft: !isEmpty(marginObj?.left) ? marginObj?.left : "", 18 | }; 19 | 20 | return omitBy( 21 | styles, 22 | (value) => 23 | value === false || 24 | isEmpty(value) || 25 | isUndefined(value) || 26 | trim(value) === "" || 27 | trim(value) === "undefined undefined undefined" 28 | ); 29 | } 30 | -------------------------------------------------------------------------------- /src/blocks/advanced-video/placeholder.js: -------------------------------------------------------------------------------- 1 | import { __ } from "@wordpress/i18n"; 2 | import { Placeholder } from "@wordpress/components"; 3 | import { MediaPlaceholder } from "@wordpress/block-editor"; 4 | import icon from "./icon"; 5 | 6 | const placeholder = (content) => { 7 | return ( 8 | 17 | {content} 18 | 19 | ); 20 | }; 21 | function AdvancedVideoPlaceholder(props) { 22 | return ( 23 | 33 | ); 34 | } 35 | export default AdvancedVideoPlaceholder; 36 | -------------------------------------------------------------------------------- /src/blocks/button/components/UpsellInspectorDummy.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { __ } from '@wordpress/i18n'; 3 | import UpsellProPanel from '$Inc/components/Upsell/UpsellProPanel'; 4 | import UpsellInspectorPanelBody from '$Inc/components/Upsell/UpsellInspectorPanelBody'; 5 | import UpsellSelectControl from '$Inc/components/Upsell/Controls/UpsellSelectControl'; 6 | 7 | /** 8 | * Upsell dummy inspector controls for button block. 9 | * 10 | * @deprecated 11 | * 12 | * @function Object() { [native code] } 13 | */ 14 | function UpsellInspectorDummy() { 15 | return ( 16 | 17 | 18 | 25 | 26 | 27 | ); 28 | } 29 | 30 | /** 31 | * @module UpsellInspectorDummy 32 | */ 33 | export default UpsellInspectorDummy; 34 | -------------------------------------------------------------------------------- /src/blocks/button/icons/icons.js: -------------------------------------------------------------------------------- 1 | const icon = ( 2 | 9 | 10 | 16 | 17 | ); 18 | 19 | export default icon; 20 | -------------------------------------------------------------------------------- /src/blocks/call-to-action/editor.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * #.# Editor Styles 3 | * 4 | * CSS for just Backend enqueued after style.scss 5 | * which makes it higher in priority. 6 | */ 7 | @import '../../common'; 8 | 9 | .wp-block-ub-call-to-action { 10 | margin: 0 auto; 11 | max-width: 100%; 12 | } 13 | 14 | .ub_call_to_action_content { 15 | padding: 0 0 40px 0; 16 | } 17 | 18 | .ub_call_to_action_url_input { 19 | display: flex; 20 | align-items: center; 21 | margin-top: -20px; 22 | } 23 | 24 | .ub_cta_url_input_box { 25 | margin-left: auto; 26 | margin-right: auto; 27 | position: relative; 28 | box-sizing: border-box; 29 | } 30 | 31 | .ub_cta_button { 32 | text-align: center; 33 | } 34 | -------------------------------------------------------------------------------- /src/blocks/call-to-action/get-styles.js: -------------------------------------------------------------------------------- 1 | import { omitBy, isUndefined, trim, isEmpty } from "lodash"; 2 | import { getSpacingCss } from "../utils/styling-helpers"; 3 | 4 | export function getStyles(attributes) { 5 | const { padding, margin, ctaBackgroundColor, ctaBorderColor, ctaBorderSize } = 6 | attributes; 7 | const paddingObj = getSpacingCss(padding); 8 | const marginObj = getSpacingCss(margin); 9 | 10 | let styles = { 11 | paddingTop: paddingObj?.top, 12 | paddingRight: paddingObj?.right, 13 | paddingBottom: paddingObj?.bottom, 14 | paddingLeft: paddingObj?.left, 15 | marginTop: marginObj?.top, 16 | marginRight: marginObj?.right, 17 | marginBottom: marginObj?.bottom, 18 | marginLeft: marginObj?.left, 19 | backgroundColor: ctaBackgroundColor, 20 | borderWidth: ctaBorderSize + "px", 21 | borderColor: ctaBorderColor, 22 | }; 23 | 24 | return omitBy( 25 | styles, 26 | (value) => 27 | value === false || 28 | isEmpty(value) || 29 | isUndefined(value) || 30 | trim(value) === "" || 31 | trim(value) === "undefined undefined undefined" 32 | ); 33 | } 34 | -------------------------------------------------------------------------------- /src/blocks/click-to-tweet/editor.css: -------------------------------------------------------------------------------- 1 | .ub_tweet{display:block;margin:0;width:100%;border:none;outline:none;box-shadow:none;resize:none;background:rgba(0,0,0,0) !important;overflow:hidden;line-height:1.4;padding:10px;transition:padding .2s linear}.ub_tweet:focus{box-shadow:none}.ub_click_tweet i{top:4px !important} -------------------------------------------------------------------------------- /src/blocks/click-to-tweet/editor.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * #.# Editor Styles 3 | * 4 | * CSS for just Backend enqueued after style.scss 5 | * which makes it higher in priority. 6 | */ 7 | 8 | .ub_tweet { 9 | display: block; 10 | margin: 0; 11 | width: 100%; 12 | border: none; 13 | outline: none; 14 | box-shadow: none; 15 | resize: none; 16 | background: transparent !important; 17 | overflow: hidden; 18 | line-height: 1.4; 19 | padding: 10px; 20 | transition: padding 0.2s linear; 21 | &:focus { 22 | box-shadow: none; 23 | } 24 | } 25 | 26 | .ub_click_tweet i { 27 | top: 4px !important; 28 | } 29 | -------------------------------------------------------------------------------- /src/blocks/click-to-tweet/get-styles.js: -------------------------------------------------------------------------------- 1 | import { omitBy, isUndefined, trim, isEmpty } from "lodash"; 2 | import { getSpacingCss } from "../utils/styling-helpers"; 3 | 4 | export function getStyles(attributes) { 5 | const { padding, margin, borderColor } = attributes; 6 | const paddingObj = getSpacingCss(padding); 7 | const marginObj = getSpacingCss(margin); 8 | 9 | let styles = { 10 | borderColor: borderColor, 11 | paddingTop: paddingObj?.top, 12 | paddingRight: paddingObj?.right, 13 | paddingBottom: paddingObj?.bottom, 14 | paddingLeft: paddingObj?.left, 15 | marginTop: !isEmpty(marginObj?.top) ? marginObj?.top : "", 16 | marginRight: !isEmpty(marginObj?.right) ? marginObj?.right : " ", 17 | marginBottom: !isEmpty(marginObj?.bottom) ? marginObj?.bottom : "", 18 | marginLeft: !isEmpty(marginObj?.left) ? marginObj?.left : "", 19 | }; 20 | 21 | return omitBy( 22 | styles, 23 | (value) => 24 | value === false || 25 | isEmpty(value) || 26 | isUndefined(value) || 27 | trim(value) === "" || 28 | trim(value) === "undefined undefined undefined" 29 | ); 30 | } 31 | -------------------------------------------------------------------------------- /src/blocks/click-to-tweet/icons/sprite-twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DotCamp/ultimate-blocks-legacy/2b16e312c3baef65100147ae9487022d771b81b5/src/blocks/click-to-tweet/icons/sprite-twitter.png -------------------------------------------------------------------------------- /src/blocks/click-to-tweet/style.css: -------------------------------------------------------------------------------- 1 | .wp-block-ub-block-click-to-tweet{margin:0 auto;max-width:100%}.ub_click_to_tweet{width:95%;border:1px solid;border-radius:4px;padding:10px;margin:25px 0px}.ub_tweet{padding:10px;margin-left:10px;font-family:"Segoe UI",Arial,sans-serif}.ub_click_tweet{text-align:right;padding:10px;margin-right:10px}.ub_click_tweet>span{display:inline-block}.ub_click_tweet i{display:inline-block;width:16px;height:14px;background:url("../src/blocks/click-to-tweet/icons/sprite-twitter.png") no-repeat;background-position-x:0%;background-position-y:0%;margin-right:3px;position:relative;top:0;background-position:0 -151px;width:25px;height:20px}@media(max-width: 479.98px){.ub_click_tweet{width:100%;float:none;padding:0;margin:10px 0 !important}.ub_tweet{padding:0;margin-left:0;line-height:1.5}} -------------------------------------------------------------------------------- /src/blocks/components/SelectControl.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { SelectControl } from "@wordpress/components"; 5 | import { __ } from "@wordpress/i18n"; 6 | 7 | function UBSelectControl({ label, value, onChange = () => {}, options }) { 8 | const displayValue = value ?? "auto"; 9 | return ( 10 | 18 | ); 19 | } 20 | export default UBSelectControl; 21 | -------------------------------------------------------------------------------- /src/blocks/components/TabsPanelControl.js: -------------------------------------------------------------------------------- 1 | import { TabPanel } from "@wordpress/components"; 2 | 3 | function TabsPanelControl({ tabs }) { 4 | return ( 5 | 6 | {(tab) => tab.component} 7 | 8 | ); 9 | } 10 | export default TabsPanelControl; 11 | -------------------------------------------------------------------------------- /src/blocks/components/index.js: -------------------------------------------------------------------------------- 1 | export { default as BorderRadiusControl } from "./BorderRadiusControl"; 2 | export { default as CustomToggleGroupControl } from "./ToggleGroupControl"; 3 | export { default as CustomFontSizePicker } from "./FontSizePicker"; 4 | export { default as SpacingControl } from "./SpacingControl"; 5 | export { default as ColorSettings } from "./ColorSettings"; 6 | export { default as ColorSettingsWithGradient } from "./ColorSettingsWithGradient"; 7 | export { default as UBSelectControl } from "./SelectControl"; 8 | export { default as BorderControl } from "./BorderControl"; 9 | export { default as TabsPanelControl } from "./TabsPanelControl"; 10 | export { default as SpacingControlWithToolsPanel } from "./SpacingControlWithToolsPanel"; 11 | export { default as TextDecorationControl } from "./TextDecorationControl"; 12 | export { default as FontAppearanceControl } from "./FontAppearanceControl"; 13 | export { default as LineHeightControl } from "./LineHeightControl"; 14 | export { default as LetterSpacingControl } from "./LetterSpacingControl"; 15 | export { default as FontFamilyControl } from "./FontFamilyControl"; 16 | -------------------------------------------------------------------------------- /src/blocks/content-filter/icon.js: -------------------------------------------------------------------------------- 1 | const icon = ( 2 | 9 | 10 | 16 | 17 | ); 18 | 19 | export default icon; 20 | -------------------------------------------------------------------------------- /src/blocks/content-filter/style.scss: -------------------------------------------------------------------------------- 1 | @import "../../common"; 2 | 3 | .wp-block-ub-content-filter-block { 4 | .ub-content-filter-buttons-wrapper { 5 | display: flex; 6 | justify-content: var(--ub-content-filter-buttons-justification); 7 | flex-wrap: wrap; 8 | gap: 20px; 9 | } 10 | } 11 | .ub-content-filter-tag { 12 | min-height: 32px; 13 | min-width: 100px; 14 | padding: 8px; 15 | border-radius: 3px; 16 | text-align: center; 17 | } 18 | 19 | .ub-content-filter-category-name { 20 | font-size: 1.625em; 21 | font-weight: 800; 22 | margin-bottom: 15px; 23 | } 24 | .ub-content-filter-category { 25 | margin-bottom: 10px; 26 | padding: 3px; 27 | } 28 | 29 | .ub-content-filter-tag { 30 | cursor: pointer; 31 | } 32 | -------------------------------------------------------------------------------- /src/blocks/content-toggle/get-styles.js: -------------------------------------------------------------------------------- 1 | import { omitBy, isUndefined, trim, isEmpty } from "lodash"; 2 | import { getSpacingCss } from "../utils/styling-helpers"; 3 | 4 | export function getStyles(attributes) { 5 | const { padding, margin } = attributes; 6 | const paddingObj = getSpacingCss(padding); 7 | const marginObj = getSpacingCss(margin); 8 | 9 | let styles = { 10 | paddingTop: paddingObj?.top, 11 | paddingRight: paddingObj?.right, 12 | paddingBottom: paddingObj?.bottom, 13 | paddingLeft: paddingObj?.left, 14 | marginTop: marginObj?.top, 15 | marginRight: marginObj?.right, 16 | marginBottom: marginObj?.bottom, 17 | marginLeft: marginObj?.left, 18 | }; 19 | 20 | return omitBy( 21 | styles, 22 | (value) => 23 | value === false || 24 | isEmpty(value) || 25 | isUndefined(value) || 26 | trim(value) === "" || 27 | trim(value) === "undefined undefined undefined" 28 | ); 29 | } 30 | -------------------------------------------------------------------------------- /src/blocks/content-toggle/icons/icon.js: -------------------------------------------------------------------------------- 1 | const icon = ( 2 | 9 | 10 | 11 | 12 | 18 | 24 | 25 | ); 26 | 27 | export default icon; 28 | -------------------------------------------------------------------------------- /src/blocks/content-toggle/icons/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "none": "none", 3 | "chevron": "wp-block-ub-chevron-down", 4 | "plus": "wp-block-ub-math-plus" 5 | } 6 | -------------------------------------------------------------------------------- /src/blocks/countdown/blocks-styles.js: -------------------------------------------------------------------------------- 1 | import { __ } from "@wordpress/i18n"; 2 | import metadata from "./block.json"; 3 | 4 | const styles = [ 5 | { 6 | name: "ub-countdown-regular", 7 | label: __("Regular", "ultimate-blocks"), 8 | }, 9 | { 10 | name: "ub-countdown-odometer", 11 | label: __("Odometer", "ultimate-blocks"), 12 | isDefault: true, 13 | }, 14 | { 15 | name: "ub-countdown-circular", 16 | label: __("Circular", "ultimate-blocks"), 17 | }, 18 | ]; 19 | 20 | styles.forEach((style) => { 21 | wp.blocks.registerBlockStyle(metadata.name, style); 22 | }); 23 | -------------------------------------------------------------------------------- /src/blocks/counter/block.js: -------------------------------------------------------------------------------- 1 | import { registerBlockType } from "@wordpress/blocks"; 2 | import metadata from "./block.json"; 3 | import Edit from "./edit"; 4 | import { blockIcon } from "./icon.js"; 5 | 6 | registerBlockType(metadata.name, { 7 | ...metadata, 8 | attributes: metadata.attributes, 9 | edit: Edit, 10 | save: () => null, 11 | icon: blockIcon, 12 | example: { 13 | attributes: { 14 | label: "Counter Label", 15 | startNumber: "0", 16 | endNumber: "500", 17 | counterFontSize: "32px", 18 | }, 19 | }, 20 | }); 21 | -------------------------------------------------------------------------------- /src/blocks/counter/editor.css: -------------------------------------------------------------------------------- 1 | .editor-styles-wrapper div.ub_counter-container[id^=block-]{padding-top:var(--ub-counter-padding-top, 0px) !important;padding-right:var(--ub-counter-padding-right, 0px) !important;padding-bottom:var(--ub-counter-padding-bottom, 0px) !important;padding-left:var(--ub-counter-padding-left, 0px) !important;margin-top:var(--ub-counter-margin-top, auto) !important;margin-right:var(--ub-counter-margin-right, auto) !important;margin-bottom:var(--ub-counter-margin-bottom, auto) !important;margin-left:var(--ub-counter-margin-left, auto) !important} -------------------------------------------------------------------------------- /src/blocks/counter/editor.scss: -------------------------------------------------------------------------------- 1 | .editor-styles-wrapper { 2 | div.ub_counter-container[id^="block-"] { 3 | padding-top: var(--ub-counter-padding-top, 0px) !important; 4 | padding-right: var(--ub-counter-padding-right, 0px) !important; 5 | padding-bottom: var(--ub-counter-padding-bottom, 0px) !important; 6 | padding-left: var(--ub-counter-padding-left, 0px) !important; 7 | margin-top: var(--ub-counter-margin-top, auto) !important; 8 | margin-right: var(--ub-counter-margin-right, auto) !important; 9 | margin-bottom: var(--ub-counter-margin-bottom, auto) !important; 10 | margin-left: var(--ub-counter-margin-left, auto) !important; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/blocks/divider/editor.css: -------------------------------------------------------------------------------- 1 | .wp-block-ub-block-divider{margin:0 auto;max-width:100%} -------------------------------------------------------------------------------- /src/blocks/divider/editor.scss: -------------------------------------------------------------------------------- 1 | .wp-block-ub-block-divider { 2 | margin: 0 auto; 3 | max-width: 100%; 4 | } 5 | -------------------------------------------------------------------------------- /src/blocks/divider/get-styles.js: -------------------------------------------------------------------------------- 1 | import { omitBy, isUndefined, trim, isEmpty } from "lodash"; 2 | import { getSpacingCss } from "../utils/styling-helpers"; 3 | 4 | export function getStyles(attributes) { 5 | const { padding, margin } = attributes; 6 | const paddingObj = getSpacingCss(padding); 7 | const marginObj = getSpacingCss(margin); 8 | 9 | let styles = { 10 | paddingTop: paddingObj?.top, 11 | paddingRight: paddingObj?.right, 12 | paddingBottom: paddingObj?.bottom, 13 | paddingLeft: paddingObj?.left, 14 | marginTop: marginObj?.top, 15 | marginRight: marginObj?.right, 16 | marginBottom: marginObj?.bottom, 17 | marginLeft: marginObj?.left, 18 | }; 19 | 20 | return omitBy( 21 | styles, 22 | (value) => 23 | value === false || 24 | isEmpty(value) || 25 | isUndefined(value) || 26 | trim(value) === "" || 27 | trim(value) === "undefined undefined undefined" 28 | ); 29 | } 30 | -------------------------------------------------------------------------------- /src/blocks/divider/icons/icon.js: -------------------------------------------------------------------------------- 1 | const icon = ( 2 | 9 | 10 | 16 | 17 | ); 18 | 19 | export default icon; 20 | -------------------------------------------------------------------------------- /src/blocks/divider/oldVersions.js: -------------------------------------------------------------------------------- 1 | export const version_1_1_2 = props => { 2 | const { 3 | borderSize, 4 | borderStyle, 5 | borderColor, 6 | borderHeight 7 | } = props.attributes; 8 | 9 | return ( 10 |
11 |
19 |
20 | ); 21 | }; 22 | -------------------------------------------------------------------------------- /src/blocks/divider/style.css: -------------------------------------------------------------------------------- 1 | .ub_divider{display:flex;margin-left:auto;margin-right:auto;align-content:center;border-bottom:none}.ub_divider.ub_divider:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.wp-block-separator):not(.woocommerce){max-width:initial}.entry-content.entry-content .ub_divider{background-color:rgba(0,0,0,0)}.entry-content.entry-content .ub_divider::before,.entry-content.entry-content .ub_divider::after{content:none} -------------------------------------------------------------------------------- /src/blocks/divider/style.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * #.# Styles 3 | * 4 | * CSS for both Frontend+Backend. 5 | */ 6 | 7 | .ub_divider { 8 | display: flex; 9 | margin-left: auto; //needed for proper alignment 10 | margin-right: auto; //needed for proper alignment 11 | align-content: center; 12 | //begin overrides for twenty twenty-one 13 | border-bottom: none; 14 | &.ub_divider:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.wp-block-separator):not(.woocommerce) { 15 | max-width: initial; 16 | } 17 | //end overrides for twenty twenty-one 18 | } 19 | 20 | .entry-content.entry-content .ub_divider { 21 | &::before, 22 | &::after { 23 | content: none; //override twenty twenty 24 | } 25 | background-color: transparent; //override twenty nineteen, twenty seventeen 26 | } 27 | -------------------------------------------------------------------------------- /src/blocks/expand/expand-portion/block.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://schemas.wp.org/trunk/block.json", 3 | "apiVersion": 3, 4 | "name": "ub/expand-portion", 5 | "title": "Expand Portion", 6 | "parent": [ 7 | "ub/expand" 8 | ], 9 | "category": "ultimateblocks", 10 | "description": "", 11 | "keywords": [], 12 | "attributes": { 13 | "clickText": { 14 | "type": "string", 15 | "default": "" 16 | }, 17 | "displayType": { 18 | "type": "string", 19 | "default": "" 20 | }, 21 | "isVisible": { 22 | "type": "boolean", 23 | "default": true 24 | }, 25 | "toggleAlign": { 26 | "type": "string", 27 | "default": "left" 28 | }, 29 | "parentID": { 30 | "type": "string", 31 | "default": "" 32 | } 33 | }, 34 | "supports": { 35 | "inserter": false, 36 | "reusable": false, 37 | "lock": false 38 | } 39 | } -------------------------------------------------------------------------------- /src/blocks/expand/get-styles.js: -------------------------------------------------------------------------------- 1 | import { omitBy, isUndefined, trim, isEmpty } from "lodash"; 2 | import { getSpacingCss } from "../utils/styling-helpers"; 3 | 4 | export function getStyles(attributes) { 5 | const { padding, margin } = attributes; 6 | const paddingObj = getSpacingCss(padding); 7 | const marginObj = getSpacingCss(margin); 8 | 9 | let styles = { 10 | paddingTop: paddingObj?.top, 11 | paddingRight: paddingObj?.right, 12 | paddingBottom: paddingObj?.bottom, 13 | paddingLeft: paddingObj?.left, 14 | marginTop: marginObj?.top, 15 | marginRight: marginObj?.right, 16 | marginBottom: marginObj?.bottom, 17 | marginLeft: marginObj?.left, 18 | }; 19 | 20 | return omitBy( 21 | styles, 22 | (value) => 23 | value === false || 24 | isEmpty(value) || 25 | isUndefined(value) || 26 | trim(value) === "" || 27 | trim(value) === "undefined undefined undefined" 28 | ); 29 | } 30 | -------------------------------------------------------------------------------- /src/blocks/expand/icon.js: -------------------------------------------------------------------------------- 1 | const icon = ( 2 | 9 | 10 | 16 | 17 | ); 18 | 19 | export default icon; 20 | -------------------------------------------------------------------------------- /src/blocks/expand/style.css: -------------------------------------------------------------------------------- 1 | .ub-expand{padding-bottom:1em}.ub-expand-toggle-button{display:block;cursor:pointer}.ub-hide{display:none} -------------------------------------------------------------------------------- /src/blocks/expand/style.scss: -------------------------------------------------------------------------------- 1 | .ub-expand { 2 | padding-bottom: 1em; 3 | } 4 | 5 | .ub-expand-toggle-button { 6 | display: block; 7 | cursor: pointer; 8 | } 9 | .ub-hide { 10 | display: none; 11 | } 12 | -------------------------------------------------------------------------------- /src/blocks/feature-box/editor.css: -------------------------------------------------------------------------------- 1 | .wp-block-ub-feature-box{margin:20px 0 20px 0;max-width:100%}.ub_feature_upload_button>button{display:flex !important;align-items:center;margin-left:auto !important;margin-right:auto !important}.ub_feature_upload_button>p{font-size:12px;text-align:justify;margin:5px 0 0 3px} -------------------------------------------------------------------------------- /src/blocks/feature-box/editor.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * #.# Editor Styles 3 | * 4 | * CSS for just Backend enqueued after style.scss 5 | * which makes it higher in priority. 6 | */ 7 | 8 | .wp-block-ub-feature-box { 9 | margin: 20px 0 20px 0; 10 | max-width: 100%; 11 | } 12 | 13 | .ub_feature_upload_button { 14 | >button { 15 | display: flex !important; 16 | align-items: center; 17 | margin-left: auto !important; 18 | margin-right: auto !important; 19 | } 20 | >p { 21 | font-size: 12px; 22 | text-align: justify; 23 | margin: 5px 0 0 3px; 24 | } 25 | } -------------------------------------------------------------------------------- /src/blocks/feature-box/icons/remove_icon.js: -------------------------------------------------------------------------------- 1 | const remove_icon = 2 | 5 | ; 6 | 7 | export default remove_icon; -------------------------------------------------------------------------------- /src/blocks/how-to/block.js: -------------------------------------------------------------------------------- 1 | import icon from "./icon"; 2 | import { EditorComponent } from "./components"; 3 | 4 | import { registerBlockType } from "@wordpress/blocks"; 5 | import metadata from "./block.json"; 6 | registerBlockType(metadata.name, { 7 | ...metadata, 8 | attributes: metadata.attributes, 9 | icon: icon, 10 | example: {}, 11 | edit: EditorComponent, 12 | save: () => null, 13 | }); 14 | -------------------------------------------------------------------------------- /src/blocks/how-to/get-styles.js: -------------------------------------------------------------------------------- 1 | import { omitBy, isUndefined, trim, isEmpty } from "lodash"; 2 | import { getSpacingCss } from "../utils/styling-helpers"; 3 | 4 | export function getStyles(attributes) { 5 | const { padding, margin } = attributes; 6 | const paddingObj = getSpacingCss(padding); 7 | const marginObj = getSpacingCss(margin); 8 | 9 | let styles = { 10 | paddingTop: paddingObj?.top, 11 | paddingRight: paddingObj?.right, 12 | paddingBottom: paddingObj?.bottom, 13 | paddingLeft: paddingObj?.left, 14 | marginTop: marginObj?.top, 15 | marginRight: marginObj?.right, 16 | marginBottom: marginObj?.bottom, 17 | marginLeft: marginObj?.left, 18 | }; 19 | 20 | return omitBy( 21 | styles, 22 | (value) => 23 | value === false || 24 | isEmpty(value) || 25 | isUndefined(value) || 26 | trim(value) === "" || 27 | trim(value) === "undefined undefined undefined" 28 | ); 29 | } 30 | -------------------------------------------------------------------------------- /src/blocks/how-to/style.css: -------------------------------------------------------------------------------- 1 | .ub_howto-step-image,.ub_howto-yield-image{width:100%;height:auto}.ub_howto-supplies-list img,.ub_howto-tools-list img{max-width:200px}.ub_howto-section-display{margin-left:1em}.ub_howto figcaption{margin-top:5px;text-align:center}.ub_howto-step-display .ub_howto-step{list-style-position:outside}.ub_howto-step{overflow:auto}.ub_howto-step>figure,.ub_howto-step>img{margin-bottom:10px}.ub_howto-yield{overflow:auto}@media screen and (max-width: 767px){.ub_howto .ub_howto-steps-list .ub_howto-step>figure,.ub_howto .ub_howto-section .ub_howto-steps-list .ub_howto-step>figure,.ub_howto .ub_howto-step-display .ub_howto-step>figure,.ub_howto .ub_howto-section .ub_howto-step-display .ub_howto-step>figure{width:100%;float:none}} -------------------------------------------------------------------------------- /src/blocks/how-to/style.scss: -------------------------------------------------------------------------------- 1 | .ub_howto-step-image, 2 | .ub_howto-yield-image { 3 | width: 100%; 4 | height: auto; 5 | } 6 | 7 | .ub_howto-supplies-list, 8 | .ub_howto-tools-list { 9 | img { 10 | max-width: 200px; 11 | } 12 | } 13 | 14 | .ub_howto-section-display { 15 | margin-left: 1em; 16 | } 17 | 18 | .ub_howto figcaption { 19 | margin-top: 5px; 20 | text-align: center; 21 | } 22 | 23 | .ub_howto-step-display .ub_howto-step { 24 | list-style-position: outside; 25 | } 26 | 27 | .ub_howto-step { 28 | overflow: auto; 29 | > figure, 30 | > img { 31 | margin-bottom: 10px; 32 | } 33 | } 34 | 35 | .ub_howto-yield { 36 | overflow: auto; 37 | } 38 | 39 | @media screen and (max-width: 767px) { 40 | .ub_howto { 41 | .ub_howto-steps-list, 42 | .ub_howto-section .ub_howto-steps-list, 43 | .ub_howto-step-display, 44 | .ub_howto-section .ub_howto-step-display { 45 | .ub_howto-step > figure { 46 | width: 100%; 47 | float: none; 48 | } 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/blocks/icon-inner/block.js: -------------------------------------------------------------------------------- 1 | import { __ } from '@wordpress/i18n'; 2 | import registerPluginBlock from '$Inc/registerPluginBlock'; 3 | import UbIcon from './components/UbIcon'; 4 | import { UbIconComponent } from '$Library/ub-common/Components'; 5 | 6 | registerPluginBlock('ub/icon-innerblock', { 7 | title: __('Icon', 'ultimate-blocks'), 8 | category: 'ultimateblocks', 9 | icon: 'dashicons-admin-tools', 10 | supports: { 11 | inserter: false, 12 | }, 13 | edit: (props) => { 14 | const { attributes, setAttributes } = props; 15 | const { iconName, size } = attributes; 16 | 17 | return ( 18 | 23 | ); 24 | }, 25 | save: ({ attributes }) => { 26 | const { iconName, size } = attributes; 27 | 28 | return ; 29 | }, 30 | }); 31 | -------------------------------------------------------------------------------- /src/blocks/icon-inner/block.php: -------------------------------------------------------------------------------- 1 | $defaultValues[ $block_type_id ]['attributes'], 15 | 'render_callback' => null 16 | ] ); 17 | 18 | } 19 | 20 | } 21 | 22 | add_action( 'init', 'register_icon_inner', 10, 1 ); 23 | -------------------------------------------------------------------------------- /src/blocks/icon-inner/components/UbIcon.js: -------------------------------------------------------------------------------- 1 | import React, { Fragment } from 'react'; 2 | import UbIconInspector from './UbIconInspector'; 3 | import { UbIconComponent } from '$Library/ub-common/Components'; 4 | 5 | /** 6 | * Icon main component. 7 | * 8 | * @param {Object} props component properties 9 | * @param {string} props.iconName icon name 10 | * @param {Function} props.setAttributes block attribute update function 11 | * @param {number} props.size icon size 12 | * @function Object() { [native code] } 13 | */ 14 | function UbIcon({ iconName, size, setAttributes }) { 15 | return ( 16 | 17 | 18 | 23 | 24 | ); 25 | } 26 | 27 | /** 28 | * @module UbIcon 29 | */ 30 | export default UbIcon; 31 | -------------------------------------------------------------------------------- /src/blocks/icon-inner/editor.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DotCamp/ultimate-blocks-legacy/2b16e312c3baef65100147ae9487022d771b81b5/src/blocks/icon-inner/editor.css -------------------------------------------------------------------------------- /src/blocks/icon-inner/editor.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DotCamp/ultimate-blocks-legacy/2b16e312c3baef65100147ae9487022d771b81b5/src/blocks/icon-inner/editor.scss -------------------------------------------------------------------------------- /src/blocks/icon-inner/style.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DotCamp/ultimate-blocks-legacy/2b16e312c3baef65100147ae9487022d771b81b5/src/blocks/icon-inner/style.css -------------------------------------------------------------------------------- /src/blocks/icon-inner/style.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DotCamp/ultimate-blocks-legacy/2b16e312c3baef65100147ae9487022d771b81b5/src/blocks/icon-inner/style.scss -------------------------------------------------------------------------------- /src/blocks/icon/block.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress Dependencies 3 | */ 4 | import { __ } from "@wordpress/i18n"; 5 | import registerPluginBlock from "$Inc/registerPluginBlock"; 6 | 7 | /** 8 | * Custom Imports 9 | */ 10 | import { blockIcon } from "./icons/block-icon"; 11 | import Edit from "./edit"; 12 | import Save from "./save"; 13 | import metadata from "./block.json"; 14 | import "./blocks-styles"; 15 | 16 | registerPluginBlock(metadata.name, { 17 | ...metadata, 18 | icon: blockIcon, 19 | attributes: metadata.attributes, 20 | edit: Edit, 21 | save: Save, 22 | example: { 23 | attributes: { 24 | icon: { 25 | iconName: "wordpress", 26 | type: "wordpress", 27 | }, 28 | size: "84px", 29 | iconColor: "#ffffff", 30 | iconBackground: "#e11b4c", 31 | justification: "center", 32 | }, 33 | }, 34 | }); 35 | -------------------------------------------------------------------------------- /src/blocks/icon/blocks-styles.js: -------------------------------------------------------------------------------- 1 | import { __ } from "@wordpress/i18n"; 2 | 3 | const styles = [ 4 | { 5 | name: "default", 6 | isDefault: true, 7 | label: __("Default", "ultimate-blocks"), 8 | }, 9 | { 10 | name: "circle-fill", 11 | label: __("Circle Fill", "ultimate-blocks"), 12 | }, 13 | { 14 | name: "circle-outline", 15 | label: __("Circle Outline", "ultimate-blocks"), 16 | }, 17 | { 18 | name: "square-fill", 19 | label: __("Square Fill", "ultimate-blocks"), 20 | }, 21 | { 22 | name: "square-outline", 23 | label: __("Square Outline", "ultimate-blocks"), 24 | }, 25 | ]; 26 | 27 | styles.forEach((style) => { 28 | wp.blocks.registerBlockStyle("ub/icon", style); 29 | }); 30 | -------------------------------------------------------------------------------- /src/blocks/icon/components/icon-library/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress Dependencies 3 | */ 4 | import { useState } from "@wordpress/element"; 5 | 6 | /** 7 | * Custom Dependencies 8 | */ 9 | import Content from "./LibraryContent"; 10 | import Sidebar from "./LibrarySidebar"; 11 | 12 | function IconsLibrary(props) { 13 | const [search, setSearch] = useState(""); 14 | const [subCategoryFilter, setSubCategoryFilter] = useState(""); 15 | const [mainCategoryFilter, setMainCategoryFilter] = useState("wordpress"); 16 | 17 | return ( 18 |
19 | 27 | 34 |
35 | ); 36 | } 37 | 38 | export default IconsLibrary; 39 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/font-awesome/index.js: -------------------------------------------------------------------------------- 1 | export { default as fontAwesomeCategories } from "./categories"; 2 | export { default as fontAwesomeIcons } from "./icons"; 3 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/bandcamp.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | 5 | import { Path, SVG } from '@wordpress/primitives'; 6 | 7 | export const bandcamp = ( 8 | 9 | 10 | 11 | ); 12 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/deviantart.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Path, SVG } from '@wordpress/primitives'; 5 | 6 | export const deviantart = ( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/dropbox.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Path, SVG } from '@wordpress/primitives'; 5 | 6 | export const dropbox = ( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/etsy.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Path, SVG } from '@wordpress/primitives'; 5 | 6 | export const etsy = ( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/facebook.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Path, SVG } from '@wordpress/primitives'; 5 | 6 | export const facebook = ( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/feed.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Path, SVG } from '@wordpress/primitives'; 5 | 6 | export const feed = ( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/flickr.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Path, SVG } from '@wordpress/primitives'; 5 | 6 | export const flickr = ( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/foursquare.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Path, SVG } from '@wordpress/primitives'; 5 | 6 | export const foursquare = ( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/github.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Path, SVG } from '@wordpress/primitives'; 5 | 6 | export const github = ( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/google.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Path, SVG } from '@wordpress/primitives'; 5 | 6 | export const google = ( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/linkedin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Path, SVG } from '@wordpress/primitives'; 5 | 6 | export const linkedin = ( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/mail.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Path, SVG } from '@wordpress/primitives'; 5 | 6 | export const mail = ( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/mastodon.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Path, SVG } from '@wordpress/primitives'; 5 | 6 | export const mastodon = ( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/medium.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Path, SVG } from '@wordpress/primitives'; 5 | 6 | export const medium = ( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/patreon.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Circle, Rect, SVG } from '@wordpress/primitives'; 5 | 6 | export const patreon = ( 7 | 8 | 9 | 10 | 11 | ); 12 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/pinterest.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Path, SVG } from '@wordpress/primitives'; 5 | 6 | export const pinterest = ( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/pocket.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Path, SVG } from '@wordpress/primitives'; 5 | 6 | export const pocket = ( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/spotify.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Path, SVG } from '@wordpress/primitives'; 5 | 6 | export const spotify = ( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/tiktok.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Path, SVG } from '@wordpress/primitives'; 5 | 6 | export const tiktok = ( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/tumblr.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Path, SVG } from '@wordpress/primitives'; 5 | 6 | export const tumblr = ( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/twitch.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Path, SVG } from '@wordpress/primitives'; 5 | 6 | export const twitch = ( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/twitter.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Path, SVG } from '@wordpress/primitives'; 5 | 6 | export const twitter = ( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/vimeo.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Path, SVG } from '@wordpress/primitives'; 5 | 6 | export const vimeo = ( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/blocks/icon/icons/wordpress/social/youtube.js: -------------------------------------------------------------------------------- 1 | /** 2 | * WordPress dependencies 3 | */ 4 | import { Path, SVG } from '@wordpress/primitives'; 5 | 6 | export const youtube = ( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/blocks/icon/utils.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * @param {string} svgString 4 | * 5 | * @returns {true|false} true if valid false is not valid 6 | */ 7 | export function isValidSVG(svgString) { 8 | const parser = new DOMParser(); 9 | const svgDoc = parser.parseFromString(svgString.trim(), "image/svg+xml"); 10 | const errors = svgDoc.getElementsByTagName("parsererror"); 11 | 12 | return errors.length === 0; 13 | } 14 | -------------------------------------------------------------------------------- /src/blocks/image-slider/editor.scss: -------------------------------------------------------------------------------- 1 | @import "../../common"; 2 | .wp-block-ub-image-slider { 3 | width: 100%; 4 | } 5 | div[data-block] > .ub_image_slider { 6 | display: block; 7 | .components-placeholder { 8 | &__fieldset { 9 | display: flex; 10 | justify-content: center; 11 | } 12 | &__label { 13 | margin: 5px auto; 14 | } 15 | &__instructions { 16 | text-align: center; 17 | margin: auto; 18 | } 19 | } 20 | } 21 | 22 | :not(.is-selected) > .ub_image_slider { 23 | margin-bottom: 50px; 24 | } 25 | 26 | .ub_image_slider_url_input { 27 | width: 300px; 28 | margin: auto; 29 | } 30 | 31 | .ub_image_slider_extra { 32 | height: 100%; 33 | } 34 | 35 | .ub_image_slider { 36 | .editor-rich-text { 37 | padding-left: 10px; 38 | padding-right: 10px; 39 | } 40 | } 41 | .ub_image_slider_add_images { 42 | display: block; 43 | top: 50%; 44 | left: 50%; 45 | position: absolute; 46 | transform: translate(-50%, -50%); 47 | } 48 | -------------------------------------------------------------------------------- /src/blocks/image-slider/front.js: -------------------------------------------------------------------------------- 1 | Array.prototype.slice 2 | .call(document.getElementsByClassName("ub_image_slider")) 3 | .forEach((instance) => { 4 | const swiper = new Swiper( 5 | `#${instance.id}`, 6 | JSON.parse(instance.dataset.swiperData) 7 | ); 8 | 9 | instance 10 | ?.getElementsByClassName("swiper-button-next")[0] 11 | ?.addEventListener("keydown", (e) => { 12 | if (e.key === " ") { 13 | e.preventDefault(); 14 | } 15 | }); 16 | 17 | instance 18 | ?.getElementsByClassName("swiper-button-prev")[0] 19 | ?.addEventListener("keydown", (e) => { 20 | if (e.key === " ") { 21 | e.preventDefault(); 22 | } 23 | }); 24 | 25 | Array.prototype.slice 26 | .call(instance.getElementsByClassName("swiper-pagination-bullet")) 27 | .forEach((bullet) => { 28 | bullet.addEventListener("keydown", (e) => { 29 | if (e.key === " ") { 30 | e.preventDefault(); 31 | } 32 | }); 33 | }); 34 | }); 35 | -------------------------------------------------------------------------------- /src/blocks/notification-box/block.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://schemas.wp.org/trunk/block.json", 3 | "apiVersion": 3, 4 | "name": "ub/notification-box-block", 5 | "title": "Notification Box", 6 | "category": "ultimateblocks", 7 | "description": "", 8 | "keywords": [ 9 | "notification", 10 | "warning info", 11 | "Ultimate Blocks" 12 | ], 13 | "attributes": { 14 | "blockID": { 15 | "type": "string", 16 | "default": "" 17 | }, 18 | "ub_notify_info": { 19 | "type": "string", 20 | "default": "" 21 | }, 22 | "ub_selected_notify": { 23 | "type": "string", 24 | "default": "ub_notify_info" 25 | }, 26 | "align": { 27 | "type": "string", 28 | "default": "left" 29 | } 30 | }, 31 | "supports": { 32 | "inserter": false 33 | } 34 | } -------------------------------------------------------------------------------- /src/blocks/notification-box/block.php: -------------------------------------------------------------------------------- 1 | 6 |
8 |

'. wp_kses_post($ub_notify_info) .'

9 |
10 |
'; 11 | } 12 | 13 | function ub_register_notification_box_block() { 14 | if ( function_exists( 'register_block_type_from_metadata' ) ) { 15 | require dirname(dirname(__DIR__)) . '/defaults.php'; 16 | register_block_type_from_metadata( dirname(dirname(dirname(__DIR__))) . '/dist/blocks/notification-box', array( 17 | 'attributes' => $defaultValues['ub/notification-box-block']['attributes'], 18 | 'render_callback' => 'ub_render_notification_box_block')); 19 | } 20 | } 21 | 22 | add_action('init', 'ub_register_notification_box_block'); 23 | -------------------------------------------------------------------------------- /src/blocks/notification-box/icons/success.js: -------------------------------------------------------------------------------- 1 | const success = ( 2 | 8 | 12 | 16 | 17 | ); 18 | 19 | export default success; 20 | -------------------------------------------------------------------------------- /src/blocks/notification-box/icons/warning.js: -------------------------------------------------------------------------------- 1 | const warning = ( 2 | 8 | 12 | 16 | 17 | 18 | ); 19 | 20 | export default warning; 21 | -------------------------------------------------------------------------------- /src/blocks/notification-box/style.css: -------------------------------------------------------------------------------- 1 | .ub_notify_info,.ub_notify_success,.ub_notify_warning{margin:10px 0px;padding:15px;border-left-width:4px;border-left-style:solid}.ub_notify_info .ub_notify_text,.ub_notify_success .ub_notify_text,.ub_notify_warning .ub_notify_text{margin:0 auto}.ub_notify_info{color:#31708f;background-color:#d9edf7;border-left-color:#31708f}.ub_notify_success{color:#3c763d;background-color:#dff0d8;border-left-color:#3c763d}.ub_notify_warning{color:#d8000c;background-color:#ffd2d2;border-left-color:#d8000c} -------------------------------------------------------------------------------- /src/blocks/notification-box/style.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * #.# Styles 3 | * 4 | * CSS for both Frontend+Backend. 5 | */ 6 | .ub_notify_info, 7 | .ub_notify_success, 8 | .ub_notify_warning { 9 | margin: 10px 0px; 10 | padding: 15px; 11 | border-left-width: 4px; 12 | border-left-style: solid; 13 | .ub_notify_text { 14 | margin: 0 auto; 15 | } 16 | } 17 | 18 | .ub_notify_info { 19 | color: #31708f; 20 | background-color: #d9edf7; 21 | border-left-color: #31708f; 22 | } 23 | 24 | .ub_notify_success { 25 | color: #3c763d; 26 | background-color: #dff0d8; 27 | border-left-color: #3c763d; 28 | } 29 | 30 | .ub_notify_warning { 31 | color: #d8000c; 32 | background-color: #ffd2d2; 33 | border-left-color: #d8000c; 34 | } 35 | -------------------------------------------------------------------------------- /src/blocks/number-box/editor.css: -------------------------------------------------------------------------------- 1 | .wp-block-ub-number-box{margin:0 auto} -------------------------------------------------------------------------------- /src/blocks/number-box/editor.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * #.# Editor Styles 3 | * 4 | * CSS for just Backend enqueued after style.scss 5 | * which makes it higher in priority. 6 | */ 7 | 8 | .wp-block-ub-number-box { 9 | margin: 0 auto; 10 | } 11 | -------------------------------------------------------------------------------- /src/blocks/number-box/icons/icon.js: -------------------------------------------------------------------------------- 1 | const icon = ( 2 | 8 | 12 | 16 | 17 | ); 18 | 19 | export default icon; 20 | -------------------------------------------------------------------------------- /src/blocks/post-grid/editor.css: -------------------------------------------------------------------------------- 1 | .ub-autocomplete-container{margin-bottom:5px}.ub-autocomplete-selection{border:1px solid #000;margin:4px;padding:2px;border-radius:4px}.ub-autocomplete-list{position:absolute;z-index:1;max-height:100px;overflow-y:scroll}.ub-autocomplete-list>div:nth-child(odd){background-color:#eee}.ub-autocomplete-list>div:nth-child(even){background-color:#fff}.ub-autocomplete-list>div:focus{background-color:#aaa}.ub-block-post-grid-excerpt>div>p:last-child{margin-bottom:0} -------------------------------------------------------------------------------- /src/blocks/post-grid/editor.scss: -------------------------------------------------------------------------------- 1 | .ub-autocomplete-container { 2 | margin-bottom: 5px; 3 | } 4 | 5 | .ub-autocomplete-selection { 6 | border: 1px solid black; 7 | margin: 4px; 8 | padding: 2px; 9 | border-radius: 4px; 10 | } 11 | 12 | .ub-autocomplete-list { 13 | position: absolute; 14 | z-index: 1; 15 | max-height: 100px; 16 | overflow-y: scroll; 17 | > div { 18 | &:nth-child(odd) { 19 | background-color: #eeeeee; 20 | } 21 | &:nth-child(even) { 22 | background-color: #ffffff; 23 | } 24 | &:focus { 25 | background-color: #aaaaaa; 26 | } 27 | } 28 | } 29 | 30 | .ub-block-post-grid-excerpt > div > p:last-child { 31 | margin-bottom: 0; 32 | } 33 | -------------------------------------------------------------------------------- /src/blocks/progress-bar/blocks-styles.js: -------------------------------------------------------------------------------- 1 | import { __ } from "@wordpress/i18n"; 2 | 3 | const styles = [ 4 | { 5 | name: "ub-progress-bar-line-wrapper", 6 | isDefault: true, 7 | label: __("Line", "ultimate-blocks"), 8 | }, 9 | { 10 | name: "ub-progress-bar-circle-wrapper", 11 | label: __("Circle", "ultimate-blocks"), 12 | }, 13 | { 14 | name: "ub-progress-bar-half-circle-wrapper", 15 | label: __("Half Circle", "ultimate-blocks"), 16 | }, 17 | ]; 18 | 19 | styles.forEach((style) => { 20 | wp.blocks.registerBlockStyle("ub/progress-bar", style); 21 | }); 22 | -------------------------------------------------------------------------------- /src/blocks/progress-bar/front.build.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | document.addEventListener("DOMContentLoaded", function () { 4 | setTimeout(function () { 5 | Array.prototype.slice.call(document.getElementsByClassName("ub_progress-bar")).forEach(function (instance) { 6 | instance.classList.add("ub_progress-bar-filled"); 7 | }); 8 | }, 500); 9 | }); -------------------------------------------------------------------------------- /src/blocks/progress-bar/front.js: -------------------------------------------------------------------------------- 1 | document.addEventListener("DOMContentLoaded", function() { 2 | setTimeout(() => { 3 | Array.prototype.slice 4 | .call(document.getElementsByClassName("ub_progress-bar")) 5 | .forEach(instance => { 6 | instance.classList.add("ub_progress-bar-filled"); 7 | }); 8 | }, 500); 9 | }); 10 | -------------------------------------------------------------------------------- /src/blocks/review/get-styles.js: -------------------------------------------------------------------------------- 1 | import { omitBy, isUndefined, trim, isEmpty } from "lodash"; 2 | import { getSpacingCss } from "../utils/styling-helpers"; 3 | 4 | export function getStyles(attributes) { 5 | const { padding, margin, summaryTitleFontSize, mainTitleFontSize } = 6 | attributes; 7 | const paddingObj = getSpacingCss(padding); 8 | const marginObj = getSpacingCss(margin); 9 | 10 | let styles = { 11 | paddingTop: paddingObj?.top, 12 | paddingRight: paddingObj?.right, 13 | paddingBottom: paddingObj?.bottom, 14 | paddingLeft: paddingObj?.left, 15 | marginTop: marginObj?.top, 16 | marginRight: marginObj?.right, 17 | marginBottom: marginObj?.bottom, 18 | marginLeft: marginObj?.left, 19 | "--ub-review-summary-title-font-size": summaryTitleFontSize, 20 | "--ub-review-title-font-size": mainTitleFontSize, 21 | }; 22 | 23 | return omitBy( 24 | styles, 25 | (value) => 26 | value === false || 27 | isEmpty(value) || 28 | isUndefined(value) || 29 | trim(value) === "" || 30 | trim(value) === "undefined undefined undefined", 31 | ); 32 | } 33 | -------------------------------------------------------------------------------- /src/blocks/review/save.js: -------------------------------------------------------------------------------- 1 | import { InnerBlocks } from "@wordpress/block-editor"; 2 | function Save() { 3 | return ; 4 | } 5 | export default Save; 6 | -------------------------------------------------------------------------------- /src/blocks/social-share/editor.css: -------------------------------------------------------------------------------- 1 | .wp-block-ub-social-share .social-share-icons .social-share-icon{cursor:move;transition:all .2s ease-in-out}.ub-social-share-icon{display:flex;align-items:center;justify-content:center} -------------------------------------------------------------------------------- /src/blocks/social-share/editor.scss: -------------------------------------------------------------------------------- 1 | .wp-block-ub-social-share .social-share-icons { 2 | .social-share-icon { 3 | cursor: move; 4 | transition: all 0.2s ease-in-out; 5 | } 6 | } 7 | 8 | .ub-social-share-icon { 9 | display: flex; 10 | align-items: center; 11 | justify-content: center; 12 | } 13 | -------------------------------------------------------------------------------- /src/blocks/social-share/get-styles.js: -------------------------------------------------------------------------------- 1 | import { omitBy, isUndefined, trim, isEmpty } from "lodash"; 2 | import { getSpacingCss } from "../utils/styling-helpers"; 3 | 4 | export function getStyles(attributes) { 5 | const { padding, margin } = attributes; 6 | const paddingObj = getSpacingCss(padding); 7 | const marginObj = getSpacingCss(margin); 8 | 9 | let styles = { 10 | paddingTop: paddingObj?.top, 11 | paddingRight: paddingObj?.right, 12 | paddingBottom: paddingObj?.bottom, 13 | paddingLeft: paddingObj?.left, 14 | marginTop: marginObj?.top, 15 | marginRight: marginObj?.right, 16 | marginBottom: marginObj?.bottom, 17 | marginLeft: marginObj?.left, 18 | }; 19 | 20 | return omitBy( 21 | styles, 22 | (value) => 23 | value === false || 24 | isEmpty(value) || 25 | isUndefined(value) || 26 | trim(value) === "" || 27 | trim(value) === "undefined undefined undefined" 28 | ); 29 | } 30 | -------------------------------------------------------------------------------- /src/blocks/star-rating/get-styles.js: -------------------------------------------------------------------------------- 1 | import { omitBy, isUndefined, trim, isEmpty } from "lodash"; 2 | import { 3 | getSpacingCss, 4 | getSpacingPresetCssVar, 5 | } from "../utils/styling-helpers"; 6 | 7 | export function getStyles(attributes) { 8 | const { padding, margin, textFontSize } = attributes; 9 | const paddingObj = getSpacingCss(padding); 10 | const marginObj = getSpacingCss(margin); 11 | const gap = getSpacingPresetCssVar(attributes.gap?.all) ?? ""; 12 | 13 | let styles = { 14 | paddingTop: paddingObj?.top, 15 | paddingRight: paddingObj?.right, 16 | paddingBottom: paddingObj?.bottom, 17 | paddingLeft: paddingObj?.left, 18 | marginTop: marginObj?.top, 19 | marginRight: marginObj?.right, 20 | marginBottom: marginObj?.bottom, 21 | marginLeft: marginObj?.left, 22 | "--ub-star-rating-font-size": textFontSize, 23 | "--ub-star-rating-gap": gap, 24 | }; 25 | 26 | return omitBy( 27 | styles, 28 | (value) => 29 | value === false || 30 | isEmpty(value) || 31 | isUndefined(value) || 32 | trim(value) === "" || 33 | trim(value) === "undefined undefined undefined", 34 | ); 35 | } 36 | -------------------------------------------------------------------------------- /src/blocks/styled-box/get-styles.js: -------------------------------------------------------------------------------- 1 | import { omitBy, isUndefined, trim, isEmpty } from "lodash"; 2 | import { getSpacingCss } from "../utils/styling-helpers"; 3 | 4 | export function getStyles(attributes) { 5 | const { padding, margin } = attributes; 6 | const paddingObj = getSpacingCss(padding); 7 | const marginObj = getSpacingCss(margin); 8 | 9 | let styles = { 10 | paddingTop: paddingObj?.top, 11 | paddingRight: paddingObj?.right, 12 | paddingBottom: paddingObj?.bottom, 13 | paddingLeft: paddingObj?.left, 14 | marginTop: marginObj?.top, 15 | marginRight: marginObj?.right, 16 | marginBottom: marginObj?.bottom, 17 | marginLeft: marginObj?.left, 18 | }; 19 | 20 | return omitBy( 21 | styles, 22 | (value) => 23 | value === false || 24 | isEmpty(value) || 25 | isUndefined(value) || 26 | trim(value) === "" || 27 | trim(value) === "undefined undefined undefined" 28 | ); 29 | } 30 | -------------------------------------------------------------------------------- /src/blocks/styled-box/styled-box-border/block.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://schemas.wp.org/trunk/block.json", 3 | "apiVersion": 3, 4 | "name": "ub/styled-box-bordered-content", 5 | "title": "Bordered Box Content", 6 | "parent": [ 7 | "ub/styled-box" 8 | ], 9 | "category": "ultimateblocks", 10 | "description": "", 11 | "attributes": {}, 12 | "supports": { 13 | "inserter": false, 14 | "reusable": false 15 | } 16 | } -------------------------------------------------------------------------------- /src/blocks/styled-box/styled-box-notification/block.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://schemas.wp.org/trunk/block.json", 3 | "apiVersion": 3, 4 | "name": "ub/styled-box-notification-content", 5 | "title": "Notification Box Content", 6 | "parent": [ 7 | "ub/styled-box" 8 | ], 9 | "category": "ultimateblocks", 10 | "description": "", 11 | "attributes": {}, 12 | "supports": { 13 | "inserter": false, 14 | "reusable": false 15 | } 16 | } -------------------------------------------------------------------------------- /src/blocks/styled-box/styled-box-number/block.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://schemas.wp.org/trunk/block.json", 3 | "apiVersion": 3, 4 | "name": "ub/styled-box-numbered-content", 5 | "title": "Numbered Box Content", 6 | "parent": [ 7 | "ub/styled-box" 8 | ], 9 | "category": "ultimateblocks", 10 | "description": "", 11 | "attributes": {}, 12 | "supports": { 13 | "inserter": false, 14 | "reusable": false 15 | } 16 | } -------------------------------------------------------------------------------- /src/blocks/styled-list/editor.css: -------------------------------------------------------------------------------- 1 | .ub-styled-list-available-icon{display:inline}.editor-styles-wrapper .ub_styled_list ul{margin-left:0}.editor-styles-wrapper .ub_styled_list .fa-ul>li{list-style:none;display:inline-block;width:100%}.block-editor-block-list__block.wp-block>ul,.block-editor-block-list__block.wp-block[data-type="ub/styled-list-item"]{margin-top:0;margin-bottom:0}.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="ub/styled-list"]>ul{padding-left:2em} -------------------------------------------------------------------------------- /src/blocks/styled-list/editor.scss: -------------------------------------------------------------------------------- 1 | .ub-styled-list-available-icon { 2 | display: inline; 3 | } 4 | 5 | .editor-styles-wrapper .ub_styled_list { 6 | ul { 7 | margin-left: 0; 8 | } 9 | .fa-ul > li { 10 | list-style: none; 11 | display: inline-block; 12 | width: 100%; 13 | } 14 | } 15 | 16 | .block-editor-block-list__block.wp-block { 17 | > ul, 18 | &[data-type="ub/styled-list-item"] { 19 | margin-top: 0; 20 | margin-bottom: 0; 21 | } 22 | } 23 | 24 | .block-editor-inner-blocks 25 | > .block-editor-block-list__layout 26 | > [data-type="ub/styled-list"] 27 | > ul { 28 | padding-left: 2em; 29 | } 30 | -------------------------------------------------------------------------------- /src/blocks/styled-list/get-styles.js: -------------------------------------------------------------------------------- 1 | import { omitBy, isUndefined, trim, isEmpty } from "lodash"; 2 | import { getSpacingCss } from "../utils/styling-helpers"; 3 | 4 | export function getStyles(attributes) { 5 | const { padding, margin, backgroundColor } = attributes; 6 | const paddingObj = getSpacingCss(padding); 7 | const marginObj = getSpacingCss(margin); 8 | 9 | let styles = { 10 | backgroundColor: backgroundColor, 11 | paddingTop: paddingObj?.top, 12 | paddingRight: paddingObj?.right, 13 | paddingBottom: paddingObj?.bottom, 14 | paddingLeft: paddingObj?.left, 15 | marginTop: marginObj?.top, 16 | marginRight: marginObj?.right, 17 | marginBottom: marginObj?.bottom, 18 | marginLeft: marginObj?.left, 19 | }; 20 | 21 | return omitBy( 22 | styles, 23 | (value) => 24 | value === false || 25 | isEmpty(value) || 26 | isUndefined(value) || 27 | trim(value) === "" || 28 | trim(value) === "undefined undefined undefined" 29 | ); 30 | } 31 | -------------------------------------------------------------------------------- /src/blocks/styled-list/style.css: -------------------------------------------------------------------------------- 1 | .ub_styled_list .fa-ul{list-style-type:none;margin-left:1em;padding-left:0;display:grid;column-gap:2em}.ub_styled_list .fa-ul>li{position:relative;list-style:none;margin-left:.5em;margin-right:.5em}.ub_styled_list .fa-li{display:inline-block;left:-0.5em;position:relative}.ub_styled_list li::before{content:"";position:relative;left:-0.5em;display:inline-block;background-repeat:no-repeat}ul.ub_styled_list[id^=ub-styled-list-],ul.ub_styled_list[id^=ub_styled_list-]{list-style-type:none;margin-left:0;padding-left:0}ul.ub_styled_list[id^=ub-styled-list-] li,ul.ub_styled_list[id^=ub_styled_list-] li{position:relative;list-style:none;margin-left:.5em;margin-right:.5em} -------------------------------------------------------------------------------- /src/blocks/styled-list/style.scss: -------------------------------------------------------------------------------- 1 | .ub_styled_list { 2 | .fa-ul { 3 | list-style-type: none; 4 | margin-left: 1em; 5 | padding-left: 0; 6 | display: grid; 7 | column-gap: 2em; 8 | > li { 9 | position: relative; 10 | list-style: none; 11 | margin-left: 0.5em; 12 | margin-right: 0.5em; 13 | } 14 | } 15 | .fa-li { 16 | display: inline-block; 17 | left: -0.5em; 18 | position: relative; 19 | } 20 | li::before { 21 | content: ""; 22 | position: relative; 23 | left: -0.5em; 24 | display: inline-block; 25 | background-repeat: no-repeat; 26 | } 27 | } 28 | ul.ub_styled_list[id^="ub-styled-list-"], 29 | ul.ub_styled_list[id^="ub_styled_list-"] { 30 | list-style-type: none; 31 | margin-left: 0; 32 | padding-left: 0; 33 | //display: grid; 34 | //column-gap: 2em; 35 | li { 36 | position: relative; 37 | list-style: none; 38 | margin-left: 0.5em; 39 | margin-right: 0.5em; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/blocks/tabbed-content/components/block.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://schemas.wp.org/trunk/block.json", 3 | "apiVersion": 3, 4 | "name": "ub/tab-block", 5 | "title": "Tab", 6 | "parent": [ 7 | "ub/tabbed-content-block" 8 | ], 9 | "category": "ultimateblocks", 10 | "description": "Content of tab", 11 | "keywords": [ 12 | "Tabbed Content", 13 | "Tabs", 14 | "Ultimate Blocks" 15 | ], 16 | "attributes": { 17 | "index": { 18 | "type": "number", 19 | "default": 0 20 | }, 21 | "isActive": { 22 | "type": "boolean", 23 | "default": true 24 | }, 25 | "parentID": { 26 | "type": "string", 27 | "default": "" 28 | } 29 | }, 30 | "supports": { 31 | "inserter": false, 32 | "reusable": false 33 | } 34 | } -------------------------------------------------------------------------------- /src/blocks/tabbed-content/get-style.js: -------------------------------------------------------------------------------- 1 | import { omitBy, isUndefined, trim, isEmpty } from "lodash"; 2 | import { getSpacingCss } from "../utils/styling-helpers"; 3 | 4 | export function getStyles(attributes) { 5 | const { padding, margin, contentColor, contentBackground } = attributes; 6 | const paddingObj = getSpacingCss(padding); 7 | const marginObj = getSpacingCss(margin); 8 | 9 | let styles = { 10 | paddingTop: paddingObj?.top, 11 | paddingRight: paddingObj?.right, 12 | paddingBottom: paddingObj?.bottom, 13 | paddingLeft: paddingObj?.left, 14 | marginTop: marginObj?.top, 15 | marginRight: marginObj?.right, 16 | marginBottom: marginObj?.bottom, 17 | marginLeft: marginObj?.left, 18 | "--ub-tab-content-color": contentColor, 19 | "--ub-tab-content-background": contentBackground, 20 | }; 21 | 22 | return omitBy( 23 | styles, 24 | (value) => 25 | value === false || 26 | isEmpty(value) || 27 | isUndefined(value) || 28 | trim(value) === "" || 29 | trim(value) === "undefined undefined undefined", 30 | ); 31 | } 32 | -------------------------------------------------------------------------------- /src/blocks/table-of-contents/get-style.js: -------------------------------------------------------------------------------- 1 | import { omitBy, isUndefined, trim, isEmpty } from "lodash"; 2 | import { getSpacingCss } from "../utils/styling-helpers"; 3 | 4 | export function getStyles(attributes) { 5 | const { padding, margin } = attributes; 6 | const paddingObj = getSpacingCss(padding); 7 | const marginObj = getSpacingCss(margin); 8 | 9 | let styles = { 10 | paddingTop: paddingObj?.top, 11 | paddingRight: paddingObj?.right, 12 | paddingBottom: paddingObj?.bottom, 13 | paddingLeft: paddingObj?.left, 14 | marginTop: marginObj?.top, 15 | marginRight: marginObj?.right, 16 | marginBottom: marginObj?.bottom, 17 | marginLeft: marginObj?.left, 18 | }; 19 | 20 | return omitBy( 21 | styles, 22 | (value) => 23 | value === false || 24 | isEmpty(value) || 25 | isUndefined(value) || 26 | trim(value) === "" || 27 | trim(value) === "undefined undefined undefined" 28 | ); 29 | } 30 | -------------------------------------------------------------------------------- /src/blocks/testimonial/editor.css: -------------------------------------------------------------------------------- 1 | .wp-block-ub-testimonial-block{margin:0 auto}.ub_testimonial{display:grid;grid-template-columns:fit-content(20%) auto}.ub_testimonial_content{padding:5px 17px !important;margin-top:15px}.ub_testimonial_img{padding:0px 10px !important}.ub_testimonial_img img{margin-top:10px}.ub_testimonial_img .ub-remove-image{position:absolute}.ub_testimonial_upload_button{margin:24px 0px 0px 0px}.ub_testimonial_upload_button p{font-size:12px;text-align:justify;margin:5px 0 0 3px} -------------------------------------------------------------------------------- /src/blocks/testimonial/editor.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * #.# Styles 3 | * 4 | * CSS for Backend only. 5 | */ 6 | 7 | .wp-block-ub-testimonial-block { 8 | margin: 0 auto; 9 | } 10 | 11 | .ub_testimonial { 12 | display: grid; 13 | grid-template-columns: fit-content(20%) auto; 14 | } 15 | 16 | .ub_testimonial_content { 17 | padding: 5px 17px !important; 18 | margin-top: 15px; 19 | } 20 | 21 | .ub_testimonial_img { 22 | padding: 0px 10px !important; 23 | img { 24 | margin-top: 10px; 25 | } 26 | .ub-remove-image { 27 | position: absolute; 28 | } 29 | } 30 | 31 | .ub_testimonial_upload_button { 32 | margin: 24px 0px 0px 0px; 33 | p { 34 | font-size: 12px; 35 | text-align: justify; 36 | margin: 5px 0 0 3px; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/blocks/testimonial/get-styles.js: -------------------------------------------------------------------------------- 1 | import { omitBy, isUndefined, trim, isEmpty } from "lodash"; 2 | import { getSpacingCss } from "../utils/styling-helpers"; 3 | 4 | export function getStyles(attributes) { 5 | const { padding, margin, backgroundColor, textColor } = attributes; 6 | const paddingObj = getSpacingCss(padding); 7 | const marginObj = getSpacingCss(margin); 8 | 9 | let styles = { 10 | backgroundColor: backgroundColor, 11 | color: textColor || "inherit", 12 | paddingTop: paddingObj?.top, 13 | paddingRight: paddingObj?.right, 14 | paddingBottom: paddingObj?.bottom, 15 | paddingLeft: paddingObj?.left, 16 | marginTop: marginObj?.top, 17 | marginRight: marginObj?.right, 18 | marginBottom: marginObj?.bottom, 19 | marginLeft: marginObj?.left, 20 | }; 21 | 22 | return omitBy( 23 | styles, 24 | (value) => 25 | value === false || 26 | isEmpty(value) || 27 | isUndefined(value) || 28 | trim(value) === "" || 29 | trim(value) === "undefined undefined undefined" 30 | ); 31 | } 32 | -------------------------------------------------------------------------------- /src/editor.scss: -------------------------------------------------------------------------------- 1 | // editor general styles 2 | 3 | // ub-common package component styles 4 | @import "../library/ub-common/Components/editor"; 5 | 6 | // Upsell related styles 7 | @import "./styles/Upsell/UpsellEditor.scss"; 8 | 9 | // Saved styles related styles 10 | @import "./styles/SavedStyles/SavedStylesEditor.sass"; 11 | -------------------------------------------------------------------------------- /src/extensions/components/index.js: -------------------------------------------------------------------------------- 1 | export { default as CodeEditor } from "./code-editor"; 2 | -------------------------------------------------------------------------------- /src/extensions/custom-css/common.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DotCamp/ultimate-blocks-legacy/2b16e312c3baef65100147ae9487022d771b81b5/src/extensions/custom-css/common.scss -------------------------------------------------------------------------------- /src/extensions/custom-css/editor.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DotCamp/ultimate-blocks-legacy/2b16e312c3baef65100147ae9487022d771b81b5/src/extensions/custom-css/editor.css -------------------------------------------------------------------------------- /src/extensions/custom-css/editor.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DotCamp/ultimate-blocks-legacy/2b16e312c3baef65100147ae9487022d771b81b5/src/extensions/custom-css/editor.scss -------------------------------------------------------------------------------- /src/extensions/custom-css/style.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DotCamp/ultimate-blocks-legacy/2b16e312c3baef65100147ae9487022d771b81b5/src/extensions/custom-css/style.css -------------------------------------------------------------------------------- /src/extensions/custom-css/style.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DotCamp/ultimate-blocks-legacy/2b16e312c3baef65100147ae9487022d771b81b5/src/extensions/custom-css/style.scss -------------------------------------------------------------------------------- /src/extensions/extension-manager.php: -------------------------------------------------------------------------------- 1 | { 18 | const { getProStatus } = namespacedSelect; 19 | 20 | return { 21 | isPro: getProStatus(), 22 | }; 23 | }; 24 | 25 | /** 26 | * @module ProPass 27 | */ 28 | export default connectWithMainStore(selectMapping, null)(ProPass); 29 | -------------------------------------------------------------------------------- /src/inc/components/SavedStyles/DefaultItemIndicator.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { __ } from '@wordpress/i18n'; 3 | import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; 4 | 5 | /** 6 | * Default item indicator for saved style preview component 7 | * 8 | * @class 9 | */ 10 | function DefaultItemIndicator() { 11 | return ( 12 |
16 | 17 |
18 | ); 19 | } 20 | 21 | /** 22 | * @module DefaultItemIndicator 23 | */ 24 | export default DefaultItemIndicator; 25 | -------------------------------------------------------------------------------- /src/inc/components/SavedStyles/SavedStylesListingFilter.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { __ } from '@wordpress/i18n'; 3 | import UbProInspectorTextInput from '$Inc/components/SavedStyles/UbProInspectorTextInput'; 4 | import withBusyStatus from '$BlockStores/savedStyles/hoc/withBusyStatus'; 5 | 6 | /** 7 | * SavedStylesListingFilter component. 8 | * 9 | * @param {Object} props component properties 10 | * @param {string} props.value filter value 11 | * @param {Function} props.onInput onInput event callback 12 | * @param {boolean} props.busyStatus busy status, will be supplied via HOC 13 | * @class 14 | */ 15 | function SavedStylesListingFilter({ value, onInput, busyStatus }) { 16 | return ( 17 |
18 | 24 |
25 | ); 26 | } 27 | 28 | /** 29 | * @module SavedStylesListingFilter 30 | */ 31 | export default withBusyStatus(SavedStylesListingFilter); 32 | -------------------------------------------------------------------------------- /src/inc/components/SavedStyles/UbProInspectorTextInput.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | /** 4 | * Text input for inspector panel. 5 | * 6 | * @param {Object} props component properties 7 | * @param {boolean} [props.disabled=false] disabled status of component 8 | * @param {string} [props.placeholder=''] placeholder text 9 | * @param {string} props.value input value 10 | * @param {Function} props.onInput input callback 11 | * @return {JSX.Element} inspector panel text input component 12 | * @class 13 | */ 14 | function UbProInspectorTextInput({ 15 | disabled = false, 16 | placeholder = '', 17 | value, 18 | onInput, 19 | }) { 20 | /* eslint-disable no-shadow */ 21 | return ( 22 | onInput(value)} 29 | /> 30 | ); 31 | /* eslint-enable no-shadow */ 32 | } 33 | 34 | /** 35 | * @module UbProInspectorTextInput 36 | */ 37 | export default UbProInspectorTextInput; 38 | -------------------------------------------------------------------------------- /src/inc/components/Upsell/Controls/UpsellButtonGroupControl.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import withUpsellControlWrapper from '$Inc/hoc/withUpsellControlWrapper'; 3 | import { 4 | BlackWhiteButtonGroup, 5 | BlackWhiteButton, 6 | } from '$Library/ub-common/Components'; 7 | 8 | /** 9 | * Button Group for upsell features. 10 | * 11 | * @param {Object} props component properties 12 | * @param {Array} [props.buttonLabels=[]] button labels 13 | * @function Object() { [native code] } 14 | */ 15 | function UpsellButtonGroupControl({ buttonLabels = [] }) { 16 | return ( 17 | 18 | {buttonLabels.map((label, index) => ( 19 | {label} 20 | ))} 21 | 22 | ); 23 | } 24 | 25 | /** 26 | * @module UpsellButtonGroupControl 27 | */ 28 | export default withUpsellControlWrapper(UpsellButtonGroupControl); 29 | -------------------------------------------------------------------------------- /src/inc/components/Upsell/Controls/UpsellColorControl.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import withUpsellControlWrapper from '$Inc/hoc/withUpsellControlWrapper'; 3 | import { PanelColorSettings } from '@wordpress/block-editor'; 4 | 5 | /** 6 | * Color control for upsell features. 7 | * 8 | * @param {Object} props component properties 9 | * @function Object() { [native code] } 10 | */ 11 | function UpsellColorControl(props) { 12 | return ; 13 | } 14 | 15 | /** 16 | * @module UpsellToggleControl 17 | */ 18 | export default withUpsellControlWrapper(UpsellColorControl); 19 | -------------------------------------------------------------------------------- /src/inc/components/Upsell/Controls/UpsellIconControl.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import withUpsellControlWrapper from '$Inc/hoc/withUpsellControlWrapper'; 3 | import { IconControl } from '$Library/ub-common/Components'; 4 | 5 | /** 6 | * Icon control for upsell features. 7 | * 8 | * @param {Object} props component properties 9 | * @function Object() { [native code] } 10 | */ 11 | function UpsellIconControl(props) { 12 | return ; 13 | } 14 | 15 | /** 16 | * @module UpsellIconControl 17 | */ 18 | export default withUpsellControlWrapper(UpsellIconControl); 19 | -------------------------------------------------------------------------------- /src/inc/components/Upsell/Controls/UpsellSelectControl.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { SelectControl } from '@wordpress/components'; 3 | import withUpsellControlWrapper from '$Inc/hoc/withUpsellControlWrapper'; 4 | 5 | /** 6 | * Select control for upsell features. 7 | * 8 | * @param {Object} props component properties 9 | * @function Object() { [native code] } 10 | */ 11 | function UpsellSelectControl(props) { 12 | return ; 13 | } 14 | 15 | /** 16 | * @module UpsellToggleControl 17 | */ 18 | export default withUpsellControlWrapper(UpsellSelectControl); 19 | -------------------------------------------------------------------------------- /src/inc/components/Upsell/Controls/UpsellToggleControl.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { ToggleControl } from '@wordpress/components'; 3 | import withUpsellControlWrapper from '$Inc/hoc/withUpsellControlWrapper'; 4 | 5 | /** 6 | * Toggle control for upsell features. 7 | * 8 | * @param {Object} props component properties 9 | * @function Object() { [native code] } 10 | */ 11 | function UpsellToggleControl(props) { 12 | return ; 13 | } 14 | 15 | /** 16 | * @module UpsellToggleControl 17 | */ 18 | export default withUpsellControlWrapper(UpsellToggleControl); 19 | -------------------------------------------------------------------------------- /src/inc/components/Upsell/UpsellInspectorPanelBody.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { PanelBody } from "@wordpress/components"; 3 | import UpsellControlSelector from "$Inc/components/Upsell/Controls/UpsellControlSelector"; 4 | 5 | /** 6 | * General inspector panel body dedicated only to hold upsell controls. 7 | * 8 | * @param {Object} props component properties 9 | * @param {string} props.label panel title 10 | * @param {Array} props.contentData content data for dummy controls inside this panel 11 | * @function Object() { [native code] } 12 | */ 13 | function UpsellInspectorPanelBody({ label, contentData }) { 14 | return ( 15 | 16 | {contentData.map((data) => ( 17 | 18 | ))} 19 | 20 | ); 21 | } 22 | 23 | /** 24 | * @module UpsellInspectorPanelBody. 25 | */ 26 | export default UpsellInspectorPanelBody; 27 | -------------------------------------------------------------------------------- /src/inc/components/Upsell/VitalizeText.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | /** 4 | * Vitalize text. 5 | * 6 | * @param {Object} props component properties 7 | * @param {Array | JSX.Element | string } props.children component children 8 | * @function Object() { [native code] } 9 | */ 10 | function VitalizeText({ children }) { 11 | return {children}; 12 | } 13 | 14 | /** 15 | * @module VitalizeText 16 | */ 17 | export default VitalizeText; 18 | -------------------------------------------------------------------------------- /src/inc/helpers/modeCheck.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Get current env mode. 3 | * 4 | * @return {string} env mode 5 | */ 6 | export const currentMode = () => { 7 | return UB_ENV; 8 | }; 9 | 10 | /** 11 | * Check target mode against current env mode. 12 | * 13 | * @param {string} against target mode to check for 14 | * @return {boolean} match 15 | */ 16 | const modeCheck = (against) => { 17 | return currentMode() === against; 18 | }; 19 | 20 | /** 21 | * Check if current env is development. 22 | * 23 | * @return {boolean} match 24 | */ 25 | export const modeCheckDev = () => { 26 | return modeCheck('development'); 27 | }; 28 | 29 | /** 30 | * Check if current env is production. 31 | * 32 | * @return {boolean} match 33 | */ 34 | export const modeCheckProd = () => { 35 | return modeCheck('production'); 36 | }; 37 | -------------------------------------------------------------------------------- /src/pre-register.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Operations that are queued before registration of blocks. 3 | * 4 | * This file will include mainly features that will support block functionality. 5 | */ 6 | import { FrontendDataManager } from '$Library/ub-common/Inc'; 7 | import MainStore from '$BlockStores/mainStore'; 8 | import ProManager from '$Manager/ProManager'; 9 | 10 | // initialize frontend data manager 11 | FrontendDataManager.init('ubEditorClientData'); 12 | 13 | // initialize main plugin store 14 | MainStore.init('ub/main'); 15 | 16 | // initialize pro manager 17 | ProManager.init(); 18 | -------------------------------------------------------------------------------- /src/priority.js: -------------------------------------------------------------------------------- 1 | // for functionality with priority over any other ones 2 | -------------------------------------------------------------------------------- /src/stores/mainStore/hoc/connectWithMainStore.js: -------------------------------------------------------------------------------- 1 | import { connectWithStore } from '$Library/ub-common/Inc'; 2 | 3 | /** 4 | * Connect with main editor store. 5 | * 6 | * @param {Function} selectMapping selector mapping 7 | * @param {Function} actionMapping action mapping 8 | * @return {Function} hoc function 9 | */ 10 | function connectWithMainStore(selectMapping, actionMapping) { 11 | return connectWithStore('ub/main', selectMapping, actionMapping); 12 | } 13 | 14 | /** 15 | * @module connectWithMainStore 16 | */ 17 | export default connectWithMainStore; 18 | -------------------------------------------------------------------------------- /src/stores/mainStore/state.js: -------------------------------------------------------------------------------- 1 | import deepmerge from 'deepmerge'; 2 | import { currentMode } from '$Inc/helpers/modeCheck'; 3 | 4 | /** 5 | * Default store state. 6 | * 7 | * @type {Object} 8 | */ 9 | const defaultState = { 10 | storeName: null, 11 | mode: currentMode(), 12 | app: { 13 | upsell: { 14 | upsellModalVisibility: false, 15 | targetExtensionInfoShow: null, 16 | targetBlockInfoShow: null, 17 | }, 18 | }, 19 | }; 20 | 21 | /** 22 | * Create state. 23 | * 24 | * @param {Object} [extraState={}] extra state to use 25 | */ 26 | const createStore = (extraState = {}) => { 27 | return deepmerge(defaultState, extraState); 28 | }; 29 | 30 | /** 31 | * @module createStore 32 | */ 33 | export default createStore; 34 | -------------------------------------------------------------------------------- /src/stores/mainStore/types.js: -------------------------------------------------------------------------------- 1 | const ACTION_TYPES = { 2 | UN_AFFECTIVE: 'unAffective', 3 | UPSELL_MODAL_VISIBILITY: 'upsellModalVisibility', 4 | UPSELL_EXTENSION_INFO_SHOW: 'upsellExtensionInfoShow', 5 | TARGET_BLOCK_INFO_SHOW: 'upsellTargetBlockInfoShow', 6 | }; 7 | 8 | /** 9 | * @module types 10 | */ 11 | export default ACTION_TYPES; 12 | -------------------------------------------------------------------------------- /src/stores/savedStyles/hoc/withBusyStatus.js: -------------------------------------------------------------------------------- 1 | import { connectWithStore } from '$Library/ub-common/Inc'; 2 | import SavedStylesManager from '$Manager/SavedStylesManager'; 3 | 4 | // select mappings 5 | const selectMapping = ({ busyState }) => { 6 | return { busyStatus: busyState() }; 7 | }; 8 | 9 | /** 10 | * withBusyStatus HOC. 11 | * 12 | * Will add `busyStatus` property to component properties. 13 | * 14 | * @type {Function} 15 | */ 16 | const withBusyStatus = connectWithStore( 17 | SavedStylesManager.storeNamespace, 18 | selectMapping 19 | ); 20 | 21 | /** 22 | * @module withBusyStatus 23 | */ 24 | export default withBusyStatus; 25 | -------------------------------------------------------------------------------- /src/stores/savedStyles/state.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Saved styles default state. 3 | * 4 | * @type {Object} 5 | */ 6 | const defaultState = { 7 | saved: {}, 8 | rendered: {}, 9 | renderProps: { 10 | previewsEnabled: true, 11 | attributeRenderPreparation: (attr) => attr, 12 | elementRenderPreparation: (el) => el, 13 | previewParentBlock: 'ub/preview-provider', 14 | previewBlockType: null, 15 | forceActiveBlockForRender: false, 16 | }, 17 | app: { 18 | currentBlockTypeOverride: null, 19 | startupBlockIds: [], 20 | busy: false, 21 | advancedControlsVisible: false, 22 | activeItemId: null, 23 | pageBackgroundColor: null, 24 | listing: { 25 | selectedItemId: null, 26 | showPreviews: false, 27 | }, 28 | }, 29 | }; 30 | 31 | /** 32 | * Create store state. 33 | * 34 | * @param {Object} [extraState={}] extra state 35 | * @return {Object} store state 36 | */ 37 | const createStoreState = (extraState = {}) => { 38 | return { ...defaultState, ...extraState }; 39 | }; 40 | 41 | /** 42 | * @module createStoreState 43 | */ 44 | export default createStoreState; 45 | -------------------------------------------------------------------------------- /src/style.css: -------------------------------------------------------------------------------- 1 | .ultimate-blocks-icon-component{display:flex;justify-content:center;align-items:center}.ultimate-blocks-icon-component .ultimate-blocks-icon-component-svg-base{width:100%;height:100%}@keyframes linearGradientMove{to{background-position:6px 0,-6px 100%,0 -6px,100% 6px}}.ub-preview-provider{display:none} -------------------------------------------------------------------------------- /src/style.scss: -------------------------------------------------------------------------------- 1 | // client general styles 2 | 3 | // ub-common package component styles 4 | @import "../library/ub-common/Components/client"; 5 | -------------------------------------------------------------------------------- /src/styles/Upsell/UpsellInspectorNotice.scss: -------------------------------------------------------------------------------- 1 | @import './UpsellTheme.scss'; 2 | @import '../base/__colors.scss'; 3 | @import '../base/__common.scss'; 4 | 5 | .ub-upsell-inspector-notice { 6 | @extend %pointer; 7 | @extend %gutenberg-sidebar-default-borders; 8 | width: 100%; 9 | background-color: $soft_red; 10 | display: grid; 11 | grid-template-rows: 1fr; 12 | grid-template-columns: auto 1fr; 13 | padding: 15px; 14 | grid-gap: 5px; 15 | color: $text_red; 16 | font-size: 15px; 17 | 18 | .ub-upsell-notice-icon-container { 19 | @extend %flex-center-all; 20 | width: 50px; 21 | height: 50px; 22 | 23 | img { 24 | width: auto; 25 | height: 100%; 26 | } 27 | } 28 | 29 | .ub-upsell-notice { 30 | @extend %flex-center-all; 31 | justify-content: flex-start !important; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/styles/Upsell/UpsellTheme.scss: -------------------------------------------------------------------------------- 1 | $soft_red: #FFF0F0; 2 | $text_red: #912323; 3 | -------------------------------------------------------------------------------- /src/styles/base/__colors.scss: -------------------------------------------------------------------------------- 1 | // common color values 2 | 3 | $white: #FFFFFF; 4 | $gutenberg-gray: #E0E0E0; 5 | 6 | $wp-gray: #CCCCCC; 7 | $wp-black: #2F2F2F; 8 | 9 | $plugin-red: #e11b4c; 10 | 11 | $gray-100: #F3F4F6; 12 | $gray-200: #E5E7EB; 13 | $gray-300: #D1D5DB; 14 | $gray-400: #9CA3AF; 15 | $gray-500: #6B7280; 16 | $gray-600: #4B5563; 17 | $gray-700: #374151; 18 | 19 | $red-100: #FFF0F0; 20 | $red-500: #e11b4c; 21 | 22 | $yellow-200: #FEF08A; 23 | $yellow-400: #FACC15; 24 | $yellow-500: #EAB308; 25 | 26 | $green-100: #DCFCE7; 27 | $green-200: #BBF7D0; 28 | $green-400: #86EFAC; 29 | $green-500: #22C55E; 30 | 31 | $blue-100: #DBEAFE; 32 | $blue-500: #3B82F6; 33 | 34 | $positive: $green-500; 35 | $negative: $red-500; 36 | 37 | $logo-color: #F64646; 38 | 39 | $wordpress-gray: #E0E0E0; 40 | $wordpress-admin-main: var(--wp-admin-theme-color); 41 | -------------------------------------------------------------------------------- /src/styles/base/themes/__saved-styles-colors.sass: -------------------------------------------------------------------------------- 1 | $white: #FFFFFF 2 | 3 | $sa-gray-100: #F7FAFC 4 | $sa-gray-200: #EDF2F7 5 | $sa-gray-300: #E2E8F0 6 | $sa-gray-400: #CBD5E0 7 | $sa-gray-500: #A0AEC0 8 | $sa-gray-600: #718096 9 | $sa-gray-700: #4A5568 10 | 11 | $green-400: #86EFAC 12 | $green-500: #4ADE80 13 | $green-200: #BBF7D0 14 | $green-100: #DCFCE7 15 | 16 | $blue-100: #DBEAFE 17 | 18 | $yellow-200: #FEF08A 19 | $yellow-400: #FACC15 20 | 21 | $logo-color: #F64646 22 | 23 | $wordpress-gray: #E0E0E0 24 | $wordpress-admin-main: var(--wp-admin-theme-color) 25 | -------------------------------------------------------------------------------- /src/styles/base/themes/__saved-styles-inspector-theme.scss: -------------------------------------------------------------------------------- 1 | @import './__saved-styles-colors.sass'; 2 | @import '../__common.scss'; 3 | 4 | //region DEFAULTS 5 | $default-border-color: $sa-gray-400; 6 | $color-positive: $green-400; 7 | $color-inactive: $sa-gray-600; 8 | 9 | $border-radius: 2px; 10 | 11 | $font-size: 95%; 12 | 13 | //endregion 14 | 15 | 16 | //region MIXINS 17 | @mixin default-border($b_color: $default-border-color, $line_width: 1px) { 18 | border: $line_width solid $b_color !important; 19 | } 20 | 21 | //endregion 22 | 23 | 24 | //region EXTENDS 25 | %rounded-corner { 26 | border-radius: $border-radius !important; 27 | } 28 | 29 | %inspector-font-size { 30 | font-size: $font-size; 31 | } 32 | 33 | %active-item-presentation { 34 | @extend %shadow-lg; 35 | transform: scale(1.1); 36 | } 37 | 38 | //endregion 39 | -------------------------------------------------------------------------------- /vendor/autoload.php: -------------------------------------------------------------------------------- 1 | $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 10 | 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', 11 | 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', 12 | 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 13 | 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 14 | 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', 15 | ); 16 | -------------------------------------------------------------------------------- /vendor/composer/autoload_files.php: -------------------------------------------------------------------------------- 1 | $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', 10 | '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', 11 | 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', 12 | ); 13 | -------------------------------------------------------------------------------- /vendor/composer/autoload_namespaces.php: -------------------------------------------------------------------------------- 1 | array($baseDir . '/', $baseDir . '/__tests__/php/unit'), 10 | 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'), 11 | 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), 12 | 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), 13 | 'PhpOption\\' => array($vendorDir . '/phpoption/phpoption/src/PhpOption'), 14 | 'GrahamCampbell\\ResultType\\' => array($vendorDir . '/graham-campbell/result-type/src'), 15 | 'Dotenv\\' => array($vendorDir . '/vlucas/phpdotenv/src'), 16 | ); 17 | -------------------------------------------------------------------------------- /vendor/composer/platform_check.php: -------------------------------------------------------------------------------- 1 | = 70205)) { 8 | $issues[] = 'Your Composer dependencies require a PHP version ">= 7.2.5". You are running ' . PHP_VERSION . '.'; 9 | } 10 | 11 | if ($issues) { 12 | if (!headers_sent()) { 13 | header('HTTP/1.1 500 Internal Server Error'); 14 | } 15 | if (!ini_get('display_errors')) { 16 | if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { 17 | fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); 18 | } elseif (!headers_sent()) { 19 | echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; 20 | } 21 | } 22 | trigger_error( 23 | 'Composer detected issues in your platform: ' . implode(' ', $issues), 24 | E_USER_ERROR 25 | ); 26 | } 27 | -------------------------------------------------------------------------------- /vendor/graham-campbell/result-type/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "graham-campbell/result-type", 3 | "description": "An Implementation Of The Result Type", 4 | "keywords": ["result", "result-type", "Result", "Result Type", "Result-Type", "Graham Campbell", "GrahamCampbell"], 5 | "license": "MIT", 6 | "authors": [ 7 | { 8 | "name": "Graham Campbell", 9 | "email": "hello@gjcampbell.co.uk", 10 | "homepage": "https://github.com/GrahamCampbell" 11 | } 12 | ], 13 | "require": { 14 | "php": "^7.2.5 || ^8.0", 15 | "phpoption/phpoption": "^1.9.1" 16 | }, 17 | "require-dev": { 18 | "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" 19 | }, 20 | "autoload": { 21 | "psr-4": { 22 | "GrahamCampbell\\ResultType\\": "src/" 23 | } 24 | }, 25 | "autoload-dev": { 26 | "psr-4": { 27 | "GrahamCampbell\\Tests\\ResultType\\": "tests/" 28 | } 29 | }, 30 | "config": { 31 | "preferred-install": "dist" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /vendor/symfony/polyfill-ctype/README.md: -------------------------------------------------------------------------------- 1 | Symfony Polyfill / Ctype 2 | ======================== 3 | 4 | This component provides `ctype_*` functions to users who run php versions without the ctype extension. 5 | 6 | More information can be found in the 7 | [main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). 8 | 9 | License 10 | ======= 11 | 12 | This library is released under the [MIT license](LICENSE). 13 | -------------------------------------------------------------------------------- /vendor/symfony/polyfill-mbstring/README.md: -------------------------------------------------------------------------------- 1 | Symfony Polyfill / Mbstring 2 | =========================== 3 | 4 | This component provides a partial, native PHP implementation for the 5 | [Mbstring](https://php.net/mbstring) extension. 6 | 7 | More information can be found in the 8 | [main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). 9 | 10 | License 11 | ======= 12 | 13 | This library is released under the [MIT license](LICENSE). 14 | -------------------------------------------------------------------------------- /vendor/symfony/polyfill-php80/README.md: -------------------------------------------------------------------------------- 1 | Symfony Polyfill / Php80 2 | ======================== 3 | 4 | This component provides features added to PHP 8.0 core: 5 | 6 | - [`Stringable`](https://php.net/stringable) interface 7 | - [`fdiv`](https://php.net/fdiv) 8 | - [`ValueError`](https://php.net/valueerror) class 9 | - [`UnhandledMatchError`](https://php.net/unhandledmatcherror) class 10 | - `FILTER_VALIDATE_BOOL` constant 11 | - [`get_debug_type`](https://php.net/get_debug_type) 12 | - [`PhpToken`](https://php.net/phptoken) class 13 | - [`preg_last_error_msg`](https://php.net/preg_last_error_msg) 14 | - [`str_contains`](https://php.net/str_contains) 15 | - [`str_starts_with`](https://php.net/str_starts_with) 16 | - [`str_ends_with`](https://php.net/str_ends_with) 17 | - [`get_resource_id`](https://php.net/get_resource_id) 18 | 19 | More information can be found in the 20 | [main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). 21 | 22 | License 23 | ======= 24 | 25 | This library is released under the [MIT license](LICENSE). 26 | -------------------------------------------------------------------------------- /vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | #[Attribute(Attribute::TARGET_CLASS)] 13 | final class Attribute 14 | { 15 | public const TARGET_CLASS = 1; 16 | public const TARGET_FUNCTION = 2; 17 | public const TARGET_METHOD = 4; 18 | public const TARGET_PROPERTY = 8; 19 | public const TARGET_CLASS_CONSTANT = 16; 20 | public const TARGET_PARAMETER = 32; 21 | public const TARGET_ALL = 63; 22 | public const IS_REPEATABLE = 64; 23 | 24 | /** @var int */ 25 | public $flags; 26 | 27 | public function __construct(int $flags = self::TARGET_ALL) 28 | { 29 | $this->flags = $flags; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | if (\PHP_VERSION_ID < 80000 && extension_loaded('tokenizer')) { 13 | class PhpToken extends Symfony\Polyfill\Php80\PhpToken 14 | { 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | if (\PHP_VERSION_ID < 80000) { 13 | interface Stringable 14 | { 15 | /** 16 | * @return string 17 | */ 18 | public function __toString(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | if (\PHP_VERSION_ID < 80000) { 13 | class UnhandledMatchError extends Error 14 | { 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | if (\PHP_VERSION_ID < 80000) { 13 | class ValueError extends Error 14 | { 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /vendor/vlucas/phpdotenv/src/Exception/ExceptionInterface.php: -------------------------------------------------------------------------------- 1 | 18 | */ 19 | public function load(RepositoryInterface $repository, array $entries); 20 | } 21 | -------------------------------------------------------------------------------- /vendor/vlucas/phpdotenv/src/Parser/ParserInterface.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | public static function create(); 15 | } 16 | -------------------------------------------------------------------------------- /vendor/vlucas/phpdotenv/src/Repository/Adapter/ReaderInterface.php: -------------------------------------------------------------------------------- 1 | 15 | */ 16 | public function read(string $name); 17 | } 18 | -------------------------------------------------------------------------------- /vendor/vlucas/phpdotenv/src/Repository/Adapter/WriterInterface.php: -------------------------------------------------------------------------------- 1 | content = $content; 26 | } 27 | 28 | /** 29 | * Read the content of the environment file(s). 30 | * 31 | * @return string 32 | */ 33 | public function read() 34 | { 35 | return $this->content; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /zip/.gitinclude: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DotCamp/ultimate-blocks-legacy/2b16e312c3baef65100147ae9487022d771b81b5/zip/.gitinclude --------------------------------------------------------------------------------