diff --git a/composer.json b/composer.json index fc01e7401..db7abc9c3 100644 --- a/composer.json +++ b/composer.json @@ -42,6 +42,7 @@ "psr/container": "^1.0", "stellarwp/container-contract": "^1.1", "stellarwp/db": "^1.1", + "stellarwp/harbor": "dev-main", "stellarwp/prophecy-image-downloader": "^3.0", "stellarwp/prophecy-storage": "^3.0", "stellarwp/schema": "^2.0", @@ -83,16 +84,18 @@ "vendor/bin/stellar-uplink domain=kadence-blocks" ], "strauss-install": [ - "test -f ./bin/strauss.phar || curl -o bin/strauss.phar -L -C - https://github.com/BrianHenryIE/strauss/releases/download/0.19.1/strauss.phar" + "test -f ./bin/strauss.phar || curl -o bin/strauss.phar -L -C - https://github.com/BrianHenryIE/strauss/releases/download/0.27.0/strauss.phar" ], "strauss": [ "@strauss-install", "@php bin/strauss.phar", + "@php vendor/stellarwp/harbor/bin/stellar-harbor domain=kadence-blocks", "@composer dump-autoload" ], "strauss-release": [ "@strauss-install", "@php bin/strauss.phar --deleteVendorPackages=true", + "@php vendor/stellarwp/harbor/bin/stellar-harbor domain=kadence-blocks", "@composer dump-autoload" ], "strauss-clean": [ diff --git a/composer.lock b/composer.lock index 77382173e..fde95996b 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": "7a823630fd7197034de879f12f7ac260", + "content-hash": "9bfeef8e7638329a40d2da9f24b9d639", "packages": [ { "name": "adbario/php-dot-notation", - "version": "3.3.0", + "version": "3.5.0", "source": { "type": "git", "url": "https://github.com/adbario/php-dot-notation.git", - "reference": "a94ce4493d19ea430baa8d7d210a2c9bd7129fc2" + "reference": "aa09db5a7a365a8d2d8dd7edfa3cd501d1a8acb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/adbario/php-dot-notation/zipball/a94ce4493d19ea430baa8d7d210a2c9bd7129fc2", - "reference": "a94ce4493d19ea430baa8d7d210a2c9bd7129fc2", + "url": "https://api.github.com/repos/adbario/php-dot-notation/zipball/aa09db5a7a365a8d2d8dd7edfa3cd501d1a8acb0", + "reference": "aa09db5a7a365a8d2d8dd7edfa3cd501d1a8acb0", "shasum": "" }, "require": { @@ -25,7 +25,7 @@ "php": "^7.4 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.8", + "phpstan/phpstan": "^2.1", "phpunit/phpunit": "^9.5", "squizlabs/php_codesniffer": "^3.7" }, @@ -56,9 +56,9 @@ ], "support": { "issues": "https://github.com/adbario/php-dot-notation/issues", - "source": "https://github.com/adbario/php-dot-notation/tree/3.3.0" + "source": "https://github.com/adbario/php-dot-notation/tree/3.5.0" }, - "time": "2023-02-24T20:27:50+00:00" + "time": "2026-04-04T04:29:49+00:00" }, { "name": "composer/installers", @@ -460,6 +460,84 @@ ], "time": "2026-01-01T13:05:00+00:00" }, + { + "name": "nyholm/psr7", + "version": "1.8.2", + "source": { + "type": "git", + "url": "https://github.com/Nyholm/psr7.git", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0", + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.9", + "php-http/message-factory": "^1.0", + "php-http/psr7-integration-tests": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", + "symfony/error-handler": "^4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Nyholm\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + }, + { + "name": "Martijn van der Ven", + "email": "martijn@vanderven.se" + } + ], + "description": "A fast PHP7 implementation of PSR-7", + "homepage": "https://tnyholm.se", + "keywords": [ + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/Nyholm/psr7/issues", + "source": "https://github.com/Nyholm/psr7/tree/1.8.2" + }, + "funding": [ + { + "url": "https://github.com/Zegnat", + "type": "github" + }, + { + "url": "https://github.com/nyholm", + "type": "github" + } + ], + "time": "2024-09-09T07:06:30+00:00" + }, { "name": "phpoption/phpoption", "version": "1.9.5", @@ -583,6 +661,166 @@ }, "time": "2021-11-05T16:50:12+00:00" }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "1.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/1.1" + }, + "time": "2023-04-04T09:50:52+00:00" + }, { "name": "psr/log", "version": "1.1.4", @@ -635,16 +873,16 @@ }, { "name": "stellarwp/arrays", - "version": "1.3.1", + "version": "1.3.2", "source": { "type": "git", "url": "https://github.com/stellarwp/arrays.git", - "reference": "315a9b2018ac6f2475a346c89b1d7120ae07c218" + "reference": "e994abcdb5d76fb5fdea7f2e1549d0603c13f91e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/stellarwp/arrays/zipball/315a9b2018ac6f2475a346c89b1d7120ae07c218", - "reference": "315a9b2018ac6f2475a346c89b1d7120ae07c218", + "url": "https://api.github.com/repos/stellarwp/arrays/zipball/e994abcdb5d76fb5fdea7f2e1549d0603c13f91e", + "reference": "e994abcdb5d76fb5fdea7f2e1549d0603c13f91e", "shasum": "" }, "require-dev": { @@ -676,10 +914,9 @@ ], "description": "A library for array manipulation.", "support": { - "issues": "https://github.com/stellarwp/arrays/issues", - "source": "https://github.com/stellarwp/arrays/tree/1.3.1" + "source": "https://github.com/stellarwp/arrays/tree/1.3.2" }, - "time": "2025-02-07T18:23:13+00:00" + "time": "2026-02-12T19:58:13+00:00" }, { "name": "stellarwp/container-contract", @@ -730,16 +967,16 @@ }, { "name": "stellarwp/db", - "version": "1.2.0", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/stellarwp/db.git", - "reference": "f92d6ae0bcd74a3f526b023bb2d6ecd13227ef96" + "reference": "34d6c66adf323f4839c2199d6e1119c79fc87a4f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/stellarwp/db/zipball/f92d6ae0bcd74a3f526b023bb2d6ecd13227ef96", - "reference": "f92d6ae0bcd74a3f526b023bb2d6ecd13227ef96", + "url": "https://api.github.com/repos/stellarwp/db/zipball/34d6c66adf323f4839c2199d6e1119c79fc87a4f", + "reference": "34d6c66adf323f4839c2199d6e1119c79fc87a4f", "shasum": "" }, "require-dev": { @@ -780,9 +1017,162 @@ "description": "A WPDB wrapper and query builder library.", "support": { "issues": "https://github.com/stellarwp/db/issues", - "source": "https://github.com/stellarwp/db/tree/1.2.0" + "source": "https://github.com/stellarwp/db/tree/1.3.0" + }, + "time": "2026-02-25T17:01:46+00:00" + }, + { + "name": "stellarwp/harbor", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/stellarwp/harbor.git", + "reference": "4c544035647abf05b0e289e9e420ee1dde918ce5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/stellarwp/harbor/zipball/4c544035647abf05b0e289e9e420ee1dde918ce5", + "reference": "4c544035647abf05b0e289e9e420ee1dde918ce5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "nyholm/psr7": "^1.0", + "php": ">=7.4", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1", + "stellarwp/container-contract": "^1.0", + "stellarwp/licensing-api-client-wordpress": "^0.10" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^1", + "dpanta94/phpstan-containers": "^0", + "exussum12/coverage-checker": "^1.1", + "lucatume/codeception-snapshot-assertions": "*", + "lucatume/di52": "^3", + "lucatume/wp-browser": "*", + "php-stubs/wp-cli-stubs": "^2", + "phpcompatibility/phpcompatibility-wp": "^2", + "phpspec/prophecy": "*", + "phpspec/prophecy-phpunit": "*", + "phpstan/phpstan": "^2", + "phpunit/phpunit": "*", + "stellarwp/coding-standards": "^2", + "szepeviktor/phpstan-wordpress": ">=1.0", + "wp-cli/wp-cli": "^2" + }, + "default-branch": true, + "bin": [ + "bin/stellar-harbor" + ], + "type": "library", + "autoload": { + "psr-4": { + "LiquidWeb\\Harbor\\": "src/Harbor/", + "LiquidWeb\\Harbor\\Views\\": "src/views/", + "LiquidWeb\\Harbor\\Build_Dir\\": "build/", + "LiquidWeb\\Harbor\\Build_Dev_Dir\\": "build-dev/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Liquid Web", + "homepage": "https://liquidweb.com" + } + ], + "description": "A library that integrates a WordPress product with the Liquid Web licensing system.", + "support": { + "issues": "https://github.com/stellarwp/harbor/issues", + "source": "https://github.com/stellarwp/harbor/tree/main" + }, + "time": "2026-04-10T19:57:45+00:00" + }, + { + "name": "stellarwp/licensing-api-client", + "version": "0.10.0", + "source": { + "type": "git", + "url": "https://github.com/stellarwp/licensing-api-client.git", + "reference": "ac91bde0f9655cea43ff2f80cba588d05af24928" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/stellarwp/licensing-api-client/zipball/ac91bde0f9655cea43ff2f80cba588d05af24928", + "reference": "ac91bde0f9655cea43ff2f80cba588d05af24928", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=7.4", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.10.x-dev" + } + }, + "autoload": { + "psr-4": { + "LiquidWeb\\LicensingApiClient\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "A PHP client for the Liquid Web Licensing API.", + "support": { + "source": "https://github.com/stellarwp/licensing-api-client/tree/0.10.0" + }, + "time": "2026-04-08T22:33:46+00:00" + }, + { + "name": "stellarwp/licensing-api-client-wordpress", + "version": "0.10.0", + "source": { + "type": "git", + "url": "https://github.com/stellarwp/licensing-api-client-wordpress.git", + "reference": "53aed5017df9458d6cea86c22179c868f940ea34" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/stellarwp/licensing-api-client-wordpress/zipball/53aed5017df9458d6cea86c22179c868f940ea34", + "reference": "53aed5017df9458d6cea86c22179c868f940ea34", + "shasum": "" + }, + "require": { + "nyholm/psr7": "^1.8", + "php": ">=7.4", + "stellarwp/licensing-api-client": "^0.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.10.x-dev" + } + }, + "autoload": { + "psr-4": { + "LiquidWeb\\LicensingApiClientWordPress\\": "src/" + } }, - "time": "2025-11-10T10:55:50+00:00" + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "WordPress transport and factory integration for the Liquid Web Licensing API client.", + "support": { + "source": "https://github.com/stellarwp/licensing-api-client-wordpress/tree/0.10.0" + }, + "time": "2026-04-08T22:38:37+00:00" }, { "name": "stellarwp/prophecy-container", @@ -1059,16 +1449,16 @@ }, { "name": "stellarwp/telemetry", - "version": "2.3.4", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/stellarwp/telemetry.git", - "reference": "74c7b819d574aa5fc1392f982fb32cedc18d4c6f" + "reference": "c1b3a43359475460a17589dd0442310a81f51b24" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/stellarwp/telemetry/zipball/74c7b819d574aa5fc1392f982fb32cedc18d4c6f", - "reference": "74c7b819d574aa5fc1392f982fb32cedc18d4c6f", + "url": "https://api.github.com/repos/stellarwp/telemetry/zipball/c1b3a43359475460a17589dd0442310a81f51b24", + "reference": "c1b3a43359475460a17589dd0442310a81f51b24", "shasum": "" }, "require": { @@ -1102,9 +1492,9 @@ "description": "Telemetry library for StellarWP plugins.", "support": { "issues": "https://github.com/stellarwp/telemetry/issues", - "source": "https://github.com/stellarwp/telemetry/tree/2.3.4" + "source": "https://github.com/stellarwp/telemetry/tree/2.4.1" }, - "time": "2025-04-25T18:58:09+00:00" + "time": "2026-04-10T15:47:09+00:00" }, { "name": "stellarwp/uplink", @@ -2782,27 +3172,27 @@ }, { "name": "brain/monkey", - "version": "2.6.2", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/Brain-WP/BrainMonkey.git", - "reference": "d95a9d895352c30f47604ad1b825ab8fa9d1a373" + "reference": "ea3aeb3d559ba3c0930b3f4d210b665a4c044d83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Brain-WP/BrainMonkey/zipball/d95a9d895352c30f47604ad1b825ab8fa9d1a373", - "reference": "d95a9d895352c30f47604ad1b825ab8fa9d1a373", + "url": "https://api.github.com/repos/Brain-WP/BrainMonkey/zipball/ea3aeb3d559ba3c0930b3f4d210b665a4c044d83", + "reference": "ea3aeb3d559ba3c0930b3f4d210b665a4c044d83", "shasum": "" }, "require": { "antecedent/patchwork": "^2.1.17", - "mockery/mockery": "^1.3.5 || ^1.4.4", + "mockery/mockery": "~1.3.6 || ~1.4.4 || ~1.5.1 || ^1.6.10", "php": ">=5.6.0" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0.0", "phpcompatibility/php-compatibility": "^9.3.0", - "phpunit/phpunit": "^5.7.26 || ^6.0 || ^7.0 || >=8.0 <8.5.12 || ^8.5.14 || ^9.0" + "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.49 || ^9.6.30" }, "type": "library", "extra": { @@ -2848,7 +3238,7 @@ "issues": "https://github.com/Brain-WP/BrainMonkey/issues", "source": "https://github.com/Brain-WP/BrainMonkey" }, - "time": "2024-08-29T20:15:04+00:00" + "time": "2026-02-05T09:22:14+00:00" }, { "name": "carbonphp/carbon-doctrine-types", @@ -3582,16 +3972,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.5.10", + "version": "1.5.11", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63" + "reference": "68ff39175e8e94a4bb1d259407ce51a6a60f09e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/961a5e4056dd2e4a2eedcac7576075947c28bf63", - "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/68ff39175e8e94a4bb1d259407ce51a6a60f09e6", + "reference": "68ff39175e8e94a4bb1d259407ce51a6a60f09e6", "shasum": "" }, "require": { @@ -3638,7 +4028,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.10" + "source": "https://github.com/composer/ca-bundle/tree/1.5.11" }, "funding": [ { @@ -3650,20 +4040,20 @@ "type": "github" } ], - "time": "2025-12-08T15:06:51+00:00" + "time": "2026-03-30T09:16:10+00:00" }, { "name": "composer/class-map-generator", - "version": "1.7.1", + "version": "1.7.2", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "8f5fa3cc214230e71f54924bd0197a3bcc705eb1" + "reference": "6a9c2f0970022ab00dc58c07d0685dd712f2231b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/8f5fa3cc214230e71f54924bd0197a3bcc705eb1", - "reference": "8f5fa3cc214230e71f54924bd0197a3bcc705eb1", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/6a9c2f0970022ab00dc58c07d0685dd712f2231b", + "reference": "6a9c2f0970022ab00dc58c07d0685dd712f2231b", "shasum": "" }, "require": { @@ -3707,7 +4097,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.7.1" + "source": "https://github.com/composer/class-map-generator/tree/1.7.2" }, "funding": [ { @@ -3719,20 +4109,20 @@ "type": "github" } ], - "time": "2025-12-29T13:15:25+00:00" + "time": "2026-03-30T15:36:56+00:00" }, { "name": "composer/composer", - "version": "2.9.3", + "version": "2.9.5", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "fb3bee27676fd852a8a11ebbb1de19b4dada5aba" + "reference": "72a8f8e653710e18d83e5dd531eb5a71fc3223e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/fb3bee27676fd852a8a11ebbb1de19b4dada5aba", - "reference": "fb3bee27676fd852a8a11ebbb1de19b4dada5aba", + "url": "https://api.github.com/repos/composer/composer/zipball/72a8f8e653710e18d83e5dd531eb5a71fc3223e6", + "reference": "72a8f8e653710e18d83e5dd531eb5a71fc3223e6", "shasum": "" }, "require": { @@ -3820,7 +4210,7 @@ "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", "security": "https://github.com/composer/composer/security/policy", - "source": "https://github.com/composer/composer/tree/2.9.3" + "source": "https://github.com/composer/composer/tree/2.9.5" }, "funding": [ { @@ -3832,7 +4222,7 @@ "type": "github" } ], - "time": "2025-12-30T12:40:17+00:00" + "time": "2026-01-29T10:40:53+00:00" }, { "name": "composer/metadata-minifier", @@ -4061,24 +4451,24 @@ }, { "name": "composer/spdx-licenses", - "version": "1.5.9", + "version": "1.6.0", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "edf364cefe8c43501e21e88110aac10b284c3c9f" + "reference": "5ecd0cb4177696f9fd48f1605dda81db3dee7889" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/edf364cefe8c43501e21e88110aac10b284c3c9f", - "reference": "edf364cefe8c43501e21e88110aac10b284c3c9f", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/5ecd0cb4177696f9fd48f1605dda81db3dee7889", + "reference": "5ecd0cb4177696f9fd48f1605dda81db3dee7889", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" + "php": "^7.2 || ^8.0" }, "require-dev": { "phpstan/phpstan": "^1.11", - "symfony/phpunit-bridge": "^3 || ^7" + "symfony/phpunit-bridge": "^6.4.25 || ^7.3.3 || ^8.0" }, "type": "library", "extra": { @@ -4121,7 +4511,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/spdx-licenses/issues", - "source": "https://github.com/composer/spdx-licenses/tree/1.5.9" + "source": "https://github.com/composer/spdx-licenses/tree/1.6.0" }, "funding": [ { @@ -4131,13 +4521,9 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2025-05-12T21:07:07+00:00" + "time": "2026-04-08T20:18:39+00:00" }, { "name": "composer/xdebug-handler", @@ -4645,16 +5031,16 @@ }, { "name": "gettext/languages", - "version": "2.12.1", + "version": "2.12.2", "source": { "type": "git", "url": "https://github.com/php-gettext/Languages.git", - "reference": "0b0b0851c55168e1dfb14305735c64019732b5f1" + "reference": "079d6f4842cbcbf5673a70d8e93169a684e7aadd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-gettext/Languages/zipball/0b0b0851c55168e1dfb14305735c64019732b5f1", - "reference": "0b0b0851c55168e1dfb14305735c64019732b5f1", + "url": "https://api.github.com/repos/php-gettext/Languages/zipball/079d6f4842cbcbf5673a70d8e93169a684e7aadd", + "reference": "079d6f4842cbcbf5673a70d8e93169a684e7aadd", "shasum": "" }, "require": { @@ -4704,7 +5090,7 @@ ], "support": { "issues": "https://github.com/php-gettext/Languages/issues", - "source": "https://github.com/php-gettext/Languages/tree/2.12.1" + "source": "https://github.com/php-gettext/Languages/tree/2.12.2" }, "funding": [ { @@ -4716,7 +5102,7 @@ "type": "github" } ], - "time": "2025-03-19T11:14:02+00:00" + "time": "2026-02-23T14:05:50+00:00" }, { "name": "guzzlehttp/guzzle", @@ -4929,16 +5315,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.8.0", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "21dc724a0583619cd1652f673303492272778051" + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", - "reference": "21dc724a0583619cd1652f673303492272778051", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884", + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884", "shasum": "" }, "require": { @@ -4954,6 +5340,7 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "0.9.0", + "jshttp/mime-db": "1.54.0.1", "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "suggest": { @@ -5025,7 +5412,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.8.0" + "source": "https://github.com/guzzle/psr7/tree/2.9.0" }, "funding": [ { @@ -5041,7 +5428,7 @@ "type": "tidelift" } ], - "time": "2025-08-23T21:21:41+00:00" + "time": "2026-03-10T16:41:02+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -5312,16 +5699,16 @@ }, { "name": "justinrainbow/json-schema", - "version": "6.6.4", + "version": "6.8.0", "source": { "type": "git", "url": "https://github.com/jsonrainbow/json-schema.git", - "reference": "2eeb75d21cf73211335888e7f5e6fd7440723ec7" + "reference": "89ac92bcfe5d0a8a4433c7b89d394553ae7250cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/2eeb75d21cf73211335888e7f5e6fd7440723ec7", - "reference": "2eeb75d21cf73211335888e7f5e6fd7440723ec7", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/89ac92bcfe5d0a8a4433c7b89d394553ae7250cc", + "reference": "89ac92bcfe5d0a8a4433c7b89d394553ae7250cc", "shasum": "" }, "require": { @@ -5381,9 +5768,9 @@ ], "support": { "issues": "https://github.com/jsonrainbow/json-schema/issues", - "source": "https://github.com/jsonrainbow/json-schema/tree/6.6.4" + "source": "https://github.com/jsonrainbow/json-schema/tree/6.8.0" }, - "time": "2025-12-19T15:01:32+00:00" + "time": "2026-04-02T12:43:11+00:00" }, { "name": "lucatume/wp-browser", @@ -5571,16 +5958,16 @@ }, { "name": "mck89/peast", - "version": "v1.17.4", + "version": "v1.17.5", "source": { "type": "git", "url": "https://github.com/mck89/peast.git", - "reference": "c6a63f32410d2e4ee2cd20fe94b35af147fb852d" + "reference": "e19a8bd896b7f04941a38fd38a140c9a6531c84f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mck89/peast/zipball/c6a63f32410d2e4ee2cd20fe94b35af147fb852d", - "reference": "c6a63f32410d2e4ee2cd20fe94b35af147fb852d", + "url": "https://api.github.com/repos/mck89/peast/zipball/e19a8bd896b7f04941a38fd38a140c9a6531c84f", + "reference": "e19a8bd896b7f04941a38fd38a140c9a6531c84f", "shasum": "" }, "require": { @@ -5593,7 +5980,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.17.4-dev" + "dev-master": "1.17.5-dev" } }, "autoload": { @@ -5614,9 +6001,9 @@ "description": "Peast is PHP library that generates AST for JavaScript code", "support": { "issues": "https://github.com/mck89/peast/issues", - "source": "https://github.com/mck89/peast/tree/v1.17.4" + "source": "https://github.com/mck89/peast/tree/v1.17.5" }, - "time": "2025-10-10T12:53:17+00:00" + "time": "2026-03-15T10:47:07+00:00" }, { "name": "mikehaertl/php-shellcommand", @@ -6656,16 +7043,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "2.3.1", + "version": "2.3.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "16dbf9937da8d4528ceb2145c9c7c0bd29e26374" + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/16dbf9937da8d4528ceb2145c9c7c0bd29e26374", - "reference": "16dbf9937da8d4528ceb2145c9c7c0bd29e26374", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", "shasum": "" }, "require": { @@ -6697,9 +7084,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.1" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2" }, - "time": "2026-01-12T11:33:04+00:00" + "time": "2026-01-25T14:56:51+00:00" }, { "name": "phpunit/php-code-coverage", @@ -7022,16 +7409,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.31", + "version": "9.6.34", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "945d0b7f346a084ce5549e95289962972c4272e5" + "reference": "b36f02317466907a230d3aa1d34467041271ef4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/945d0b7f346a084ce5549e95289962972c4272e5", - "reference": "945d0b7f346a084ce5549e95289962972c4272e5", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b36f02317466907a230d3aa1d34467041271ef4a", + "reference": "b36f02317466907a230d3aa1d34467041271ef4a", "shasum": "" }, "require": { @@ -7053,7 +7440,7 @@ "phpunit/php-timer": "^5.0.3", "sebastian/cli-parser": "^1.0.2", "sebastian/code-unit": "^1.0.8", - "sebastian/comparator": "^4.0.9", + "sebastian/comparator": "^4.0.10", "sebastian/diff": "^4.0.6", "sebastian/environment": "^5.1.5", "sebastian/exporter": "^4.0.8", @@ -7105,7 +7492,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.31" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.34" }, "funding": [ { @@ -7129,7 +7516,7 @@ "type": "tidelift" } ], - "time": "2025-12-06T07:45:52+00:00" + "time": "2026-01-27T05:45:00+00:00" }, { "name": "psr/clock", @@ -7229,166 +7616,6 @@ }, "time": "2019-01-08T18:20:26+00:00" }, - { - "name": "psr/http-client", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https://github.com/php-fig/http-client" - }, - "time": "2023-09-23T14:17:50+00:00" - }, - { - "name": "psr/http-factory", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory" - }, - "time": "2024-04-15T12:06:14+00:00" - }, - { - "name": "psr/http-message", - "version": "2.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/2.0" - }, - "time": "2023-04-04T09:54:51+00:00" - }, { "name": "psr/simple-cache", "version": "1.0.1", @@ -7792,16 +8019,16 @@ }, { "name": "sebastian/comparator", - "version": "4.0.9", + "version": "4.0.10", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5" + "reference": "e4df00b9b3571187db2831ae9aada2c6efbd715d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/67a2df3a62639eab2cc5906065e9805d4fd5dfc5", - "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/e4df00b9b3571187db2831ae9aada2c6efbd715d", + "reference": "e4df00b9b3571187db2831ae9aada2c6efbd715d", "shasum": "" }, "require": { @@ -7854,7 +8081,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.9" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.10" }, "funding": [ { @@ -7874,7 +8101,7 @@ "type": "tidelift" } ], - "time": "2025-08-10T06:51:50+00:00" + "time": "2026-01-24T09:22:56+00:00" }, { "name": "sebastian/complexity", @@ -10845,16 +11072,16 @@ }, { "name": "wp-cli/eval-command", - "version": "v2.2.7", + "version": "v2.2.9", "source": { "type": "git", "url": "https://github.com/wp-cli/eval-command.git", - "reference": "2fb2a9d40861741eafaa1df86ed0dbd62de6e5ca" + "reference": "827c7208c74ebd6ab81c6051f515381d4f276e32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/eval-command/zipball/2fb2a9d40861741eafaa1df86ed0dbd62de6e5ca", - "reference": "2fb2a9d40861741eafaa1df86ed0dbd62de6e5ca", + "url": "https://api.github.com/repos/wp-cli/eval-command/zipball/827c7208c74ebd6ab81c6051f515381d4f276e32", + "reference": "827c7208c74ebd6ab81c6051f515381d4f276e32", "shasum": "" }, "require": { @@ -10897,22 +11124,22 @@ "homepage": "https://github.com/wp-cli/eval-command", "support": { "issues": "https://github.com/wp-cli/eval-command/issues", - "source": "https://github.com/wp-cli/eval-command/tree/v2.2.7" + "source": "https://github.com/wp-cli/eval-command/tree/v2.2.9" }, - "time": "2025-12-02T18:17:50+00:00" + "time": "2026-03-18T09:03:46+00:00" }, { "name": "wp-cli/export-command", - "version": "v2.1.14", + "version": "v2.1.16", "source": { "type": "git", "url": "https://github.com/wp-cli/export-command.git", - "reference": "2af32bf12c1bccd6561a215dbbafc2f272647ee8" + "reference": "cf85ae0105617c106a0c8d6b9f77bc4983140707" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/export-command/zipball/2af32bf12c1bccd6561a215dbbafc2f272647ee8", - "reference": "2af32bf12c1bccd6561a215dbbafc2f272647ee8", + "url": "https://api.github.com/repos/wp-cli/export-command/zipball/cf85ae0105617c106a0c8d6b9f77bc4983140707", + "reference": "cf85ae0105617c106a0c8d6b9f77bc4983140707", "shasum": "" }, "require": { @@ -10925,7 +11152,7 @@ "wp-cli/extension-command": "^1.2 || ^2", "wp-cli/import-command": "^1 || ^2", "wp-cli/media-command": "^1 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -10960,9 +11187,9 @@ "homepage": "https://github.com/wp-cli/export-command", "support": { "issues": "https://github.com/wp-cli/export-command/issues", - "source": "https://github.com/wp-cli/export-command/tree/v2.1.14" + "source": "https://github.com/wp-cli/export-command/tree/v2.1.16" }, - "time": "2025-04-02T15:29:08+00:00" + "time": "2026-03-17T08:25:40+00:00" }, { "name": "wp-cli/extension-command", @@ -11064,16 +11291,16 @@ }, { "name": "wp-cli/i18n-command", - "version": "v2.6.6", + "version": "v2.7.0", "source": { "type": "git", "url": "https://github.com/wp-cli/i18n-command.git", - "reference": "94f72ddc4be8919f2cea181ba39cd140dd480d64" + "reference": "e91e6903d212486e32ed2c916171f661bfc539ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/i18n-command/zipball/94f72ddc4be8919f2cea181ba39cd140dd480d64", - "reference": "94f72ddc4be8919f2cea181ba39cd140dd480d64", + "url": "https://api.github.com/repos/wp-cli/i18n-command/zipball/e91e6903d212486e32ed2c916171f661bfc539ce", + "reference": "e91e6903d212486e32ed2c916171f661bfc539ce", "shasum": "" }, "require": { @@ -11095,6 +11322,7 @@ "bundled": true, "commands": [ "i18n", + "i18n audit", "i18n make-pot", "i18n make-json", "i18n make-mo", @@ -11127,22 +11355,22 @@ "homepage": "https://github.com/wp-cli/i18n-command", "support": { "issues": "https://github.com/wp-cli/i18n-command/issues", - "source": "https://github.com/wp-cli/i18n-command/tree/v2.6.6" + "source": "https://github.com/wp-cli/i18n-command/tree/v2.7.0" }, - "time": "2025-11-21T04:23:34+00:00" + "time": "2026-03-16T17:13:39+00:00" }, { "name": "wp-cli/import-command", - "version": "v2.0.15", + "version": "v2.0.16", "source": { "type": "git", "url": "https://github.com/wp-cli/import-command.git", - "reference": "277de5a245cbf846ec822e23067703c7e3b9cb48" + "reference": "64033264b9f4b9c9a32d14e33b365a58de6f3bf6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/import-command/zipball/277de5a245cbf846ec822e23067703c7e3b9cb48", - "reference": "277de5a245cbf846ec822e23067703c7e3b9cb48", + "url": "https://api.github.com/repos/wp-cli/import-command/zipball/64033264b9f4b9c9a32d14e33b365a58de6f3bf6", + "reference": "64033264b9f4b9c9a32d14e33b365a58de6f3bf6", "shasum": "" }, "require": { @@ -11188,9 +11416,9 @@ "homepage": "https://github.com/wp-cli/import-command", "support": { "issues": "https://github.com/wp-cli/import-command/issues", - "source": "https://github.com/wp-cli/import-command/tree/v2.0.15" + "source": "https://github.com/wp-cli/import-command/tree/v2.0.16" }, - "time": "2025-12-09T15:41:55+00:00" + "time": "2026-03-16T15:17:43+00:00" }, { "name": "wp-cli/language-command", @@ -11335,16 +11563,16 @@ }, { "name": "wp-cli/media-command", - "version": "v2.2.2", + "version": "v2.2.5", "source": { "type": "git", "url": "https://github.com/wp-cli/media-command.git", - "reference": "a810ea0e68473fce6a234e67c6c5f19bb820a753" + "reference": "5696bba2e8c7d5c373fa20024edb1a4b682d1511" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/media-command/zipball/a810ea0e68473fce6a234e67c6c5f19bb820a753", - "reference": "a810ea0e68473fce6a234e67c6c5f19bb820a753", + "url": "https://api.github.com/repos/wp-cli/media-command/zipball/5696bba2e8c7d5c373fa20024edb1a4b682d1511", + "reference": "5696bba2e8c7d5c373fa20024edb1a4b682d1511", "shasum": "" }, "require": { @@ -11353,13 +11581,14 @@ "require-dev": { "wp-cli/entity-command": "^1.3 || ^2", "wp-cli/extension-command": "^2.0", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { "bundled": true, "commands": [ "media", + "media fix-orientation", "media import", "media regenerate", "media image-size" @@ -11391,9 +11620,9 @@ "homepage": "https://github.com/wp-cli/media-command", "support": { "issues": "https://github.com/wp-cli/media-command/issues", - "source": "https://github.com/wp-cli/media-command/tree/v2.2.2" + "source": "https://github.com/wp-cli/media-command/tree/v2.2.5" }, - "time": "2025-04-11T09:28:29+00:00" + "time": "2026-03-04T13:53:32+00:00" }, { "name": "wp-cli/mustache", @@ -11449,16 +11678,16 @@ }, { "name": "wp-cli/mustangostang-spyc", - "version": "0.6.3", + "version": "0.6.6", "source": { "type": "git", "url": "https://github.com/wp-cli/spyc.git", - "reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7" + "reference": "30f25baaaba939caaff1f4b8c7ed998632f59fe2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/spyc/zipball/6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7", - "reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7", + "url": "https://api.github.com/repos/wp-cli/spyc/zipball/30f25baaaba939caaff1f4b8c7ed998632f59fe2", + "reference": "30f25baaaba939caaff1f4b8c7ed998632f59fe2", "shasum": "" }, "require": { @@ -11494,9 +11723,9 @@ "description": "A simple YAML loader/dumper class for PHP (WP-CLI fork)", "homepage": "https://github.com/mustangostang/spyc/", "support": { - "source": "https://github.com/wp-cli/spyc/tree/autoload" + "source": "https://github.com/wp-cli/spyc/tree/0.6.6" }, - "time": "2017-04-25T11:26:20+00:00" + "time": "2026-03-12T12:30:41+00:00" }, { "name": "wp-cli/package-command", @@ -11565,16 +11794,16 @@ }, { "name": "wp-cli/php-cli-tools", - "version": "v0.12.6", + "version": "v0.12.9", "source": { "type": "git", "url": "https://github.com/wp-cli/php-cli-tools.git", - "reference": "f12b650d3738e471baed6dd47982d53c5c0ab1c3" + "reference": "c3d25138ce46a66647ec0dc9b17bf300338494aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/f12b650d3738e471baed6dd47982d53c5c0ab1c3", - "reference": "f12b650d3738e471baed6dd47982d53c5c0ab1c3", + "url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/c3d25138ce46a66647ec0dc9b17bf300338494aa", + "reference": "c3d25138ce46a66647ec0dc9b17bf300338494aa", "shasum": "" }, "require": { @@ -11587,7 +11816,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "0.12.x-dev" + "dev-main": "0.12.x-dev" } }, "autoload": { @@ -11622,9 +11851,9 @@ ], "support": { "issues": "https://github.com/wp-cli/php-cli-tools/issues", - "source": "https://github.com/wp-cli/php-cli-tools/tree/v0.12.6" + "source": "https://github.com/wp-cli/php-cli-tools/tree/v0.12.9" }, - "time": "2025-09-11T12:43:04+00:00" + "time": "2026-03-29T11:12:54+00:00" }, { "name": "wp-cli/process", @@ -11871,16 +12100,16 @@ }, { "name": "wp-cli/search-replace-command", - "version": "v2.1.9", + "version": "v2.1.11", "source": { "type": "git", "url": "https://github.com/wp-cli/search-replace-command.git", - "reference": "14aea81eca68effbc651d5fca4891a89c0667b2e" + "reference": "a04ff12b2077aae88ebb4075f8bab7f959c08927" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/search-replace-command/zipball/14aea81eca68effbc651d5fca4891a89c0667b2e", - "reference": "14aea81eca68effbc651d5fca4891a89c0667b2e", + "url": "https://api.github.com/repos/wp-cli/search-replace-command/zipball/a04ff12b2077aae88ebb4075f8bab7f959c08927", + "reference": "a04ff12b2077aae88ebb4075f8bab7f959c08927", "shasum": "" }, "require": { @@ -11925,9 +12154,9 @@ "homepage": "https://github.com/wp-cli/search-replace-command", "support": { "issues": "https://github.com/wp-cli/search-replace-command/issues", - "source": "https://github.com/wp-cli/search-replace-command/tree/v2.1.9" + "source": "https://github.com/wp-cli/search-replace-command/tree/v2.1.11" }, - "time": "2025-11-11T13:31:01+00:00" + "time": "2026-03-18T08:50:38+00:00" }, { "name": "wp-cli/server-command", @@ -12107,16 +12336,16 @@ }, { "name": "wp-cli/widget-command", - "version": "v2.1.12", + "version": "v2.2.1", "source": { "type": "git", "url": "https://github.com/wp-cli/widget-command.git", - "reference": "73084053f7b32d92583e44d870b81f287beea6a9" + "reference": "d5faa8f5b47828b2c103e9411fb52d4a63b53b99" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/widget-command/zipball/73084053f7b32d92583e44d870b81f287beea6a9", - "reference": "73084053f7b32d92583e44d870b81f287beea6a9", + "url": "https://api.github.com/repos/wp-cli/widget-command/zipball/d5faa8f5b47828b2c103e9411fb52d4a63b53b99", + "reference": "d5faa8f5b47828b2c103e9411fb52d4a63b53b99", "shasum": "" }, "require": { @@ -12124,7 +12353,7 @@ }, "require-dev": { "wp-cli/extension-command": "^1.2 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -12136,9 +12365,12 @@ "widget delete", "widget list", "widget move", + "widget patch", "widget reset", "widget update", "sidebar", + "sidebar exists", + "sidebar get", "sidebar list" ], "branch-alias": { @@ -12168,9 +12400,9 @@ "homepage": "https://github.com/wp-cli/widget-command", "support": { "issues": "https://github.com/wp-cli/widget-command/issues", - "source": "https://github.com/wp-cli/widget-command/tree/v2.1.12" + "source": "https://github.com/wp-cli/widget-command/tree/v2.2.1" }, - "time": "2025-04-11T09:29:37+00:00" + "time": "2026-03-17T12:28:44+00:00" }, { "name": "wp-cli/wp-cli", @@ -12317,16 +12549,16 @@ }, { "name": "wp-cli/wp-config-transformer", - "version": "v1.4.3", + "version": "v1.4.5", "source": { "type": "git", "url": "https://github.com/wp-cli/wp-config-transformer.git", - "reference": "5ade4e70349a1d5cd07efc33880ceb5eebb9e9fa" + "reference": "8f5e66c717a7371dfb6559086880bee528aee858" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/wp-config-transformer/zipball/5ade4e70349a1d5cd07efc33880ceb5eebb9e9fa", - "reference": "5ade4e70349a1d5cd07efc33880ceb5eebb9e9fa", + "url": "https://api.github.com/repos/wp-cli/wp-config-transformer/zipball/8f5e66c717a7371dfb6559086880bee528aee858", + "reference": "8f5e66c717a7371dfb6559086880bee528aee858", "shasum": "" }, "require": { @@ -12360,9 +12592,9 @@ "homepage": "https://github.com/wp-cli/wp-config-transformer", "support": { "issues": "https://github.com/wp-cli/wp-config-transformer/issues", - "source": "https://github.com/wp-cli/wp-config-transformer/tree/v1.4.3" + "source": "https://github.com/wp-cli/wp-config-transformer/tree/v1.4.5" }, - "time": "2025-11-11T13:31:09+00:00" + "time": "2026-03-20T07:28:10+00:00" }, { "name": "wp-coding-standards/wpcs", @@ -12490,6 +12722,7 @@ "aliases": [], "minimum-stability": "stable", "stability-flags": { + "stellarwp/harbor": 20, "stellarwp/uplink": 20 }, "prefer-stable": false, @@ -12497,9 +12730,9 @@ "platform": { "ext-json": "*" }, - "platform-dev": {}, + "platform-dev": [], "platform-overrides": { "php": "7.4" }, - "plugin-api-version": "2.9.0" + "plugin-api-version": "2.6.0" } diff --git a/includes/assets/js/kb-header-block.min.js b/includes/assets/js/kb-header-block.min.js index 5a1174340..14410e410 100644 --- a/includes/assets/js/kb-header-block.min.js +++ b/includes/assets/js/kb-header-block.min.js @@ -1 +1 @@ -class KBHeader{components={};_state;root;rootID;autoTransparentSpacing;sticky;stickyTablet;stickyMobile;transparent;transparentTablet;transparentMobile;stickySection;stickySectionTablet;stickySectionMobile;activeSize="mobile";lastScrollTop=0;activeOffsetTop=0;shrinkMain=!1;shrinkMainHeight=0;shrinkMainHeightTablet=0;shrinkMainHeightMobile=0;shrinkStartHeight=0;mobileBreakpoint=0;currentTopPosition=0;anchorOffset=0;placeholderWrapper;stickyWrapper;isSticking=!1;isTransparent=!1;activeHeaderContainer;constructor(a,b={}){this.root="string"==typeof a?document.querySelector(a):a,this.activeHeaderContainer=this.root.querySelector(".wp-block-kadence-header-desktop"),this.rootID="aaa",this.autoTransparentSpacing="1"===this.root.dataset?.autoTransparentSpacing,this.sticky="1"==this.root.dataset?.sticky,this.stickyTablet="1"==this.root.dataset?.stickyTablet,this.stickyMobile="1"==this.root.dataset?.stickyMobile,this.transparent="1"==this.root.dataset?.transparent,this.transparentTablet="1"==this.root.dataset?.transparentTablet,this.transparentMobile="1"==this.root.dataset?.transparentMobile,this.stickySection=this.root.dataset?.stickySection,this.stickySectionTablet=this.root.dataset?.stickySectionTablet,this.stickySectionMobile=this.root.dataset?.stickySectionMobile,this.shrinkMain="1"===this.root.dataset?.shrinkMain,this.shrinkMainHeight=this.root.dataset?.shrinkMainHeight,this.shrinkMainHeightTablet=this.root.dataset?.shrinkMainHeightTablet,this.shrinkMainHeightMobile=this.root.dataset?.shrinkMainHeightMobile,this.revealScrollUp="1"===this.root.dataset?.revealScrollUp,this.mobileBreakpoint=this.root.dataset?.mobileBreakpoint,this._state="CREATED",(this.sticky||this.stickyTablet||this.stickyMobile)&&this.initStickyHeader(),this.mobileBreakpoint&&0!==this.mobileBreakpoint&&this.initMobileBreakpoint();var c=new Event("MOUNTED",{bubbles:!0});c.ID=this.rootID,this.root.dispatchEvent(c),this._state="IDLE"}initMobileBreakpoint(){this.mobileBreakpoint&&0!==this.mobileBreakpoint&&(window.addEventListener("resize",this.updateMobileBreakpoint.bind(this),!1),window.addEventListener("hashchange",this.updateMobileBreakpoint.bind(this),!1),window.addEventListener("scroll",this.updateMobileBreakpoint.bind(this),!1),window.addEventListener("load",this.updateMobileBreakpoint.bind(this),!1),window.addEventListener("orientationchange",this.updateMobileBreakpoint.bind(this)))}updateMobileBreakpoint(){this.setActiveSize(),"desktop"==this.activeSize?(this.root.querySelector(".wp-block-kadence-header-tablet").style.display="none",this.root.querySelector(".wp-block-kadence-header-desktop").style.display="block"):(this.root.querySelector(".wp-block-kadence-header-desktop").style.display="none",this.root.querySelector(".wp-block-kadence-header-tablet").style.display="block")}initStickyHeader(){this.sticky&&this.createAndSetPlaceholderAndStickyWrappers("desktop"),(this.stickyTablet||this.stickyMobile)&&this.createAndSetPlaceholderAndStickyWrappers("tablet"),this.placeholderWrapper&&this.stickyWrapper&&(this.setActiveSize(),this.updatePlaceholderAndStickyWrappers(),"desktop"==this.activeSize?this.sticky&&(this.activeOffsetTop=this.getOffset(this.placeholderWrapper).top):"tablet"==this.activeSize?this.stickyTablet&&(this.activeOffsetTop=this.getOffset(this.placeholderWrapper).top):this.stickyMobile&&(this.activeOffsetTop=this.getOffset(this.placeholderWrapper).top),window.addEventListener("resize",this.updateSticky.bind(this),!1),window.addEventListener("hashchange",this.updateSticky.bind(this),!1),window.addEventListener("scroll",this.updateSticky.bind(this),!1),window.addEventListener("load",this.updateSticky.bind(this),!1),window.addEventListener("orientationchange",this.updateSticky.bind(this)),"complete"===document.readyState&&this.updateSticky("updateActive"),document.body.classList.contains("woocommerce-demo-store")&&document.body.classList.contains("kadence-store-notice-placement-above")&&this.respondToVisibility(document.querySelector(".woocommerce-store-notice"),()=>{this.updateSticky("updateActive").bind(this)}))}setActiveSize(){const a=this.mobileBreakpoint&&0!==this.mobileBreakpoint?this.mobileBreakpoint:kadenceHeaderConfig.breakPoints.desktop;this.activeSize=parseInt(a){b.appendChild(a)})),b}respondToVisibility(a,b){var c={root:document.documentElement},d=new IntersectionObserver(a=>{a.forEach(a=>{b(0 .kb-nav-sub-menu");if(p.length){var q=this.getOffset(p[0]).top;this.stickyWrapper.style.setProperty("--kb-sticky-mega-overflow-header-offset",q-d+"px")}const r=c,s=c-e,t=this.currentTopPosition+e;var u=this.stickyWrapper.parentNode;if(this.shrinkMain){const b="mobile"===this.activeSize?this.shrinkMainHeightMobile:"tablet"===this.activeSize?this.shrinkMainHeightTablet:this.shrinkMainHeight;if(b){const c=this.activeHeaderContainer.querySelectorAll(".kb-img, .wp-block-kadence-identity img, .wp-block-image img"),d=this.activeHeaderContainer.querySelector(".wp-block-kadence-header-row-center .kadence-header-row-inner");(!this.shrinkStartHeight||a&&void 0!==a.type&&"orientationchange"===a.type)&&(this.shrinkStartHeight=d.offsetHeight);const e=Math.max(b,this.shrinkStartHeight-window.scrollY);if(d.style.height=e+"px",d.style.minHeight=e+"px",d.style.maxHeight=e+"px",0==window.scrollY){if(c)for(let a=0;athis.lastScrollTop,w=Math.floor(this.anchorOffset+e);d<=this.anchorOffset-c?(this.currentTopPosition=0,this.setStickyChanged(!1)):d<=w?v?(this.currentTopPosition=0,this.setStickyChanged(!1)):(this.stickyWrapper.classList.remove("item-hidden-above"),this.currentTopPosition=r,this.setStickyChanged(!0)):d>=this.currentTopPosition&&d<=t?this.setStickyChanged(!1):(v?(this.stickyWrapper.classList.add("item-hidden-above"),this.stickyWrapper.style.top=s+"px",this.currentTopPosition=s):(this.stickyWrapper.classList.remove("item-hidden-above"),this.currentTopPosition=r),this.setStickyChanged(!0))}else{var w=Math.floor(this.anchorOffset-c);d<=w?(this.currentTopPosition=0,this.setStickyChanged(!1)):(this.currentTopPosition=r,this.setStickyChanged(!0))}this.lastScrollTop=d,window.scrollY==w?(this.stickyWrapper.classList.add("item-is-fixed"),this.stickyWrapper.classList.add("item-at-start"),this.stickyWrapper.classList.remove("item-is-stuck"),u.classList.add("child-is-fixed"),document.body.classList.add("header-is-fixed")):window.scrollY>w?this.revealScrollUp?window.scrollY{window.KBHeaderBlocks=[];var a=document.querySelectorAll(".wp-block-kadence-header");for(let c=0;c{this.updateSticky("updateActive").bind(this)}))}setActiveSize(){const a=this.mobileBreakpoint&&0!==this.mobileBreakpoint?this.mobileBreakpoint:kadenceHeaderConfig.breakPoints.desktop;this.activeSize=parseInt(a){b.appendChild(a)})),b}respondToVisibility(a,b){var c={root:document.documentElement},d=new IntersectionObserver(a=>{a.forEach(a=>{b(0 .kb-nav-sub-menu");if(p.length){var q=this.getOffset(p[0]).top;this.stickyWrapper.style.setProperty("--kb-sticky-mega-overflow-header-offset",q-d+"px")}const r=c,s=c-e,t=this.currentTopPosition+e;var u=this.stickyWrapper.parentNode;if(this.shrinkMain){const b="mobile"===this.activeSize?this.shrinkMainHeightMobile:"tablet"===this.activeSize?this.shrinkMainHeightTablet:this.shrinkMainHeight;if(b){const c=this.activeHeaderContainer.querySelectorAll(".kb-img, .wp-block-kadence-identity img, .wp-block-image img"),d=this.activeHeaderContainer.querySelector(".wp-block-kadence-header-row-center .kadence-header-row-inner");(!this.shrinkStartHeight||a&&void 0!==a.type&&"orientationchange"===a.type)&&(this.shrinkStartHeight=d.offsetHeight);const e=Math.max(b,this.shrinkStartHeight-window.scrollY);if(d.style.height=e+"px",d.style.minHeight=e+"px",d.style.maxHeight=e+"px",0==window.scrollY){if(c)for(let a=0;athis.lastScrollTop,w=Math.floor(this.anchorOffset+e);d<=this.anchorOffset-c?(this.currentTopPosition=0,this.setStickyChanged(!1)):d<=w?v?(this.currentTopPosition=0,this.setStickyChanged(!1)):(this.stickyWrapper.classList.remove("item-hidden-above"),this.currentTopPosition=r,this.setStickyChanged(!0)):d>=this.currentTopPosition&&d<=t?this.setStickyChanged(!1):(v?(this.stickyWrapper.classList.add("item-hidden-above"),this.stickyWrapper.style.top=s+"px",this.currentTopPosition=s):(this.stickyWrapper.classList.remove("item-hidden-above"),this.currentTopPosition=r),this.setStickyChanged(!0))}else{var w=Math.floor(this.anchorOffset-c);d<=w?(this.currentTopPosition=0,this.setStickyChanged(!1)):(this.currentTopPosition=r,this.setStickyChanged(!0))}this.lastScrollTop=d,window.scrollY==w?(this.stickyWrapper.classList.add("item-is-fixed"),this.stickyWrapper.classList.add("item-at-start"),this.stickyWrapper.classList.remove("item-is-stuck"),u.classList.add("child-is-fixed"),document.body.classList.add("header-is-fixed")):window.scrollY>w?this.revealScrollUp?window.scrollY{window.KBHeaderBlocks=[];var a=document.querySelectorAll(".wp-block-kadence-header");for(let c=0;c 4, 'post_type' => 'product', 'fields' => 'ids', - ] + ] ); $prophecy_data = json_decode( get_option( 'kadence_blocks_prophecy' ), true ); wp_localize_script( @@ -339,6 +336,7 @@ public function editor_assets_variables() { 'proData' => $pro_data, 'isAuthorized' => $is_authorized, 'isAIDisabled' => kadence_blocks_is_ai_disabled(), + 'aiDisabledMessage' => kadence_blocks_get_ai_disabled_message(), 'homeLink' => admin_url( 'admin.php?page=kadence-blocks-home' ), 'pro' => ( class_exists( 'Kadence_Blocks_Pro' ) ? 'true' : 'false' ), 'creativeKit' => ( class_exists( 'KadenceWP\CreativeKit' ) ? 'true' : 'false' ), diff --git a/includes/helper-functions.php b/includes/helper-functions.php index cecc0ecbd..737611766 100644 --- a/includes/helper-functions.php +++ b/includes/helper-functions.php @@ -11,7 +11,10 @@ exit; } +use function KadenceWP\KadenceBlocks\StellarWP\Uplink\get_authorization_token; +use function KadenceWP\KadenceBlocks\StellarWP\Uplink\get_license_domain; use function KadenceWP\KadenceBlocks\StellarWP\Uplink\get_license_key; +use function KadenceWP\KadenceBlocks\StellarWP\Uplink\is_authorized; /** * Check if we are in AMP Mode. @@ -204,7 +207,7 @@ function kadence_blocks_get_current_env() { return 'dev'; case 'https://licensing-staging.stellarwp.com': return 'staging'; - + } } return ''; @@ -232,6 +235,45 @@ function kadence_blocks_get_current_license_data(): array { return $cache = $license_data; } +/** + * Whether the current site has an authorized Kadence license. + * + * Checks the legacy StellarWP Uplink license first, then falls back to + * Harbor's unified license as the final check. + * + * @return bool + */ +function kadence_blocks_is_license_authorized(): bool { + if ( kadence_blocks_is_legacy_license_authorized() ) { + return true; + } + + return lw_harbor_is_product_license_active( 'kadence' ); +} + +/** + * Check if a legacy (Uplink) Kadence license is authorized. + * + * AI features are not currently supported under Harbor licensing, so this + * function gates AI-specific UI and functionality. Harbor-only customers and + * customers with no license will return false. + * + * @return bool + */ +function kadence_blocks_is_legacy_license_authorized(): bool { + $license_key = kadence_blocks_get_current_license_key(); + + if ( ! empty( $license_key ) ) { + $slug = kadence_blocks_get_current_product_slug(); + $token = get_authorization_token( $slug ); + if ( is_authorized( $license_key, $slug, $token ?? '', get_license_domain() ) ) { + return true; + } + } + + return false; +} + /** * Check if ai is enabled. */ @@ -239,7 +281,23 @@ function kadence_blocks_is_ai_disabled() { if ( defined( 'KADENCE_BLOCKS_AI_DISABLED' ) && KADENCE_BLOCKS_AI_DISABLED ) { return true; } - return false; + + return (bool) apply_filters( 'kadence_blocks_ai_disabled', false ); +} + +/** + * Get the message shown when Kadence AI is disabled. + * + * Applies the `kadence_blocks_ai_disabled_message` filter so hosting + * environments (e.g. Harbor) can surface a context-specific reason. + * + * @return string + */ +function kadence_blocks_get_ai_disabled_message(): string { + return apply_filters( + 'kadence_blocks_ai_disabled_message', + __( 'Kadence AI is disabled by site admin.', 'kadence-blocks' ) + ); } /** diff --git a/includes/init.php b/includes/init.php index bf13790e5..9635780af 100644 --- a/includes/init.php +++ b/includes/init.php @@ -14,10 +14,6 @@ use KadenceWP\KadenceBlocks\App; use KadenceWP\KadenceBlocks\StellarWP\ContainerContract\ContainerInterface; -use function KadenceWP\KadenceBlocks\StellarWP\Uplink\get_license_domain; -use function KadenceWP\KadenceBlocks\StellarWP\Uplink\get_authorization_token; -use function KadenceWP\KadenceBlocks\StellarWP\Uplink\is_authorized; - /** * Setup the post type options for post blocks. diff --git a/includes/resources/App.php b/includes/resources/App.php index 08dec39aa..91cc30cfe 100644 --- a/includes/resources/App.php +++ b/includes/resources/App.php @@ -16,6 +16,7 @@ use KadenceWP\KadenceBlocks\StellarWP\ContainerContract\ContainerInterface; use KadenceWP\KadenceBlocks\StellarWP\ProphecyMonorepo\Container\Contracts\Container; use KadenceWP\KadenceBlocks\StellarWP\ProphecyMonorepo\Container\Contracts\Providable; +use KadenceWP\KadenceBlocks\Harbor\Harbor_Provider; use KadenceWP\KadenceBlocks\Uplink\Uplink_Provider; use RuntimeException; @@ -43,6 +44,7 @@ final class App { Database_Provider::class, Asset_Provider::class, Uplink_Provider::class, + Harbor_Provider::class, Health_Provider::class, Admin_Provider::class, Image_Downloader_Provider::class, diff --git a/includes/resources/Harbor/Actions/Get_Known_Plugins.php b/includes/resources/Harbor/Actions/Get_Known_Plugins.php new file mode 100644 index 000000000..a6dc0f1f1 --- /dev/null +++ b/includes/resources/Harbor/Actions/Get_Known_Plugins.php @@ -0,0 +1,66 @@ + + */ + public function __invoke(): array { + $default_page = admin_url( 'admin.php?page=kadence-blocks' ); + + return [ + 'kadence-blocks' => [ + 'name' => __( 'Kadence Blocks', 'kadence-blocks' ), + 'page_url' => $default_page, + ], + 'kadence-blocks-pro' => [ + 'name' => __( 'Kadence Blocks Pro', 'kadence-blocks' ), + 'page_url' => $default_page, + ], + 'kadence-creative-kit' => [ + 'name' => __( 'Kadence Creative Kit', 'kadence-blocks' ), + 'page_url' => admin_url( 'admin.php?page=kadence-blocks-home&license=show' ), + ], + 'kadence-insights' => [ + 'name' => __( 'Kadence Insights', 'kadence-blocks' ), + 'page_url' => admin_url( 'admin.php?page=kadence-insights-settings&license=show' ), + ], + 'kadence-shop-kit' => [ + 'name' => __( 'Kadence Shop Kit', 'kadence-blocks' ), + 'page_url' => admin_url( 'admin.php?page=kadence-shop-kit-settings&license=show' ), + ], + 'kadence-galleries' => [ + 'name' => __( 'Kadence Galleries', 'kadence-blocks' ), + 'page_url' => $default_page, + ], + 'kadence-conversions' => [ + 'name' => __( 'Kadence Conversions', 'kadence-blocks' ), + 'page_url' => $default_page, + ], + 'kadence-captcha' => [ + 'name' => __( 'Kadence Captcha', 'kadence-blocks' ), + 'page_url' => admin_url( 'admin.php?page=kadence-recaptcha-settings&license=show' ), + ], + 'kadence-theme-pro' => [ + 'name' => __( 'Kadence Theme Pro', 'kadence-blocks' ), + 'page_url' => $default_page, + ], + 'kadence-pattern-hub' => [ + 'name' => __( 'Kadence Pattern Hub', 'kadence-blocks' ), + 'page_url' => $default_page, + ], + 'kadence-white-label' => [ + 'name' => __( 'Kadence White Label', 'kadence-blocks' ), + 'page_url' => admin_url( 'admin.php?page=kadence-white-label-settings' ), + ], + ]; + } + +} diff --git a/includes/resources/Harbor/Actions/Render_Harbor_License_Notice.php b/includes/resources/Harbor/Actions/Render_Harbor_License_Notice.php new file mode 100644 index 000000000..e4495ad56 --- /dev/null +++ b/includes/resources/Harbor/Actions/Render_Harbor_License_Notice.php @@ -0,0 +1,44 @@ +product_name = $product_name; + } + + /** + * Renders a Harbor notice below the save button on a Kadence Uplink license field. + * + * @return void + */ + public function __invoke(): void { + $url = lw_harbor_get_license_page_url(); + if ( empty( $url ) ) { + return; + } + ?> +
+

+

Liquid Web Software Manager.', 'kadence-blocks' ), + esc_html( $this->product_name ), + esc_url( $url ) + ), + [ 'a' => [ 'href' => [] ] ] + ); ?>

+ $plugin ) { + $key = get_license_key( $slug ); + + if ( empty( $key ) || isset( $reported_keys[ $key ] ) ) { + continue; + } + + $reported_keys[ $key ] = true; + $token = get_authorization_token( $slug ); + $is_active = is_authorized( $key, $slug, $token ?? '', $domain ); + + $licenses[] = [ + 'key' => $key, + 'slug' => $slug, + 'name' => $plugin['name'], + 'product' => 'kadence', + 'is_active' => $is_active, + 'page_url' => esc_url( $plugin['page_url'] ), + ]; + } + + return $licenses; + } + +} diff --git a/includes/resources/Harbor/Actions/Suppress_Legacy_Inactive_Notices.php b/includes/resources/Harbor/Actions/Suppress_Legacy_Inactive_Notices.php new file mode 100644 index 000000000..95208803e --- /dev/null +++ b/includes/resources/Harbor/Actions/Suppress_Legacy_Inactive_Notices.php @@ -0,0 +1,41 @@ +callbacks as $priority => $callbacks ) { + foreach ( $callbacks as $key => $callback ) { + $function = $callback['function']; + + if ( ! is_array( $function ) + || ! is_object( $function[0] ) + || $function[1] !== 'inactive_notice' + ) { + continue; + } + + if ( strpos( get_class( $function[0] ), 'KadenceWP\\' ) === 0 ) { + unset( $wp_filter['admin_notices']->callbacks[ $priority ][ $key ] ); + } + } + } + } + +} diff --git a/includes/resources/Harbor/Harbor_Provider.php b/includes/resources/Harbor/Harbor_Provider.php new file mode 100644 index 000000000..4e0bd58b0 --- /dev/null +++ b/includes/resources/Harbor/Harbor_Provider.php @@ -0,0 +1,72 @@ +container ); + Harbor::init(); + + lw_harbor_register_submenu( 'kadence-blocks' ); + + add_filter( 'lw-harbor/legacy_licenses', new Report_Legacy_Licenses() ); + add_filter( 'kadence_blocks_ai_disabled', [ $this, 'is_ai_disabled' ] ); + add_filter( 'kadence_blocks_ai_disabled_message', [ $this, 'ai_disabled_message' ] ); + + foreach ( ( new Get_Known_Plugins() )() as $slug => $plugin ) { + add_action( + "stellarwp/uplink/{$slug}/license_field_after_form", + new Render_Harbor_License_Notice( $plugin['name'] ) + ); + } + + add_action( 'admin_init', new Suppress_Legacy_Inactive_Notices() ); + } + + /** + * Disables Kadence AI for new Harbor customers who don't have legacy AI access. + * + * @param bool $disabled Whether AI is already disabled. + * + * @return bool + */ + public function is_ai_disabled( bool $disabled ): bool { + if ( $disabled ) { + return true; + } + + return ! kadence_blocks_is_legacy_license_authorized() && lw_harbor_is_product_license_active( 'kadence' ); + } + + /** + * Overrides the AI disabled message for Harbor-licensed customers. + * + * @param string $message The default disabled message. + * + * @return string + */ + public function ai_disabled_message( string $message ): string { + if ( kadence_blocks_is_legacy_license_authorized() ) { + return $message; + } + + if ( lw_harbor_is_product_license_active( 'kadence' ) ) { + return __( 'We\'re building something new. Kadence AI as you know it is no longer available for new activations — but great things are on the way. Stay tuned for what\'s next.', 'kadence-blocks' ); + } + + return $message; + } + +} diff --git a/includes/resources/Home/Home_Content_View_Model.php b/includes/resources/Home/Home_Content_View_Model.php new file mode 100644 index 000000000..1c2174b1a --- /dev/null +++ b/includes/resources/Home/Home_Content_View_Model.php @@ -0,0 +1,225 @@ + $this->banner_config( $is_authorized, $is_liquid_web ), + 'actionCards' => $this->action_cards( $is_authorized ), + 'knowledgeBase' => $this->knowledge_base( $is_authorized ), + ]; + } + + /** + * @return array{ + * heading: string, + * body: string, + * primaryCtaText: string, + * primaryCtaUrl: string, + * secondaryCtaText?: string, + * secondaryCtaUrl?: string, + * } + */ + private function banner_config( bool $is_authorized, bool $is_liquid_web ): array { + if ( $is_liquid_web ) { + return [ + 'heading' => __( 'Kadence AI is evolving.', 'kadence-blocks' ), + 'body' => __( "We're building something new. Kadence AI as you know it is no longer available for new activations — but great things are on the way. Stay tuned for what's next.", 'kadence-blocks' ), + 'primaryCtaText' => __( 'Learn More', 'kadence-blocks' ), + 'primaryCtaUrl' => 'https://www.kadencewp.com/kadence-blocks/', + ]; + } + + if ( $is_authorized ) { + return [ + 'heading' => __( 'Kadence is better with AI.', 'kadence-blocks' ), + 'body' => __( "Elevate your web development game with Kadence AI. Supercharge your pattern and page library's potential with tailored content — get building pages in no time. You have AI credits remaining on your account.", 'kadence-blocks' ), + 'primaryCtaText' => __( 'Get Started with Kadence AI', 'kadence-blocks' ), + 'primaryCtaUrl' => '', + 'secondaryCtaText' => __( 'Manage AI Credits', 'kadence-blocks' ), + 'secondaryCtaUrl' => esc_url( build_auth_url( apply_filters( 'kadence-blocks-auth-slug', 'kadence-blocks' ), get_license_domain() ) ), + ]; + } + + return [ + 'heading' => __( 'Kadence AI is evolving.', 'kadence-blocks' ), + 'body' => __( "Kadence AI is being reimagined. Activate your license key to check whether you have existing AI credits — or stay tuned for what's coming next.", 'kadence-blocks' ), + 'primaryCtaText' => __( 'Activate License Key', 'kadence-blocks' ), + 'primaryCtaUrl' => esc_url( build_auth_url( apply_filters( 'kadence-blocks-auth-slug', 'kadence-blocks' ), get_license_domain() ) ), + 'secondaryCtaText' => __( 'Learn More', 'kadence-blocks' ), + 'secondaryCtaUrl' => 'https://www.kadencewp.com/kadence-blocks/', + ]; + } + + /** + * @return array{ + * title: string, + * showAiIcon: bool, + * cards: array, + * } + */ + private function action_cards( bool $is_authorized ): array { + if ( $is_authorized ) { + return [ + 'title' => __( 'Start building with Kadence AI.', 'kadence-blocks' ), + 'showAiIcon' => true, + 'cards' => [ + [ + 'heading' => __( 'Build a page with AI-powered patterns', 'kadence-blocks' ), + 'content' => __( 'Take your site further with hundreds of beautiful patterns filled with custom content developed just for your site.', 'kadence-blocks' ), + 'link' => admin_url( 'post-new.php?post_type=page' ), + 'variant' => 'blue', + ], + [ + 'heading' => __( 'Get started with full pages', 'kadence-blocks' ), + 'content' => __( 'Choose from a variety of pages featuring exclusively tailored content for your site.', 'kadence-blocks' ), + 'link' => admin_url( 'post-new.php?post_type=page' ), + 'variant' => 'green', + ], + [ + 'heading' => __( 'Fine-tune your content', 'kadence-blocks' ), + 'content' => __( 'Write your own prompts to generate AI content from scratch or fine-tune existing copy.', 'kadence-blocks' ), + 'link' => '', + 'variant' => 'yellow', + ], + ], + ]; + } + + return [ + 'title' => __( 'Start building with Kadence', 'kadence-blocks' ), + 'showAiIcon' => false, + 'cards' => [ + [ + 'heading' => __( 'Build a page using pre-designed patterns', 'kadence-blocks' ), + 'content' => __( "Elevate your site's design with hundreds of beautiful patterns, customized with your site's style.", 'kadence-blocks' ), + // TODO: add query param to open Design Library on Patterns tab once URL param is established. + 'link' => admin_url( 'post-new.php?post_type=page' ), + 'variant' => 'blue', + ], + [ + 'heading' => __( 'Get started with full pages', 'kadence-blocks' ), + 'content' => __( "Kickstart your site with a variety of pre-designed page layouts, customized with your site's style.", 'kadence-blocks' ), + // TODO: add query param to open Design Library on Pages tab once URL param is established. + 'link' => admin_url( 'post-new.php?post_type=page' ), + 'variant' => 'green', + ], + [ + 'heading' => __( 'Start from scratch', 'kadence-blocks' ), + 'content' => __( "Build your website from scratch, using Kadence's blocks for layout, content and interactions.", 'kadence-blocks' ), + 'link' => admin_url( 'post-new.php?post_type=page' ), + 'variant' => 'yellow', + ], + ], + ]; + } + + /** + * @return array{ + * heading: string, + * articles: array, + * } + */ + private function knowledge_base( bool $is_authorized ): array { + return [ + 'heading' => __( 'Need Help Getting Started?', 'kadence-blocks' ), + 'articles' => $is_authorized ? $this->knowledge_base_authorized() : $this->knowledge_base_default(), + ]; + } + + private function knowledge_base_authorized(): array { + return [ + [ + 'category' => __( 'Kadence AI', 'kadence-blocks' ), + 'heading' => __( 'Update AI Settings', 'kadence-blocks' ), + 'description' => __( 'Update Kadence AI settings. Regenerate contexts for patterns and pages to reflect your updated needs.', 'kadence-blocks' ), + 'link' => 'https://www.kadencewp.com/help-center/docs/kadence-blocks/design-libary-changing-ai-details/', + 'linkTarget' => '_blank', + ], + [ + 'category' => __( 'Kadence AI', 'kadence-blocks' ), + 'heading' => __( 'Customize Image Collections', 'kadence-blocks' ), + 'description' => __( 'Update your Design Library imagery using premade collections or create and customize your own.', 'kadence-blocks' ), + 'link' => 'https://www.kadencewp.com/help-center/docs/kadence-blocks/design-library-changing-ai-image-collections/', + 'linkTarget' => '_blank', + ], + [ + 'category' => __( 'Kadence Blocks', 'kadence-blocks' ), + 'heading' => __( 'Row Layout Block', 'kadence-blocks' ), + 'description' => __( 'Use the Row Layout block to improve the column functionality and create responsive post/page layouts.', 'kadence-blocks' ), + 'link' => 'https://www.kadencewp.com/help-center/docs/kadence-blocks/row-layout-block-2/', + 'linkTarget' => '_blank', + ], + [ + 'category' => __( 'Kadence Blocks', 'kadence-blocks' ), + 'heading' => __( 'Advanced Text Block', 'kadence-blocks' ), + 'description' => __( 'Use the Advanced Text block to add text to your page/post with advanced customization - now with AI.', 'kadence-blocks' ), + 'link' => 'https://www.kadencewp.com/help-center/docs/kadence-blocks/advanced-heading-block/', + 'linkTarget' => '_blank', + ], + [ + 'category' => __( 'Support', 'kadence-blocks' ), + 'heading' => __( 'Need more help?', 'kadence-blocks' ), + 'description' => __( "Didn't find what you were looking for? Find more articles in our knowledge base.", 'kadence-blocks' ), + 'link' => 'https://www.kadencewp.com/help-center/', + 'linkTarget' => '_blank', + ], + ]; + } + + private function knowledge_base_default(): array { + return [ + [ + 'category' => __( 'Kadence Blocks', 'kadence-blocks' ), + 'heading' => __( 'Using the Design Library', 'kadence-blocks' ), + 'description' => __( 'Use fully designed patterns and pages on your site with your own customizer settings - now with AI.', 'kadence-blocks' ), + 'link' => 'https://www.kadencewp.com/help-center/docs/kadence-blocks/how-to-control-the-kadence-design-library/', + 'linkTarget' => '_blank', + ], + [ + 'category' => __( 'Kadence Blocks', 'kadence-blocks' ), + 'heading' => __( 'Row Layout Block', 'kadence-blocks' ), + 'description' => __( 'Use the Row Layout block to improve the column functionality and create responsive post/page layouts.', 'kadence-blocks' ), + 'link' => 'https://www.kadencewp.com/help-center/docs/kadence-blocks/row-layout-block-2/', + 'linkTarget' => '_blank', + ], + [ + 'category' => __( 'Kadence Blocks', 'kadence-blocks' ), + 'heading' => __( 'Advanced Text Block', 'kadence-blocks' ), + 'description' => __( 'Use the Advanced Text block to add text to your page/post with advanced customization - now with AI.', 'kadence-blocks' ), + 'link' => 'https://www.kadencewp.com/help-center/docs/kadence-blocks/advanced-heading-block/', + 'linkTarget' => '_blank', + ], + [ + 'category' => __( 'Kadence Blocks Pro', 'kadence-blocks' ), + 'heading' => __( 'Kadence Blocks Pro Plugin', 'kadence-blocks' ), + 'description' => __( 'Install and activate the Kadence Blocks Pro plugin, and get an overview of the Pro features available.', 'kadence-blocks' ), + 'link' => 'https://www.kadencewp.com/help-center/docs/kadence-blocks/kadence-blocks-pro-plugin/', + 'linkTarget' => '_blank', + ], + [ + 'category' => __( 'Support', 'kadence-blocks' ), + 'heading' => __( 'Need more help?', 'kadence-blocks' ), + 'description' => __( "Didn't find what you were looking for? Find more articles in our knowledge base.", 'kadence-blocks' ), + 'link' => 'https://www.kadencewp.com/help-center/', + 'linkTarget' => '_blank', + ], + ]; + } + +} diff --git a/includes/settings/class-kadence-blocks-settings.php b/includes/settings/class-kadence-blocks-settings.php index a0cff5889..87d69c173 100644 --- a/includes/settings/class-kadence-blocks-settings.php +++ b/includes/settings/class-kadence-blocks-settings.php @@ -9,11 +9,10 @@ exit; } -use function KadenceWP\KadenceBlocks\StellarWP\Uplink\get_authorization_token; use function KadenceWP\KadenceBlocks\StellarWP\Uplink\get_disconnect_url; use function KadenceWP\KadenceBlocks\StellarWP\Uplink\get_license_domain; -use function KadenceWP\KadenceBlocks\StellarWP\Uplink\is_authorized; use function KadenceWP\KadenceBlocks\StellarWP\Uplink\build_auth_url; +use KadenceWP\KadenceBlocks\Home\Home_Content_View_Model; /** * Build Welcome Page class @@ -588,7 +587,7 @@ public function add_color_palette_css_to_block_editor(array $settings) { private function get_color_palette_css() { $palette = json_decode( get_option( 'kadence_blocks_colors' ) ); - + if ( $palette && is_object( $palette ) && isset( $palette->palette ) && is_array( $palette->palette ) ) { $san_palette = []; foreach ( $palette->palette as $item ) { @@ -804,18 +803,15 @@ public function home_scripts() { if ( $network_enabled && function_exists( 'is_plugin_active_for_network' ) && is_plugin_active_for_network( 'kadence-blocks/kadence-blocks.php' ) ) { $using_network_enabled = true; } - $token = get_authorization_token( 'kadence-blocks' ); $auth_url = build_auth_url( apply_filters( 'kadence-blocks-auth-slug', 'kadence-blocks' ), get_license_domain() ); $license_key = kadence_blocks_get_current_license_key(); $disconnect_url = ''; - $is_authorized = false; - if ( ! empty( $license_key ) && ! kadence_blocks_is_ai_disabled() ) { - $is_authorized = is_authorized( $license_key, 'kadence-blocks', ( ! empty( $token ) ? $token : '' ), get_license_domain() ); - } + $is_authorized = ! kadence_blocks_is_ai_disabled() && kadence_blocks_is_legacy_license_authorized(); if ( $is_authorized ) { $disconnect_url = get_disconnect_url( 'kadence-blocks' ); } + // Icons Scripts & Styles. $kadence_icons_meta = kadence_blocks_get_asset_file( 'dist/icons' ); wp_register_script( 'kadence-icons', KADENCE_BLOCKS_URL . 'dist/icons.js', array_merge( $kadence_icons_meta['dependencies'], [ 'wp-api' ] ), $kadence_icons_meta['version'], true ); @@ -842,6 +838,10 @@ public function home_scripts() { $kadence_home_meta = kadence_blocks_get_asset_file( 'dist/admin-kadence-home' ); wp_enqueue_script( 'admin-kadence-home', KADENCE_BLOCKS_URL . 'dist/admin-kadence-home.js', $kadence_home_meta['dependencies'], $kadence_home_meta['version'], true ); wp_enqueue_style( 'admin-kadence-home', KADENCE_BLOCKS_URL . 'dist/admin-kadence-home.css', [ 'wp-edit-blocks', 'kadence-components' ], $kadence_home_meta['version'] ); + + // Banner Config. + $home_content = new Home_Content_View_Model(); + wp_localize_script( 'admin-kadence-home', 'kadenceHomeParams', @@ -851,6 +851,8 @@ public function home_scripts() { 'site_name' => sanitize_title( get_bloginfo( 'name' ) ), 'pSlug' => apply_filters( 'kadence-blocks-auth-slug', 'kadence-blocks' ), 'isAIDisabled' => kadence_blocks_is_ai_disabled(), + 'homeContent' => $home_content->exports(), + 'aiDisabledMessage' => kadence_blocks_get_ai_disabled_message(), 'pVersion' => KADENCE_BLOCKS_VERSION, 'isAuthorized' => $is_authorized, 'licenseKey' => $license_key, @@ -1223,7 +1225,7 @@ public function load_fonts_local_callback() { echo ''; echo ''; } - + /** * Outputs admin bar settings field */ @@ -1495,7 +1497,7 @@ public function blocks_array() { 'linkText' => __( 'Manage Lottie Animations', 'kadence-blocks' ), ], 'kadence/vector' => [ - 'slug' => 'kadence/vector', + 'slug' => 'kadence/vector', 'name' => __( 'Vector Graphics', 'kadence-blocks' ), 'desc' => __( 'Add custom vector icons and SVGs to enhance your site design.', 'kadence-blocks' ), 'link' => admin_url( 'edit.php?post_type=kadence_vector' ), diff --git a/src/dashboard/components/large-banner/ai-banner.js b/src/dashboard/components/large-banner/ai-banner.js new file mode 100644 index 000000000..0c9b27355 --- /dev/null +++ b/src/dashboard/components/large-banner/ai-banner.js @@ -0,0 +1,170 @@ +import { Button, SVG, Popover, Spinner } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; +import { aiIcon } from '@kadence/icons'; +import { SafeParseJSON } from '@kadence/helpers'; +import { useState } from '@wordpress/element'; +import { getAsyncData } from '../../../plugins/prebuilt-library/data-fetch/get-async-data'; + +const kbLogo = ( + + + + + + + + + + +); + +/** + * Banner driven entirely by server-side config from kadenceHomeParams.bannerConfig. + * + * Props: + * onUpdateWizard — callback to open the AI wizard (used when primaryCtaUrl is empty) + * showControls — whether the current user can control AI activation + * isNetworkAdmin — whether this is a network admin context + * isUserAuthenticated — whether the user has an active legacy AI connection + */ +export function AiBanner({ onUpdateWizard, showControls, isNetworkAdmin, isUserAuthenticated, aiStatus }) { + const { + heading = '', + body = '', + primaryCtaText = '', + primaryCtaUrl = '', + secondaryCtaText = '', + secondaryCtaUrl = '', + } = window?.kadenceHomeParams?.homeContent?.bannerConfig || {}; + + const [isVisible, setIsVisible] = useState(false); + const [availableCredits, setAvailableCredits] = useState(false); + const { getAvailableCredits } = getAsyncData(); + + const toggleVisible = () => { + if (availableCredits === false) { + getRemoteAvailableCredits(); + } + setIsVisible((state) => !state); + }; + + async function getRemoteAvailableCredits() { + const response = await getAvailableCredits(); + const tempActiveStorage = SafeParseJSON(localStorage.getItem('kadenceBlocksPrebuilt'), true); + if (response === 'error') { + tempActiveStorage.credits = 'fetch'; + localStorage.setItem('kadenceBlocksPrebuilt', JSON.stringify(tempActiveStorage)); + setAvailableCredits(0); + } else if (response === '') { + tempActiveStorage.credits = 0; + localStorage.setItem('kadenceBlocksPrebuilt', JSON.stringify(tempActiveStorage)); + setAvailableCredits(0); + } else { + tempActiveStorage.credits = parseInt(response); + localStorage.setItem('kadenceBlocksPrebuilt', JSON.stringify(tempActiveStorage)); + setAvailableCredits(parseInt(response)); + } + } + + const renderPrimaryCta = () => { + if (!primaryCtaText) { + return null; + } + // External/internal link — render as anchor. + if (primaryCtaUrl) { + return ( + + {primaryCtaText} + + ); + } + // No URL — open the AI wizard. Respect network-admin restriction. + if (!showControls) { + return ( +

+ {__('Authorization needed from network admin', 'kadence-blocks')} +

+ ); + } + if (isNetworkAdmin) { + return null; + } + return ( + + + )} + + ); +} diff --git a/src/dashboard/components/large-banner/disabled-banner.js b/src/dashboard/components/large-banner/disabled-banner.js deleted file mode 100644 index a52896d3c..000000000 --- a/src/dashboard/components/large-banner/disabled-banner.js +++ /dev/null @@ -1,56 +0,0 @@ -import { Button, Icon, Tooltip, SVG, Popover, Spinner } from '@wordpress/components'; -import { __ } from '@wordpress/i18n'; -import { kadenceNewIcon, aiIcon, aiSettings } from '@kadence/icons'; -import { SafeParseJSON } from '@kadence/helpers'; -import { DashboardButton } from '../dashboard-button'; -import { useEffect, useState } from '@wordpress/element'; - -import './large-banner.scss'; -import { getAsyncData } from '../../../plugins/prebuilt-library/data-fetch/get-async-data'; - -const kbLogo = ( - - - - - - - - - - -); - -export function DisabledBanner() { - return ( -
-
{kbLogo}
-
-
- {__('Kadence is better with AI.', 'kadence-blocks')} {aiIcon} -
- <> -
- {__( - "Elevate your web development game with Kadence AI. Supercharge your pattern and page library's potential with tailored content - get building pages in no time.", - 'kadence-blocks' - )} -
-

- {__('Kadence AI is disabled by site admin.', 'kadence-blocks')} -

- -
-
- ); -} diff --git a/src/dashboard/components/large-banner/large-banner.scss b/src/dashboard/components/large-banner/large-banner.scss index 2a97a56b9..d6034f44a 100644 --- a/src/dashboard/components/large-banner/large-banner.scss +++ b/src/dashboard/components/large-banner/large-banner.scss @@ -36,6 +36,32 @@ opacity: .8; } } + .kadence-open-ai-button { + &.components-button { + background: #0073E6; + color: #fff; + border-radius: 4px; + padding: 12px 24px; + height: auto; + font-size: 14px; + &:not(:disabled,[aria-disabled=true]):hover { + background: #005bb5; + color: #fff; + } + } + } + .kb-large-banner__secondary-link { + display: inline-block; + margin-top: 12px; + margin-left: 16px; + color: rgba(255, 255, 255, 0.75); + font-size: 14px; + text-decoration: underline; + text-underline-offset: 3px; + &:hover { + color: #fff; + } + } .disabled-authorize-note { background: #891c23; padding: 0.5em 1em; diff --git a/src/dashboard/constants.js b/src/dashboard/constants.js index 33a17dd33..c186cb580 100644 --- a/src/dashboard/constants.js +++ b/src/dashboard/constants.js @@ -1,7 +1,4 @@ -import { SectionTitle } from './components'; -import { Icon, SVG } from '@wordpress/components'; import { __ } from '@wordpress/i18n'; -import { aiIcon } from '@kadence/icons'; /** * Images @@ -10,117 +7,6 @@ import blocksPro from './images/blocks-pro.png'; import bundles from './images/bundles.png'; export const AUTHENTICATED_CONTENT = { - largeBanner: { - heading: <>{__("Let's build,", 'kadence-blocks')}, - subHeading: '', - imageSrc: '', - }, - actionCards: { - title: , - cards: [ - { - icon: ( - - - - - - - - - - - } - /> - ), - heading: __('Build a page with AI-powered patterns', 'kadence-blocks'), - content: __( - 'Take your site further with hundreds of beautiful patterns filled with custom content developed just for your site.', - 'kadence-blocks' - ), - variant: 'blue', - link: '/wp-admin/post-new.php?post_type=page', - }, - { - icon: ( - - - - - - - - - - - } - /> - ), - heading: __('Get started with full pages', 'kadence-blocks'), - content: __( - 'Choose from a variety of pages featuring exclusively tailored content for your site.', - 'kadence-blocks' - ), - variant: 'green', - link: '/wp-admin/post-new.php?post_type=page', - }, - { - icon: ( - - - - - - - - - - - } - /> - ), - heading: __('Fine-tune your content', 'kadence-blocks'), - content: __( - 'Write your own prompts to generate AI content from scratch or fine-tune existing copy.', - 'kadence-blocks' - ), - variant: 'yellow', - }, - ], - }, upsellContents: [ { image: blocksPro, @@ -146,153 +32,9 @@ export const AUTHENTICATED_CONTENT = { flip: true, }, ], - knowledgeBase: { - heading: __('Need Help Getting Started?', 'kadence-blocks'), - articles: [ - { - category: __('Kadence AI', 'kadence-blocks'), - heading: __('Update AI Settings', 'kadence-blocks'), - description: __( - 'Update Kadence AI settings. Regenerate contexts for patterns and pages to reflect your updated needs.', - 'kadence-blocks' - ), - link: 'https://www.kadencewp.com/help-center/docs/kadence-blocks/design-libary-changing-ai-details/', - linkTarget: '_blank', - }, - { - category: __('Kadence AI', 'kadence-blocks'), - heading: __('Customize Image Collections', 'kadence-blocks'), - description: __( - 'Update your Design Library imagery using premade collections or create and customize your own.', - 'kadence-blocks' - ), - link: 'https://www.kadencewp.com/help-center/docs/kadence-blocks/design-library-changing-ai-image-collections/', - linkTarget: '_blank', - }, - { - category: __('Kadence Blocks', 'kadence-blocks'), - heading: __('Row Layout Block', 'kadence-blocks'), - description: __( - 'Use the Row Layout block to improve the column functionality and create responsive post/page layouts.', - 'kadence-blocks' - ), - link: 'https://www.kadencewp.com/help-center/docs/kadence-blocks/row-layout-block-2/', - linkTarget: '_blank', - }, - { - category: __('Kadence Blocks', 'kadence-blocks'), - heading: __('Advanced Text Block', 'kadence-blocks'), - description: __( - 'Use the Advanced Text block to add text to your page/post with advanced customization - now with AI.', - 'kadence-blocks' - ), - link: 'https://www.kadencewp.com/help-center/docs/kadence-blocks/advanced-heading-block/', - linkTarget: '_blank', - }, - { - category: __('Support', 'kadence-blocks'), - heading: __('Need more help?', 'kadence-blocks'), - description: __( - "Didn't find what you were looking for? Find more articles in our knowledge base.", - 'kadence-blocks' - ), - link: 'https://www.kadencewp.com/help-center/', - linkTarget: '_blank', - }, - ], - }, }; export const UNAUTHENTICATED_CONTENT = { - largeBanner: { - heading: ( - <> - {__('Kadence is better with AI.', 'kadence-blocks')} {aiIcon} - - ), - subHeading: __( - "Elevate your web development game with Kadence AI. Supercharge your pattern and page library's potential with tailored content - get building pages in no time. Try Kadence AI today with 250 free credits!", - 'kadence-blocks' - ), - subHeadingPro: __( - "Elevate your web development game with Kadence AI. Supercharge your pattern and page library's potential with tailored content - get building pages in no time. Connect to your account to use Kadence AI with Kadence Blocks Pro", - 'kadence-blocks' - ), - buttonText: __('Get Started with Kadence AI', 'kadence-blocks'), - }, - actionCards: { - title: , - cards: [ - { - icon: ( - - - - - - - - - - - } - /> - ), - heading: __('A content-rich design library that is uniquely yours', 'kadence-blocks'), - content: __( - 'Jump-start your site-building process with unique content and gorgeous designs. Learn more about the AI-Powered Design Library.', - 'kadence-blocks' - ), - link: 'https://www.kadencewp.com/wordpress-solutions/kadence-ai/', - variant: 'blue', - }, - { - icon: ( - - - - - - - - - - - } - /> - ), - heading: __('Fine-Tuned Editing', 'kadence-blocks'), - content: __( - 'Get your messaging on point with in-line AI-assisted editing. Learn More about the inline AI.', - 'kadence-blocks' - ), - link: 'https://www.kadencewp.com/wordpress-solutions/kadence-ai/', - variant: 'green', - }, - ], - }, upsellContents: [ { image: blocksPro, @@ -318,69 +60,4 @@ export const UNAUTHENTICATED_CONTENT = { flip: true, }, ], - knowledgeBase: { - heading: __('Need Help Getting Started?', 'kadence-blocks'), - articles: [ - { - category: __('Kadence Blocks', 'kadence-blocks'), - heading: __('Using the Design Library', 'kadence-blocks'), - description: __( - 'Use fully designed patterns and pages on your site with your own customizer settings - now with AI.', - 'kadence-blocks' - ), - link: 'https://www.kadencewp.com/help-center/docs/kadence-blocks/how-to-control-the-kadence-design-library/', - linkTarget: '_blank', - }, - { - category: __('Kadence Blocks', 'kadence-blocks'), - heading: __('Row Layout Block', 'kadence-blocks'), - description: __( - 'Use the Row Layout block to improve the column functionality and create responsive post/page layouts.', - 'kadence-blocks' - ), - link: 'https://www.kadencewp.com/help-center/docs/kadence-blocks/row-layout-block-2/', - linkTarget: '_blank', - }, - { - category: __('Kadence Blocks', 'kadence-blocks'), - heading: __('Advanced Text Block', 'kadence-blocks'), - description: __( - 'Use the Advanced Text block to add text to your page/post with advanced customization - now with AI.', - 'kadence-blocks' - ), - link: 'https://www.kadencewp.com/help-center/docs/kadence-blocks/advanced-heading-block/', - linkTarget: '_blank', - }, - { - category: __('Kadence Blocks Pro', 'kadence-blocks'), - heading: __('Kadence Blocks Pro Plugin', 'kadence-blocks'), - description: __( - 'Install and activate the Kadence Blocks Pro plugin, and get an overview of the Pro features available.', - 'kadence-blocks' - ), - link: 'https://www.kadencewp.com/help-center/docs/kadence-blocks/kadence-blocks-pro-plugin/', - linkTarget: '_blank', - }, - { - category: __('Kadence Blocks Pro', 'kadence-blocks'), - heading: __('Advanced Slider', 'kadence-blocks'), - description: __( - 'Showcase products or highlight important visual content using the Advanced Slider block.', - 'kadence-blocks' - ), - link: 'https://www.kadencewp.com/help-center/docs/kadence-blocks/advanced-slider/', - linkTarget: '_blank', - }, - { - category: __('Support', 'kadence-blocks'), - heading: __('Need more help?', 'kadence-blocks'), - description: __( - "Didn't find what you were looking for? Find more articles in our knowledge base.", - 'kadence-blocks' - ), - link: 'https://www.kadencewp.com/help-center/', - linkTarget: '_blank', - }, - ], - }, }; diff --git a/src/dashboard/index.js b/src/dashboard/index.js index 972bedf1b..8ffde3ca2 100644 --- a/src/dashboard/index.js +++ b/src/dashboard/index.js @@ -4,9 +4,10 @@ import { AiWizard } from '../plugins/prebuilt-library/ai-wizard'; import { getAsyncData } from '../plugins/prebuilt-library/data-fetch/get-async-data'; import Notices from './notices'; -import { ActionCard, ArticleSlider, LargeBanner, SectionTitle, UpsellContent } from './components'; +import { ActionCard, ArticleSlider, SectionTitle, UpsellContent } from './components'; import { AUTHENTICATED_CONTENT, UNAUTHENTICATED_CONTENT } from './constants'; -import { DisabledBanner } from './components/large-banner/disabled-banner'; +import { AiBanner } from './components/large-banner/ai-banner'; +import { aiIcon } from '@kadence/icons'; /** * Import Css @@ -19,7 +20,7 @@ import { useEffect, useState } from '@wordpress/element'; import { __, _n, sprintf } from '@wordpress/i18n'; import { store as noticesStore } from '@wordpress/notices'; import { useDispatch } from '@wordpress/data'; -import { Button, Spinner } from '@wordpress/components'; +import { Icon, SVG, Spinner } from '@wordpress/components'; export default function KadenceBlocksHome() { const [wizardState, setWizardState] = useState(false); @@ -32,11 +33,30 @@ export default function KadenceBlocksHome() { const authenticated = kadenceHomeParams.isAuthorized ? true : false; const isNetworkAdmin = kadenceHomeParams.isNetworkAdmin ? true : false; const isNetworkEnabled = kadenceHomeParams.isNetworkEnabled ? true : false; - const isAIDisabled = kadenceHomeParams.isAIDisabled ? true : false; const hasPro = window?.kadenceHomeParams?.pro && kadenceHomeParams.pro === 'true' ? true : false; const showControls = (isNetworkAdmin && isNetworkEnabled) || (!isNetworkAdmin && !isNetworkEnabled) ? true : false; const content = authenticated ? AUTHENTICATED_CONTENT : UNAUTHENTICATED_CONTENT; + const homeContent = window?.kadenceHomeParams?.homeContent || {}; + const cardIcon = ( + + + + + + + + + + + } + /> + ); const getInitialAIStatus = () => { if (authenticated && 'start' === aiStatus) { checkAIStatus(); @@ -133,29 +153,14 @@ export default function KadenceBlocksHome() { {__('Disconnect?', 'kadence-blocks')} ); - if (isAIDisabled) { - return ( - <> - - -
-
- - -
-
- - ); - } return ( <> - setWizardState(true)} isUserAuthenticated={authenticated} showControls={showControls} isNetworkAdmin={isNetworkAdmin} + aiStatus={aiStatus} /> {aiStatus === 'getInitial' && (
@@ -171,12 +176,15 @@ export default function KadenceBlocksHome() {
- {content.actionCards.title} - {content.actionCards.cards.length > 0 && ( + + {homeContent?.actionCards?.cards?.length > 0 && (
- {content.actionCards.cards.map((card) => { - return ; - })} + {homeContent.actionCards.cards.map((card) => ( + + ))}
)}
@@ -203,8 +211,8 @@ export default function KadenceBlocksHome() {
- - + +
diff --git a/src/plugins/prebuilt-library/page-list.js b/src/plugins/prebuilt-library/page-list.js index d7ba23022..95a780994 100644 --- a/src/plugins/prebuilt-library/page-list.js +++ b/src/plugins/prebuilt-library/page-list.js @@ -528,7 +528,8 @@ function PageList({ return (

- {__('Kadence AI is disabled by site admin.', 'kadence-blocks')} + {window?.kadence_blocks_params?.aiDisabledMessage || + __('Kadence AI is disabled by site admin.', 'kadence-blocks')}

); diff --git a/src/plugins/prebuilt-library/pattern-list.js b/src/plugins/prebuilt-library/pattern-list.js index 0d73653ff..8fb95492f 100644 --- a/src/plugins/prebuilt-library/pattern-list.js +++ b/src/plugins/prebuilt-library/pattern-list.js @@ -1273,7 +1273,8 @@ function PatternList({ return (

- {__('Kadence AI is disabled by site admin.', 'kadence-blocks')} + {window?.kadence_blocks_params?.aiDisabledMessage || + __('Kadence AI is disabled by site admin.', 'kadence-blocks')}

);