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 .= '
Dismiss this notice. ';
+ $notice_html .= '
';
+
+ $notice_html .= '
';
+
+ $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 .= '';
+ $notice_html .= 'installed' === $otter_status ?
+ /* translators: %s: Otter Blocks */
+ sprintf( __( 'Activate %s', 'otter-blocks' ), 'Otter Blocks' ) :
+ /* translators: %s: Otter Blocks */
+ sprintf( __( 'Install & Activate %s', 'otter-blocks' ), 'Otter Blocks' );
+ $notice_html .= ' ';
+ $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 Values Synergestic actionables. Organic growth deep dive but circle back or but what\'s the real problem we\'re trying to solve here?
Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line.
People First Synergestic actionables. Organic growth deep dive but circle back.
Quality of work Synergestic actionables. Organic growth deep dive but circle back.
Dedication Synergestic actionables. Organic growth deep dive but circle back.
Expertise Synergestic actionables. Organic growth deep dive but circle back.
Jason Stones Founder / CEO
This is a short description about the team member and his role in the company.
George Johnson Operations
This is a short description about the team member and his role in the company.
Anna Lynch Operations
This is a short description about the team member and his role in the company.
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?
Send a direct message 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.
Follow on Social User generated content in real-time will have multiple touchpoints for offshoring.
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
Dedicated to excellence in service Synergestic actionables. Organic growth deep dive but circle back. User generated content in real-time will have multiple touchpoints for offshoring.
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.
Our Services Check the services we focus on below
Business Audits Synergestic actionables. Organic growth deep dive but what\'s the real problem we\'re trying to solve here?
Organizational Support Synergestic actionables. Circle back or but what\'s the real problem we\'re trying to solve here?
Consulting Synergestic actionables. Organic growth deep dive but circle back or but what\'s the real problem.
Strategy Synergestic actionables. Organic growth deep dive but circle back or but what\'s the real problem.
Business Law Synergestic actionables. Organic growth deep dive but what\'s the real problem we\'re trying to solve here?
Human Resources Synergestic actionables. Circle back or but what\'s the real problem we\'re trying to solve here?
“... 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
Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line.
Feature 1
Staff Management Synergestic actionables. Organic growth deep dive but circle back or but what\'s the real problem we\'re trying to solve here?
FEATURE 2
Hiring Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps.
Schedule a free consulting call with a representative
Additional Services Synergestic actionables. Organic growth deep dive but circle back or but what\'s the real problem we\'re trying to solve here?
Candidates Screening Synergestic actionables. Organic growth deep dive but circle back or but what\'s the real problem we\'re trying to solve here?
Agile Management Synergestic actionables. Organic growth deep dive but circle back or but what\'s the real problem we\'re trying to solve here?
Online Portal 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/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
Multi-faceted experience and global expertise 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.
We mean business Synergestic actionables. Organic growth deep dive but circle back. User generated content in real-time.
Business Audits Synergestic actionables. Organic growth deep dive but what\'s the real problem we\'re trying to solve here?
Organizational Support Synergestic actionables. Circle back or but what\'s the real problem we\'re trying to solve here?
Consulting Synergestic actionables. Organic growth deep dive but circle back or but what\'s the real problem.
Strategy Synergestic actionables. Organic growth deep dive but circle back or but what\'s the real problem.
Business Law Synergestic actionables. Organic growth deep dive but what\'s the real problem we\'re trying to solve here?
Human Resources Synergestic actionables. Circle back or but what\'s the real problem we\'re trying to solve here?
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' => '
Jason Vickens Partnerships Manager
(081) 1149-5421-2315u003c
', // 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.
21 Jump Street, San Francisco
Follow on Social
',
);
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 45 Years of Experience 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.
Trust Freegan chia ullamco reprehenderit chicharrones, echo park esse tilde. 90’s hammock do cupidatat, edison bulb mumblecore vape cloud bread.
Quality Freegan chia ullamco reprehenderit chicharrones, echo park esse tilde. 90’s hammock do cupidatat, edison bulb mumblecore vape cloud bread.
Innovation Freegan chia ullamco reprehenderit chicharrones, echo park esse tilde. 90’s hammock do cupidatat, edison bulb mumblecore vape cloud bread.
', // 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
Get a head-start with your nutrition 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.
Science-backed recipes Synergestic actionables. Organic growth deep dive but circle back. User generated content in real-time will have multiple touchpoints for offshoring.
Easy to execute Synergestic actionables. Organic growth deep dive but circle back. User generated content in real-time will have multiple touchpoints for offshoring.
', // 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' => '
Automotive Parts Manufacturing Affogato gentrify truffaut wolf neutra cupidatat cronut schlitz, bespoke sunt.
Custom Gear Design Affogato gentrify truffaut wolf neutra cupidatat cronut schlitz, bespoke sunt.
Railroad Engineering Affogato gentrify truffaut wolf neutra cupidatat cronut schlitz, bespoke sunt.
', // 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' => '
Our Services Check the services we focus on below
Business Audits Synergestic actionables. Organic growth deep dive but what\'s the real problem we\'re trying to solve here?
Organizational Support Synergestic actionables. Circle back or but what\'s the real problem we\'re trying to solve here?
Consulting Synergestic actionables. Organic growth deep dive but circle back or but what\'s the real problem.
Strategy Synergestic actionables. Organic growth deep dive but circle back or but what\'s the real problem.
Business Law Synergestic actionables. Organic growth deep dive but what\'s the real problem we\'re trying to solve here?
Human Resources Synergestic actionables. 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/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' => '
SECTION OVERLINE A place to workout 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.
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!
Working out in this Gym has been one of the best decisions I have ever made for my fitness. Really love the positive vibes and friendly atmosphere.
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 88291 HELLO@NEVEFIT.COM 21 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' => '
LET\'S MEET EACH OTHER Send us a message! 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 88291 HELLO@NEVEFIT.COM 21 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' => '
BENEFITS Why Crossfit Cloud bread flannel poke, flexitarian vinyl iPhone church-key shaman williamsburg kitsch beard. 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
Membership options
$155.00 Annual Membership
3 LESSONS PER WEEK SAVE 10% $55.00 Monthly Membership
3 LESSONS PER WEEK CANCEL ANYTIME $15.00 Drop-in
PAY AS YOU GO CANCEL 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
Testimonials
Working out in this Gym has been one of the best decisions I have ever made for my fitness. Really love the positive vibes and friendly atmosphere.
JERRY FREEMAN Working out in this Gym has been one of the best decisions I have ever made for my fitness. Really love the positive vibes and friendly atmosphere.
JERRY FREEMAN Working out in this Gym has been one of the best decisions I have ever made for my fitness. Really love the positive vibes and friendly atmosphere.
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' => '
Weights training WITH Anne Anderson 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.
Crossfit WITH James Anderson 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.
Pilates WITH JOHN SATHAM 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.
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
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 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
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
Working out in this Gym has been one of the best decisions I have ever made for my fitness. Really love the positive vibes and friendly atmosphere.
ANTHONY MARTIN Working out in this Gym has been one of the best decisions I have ever made for my fitness. Really love the positive vibes and friendly atmosphere.
JERRY FREEMAN
SECTION OVERLINE
Our classes
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) 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 88291 HELLO@NEVEFIT.COM 21 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' => 'Hi! Thanks for your interest, if you wish to get in touch with me, send a message through this form. I will get back to you asap!
Get in touch! ', // 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' => '
Send me a message! I will be happy to hear from you! Feel free to view my services and work with me on your next project.
', // 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 OTHER Send us a message! 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 88291 HELLO@NEVEFIT.COM 21 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
Request a quote Skateboard messenger bag affogato polaroid. Forage chia coloring book yr bushwick cliche. Drinking vinegar ennui cronut tumblr. Bitters truffaut ethical actually pok pok street art.
', // 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' => '
INNOVATION AND CRAFTSMANSHIP Our Story Deserunt coloring book pug enamel pin. Voluptate copper mug sustainable pabst semiotics snackwave polaroid, tousled in prism. Forage cloud bread mustache dolor sartorial edison bulb laboris lyft vape raclette incididunt beard ea tilde pitchfork. Pork belly chillwave iceland, mollit laboris seitan master cleanse bespoke cred gentrify snackwave flannel excepteur hexagon disrupt olore pour-over.
Centralized Software Delivery
Hella wayfarers microdosing sartorial single-origin coffee. Chillwave life gentrify live edge williamsburg edison bulb, subway tile.
COMPANY CEO Vincent Reynolds
WHY CHOOSE US 45 Years of Experience 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.
Trust Freegan chia ullamco reprehenderit chicharrones, echo park esse tilde. 90’s hammock do cupidatat, edison bulb mumblecore vape cloud bread.
Quality Freegan chia ullamco reprehenderit chicharrones, echo park esse tilde. 90’s hammock do cupidatat, edison bulb mumblecore vape cloud bread.
Innovation Freegan chia ullamco reprehenderit chicharrones, echo park esse tilde. 90’s hammock do cupidatat, edison bulb mumblecore vape cloud bread.
SECTION OVERLINE
Meet Our Team
Vincent Reynolds CEO - COFOUNDER
Oliver Hendricks HEAD OF R&D
Evelyn Stevens MARKETING MANAGER
Our Achievements
Create custom header layouts in your favourite page builder and display.
', // 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 Vexillologist waistcoat biodiesel, ethical austin forage gastropub viral. Photo booth swag before they sold out, brunch disrupt affogato yr artisan viral cred. Jean shorts meggings stumptown, tacos sustainable austin chillwave flannel green juice kale chips cardigan taxidermy pabst.
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.
Auto & Marine Industry Tousled letterpre tote bag bicycle rights cliche twee hashtag pokpo demos tanero lamina sime voti
Construction Materials Tousled letterpre tote bag bicycle rights cliche twee hashtag pokpo demos tanero lamina sime voti
Maintenance & Repairs Tousled letterpre tote bag bicycle rights cliche twee hashtag pokpo demos tanero lamina sime voti
WE WORK WITH GLOBAL INDUSTRIES Industrial B2B Solutions Jianbing brunch mixtape hell of trust fund helvetica yr street art flexitarian coloring book farm-to-table. Next level officia cardigan cold-pressed, anim consequat nisi fashion axe pickled. Pop-up portland ad laborum esse
Automotive Parts Manufacturing Affogato gentrify truffaut wolf neutra cupidatat cronut schlitz, bespoke sunt.
Custom Gear Design Affogato gentrify truffaut wolf neutra cupidatat cronut schlitz, bespoke sunt.
Railroad Engineering Affogato gentrify truffaut wolf neutra cupidatat cronut schlitz, bespoke sunt.
OUR CLIENTS Around the World Lorem ipsum dolor amet vaporware lyft health goth kinfolk mlkshk, master cleanse scenester iceland. Occupy irony yuccie.
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.
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
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
Request a quote Skateboard messenger bag affogato polaroid. Forage chia coloring book yr bushwick cliche. Drinking vinegar ennui cronut tumblr. Bitters truffaut ethical actually pok pok street art.
', // 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' => '
OUR MINDSET Innovation is Key Deserunt coloring book pug enamel pin. Volutate copper mug sustainae pabst semiotics snackwave polaroid, tousled in prism. Foage cloud d mustache dolor sartorial edison bulb labors lyft vape raclette incididubeard ea tilde pitchfork. Pork belly chillwave iceland, mollit laboris seitan master cleanse bespo gentrify snackwave flannel excepteur hexagon disrupt olore pourover Pork belly poke wolf, raw denim four dollar toast typewriter venmo. Mustache mollit mlkshk green juice .
Jason Vickens Partnerships Manager
u003cstrongu003e(081) 1149-5421-2315u003c/strongu003e
u003cstrongu003eJASON@INDUSTRIAL.TIu003c/strongu003e
OUR VISION Why Choose us 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.
Professionalism Et cillum bespoke meditation bitters laboris letrpress nulla ea small batch
Lifetime Guarantee Et cillum bespoke meditation bitters laboris letrpress nulla ea small batch
Adaptable Et cillum bespoke meditation bitters laboris letrpress nulla ea small batch
24x7 Support Et cillum bespoke meditation bitters laboris letrpress nulla ea small batch
', // 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' => '
WE SHAPE THE FUTURE Years of Innovation and Craftsmanship
Automotive & Marine Industry Tousled letterpre tote bag bicycle rights cliche twee hashtag pokpo demos tanero lamina sime voti
Heavy Metal Machinery Affogato gentrify truffaut wolf neutra cupidatat cronut schlitz, bespoke sunt.
Aeronautical Industry Tousled letterpre tote bag bicycle rights cliche twee hashtag pokpo demos tanero lamina sime voti
Construction Materials Tousled letterpre tote bag bicycle rights cliche twee hashtag pokpo demos tanero lamina sime voti
DATA & CLOUD COMPUTING
How We Work
https://www.youtube.com/watch?v=AyWtIwwEgS0
SECTION OVERLINE
Our Top Clients ', // 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' => '
Service Pricing Here\'s an indicative pricing of my services
Illustration $200 Lorem ipsum dolor sit amet, consectetur adipiscing.
Digital Design $900 Lorem ipsum dolor sit amet, consectetur adipiscing.
Graphic design $700 Lorem ipsum dolor sit amet, consectetur adipiscing.
', // 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
Meet Our Team
Vincent Reynolds CEO - COFOUNDER
Oliver Hendricks HEAD OF R&D
Evelyn Stevens 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' => '
Jason Stones Founder / CEO
This is a short description about the team member and his role in the company.
George Johnson Operations
This is a short description about the team member and his role in the company.
Anna Lynch Operations
This is a short description about the team member and his role in the company.
', // 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' => '
“... Synergestic actionables. Organic growth deep dive but circle back or but what\'s the real problem we\'re trying to solve here?...”
Jason Johnson
“... Synergestic actionables. Organic growth deep dive but circle back or but what\'s the real problem we\'re trying to solve here?...”
Julia Williams
“... Synergestic actionables. Organic growth deep dive but circle back or but what\'s the real problem w\'re trying to solve here?...”
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
Working out in this Gym has been one of the best decisions I have ever made for my fitness. Really love the positive vibes and friendly atmosphere.
ANTHONY MARTIN Working out in this Gym has been one of the best decisions I have ever made for my fitness. Really love the positive vibes and friendly atmosphere.
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.
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
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(
+ '',
+ 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() {
-
-
-
+
+
+
+