diff --git a/.gitignore b/.gitignore index ecc1ec486..38d5af04c 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ license.json .phpunit.result.cache .fleet tests/assets/*_tmp +.phpunit.result.cache diff --git a/.phpunit.result.cache b/.phpunit.result.cache deleted file mode 100644 index e69de29bb..000000000 diff --git a/.wordpress-org/screenshot-6.gif b/.wordpress-org/screenshot-6.gif new file mode 100644 index 000000000..4a6311a32 Binary files /dev/null and b/.wordpress-org/screenshot-6.gif differ diff --git a/.wp-env.override.json b/.wp-env.override.json index 59893c03e..642f81c72 100644 --- a/.wp-env.override.json +++ b/.wp-env.override.json @@ -34,5 +34,8 @@ "wp-content/themes/raft": "https://downloads.wordpress.org/theme/raft.zip" } } + }, + "lifecycleScripts": { + "afterStart": "bash bin/e2e-tests.sh" } } diff --git a/Gruntfile.js b/Gruntfile.js index 8027fccc6..8eb5351e1 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -50,7 +50,7 @@ module.exports = function( grunt ) { options: { flags: '' }, - src: [ 'package.json', 'composer.json', 'package-lock.json' ] + src: [ 'package.json', 'composer.json', 'package-lock.json', 'plugins/blocks-animation/composer.json' ] }, metatag: { options: { diff --git a/assets/images/neve-logo.png b/assets/images/neve-logo.png new file mode 100644 index 000000000..0d1cb1ac9 Binary files /dev/null and b/assets/images/neve-logo.png differ diff --git a/assets/images/neve-upsell-img.png b/assets/images/neve-upsell-img.png new file mode 100644 index 000000000..df74accfd Binary files /dev/null and b/assets/images/neve-upsell-img.png differ diff --git a/assets/images/star.png b/assets/images/star.png new file mode 100644 index 000000000..7e482dcf1 Binary files /dev/null and b/assets/images/star.png differ diff --git a/bin/dist.sh b/bin/dist.sh index 9757ea4d1..d7e8c593d 100755 --- a/bin/dist.sh +++ b/bin/dist.sh @@ -86,6 +86,11 @@ do cd plugins/$BUILD_NAME + # We install dependencies only if composer.json exists. + if [ -f "composer.json" ]; then + composer install --no-dev + fi + rsync -rc --exclude-from ".distignore" "./" "../../dist/$DIST_FOLDER" cd ../.. diff --git a/bin/e2e-tests.sh b/bin/e2e-tests.sh new file mode 100644 index 000000000..5699f81ec --- /dev/null +++ b/bin/e2e-tests.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +# Set-up the `wp_env` environment. +npm run wp-env run tests-cli wp option set themeisle_open_ai_api_key "sk_XXXXXXXXXXXXXXXXXXXXXXXx" # Used by AI tools. \ No newline at end of file diff --git a/blocks.json b/blocks.json index 4d6889618..5a0224215 100644 --- a/blocks.json +++ b/blocks.json @@ -148,6 +148,9 @@ "popup/style.css": "blocks/blocks/popup/style.scss" } }, + "modal": { + "block": "blocks/blocks/modal/block.json" + }, "posts-grid": { "block": "blocks/blocks/posts/block.json", "assets": { @@ -281,5 +284,15 @@ }, "content-generator": { "block": "blocks/blocks/content-generator/block.json" + }, + "timeline": { + "block": "blocks/blocks/timeline/group/block.json", + "assets": { + "timeline/editor.css": "blocks/blocks/timeline/editor.scss", + "timeline/style.css": "blocks/blocks/timeline/style.scss" + } + }, + "timeline-item": { + "block": "blocks/blocks/timeline/item/block.json" } } diff --git a/composer.json b/composer.json index 4047687a7..e21cb0961 100644 --- a/composer.json +++ b/composer.json @@ -3,6 +3,15 @@ "description": "A set of awesome Gutenberg Blocks by ThemeIsle.", "type": "wordpress-plugin", "version": "2.6.13", + "repositories":[ + { + "type":"composer", + "url":"https://wpackagist.org", + "only": [ + "wpackagist-plugin/*" + ] + } + ], "require-dev": { "squizlabs/php_codesniffer": "^3.3", "wp-coding-standards/wpcs": "^1", @@ -13,9 +22,10 @@ "yoast/phpunit-polyfills": "^2.0", "phpstan/phpstan": "^1.10", "szepeviktor/phpstan-wordpress": "^1.3", - "php-stubs/woocommerce-stubs": "^8.0", + "php-stubs/woocommerce-stubs": "^9.1", "php-stubs/acf-pro-stubs": "^6.0", - "spaze/phpstan-stripe": "^2.4" + "spaze/phpstan-stripe": "^2.4", + "wpackagist-plugin/woocommerce": "*" }, "license": "GPL-2.0+", "authors": [ @@ -37,11 +47,15 @@ "php": "7.4" }, "allow-plugins": { - "dealerdirect/phpcodesniffer-composer-installer": true + "dealerdirect/phpcodesniffer-composer-installer": true, + "composer/installers": true } }, "extra": { - "installer-disable": "true" + "installer-disable": "true", + "installer-paths": { + "vendor/wp-content/plugins/{$name}/": ["type:wordpress-plugin"] + } }, "autoload": { "classmap": ["inc/"], @@ -62,7 +76,7 @@ "tubalmartin/cssmin": "^4.1", "wptt/webfont-loader": "^1.1", "sabberworm/php-css-parser": "^8.4", - "stripe/stripe-php": "^13.1", - "enshrined/svg-sanitize": "^0.18.0" + "stripe/stripe-php": "^15.3", + "enshrined/svg-sanitize": "^0.19.0" } } diff --git a/composer.lock b/composer.lock index 8a6bbcd48..bf1d821bc 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "065d07b9635a04adf752972d7b0b525f", + "content-hash": "b79a1419a8cd0329d649c8c1b895488a", "packages": [ { "name": "codeinwp/themeisle-sdk", - "version": "3.3.20", + "version": "3.3.27", "source": { "type": "git", "url": "https://github.com/Codeinwp/themeisle-sdk.git", - "reference": "d1b92f3ab74f1b3f0afad7e23ddb1c058d66c03c" + "reference": "ae9f1aae6e71677db5de1f579b2275be6fc838f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/d1b92f3ab74f1b3f0afad7e23ddb1c058d66c03c", - "reference": "d1b92f3ab74f1b3f0afad7e23ddb1c058d66c03c", + "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/ae9f1aae6e71677db5de1f579b2275be6fc838f4", + "reference": "ae9f1aae6e71677db5de1f579b2275be6fc838f4", "shasum": "" }, "require-dev": { @@ -42,22 +42,22 @@ ], "support": { "issues": "https://github.com/Codeinwp/themeisle-sdk/issues", - "source": "https://github.com/Codeinwp/themeisle-sdk/tree/v3.3.20" + "source": "https://github.com/Codeinwp/themeisle-sdk/tree/v3.3.27" }, - "time": "2024-04-16T12:27:32+00:00" + "time": "2024-07-30T06:16:39+00:00" }, { "name": "enshrined/svg-sanitize", - "version": "0.18.0", + "version": "0.19.0", "source": { "type": "git", "url": "https://github.com/darylldoyle/svg-sanitizer.git", - "reference": "6a2c069dab3843ca4d887ff09c972fc7033888d0" + "reference": "e95cd17be68e45f523cbfb0fe50cdd891b0cf20e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/6a2c069dab3843ca4d887ff09c972fc7033888d0", - "reference": "6a2c069dab3843ca4d887ff09c972fc7033888d0", + "url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/e95cd17be68e45f523cbfb0fe50cdd891b0cf20e", + "reference": "e95cd17be68e45f523cbfb0fe50cdd891b0cf20e", "shasum": "" }, "require": { @@ -87,9 +87,9 @@ "description": "An SVG sanitizer for PHP", "support": { "issues": "https://github.com/darylldoyle/svg-sanitizer/issues", - "source": "https://github.com/darylldoyle/svg-sanitizer/tree/0.18.0" + "source": "https://github.com/darylldoyle/svg-sanitizer/tree/0.19.0" }, - "time": "2024-02-22T17:51:05+00:00" + "time": "2024-06-18T10:27:15+00:00" }, { "name": "masterminds/html5", @@ -160,16 +160,16 @@ }, { "name": "sabberworm/php-css-parser", - "version": "v8.5.1", + "version": "v8.6.0", "source": { "type": "git", "url": "https://github.com/MyIntervals/PHP-CSS-Parser.git", - "reference": "4a3d572b0f8b28bb6fd016ae8bbfc445facef152" + "reference": "d2fb94a9641be84d79c7548c6d39bbebba6e9a70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/4a3d572b0f8b28bb6fd016ae8bbfc445facef152", - "reference": "4a3d572b0f8b28bb6fd016ae8bbfc445facef152", + "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/d2fb94a9641be84d79c7548c6d39bbebba6e9a70", + "reference": "d2fb94a9641be84d79c7548c6d39bbebba6e9a70", "shasum": "" }, "require": { @@ -219,22 +219,22 @@ ], "support": { "issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues", - "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.5.1" + "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.6.0" }, - "time": "2024-02-15T16:41:13+00:00" + "time": "2024-07-01T07:33:21+00:00" }, { "name": "stripe/stripe-php", - "version": "v13.18.0", + "version": "v15.5.0", "source": { "type": "git", "url": "https://github.com/stripe/stripe-php.git", - "reference": "02abb043b103766f4ed920642ae56ffdc58c7467" + "reference": "d20fbbf2557773106c0ec2198b1b16b40f5081bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/stripe/stripe-php/zipball/02abb043b103766f4ed920642ae56ffdc58c7467", - "reference": "02abb043b103766f4ed920642ae56ffdc58c7467", + "url": "https://api.github.com/repos/stripe/stripe-php/zipball/d20fbbf2557773106c0ec2198b1b16b40f5081bc", + "reference": "d20fbbf2557773106c0ec2198b1b16b40f5081bc", "shasum": "" }, "require": { @@ -278,9 +278,9 @@ ], "support": { "issues": "https://github.com/stripe/stripe-php/issues", - "source": "https://github.com/stripe/stripe-php/tree/v13.18.0" + "source": "https://github.com/stripe/stripe-php/tree/v15.5.0" }, - "time": "2024-04-09T21:08:04+00:00" + "time": "2024-08-01T21:25:52+00:00" }, { "name": "tubalmartin/cssmin", @@ -437,6 +437,152 @@ }, "time": "2019-04-24T21:34:09+00:00" }, + { + "name": "composer/installers", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/composer/installers.git", + "reference": "12fb2dfe5e16183de69e784a7b84046c43d97e8e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/installers/zipball/12fb2dfe5e16183de69e784a7b84046c43d97e8e", + "reference": "12fb2dfe5e16183de69e784a7b84046c43d97e8e", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "composer/composer": "^1.10.27 || ^2.7", + "composer/semver": "^1.7.2 || ^3.4.0", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-phpunit": "^1", + "symfony/phpunit-bridge": "^7.1.1", + "symfony/process": "^5 || ^6 || ^7" + }, + "type": "composer-plugin", + "extra": { + "class": "Composer\\Installers\\Plugin", + "branch-alias": { + "dev-main": "2.x-dev" + }, + "plugin-modifies-install-path": true + }, + "autoload": { + "psr-4": { + "Composer\\Installers\\": "src/Composer/Installers" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kyle Robinson Young", + "email": "kyle@dontkry.com", + "homepage": "https://github.com/shama" + } + ], + "description": "A multi-framework Composer library installer", + "homepage": "https://composer.github.io/installers/", + "keywords": [ + "Dolibarr", + "Eliasis", + "Hurad", + "ImageCMS", + "Kanboard", + "Lan Management System", + "MODX Evo", + "MantisBT", + "Mautic", + "Maya", + "OXID", + "Plentymarkets", + "Porto", + "RadPHP", + "SMF", + "Starbug", + "Thelia", + "Whmcs", + "WolfCMS", + "agl", + "annotatecms", + "attogram", + "bitrix", + "cakephp", + "chef", + "cockpit", + "codeigniter", + "concrete5", + "concreteCMS", + "croogo", + "dokuwiki", + "drupal", + "eZ Platform", + "elgg", + "expressionengine", + "fuelphp", + "grav", + "installer", + "itop", + "known", + "kohana", + "laravel", + "lavalite", + "lithium", + "magento", + "majima", + "mako", + "matomo", + "mediawiki", + "miaoxing", + "modulework", + "modx", + "moodle", + "osclass", + "pantheon", + "phpbb", + "piwik", + "ppi", + "processwire", + "puppet", + "pxcms", + "reindex", + "roundcube", + "shopware", + "silverstripe", + "sydes", + "sylius", + "tastyigniter", + "wordpress", + "yawik", + "zend", + "zikula" + ], + "support": { + "issues": "https://github.com/composer/installers/issues", + "source": "https://github.com/composer/installers/tree/v2.3.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-06-24T20:46:46+00:00" + }, { "name": "dealerdirect/phpcodesniffer-composer-installer", "version": "v0.7.1", @@ -859,16 +1005,16 @@ }, { "name": "php-stubs/woocommerce-stubs", - "version": "v8.7.0", + "version": "v9.1.0", "source": { "type": "git", "url": "https://github.com/php-stubs/woocommerce-stubs.git", - "reference": "1bab3a764a91ed037f420dc38124e2516b29e6b8" + "reference": "2c95c633362d1f4f531f69e5db63bb19399d8b58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-stubs/woocommerce-stubs/zipball/1bab3a764a91ed037f420dc38124e2516b29e6b8", - "reference": "1bab3a764a91ed037f420dc38124e2516b29e6b8", + "url": "https://api.github.com/repos/php-stubs/woocommerce-stubs/zipball/2c95c633362d1f4f531f69e5db63bb19399d8b58", + "reference": "2c95c633362d1f4f531f69e5db63bb19399d8b58", "shasum": "" }, "require": { @@ -897,33 +1043,34 @@ ], "support": { "issues": "https://github.com/php-stubs/woocommerce-stubs/issues", - "source": "https://github.com/php-stubs/woocommerce-stubs/tree/v8.7.0" + "source": "https://github.com/php-stubs/woocommerce-stubs/tree/v9.1.0" }, - "time": "2024-03-19T16:55:16+00:00" + "time": "2024-07-11T10:55:02+00:00" }, { "name": "php-stubs/wordpress-stubs", - "version": "v6.4.3", + "version": "v6.6.0", "source": { "type": "git", "url": "https://github.com/php-stubs/wordpress-stubs.git", - "reference": "6105bdab2f26c0204fe90ecc53d5684754550e8f" + "reference": "86e8753e89d59849276dcdd91b9a7dd78bb4abe2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-stubs/wordpress-stubs/zipball/6105bdab2f26c0204fe90ecc53d5684754550e8f", - "reference": "6105bdab2f26c0204fe90ecc53d5684754550e8f", + "url": "https://api.github.com/repos/php-stubs/wordpress-stubs/zipball/86e8753e89d59849276dcdd91b9a7dd78bb4abe2", + "reference": "86e8753e89d59849276dcdd91b9a7dd78bb4abe2", "shasum": "" }, "require-dev": { "dealerdirect/phpcodesniffer-composer-installer": "^1.0", "nikic/php-parser": "^4.13", - "php": "^7.4 || ~8.0.0", + "php": "^7.4 || ^8.0", "php-stubs/generator": "^0.8.3", - "phpdocumentor/reflection-docblock": "^5.3", + "phpdocumentor/reflection-docblock": "^5.4.1", "phpstan/phpstan": "^1.10.49", "phpunit/phpunit": "^9.5", - "szepeviktor/phpcs-psr-12-neutron-hybrid-ruleset": "^0.11" + "szepeviktor/phpcs-psr-12-neutron-hybrid-ruleset": "^1.0", + "wp-coding-standards/wpcs": "3.1.0 as 2.3.0" }, "suggest": { "paragonie/sodium_compat": "Pure PHP implementation of libsodium", @@ -944,9 +1091,9 @@ ], "support": { "issues": "https://github.com/php-stubs/wordpress-stubs/issues", - "source": "https://github.com/php-stubs/wordpress-stubs/tree/v6.4.3" + "source": "https://github.com/php-stubs/wordpress-stubs/tree/v6.6.0" }, - "time": "2024-02-11T18:56:19+00:00" + "time": "2024-07-17T08:50:38+00:00" }, { "name": "phpcompatibility/php-compatibility", @@ -1012,16 +1159,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.67", + "version": "1.11.9", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "16ddbe776f10da6a95ebd25de7c1dbed397dc493" + "reference": "e370bcddadaede0c1716338b262346f40d296f82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/16ddbe776f10da6a95ebd25de7c1dbed397dc493", - "reference": "16ddbe776f10da6a95ebd25de7c1dbed397dc493", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e370bcddadaede0c1716338b262346f40d296f82", + "reference": "e370bcddadaede0c1716338b262346f40d296f82", "shasum": "" }, "require": { @@ -1066,7 +1213,7 @@ "type": "github" } ], - "time": "2024-04-16T07:22:02+00:00" + "time": "2024-08-01T16:25:18+00:00" }, { "name": "phpunit/php-code-coverage", @@ -2516,16 +2663,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.9.1", + "version": "3.10.2", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "267a4405fff1d9c847134db3a3c92f1ab7f77909" + "reference": "86e5f5dd9a840c46810ebe5ff1885581c42a3017" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/267a4405fff1d9c847134db3a3c92f1ab7f77909", - "reference": "267a4405fff1d9c847134db3a3c92f1ab7f77909", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/86e5f5dd9a840c46810ebe5ff1885581c42a3017", + "reference": "86e5f5dd9a840c46810ebe5ff1885581c42a3017", "shasum": "" }, "require": { @@ -2592,20 +2739,20 @@ "type": "open_collective" } ], - "time": "2024-03-31T21:03:09+00:00" + "time": "2024-07-21T23:26:44+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "21bd091060673a1177ae842c0ef8fe30893114d2" + "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/21bd091060673a1177ae842c0ef8fe30893114d2", - "reference": "21bd091060673a1177ae842c0ef8fe30893114d2", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/ec444d3f3f6505bb28d11afa41e75faadebc10a1", + "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1", "shasum": "" }, "require": { @@ -2652,7 +2799,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.30.0" }, "funding": [ { @@ -2668,20 +2815,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "szepeviktor/phpstan-wordpress", - "version": "v1.3.4", + "version": "v1.3.5", "source": { "type": "git", "url": "https://github.com/szepeviktor/phpstan-wordpress.git", - "reference": "891d0767855a32c886a439efae090408cc1fa156" + "reference": "7f8cfe992faa96b6a33bbd75c7bace98864161e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/szepeviktor/phpstan-wordpress/zipball/891d0767855a32c886a439efae090408cc1fa156", - "reference": "891d0767855a32c886a439efae090408cc1fa156", + "url": "https://api.github.com/repos/szepeviktor/phpstan-wordpress/zipball/7f8cfe992faa96b6a33bbd75c7bace98864161e7", + "reference": "7f8cfe992faa96b6a33bbd75c7bace98864161e7", "shasum": "" }, "require": { @@ -2696,7 +2843,8 @@ "php-parallel-lint/php-parallel-lint": "^1.1", "phpstan/phpstan-strict-rules": "^1.2", "phpunit/phpunit": "^8.0 || ^9.0", - "szepeviktor/phpcs-psr-12-neutron-hybrid-ruleset": "^0.8" + "szepeviktor/phpcs-psr-12-neutron-hybrid-ruleset": "^1.0", + "wp-coding-standards/wpcs": "3.1.0 as 2.3.0" }, "suggest": { "swissspidy/phpstan-no-private": "Detect usage of internal core functions, classes and methods" @@ -2728,9 +2876,9 @@ ], "support": { "issues": "https://github.com/szepeviktor/phpstan-wordpress/issues", - "source": "https://github.com/szepeviktor/phpstan-wordpress/tree/v1.3.4" + "source": "https://github.com/szepeviktor/phpstan-wordpress/tree/v1.3.5" }, - "time": "2024-03-21T16:32:59+00:00" + "time": "2024-06-28T22:27:19+00:00" }, { "name": "theseer/tokenizer", @@ -2830,6 +2978,24 @@ }, "time": "2018-12-18T09:43:51+00:00" }, + { + "name": "wpackagist-plugin/woocommerce", + "version": "9.1.4", + "source": { + "type": "svn", + "url": "https://plugins.svn.wordpress.org/woocommerce/", + "reference": "tags/9.1.4" + }, + "dist": { + "type": "zip", + "url": "https://downloads.wordpress.org/plugin/woocommerce.9.1.4.zip" + }, + "require": { + "composer/installers": "^1.0 || ^2.0" + }, + "type": "wordpress-plugin", + "homepage": "https://wordpress.org/plugins/woocommerce/" + }, { "name": "yoast/phpunit-polyfills", "version": "2.0.1", diff --git a/inc/class-base-css.php b/inc/class-base-css.php index 08516baf6..09304faac 100644 --- a/inc/class-base-css.php +++ b/inc/class-base-css.php @@ -97,6 +97,8 @@ public function autoload_block_classes() { '\ThemeIsle\GutenbergBlocks\CSS\Blocks\Tabs_CSS', '\ThemeIsle\GutenbergBlocks\CSS\Blocks\Posts_CSS', '\ThemeIsle\GutenbergBlocks\CSS\Blocks\Sharing_Icons_CSS', + '\ThemeIsle\GutenbergBlocks\CSS\Blocks\Timeline_CSS', + '\ThemeIsle\GutenbergBlocks\CSS\Blocks\Timeline_Item_CSS', ); self::$blocks_classes = apply_filters( 'otter_blocks_register_css', self::$blocks_classes ); diff --git a/inc/class-blocks-animation.php b/inc/class-blocks-animation.php index d9064833c..ac55bf3ec 100644 --- a/inc/class-blocks-animation.php +++ b/inc/class-blocks-animation.php @@ -49,6 +49,11 @@ public function init() { add_action( 'enqueue_block_editor_assets', array( $this, 'enqueue_editor_assets' ) ); add_action( 'enqueue_block_assets', array( $this, 'enqueue_block_frontend_assets' ) ); add_filter( 'render_block', array( $this, 'frontend_load' ), 800, 2 ); + // Welcome notice. + if ( ! defined( 'OTTER_BLOCKS_PATH' ) ) { + add_action( 'admin_notices', array( $this, 'render_welcome_notice' ), 0 ); + add_action( 'wp_ajax_otter_animation_dismiss_welcome_notice', array( $this, 'remove_welcome_notice' ) ); + } } /** @@ -217,6 +222,202 @@ public static function add_frontend_anim_inline_style() { '; } + /** + * Render the welcome notice. + * + * @return void + */ + public function render_welcome_notice() { + if ( ! $this->should_show_welcome_notice() ) { + return; + } + + $otter_status = $this->get_blocks_animations_status(); + + $asset_file = include BLOCKS_ANIMATION_PATH . '/build/animation/welcome-notice.asset.php'; + + wp_enqueue_style( + 'otter-animation-welcome-notice-styles', + BLOCKS_ANIMATION_URL . 'build/animation/style-welcome-notice.css', + array( 'wp-components' ), + $asset_file['version'] + ); + + wp_enqueue_script( + 'otter-animation-welcome-notice-scripts', + BLOCKS_ANIMATION_URL . 'build/animation/welcome-notice.js', + $asset_file['dependencies'], + $asset_file['version'], + true + ); + + wp_set_script_translations( 'otter-animation-welcome-notice-scripts', 'otter-blocks' ); + + wp_localize_script( + 'otter-animation-welcome-notice-scripts', + 'otterAnimationWelcodeNoticeData', + array( + 'nonce' => wp_create_nonce( 'otter_animation_dismiss_welcome_notice' ), + 'ajaxUrl' => esc_url( admin_url( 'admin-ajax.php' ) ), + 'otterStatus' => $otter_status, + 'activationUrl' => esc_url( + add_query_arg( + array( + 'plugin_status' => 'all', + 'paged' => '1', + 'action' => 'activate', + 'plugin' => rawurlencode( 'otter-blocks/otter-blocks.php' ), + '_wpnonce' => wp_create_nonce( 'activate-plugin_otter-blocks/otter-blocks.php' ), + ), + admin_url( 'plugins.php' ) + ) + ), + 'activating' => __( 'Activating', 'otter-blocks' ) . '…', + 'installing' => __( 'Installing', 'otter-blocks' ) . '…', + 'done' => __( 'Done', 'otter-blocks' ), + ) + ); + + $notice_html = '
'; + $notice_html .= ''; + $notice_html .= '
'; + + $notice_html .= '' . esc_attr__( 'Otter Blocks preview', 'otter-blocks' ) . ''; + + $notice_html .= '
'; + + $notice_html .= '

'; + /* translators: %s: Otter Blocks */ + $notice_html .= sprintf( __( 'Power Up Your Site with %1$s, %2$s, %3$s, and more!', 'otter-blocks' ), 'Add-on Blocks', 'Enhanced Animations', 'Visibility Conditions' ); + + $notice_html .= '

'; + + $notice_html .= '

' . __( 'Otter is a Gutenberg Blocks page builder plugin that adds extra functionality to the WordPress Block Editor (also known as Gutenberg) for a better page building experience without the need for traditional page builders.', 'otter-blocks' ) . '

'; + + $notice_html .= '
'; + + /* translators: %s: Otter Blocks */ + $notice_html .= ''; + + $notice_html .= ''; + $notice_html .= '' . __( 'Learn More', 'otter-blocks' ) . ''; + $notice_html .= ''; + $notice_html .= ''; + + $notice_html .= '
'; + + $notice_html .= '
'; + $notice_html .= '
'; + $notice_html .= '
'; + + echo wp_kses_post( $notice_html ); + } + + /** + * Get the blocks animations plugin status. + * + * @return string + */ + private function get_blocks_animations_status() { + $status = 'not-installed'; + + if ( file_exists( ABSPATH . 'wp-content/plugins/otter-blocks/otter-blocks.php' ) ) { + return 'installed'; + } + + return $status; + } + + /** + * Should we show the welcome notice? + * + * @return bool + */ + private function should_show_welcome_notice() { + // Already using otter blocks. + if ( is_plugin_active( 'otter-blocks/otter-blocks.php' ) ) { + return false; + } + + // Notice was dismissed. + if ( get_option( 'otter_animation_dismiss_welcome_notice', false ) ) { + return false; + } + + $screen = get_current_screen(); + + // Only show in dashboard/themes/plugins. + if ( ! in_array( $screen->id, array( 'dashboard', 'plugins', 'themes' ) ) ) { + return false; + } + + // AJAX actions. + if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { + return false; + } + + // Don't show in network admin. + if ( is_network_admin() ) { + return false; + } + + // User can't dismiss. We don't show it. + if ( ! current_user_can( 'manage_options' ) ) { + return false; + } + + // User can't install plugins. We don't show it. + if ( ! current_user_can( 'install_plugins' ) ) { + return false; + } + + // Block editor context. + if ( $screen->is_block_editor() ) { + return false; + } + + // Dismiss after one week from activation. + $display_time = get_option( 'otter_animation_welcome_notice_display_time', false ); + // Save notice display time to auto dismiss after a week. + if ( $display_time ) { + $display_time = time(); + update_option( 'otter_animation_welcome_notice_display_time', $display_time ); + } + + if ( ! empty( $display_time ) && time() - intval( $display_time ) > WEEK_IN_SECONDS ) { + update_option( 'otter_animation_dismiss_welcome_notice', true ); + + return false; + } + + return true; + } + + /** + * Dismiss the welcome notice. + * + * @return void + */ + public function remove_welcome_notice() { + if ( ! isset( $_POST['nonce'] ) ) { + return; + } + if ( ! wp_verify_nonce( sanitize_text_field( $_POST['nonce'] ), 'otter_animation_dismiss_welcome_notice' ) ) { + return; + } + update_option( 'otter_animation_dismiss_welcome_notice', true ); + wp_die(); + } + /** * The instance method for the static class. * Defines and returns the instance of the static class. diff --git a/inc/class-blocks-css.php b/inc/class-blocks-css.php index 5602cd9df..27a22cbf8 100644 --- a/inc/class-blocks-css.php +++ b/inc/class-blocks-css.php @@ -72,7 +72,17 @@ public function enqueue_editor_assets() { 'otter-css', 'blocksCSS', array( - 'hasOtter' => defined( 'OTTER_BLOCKS_VERSION' ), + 'hasOtter' => defined( 'OTTER_BLOCKS_VERSION' ), + 'installOtter' => wp_nonce_url( + add_query_arg( + array( + 'action' => 'install-plugin', + 'plugin' => 'otter-blocks', + ), + admin_url( 'update.php' ) + ), + 'install-plugin_otter-blocks' + ), ) ); diff --git a/inc/class-main.php b/inc/class-main.php index 7b3fd2088..9eeb853e1 100644 --- a/inc/class-main.php +++ b/inc/class-main.php @@ -47,7 +47,8 @@ public function init() { } add_filter( 'otter_blocks_about_us_metadata', array( $this, 'about_page' ) ); - + + add_action( 'parse_query', array( $this, 'pagination_support' ) ); } /** @@ -520,6 +521,25 @@ public function generate_svg_attachment_metadata( $metadata, $attachment_id ) { return $metadata; } + /** + * Disable canonical redirect to make Posts pagination feature work. + * + * @param \WP_Query $request The query object. + */ + public function pagination_support( $request ) { + if ( + true === $request->is_singular && + -1 === $request->current_post && + true === $request->is_paged && + ( + ! empty( $request->query_vars['page'] ) || + ! empty( $request->query_vars['paged'] ) + ) + ) { + add_filter( 'redirect_canonical', '__return_false' ); + } + } + /** * After Update Migration diff --git a/inc/class-patterns.php b/inc/class-patterns.php index 1a894cfdb..b9abd34ce 100644 --- a/inc/class-patterns.php +++ b/inc/class-patterns.php @@ -35,11 +35,18 @@ public function init() { */ public function register_patterns() { $block_pattern_categories = array( - 'otter-blocks' => array( 'label' => __( 'Otter Blocks', 'otter-blocks' ) ), - 'cta' => array( 'label' => __( 'Call to Action', 'otter-blocks' ) ), - 'team' => array( 'label' => __( 'Team', 'otter-blocks' ) ), - 'pricing' => array( 'label' => __( 'Pricing', 'otter-blocks' ) ), - 'testimonials' => array( 'label' => __( 'Testimonials', 'otter-blocks' ) ), + 'otter-blocks' => array( 'label' => __( 'Otter Blocks', 'otter-blocks' ) ), + 'business-pack' => array( 'label' => __( 'Business Pack (Pages)', 'otter-blocks' ) ), + 'call-to-action' => array( 'label' => __( 'Call to Action', 'otter-blocks' ) ), + 'creator-pack' => array( 'label' => __( 'Creator Pack (Pages)', 'otter-blocks' ) ), + 'fitness-pack' => array( 'label' => __( 'Fitness Pack (Pages)', 'otter-blocks' ) ), + 'features' => array( 'label' => __( 'Features', 'otter-blocks' ) ), + 'forms' => array( 'label' => __( 'Forms', 'otter-blocks' ) ), + 'team' => array( 'label' => __( 'Team', 'otter-blocks' ) ), + 'pages' => array( 'label' => __( 'Pages', 'otter-blocks' ) ), + 'pricing' => array( 'label' => __( 'Pricing', 'otter-blocks' ) ), + 'recipes-pack' => array( 'label' => __( 'Recipes Pack (Pages)', 'otter-blocks' ) ), + 'testimonials' => array( 'label' => __( 'Testimonials', 'otter-blocks' ) ), ); $block_pattern_categories = apply_filters( 'otter_blocks_block_pattern_categories', $block_pattern_categories ); @@ -76,7 +83,7 @@ public function register_patterns() { 'minimum' => 5.8, ), array( - 'slug' => 'call-to-action', + 'slug' => 'call-to-action-1', 'minimum' => 5.8, ), array( @@ -143,6 +150,154 @@ public function register_patterns() { 'slug' => 'author-box', 'minimum' => 5.8, ), + array( + 'slug' => 'call-to-action-2', + 'minimum' => 5.8, + ), + array( + 'slug' => 'call-to-action-3', + 'minimum' => 5.8, + ), + array( + 'slug' => 'call-to-action-4', + 'minimum' => 5.8, + ), + array( + 'slug' => 'call-to-action-5', + 'minimum' => 5.8, + ), + array( + 'slug' => 'call-to-action-6', + 'minimum' => 5.8, + ), + array( + 'slug' => 'call-to-action-7', + 'minimum' => 5.8, + ), + array( + 'slug' => 'hero-1', + 'minimum' => 5.8, + ), + array( + 'slug' => 'hero-2', + 'minimum' => 5.8, + ), + array( + 'slug' => 'form-1', + 'minimum' => 5.8, + ), + array( + 'slug' => 'form-2', + 'minimum' => 5.8, + ), + array( + 'slug' => 'form-3', + 'minimum' => 5.8, + ), + array( + 'slug' => 'form-4', + 'minimum' => 5.8, + ), + array( + 'slug' => 'pricing', + 'minimum' => 5.8, + ), + array( + 'slug' => 'team-1', + 'minimum' => 5.8, + ), + array( + 'slug' => 'team-2', + 'minimum' => 5.8, + ), + array( + 'slug' => 'testimonials-1', + 'minimum' => 5.8, + ), + array( + 'slug' => 'testimonials-2', + 'minimum' => 5.8, + ), + array( + 'slug' => 'testimonials-3', + 'minimum' => 5.8, + ), + array( + 'slug' => 'features-1', + 'minimum' => 5.8, + ), + array( + 'slug' => 'features-2', + 'minimum' => 5.8, + ), + array( + 'slug' => 'features-3', + 'minimum' => 5.8, + ), + array( + 'slug' => 'features-4', + 'minimum' => 5.8, + ), + array( + 'slug' => 'features-5', + 'minimum' => 5.8, + ), + array( + 'slug' => 'industrial-homepage', + 'minimum' => 5.8, + ), + array( + 'slug' => 'industrial-about', + 'minimum' => 5.8, + ), + array( + 'slug' => 'industrial-services', + 'minimum' => 5.8, + ), + array( + 'slug' => 'industrial-service', + 'minimum' => 5.8, + ), + array( + 'slug' => 'business-homepage', + 'minimum' => 5.8, + ), + array( + 'slug' => 'business-about', + 'minimum' => 5.8, + ), + array( + 'slug' => 'business-services', + 'minimum' => 5.8, + ), + array( + 'slug' => 'business-service', + 'minimum' => 5.8, + ), + array( + 'slug' => 'business-contact', + 'minimum' => 5.8, + ), + array( + 'slug' => 'fitness-homepage', + 'minimum' => 5.8, + ), + array( + 'slug' => 'fitness-about', + 'minimum' => 5.8, + ), + array( + 'slug' => 'fitness-groups', + 'minimum' => 5.8, + ), + array( + 'slug' => 'fitness-group', + 'minimum' => 5.8, + ), + array( + 'slug' => 'fitness-contact', + 'minimum' => 5.8, + ), ); foreach ( $block_patterns as $block_pattern ) { diff --git a/inc/class-registration.php b/inc/class-registration.php index 65aa101f0..3d3c01737 100644 --- a/inc/class-registration.php +++ b/inc/class-registration.php @@ -279,9 +279,12 @@ public function enqueue_block_editor_assets() { 'showOnboarding' => $this->show_onboarding(), 'ratingScale' => get_option( 'themeisle_blocks_settings_review_scale', false ), 'hasModule' => array( + 'aiToolbar' => boolval( get_option( 'themeisle_blocks_settings_block_ai_toolbar_module', true ) ), 'blockCSS' => boolval( get_option( 'themeisle_blocks_settings_css_module', true ) ), 'blockAnimations' => boolval( get_option( 'themeisle_blocks_settings_blocks_animation', true ) ), 'blockConditions' => boolval( get_option( 'themeisle_blocks_settings_block_conditions', true ) ), + 'patternsLibrary' => boolval( get_option( 'themeisle_blocks_settings_patterns_library', true ) ), + 'dynamicContent' => boolval( get_option( 'themeisle_blocks_settings_dynamic_content', true ) ), ), 'isLegacyPre59' => version_compare( get_bloginfo( 'version' ), '5.8.22', '<=' ), 'isAncestorTypeAvailable' => version_compare( get_bloginfo( 'version' ), '5.9.22', '>=' ), @@ -622,7 +625,10 @@ function() { wp_script_add_data( 'otter-tabs', 'defer', true ); } - if ( ! self::$scripts_loaded['popup'] && has_block( 'themeisle-blocks/popup', $post ) ) { + if ( + ! self::$scripts_loaded['popup'] && + ( has_block( 'themeisle-blocks/popup', $post ) || has_block( 'themeisle-blocks/modal', $post ) ) + ) { $asset_file = include OTTER_BLOCKS_PATH . '/build/blocks/popup.asset.php'; wp_register_script( 'otter-popup', OTTER_BLOCKS_URL . 'build/blocks/popup.js', $asset_file['dependencies'], $asset_file['version'], true ); wp_script_add_data( 'otter-popup', 'defer', true ); @@ -662,6 +668,11 @@ public function enqueue_block_styles( $post ) { continue; } + // Shared styles. + if ( 'modal' === $block ) { + $block = 'popup'; + } + $block_path = OTTER_BLOCKS_PATH . '/build/blocks/' . $block; $style = OTTER_BLOCKS_URL . 'build/blocks/' . $block . '/style.css'; @@ -749,6 +760,7 @@ public function register_blocks() { 'lottie', 'plugin-cards', 'popup', + 'modal', 'posts-grid', 'pricing', 'progress-bar', @@ -760,6 +772,8 @@ public function register_blocks() { 'tabs', 'tabs-item', 'testimonials', + 'timeline', + 'timeline-item', ); self::$blocks = apply_filters( 'otter_blocks_register_blocks', self::$blocks ); @@ -778,7 +792,7 @@ public function register_blocks() { 'font-awesome-icons' => array( 'font-awesome-5', 'font-awesome-4-shims' ), 'icon-list-item' => array( 'font-awesome-5', 'font-awesome-4-shims' ), 'plugin-cards' => array( 'font-awesome-5', 'font-awesome-4-shims' ), - 'sharing-icons' => array( 'font-awesome-5', 'font-awesome-4-shims' ), + 'timeline-item' => array( 'font-awesome-5', 'font-awesome-4-shims' ), ) ); @@ -878,8 +892,7 @@ public function subscribe_fa( $block_content, $block ) { // always load for those. static $always_load = [ - 'themeisle-blocks/sharing-icons' => true, - 'themeisle-blocks/plugin-cards' => true, + 'themeisle-blocks/plugin-cards' => true, ]; if ( isset( $always_load[ $block['blockName'] ] ) ) { @@ -944,6 +957,13 @@ public function subscribe_fa( $block_content, $block ) { } } + if ( 'themeisle-blocks/timeline-item' === $block['blockName'] && + ( isset( $block['innerHTML'] ) && false !== strpos( $block['innerHTML'], 'fa-' ) ) + ) { + self::$is_fa_loaded = true; + return $block_content; + } + return $block_content; } @@ -1054,20 +1074,13 @@ public static function get_active_widgets_content() { return $content; } - global $wp_registered_widgets; $valid_widgets = array(); $widget_data = get_option( 'widget_block', array() ); - // Loop through all widgets, and add any that are active. - foreach ( $wp_registered_widgets as $widget_name => $widget ) { - if ( ! in_array( $widget['id'], self::$widget_used, true ) ) { - continue; - } - - $key = $widget['params'][0]['number']; - - if ( isset( $widget_data[ $key ] ) ) { - $valid_widgets[] = (object) $widget_data[ $key ]; + foreach ( self::$widget_used as $widget_id ) { + $widget_id = str_replace( 'block-', '', $widget_id ); + if ( isset( $widget_data[ $widget_id ] ) ) { + $valid_widgets[] = (object) $widget_data[ $widget_id ]; } } diff --git a/inc/css/blocks/class-advanced-heading-css.php b/inc/css/blocks/class-advanced-heading-css.php index a585f3cbf..3e49d77d9 100644 --- a/inc/css/blocks/class-advanced-heading-css.php +++ b/inc/css/blocks/class-advanced-heading-css.php @@ -490,7 +490,7 @@ public function render_css( $block ) { 'property' => '--padding-mobile', 'value' => 'paddingMobile', 'condition' => function( $attrs ) { - return isset( $attrs['paddingTablet'] ) && is_array( $attrs['paddingTablet'] ); + return isset( $attrs['paddingMobile'] ) && is_array( $attrs['paddingMobile'] ); }, 'format' => function( $value ) { return CSS_Utility::render_box( $value ); diff --git a/inc/css/blocks/class-flip-css.php b/inc/css/blocks/class-flip-css.php index dc9aad554..a119f1460 100644 --- a/inc/css/blocks/class-flip-css.php +++ b/inc/css/blocks/class-flip-css.php @@ -179,7 +179,7 @@ public function render_css( $block ) { }, ), 'size' => array( - 'value' => 'backgroundSize', + 'value' => 'frontBackgroundSize', 'default' => 'auto', ), ), @@ -241,7 +241,7 @@ public function render_css( $block ) { }, ), 'size' => array( - 'value' => 'backgroundSize', + 'value' => 'backBackgroundSize', 'default' => 'auto', ), ), diff --git a/inc/css/blocks/class-posts-css.php b/inc/css/blocks/class-posts-css.php index 481a1c638..1802b7a19 100644 --- a/inc/css/blocks/class-posts-css.php +++ b/inc/css/blocks/class-posts-css.php @@ -62,6 +62,10 @@ public function render_css( $block ) { 'property' => '--background-color', 'value' => 'backgroundColor', ), + array( + 'property' => '--background-overlay', + 'value' => 'backgroundOverlay', + ), array( 'property' => '--border-color', 'value' => 'borderColor', @@ -204,6 +208,10 @@ public function render_css( $block ) { return isset( $attrs['imageBoxShadow'] ) && true === $attrs['imageBoxShadow']['active']; }, ), + array( + 'property' => '--image-ratio', + 'value' => 'imageRatio', + ), array( 'property' => '--border-width', 'value' => 'borderWidth', @@ -395,6 +403,38 @@ public function render_css( $block ) { ) ); + if ( isset( $block['attrs']['cardBorderRadius'] ) && is_array( $block['attrs']['cardBorderRadius'] ) ) { + $border_radius_properties = array( + 'top' => '--border-radius-start-start', + 'right' => '--border-radius-start-end', + 'bottom' => '--border-radius-end-start', + 'left' => '--border-radius-end-end', + ); + + $properties = array_map( + function( $position, $css_variable ) { + return array( + 'property' => $css_variable, + 'value' => 'cardBorderRadius', + 'format' => function( $value, $attrs ) use ( $position ) { + return $value[ $position ]; + }, + 'condition' => function( $attrs ) { + // @phpstan-ignore-next-line + return isset( $attrs['className'] ) && strpos( $attrs['className'], 'is-style-tiled' ) !== false; + }, + ); + }, + array_keys( $border_radius_properties ), + $border_radius_properties + ); + + $css->add_item( + array( + 'properties' => $properties, + ) + ); + } $style = $css->generate(); diff --git a/inc/css/blocks/class-timeline-css.php b/inc/css/blocks/class-timeline-css.php new file mode 100644 index 000000000..c5612f228 --- /dev/null +++ b/inc/css/blocks/class-timeline-css.php @@ -0,0 +1,117 @@ +add_item( + array( + 'properties' => array( + array( + 'property' => '--o-timeline-cnt-bg', + 'value' => 'containerBackgroundColor', + ), + array( + 'property' => '--o-timeline-cnt-br-c', + 'value' => 'containerBorderColor', + ), + array( + 'property' => '--o-timeline-i-font-size', + 'value' => 'iconSize', + ), + array( + 'property' => '--o-timeline-i-color', + 'value' => 'iconColor', + ), + array( + 'property' => '--o-timeline-v-color', + 'value' => 'verticalLineColor', + ), + array( + 'property' => '--o-timeline-v-width', + 'value' => 'verticalLineWidth', + ), + array( + 'property' => '--o-timeline-cnt-br-w', + 'value' => 'containerBorder', + 'format' => function( $value, $attrs ) { + return CSS_Utility::box_values( + $value, + array( + 'left' => '8px', + 'right' => '8px', + 'top' => '8px', + 'bottom' => '8px', + ) + ); + }, + ), + array( + 'property' => '--o-timeline-cnt-br-r', + 'value' => 'containerRadius', + 'format' => function( $value, $attrs ) { + return CSS_Utility::box_values( + $value, + array( + 'left' => '8px', + 'right' => '8px', + 'top' => '8px', + 'bottom' => '8px', + ) + ); + }, + ), + array( + 'property' => '--o-timeline-cnt-pd', + 'value' => 'containerPadding', + 'format' => function( $value, $attrs ) { + return CSS_Utility::box_values( + $value, + array( + 'left' => '20px', + 'right' => '20px', + 'top' => '20px', + 'bottom' => '20px', + ) + ); + }, + ), + ), + ) + ); + + $style = $css->generate(); + + return $style; + } +} diff --git a/inc/css/blocks/class-timeline-item-css.php b/inc/css/blocks/class-timeline-item-css.php new file mode 100644 index 000000000..00cf1d8a6 --- /dev/null +++ b/inc/css/blocks/class-timeline-item-css.php @@ -0,0 +1,90 @@ +add_item( + array( + 'properties' => array( + array( + 'property' => '--o-timeline-cnt-bg', + 'value' => 'containerBackgroundColor', + ), + array( + 'property' => '--o-timeline-cnt-br-c', + 'value' => 'containerBorderColor', + ), + array( + 'property' => '--o-timeline-i-color', + 'value' => 'iconColor', + ), + array( + 'property' => '--o-timeline-cnt-br-w', + 'value' => 'containerBorder', + 'format' => function( $value, $attrs ) { + return CSS_Utility::box_values( + $value, + array( + 'left' => '8px', + 'right' => '8px', + 'top' => '8px', + 'bottom' => '8px', + ) + ); + }, + ), + array( + 'property' => '--o-timeline-cnt-br-r', + 'value' => 'containerRadius', + 'format' => function( $value, $attrs ) { + return CSS_Utility::box_values( + $value, + array( + 'left' => '8px', + 'right' => '8px', + 'top' => '8px', + 'bottom' => '8px', + ) + ); + }, + ), + ), + ) + ); + + $style = $css->generate(); + + return $style; + } +} diff --git a/inc/integrations/api/form-request-data.php b/inc/integrations/api/form-request-data.php index 8c8039488..0a9af6ad7 100644 --- a/inc/integrations/api/form-request-data.php +++ b/inc/integrations/api/form-request-data.php @@ -96,6 +96,8 @@ class Form_Data_Request { /** * A list of warning codes. + * + * Those are used to inform the admin about some issues that happened during the form submission. * * @var array $warning_codes Warning codes. * @since 2.2.5 diff --git a/inc/integrations/api/form-response-data.php b/inc/integrations/api/form-response-data.php index 0d93c372d..7d79d2d53 100644 --- a/inc/integrations/api/form-response-data.php +++ b/inc/integrations/api/form-response-data.php @@ -343,6 +343,9 @@ public function set_is_credential_error( $is_credential_error ) { * @since 2.1.7 */ public function process_error_code() { + if ( ! $this->has_error() ) { + return; + } $this->add_reason( self::get_error_code_message( $this->response['code'] ) ); } @@ -393,9 +396,15 @@ public static function get_error_code_message( $error_code ) { self::ERROR_STRIPE_METADATA_RECORD_NOT_FOUND => __( 'The metadata submission record was not found.', 'otter-blocks' ), self::ERROR_RUNTIME_STRIPE_SESSION_VALIDATION => __( 'The payment has been processed. You will be contacted by the support team.', 'otter-blocks' ), ); + + // Give more details to the admin. + if ( is_user_logged_in() && current_user_can( 'manage_options' ) ) { + $error_messages[ self::ERROR_EMAIL_NOT_SEND ] .= ' ' . __( 'The function `wp_mail` is not working properly. Please check the email provider settings.', 'otter-blocks' ); + $error_messages[ self::ERROR_FILE_UPLOAD_TYPE_WP ] .= ' ' . __( 'The `wp_check_filetype` function could not validate the file type. Please check the server settings.', 'otter-blocks' ); + } if ( ! isset( $error_messages[ $error_code ] ) ) { - return 'Expected error whatever message'; + return __( 'Unknown error.', 'otter-blocks' ); } return $error_messages[ $error_code ]; diff --git a/inc/integrations/providers/class-mailchimp.php b/inc/integrations/providers/class-mailchimp.php index a03b3849e..50231dd79 100644 --- a/inc/integrations/providers/class-mailchimp.php +++ b/inc/integrations/providers/class-mailchimp.php @@ -35,6 +35,13 @@ class Mailchimp_Integration implements FormSubscribeServiceInterface { */ protected $server_name = ''; + /** + * The form data. + * + * @var Form_Data_Request|null + */ + protected $form_data = null; + /** * The default constructor. @@ -110,16 +117,24 @@ function( $item ) { * * @param string $email The email address. * @return array|\WP_Error The response from Mailchimp. + * + * @see https://mailchimp.com/developer/marketing/api/list-members/add-member-to-list/ */ public function make_subscribe_request( $email ) { $user_status = $this->get_new_user_status_mailchimp( $this->list_id ); $url = 'https://' . $this->server_name . '.api.mailchimp.com/3.0/lists/' . $this->list_id . '/members/' . md5( strtolower( $email ) ); - + $payload = array( 'email_address' => $email, 'status' => $user_status, ); + + $linked_merge_fields = $this->get_linked_merge_fields(); + if ( ! empty( $linked_merge_fields ) ) { + $url = add_query_arg( 'skip_merge_validation', 'true', $url ); + $payload['merge_fields'] = $linked_merge_fields; + } $args = array( 'method' => 'PUT', @@ -141,9 +156,10 @@ public function make_subscribe_request( $email ) { */ public function subscribe( $form_data ) { - $email = $form_data->get_first_email_from_input_fields(); - $response = $this->make_subscribe_request( $email ); - $body = json_decode( wp_remote_retrieve_body( $response ), true ); + $this->form_data = $form_data; + $email = $form_data->get_first_email_from_input_fields(); + $response = $this->make_subscribe_request( $email ); + $body = json_decode( wp_remote_retrieve_body( $response ), true ); if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) { @@ -284,4 +300,99 @@ public function get_information_from_provider( $request ) { private function is_credential_error( $response_code ) { return in_array( $response_code, array( 401, 403, 404, 500 ) ); } + + /** + * Get the merge fields from Mailchimp. + * + * @return array An array of merge fields, each containing: + * - string $tag The merge field's tag + * - string $type The merge field's type (e.g., 'text') + * @since 2.7.0 + * + * @see https://mailchimp.com/developer/marketing/api/list-merges/list-merge-fields/ + */ + public function get_merge_fields() { + $url = 'https://' . $this->server_name . '.api.mailchimp.com/3.0/lists/' . $this->list_id . '/merge-fields'; + $args = array( + 'method' => 'GET', + 'headers' => array( + 'Authorization' => 'Basic ' . base64_encode( 'user:' . $this->api_key ), + ), + ); + + if ( function_exists( 'vip_safe_wp_remote_get' ) ) { + $response = vip_safe_wp_remote_get( $url, '', 3, 1, 20, $args ); + } else { + $response = wp_remote_get( $url, $args ); // phpcs:ignore WordPressVIPMinimum.Functions.RestrictedFunctions.wp_remote_get_wp_remote_get + } + + if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) { + return array(); + } + + $body = json_decode( wp_remote_retrieve_body( $response ), true ); + + if ( ! isset( $body['merge_fields'] ) || empty( $body['merge_fields'] ) ) { + return array(); + } + + return array_filter( + $body['merge_fields'], + function( $item ) { + return ! empty( $item['tag'] ); + } + ); + } + + /** + * Link the form fields with their corresponding merge fields. + * + * @return array The available merge fields to link with the form fields. + * @since 2.7.0 + */ + protected function get_linked_merge_fields() { + + // Check if it is necessary to link the fields. + $form_fields = $this->form_data->get_fields(); + if ( empty( $form_fields ) ) { + return array(); + } + + $available_fields_tags = array(); + + foreach ( $form_fields as $field ) { + if ( empty( $field['metadata']['mappedName'] ) ) { + continue; + } + + $available_fields_tags[] = array( + 'tag' => strtoupper( $field['metadata']['mappedName'] ), + 'value' => $field['value'], + ); + } + + if ( empty( $available_fields_tags ) ) { + return array(); + } + + + $merge_fields = $this->get_merge_fields(); + if ( empty( $merge_fields ) ) { + return array(); + } + + // Link based on the tag of the merge fields. + $linked_fields = array(); + foreach ( $available_fields_tags as $field ) { + foreach ( $merge_fields as $merge_field ) { + if ( $field['tag'] !== $merge_field['tag'] ) { + continue; + } + + $linked_fields[ $merge_field['tag'] ] = $field['value']; + } + } + + return $linked_fields; + } } diff --git a/inc/patterns/business-about.php b/inc/patterns/business-about.php new file mode 100644 index 000000000..5f3033310 --- /dev/null +++ b/inc/patterns/business-about.php @@ -0,0 +1,12 @@ + __( 'Business - About', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'pages', 'business-pack' ), + 'content' => '
This is an overline
Our Team
Founder / CEO
Operations
Operations

Schedule a free consulting call with a representative

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/business-contact.php b/inc/patterns/business-contact.php new file mode 100644 index 000000000..01a500a54 --- /dev/null +++ b/inc/patterns/business-contact.php @@ -0,0 +1,12 @@ + __( 'Business - Contact', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'pages', 'business-pack' ), + 'content' => '
Have a Question?

Visit our Office

Our Address

4814 Hewes Avenue
Salisbury, Maryland
21875

Call Us

Phone number: 443-669-4259

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/business-homepage.php b/inc/patterns/business-homepage.php new file mode 100644 index 000000000..40601aebd --- /dev/null +++ b/inc/patterns/business-homepage.php @@ -0,0 +1,12 @@ + __( 'Business - Homepage', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'pages', 'business-pack' ), + 'content' => '

Business consulting with a different approach

This is a description for the hero section. Synergestic actionables. Organic growth deep dive but circle back.

This is an overline

“... Synergestic actionables. Organic growth deep dive but circle back or but what\'s the real problem we\'re trying to solve here?...”

Jason Johnson

CEO, Founder

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/business-service.php b/inc/patterns/business-service.php new file mode 100644 index 000000000..c89bdf054 --- /dev/null +++ b/inc/patterns/business-service.php @@ -0,0 +1,12 @@ + __( 'Business - Service', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'pages', 'business-pack' ), + 'content' => '
hassle-free HR management

Feature 1
FEATURE 2

Schedule a free consulting call with a representative

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/business-services.php b/inc/patterns/business-services.php new file mode 100644 index 000000000..2fa1b030e --- /dev/null +++ b/inc/patterns/business-services.php @@ -0,0 +1,12 @@ + __( 'Business - Services', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'pages', 'business-pack' ), + 'content' => '
This is an overline

Start planning for a bright future for your company

Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring.

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/call-to-action.php b/inc/patterns/call-to-action-1.php similarity index 98% rename from inc/patterns/call-to-action.php rename to inc/patterns/call-to-action-1.php index 98a874d16..02e4410bf 100644 --- a/inc/patterns/call-to-action.php +++ b/inc/patterns/call-to-action-1.php @@ -7,6 +7,6 @@ return array( 'title' => __( 'Call to Action', 'otter-blocks' ), - 'categories' => array( 'otter-blocks', 'cta' ), + 'categories' => array( 'otter-blocks', 'call-to-action' ), 'content' => '

A call to action section

A Call to action section

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation ); diff --git a/inc/patterns/call-to-action-2.php b/inc/patterns/call-to-action-2.php new file mode 100644 index 000000000..4b58827f5 --- /dev/null +++ b/inc/patterns/call-to-action-2.php @@ -0,0 +1,12 @@ + __( 'Call to Action', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'call-to-action' ), + 'content' => '

Want to work with me? Check my Services

I love making art and creating cool things. I\'ve been drawing since I was a kid and it\'s something I enjoy doing a lot.

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/call-to-action-3.php b/inc/patterns/call-to-action-3.php new file mode 100644 index 000000000..d941c0edb --- /dev/null +++ b/inc/patterns/call-to-action-3.php @@ -0,0 +1,12 @@ + __( 'Call to Action', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'call-to-action' ), + 'content' => '

Download my eBook for Free

Follow me on social and get exclusive recipes and deals!

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/call-to-action-4.php b/inc/patterns/call-to-action-4.php new file mode 100644 index 000000000..56d33a2b9 --- /dev/null +++ b/inc/patterns/call-to-action-4.php @@ -0,0 +1,12 @@ + __( 'Call to Action', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'call-to-action' ), + 'content' => '

Schedule a free consulting call with a representative

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/call-to-action-5.php b/inc/patterns/call-to-action-5.php new file mode 100644 index 000000000..557635d03 --- /dev/null +++ b/inc/patterns/call-to-action-5.php @@ -0,0 +1,12 @@ + __( 'Call to Action', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'call-to-action' ), + 'content' => '

Follow me on Social!

Synergestic actionables. Organic growth deep dive but circle back or but what\'s the real problem we\'re trying to solve here?

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/call-to-action-6.php b/inc/patterns/call-to-action-6.php new file mode 100644 index 000000000..d6f5d4e71 --- /dev/null +++ b/inc/patterns/call-to-action-6.php @@ -0,0 +1,12 @@ + __( 'Call to Action', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'call-to-action' ), + 'content' => '
SECTION OVERLINE

Get an introductory lesson for free!

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/call-to-action-7.php b/inc/patterns/call-to-action-7.php new file mode 100644 index 000000000..b670320ab --- /dev/null +++ b/inc/patterns/call-to-action-7.php @@ -0,0 +1,12 @@ + __( 'Call to Action', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'call-to-action', 'forms' ), + 'content' => '

Get a Quote

Jason Vickens

Partnerships Manager

(081) 1149-5421-2315u003c

JASON@INDUSTRIAL

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/contact-details-and-form.php b/inc/patterns/contact-details-and-form.php index adf110830..410322376 100644 --- a/inc/patterns/contact-details-and-form.php +++ b/inc/patterns/contact-details-and-form.php @@ -7,6 +7,6 @@ return array( 'title' => __( 'Contact Details and Form', 'otter-blocks' ), - 'categories' => array( 'otter-blocks', 'columns', 'footer' ), + 'categories' => array( 'otter-blocks', 'columns', 'forms', 'footer' ), 'content' => '

Send us a message!

Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem.

0030 6964 12345

hello@otterblocks.com

21 Jump Street, San Francisco

Follow on Social

You agree to receive email communication from us by submitting this form.

', ); diff --git a/inc/patterns/features-1.php b/inc/patterns/features-1.php new file mode 100644 index 000000000..861b3fbf1 --- /dev/null +++ b/inc/patterns/features-1.php @@ -0,0 +1,12 @@ + __( 'Features', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'features', 'columns' ), + 'content' => '
WHY CHOOSE US

Trust

Quality

Innovation

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/features-2.php b/inc/patterns/features-2.php new file mode 100644 index 000000000..702743377 --- /dev/null +++ b/inc/patterns/features-2.php @@ -0,0 +1,12 @@ + __( 'Features', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'features', 'columns' ), + 'content' => '
This is an overline
', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/features-3.php b/inc/patterns/features-3.php new file mode 100644 index 000000000..8aede8d68 --- /dev/null +++ b/inc/patterns/features-3.php @@ -0,0 +1,12 @@ + __( 'Features', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'features', 'columns' ), + 'content' => '
SECTION OVERLINE

Why workout here?

Boost your Fitness

Click edit button to change this text. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Mindful Training

Click edit button to change this text. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Core strength

Click edit button to change this text. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/features-4.php b/inc/patterns/features-4.php new file mode 100644 index 000000000..6896384bd --- /dev/null +++ b/inc/patterns/features-4.php @@ -0,0 +1,12 @@ + __( 'Features', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'features', 'columns' ), + 'content' => '
READ MORE
READ MORE
READ MORE
', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/features-5.php b/inc/patterns/features-5.php new file mode 100644 index 000000000..1d79d8d40 --- /dev/null +++ b/inc/patterns/features-5.php @@ -0,0 +1,12 @@ + __( 'Features', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'features', 'columns' ), + 'content' => '
', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/fitness-about.php b/inc/patterns/fitness-about.php new file mode 100644 index 000000000..6fb39964a --- /dev/null +++ b/inc/patterns/fitness-about.php @@ -0,0 +1,12 @@ + __( 'Fitness - About', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'pages', 'fitness-pack' ), + 'content' => '

Our Gym

SECTION OVERLINE

A place to workout

https://www.youtube.com/watch?v=72BSZupb-1I

Experienced

Click edit button to change this text. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Professional

Click edit button to change this text. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Motivated

Click edit button to change this text. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

SECTION OVERLINE

Get an introductory lesson for free!

List item 5

List item 5

List item 5

List item 5

List item 5

ALBERT GARRETT

IN THE CENTRE OF THE CITY

Come visit us!

9:00 AM TO 11:00 PM (SUNDAY CLOSED)

Kale chips knausgaard mustache blog fashion axe selfies salvia. Gluten-free post-ironic deep v typewriter. Cloud bread flannel poke, flexitarian vinyl iPhone church-key shaman williamsburg kitsch beard.

0032-773 88291HELLO@NEVEFIT.COM21 JUMP STREET, SAN FRANCISCO
', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/fitness-contact.php b/inc/patterns/fitness-contact.php new file mode 100644 index 000000000..ca5c00176 --- /dev/null +++ b/inc/patterns/fitness-contact.php @@ -0,0 +1,12 @@ + __( 'Fitness - Contact', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'pages', 'fitness-pack' ), + 'content' => '

Contact us

LET\'S MEET EACH OTHER0032-773 88291HELLO@NEVEFIT.COM21 JUMP STREET, SAN FRANCISCO
', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/fitness-group.php b/inc/patterns/fitness-group.php new file mode 100644 index 000000000..a7c9b847b --- /dev/null +++ b/inc/patterns/fitness-group.php @@ -0,0 +1,12 @@ + __( 'Fitness - Group', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'pages', 'fitness-pack' ), + 'content' => '

Crossfit

BENEFITS
STRENGTH
80%
MINDSET
27%
ENDURANCE
39%

Monday


18:00-19:00

20:00-21:00

Wednesday


18:00-19:00

20:00-21:00

Friday


18:00-19:00

20:00-21:00

SECTION OVERLINE

Membership options

3 LESSONS PER WEEKSAVE 10%
3 LESSONS PER WEEKCANCEL ANYTIME
PAY AS YOU GOCANCEL ANYTIME
SECTION OVERLINE

With Jason Drone

Kale chips knausgaard mustache blog fashion axe selfies salvia. Gluten-free post-ironic deep v typewriter. Cloud bread flannel poke, flexitarian vinyl iPhone church-key shaman williamsburg kitsch beard.

SECTION OVERLINE

List item 5

List item 5

List item 5

List item 5

List item 5

JERRY FREEMAN

List item 5

List item 5

List item 5

List item 5

List item 5

JERRY FREEMAN

List item 5

List item 5

List item 5

List item 5

List item 5

JERRY FREEMAN
SECTION OVERLINE

Get an introductory lesson for free!

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/fitness-groups.php b/inc/patterns/fitness-groups.php new file mode 100644 index 000000000..e79725ab1 --- /dev/null +++ b/inc/patterns/fitness-groups.php @@ -0,0 +1,12 @@ + __( 'Fitness - Groups', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'pages', 'fitness-pack' ), + 'content' => '

Training Groups

Weights training


WITH Anne Anderson

WEDNESDAY 18:00-19:00

FRIDAY 20:00-21:00

Crossfit


WITH James Anderson

WEDNESDAY 18:00-19:00

FRIDAY 20:00-21:00


WITH JOHN SATHAM

WEDNESDAY 18:00-19:00

FRIDAY 20:00-21:00

EXPERT STAFF

Our Trainer team

CROSSFIT

James Anderson

Kale chips knausgaard mustache blog fashion axe selfies salvia.

WEIGHTS

Anne Anderson

Kale chips knausgaard mustache blog fashion axe selfies salvia.

PILATES

Mike Williams

Kale chips knausgaard mustache blog fashion axe selfies salvia.

SECTION OVERLINE

Weekly class schedule


18:00-19:00 - PILATES

20:00-21:00 - CROSSFIT

20:00-21:00 - WEIGHTS

20:00-21:00 - PILATES

20:00-21:00 - CROSSFIT


18:00-19:00 - PILATES

20:00-21:00 - CROSSFIT

20:00-21:00 - WEIGHTS

20:00-21:00 - PILATES

20:00-21:00 - CROSSFIT


18:00-19:00 - PILATES

20:00-21:00 - CROSSFIT

20:00-21:00 - WEIGHTS

20:00-21:00 - PILATES

20:00-21:00 - CROSSFIT


18:00-19:00 - PILATES

20:00-21:00 - CROSSFIT

20:00-21:00 - WEIGHTS

20:00-21:00 - PILATES

20:00-21:00 - CROSSFIT


18:00-19:00 - PILATES

20:00-21:00 - CROSSFIT

20:00-21:00 - WEIGHTS

20:00-21:00 - PILATES

20:00-21:00 - CROSSFIT


18:00-19:00 - PILATES

20:00-21:00 - CROSSFIT

20:00-21:00 - WEIGHTS

20:00-21:00 - PILATES

20:00-21:00 - CROSSFIT

SECTION OVERLINE

Get an introductory lesson for free!

SECTION OVERLINE

Frequently asked Questions

Can I have a personal training session?

Click edit button to change this text. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.

I want more information on the schedule

Click edit button to change this text. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.

Is the introductory lesson really free?

Click edit button to change this text. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/fitness-homepage.php b/inc/patterns/fitness-homepage.php new file mode 100644 index 000000000..9f8b20a64 --- /dev/null +++ b/inc/patterns/fitness-homepage.php @@ -0,0 +1,12 @@ + __( 'Fitness - Homepage', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'pages', 'fitness-pack' ), + 'content' => '

A Cutting-edge Fitness Gym

Welcome to a Gym where training happens in a different way. Get active and come workout with us!

SECTION OVERLINE

Welcome to our Gym

SECTION OVERLINE

Why workout here?

Boost your Fitness

Click edit button to change this text. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Mindful Training

Click edit button to change this text. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Core strength

Click edit button to change this text. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

SECTION OVERLINE

Testimonials

List item 5

List item 5

List item 5

List item 5

List item 5

ANTHONY MARTIN

List item 5

List item 5

List item 5

List item 5

List item 5

JERRY FREEMAN

SECTION OVERLINE

Our classes

Weights

Crossfit

Pilates

CONNECT ON SOCIAL
SECTION OVERLINE

Get an introductory lesson for free!

GYM IN ACTION

Image Gallery

8k

PEOPLE TRAINED

220

SQUARE FEET AREA

7

YEARS OF EXPERIENCE
IN THE CENTRE OF THE CITY

Come visit us!

9:00 AM TO 11:00 PM (SUNDAY CLOSED)0032-773 88291HELLO@NEVEFIT.COM21 JUMP STREET, SAN FRANCISCO
', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/form-1.php b/inc/patterns/form-1.php new file mode 100644 index 000000000..da1dc29b3 --- /dev/null +++ b/inc/patterns/form-1.php @@ -0,0 +1,12 @@ + __( 'Form', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'forms' ), + 'content' => '
', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/form-2.php b/inc/patterns/form-2.php new file mode 100644 index 000000000..6690f185e --- /dev/null +++ b/inc/patterns/form-2.php @@ -0,0 +1,12 @@ + __( 'Form', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'forms' ), + 'content' => '

I will be happy to hear from you! Feel free to view my services and work with me on your next project.

You agree to receive email communication from us by submitting this form and understand that your contact information will be stored with us.

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/form-3.php b/inc/patterns/form-3.php new file mode 100644 index 000000000..0b417e360 --- /dev/null +++ b/inc/patterns/form-3.php @@ -0,0 +1,12 @@ + __( 'Form', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'forms' ), + 'content' => '
LET\'S MEET EACH OTHER0032-773 88291HELLO@NEVEFIT.COM21 JUMP STREET, SAN FRANCISCO
', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/form-4.php b/inc/patterns/form-4.php new file mode 100644 index 000000000..39b2f0c3b --- /dev/null +++ b/inc/patterns/form-4.php @@ -0,0 +1,12 @@ + __( 'Form', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'forms' ), + 'content' => '
WORKING WITH US
', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/hero-1.php b/inc/patterns/hero-1.php new file mode 100644 index 000000000..6ddd6683d --- /dev/null +++ b/inc/patterns/hero-1.php @@ -0,0 +1,12 @@ + __( 'Hero', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'header' ), + 'content' => '

A Cutting-edge Fitness Gym

Welcome to a Gym where training happens in a different way. Get active and come workout with us!

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/hero-2.php b/inc/patterns/hero-2.php new file mode 100644 index 000000000..795e21d6a --- /dev/null +++ b/inc/patterns/hero-2.php @@ -0,0 +1,12 @@ + __( 'Hero', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'featured', 'header' ), + 'content' => '

Business consulting with a different approach

This is a description for the hero section. Synergestic actionables. Organic growth deep dive but circle back.

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/industrial-about.php b/inc/patterns/industrial-about.php new file mode 100644 index 000000000..ab902c738 --- /dev/null +++ b/inc/patterns/industrial-about.php @@ -0,0 +1,12 @@ + __( 'Industrial - About', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'pages', 'business-pack' ), + 'content' => '

About Us

INNOVATION AND CRAFTSMANSHIP

Experienced Team

Centralized Software Delivery

Latest technology stack

Hella wayfarers microdosing sartorial single-origin coffee.
Chillwave life gentrify live edge williamsburg edison bulb,
subway tile.

COMPANY CEO

Vincent Reynolds

WHY CHOOSE US

Trust

Quality

Innovation

SECTION OVERLINE

CEO - COFOUNDER

HEAD OF R&D

MARKETING MANAGER

Our Achievements

Create custom header layouts in your favourite page builder and display.

990+

PROJECTS

130k

ACTIVE CUSTOMERS

45

YEARS OF EXPERIENCE

220+

PARTNERS
', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/industrial-homepage.php b/inc/patterns/industrial-homepage.php new file mode 100644 index 000000000..6032a4d5f --- /dev/null +++ b/inc/patterns/industrial-homepage.php @@ -0,0 +1,12 @@ + __( 'Industrial - Homepage', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'pages', 'business-pack' ), + 'content' => '

Industry Largest
Company

Ramps photo booth gastropub af, gluten-free cronut 3 wolf moon DIY umami
neutra vaporware vexillologist occupy. Lomo fam YOLO kitsch polaroid. Prism
kitsch kombucha keffiyeh art party direct trade mixtap.

HIGH PERFORMANCE SINCE 1974

About Us

WE ARE MATERIALYARD

We Provide Best Service

Adaptogen artisan aesthetic, lomo swag street art salvia kombucha e Freegan chia ullamco reprehenderit chicharrones, echo park esse tilde. 90’s hammock do cupidatat, edison bulb mumblecore vape cloud bread put a bird on it dreamcatcher artisan lomo raw denim.

WE WORK WITH GLOBAL INDUSTRIES

Industrial B2B Solutions

READ MORE
READ MORE
READ MORE
OUR CLIENTS
WHAT PEOPLE SAY

Our Clients Reviews

Adaptogen artisan aesthetic, lomo swag street art salvia kombucha e Freegan chia ullamco reprehenderit chicharrones, echo park esse tilde. 90’s hammock do cupidatat, edison bulb mumblecore vape cloud bread put a bird on it dreamcatcher artisan lomo raw denim.

List item 5

List item 5

List item 5

List item 5

List item 5

Adaptogen artisan aesthetic, lomo swag street art salvia ucha ennui fanny pack pinterest. Irony mixtape raclette before they sold out, microng tattooed synth enamel pin blog smito nest dale.

LARRY MITCHELL

CEO - Sepino

List item 5

List item 5

List item 5

List item 5

List item 5

Adaptogen artisan aesthetic, lomo swag street art salvia ucha ennui fanny pack pinterest. Irony mixtape raclette before they sold out, microng tattooed synth enamel pin blog smito nest dale.

JEREMY KNIGHT

Alasa Engineering

WORKING WITH US
', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/industrial-service.php b/inc/patterns/industrial-service.php new file mode 100644 index 000000000..5adbdc97a --- /dev/null +++ b/inc/patterns/industrial-service.php @@ -0,0 +1,12 @@ + __( 'Industrial - Service Details', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'pages', 'business-pack' ), + 'content' => '

Heavy Metal
Machinery

OUR MINDSET

Get a Quote

Jason Vickens

Partnerships Manager

u003cstrongu003e(081) 1149-5421-2315u003c/strongu003e

u003cstrongu003eJASON@INDUSTRIAL.TIu003c/strongu003e

OUR VISION
', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/industrial-services.php b/inc/patterns/industrial-services.php new file mode 100644 index 000000000..66cc5f9e5 --- /dev/null +++ b/inc/patterns/industrial-services.php @@ -0,0 +1,12 @@ + __( 'Industrial - Services', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'pages', 'business-pack' ), + 'content' => '

Services

WE SHAPE THE FUTURE
READ MORE
READ MORE
READ MORE
READ MORE
DATA & CLOUD COMPUTING

How We Work

https://www.youtube.com/watch?v=AyWtIwwEgS0
SECTION OVERLINE
', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/pricing.php b/inc/patterns/pricing.php new file mode 100644 index 000000000..cc92b9de8 --- /dev/null +++ b/inc/patterns/pricing.php @@ -0,0 +1,12 @@ + __( 'Pricing', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'pricing' ), + 'content' => '

Illustration

$200

Lorem ipsum dolor sit amet, consectetur adipiscing.


Custom Layouts & Hooks

Unlimited Website Usage

Risk-Free Guarantee

Digital Design

$900

Lorem ipsum dolor sit amet, consectetur adipiscing.


Custom Layouts & Hooks

Unlimited Website Usage

Risk-Free Guarantee

Graphic design

$700

Lorem ipsum dolor sit amet, consectetur adipiscing.


Custom Layouts & Hooks

Unlimited Website Usage

Risk-Free Guarantee

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/team-1.php b/inc/patterns/team-1.php new file mode 100644 index 000000000..b6502a9a2 --- /dev/null +++ b/inc/patterns/team-1.php @@ -0,0 +1,12 @@ + __( 'Team 1', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'columns', 'team' ), + 'content' => '
SECTION OVERLINE

CEO - COFOUNDER

HEAD OF R&D

MARKETING MANAGER

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/team-2.php b/inc/patterns/team-2.php new file mode 100644 index 000000000..684ee77ee --- /dev/null +++ b/inc/patterns/team-2.php @@ -0,0 +1,12 @@ + __( 'Team 2', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'columns', 'team' ), + 'content' => '
Our Team
Founder / CEO
Operations
Operations
', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/testimonials-1.php b/inc/patterns/testimonials-1.php new file mode 100644 index 000000000..bc9079731 --- /dev/null +++ b/inc/patterns/testimonials-1.php @@ -0,0 +1,12 @@ + __( 'Testimonials 1', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'columns', 'testimonials' ), + 'content' => '
Jason Johnson
Julia Williams
MARK Spencer
', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/testimonials-2.php b/inc/patterns/testimonials-2.php new file mode 100644 index 000000000..4df716a6f --- /dev/null +++ b/inc/patterns/testimonials-2.php @@ -0,0 +1,12 @@ + __( 'Testimonials 2', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'columns', 'testimonials' ), + 'content' => '
SECTION OVERLINE

Testimonials

List item 5

List item 5

List item 5

List item 5

List item 5

ANTHONY MARTIN

List item 5

List item 5

List item 5

List item 5

List item 5

JERRY FREEMAN

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/patterns/testimonials-3.php b/inc/patterns/testimonials-3.php new file mode 100644 index 000000000..b99d40924 --- /dev/null +++ b/inc/patterns/testimonials-3.php @@ -0,0 +1,12 @@ + __( 'Testimonials 3', 'otter-blocks' ), + 'categories' => array( 'otter-blocks', 'columns', 'testimonials' ), + 'content' => '
WHAT PEOPLE SAY

Our Clients Reviews

Adaptogen artisan aesthetic, lomo swag street art salvia kombucha e Freegan chia ullamco reprehenderit chicharrones, echo park esse tilde. 90’s hammock do cupidatat, edison bulb mumblecore vape cloud bread put a bird on it dreamcatcher artisan lomo raw denim.

List item 5

List item 5

List item 5

List item 5

List item 5

Adaptogen artisan aesthetic, lomo swag street art salvia ucha ennui fanny pack pinterest. Irony mixtape raclette before they sold out, microng tattooed synth enamel pin blog smito nest dale.

LARRY MITCHELL

CEO - Sepino

List item 5

List item 5

List item 5

List item 5

List item 5

Adaptogen artisan aesthetic, lomo swag street art salvia ucha ennui fanny pack pinterest. Irony mixtape raclette before they sold out, microng tattooed synth enamel pin blog smito nest dale.

JEREMY KNIGHT

Alasa Engineering

', // phpcs:ignore WordPressVIPMinimum.Security.Mustache.OutputNotation +); diff --git a/inc/plugins/class-block-conditions.php b/inc/plugins/class-block-conditions.php index 421407c56..751cb7b5c 100644 --- a/inc/plugins/class-block-conditions.php +++ b/inc/plugins/class-block-conditions.php @@ -151,73 +151,39 @@ public function evaluate_condition( $condition ) { $visibility = isset( $condition['visibility'] ) ? boolval( $condition['visibility'] ) : true; if ( 'loggedInUser' === $condition['type'] ) { - if ( is_user_logged_in() ) { - return true; - } else { - return false; - } + return is_user_logged_in(); } if ( 'loggedOutUser' === $condition['type'] ) { - if ( is_user_logged_in() ) { - return false; - } else { - return true; - } + return ! is_user_logged_in(); } - if ( 'userRoles' === $condition['type'] ) { - if ( isset( $condition['roles'] ) ) { - if ( $visibility ) { - return $this->has_user_roles( $condition['roles'] ); - } else { - return ! $this->has_user_roles( $condition['roles'] ); - } - } + if ( 'userRoles' === $condition['type'] && isset( $condition['roles'] ) ) { + return $visibility ? $this->has_user_roles( $condition['roles'] ) : ! $this->has_user_roles( $condition['roles'] ); } - if ( 'postAuthor' === $condition['type'] ) { - if ( isset( $condition['authors'] ) ) { - if ( $visibility ) { - return $this->has_author( $condition['authors'] ); - } else { - return ! $this->has_author( $condition['authors'] ); - } - } + if ( 'postAuthor' === $condition['type'] && isset( $condition['authors'] ) ) { + return $visibility ? $this->has_author( $condition['authors'] ) : ! $this->has_author( $condition['authors'] ); } - if ( 'postType' === $condition['type'] ) { - if ( isset( $condition['post_types'] ) ) { - if ( $visibility ) { - return $this->is_type( $condition['post_types'] ); - } else { - return ! $this->is_type( $condition['post_types'] ); - } - } + if ( 'postType' === $condition['type'] && isset( $condition['post_types'] ) ) { + return $visibility ? $this->is_type( $condition['post_types'] ) : ! $this->is_type( $condition['post_types'] ); } - if ( 'postCategory' === $condition['type'] ) { - if ( isset( $condition['categories'] ) ) { - if ( $visibility ) { - return $this->has_category( $condition['categories'] ); - } else { - return ! $this->has_category( $condition['categories'] ); - } - } + if ( 'postCategory' === $condition['type'] && isset( $condition['categories'] ) ) { + return $visibility ? $this->has_category( $condition['categories'] ) : ! $this->has_category( $condition['categories'] ); + } + + if ( 'postTag' === $condition['type'] && isset( $condition['tags'] ) ) { + return $visibility ? has_tag( $condition['tags'] ) : ! has_tag( $condition['tags'] ); } if ( 'screenSize' === $condition['type'] ) { return true; } - if ( 'stripePurchaseHistory' === $condition['type'] ) { - if ( isset( $condition['product'] ) && Stripe_API::has_keys() ) { - if ( $visibility ) { - return $this->has_stripe_product( $condition['product'] ); - } else { - return ! $this->has_stripe_product( $condition['product'] ); - } - } + if ( 'stripePurchaseHistory' === $condition['type'] && isset( $condition['product'] ) && Stripe_API::has_keys() ) { + return $visibility ? $this->has_stripe_product( $condition['product'] ) : ! $this->has_stripe_product( $condition['product'] ); } return apply_filters( 'otter_blocks_evaluate_condition', true, $condition, $visibility ); diff --git a/inc/plugins/class-dashboard.php b/inc/plugins/class-dashboard.php index 40f0ab696..df3306463 100644 --- a/inc/plugins/class-dashboard.php +++ b/inc/plugins/class-dashboard.php @@ -29,6 +29,7 @@ public function init() { add_action( 'admin_menu', array( $this, 'register_menu_page' ) ); add_action( 'admin_init', array( $this, 'maybe_redirect' ) ); add_action( 'admin_notices', array( $this, 'maybe_add_otter_banner' ), 30 ); + add_action( 'admin_head', array( $this, 'add_inline_css' ) ); $form_options = get_option( 'themeisle_blocks_form_emails' ); if ( ! empty( $form_options ) ) { @@ -71,8 +72,12 @@ public function register_menu_page() { add_submenu_page( 'otter', - __( 'Form Submissions', 'otter-blocks' ), - __( 'Form Submissions', 'otter-blocks' ), + __( 'Submissions', 'otter-blocks' ), + sprintf( + '
%s %s
', + esc_html__( 'Submissions', 'otter-blocks' ), + esc_html__( 'Pro', 'otter-blocks' ) + ), 'manage_options', 'form-submissions-free', array( $this, 'form_submissions_callback' ), @@ -92,6 +97,34 @@ function() { ); } + /** + * Add inline CSS. + */ + public function add_inline_css() { + ?> + + OTTER_BLOCKS_VERSION, - 'assetsPath' => OTTER_BLOCKS_URL . 'assets/', - 'stylesExist' => is_dir( $basedir ) || boolval( get_transient( 'otter_animations_parsed' ) ), - 'hasPro' => Pro::is_pro_installed(), - 'upgradeLink' => tsdk_utmify( Pro::get_url(), 'options', Pro::get_reference() ), - 'docsLink' => Pro::get_docs_url(), - 'showFeedbackNotice' => $this->should_show_feedback_notice(), - 'deal' => ! Pro::is_pro_installed() ? $offer->get_localized_data() : array(), - 'hasOnboarding' => false !== get_theme_support( FSE_Onboarding::SUPPORT_KEY ), - 'days_since_install' => round( ( time() - get_option( 'otter_blocks_install', time() ) ) / DAY_IN_SECONDS ), - 'rootUrl' => get_site_url(), + 'version' => OTTER_BLOCKS_VERSION, + 'assetsPath' => OTTER_BLOCKS_URL . 'assets/', + 'stylesExist' => is_dir( $basedir ) || boolval( get_transient( 'otter_animations_parsed' ) ), + 'hasPro' => Pro::is_pro_installed(), + 'upgradeLink' => tsdk_utmify( Pro::get_url(), 'options', Pro::get_reference() ), + 'docsLink' => Pro::get_docs_url(), + 'showFeedbackNotice' => $this->should_show_feedback_notice(), + 'deal' => ! Pro::is_pro_installed() ? $offer->get_localized_data() : array(), + 'hasOnboarding' => false !== get_theme_support( FSE_Onboarding::SUPPORT_KEY ), + 'days_since_install' => round( ( time() - get_option( 'otter_blocks_install', time() ) ) / DAY_IN_SECONDS ), + 'rootUrl' => get_site_url(), + 'neveThemePreviewUrl' => esc_url( + add_query_arg( + array( + 'theme' => 'neve', + ), + admin_url( 'theme-install.php' ) + ) + ), + 'neveThemeActivationUrl' => esc_url( + add_query_arg( + array( + 'action' => 'activate', + 'stylesheet' => 'neve', + '_wpnonce' => wp_create_nonce( 'switch-theme_neve' ), + ), + admin_url( 'themes.php' ) + ) + ), + 'neveDashboardUrl' => esc_url( + add_query_arg( + array( + 'page' => 'neve-welcome', + ), + admin_url( 'admin.php' ) + ) + ), + 'neveInstalled' => defined( 'NEVE_VERSION' ), ) ) ); @@ -300,12 +360,13 @@ private function the_otter_banner() { <?php esc_attr_e( 'Otter Blocks', 'otter-blocks' ); ?>
-

- -

+

+ + +