From e09e5b366496ccb1c5a586a78f4e7618aad5f6f3 Mon Sep 17 00:00:00 2001 From: Evan Mullins Date: Tue, 14 Nov 2023 15:00:07 -0500 Subject: [PATCH 1/2] update UI and modules and everything! --- .npmrc | 3 +- .wp-env.json | 2 +- assets/svg/large-star.svg | 3 - assets/svg/small-blue-star.svg | 18 - assets/svg/star-gray.svg | 4 - assets/svg/web-icon-white.svg | 3 + assets/svg/web-icon.svg | 4 +- assets/svg/web-logo.svg | 9 +- composer.json | 9 +- composer.lock | 885 ++++++++- cypress.config.js | 1 - inc/Admin.php | 21 +- inc/Data.php | 14 +- inc/RestApi/SettingsController.php | 1 + package-lock.json | 1599 +++++++++++++---- package.json | 25 +- postcss.config.js | 8 + src/app/components/accordion/index.js | 14 - src/app/components/accordion/stylesheet.scss | 33 - src/app/components/action-field/index.js | 37 + src/app/components/app-nav/index.js | 198 ++ .../components/{header => app-nav}/logo.js | 9 +- src/app/components/errorCard/index.js | 34 +- src/app/components/errorCard/stylesheet.scss | 3 +- src/app/components/header/index.js | 28 - src/app/components/header/nav-large.js | 26 - src/app/components/header/nav-mobile.js | 42 - src/app/components/header/nav-utility.js | 35 - src/app/components/header/stylesheet.scss | 179 -- src/app/components/heading/index.js | 6 +- src/app/components/icons/WordPressIcon.js | 19 + src/app/components/icons/index.js | 1 + src/app/components/index.js | 2 - src/app/components/notifications/feed.js | 82 + src/app/components/page/index.js | 15 + src/app/components/section/index.js | 94 + src/app/components/site-info/index.js | 64 + src/app/data/help.js | 14 +- src/app/data/routes.js | 26 +- src/app/data/store.js | 5 +- src/app/images/section-settings-and-perf.png | Bin 39422 -> 0 bytes src/app/images/section-web-content.png | Bin 34896 -> 0 bytes src/app/images/section-web-hosting.png | Bin 39956 -> 0 bytes src/app/images/star-gray.jpg | Bin 4364 -> 0 bytes src/app/index.js | 37 +- src/app/pages/help/index.js | 95 +- src/app/pages/help/stylesheet.scss | 15 - src/app/pages/home/comingSoonSection.js | 133 -- src/app/pages/home/index.js | 39 +- src/app/pages/home/settingsSection.js | 132 +- src/app/pages/home/stylesheet.scss | 122 -- src/app/pages/home/webContentSection.js | 129 +- src/app/pages/home/webHostingSection.js | 164 +- src/app/pages/marketplace/index.js | 78 +- src/app/pages/marketplace/stylesheet.scss | 227 --- src/app/pages/performance/cacheSettings.js | 152 -- src/app/pages/performance/clearCache.js | 72 - src/app/pages/performance/index.js | 85 +- src/app/pages/performance/settingsCallout.js | 39 - src/app/pages/performance/stylesheet.scss | 61 - src/app/pages/settings/automaticUpdates.js | 459 ++--- src/app/pages/settings/comingSoon.js | 182 +- src/app/pages/settings/commentSettings.js | 411 +++-- src/app/pages/settings/contentSettings.js | 303 ++-- src/app/pages/settings/index.js | 54 +- src/app/pages/settings/performanceCallout.js | 39 - src/app/pages/settings/stylesheet.scss | 21 - src/app/stylesheet.scss | 35 - src/app/tailwind.css | 293 +++ src/app/util/helpers.js | 24 +- src/index.js | 13 +- src/webpack-public-path.js | 4 +- tailwind.config.js | 49 + tests/cypress/integration/coming-soon.cy.js | 119 -- tests/cypress/integration/help.cy.js | 38 +- tests/cypress/integration/home.cy.js | 34 +- tests/cypress/integration/marketplace.cy.js | 135 -- tests/cypress/integration/navigation.cy.js | 90 +- tests/cypress/integration/performance.cy.js | 82 - .../integration/premium-plugins-tab.cy.js | 76 - tests/cypress/integration/settings.cy.js | 240 ++- tests/cypress/support/commands.js | 28 + wp-plugin-web.php | 6 +- 83 files changed, 4430 insertions(+), 3460 deletions(-) delete mode 100644 assets/svg/large-star.svg delete mode 100644 assets/svg/small-blue-star.svg delete mode 100644 assets/svg/star-gray.svg create mode 100644 assets/svg/web-icon-white.svg create mode 100644 postcss.config.js delete mode 100644 src/app/components/accordion/index.js delete mode 100644 src/app/components/accordion/stylesheet.scss create mode 100644 src/app/components/action-field/index.js create mode 100644 src/app/components/app-nav/index.js rename src/app/components/{header => app-nav}/logo.js (78%) delete mode 100644 src/app/components/header/index.js delete mode 100644 src/app/components/header/nav-large.js delete mode 100644 src/app/components/header/nav-mobile.js delete mode 100644 src/app/components/header/nav-utility.js delete mode 100644 src/app/components/header/stylesheet.scss create mode 100644 src/app/components/icons/WordPressIcon.js create mode 100644 src/app/components/icons/index.js create mode 100644 src/app/components/notifications/feed.js create mode 100644 src/app/components/page/index.js create mode 100644 src/app/components/section/index.js create mode 100644 src/app/components/site-info/index.js delete mode 100644 src/app/images/section-settings-and-perf.png delete mode 100644 src/app/images/section-web-content.png delete mode 100644 src/app/images/section-web-hosting.png delete mode 100644 src/app/images/star-gray.jpg delete mode 100644 src/app/pages/help/stylesheet.scss delete mode 100644 src/app/pages/home/comingSoonSection.js delete mode 100644 src/app/pages/home/stylesheet.scss delete mode 100644 src/app/pages/marketplace/stylesheet.scss delete mode 100644 src/app/pages/performance/cacheSettings.js delete mode 100644 src/app/pages/performance/clearCache.js delete mode 100644 src/app/pages/performance/settingsCallout.js delete mode 100644 src/app/pages/performance/stylesheet.scss delete mode 100644 src/app/pages/settings/performanceCallout.js delete mode 100644 src/app/pages/settings/stylesheet.scss create mode 100644 src/app/tailwind.css create mode 100644 tailwind.config.js delete mode 100644 tests/cypress/integration/coming-soon.cy.js delete mode 100644 tests/cypress/integration/marketplace.cy.js delete mode 100644 tests/cypress/integration/performance.cy.js delete mode 100644 tests/cypress/integration/premium-plugins-tab.cy.js diff --git a/.npmrc b/.npmrc index 4ae70b7..7937f83 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,2 @@ -@newfold-labs:registry=https://npm.pkg.github.com/ \ No newline at end of file +@newfold-labs:registry=https://npm.pkg.github.com/ +legacy-peer-deps=true \ No newline at end of file diff --git a/.wp-env.json b/.wp-env.json index b6d2244..73cf14a 100644 --- a/.wp-env.json +++ b/.wp-env.json @@ -1,5 +1,5 @@ { - "core": "WordPress/WordPress#tags/6.3.2", + "core": "WordPress/WordPress#tags/6.4.1", "config": { "WP_DEBUG": true, "WP_DEBUG_LOG": true, diff --git a/assets/svg/large-star.svg b/assets/svg/large-star.svg deleted file mode 100644 index b493270..0000000 --- a/assets/svg/large-star.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/svg/small-blue-star.svg b/assets/svg/small-blue-star.svg deleted file mode 100644 index eca9d7c..0000000 --- a/assets/svg/small-blue-star.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/assets/svg/star-gray.svg b/assets/svg/star-gray.svg deleted file mode 100644 index 402e3d3..0000000 --- a/assets/svg/star-gray.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/assets/svg/web-icon-white.svg b/assets/svg/web-icon-white.svg new file mode 100644 index 0000000..831c5b8 --- /dev/null +++ b/assets/svg/web-icon-white.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/svg/web-icon.svg b/assets/svg/web-icon.svg index 3727a49..8b45e1e 100644 --- a/assets/svg/web-icon.svg +++ b/assets/svg/web-icon.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + \ No newline at end of file diff --git a/assets/svg/web-logo.svg b/assets/svg/web-logo.svg index dd1a253..6a1bcf6 100644 --- a/assets/svg/web-logo.svg +++ b/assets/svg/web-logo.svg @@ -1 +1,8 @@ - \ No newline at end of file + + + + + + + + \ No newline at end of file diff --git a/composer.json b/composer.json index fa91e9c..c8892e1 100644 --- a/composer.json +++ b/composer.json @@ -37,6 +37,7 @@ }, "require-dev": { "newfold-labs/wp-php-standards": "^1.2", + "roave/security-advisories": "dev-latest", "wp-cli/i18n-command": "^2.4", "wp-phpunit/wp-phpunit": "^6.3.1" }, @@ -57,10 +58,12 @@ "doctrine/inflector": "1.2.0 as 1.3.1", "newfold-labs/wp-module-coming-soon": "^1.1.12", "newfold-labs/wp-module-data": "^2.4.11", + "newfold-labs/wp-module-deactivation": "^1.0.2", "newfold-labs/wp-module-loader": "^1.0.10", - "newfold-labs/wp-module-marketplace": "1.5.2", - "newfold-labs/wp-module-notifications": "^1.1.6", - "newfold-labs/wp-module-performance": "1.1.1", + "newfold-labs/wp-module-marketplace": "^2.1.0", + "newfold-labs/wp-module-notifications": "^1.2.1", + "newfold-labs/wp-module-performance": "^1.2.2", + "newfold-labs/wp-module-runtime": "^1.0.7", "newfold-labs/wp-module-secure-passwords": "^1.1", "newfold-labs/wp-module-sso": "^1.0.4", "wp-forge/wp-update-handler": "^1.0", diff --git a/composer.lock b/composer.lock index a5d6140..c8cf95c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "27a36d681c350543c4ddc645fb2b9d69", + "content-hash": "fba8205abd05c1ca16c4edac413f50a5", "packages": [ { "name": "doctrine/inflector", @@ -213,6 +213,67 @@ }, "time": "2023-11-13T19:54:44+00:00" }, + { + "name": "newfold-labs/wp-module-deactivation", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/newfold-labs/wp-module-deactivation.git", + "reference": "dd8bf1820a0bd136e1a673d3a4b916b4c581179a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/newfold-labs/wp-module-deactivation/zipball/dd8bf1820a0bd136e1a673d3a4b916b4c581179a", + "reference": "dd8bf1820a0bd136e1a673d3a4b916b4c581179a", + "shasum": "" + }, + "require": { + "newfold-labs/wp-module-data": "^2.0.0" + }, + "require-dev": { + "newfold-labs/wp-php-standards": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "NewfoldLabs\\WP\\Module\\Deactivation\\": "includes" + }, + "files": [ + "bootstrap.php" + ] + }, + "scripts": { + "fix": [ + "vendor/bin/phpcbf --standard=phpcs.xml ." + ], + "lint": [ + "vendor/bin/phpcs --standard=phpcs.xml -s ." + ] + }, + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Micah Wood", + "email": "micah@wpscholar.com" + }, + { + "name": "Evan Mullins", + "email": "evanrm@gmail.com" + }, + { + "name": "Al Ani", + "email": "hey@alani.dev" + } + ], + "description": "A Module for handling WordPress brand plugins and modules deactivations", + "support": { + "source": "https://github.com/newfold-labs/wp-module-deactivation/tree/1.0.2", + "issues": "https://github.com/newfold-labs/wp-module-deactivation/issues" + }, + "time": "2023-10-17T22:48:37+00:00" + }, { "name": "newfold-labs/wp-module-loader", "version": "1.0.10", @@ -261,16 +322,16 @@ }, { "name": "newfold-labs/wp-module-marketplace", - "version": "1.5.2", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/newfold-labs/wp-module-marketplace.git", - "reference": "669232711e2c99d3f527fedbbbb6bb3ab785d1cc" + "reference": "3f836e2ae93e97e91a677e12ceb65fda90ee4d86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/newfold-labs/wp-module-marketplace/zipball/669232711e2c99d3f527fedbbbb6bb3ab785d1cc", - "reference": "669232711e2c99d3f527fedbbbb6bb3ab785d1cc", + "url": "https://api.github.com/repos/newfold-labs/wp-module-marketplace/zipball/3f836e2ae93e97e91a677e12ceb65fda90ee4d86", + "reference": "3f836e2ae93e97e91a677e12ceb65fda90ee4d86", "shasum": "" }, "require": { @@ -311,23 +372,23 @@ ], "description": "A module for rendering product data and interacting with the Hiive marketplace API.", "support": { - "source": "https://github.com/newfold-labs/wp-module-marketplace/tree/1.5.2", + "source": "https://github.com/newfold-labs/wp-module-marketplace/tree/2.1.0", "issues": "https://github.com/newfold-labs/wp-module-marketplace/issues" }, - "time": "2023-08-14T20:35:54+00:00" + "time": "2023-11-07T15:19:22+00:00" }, { "name": "newfold-labs/wp-module-notifications", - "version": "1.1.6", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/newfold-labs/wp-module-notifications.git", - "reference": "040c63553978974bdebc066febb0ba3842875095" + "reference": "802de89e0a94f59f93b5637fdcce62d80a30af1c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/newfold-labs/wp-module-notifications/zipball/040c63553978974bdebc066febb0ba3842875095", - "reference": "040c63553978974bdebc066febb0ba3842875095", + "url": "https://api.github.com/repos/newfold-labs/wp-module-notifications/zipball/802de89e0a94f59f93b5637fdcce62d80a30af1c", + "reference": "802de89e0a94f59f93b5637fdcce62d80a30af1c", "shasum": "" }, "require": { @@ -356,23 +417,23 @@ ], "description": "A module for managing Newfold in-site notifications.", "support": { - "source": "https://github.com/newfold-labs/wp-module-notifications/tree/1.1.6", + "source": "https://github.com/newfold-labs/wp-module-notifications/tree/1.2.1", "issues": "https://github.com/newfold-labs/wp-module-notifications/issues" }, - "time": "2023-10-18T16:10:26+00:00" + "time": "2023-11-13T22:55:16+00:00" }, { "name": "newfold-labs/wp-module-performance", - "version": "1.1.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/newfold-labs/wp-module-performance.git", - "reference": "7efc4f25a9e576d6aae79f9e3472630bc8e46fcd" + "reference": "f5cf5924aa6aaceebdf0b5d8b5ea7e004eb1d1a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/newfold-labs/wp-module-performance/zipball/7efc4f25a9e576d6aae79f9e3472630bc8e46fcd", - "reference": "7efc4f25a9e576d6aae79f9e3472630bc8e46fcd", + "url": "https://api.github.com/repos/newfold-labs/wp-module-performance/zipball/f5cf5924aa6aaceebdf0b5d8b5ea7e004eb1d1a8", + "reference": "f5cf5924aa6aaceebdf0b5d8b5ea7e004eb1d1a8", "shasum": "" }, "require": { @@ -401,10 +462,62 @@ ], "description": "A module for managing caching functionality.", "support": { - "source": "https://github.com/newfold-labs/wp-module-performance/tree/1.1.1", + "source": "https://github.com/newfold-labs/wp-module-performance/tree/1.2.2", "issues": "https://github.com/newfold-labs/wp-module-performance/issues" }, - "time": "2023-06-12T11:20:05+00:00" + "time": "2023-10-30T13:02:28+00:00" + }, + { + "name": "newfold-labs/wp-module-runtime", + "version": "v1.0.7", + "source": { + "type": "git", + "url": "https://github.com/newfold-labs/wp-module-runtime.git", + "reference": "af938ea9e3a00e981c7452954e1835339951b9aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/newfold-labs/wp-module-runtime/zipball/af938ea9e3a00e981c7452954e1835339951b9aa", + "reference": "af938ea9e3a00e981c7452954e1835339951b9aa", + "shasum": "" + }, + "require-dev": { + "newfold-labs/wp-php-standards": "@stable", + "wp-cli/i18n-command": "@stable", + "wp-cli/wp-cli-bundle": "@stable" + }, + "type": "library", + "autoload": { + "psr-4": { + "NewfoldLabs\\WP\\Module\\Runtime\\": "includes" + }, + "files": [ + "bootstrap.php" + ] + }, + "scripts": { + "fix": [ + "vendor/bin/phpcbf --standard=phpcs.xml ." + ], + "lint": [ + "vendor/bin/phpcs --standard=phpcs.xml -s ." + ] + }, + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Beyond", + "email": "team-spartans@newfold.com" + } + ], + "description": "Runtime for Newfold WP modules and plugins", + "support": { + "source": "https://github.com/newfold-labs/wp-module-runtime/tree/v1.0.7", + "issues": "https://github.com/newfold-labs/wp-module-runtime/issues" + }, + "time": "2023-10-10T18:58:42+00:00" }, { "name": "newfold-labs/wp-module-secure-passwords", @@ -1460,16 +1573,16 @@ }, { "name": "phpcsstandards/phpcsextra", - "version": "1.1.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHPCSExtra.git", - "reference": "98bcdbacbda14b1db85f710b1853125726795bbc" + "reference": "746c3190ba8eb2f212087c947ba75f4f5b9a58d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHPCSExtra/zipball/98bcdbacbda14b1db85f710b1853125726795bbc", - "reference": "98bcdbacbda14b1db85f710b1853125726795bbc", + "url": "https://api.github.com/repos/PHPCSStandards/PHPCSExtra/zipball/746c3190ba8eb2f212087c947ba75f4f5b9a58d5", + "reference": "746c3190ba8eb2f212087c947ba75f4f5b9a58d5", "shasum": "" }, "require": { @@ -1519,7 +1632,7 @@ "issues": "https://github.com/PHPCSStandards/PHPCSExtra/issues", "source": "https://github.com/PHPCSStandards/PHPCSExtra" }, - "time": "2023-08-26T04:46:45+00:00" + "time": "2023-09-20T22:06:18+00:00" }, { "name": "phpcsstandards/phpcsutils", @@ -1594,6 +1707,700 @@ }, "time": "2023-07-16T21:39:41+00:00" }, + { + "name": "roave/security-advisories", + "version": "dev-latest", + "source": { + "type": "git", + "url": "https://github.com/Roave/SecurityAdvisories.git", + "reference": "46ed208a0bc44f90d8248bc94adf8a490cff9ef1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/46ed208a0bc44f90d8248bc94adf8a490cff9ef1", + "reference": "46ed208a0bc44f90d8248bc94adf8a490cff9ef1", + "shasum": "" + }, + "conflict": { + "3f/pygmentize": "<1.2", + "admidio/admidio": "<4.2.11", + "adodb/adodb-php": "<=5.20.20|>=5.21,<=5.21.3", + "aheinze/cockpit": "<2.2", + "aimeos/aimeos-typo3": "<19.10.12|>=20,<20.10.5", + "akaunting/akaunting": "<2.1.13", + "akeneo/pim-community-dev": "<5.0.119|>=6,<6.0.53", + "alextselegidis/easyappointments": "<1.5", + "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", + "amazing/media2click": ">=1,<1.3.3", + "amphp/artax": "<1.0.6|>=2,<2.0.6", + "amphp/http": "<1.0.1", + "amphp/http-client": ">=4,<4.4", + "anchorcms/anchor-cms": "<=0.12.7", + "andreapollastri/cipi": "<=3.1.15", + "andrewhaine/silverstripe-form-capture": ">=0.2,<=0.2.3|>=1,<1.0.2|>=2,<2.2.5", + "apache-solr-for-typo3/solr": "<2.8.3", + "apereo/phpcas": "<1.6", + "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6|>=2.6,<2.7.10|>=3,<3.0.12|>=3.1,<3.1.3", + "appwrite/server-ce": "<=1.2.1", + "arc/web": "<3", + "area17/twill": "<1.2.5|>=2,<2.5.3", + "artesaos/seotools": "<0.17.2", + "asymmetricrypt/asymmetricrypt": "<9.9.99", + "athlon1600/php-proxy": "<=5.1", + "athlon1600/php-proxy-app": "<=3", + "austintoddj/canvas": "<=3.4.2", + "automad/automad": "<1.8", + "awesome-support/awesome-support": "<=6.0.7", + "aws/aws-sdk-php": ">=3,<3.2.1", + "azuracast/azuracast": "<0.18.3", + "backdrop/backdrop": "<1.24.2", + "backpack/crud": "<3.4.9", + "bacula-web/bacula-web": "<8.0.0.0-RC2-dev", + "badaso/core": "<2.7", + "bagisto/bagisto": "<0.1.5", + "barrelstrength/sprout-base-email": "<1.2.7", + "barrelstrength/sprout-forms": "<3.9", + "barryvdh/laravel-translation-manager": "<0.6.2", + "barzahlen/barzahlen-php": "<2.0.1", + "baserproject/basercms": "<4.8", + "bassjobsen/bootstrap-3-typeahead": ">4.0.2", + "bigfork/silverstripe-form-capture": ">=3,<3.1.1", + "billz/raspap-webgui": "<=2.9.2", + "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", + "bmarshall511/wordpress_zero_spam": "<5.2.13", + "bolt/bolt": "<3.7.2", + "bolt/core": "<=4.2", + "bottelet/flarepoint": "<2.2.1", + "brightlocal/phpwhois": "<=4.2.5", + "brotkrueml/codehighlight": "<2.7", + "brotkrueml/schema": "<1.13.1|>=2,<2.5.1", + "brotkrueml/typo3-matomo-integration": "<1.3.2", + "buddypress/buddypress": "<7.2.1", + "bugsnag/bugsnag-laravel": "<2.0.2", + "bytefury/crater": "<6.0.2", + "cachethq/cachet": "<2.5.1", + "cakephp/cakephp": "<3.10.3|>=4,<4.0.10|>=4.1,<4.1.4|>=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", + "cakephp/database": ">=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", + "cardgate/magento2": "<2.0.33", + "cardgate/woocommerce": "<=3.1.15", + "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cartalyst/sentry": "<=2.1.6", + "catfan/medoo": "<1.7.5", + "cecil/cecil": "<7.47.1", + "centreon/centreon": "<22.10.0.0-beta1", + "cesnet/simplesamlphp-module-proxystatistics": "<3.1", + "chriskacerguis/codeigniter-restserver": "<=2.7.1", + "civicrm/civicrm-core": ">=4.2,<4.2.9|>=4.3,<4.3.3", + "cockpit-hq/cockpit": "<=2.6.3", + "codeception/codeception": "<3.1.3|>=4,<4.1.22", + "codeigniter/framework": "<3.1.9", + "codeigniter4/framework": "<=4.4.2", + "codeigniter4/shield": "<1.0.0.0-beta4", + "codiad/codiad": "<=2.8.4", + "composer/composer": "<1.10.27|>=2,<2.2.22|>=2.3,<2.6.4", + "concrete5/concrete5": "<=9.2.1", + "concrete5/core": "<8.5.8|>=9,<9.1", + "contao-components/mediaelement": ">=2.14.2,<2.21.1", + "contao/contao": ">=4,<4.4.56|>=4.5,<4.9.40|>=4.10,<4.11.7|>=4.13,<4.13.21|>=5.1,<5.1.4", + "contao/core": ">=2,<3.5.39", + "contao/core-bundle": "<4.9.42|>=4.10,<4.13.28|>=5,<5.1.10", + "contao/listing-bundle": ">=4,<4.4.8", + "contao/managed-edition": "<=1.5", + "cosenary/instagram": "<=2.3", + "craftcms/cms": "<=4.4.14", + "croogo/croogo": "<4", + "cuyz/valinor": "<0.12", + "czproject/git-php": "<4.0.3", + "darylldoyle/safe-svg": "<1.9.10", + "datadog/dd-trace": ">=0.30,<0.30.2", + "datatables/datatables": "<1.10.10", + "david-garcia/phpwhois": "<=4.3.1", + "dbrisinajumi/d2files": "<1", + "dcat/laravel-admin": "<=2.1.3.0-beta", + "derhansen/fe_change_pwd": "<2.0.5|>=3,<3.0.3", + "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", + "desperado/xml-bundle": "<=0.1.7", + "directmailteam/direct-mail": "<5.2.4", + "doctrine/annotations": "<1.2.7", + "doctrine/cache": "<1.3.2|>=1.4,<1.4.2", + "doctrine/common": "<2.4.3|>=2.5,<2.5.1", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2|>=3,<3.1.4", + "doctrine/doctrine-bundle": "<1.5.2", + "doctrine/doctrine-module": "<=0.7.1", + "doctrine/mongodb-odm": "<1.0.2", + "doctrine/mongodb-odm-bundle": "<3.0.1", + "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", + "dolibarr/dolibarr": "<18.0.2", + "dompdf/dompdf": "<2.0.2|==2.0.2", + "drupal/core": "<9.4.14|>=9.5,<9.5.8|>=10,<10.0.8", + "drupal/drupal": ">=6,<6.38|>=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", + "dweeves/magmi": "<=0.7.24", + "ecodev/newsletter": "<=4", + "ectouch/ectouch": "<=2.7.2", + "elefant/cms": "<2.0.7", + "elgg/elgg": "<3.3.24|>=4,<4.0.5", + "encore/laravel-admin": "<=1.8.19", + "endroid/qr-code-bundle": "<3.4.2", + "enshrined/svg-sanitize": "<0.15", + "erusev/parsedown": "<1.7.2", + "ether/logs": "<3.0.4", + "evolutioncms/evolution": "<=3.2.3", + "exceedone/exment": "<4.4.3|>=5,<5.0.3", + "exceedone/laravel-admin": "<2.2.3|==3", + "ezsystems/demobundle": ">=5.4,<5.4.6.1-dev", + "ezsystems/ez-support-tools": ">=2.2,<2.2.3", + "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1-dev", + "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1-dev|>=5.4,<5.4.11.1-dev|>=2017.12,<2017.12.0.1-dev", + "ezsystems/ezplatform": "<=1.13.6|>=2,<=2.5.24", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6|>=1.5,<1.5.29|>=2.3,<2.3.26", + "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", + "ezsystems/ezplatform-graphql": ">=1.0.0.0-RC1-dev,<1.0.13|>=2.0.0.0-beta1,<2.3.12", + "ezsystems/ezplatform-kernel": "<1.2.5.1-dev|>=1.3,<1.3.34", + "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8", + "ezsystems/ezplatform-richtext": ">=2.3,<2.3.7.1-dev", + "ezsystems/ezplatform-solr-search-engine": ">=1.7,<1.7.12|>=2,<2.0.2|>=3.3,<3.3.15", + "ezsystems/ezplatform-user": ">=1,<1.0.1", + "ezsystems/ezpublish-kernel": "<6.13.8.2-dev|>=7,<7.5.31", + "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.03.5.1", + "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", + "ezsystems/repository-forms": ">=2.3,<2.3.2.1-dev|>=2.5,<2.5.15", + "ezyang/htmlpurifier": "<4.1.1", + "facade/ignition": "<1.16.15|>=2,<2.4.2|>=2.5,<2.5.2", + "facturascripts/facturascripts": "<=2022.08", + "feehi/cms": "<=2.1.1", + "feehi/feehicms": "<=2.1.1", + "fenom/fenom": "<=2.12.1", + "filegator/filegator": "<7.8", + "firebase/php-jwt": "<6", + "fixpunkt/fp-masterquiz": "<2.2.1|>=3,<3.5.2", + "fixpunkt/fp-newsletter": "<1.1.1|>=2,<2.1.2|>=2.2,<3.2.6", + "flarum/core": "<1.8", + "flarum/framework": "<1.8", + "flarum/mentions": "<1.6.3", + "flarum/sticky": ">=0.1.0.0-beta14,<=0.1.0.0-beta15", + "flarum/tags": "<=0.1.0.0-beta13", + "floriangaerber/magnesium": "<0.3.1", + "fluidtypo3/vhs": "<5.1.1", + "fof/byobu": ">=0.3.0.0-beta2,<1.1.7", + "fof/upload": "<1.2.3", + "foodcoopshop/foodcoopshop": ">=3.2,<3.6.1", + "fooman/tcpdf": "<6.2.22", + "forkcms/forkcms": "<5.11.1", + "fossar/tcpdf-parser": "<6.2.22", + "francoisjacquet/rosariosis": "<11", + "frappant/frp-form-answers": "<3.1.2|>=4,<4.0.2", + "friendsofsymfony/oauth2-php": "<1.3", + "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", + "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", + "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", + "friendsoftypo3/openid": ">=4.5,<4.5.31|>=4.7,<4.7.16|>=6,<6.0.11|>=6.1,<6.1.6", + "froala/wysiwyg-editor": "<3.2.7|>=4.0.1,<=4.1.1", + "froxlor/froxlor": "<2.1.0.0-beta1", + "fuel/core": "<1.8.1", + "funadmin/funadmin": "<=3.2|>=3.3.2,<=3.3.3", + "gaoming13/wechat-php-sdk": "<=1.10.2", + "genix/cms": "<=1.1.11", + "getgrav/grav": "<=1.7.42.1", + "getkirby/cms": "<3.5.8.3-dev|>=3.6,<3.6.6.3-dev|>=3.7,<3.7.5.2-dev|>=3.8,<3.8.4.1-dev|>=3.9,<3.9.6", + "getkirby/kirby": "<=2.5.12", + "getkirby/panel": "<2.5.14", + "getkirby/starterkit": "<=3.7.0.2", + "gilacms/gila": "<=1.11.4", + "gleez/cms": "<=1.2|==2", + "globalpayments/php-sdk": "<2", + "gogentooss/samlbase": "<1.2.7", + "google/protobuf": "<3.15", + "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", + "gree/jose": "<2.2.1", + "gregwar/rst": "<1.0.3", + "grumpydictator/firefly-iii": "<6", + "gugoan/economizzer": "<=0.9.0.0-beta1", + "guzzlehttp/guzzle": "<6.5.8|>=7,<7.4.5", + "guzzlehttp/psr7": "<1.9.1|>=2,<2.4.5", + "haffner/jh_captcha": "<=2.1.3|>=3,<=3.0.2", + "harvesthq/chosen": "<1.8.7", + "helloxz/imgurl": "<=2.31", + "hhxsv5/laravel-s": "<3.7.36", + "hillelcoren/invoice-ninja": "<5.3.35", + "himiklab/yii2-jqgrid-widget": "<1.0.8", + "hjue/justwriting": "<=1", + "hov/jobfair": "<1.0.13|>=2,<2.0.2", + "httpsoft/http-message": "<1.0.12", + "hyn/multi-tenant": ">=5.6,<5.7.2", + "ibexa/admin-ui": ">=4.2,<4.2.3", + "ibexa/core": ">=4,<4.0.7|>=4.1,<4.1.4|>=4.2,<4.2.3|>=4.5,<4.5.4", + "ibexa/graphql": ">=2.5,<2.5.31|>=3.3,<3.3.28|>=4.2,<4.2.3", + "ibexa/post-install": "<=1.0.4", + "ibexa/solr": ">=4.5,<4.5.4", + "ibexa/user": ">=4,<4.4.3", + "icecoder/icecoder": "<=8.1", + "idno/known": "<=1.3.1", + "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", + "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", + "illuminate/database": "<6.20.26|>=7,<7.30.5|>=8,<8.40", + "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", + "illuminate/view": "<6.20.42|>=7,<7.30.6|>=8,<8.75", + "impresscms/impresscms": "<=1.4.5", + "in2code/femanager": "<5.5.3|>=6,<6.3.4|>=7,<7.2.2", + "in2code/ipandlanguageredirect": "<5.1.2", + "in2code/lux": "<17.6.1|>=18,<24.0.2", + "innologi/typo3-appointments": "<2.0.6", + "intelliants/subrion": "<4.2.2", + "islandora/islandora": ">=2,<2.4.1", + "ivankristianto/phpwhois": "<=4.3", + "jackalope/jackalope-doctrine-dbal": "<1.7.4", + "james-heinrich/getid3": "<1.9.21", + "james-heinrich/phpthumb": "<1.7.12", + "jasig/phpcas": "<1.3.3", + "jcbrand/converse.js": "<3.3.3", + "joomla/application": "<1.0.13", + "joomla/archive": "<1.1.12|>=2,<2.0.1", + "joomla/filesystem": "<1.6.2|>=2,<2.0.1", + "joomla/filter": "<1.4.4|>=2,<2.0.1", + "joomla/framework": ">=2.5.4,<=3.8.12", + "joomla/input": ">=2,<2.0.2", + "joomla/joomla-cms": ">=2.5,<3.9.12", + "joomla/session": "<1.3.1", + "joyqi/hyper-down": "<=2.4.27", + "jsdecena/laracom": "<2.0.9", + "jsmitty12/phpwhois": "<5.1", + "kazist/phpwhois": "<=4.2.6", + "kelvinmo/simplexrd": "<3.1.1", + "kevinpapst/kimai2": "<1.16.7", + "khodakhah/nodcms": "<=3", + "kimai/kimai": "<=2.1", + "kitodo/presentation": "<3.2.3|>=3.3,<3.3.4", + "klaviyo/magento2-extension": ">=1,<3", + "knplabs/knp-snappy": "<=1.4.2", + "kohana/core": "<3.3.3", + "krayin/laravel-crm": "<1.2.2", + "kreait/firebase-php": ">=3.2,<3.8.1", + "la-haute-societe/tcpdf": "<6.2.22", + "laminas/laminas-diactoros": "<2.18.1|==2.19|==2.20|==2.21|==2.22|==2.23|>=2.24,<2.24.2|>=2.25,<2.25.2", + "laminas/laminas-form": "<2.17.1|>=3,<3.0.2|>=3.1,<3.1.1", + "laminas/laminas-http": "<2.14.2", + "laravel/fortify": "<1.11.1", + "laravel/framework": "<6.20.44|>=7,<7.30.6|>=8,<8.75", + "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "latte/latte": "<2.10.8", + "lavalite/cms": "<=9", + "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5", + "league/commonmark": "<0.18.3", + "league/flysystem": "<1.1.4|>=2,<2.1.1", + "league/oauth2-server": ">=8.3.2,<8.4.2|>=8.5,<8.5.3", + "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", + "librenms/librenms": "<2017.08.18", + "liftkit/database": "<2.13.2", + "limesurvey/limesurvey": "<3.27.19", + "livehelperchat/livehelperchat": "<=3.91", + "livewire/livewire": ">2.2.4,<2.2.6", + "lms/routes": "<2.1.1", + "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", + "luyadev/yii-helpers": "<1.2.1", + "magento/community-edition": "<=2.4", + "magento/magento1ce": "<1.9.4.3-dev", + "magento/magento1ee": ">=1,<1.14.4.3-dev", + "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2.0-patch2", + "maikuolan/phpmussel": ">=1,<1.6", + "mantisbt/mantisbt": "<=2.25.7", + "marcwillmann/turn": "<0.3.3", + "matyhtf/framework": "<3.0.6", + "mautic/core": "<4.3", + "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", + "mediawiki/matomo": "<2.4.3", + "melisplatform/melis-asset-manager": "<5.0.1", + "melisplatform/melis-cms": "<5.0.1", + "melisplatform/melis-front": "<5.0.1", + "mezzio/mezzio-swoole": "<3.7|>=4,<4.3", + "mgallegos/laravel-jqgrid": "<=1.3", + "microweber/microweber": "<2.0.3", + "miniorange/miniorange-saml": "<1.4.3", + "mittwald/typo3_forum": "<1.2.1", + "mobiledetect/mobiledetectlib": "<2.8.32", + "modx/revolution": "<=2.8.3.0-patch", + "mojo42/jirafeau": "<4.4", + "mongodb/mongodb": ">=1,<1.9.2", + "monolog/monolog": ">=1.8,<1.12", + "moodle/moodle": "<4.3.0.0-RC2-dev", + "mos/cimage": "<0.7.19", + "movim/moxl": ">=0.8,<=0.10", + "mpdf/mpdf": "<=7.1.7", + "mustache/mustache": ">=2,<2.14.1", + "namshi/jose": "<2.2", + "neoan3-apps/template": "<1.1.1", + "neorazorx/facturascripts": "<2022.04", + "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "neos/form": ">=1.2,<4.3.3|>=5,<5.0.9|>=5.1,<5.1.3", + "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.9.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<5.3.10|>=7,<7.0.9|>=7.1,<7.1.7|>=7.2,<7.2.6|>=7.3,<7.3.4|>=8,<8.0.2", + "neos/neos-ui": "<=8.3.3", + "neos/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", + "netgen/tagsbundle": ">=3.4,<3.4.11|>=4,<4.0.15", + "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", + "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", + "nilsteampassnet/teampass": "<3.0.10", + "nonfiction/nterchange": "<4.1.1", + "notrinos/notrinos-erp": "<=0.7", + "noumo/easyii": "<=0.9", + "nukeviet/nukeviet": "<4.5.02", + "nyholm/psr7": "<1.6.1", + "nystudio107/craft-seomatic": "<3.4.12", + "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", + "october/backend": "<1.1.2", + "october/cms": "<1.0.469|==1.0.469|==1.0.471|==1.1.1", + "october/october": "<=3.4.4", + "october/rain": "<1.0.472|>=1.1,<1.1.2", + "october/system": "<1.0.476|>=1.1,<1.1.12|>=2,<2.2.34|>=3,<3.0.66", + "omeka/omeka-s": "<4.0.3", + "onelogin/php-saml": "<2.10.4", + "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", + "open-web-analytics/open-web-analytics": "<1.7.4", + "opencart/opencart": "<=3.0.3.7|>=4,<4.0.2.3-dev", + "openid/php-openid": "<2.3", + "openmage/magento-lts": "<=19.5|>=20,<=20.1", + "opensource-workshop/connect-cms": "<1.7.2|>=2,<2.3.2", + "orchid/platform": ">=9,<9.4.4|>=14.0.0.0-alpha4,<14.5", + "oro/commerce": ">=4.1,<5.0.11|>=5.1,<5.1.1", + "oro/crm": ">=1.7,<1.7.4|>=3.1,<4.1.17|>=4.2,<4.2.7", + "oro/platform": ">=1.7,<1.7.4|>=3.1,<3.1.29|>=4.1,<4.1.17|>=4.2,<4.2.8", + "oxid-esales/oxideshop-ce": "<4.5", + "packbackbooks/lti-1-3-php-library": "<5", + "padraic/humbug_get_contents": "<1.1.2", + "pagarme/pagarme-php": "<3", + "pagekit/pagekit": "<=1.0.18", + "paragonie/random_compat": "<2", + "passbolt/passbolt_api": "<2.11", + "paypal/merchant-sdk-php": "<3.12", + "pear/archive_tar": "<1.4.14", + "pear/crypt_gpg": "<1.6.7", + "pear/pear": "<=1.10.1", + "pegasus/google-for-jobs": "<1.5.1|>=2,<2.1.1", + "personnummer/personnummer": "<3.0.2", + "phanan/koel": "<5.1.4", + "php-mod/curl": "<2.3.2", + "phpbb/phpbb": "<3.2.10|>=3.3,<3.3.1", + "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", + "phpmailer/phpmailer": "<6.5", + "phpmussel/phpmussel": ">=1,<1.6", + "phpmyadmin/phpmyadmin": "<5.2.1", + "phpmyfaq/phpmyfaq": "<=3.1.7", + "phpoffice/phpexcel": "<1.8", + "phpoffice/phpspreadsheet": "<1.16", + "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.19", + "phpservermon/phpservermon": "<3.6", + "phpsysinfo/phpsysinfo": "<3.2.5", + "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5,<5.6.3", + "phpwhois/phpwhois": "<=4.2.5", + "phpxmlrpc/extras": "<0.6.1", + "phpxmlrpc/phpxmlrpc": "<4.9.2", + "pi/pi": "<=2.5", + "pimcore/admin-ui-classic-bundle": "<1.2", + "pimcore/customer-management-framework-bundle": "<3.4.2", + "pimcore/data-hub": "<1.2.4", + "pimcore/demo": "<10.3", + "pimcore/perspective-editor": "<1.5.1", + "pimcore/pimcore": "<11.1", + "pixelfed/pixelfed": "<=0.11.4", + "pocketmine/bedrock-protocol": "<8.0.2", + "pocketmine/pocketmine-mp": "<=4.23|>=5,<5.3.1", + "pressbooks/pressbooks": "<5.18", + "prestashop/autoupgrade": ">=4,<4.10.1", + "prestashop/blockreassurance": "<=5.1.3", + "prestashop/blockwishlist": ">=2,<2.1.1", + "prestashop/contactform": ">=1.0.1,<4.3", + "prestashop/gamification": "<2.3.2", + "prestashop/prestashop": "<8.1.2", + "prestashop/productcomments": "<5.0.2", + "prestashop/ps_emailsubscription": "<2.6.1", + "prestashop/ps_facetedsearch": "<3.4.1", + "prestashop/ps_linklist": "<3.1", + "privatebin/privatebin": "<1.4", + "processwire/processwire": "<=3.0.200", + "propel/propel": ">=2.0.0.0-alpha1,<=2.0.0.0-alpha7", + "propel/propel1": ">=1,<=1.7.1", + "pterodactyl/panel": "<1.7", + "ptheofan/yii2-statemachine": ">=2.0.0.0-RC1-dev,<=2", + "ptrofimov/beanstalk_console": "<1.7.14", + "pusher/pusher-php-server": "<2.2.1", + "pwweb/laravel-core": "<=0.3.6.0-beta", + "pyrocms/pyrocms": "<=3.9.1", + "rainlab/blog-plugin": "<1.4.1", + "rainlab/debugbar-plugin": "<3.1", + "rainlab/user-plugin": "<=1.4.5", + "rankmath/seo-by-rank-math": "<=1.0.95", + "rap2hpoutre/laravel-log-viewer": "<0.13", + "react/http": ">=0.7,<1.9", + "really-simple-plugins/complianz-gdpr": "<6.4.2", + "remdex/livehelperchat": "<3.99", + "reportico-web/reportico": "<=7.1.21", + "rmccue/requests": ">=1.6,<1.8", + "robrichards/xmlseclibs": "<3.0.4", + "roots/soil": "<4.1", + "rudloff/alltube": "<3.0.3", + "s-cart/core": "<6.9", + "s-cart/s-cart": "<6.9", + "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", + "sabre/dav": "<1.7.11|>=1.8,<1.8.9", + "scheb/two-factor-bundle": "<3.26|>=4,<4.11", + "sensiolabs/connect": "<4.2.3", + "serluck/phpwhois": "<=4.2.6", + "sfroemken/url_redirect": "<=1.2.1", + "sheng/yiicms": "<=1.2", + "shopware/core": "<=6.4.20", + "shopware/platform": "<=6.4.20", + "shopware/production": "<=6.3.5.2", + "shopware/shopware": "<=5.7.17", + "shopware/storefront": "<=6.4.8.1", + "shopxo/shopxo": "<2.2.6", + "showdoc/showdoc": "<2.10.4", + "silverstripe-australia/advancedreports": ">=1,<=2", + "silverstripe/admin": "<1.13.6", + "silverstripe/assets": ">=1,<1.11.1", + "silverstripe/cms": "<4.11.3", + "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", + "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", + "silverstripe/framework": "<4.13.14|>=5,<5.0.13", + "silverstripe/graphql": "<3.8.2|>=4,<4.1.3|>=4.2,<4.2.5|>=4.3,<4.3.4|>=5,<5.0.3", + "silverstripe/hybridsessions": ">=1,<2.4.1|>=2.5,<2.5.1", + "silverstripe/recipe-cms": ">=4.5,<4.5.3", + "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", + "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", + "silverstripe/silverstripe-omnipay": "<2.5.2|>=3,<3.0.2|>=3.1,<3.1.4|>=3.2,<3.2.1", + "silverstripe/subsites": ">=2,<2.6.1", + "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", + "silverstripe/userforms": "<3", + "silverstripe/versioned-admin": ">=1,<1.11.1", + "simple-updates/phpwhois": "<=1", + "simplesamlphp/saml2": "<1.15.4|>=2,<2.3.8|>=3,<3.1.4", + "simplesamlphp/simplesamlphp": "<1.18.6", + "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "simplesamlphp/simplesamlphp-module-openid": "<1", + "simplesamlphp/simplesamlphp-module-openidprovider": "<0.9", + "simplito/elliptic-php": "<1.0.6", + "sitegeist/fluid-components": "<3.5", + "sjbr/sr-freecap": "<2.4.6|>=2.5,<2.5.3", + "slim/psr7": "<1.4.1|>=1.5,<1.5.1|>=1.6,<1.6.1", + "slim/slim": "<2.6", + "slub/slub-events": "<3.0.3", + "smarty/smarty": "<3.1.48|>=4,<4.3.1", + "snipe/snipe-it": "<=6.2.2", + "socalnick/scn-social-auth": "<1.15.2", + "socialiteproviders/steam": "<1.1", + "spatie/browsershot": "<3.57.4", + "spipu/html2pdf": "<5.2.8", + "spoon/library": "<1.4.1", + "spoonity/tcpdf": "<6.2.22", + "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", + "ssddanbrown/bookstack": "<22.02.3", + "statamic/cms": "<4.33", + "stormpath/sdk": "<9.9.99", + "studio-42/elfinder": "<2.1.62", + "subhh/libconnect": "<7.0.8|>=8,<8.1", + "sukohi/surpass": "<1", + "sulu/sulu": "<1.6.44|>=2,<2.2.18|>=2.3,<2.3.8|==2.4.0.0-RC1|>=2.5,<2.5.10", + "sumocoders/framework-user-bundle": "<1.4", + "swag/paypal": "<5.4.4", + "swiftmailer/swiftmailer": ">=4,<5.4.5", + "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", + "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/grid-bundle": "<1.10.1", + "sylius/paypal-plugin": ">=1,<1.2.4|>=1.3,<1.3.1", + "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", + "sylius/sylius": "<1.9.10|>=1.10,<1.10.11|>=1.11,<1.11.2", + "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", + "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", + "symbiote/silverstripe-seed": "<6.0.3", + "symbiote/silverstripe-versionedfiles": "<=2.0.3", + "symfont/process": ">=0", + "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", + "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=5.3.14,<=5.3.14|>=5.4.3,<=5.4.3|>=6.0.3,<=6.0.3", + "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/http-kernel": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", + "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1", + "symfony/mime": ">=4.3,<4.3.8", + "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/polyfill": ">=1,<1.10", + "symfony/polyfill-php55": ">=1,<1.10", + "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/routing": ">=2,<2.0.19", + "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8", + "symfony/security-bundle": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", + "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7|>=5.1,<5.2.8|>=5.3,<5.3.2|>=5.4,<5.4.31|>=6,<6.3.8", + "symfony/serializer": ">=2,<2.0.11|>=4.1,<4.4.35|>=5,<5.3.12", + "symfony/symfony": "<4.4.51|>=5,<5.4.31|>=6,<6.3.8", + "symfony/translation": ">=2,<2.0.17", + "symfony/twig-bridge": ">=2,<4.4.51|>=5,<5.4.31|>=6,<6.3.8", + "symfony/ux-autocomplete": "<2.11.2", + "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", + "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", + "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", + "symfony/webhook": ">=6.3,<6.3.8", + "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "t3/dce": "<0.11.5|>=2.2,<2.6.2", + "t3g/svg-sanitizer": "<1.0.3", + "tastyigniter/tastyigniter": "<3.3", + "tcg/voyager": "<=1.4", + "tecnickcom/tcpdf": "<6.2.22", + "terminal42/contao-tablelookupwizard": "<3.3.5", + "thelia/backoffice-default-template": ">=2.1,<2.1.2", + "thelia/thelia": ">=2.1,<2.1.3", + "theonedemon/phpwhois": "<=4.2.5", + "thinkcmf/thinkcmf": "<=5.1.7", + "thorsten/phpmyfaq": "<3.2.2", + "tikiwiki/tiki-manager": "<=17.1", + "tinymce/tinymce": "<5.10.8|>=6,<6.7.1", + "tinymighty/wiki-seo": "<1.2.2", + "titon/framework": "<9.9.99", + "tobiasbg/tablepress": "<=2.0.0.0-RC1", + "topthink/framework": "<6.0.14", + "topthink/think": "<=6.1.1", + "topthink/thinkphp": "<=3.2.3", + "tpwd/ke_search": "<4.0.3|>=4.1,<4.6.6|>=5,<5.0.2", + "tribalsystems/zenario": "<=9.4.59197", + "truckersmp/phpwhois": "<=4.3.1", + "ttskch/pagination-service-provider": "<1", + "twig/twig": "<1.44.7|>=2,<2.15.3|>=3,<3.4.3", + "typo3/cms": "<9.5.29|>=10,<10.4.35|>=11,<11.5.23|>=12,<12.2", + "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/cms-core": "<8.7.51|>=9,<9.5.42|>=10,<10.4.39|>=11,<11.5.30|>=12,<12.4.4", + "typo3/cms-extbase": "<6.2.24|>=7,<7.6.8|==8.1.1", + "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/cms-rte-ckeditor": ">=9.5,<9.5.42|>=10,<10.4.39|>=11,<11.5.30", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "typo3/html-sanitizer": ">=1,<1.5.1|>=2,<2.1.2", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", + "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", + "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", + "ua-parser/uap-php": "<3.8", + "uasoft-indonesia/badaso": "<=2.9.7", + "unisharp/laravel-filemanager": "<=2.5.1", + "userfrosting/userfrosting": ">=0.3.1,<4.6.3", + "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", + "uvdesk/community-skeleton": "<=1.1.1", + "vanilla/safecurl": "<0.9.2", + "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", + "vova07/yii2-fileapi-widget": "<0.1.9", + "vrana/adminer": "<4.8.1", + "waldhacker/hcaptcha": "<2.1.2", + "wallabag/tcpdf": "<6.2.22", + "wallabag/wallabag": "<2.6.7", + "wanglelecc/laracms": "<=1.0.3", + "web-auth/webauthn-framework": ">=3.3,<3.3.4", + "webbuilders-group/silverstripe-kapost-bridge": "<0.4", + "webcoast/deferred-image-processing": "<1.0.2", + "webklex/laravel-imap": "<5.3", + "webklex/php-imap": "<5.3", + "webpa/webpa": "<3.1.2", + "wikibase/wikibase": "<=1.39.3", + "wikimedia/parsoid": "<0.12.2", + "willdurand/js-translation-bundle": "<2.1.1", + "wintercms/winter": "<1.2.3", + "woocommerce/woocommerce": "<6.6", + "wp-cli/wp-cli": "<2.5", + "wp-graphql/wp-graphql": "<=1.14.5", + "wpanel/wpanel4-cms": "<=4.3.1", + "wpcloud/wp-stateless": "<3.2", + "wwbn/avideo": "<=12.4", + "xataface/xataface": "<3", + "xpressengine/xpressengine": "<3.0.15", + "yeswiki/yeswiki": "<4.1", + "yetiforce/yetiforce-crm": "<=6.4", + "yidashi/yii2cmf": "<=2", + "yii2mod/yii2-cms": "<1.9.2", + "yiisoft/yii": "<1.1.27", + "yiisoft/yii2": "<2.0.38", + "yiisoft/yii2-bootstrap": "<2.0.4", + "yiisoft/yii2-dev": "<2.0.43", + "yiisoft/yii2-elasticsearch": "<2.0.5", + "yiisoft/yii2-gii": "<=2.2.4", + "yiisoft/yii2-jui": "<2.0.4", + "yiisoft/yii2-redis": "<2.0.8", + "yikesinc/yikes-inc-easy-mailchimp-extender": "<6.8.6", + "yoast-seo-for-typo3/yoast_seo": "<7.2.3", + "yourls/yourls": "<=1.8.2", + "zencart/zencart": "<=1.5.7.0-beta", + "zendesk/zendesk_api_client_php": "<2.2.11", + "zendframework/zend-cache": "<2.4.8|>=2.5,<2.5.3", + "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", + "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", + "zendframework/zend-diactoros": "<1.8.4", + "zendframework/zend-feed": "<2.10.3", + "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-http": "<2.8.1", + "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", + "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", + "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", + "zendframework/zend-validator": ">=2.3,<2.3.6", + "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zendframework": "<=3", + "zendframework/zendframework1": "<1.12.20", + "zendframework/zendopenid": "<2.0.2", + "zendframework/zendrest": "<2.0.2", + "zendframework/zendservice-amazon": "<2.0.3", + "zendframework/zendservice-api": "<1", + "zendframework/zendservice-audioscrobbler": "<2.0.2", + "zendframework/zendservice-nirvanix": "<2.0.2", + "zendframework/zendservice-slideshare": "<2.0.2", + "zendframework/zendservice-technorati": "<2.0.2", + "zendframework/zendservice-windowsazure": "<2.0.2", + "zendframework/zendxml": "<1.0.1", + "zenstruck/collection": "<0.2.1", + "zetacomponents/mail": "<1.8.2", + "zf-commons/zfc-user": "<1.2.2", + "zfcampus/zf-apigility-doctrine": "<1.0.3", + "zfr/zfr-oauth2-server-module": "<0.1.2", + "zoujingli/thinkadmin": "<6.0.22" + }, + "default-branch": true, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "role": "maintainer" + }, + { + "name": "Ilya Tribusean", + "email": "slash3b@gmail.com", + "role": "maintainer" + } + ], + "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", + "keywords": [ + "dev" + ], + "support": { + "issues": "https://github.com/Roave/SecurityAdvisories/issues", + "source": "https://github.com/Roave/SecurityAdvisories/tree/latest" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories", + "type": "tidelift" + } + ], + "time": "2023-11-12T16:04:17+00:00" + }, { "name": "squizlabs/php_codesniffer", "version": "3.7.2", @@ -1824,16 +2631,16 @@ }, { "name": "wp-cli/php-cli-tools", - "version": "v0.11.20", + "version": "v0.11.21", "source": { "type": "git", "url": "https://github.com/wp-cli/php-cli-tools.git", - "reference": "d788a2c79e02f2f735fbb2b9a53db94d0e1bca4f" + "reference": "b3457a8d60cd0b1c48cab76ad95df136d266f0b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/d788a2c79e02f2f735fbb2b9a53db94d0e1bca4f", - "reference": "d788a2c79e02f2f735fbb2b9a53db94d0e1bca4f", + "url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/b3457a8d60cd0b1c48cab76ad95df136d266f0b6", + "reference": "b3457a8d60cd0b1c48cab76ad95df136d266f0b6", "shasum": "" }, "require": { @@ -1881,22 +2688,22 @@ ], "support": { "issues": "https://github.com/wp-cli/php-cli-tools/issues", - "source": "https://github.com/wp-cli/php-cli-tools/tree/v0.11.20" + "source": "https://github.com/wp-cli/php-cli-tools/tree/v0.11.21" }, - "time": "2023-09-01T12:21:35+00:00" + "time": "2023-09-29T15:28:10+00:00" }, { "name": "wp-cli/wp-cli", - "version": "v2.8.1", + "version": "v2.9.0", "source": { "type": "git", "url": "https://github.com/wp-cli/wp-cli.git", - "reference": "5dd2340b9a01c3cfdbaf5e93a140759fdd190eee" + "reference": "8a3befba2d947fbf5cc6d1941edf2dd99da4d4b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/5dd2340b9a01c3cfdbaf5e93a140759fdd190eee", - "reference": "5dd2340b9a01c3cfdbaf5e93a140759fdd190eee", + "url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/8a3befba2d947fbf5cc6d1941edf2dd99da4d4b7", + "reference": "8a3befba2d947fbf5cc6d1941edf2dd99da4d4b7", "shasum": "" }, "require": { @@ -1913,7 +2720,7 @@ "wp-cli/entity-command": "^1.2 || ^2", "wp-cli/extension-command": "^1.1 || ^2", "wp-cli/package-command": "^1 || ^2", - "wp-cli/wp-cli-tests": "^3.1.6" + "wp-cli/wp-cli-tests": "^4.0.1" }, "suggest": { "ext-readline": "Include for a better --prompt implementation", @@ -1953,7 +2760,7 @@ "issues": "https://github.com/wp-cli/wp-cli/issues", "source": "https://github.com/wp-cli/wp-cli" }, - "time": "2023-06-05T06:55:55+00:00" + "time": "2023-10-25T09:06:37+00:00" }, { "name": "wp-coding-standards/wpcs", @@ -2079,7 +2886,9 @@ } ], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "roave/security-advisories": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": [], @@ -2087,5 +2896,5 @@ "platform-overrides": { "php": "7.0.0" }, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.3.0" } diff --git a/cypress.config.js b/cypress.config.js index 5ebf156..161cf44 100644 --- a/cypress.config.js +++ b/cypress.config.js @@ -43,7 +43,6 @@ module.exports = defineConfig({ testIsolation: false, excludeSpecPattern: [ 'vendor/newfold-labs/wp-module-coming-soon/tests/cypress/integration/', // until ecommerce module is added use the local coming soon test instead - 'vendor/newfold-labs/wp-module-marketplace/tests/cypress/integration/', // until ui is updated use local marketplace tests instead ], }, retries: 1, diff --git a/inc/Admin.php b/inc/Admin.php index a3bd032..dafa19e 100644 --- a/inc/Admin.php +++ b/inc/Admin.php @@ -24,12 +24,22 @@ public function __construct() { \add_filter( 'plugin_action_links_wp-plugin-web/wp-plugin-web.php', array( __CLASS__, 'actions' ) ); /* Add inline style to hide subnav link */ \add_action( 'admin_head', array( __CLASS__, 'admin_nav_style' ) ); + /* Add runtime for data store */ + \add_filter('newfold_runtime', array( __CLASS__, 'add_to_runtime' ) ); - if ( isset( $_GET['page'] ) && strpos( filter_input( INPUT_GET, 'page', FILTER_SANITIZE_STRING ), 'web' ) >= 0 ) { // phpcs:ignore + if ( isset( $_GET['page'] ) && strpos( filter_input( INPUT_GET, 'page', FILTER_UNSAFE_RAW ), 'web' ) >= 0 ) { // phpcs:ignore \add_action( 'admin_footer_text', array( __CLASS__, 'add_brand_to_admin_footer' ) ); } } + /** + * Add to runtime + */ + public static function add_to_runtime( $sdk ) { + include WEB_PLUGIN_DIR . '/inc/Data.php'; + return array_merge( $sdk, Data::runtime() ); + } + /** * Subpages to register with add_submenu_page(). * @@ -135,18 +145,11 @@ public static function assets() { \wp_register_script( 'web-script', WEB_BUILD_URL . '/index.js', - array_merge( $asset['dependencies'] ), + array_merge( $asset['dependencies'], ['nfd-runtime'] ), $asset['version'], true ); - include WEB_PLUGIN_DIR . '/inc/Data.php'; - \wp_add_inline_script( - 'web-script', - 'var WPPW =' . \wp_json_encode( Data::runtime() ) . ';', - 'before' - ); - \wp_register_style( 'web-style', WEB_BUILD_URL . '/index.css', diff --git a/inc/Data.php b/inc/Data.php index f77bf5c..e4364c5 100644 --- a/inc/Data.php +++ b/inc/Data.php @@ -14,20 +14,18 @@ final class Data { /** - * Data loaded onto window.WPPW + * Data loaded onto window.NewfoldRuntime * * @return array */ public static function runtime() { - global $wp_version; + global $web_module_container; $runtime = array( - 'url' => WEB_BUILD_URL, - 'version' => WEB_PLUGIN_VERSION, - 'resturl' => \get_home_url() . '/index.php?rest_route=', - 'wpversion' => $wp_version, - 'admin' => \admin_url(), - 'assets' => WEB_PLUGIN_URL . 'assets/', + 'url' => WEB_BUILD_URL, + 'version' => WEB_PLUGIN_VERSION, + 'assets' => WEB_PLUGIN_URL . 'assets/', + 'brand' => $web_module_container->plugin()->brand, ); return $runtime; diff --git a/inc/RestApi/SettingsController.php b/inc/RestApi/SettingsController.php index 6559e71..7bfed8f 100644 --- a/inc/RestApi/SettingsController.php +++ b/inc/RestApi/SettingsController.php @@ -170,6 +170,7 @@ public function get_current_settings() { $settings = array( 'comingSoon' => ( 'true' === get_option( 'nfd_coming_soon', 'false' ) ), + 'autoUpdatesAll' => $major && $plugins && $themes, 'autoUpdatesMajorCore' => $major, 'autoUpdatesMinorCore' => $minor, 'autoUpdatesPlugins' => $plugins, diff --git a/package-lock.json b/package-lock.json index 25463e2..2d9e7dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,22 @@ { "name": "wp-plugin-web", - "version": "1.3.0", + "version": "2.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "wp-plugin-web", - "version": "1.3.0", + "version": "2.0.0", "license": "GPL-2.0-or-later", "dependencies": { + "@heroicons/react": "^2.0.18", + "@newfold-labs/wp-module-runtime": "^1.0.7", + "@newfold/ui-component-library": "^1.0.0", "@wordpress/compose": "^6.22.0", - "@wordpress/dom-ready": "^3.44.0", + "@wordpress/dom-ready": "^3.45.0", "@wordpress/element": "^5.21.0", - "@wordpress/i18n": "^4.42.0", - "@wordpress/icons": "^9.35.0", + "@wordpress/i18n": "^4.45.0", + "@wordpress/icons": "^9.36.0", "classnames": "^2.3.2", "jquery": "^3.7.1", "lodash": "^4.17.21", @@ -23,16 +26,20 @@ "react-use": "^17.4.0" }, "devDependencies": { - "@replayio/cypress": "^1.6.1", + "@replayio/cypress": "^1.7.0", + "@tailwindcss/forms": "^0.5.7", "@testing-library/cypress": "^10.0.1", - "@wordpress/env": "^8.10.0", + "@wordpress/env": "^8.11.0", "@wordpress/scripts": "^26.16.0", + "axe-core": "^4.8.2", "cypress": "^13.5.0", - "cypress-axe": "^1.5.0" + "cypress-axe": "^1.5.0", + "tailwindcss": "^3.3.3", + "yaml-lint": "^1.7.0" }, "engines": { "node": ">=16", - "npm": ">=7" + "npm": ">=8" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -44,6 +51,18 @@ "node": ">=0.10.0" } }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -178,12 +197,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", - "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", + "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", "dev": true, "dependencies": { - "@babel/types": "^7.21.3", + "@babel/types": "^7.23.3", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -336,13 +355,13 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -578,9 +597,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", - "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", + "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1979,19 +1998,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", - "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", + "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.3", - "@babel/types": "^7.21.3", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.3", + "@babel/types": "^7.23.3", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2023,13 +2042,13 @@ "dev": true }, "node_modules/@babel/types": { - "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", - "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", + "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.19", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2315,6 +2334,29 @@ "@hapi/hoek": "^9.0.0" } }, + "node_modules/@headlessui/react": { + "version": "1.7.17", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.17.tgz", + "integrity": "sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow==", + "dependencies": { + "client-only": "^0.0.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18" + } + }, + "node_modules/@heroicons/react": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.0.18.tgz", + "integrity": "sha512-7TyMjRrZZMBPa+/5Y8lN0iyvUU/01PeMGX2+RE7cQWpEUIcb4QotzUObFkJDejj/HUH4qjP/eQ0gzzKs2f+6Yw==", + "peerDependencies": { + "react": ">= 16" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.13", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", @@ -2883,6 +2925,74 @@ "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", "dev": true }, + "node_modules/@newfold-labs/wp-module-runtime": { + "version": "1.0.7", + "resolved": "https://npm.pkg.github.com/download/@newfold-labs/wp-module-runtime/1.0.7/9eec9b9c5c07f984c67ae6fbfd9982f60168390d", + "integrity": "sha512-jGVnwAe6TkUXKINCIB7Bw8HUyROzZw4FDkBHlHpq9j0GZgSaIFVIpAPDRkk9YLVGt+58Fv1om7nLhgKPr71ydw==", + "license": "GPL-2.0-or-later", + "dependencies": { + "@wordpress/url": "3.36.0" + } + }, + "node_modules/@newfold-labs/wp-module-runtime/node_modules/@wordpress/url": { + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-3.36.0.tgz", + "integrity": "sha512-PS/xGlePuTZzht6l9DHvz59lHOE1oPPYOOQj7GbQ+R0uoaaeBDBPsFZSA38jaM2fiu+qGzbOFN7JQZrJma10VQ==", + "dependencies": { + "@babel/runtime": "^7.16.0", + "remove-accents": "^0.4.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@newfold-labs/wp-module-runtime/node_modules/remove-accents": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.4.tgz", + "integrity": "sha512-EpFcOa/ISetVHEXqu+VwI96KZBmq+a8LJnGkaeFw45epGlxIZz5dhEEnNZMsQXgORu3qaMoLX4qJCzOik6ytAg==" + }, + "node_modules/@newfold/ui-component-library": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@newfold/ui-component-library/-/ui-component-library-1.0.0.tgz", + "integrity": "sha512-zEP2oe+WHu1VJ4B34tKb+8cOdSIefSZ5sappZHLJtA3DM+LhP4NHoVvLt34YYNdm9Zq1mL/M5PH9uqCbMQZFOg==", + "dependencies": { + "@headlessui/react": "^1.7.8", + "@heroicons/react": "^1.0.6", + "@reduxjs/toolkit": "^1.8.3", + "classnames": "^2.3.2", + "lodash": "^4.17.21", + "postcss-import": "^15.1.0", + "prop-types": "^15.8.1", + "react-animate-height": "^3.1.0", + "react-error-boundary": "^3.1.4" + }, + "peerDependencies": { + "@wordpress/element": "^4.1.1" + } + }, + "node_modules/@newfold/ui-component-library/node_modules/@heroicons/react": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-1.0.6.tgz", + "integrity": "sha512-JJCXydOFWMDpCP4q13iEplA503MQO3xLoZiKum+955ZCtHINWnx26CUxVxxFQu/uLb4LW3ge15ZpzIkXKkJ8oQ==", + "peerDependencies": { + "react": ">= 16" + } + }, + "node_modules/@newfold/ui-component-library/node_modules/react-error-boundary": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz", + "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "react": ">=16.13.1" + } + }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", @@ -3027,22 +3137,6 @@ "node": ">= 8" } }, - "node_modules/@playwright/test": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.39.0.tgz", - "integrity": "sha512-3u1iFqgzl7zr004bGPYiN/5EZpRUSFddQBra8Rqll5N0/vfpqlP9I9EXqAoGacuAbX6c9Ulg/Cjqglp5VkK6UQ==", - "dev": true, - "peer": true, - "dependencies": { - "playwright": "1.39.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.11", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", @@ -3220,6 +3314,29 @@ "streamx": "^2.15.0" } }, + "node_modules/@reduxjs/toolkit": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", + "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", + "dependencies": { + "immer": "^9.0.21", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.8" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.0.2" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, "node_modules/@remix-run/router": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.11.0.tgz", @@ -3229,14 +3346,14 @@ } }, "node_modules/@replayio/cypress": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@replayio/cypress/-/cypress-1.6.1.tgz", - "integrity": "sha512-rMfYzEVQGRiMFSCWdoQryzOV6LyMfDKvHgRggQDDdaNn1Dapmy8KeYISHR00h139RYvQT6H4a/0xCHyGvRx+Tg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@replayio/cypress/-/cypress-1.7.0.tgz", + "integrity": "sha512-gRgm7RIE9KY+8QZlNQGE1fwvko3yaC39WghxDdxWescHkk3JgHwfPOgKxFuaz7n3kOmas3vddgWGIvLJ3MjteQ==", "dev": true, "hasInstallScript": true, "dependencies": { - "@replayio/replay": "^0.17.5", - "@replayio/test-utils": "^1.2.2", + "@replayio/replay": "^0.18.0", + "@replayio/test-utils": "^1.3.0", "chalk": "^4.1.2", "debug": "^4.3.4", "semver": "^7.5.2", @@ -3312,9 +3429,9 @@ } }, "node_modules/@replayio/replay": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/@replayio/replay/-/replay-0.17.5.tgz", - "integrity": "sha512-FZO9UhvGwvGdtjVtUnhGYWsO9sSHdRrwFTvraMBiR9AKRh8Npp5sF/AsAEFtQi1+T2S4VU2qH6TRXCNy44yMSg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@replayio/replay/-/replay-0.18.0.tgz", + "integrity": "sha512-+CW0llMvrhFSjqr9oUPgT/IwpIniJepq/jzZSxcRa9dOqyA+KOGjkGBZO5klmb9gEpldm+FVtDi2cDkZYPACfA==", "dev": true, "dependencies": { "@replayio/sourcemap-upload": "^1.1.1", @@ -3470,12 +3587,12 @@ "dev": true }, "node_modules/@replayio/test-utils": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@replayio/test-utils/-/test-utils-1.2.2.tgz", - "integrity": "sha512-ArMtHrLTMWje+zidMIf1uPH7ek1rctc43DW4lGjU2pHMdWNpsJEUH4QaW/OosAb6zSIEclNS577EBFc9lyPslg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@replayio/test-utils/-/test-utils-1.3.0.tgz", + "integrity": "sha512-8dysGaow3trBQ4sEEzqDJtuxHmVw7bEjRWzJMWZnK9IB+TR1DHjbyvxvXk5keXopdsyKLRutQFuGbRLwltZJGg==", "dev": true, "dependencies": { - "@replayio/replay": "^0.17.5", + "@replayio/replay": "^0.18.0", "debug": "^4.3.4", "node-fetch": "^2.6.7", "uuid": "^8.3.2" @@ -4045,6 +4162,18 @@ "node": ">=10" } }, + "node_modules/@tailwindcss/forms": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.7.tgz", + "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==", + "dev": true, + "dependencies": { + "mini-svg-data-uri": "^1.2.3" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" + } + }, "node_modules/@tannin/compile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@tannin/compile/-/compile-1.1.0.tgz", @@ -5340,9 +5469,9 @@ } }, "node_modules/@wordpress/dom-ready": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-3.44.0.tgz", - "integrity": "sha512-i4IUNJZgKiULv2y3q7lKuPLwDxpHjhwpnmmHHDlgj9V4LNAf/Iiq5biuQsCYU47oAGg2dR0XJxHXwqFfgRCOlA==", + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-3.45.0.tgz", + "integrity": "sha512-4e6b+YhOMy+Fe9gNs/8bpS+KzRl952y1UEm8WwWmfkcrxPGB2T1czKe0z0Hf3SZQV/ZPGd7+KwvAy6rdlJTVFQ==", "dependencies": { "@babel/runtime": "^7.16.0" }, @@ -5399,9 +5528,9 @@ } }, "node_modules/@wordpress/env": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/@wordpress/env/-/env-8.10.0.tgz", - "integrity": "sha512-VkzLjWGiiELm1wxCt+349u4KZ4H2zpGjW9oN94vmy3UwsaN9xBPnYJscditklSU7lN+kUOgBP83e6MdDV0U8nA==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/env/-/env-8.11.0.tgz", + "integrity": "sha512-9zE7HJNW1UenqfME/ao2+1kNrtFbj+jpAipgHwDOnJ+Xkg37mzQ3cb75QQzT/zM7WJ1r1ET4J2b7zbwOImTvAw==", "dev": true, "dependencies": { "chalk": "^4.0.0", @@ -5533,13 +5662,13 @@ } }, "node_modules/@wordpress/icons": { - "version": "9.35.0", - "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-9.35.0.tgz", - "integrity": "sha512-Lm7B/2YlBUHjIQIGMbptdpB3is4+EYktITrNmZi4rZ7mveSVon32NzMsVb23nLx0iKyghLfJ4C4t+K2+wLFGJA==", + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-9.36.0.tgz", + "integrity": "sha512-QkJRDNgSJzfU3OCVr5X9P3Au3MIag2yT4dzM3Ej6VfrF0SPfFgMwroXKSdNEHmCCG7AwtzGOjaqjpQ3y9vRMkA==", "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/element": "^5.21.0", - "@wordpress/primitives": "^3.42.0" + "@wordpress/element": "^5.22.0", + "@wordpress/primitives": "^3.43.0" }, "engines": { "node": ">=12" @@ -5643,12 +5772,12 @@ } }, "node_modules/@wordpress/primitives": { - "version": "3.42.0", - "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-3.42.0.tgz", - "integrity": "sha512-xK2nCDmJMNwzOV52YVTc4Atd48LFKfixMbO4NFdh990qSjBjMyJNykSXcnidOtmcrpXnqWNRIZomWJkqPvaPkQ==", + "version": "3.43.0", + "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-3.43.0.tgz", + "integrity": "sha512-o6HwUM8XQmwJeCTfaaTpXhiiofymfKec34fSpACQbZNLA9ud2t5p1aWTRArnkm3cYOJAHVtiiFEJywTnnyOoPg==", "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/element": "^5.21.0", + "@wordpress/element": "^5.22.0", "classnames": "^2.3.1" }, "engines": { @@ -6079,6 +6208,12 @@ "node": ">=4" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, "node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -6121,6 +6256,12 @@ "node": ">=14" } }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -6353,6 +6494,12 @@ "node": ">=8" } }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, "node_modules/asynciterator.prototype": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", @@ -6442,11 +6589,10 @@ "dev": true }, "node_modules/axe-core": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.1.tgz", - "integrity": "sha512-9l850jDDPnKq48nbad8SiEelCv4OrUWrKab/cPj0GScVg6cb6NbCCt/Ulk26QEq5jP9NnGr04Bit1BHyV6r5CQ==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz", + "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==", "dev": true, - "peer": true, "engines": { "node": ">=4" } @@ -7080,6 +7226,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/camelcase-keys": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", @@ -7600,6 +7755,11 @@ "node": ">= 10" } }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, "node_modules/clipboard": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.10.tgz", @@ -7869,6 +8029,12 @@ "node": ">=0.8" } }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "dev": true + }, "node_modules/constant-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", @@ -9367,6 +9533,12 @@ "integrity": "sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==", "dev": true }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -9388,6 +9560,12 @@ "node": ">=8" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, "node_modules/dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -11619,7 +11797,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11827,12 +12004,6 @@ "async": "^3.2.0" } }, - "node_modules/getos/node_modules/async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", - "dev": true - }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -12163,7 +12334,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -12539,6 +12709,15 @@ "integrity": "sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==", "dev": true }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/immutable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", @@ -12852,7 +13031,6 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -14120,6 +14298,15 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/joi": { "version": "17.9.0", "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.0.tgz", @@ -15502,6 +15689,15 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "dev": true, + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -15637,6 +15833,17 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/nano-css": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.3.4.tgz", @@ -15680,6 +15887,68 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/nconf": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.1.tgz", + "integrity": "sha512-p2cfF+B3XXacQdswUYWZ0w6Vld0832A/tuqjLBu3H1sfUcby4N2oVbGhyuCkZv+t3iY3aiFEj7gZGqax9Q2c1w==", + "dev": true, + "dependencies": { + "async": "^3.0.0", + "ini": "^2.0.0", + "secure-keys": "^1.0.0", + "yargs": "^16.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/nconf/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/nconf/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/nconf/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nconf/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -16039,7 +16308,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -16050,6 +16318,15 @@ "integrity": "sha1-rwt5f/6+r4pSxmN87b6IFs/sG8g=", "dev": true }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -16687,8 +16964,7 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { "version": "0.1.7", @@ -16847,25 +17123,6 @@ "node": ">=8" } }, - "node_modules/playwright": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.39.0.tgz", - "integrity": "sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==", - "dev": true, - "peer": true, - "dependencies": { - "playwright-core": "1.39.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=16" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, "node_modules/playwright-core": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.32.0.tgz", @@ -16878,19 +17135,6 @@ "node": ">=14" } }, - "node_modules/playwright/node_modules/playwright-core": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.39.0.tgz", - "integrity": "sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==", - "dev": true, - "peer": true, - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/plur": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", @@ -17032,6 +17276,79 @@ "postcss": "^8.2.15" } }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, "node_modules/postcss-loader": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", @@ -17232,6 +17549,25 @@ "postcss": "^8.1.0" } }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, "node_modules/postcss-normalize-charset": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.0.tgz", @@ -17507,8 +17843,7 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/prelude-ls": { "version": "1.2.1", @@ -17626,7 +17961,6 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -17636,8 +17970,7 @@ "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/proxy-addr": { "version": "2.0.7", @@ -18038,6 +18371,18 @@ "node": ">=0.10.0" } }, + "node_modules/react-animate-height": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/react-animate-height/-/react-animate-height-3.2.3.tgz", + "integrity": "sha512-R6DSvr7ud07oeCixScyvXWEMJY/Mt2+GyOWC1KMaRc69gOBw+SsCg4TJmrp4rKUM1hyd6p+YKw90brjPH93Y2A==", + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, "node_modules/react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -18140,6 +18485,22 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -18327,6 +18688,22 @@ "node": ">=8" } }, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "peerDependencies": { + "redux": "^4" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", @@ -18487,6 +18864,11 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, + "node_modules/reselect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" + }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", @@ -18496,7 +18878,6 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -18913,6 +19294,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/secure-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", + "integrity": "sha512-nZi59hW3Sl5P3+wOO89eHBAAGwmCPd2aE1+dLZV5MO+ItQctIvAqihzaAXIQhvtH4KJPxM080HsnqltR2y8cWg==", + "dev": true + }, "node_modules/select": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", @@ -20125,6 +20512,57 @@ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/superstruct": { "version": "0.15.5", "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.15.5.tgz", @@ -20181,7 +20619,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -20313,6 +20750,55 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/tailwindcss": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", + "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.19.1", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/tannin": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/tannin/-/tannin-1.2.0.tgz", @@ -20528,6 +21014,27 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/third-party-web": { "version": "0.23.4", "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.23.4.tgz", @@ -20723,6 +21230,12 @@ "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==" }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -20935,20 +21448,6 @@ "is-typedarray": "^1.0.0" } }, - "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "node_modules/uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", @@ -22150,6 +22649,39 @@ "node": ">= 6" } }, + "node_modules/yaml-lint": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/yaml-lint/-/yaml-lint-1.7.0.tgz", + "integrity": "sha512-zeBC/kskKQo4zuoGQ+IYjw6C9a/YILr2SXoEZA9jM0COrSwvwVbfTiFegT8qYBSBgOwLMWGL8sY137tOmFXGnQ==", + "dev": true, + "dependencies": { + "consola": "^2.15.3", + "globby": "^11.1.0", + "js-yaml": "^4.1.0", + "nconf": "^0.12.0" + }, + "bin": { + "yamllint": "dist/cli.js" + } + }, + "node_modules/yaml-lint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/yaml-lint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/yargs": { "version": "17.7.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", @@ -22207,6 +22739,12 @@ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true }, + "@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true + }, "@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -22310,12 +22848,12 @@ } }, "@babel/generator": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", - "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", + "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", "dev": true, "requires": { - "@babel/types": "^7.21.3", + "@babel/types": "^7.23.3", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -22434,13 +22972,13 @@ "dev": true }, "@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "requires": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@babel/helper-hoist-variables": { @@ -22612,9 +23150,9 @@ } }, "@babel/parser": { - "version": "7.22.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", - "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", + "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -22641,8 +23179,7 @@ "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "requires": {} + "dev": true }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -23546,19 +24083,19 @@ } }, "@babel/traverse": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", - "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", + "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.3", - "@babel/types": "^7.21.3", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.3", + "@babel/types": "^7.23.3", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -23581,13 +24118,13 @@ } }, "@babel/types": { - "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", - "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", + "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.19", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, @@ -23601,8 +24138,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", - "dev": true, - "requires": {} + "dev": true }, "@cypress/request": { "version": "3.0.1", @@ -23804,6 +24340,19 @@ "@hapi/hoek": "^9.0.0" } }, + "@headlessui/react": { + "version": "1.7.17", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.17.tgz", + "integrity": "sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow==", + "requires": { + "client-only": "^0.0.1" + } + }, + "@heroicons/react": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.0.18.tgz", + "integrity": "sha512-7TyMjRrZZMBPa+/5Y8lN0iyvUU/01PeMGX2+RE7cQWpEUIcb4QotzUObFkJDejj/HUH4qjP/eQ0gzzKs2f+6Yw==" + }, "@humanwhocodes/config-array": { "version": "0.11.13", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", @@ -24253,6 +24802,61 @@ "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", "dev": true }, + "@newfold-labs/wp-module-runtime": { + "version": "1.0.7", + "resolved": "https://npm.pkg.github.com/download/@newfold-labs/wp-module-runtime/1.0.7/9eec9b9c5c07f984c67ae6fbfd9982f60168390d", + "integrity": "sha512-jGVnwAe6TkUXKINCIB7Bw8HUyROzZw4FDkBHlHpq9j0GZgSaIFVIpAPDRkk9YLVGt+58Fv1om7nLhgKPr71ydw==", + "requires": { + "@wordpress/url": "3.36.0" + }, + "dependencies": { + "@wordpress/url": { + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-3.36.0.tgz", + "integrity": "sha512-PS/xGlePuTZzht6l9DHvz59lHOE1oPPYOOQj7GbQ+R0uoaaeBDBPsFZSA38jaM2fiu+qGzbOFN7JQZrJma10VQ==", + "requires": { + "@babel/runtime": "^7.16.0", + "remove-accents": "^0.4.2" + } + }, + "remove-accents": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.4.tgz", + "integrity": "sha512-EpFcOa/ISetVHEXqu+VwI96KZBmq+a8LJnGkaeFw45epGlxIZz5dhEEnNZMsQXgORu3qaMoLX4qJCzOik6ytAg==" + } + } + }, + "@newfold/ui-component-library": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@newfold/ui-component-library/-/ui-component-library-1.0.0.tgz", + "integrity": "sha512-zEP2oe+WHu1VJ4B34tKb+8cOdSIefSZ5sappZHLJtA3DM+LhP4NHoVvLt34YYNdm9Zq1mL/M5PH9uqCbMQZFOg==", + "requires": { + "@headlessui/react": "^1.7.8", + "@heroicons/react": "^1.0.6", + "@reduxjs/toolkit": "^1.8.3", + "classnames": "^2.3.2", + "lodash": "^4.17.21", + "postcss-import": "^15.1.0", + "prop-types": "^15.8.1", + "react-animate-height": "^3.1.0", + "react-error-boundary": "^3.1.4" + }, + "dependencies": { + "@heroicons/react": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-1.0.6.tgz", + "integrity": "sha512-JJCXydOFWMDpCP4q13iEplA503MQO3xLoZiKum+955ZCtHINWnx26CUxVxxFQu/uLb4LW3ge15ZpzIkXKkJ8oQ==" + }, + "react-error-boundary": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz", + "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==", + "requires": { + "@babel/runtime": "^7.12.5" + } + } + } + }, "@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", @@ -24357,16 +24961,6 @@ } } }, - "@playwright/test": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.39.0.tgz", - "integrity": "sha512-3u1iFqgzl7zr004bGPYiN/5EZpRUSFddQBra8Rqll5N0/vfpqlP9I9EXqAoGacuAbX6c9Ulg/Cjqglp5VkK6UQ==", - "dev": true, - "peer": true, - "requires": { - "playwright": "1.39.0" - } - }, "@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.11", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", @@ -24475,19 +25069,30 @@ } } }, + "@reduxjs/toolkit": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", + "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", + "requires": { + "immer": "^9.0.21", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.8" + } + }, "@remix-run/router": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.11.0.tgz", "integrity": "sha512-BHdhcWgeiudl91HvVa2wxqZjSHbheSgIiDvxrF1VjFzBzpTtuDPkOdOi3Iqvc08kXtFkLjhbS+ML9aM8mJS+wQ==" }, "@replayio/cypress": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@replayio/cypress/-/cypress-1.6.1.tgz", - "integrity": "sha512-rMfYzEVQGRiMFSCWdoQryzOV6LyMfDKvHgRggQDDdaNn1Dapmy8KeYISHR00h139RYvQT6H4a/0xCHyGvRx+Tg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@replayio/cypress/-/cypress-1.7.0.tgz", + "integrity": "sha512-gRgm7RIE9KY+8QZlNQGE1fwvko3yaC39WghxDdxWescHkk3JgHwfPOgKxFuaz7n3kOmas3vddgWGIvLJ3MjteQ==", "dev": true, "requires": { - "@replayio/replay": "^0.17.5", - "@replayio/test-utils": "^1.2.2", + "@replayio/replay": "^0.18.0", + "@replayio/test-utils": "^1.3.0", "chalk": "^4.1.2", "debug": "^4.3.4", "semver": "^7.5.2", @@ -24525,15 +25130,14 @@ "version": "8.14.2", "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", - "dev": true, - "requires": {} + "dev": true } } }, "@replayio/replay": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/@replayio/replay/-/replay-0.17.5.tgz", - "integrity": "sha512-FZO9UhvGwvGdtjVtUnhGYWsO9sSHdRrwFTvraMBiR9AKRh8Npp5sF/AsAEFtQi1+T2S4VU2qH6TRXCNy44yMSg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@replayio/replay/-/replay-0.18.0.tgz", + "integrity": "sha512-+CW0llMvrhFSjqr9oUPgT/IwpIniJepq/jzZSxcRa9dOqyA+KOGjkGBZO5klmb9gEpldm+FVtDi2cDkZYPACfA==", "dev": true, "requires": { "@replayio/sourcemap-upload": "^1.1.1", @@ -24648,12 +25252,12 @@ } }, "@replayio/test-utils": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@replayio/test-utils/-/test-utils-1.2.2.tgz", - "integrity": "sha512-ArMtHrLTMWje+zidMIf1uPH7ek1rctc43DW4lGjU2pHMdWNpsJEUH4QaW/OosAb6zSIEclNS577EBFc9lyPslg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@replayio/test-utils/-/test-utils-1.3.0.tgz", + "integrity": "sha512-8dysGaow3trBQ4sEEzqDJtuxHmVw7bEjRWzJMWZnK9IB+TR1DHjbyvxvXk5keXopdsyKLRutQFuGbRLwltZJGg==", "dev": true, "requires": { - "@replayio/replay": "^0.17.5", + "@replayio/replay": "^0.18.0", "debug": "^4.3.4", "node-fetch": "^2.6.7", "uuid": "^8.3.2" @@ -24838,57 +25442,49 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", - "dev": true, - "requires": {} + "dev": true }, "@svgr/babel-plugin-remove-jsx-attribute": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", - "dev": true, - "requires": {} + "dev": true }, "@svgr/babel-plugin-remove-jsx-empty-expression": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", - "dev": true, - "requires": {} + "dev": true }, "@svgr/babel-plugin-replace-jsx-attribute-value": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", - "dev": true, - "requires": {} + "dev": true }, "@svgr/babel-plugin-svg-dynamic-title": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", - "dev": true, - "requires": {} + "dev": true }, "@svgr/babel-plugin-svg-em-dimensions": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", - "dev": true, - "requires": {} + "dev": true }, "@svgr/babel-plugin-transform-react-native-svg": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", - "dev": true, - "requires": {} + "dev": true }, "@svgr/babel-plugin-transform-svg-component": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", - "dev": true, - "requires": {} + "dev": true }, "@svgr/babel-preset": { "version": "8.1.0", @@ -25043,6 +25639,15 @@ "defer-to-connect": "^2.0.0" } }, + "@tailwindcss/forms": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.7.tgz", + "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==", + "dev": true, + "requires": { + "mini-svg-data-uri": "^1.2.3" + } + }, "@tannin/compile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@tannin/compile/-/compile-1.1.0.tgz", @@ -26010,22 +26615,19 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", - "dev": true, - "requires": {} + "dev": true }, "@webpack-cli/info": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", - "dev": true, - "requires": {} + "dev": true }, "@webpack-cli/serve": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", - "dev": true, - "requires": {} + "dev": true }, "@wordpress/api-fetch": { "version": "6.42.0", @@ -26042,8 +26644,7 @@ "version": "4.28.0", "resolved": "https://registry.npmjs.org/@wordpress/babel-plugin-import-jsx-pragma/-/babel-plugin-import-jsx-pragma-4.28.0.tgz", "integrity": "sha512-rLZgUIku7r0tI0Qxm8hLZq/0ecymtTSEL6MXesztqOMc155ZWpsTOBjOJgfiL3vaO3Hj1eZrgNKTkJbqhZNDvQ==", - "dev": true, - "requires": {} + "dev": true }, "@wordpress/babel-preset-default": { "version": "7.29.0", @@ -26126,9 +26727,9 @@ } }, "@wordpress/dom-ready": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-3.44.0.tgz", - "integrity": "sha512-i4IUNJZgKiULv2y3q7lKuPLwDxpHjhwpnmmHHDlgj9V4LNAf/Iiq5biuQsCYU47oAGg2dR0XJxHXwqFfgRCOlA==", + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-3.45.0.tgz", + "integrity": "sha512-4e6b+YhOMy+Fe9gNs/8bpS+KzRl952y1UEm8WwWmfkcrxPGB2T1czKe0z0Hf3SZQV/ZPGd7+KwvAy6rdlJTVFQ==", "requires": { "@babel/runtime": "^7.16.0" } @@ -26172,9 +26773,9 @@ } }, "@wordpress/env": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/@wordpress/env/-/env-8.10.0.tgz", - "integrity": "sha512-VkzLjWGiiELm1wxCt+349u4KZ4H2zpGjW9oN94vmy3UwsaN9xBPnYJscditklSU7lN+kUOgBP83e6MdDV0U8nA==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/env/-/env-8.11.0.tgz", + "integrity": "sha512-9zE7HJNW1UenqfME/ao2+1kNrtFbj+jpAipgHwDOnJ+Xkg37mzQ3cb75QQzT/zM7WJ1r1ET4J2b7zbwOImTvAw==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -26263,13 +26864,13 @@ } }, "@wordpress/icons": { - "version": "9.35.0", - "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-9.35.0.tgz", - "integrity": "sha512-Lm7B/2YlBUHjIQIGMbptdpB3is4+EYktITrNmZi4rZ7mveSVon32NzMsVb23nLx0iKyghLfJ4C4t+K2+wLFGJA==", + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-9.36.0.tgz", + "integrity": "sha512-QkJRDNgSJzfU3OCVr5X9P3Au3MIag2yT4dzM3Ej6VfrF0SPfFgMwroXKSdNEHmCCG7AwtzGOjaqjpQ3y9vRMkA==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/element": "^5.21.0", - "@wordpress/primitives": "^3.42.0" + "@wordpress/element": "^5.22.0", + "@wordpress/primitives": "^3.43.0" } }, "@wordpress/is-shallow-equal": { @@ -26314,8 +26915,7 @@ "version": "4.30.0", "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-4.30.0.tgz", "integrity": "sha512-DA5RDfgCN7sTr5QgncCZwHjq+jJDY0fwyL/N2Wf8+Yugz2eOMf1q1a6BO61vGc2Q9KxuQUBgu4YRbhdgu7oDzw==", - "dev": true, - "requires": {} + "dev": true }, "@wordpress/postcss-plugins-preset": { "version": "4.29.0", @@ -26331,16 +26931,15 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-3.2.0.tgz", "integrity": "sha512-/iNBuGgUm9ul/76PrUKHzg+KVdXvsAvThz9Ui4z0HQIEBzkvNxrZnofIdH0PJ7tEVPMomkvbWmV/IR0410yfog==", - "dev": true, - "requires": {} + "dev": true }, "@wordpress/primitives": { - "version": "3.42.0", - "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-3.42.0.tgz", - "integrity": "sha512-xK2nCDmJMNwzOV52YVTc4Atd48LFKfixMbO4NFdh990qSjBjMyJNykSXcnidOtmcrpXnqWNRIZomWJkqPvaPkQ==", + "version": "3.43.0", + "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-3.43.0.tgz", + "integrity": "sha512-o6HwUM8XQmwJeCTfaaTpXhiiofymfKec34fSpACQbZNLA9ud2t5p1aWTRArnkm3cYOJAHVtiiFEJywTnnyOoPg==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/element": "^5.21.0", + "@wordpress/element": "^5.22.0", "classnames": "^2.3.1" } }, @@ -26507,15 +27106,13 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "requires": {} + "dev": true }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "dev": true }, "acorn-walk": { "version": "8.2.0", @@ -26581,8 +27178,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true, - "requires": {} + "dev": true }, "ajv-formats": { "version": "2.1.1", @@ -26617,8 +27213,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} + "dev": true }, "ansi-colors": { "version": "4.1.1", @@ -26664,6 +27259,12 @@ "color-convert": "^1.9.0" } }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, "anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -26686,6 +27287,12 @@ "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", "dev": true }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -26866,6 +27473,12 @@ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, + "async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, "asynciterator.prototype": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", @@ -26920,11 +27533,10 @@ "dev": true }, "axe-core": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.1.tgz", - "integrity": "sha512-9l850jDDPnKq48nbad8SiEelCv4OrUWrKab/cPj0GScVg6cb6NbCCt/Ulk26QEq5jP9NnGr04Bit1BHyV6r5CQ==", - "dev": true, - "peer": true + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz", + "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==", + "dev": true }, "axios": { "version": "0.25.0", @@ -27396,6 +28008,12 @@ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true + }, "camelcase-keys": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", @@ -27770,6 +28388,11 @@ "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true }, + "client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, "clipboard": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.10.tgz", @@ -27999,6 +28622,12 @@ "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true }, + "consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "dev": true + }, "constant-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", @@ -28255,8 +28884,7 @@ "version": "6.4.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", - "dev": true, - "requires": {} + "dev": true }, "css-functions-list": { "version": "3.2.1", @@ -28385,8 +29013,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.0.tgz", "integrity": "sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw==", - "dev": true, - "requires": {} + "dev": true }, "csso": { "version": "5.0.5", @@ -28653,8 +29280,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/cypress-axe/-/cypress-axe-1.5.0.tgz", "integrity": "sha512-Hy/owCjfj+25KMsecvDgo4fC/781ccL+e8p+UUYoadGVM2ogZF9XIKbiM6KI8Y3cEaSreymdD6ZzccbI2bY0lQ==", - "dev": true, - "requires": {} + "dev": true }, "damerau-levenshtein": { "version": "1.0.8", @@ -28754,8 +29380,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "dev": true, - "requires": {} + "dev": true }, "deep-equal": { "version": "2.2.2", @@ -29107,6 +29732,12 @@ "integrity": "sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==", "dev": true }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, "diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -29122,6 +29753,12 @@ "path-type": "^4.0.0" } }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -29691,8 +30328,7 @@ "version": "8.10.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", - "dev": true, - "requires": {} + "dev": true }, "eslint-import-resolver-node": { "version": "0.3.9", @@ -29997,8 +30633,7 @@ "version": "0.15.3", "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-0.15.3.tgz", "integrity": "sha512-LQMW5y0DLK5Fnpya7JR1oAYL2/7Y9wDiYw6VZqlKqcRGSgjbVKNqxraphk7ra1U3Bb5EK444xMgUlQPbMg2M1g==", - "dev": true, - "requires": {} + "dev": true }, "eslint-plugin-prettier": { "version": "5.0.1", @@ -30066,8 +30701,7 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "requires": {} + "dev": true }, "eslint-scope": { "version": "5.1.1", @@ -30792,8 +31426,7 @@ "function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "function.prototype.name": { "version": "1.1.6", @@ -30936,14 +31569,6 @@ "dev": true, "requires": { "async": "^3.2.0" - }, - "dependencies": { - "async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", - "dev": true - } } }, "getpass": { @@ -31191,7 +31816,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, "requires": { "function-bind": "^1.1.2" } @@ -31430,8 +32054,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} + "dev": true }, "ieee754": { "version": "1.2.1", @@ -31460,6 +32083,11 @@ "integrity": "sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==", "dev": true }, + "immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==" + }, "immutable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", @@ -31694,7 +32322,6 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, "requires": { "hasown": "^2.0.0" } @@ -32398,8 +33025,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} + "dev": true }, "jest-regex-util": { "version": "29.6.3", @@ -32617,6 +33243,12 @@ } } }, + "jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true + }, "joi": { "version": "17.9.0", "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.0.tgz", @@ -32717,8 +33349,7 @@ "version": "8.14.2", "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", - "dev": true, - "requires": {} + "dev": true } } }, @@ -33020,8 +33651,7 @@ "version": "8.13.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "dev": true, - "requires": {} + "dev": true } } }, @@ -33695,6 +34325,12 @@ } } }, + "mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "dev": true + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -33807,6 +34443,17 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "nano-css": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.3.4.tgz", @@ -33834,6 +34481,58 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "nconf": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.1.tgz", + "integrity": "sha512-p2cfF+B3XXacQdswUYWZ0w6Vld0832A/tuqjLBu3H1sfUcby4N2oVbGhyuCkZv+t3iY3aiFEj7gZGqax9Q2c1w==", + "dev": true, + "requires": { + "async": "^3.0.0", + "ini": "^2.0.0", + "secure-keys": "^1.0.0", + "yargs": "^16.1.1" + }, + "dependencies": { + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } + } + }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -34101,8 +34800,7 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-filter": { "version": "1.0.2", @@ -34110,6 +34808,12 @@ "integrity": "sha1-rwt5f/6+r4pSxmN87b6IFs/sG8g=", "dev": true }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true + }, "object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -34583,8 +35287,7 @@ "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-to-regexp": { "version": "0.1.7", @@ -34706,26 +35409,6 @@ } } }, - "playwright": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.39.0.tgz", - "integrity": "sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==", - "dev": true, - "peer": true, - "requires": { - "fsevents": "2.3.2", - "playwright-core": "1.39.0" - }, - "dependencies": { - "playwright-core": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.39.0.tgz", - "integrity": "sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==", - "dev": true, - "peer": true - } - } - }, "playwright-core": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.32.0.tgz", @@ -34788,29 +35471,62 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.0.tgz", "integrity": "sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw==", - "dev": true, - "requires": {} + "dev": true }, "postcss-discard-duplicates": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.0.tgz", "integrity": "sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA==", - "dev": true, - "requires": {} + "dev": true }, "postcss-discard-empty": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.0.tgz", "integrity": "sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ==", - "dev": true, - "requires": {} + "dev": true }, "postcss-discard-overridden": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.0.tgz", "integrity": "sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw==", + "dev": true + }, + "postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", "dev": true, - "requires": {} + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "dependencies": { + "yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true + } + } }, "postcss-loader": { "version": "6.2.1", @@ -34906,8 +35622,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "requires": {} + "dev": true }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -34938,12 +35653,20 @@ "icss-utils": "^5.0.0" } }, + "postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.11" + } + }, "postcss-normalize-charset": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.0.tgz", "integrity": "sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ==", - "dev": true, - "requires": {} + "dev": true }, "postcss-normalize-display-values": { "version": "6.0.0", @@ -35057,15 +35780,13 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", - "dev": true, - "requires": {} + "dev": true }, "postcss-scss": { "version": "4.0.9", "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", - "dev": true, - "requires": {} + "dev": true }, "postcss-selector-parser": { "version": "6.0.11", @@ -35099,8 +35820,7 @@ "postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "prelude-ls": { "version": "1.2.1", @@ -35180,7 +35900,6 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, "requires": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -35190,8 +35909,7 @@ "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" } } }, @@ -35381,8 +36099,7 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true, - "requires": {} + "dev": true } } }, @@ -35477,6 +36194,11 @@ "loose-envify": "^1.1.0" } }, + "react-animate-height": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/react-animate-height/-/react-animate-height-3.2.3.tgz", + "integrity": "sha512-R6DSvr7ud07oeCixScyvXWEMJY/Mt2+GyOWC1KMaRc69gOBw+SsCg4TJmrp4rKUM1hyd6p+YKw90brjPH93Y2A==" + }, "react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -35526,8 +36248,7 @@ "react-universal-interface": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz", - "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==", - "requires": {} + "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==" }, "react-use": { "version": "17.4.0", @@ -35550,6 +36271,21 @@ "tslib": "^2.1.0" } }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + } + } + }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -35701,6 +36437,19 @@ "strip-indent": "^3.0.0" } }, + "redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "requires": { + "@babel/runtime": "^7.9.2" + } + }, + "redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==" + }, "reflect.getprototypeof": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", @@ -35830,6 +36579,11 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, + "reselect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" + }, "resize-observer-polyfill": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", @@ -35839,7 +36593,6 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, "requires": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -36116,6 +36869,12 @@ "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz", "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==" }, + "secure-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", + "integrity": "sha512-nZi59hW3Sl5P3+wOO89eHBAAGwmCPd2aE1+dLZV5MO+ItQctIvAqihzaAXIQhvtH4KJPxM080HsnqltR2y8cWg==", + "dev": true + }, "select": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", @@ -37058,8 +37817,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-6.0.0.tgz", "integrity": "sha512-ZorSSdyMcxWpROYUvLEMm0vSZud2uB7tX1hzBZwvVY9SV/uly4AvvJPPhCcymZL3fcQhEQG5AELmrxWqtmzacw==", - "dev": true, - "requires": {} + "dev": true }, "stylelint-config-recommended-scss": { "version": "5.0.2", @@ -37089,6 +37847,43 @@ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" }, + "sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, "superstruct": { "version": "0.15.5", "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.15.5.tgz", @@ -37134,8 +37929,7 @@ "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, "svg-parser": { "version": "2.0.4", @@ -37236,6 +38030,47 @@ } } }, + "tailwindcss": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", + "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", + "dev": true, + "requires": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.19.1", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + } + } + }, "tannin": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/tannin/-/tannin-1.2.0.tgz", @@ -37388,6 +38223,24 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, "third-party-web": { "version": "0.23.4", "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.23.4.tgz", @@ -37531,14 +38384,19 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", - "dev": true, - "requires": {} + "dev": true }, "ts-easing": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==" }, + "ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, "tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -37707,13 +38565,6 @@ "is-typedarray": "^1.0.0" } }, - "typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "peer": true - }, "uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", @@ -37869,8 +38720,7 @@ "use-memo-one": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.2.tgz", - "integrity": "sha512-u2qFKtxLsia/r8qG0ZKkbytbztzRb317XCkT7yP8wxL0tZ/CzK2G+WWie5vWvpyeP7+YoPIwbJoIHJ4Ba4k0oQ==", - "requires": {} + "integrity": "sha512-u2qFKtxLsia/r8qG0ZKkbytbztzRb317XCkT7yP8wxL0tZ/CzK2G+WWie5vWvpyeP7+YoPIwbJoIHJ4Ba4k0oQ==" }, "util-deprecate": { "version": "1.0.2", @@ -38324,8 +39174,7 @@ "version": "8.14.2", "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", - "dev": true, - "requires": {} + "dev": true } } }, @@ -38548,8 +39397,7 @@ "version": "7.5.7", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "dev": true, - "requires": {} + "dev": true }, "xdg-basedir": { "version": "4.0.0", @@ -38587,6 +39435,35 @@ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true }, + "yaml-lint": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/yaml-lint/-/yaml-lint-1.7.0.tgz", + "integrity": "sha512-zeBC/kskKQo4zuoGQ+IYjw6C9a/YILr2SXoEZA9jM0COrSwvwVbfTiFegT8qYBSBgOwLMWGL8sY137tOmFXGnQ==", + "dev": true, + "requires": { + "consola": "^2.15.3", + "globby": "^11.1.0", + "js-yaml": "^4.1.0", + "nconf": "^0.12.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + } + } + }, "yargs": { "version": "17.7.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", diff --git a/package.json b/package.json index a2da5dd..ab81b18 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "wp-plugin-web", "description": "WordPress plugin that integrates your WordPress site with the Web.com control panel, including performance, security, and update features.", "license": "GPL-2.0-or-later", - "version": "1.3.0", + "version": "2.0.0", "private": true, "repository": { "type": "git", @@ -21,14 +21,17 @@ ], "engines": { "node": ">=16", - "npm": ">=7" + "npm": ">=8" }, "dependencies": { + "@heroicons/react": "^2.0.18", + "@newfold/ui-component-library": "^1.0.0", + "@newfold-labs/wp-module-runtime": "^1.0.7", "@wordpress/compose": "^6.22.0", - "@wordpress/dom-ready": "^3.44.0", + "@wordpress/dom-ready": "^3.45.0", "@wordpress/element": "^5.21.0", - "@wordpress/i18n": "^4.42.0", - "@wordpress/icons": "^9.35.0", + "@wordpress/i18n": "^4.45.0", + "@wordpress/icons": "^9.36.0", "classnames": "^2.3.2", "jquery": "^3.7.1", "lodash": "^4.17.21", @@ -38,12 +41,16 @@ "react-use": "^17.4.0" }, "devDependencies": { - "@replayio/cypress": "^1.6.1", + "@replayio/cypress": "^1.7.0", + "@tailwindcss/forms": "^0.5.7", "@testing-library/cypress": "^10.0.1", - "@wordpress/env": "^8.10.0", + "@wordpress/env": "^8.11.0", "@wordpress/scripts": "^26.16.0", + "axe-core": "^4.8.2", "cypress": "^13.5.0", - "cypress-axe": "^1.5.0" + "cypress-axe": "^1.5.0", + "tailwindcss": "^3.3.3", + "yaml-lint": "^1.7.0" }, "scripts": { "build": "wp-scripts build", @@ -75,4 +82,4 @@ "test:e2e": "npx cypress run", "test:unit": "wp-scripts test-unit-js" } -} +} \ No newline at end of file diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..0dbdc25 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,8 @@ +module.exports = { + plugins: [ + require("postcss-import"), + require("tailwindcss/nesting"), + require("tailwindcss"), + ...require("@wordpress/postcss-plugins-preset"), + ], +}; \ No newline at end of file diff --git a/src/app/components/accordion/index.js b/src/app/components/accordion/index.js deleted file mode 100644 index 8517326..0000000 --- a/src/app/components/accordion/index.js +++ /dev/null @@ -1,14 +0,0 @@ -import './stylesheet.scss'; - -const Accordion = ( { summary, className, children } ) => { - return ( -
- -

{ summary }

-
-
{ children }
-
- ); -}; - -export default Accordion; diff --git a/src/app/components/accordion/stylesheet.scss b/src/app/components/accordion/stylesheet.scss deleted file mode 100644 index 7919832..0000000 --- a/src/app/components/accordion/stylesheet.scss +++ /dev/null @@ -1,33 +0,0 @@ -.wppw .accordion { - border: 1px solid var(--color-secondary); - margin-bottom: .6em; - margin-top: .6em; - opacity: .8; - padding: 1px; - transition: opacity .2s ease; - - &:hover, - &[open] { - opacity: 1; - } - - .accordion-summary { - background: var(--color-secondary); - cursor: pointer; - font-weight: 700; - padding: 10px 15px; - - p { - display: inline; - } - } - - .accordion-content { - padding: 0 15px; - margin: 10px 0; - } - - + .accordion { - margin-top: -.6em; - } -} diff --git a/src/app/components/action-field/index.js b/src/app/components/action-field/index.js new file mode 100644 index 0000000..31314eb --- /dev/null +++ b/src/app/components/action-field/index.js @@ -0,0 +1,37 @@ +import { Button, Label } from "@newfold/ui-component-library"; +import classNames from "classnames"; + +const ActionField = ({ + label, + buttonLabel, + href, + target, + children, + className, + onClick +}) => { + return ( +
+
+ + +
+

+ {children} +

+
+ ); +} + +export default ActionField; \ No newline at end of file diff --git a/src/app/components/app-nav/index.js b/src/app/components/app-nav/index.js new file mode 100644 index 0000000..cb81a8a --- /dev/null +++ b/src/app/components/app-nav/index.js @@ -0,0 +1,198 @@ +import { useEffect } from '@wordpress/element'; +import { useViewportMatch } from '@wordpress/compose'; +import { Modal, SidebarNavigation } from "@newfold/ui-component-library" +import { NavLink, useLocation } from 'react-router-dom'; +import Logo from "./logo"; +import { topRoutes, utilityRoutes } from "../../data/routes"; +import { Bars3Icon } from "@heroicons/react/24/outline"; + + +export const SideNavHeader = () => { + return ( +
+ +
+ ); +} + +export const SideNavMenu = () => { + let location = useLocation(); + + const primaryMenu = () => { + return ( + + ); + } + + const secondaryMenu = () => { + return ( + + ); + } + + const SubMenusManager = () => { + // close any open submenus + const subMenus = document.querySelectorAll('.wppw-app-navitem-submenu'); + subMenus.forEach((subMenu) => { + subMenu.classList.add('nfd-hidden'); + }); + + // open active's submenu if it exists + const activeMenu = document.querySelector('.wppw-app-sidenav .active'); + if (activeMenu && null !== activeMenu.nextSibling && activeMenu.nextSibling.classList.contains('wppw-app-navitem-submenu')) { + activeMenu.nextSibling.classList.remove('nfd-hidden'); + } + } + + useEffect(() => { + SubMenusManager(); + document.onclick = SubMenusManager; + }, [location]); + + return ( +
+ {primaryMenu()} + {secondaryMenu()} +
+ ); +} + +export const SideNavMenuItem = ({ label, name, icon: Icon = null, path, action, subItems }) => { + return ( +
  • + + {Icon && + + } + {label} + + + {subItems && subItems.length > 0 && + + } +
  • + ); +} + +export const SideNavMenuSubItem = ({ label, name, path, action }) => { + return ( +
  • + + {label} + +
  • + ); +} + +export const SideNav = () => { + return ( + + ); +} + +export const MobileNav = () => { + const [isOpen, setIsOpen] = useState(false); + + let location = useLocation(); + // Close mobile nav when location changes + useEffect(() => { + setIsOpen(false); + }, [location]); + + return ( +
    +
    + +
    + +
    + + + setIsOpen(false)} + className="wppw-app-sidenav-mobile nfd-z-40" + initialFocus + > + +
    + +
    +
    +
    + +
    +
    + ); +} + +export const AppNav = () => { + const isLargeViewport = useViewportMatch('medium'); + + return ( + <> + {(isLargeViewport && ) || } + + + ); +} \ No newline at end of file diff --git a/src/app/components/header/logo.js b/src/app/components/app-nav/logo.js similarity index 78% rename from src/app/components/header/logo.js rename to src/app/components/app-nav/logo.js index bf8982b..c985eaa 100644 --- a/src/app/components/header/logo.js +++ b/src/app/components/app-nav/logo.js @@ -1,5 +1,5 @@ import { Button } from '@wordpress/components'; -import { Heading } from '../../components'; +import { Heading } from '..'; import { ReactComponent as Brand } from '../../../../assets/svg/web-logo.svg'; import { delay } from 'lodash'; @@ -15,10 +15,9 @@ const Mark = () => { return ( + } + {secondaryAction.title && + + } + + } + + + ); +} + +export const SectionContent = ({ separator = false, className, children }) => { + return ( +
    +
    + {children} +
    +
    + ); +} + +export const SectionSettings = ({ className, children, title, description }) => { + return ( +
    +
    +
    + + {title} + + {description &&
    {description}
    } +
    +
    + +
    + {title} +
    + {children} +
    +
    +
    + ); +} \ No newline at end of file diff --git a/src/app/components/site-info/index.js b/src/app/components/site-info/index.js new file mode 100644 index 0000000..0183e58 --- /dev/null +++ b/src/app/components/site-info/index.js @@ -0,0 +1,64 @@ +import { LockClosedIcon, LockOpenIcon } from "@heroicons/react/24/outline"; +import { NewfoldRuntime } from "@newfold-labs/wp-module-runtime"; +import { Button } from "@newfold/ui-component-library"; +import { WordPressIcon } from "../icons"; +import { ReactComponent as WebIcon } from '../../../../assets/svg/web-icon-white.svg'; + +export const SiteInfoBar = () => { + const { url, title } = NewfoldRuntime.siteDetails; + const parsedUrl = new URL(url); + const siteDomain = parsedUrl.hostname; + const hasSSL = parsedUrl.protocol.includes("https"); + const isEcommerce = NewfoldRuntime.hasCapability("isEcommerce"); + const isStore = window.location.href?.includes("store"); + + const renderPadLock = () => { + if (hasSSL) { + return + } + + return + } + + return ( +
    +
    + +
    +

    {title}

    +
    +
    + {renderPadLock()} + {siteDomain} +
    +
    +
    + +
    + + +
    + +
    +
    + ); +} \ No newline at end of file diff --git a/src/app/data/help.js b/src/app/data/help.js index 0edc1b5..4bea0ef 100644 --- a/src/app/data/help.js +++ b/src/app/data/help.js @@ -6,7 +6,7 @@ const help = [ "Log in to your Account Manager to submit a support ticket. Once you open a ticket, we'll respond promptly to get it resolved.", 'wp-plugin-web' ), - icon: 'email', + icon: false, cta: __( 'Email Us', 'wp-plugin-web' ), url: 'https://www.web.com/help/current-support-requests.jsp', }, @@ -17,7 +17,7 @@ const help = [ 'Speak to our award-winning support team over the phone at 866-923-8821. Our customer service hours are 7:00am - 12:00am ET.', 'wp-plugin-web' ), - icon: 'phone', + icon: false, cta: __( 'Call Us', 'wp-plugin-web' ), url: 'tel:8669238821', }, @@ -28,7 +28,7 @@ const help = [ 'Chat with our sales and support team for quick, helpful answers to questions about product features, pricing and more. Our chat agents are available 24/7.', 'wp-plugin-web' ), - icon: 'format-chat', + icon: false, cta: __( 'Live Chat', 'wp-plugin-web' ), url: 'https://www.web.com/chat?utm_campaign=&utm_content=help_chat_link&utm_term=live_chat&utm_medium=brand_plugin&utm_source=wp-admin/admin.php?page=web#/help', @@ -40,7 +40,7 @@ const help = [ 'Find our team at @webdotcom for updates on our products and support from our team.', 'wp-plugin-web' ), - icon: 'twitter', + icon: false, cta: __( 'Tweet Us', 'wp-plugin-web' ), url: 'https://twitter.com/webdotcom', }, @@ -51,7 +51,7 @@ const help = [ 'Our experts share their experience and well-organized guides to common questions.', 'wp-plugin-web' ), - icon: 'book', + icon: false, cta: __( 'Find Answers', 'wp-plugin-web' ), url: 'https://www.web.com/knowledge?utm_campaign=&utm_content=help_kb_link&utm_term=find_answers&utm_medium=brand_plugin&utm_source=wp-admin/admin.php?page=web#/help', @@ -63,7 +63,7 @@ const help = [ 'Learn best practices, get insider tips and find the latest news about Web.com.', 'wp-plugin-web' ), - icon: 'text-page', + icon: false, cta: __( 'Learn Stuff', 'wp-plugin-web' ), url: 'https://www.web.com/blog/?utm_campaign=&utm_content=help_blog_link&utm_term=learn_stuff&utm_medium=brand_plugin&utm_source=wp-admin/admin.php?page=web#/help', @@ -75,7 +75,7 @@ const help = [ 'Check out our video library of step-by-step tutorials.', 'wp-plugin-web' ), - icon: 'format-video', + icon: false, cta: __( 'Watch Now', 'wp-plugin-web' ), url: 'https://www.youtube.com/c/webdotcom', }, diff --git a/src/app/data/routes.js b/src/app/data/routes.js index d6a7e06..d45743b 100644 --- a/src/app/data/routes.js +++ b/src/app/data/routes.js @@ -1,4 +1,14 @@ -import { settings, help, grid, store } from '@wordpress/icons'; +import { + HomeIcon, + ShoppingBagIcon, + WrenchScrewdriverIcon, + BoltIcon, + AdjustmentsHorizontalIcon, + BuildingStorefrontIcon, + QuestionMarkCircleIcon } +from '@heroicons/react/24/outline'; +import { NewfoldRuntime } from "@newfold-labs/wp-module-runtime"; +import { getMarketplaceSubnavRoutes } from '../../../vendor/newfold-labs/wp-module-marketplace/components/marketplaceSubnav'; import { Route, Routes } from 'react-router-dom'; import { __ } from '@wordpress/i18n'; import Home from '../pages/home'; @@ -42,40 +52,40 @@ const topRoutePaths = [ '/marketplace', '/performance', '/settings', - '/help', ]; -const utilityRoutePaths = [ '/performance', '/settings', '/help' ]; +const utilityRoutePaths = [ '/help' ]; export const routes = [ { name: '/home', title: __( 'Home', 'wp-plugin-web' ), Component: Home, - Icon: grid, + Icon: HomeIcon, }, { name: '/marketplace', title: __( 'Marketplace', 'wp-plugin-web' ), Component: Marketplace, - Icon: store, + Icon: ShoppingBagIcon, + subRoutes: await getMarketplaceSubnavRoutes(), }, { name: '/performance', title: __( 'Performance', 'wp-plugin-web' ), Component: Performance, - Dashicon: 'performance', + Icon: BoltIcon, }, { name: '/settings', title: __( 'Settings', 'wp-plugin-web' ), Component: Settings, - Icon: settings, + Icon: AdjustmentsHorizontalIcon, }, { name: '/help', title: __( 'Help', 'wp-plugin-web' ), Component: Help, - Icon: help, + Icon: QuestionMarkCircleIcon, }, ]; diff --git a/src/app/data/store.js b/src/app/data/store.js index b2fb329..890e040 100644 --- a/src/app/data/store.js +++ b/src/app/data/store.js @@ -1,5 +1,5 @@ import { createContext, useMemo } from '@wordpress/element'; - +import { NewfoldRuntime } from '@newfold-labs/wp-module-runtime'; import apiFetch from '@wordpress/api-fetch'; const DEFAULT = { @@ -11,7 +11,7 @@ const AppStore = createContext( DEFAULT ); export const webApiFetchSettings = async ( options = {} ) => { return await apiFetch( { - url: window.WPPW.resturl + '/web/v1/settings', + url: NewfoldRuntime.createApiUrl('/web/v1/settings'), ...options, } ); }; @@ -38,7 +38,6 @@ export const AppStoreProvider = ( { children } ) => { webApiFetchSettings() .then( ( settings ) => { setStore( { ...store, ...window.WPPW, ...settings } ); - window.WPPW.migrated = true; setBooted( true ); } ) .catch( ( error ) => { diff --git a/src/app/images/section-settings-and-perf.png b/src/app/images/section-settings-and-perf.png deleted file mode 100644 index bcdb08be37e931717b558bed1bb8fca6566329e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39422 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%0AY{tRmQ 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 Hu0mjfoF{1A diff --git a/src/app/images/section-web-content.png b/src/app/images/section-web-content.png deleted file mode 100644 index e5a042ebccf2a9663ba2cccb4bafbbd6b804e908..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34896 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 diff --git a/src/app/images/star-gray.jpg b/src/app/images/star-gray.jpg deleted file mode 100644 index 8f73f2902b5d3e65a034eb51a1320b7f4c05382a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4364 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 HTRi(e>bTwV diff --git a/src/app/index.js b/src/app/index.js index 9d04ada..ddccb60 100644 --- a/src/app/index.js +++ b/src/app/index.js @@ -1,25 +1,31 @@ import './stylesheet.scss'; +import './tailwind.css'; +import { Root } from "@newfold/ui-component-library"; +import { NewfoldRuntime } from '@newfold-labs/wp-module-runtime'; +import { __ } from '@wordpress/i18n'; +import { useDispatch, useSelect } from '@wordpress/data'; +import { store as noticesStore } from '@wordpress/notices'; import AppStore, { AppStoreProvider } from './data/store'; import { useLocation, HashRouter as Router } from 'react-router-dom'; -import { __ } from '@wordpress/i18n'; import { SnackbarList, Spinner } from '@wordpress/components'; import classnames from 'classnames'; -import Header from './components/header'; import AppRoutes from './data/routes'; import ErrorCard from './components/errorCard'; -import { useDispatch, useSelect } from '@wordpress/data'; import { useEffect } from 'react'; import { ErrorBoundary } from 'react-error-boundary'; -import { store as noticesStore } from '@wordpress/notices'; import { setActiveSubnav } from './util/helpers'; import { kebabCase, filter } from 'lodash'; +import { AppNav } from './components/app-nav'; +import { SiteInfoBar } from './components/site-info'; +import { NotificationFeed } from './components/notifications/feed'; // component sourced from module import { default as NewfoldNotifications } from '../../vendor/newfold-labs/wp-module-notifications/assets/js/components/notifications/'; // to pass to notifications module import apiFetch from '@wordpress/api-fetch'; import { useState } from '@wordpress/element'; +import { addQueryArgs } from '@wordpress/url'; const Notices = () => { if ( 'undefined' === typeof noticesStore ) { @@ -66,20 +72,21 @@ const AppBody = ( props ) => { id="wppw-app-rendered" className={ classnames( 'wpadmin-brand-web', - `wppw-wp-${ WPPW.wpversion }`, + `wppw-wp-${ NewfoldRuntime.wpVersion }`, `wppw-page-${ kebabCase( location.pathname ) }`, - props.className + props.className, + 'nfd-w-full nfd-p-4 min-[783px]:nfd-p-0' ) } > -
    + {
    }> { hasError && } + { ( true === booted && ) || ( ! hasError && ) } @@ -105,9 +113,16 @@ const AppBody = ( props ) => { export const App = () => ( - - - + + + +
    + + +
    +
    +
    +
    ); diff --git a/src/app/pages/help/index.js b/src/app/pages/help/index.js index fbbd11b..550a463 100644 --- a/src/app/pages/help/index.js +++ b/src/app/pages/help/index.js @@ -1,47 +1,62 @@ -import './stylesheet.scss'; -import { Heading } from '../../components'; +import { Page } from '../../components/page'; +import { SectionContainer, SectionContent, SectionHeader } from '../../components/section'; import help from '../../data/help'; -import { - Button, - Card, - CardBody, - CardHeader, - CardFooter, - Dashicon, -} from '@wordpress/components'; +import { Button, Card, Title } from "@newfold/ui-component-library"; + +const HelpCard = ({ item }) => { + return ( + + + {item.title} +

    {item.description}

    +
    + + + + +
    + ); +} const Help = () => { - return ( -
    -
    - { help.map( ( item ) => ( - - - { item.title } - - - { /* {} */ } -

    { item.description }

    -
    - - - -
    - ) ) } + const renderHelpCards = () => { + const helpItems = help; + + return ( +
    + {helpItems.map((item) => ( + + ))}
    -
    + ); + }; + + return ( + + + + + + {renderHelpCards()} + + + ); }; diff --git a/src/app/pages/help/stylesheet.scss b/src/app/pages/help/stylesheet.scss deleted file mode 100644 index f72604c..0000000 --- a/src/app/pages/help/stylesheet.scss +++ /dev/null @@ -1,15 +0,0 @@ -.card-help { - text-align: center; - - .components-card-header, - .components-card-footer { - flex-direction: column; - justify-content: end; - } - - /* <= WP 5.8 */ - .components-card__header, - .components-card__footer { - justify-content: center; - } -} \ No newline at end of file diff --git a/src/app/pages/home/comingSoonSection.js b/src/app/pages/home/comingSoonSection.js deleted file mode 100644 index ed7b26b..0000000 --- a/src/app/pages/home/comingSoonSection.js +++ /dev/null @@ -1,133 +0,0 @@ -import graphicUrl from '../../../../assets/svg/small-blue-star.svg'; -import { Heading, ErrorCard } from '../../components'; -import AppStore from '../../data/store'; -import { - webSettingsApiFetch, - dispatchUpdateSnackbar, - comingSoonAdminbarToggle, -} from '../../util/helpers'; -import { - Button, - Card, - CardBody, - CardHeader, - CardFooter, -} from '@wordpress/components'; -import { useState } from '@wordpress/element'; -import { useUpdateEffect } from 'react-use'; - -const ComingSoonSection = () => { - const { store, setStore } = useContext( AppStore ); - const [ isError, setError ] = useState( false ); - const [ comingSoon, setComingSoon ] = useState( store.comingSoon ); - const [ wasComingSoon, setWasComingSoon ] = useState( false ); - - const getComingSoonHeadline = () => { - return comingSoon - ? __( 'Coming Soon', 'wp-plugin-web' ) - : __( 'Site Launched', 'wp-plugin-web' ); - }; - const getComingSoonSubhead = () => { - return comingSoon - ? __( 'Site visitors see "Coming Soon"', 'wp-plugin-web' ) - : __( 'Your site is live!', 'wp-plugin-web' ); - }; - const getComingSoonBody = () => { - return comingSoon - ? __( - "Once you've finished setting up your site, launch it so your visitors can reach it.", - 'wp-plugin-web' - ) - : __( - 'Congratulations! Visitors will now see the site. You can always turn Coming Soon on from the Settings tab above.', - 'wp-plugin-web' - ); - }; - const getComingSoonGraphicClass = () => { - return comingSoon ? 'section-graphic' : 'section-graphic reverse'; - }; - const getComingSoonButton = () => { - return comingSoon ? ( - - ) : ( - <> - - - - ); - }; - const getComingSoonNoticeText = () => { - return comingSoon - ? __( 'Coming soon activated.', 'wp-plugin-web' ) - : __( 'Coming soon deactivated.', 'wp-plugin-web' ); - }; - - useUpdateEffect( () => { - webSettingsApiFetch( { comingSoon }, setError, ( response ) => { - setStore( { - ...store, - comingSoon, - } ); - dispatchUpdateSnackbar( getComingSoonNoticeText() ); - comingSoonAdminbarToggle( comingSoon ); - } ); - }, [ comingSoon ] ); - - if ( isError ) { - return ( -
    - -
    - ); - } - // render nothing if coming soon is not active or not just launched - if ( ! ( comingSoon || ( ! comingSoon && wasComingSoon ) ) ) { - return <>; - } - return ( -
    - { - - - { getComingSoonHeadline() } -

    { getComingSoonSubhead() }

    -
    - { getComingSoonBody() } - { getComingSoonButton() } -
    -
    - ); -}; - -export default ComingSoonSection; diff --git a/src/app/pages/home/index.js b/src/app/pages/home/index.js index d6945c9..cd29290 100644 --- a/src/app/pages/home/index.js +++ b/src/app/pages/home/index.js @@ -1,18 +1,39 @@ -import './stylesheet.scss'; -import ComingSoonSection from './comingSoonSection'; + +import { Page } from '../../components/page'; +import { SectionContainer, SectionHeader, SectionContent } from '../../components/section'; +import ComingSoon from '../settings/comingSoon'; +import SettingsSection from './settingsSection'; import WebContentSection from './webContentSection'; import WebHostingSection from './webHostingSection'; -import SettingsSection from './settingsSection'; + import { useEffect } from 'react'; const Home = () => { return ( -
    - - - - -
    + + + + + + + + + + + + + + + + + + + + + ); }; diff --git a/src/app/pages/home/settingsSection.js b/src/app/pages/home/settingsSection.js index 28a26bf..6ce474b 100644 --- a/src/app/pages/home/settingsSection.js +++ b/src/app/pages/home/settingsSection.js @@ -1,103 +1,41 @@ -import graphicUrl from '../../images/section-settings-and-perf.png'; -import { Heading } from '../../components'; -import { - Button, - Card, - CardBody, - CardHeader, - CardFooter, - Dashicon, -} from '@wordpress/components'; -import { Icon, settings, store } from '@wordpress/icons'; +import ActionField from "../../components/action-field"; +import { SectionSettings } from "../../components/section"; const SettingsSection = () => { return ( -
    - { - - - - { __( 'Settings and Performance', 'wp-plugin-web' ) } - -

    - { __( - 'Customize & fine-tune your site.', - 'wp-plugin-web' - ) } -

    -
    - -
    - - { ' ' } - { __( 'Manage Settings', 'wp-plugin-web' ) } - -

    - { __( - 'Adjust auto-updates, comments, backed-up revisions & more.', - 'wp-plugin-web' - ) } -

    -
    - -
    - -
    - - { ' ' } - { __( 'Performance', 'wp-plugin-web' ) } - -

    - { __( - 'Strike the balance between fresh updates and fastest delivery.', - 'wp-plugin-web' - ) } -

    -
    - -
    - -
    - - { ' ' } - { __( 'Marketplace', 'wp-plugin-web' ) } - -

    - { __( - 'Add site services, themes or plugins from our marketplace.', - 'wp-plugin-web' - ) } -

    -
    - -
    -
    -
    + +
    + + {__('Manage your site settings. You can ajdust automatic updates, comments, revisions and more.', 'wp-plugin-web')} + + + + {__('Manage site performance and caching settings as well as clear the site cache.', 'wp-plugin-web')} + + + + {__('Add site services, themes or plugins from the marketplace.', 'wp-plugin-web')} + +
    +
    ); }; diff --git a/src/app/pages/home/stylesheet.scss b/src/app/pages/home/stylesheet.scss deleted file mode 100644 index 100f532..0000000 --- a/src/app/pages/home/stylesheet.scss +++ /dev/null @@ -1,122 +0,0 @@ -.wppw-section { - margin: 0 0 2rem; - position: relative; - - .components-card__header { - background: var(--color-black); - flex-direction: column; - @media screen and (min-width: 1132px) { - flex-direction: row; - } - .heading { - color: var(--color-white); - font-size: 1.5rem; - margin-bottom: 0 !important; // wp core override - @media screen and (min-width: 1132px) { - margin-bottom: 24px !important; - } - } - p { - color: #FEC101; - font-weight: 700; - margin-left: 0; - } - } - .components-card__footer { - .heading { - display: flex; - align-items: center; - svg, - .dashicons { - margin-right: 4px; - } - } - } - - - &.wppw-section-coming-soon { - - .wppw-section-graphic { - top: -3rem; - right: -6rem; - } - } - - &:first-of-type { // allows for better reordering and injection - margin-top: 1rem; - } -} - -.section-graphic { - position: absolute; - right: 0; - top: 2rem; - transition: all .5s ease; - z-index: 0; - display: none; - @media screen and (min-width: 882px) { - display: block; - max-width: 260px; - } - @media screen and (min-width: 1190px) { - max-width: 330px; - } - @media screen and (min-width: 1399px) { - max-width: 400px; - } - - &.reverse { - transform: rotateY(180deg); - @media(prefers-reduced-motion) { - transform: none; - } - } -} - -.wppw-section-card { - position: relative; - z-index: 1; - - @media screen and (min-width: 882px) { - max-width: 66%; - } - - .components-card__footer { - flex-direction: column; - - .wppw-cardlist-content { - width: 100%; - .components-heading { - display: flex; - align-items: center; - .dashicons, svg { - margin-right: 8px; - color: var(--color-primary); - fill: var(--color-primary); - } - } - @media screen and (max-width: 700px) { - text-align: center; - .components-heading { - justify-content: center; - } - } - } - - .components-button { - margin: 1rem auto; - } - - @media screen and (min-width: 700px) { - flex-direction: row; - - .wppw-cardlist-content { - max-width: 60%; - } - - .components-button { - margin: 0; - } - } - } -} \ No newline at end of file diff --git a/src/app/pages/home/webContentSection.js b/src/app/pages/home/webContentSection.js index f09a5df..09b8f21 100644 --- a/src/app/pages/home/webContentSection.js +++ b/src/app/pages/home/webContentSection.js @@ -1,100 +1,41 @@ -import graphicUrl from '../../images/section-web-content.png'; -import { Heading } from '../../components'; -import { - Button, - Card, - CardBody, - CardHeader, - CardFooter, - Dashicon, -} from '@wordpress/components'; +import ActionField from "../../components/action-field"; +import { SectionSettings } from "../../components/section"; const WebContentSection = () => { return ( -
    - { - - - - { __( 'Website Content', 'wp-plugin-web' ) } - -

    - { __( - 'Create, manage & sort your story.', - 'wp-plugin-web' - ) } -

    -
    - -
    - - { ' ' } - { __( 'Blog', 'wp-plugin-web' ) } - -

    - { __( - 'Update your site with news as your story unfolds.', - 'wp-plugin-web' - ) } -

    -
    - -
    - -
    - - { ' ' } - { __( 'Pages', 'wp-plugin-web' ) } - -

    - { __( - "Share who you are, what you're about and how to get in touch.", - 'wp-plugin-web' - ) } -

    -
    - -
    - -
    - - { ' ' } - { __( 'Categories', 'wp-plugin-web' ) } - -

    - { __( - 'Sort your story so visitors can focus on their interests.', - 'wp-plugin-web' - ) } -

    -
    - -
    -
    -
    + +
    + + {__('Write a new blog post.', 'wp-plugin-web')} + + + + {__('Add fresh pages to your website.', 'wp-plugin-web')} + + + + {__('Organize existing content into categories.', 'wp-plugin-web')} + +
    +
    ); }; diff --git a/src/app/pages/home/webHostingSection.js b/src/app/pages/home/webHostingSection.js index b1fbfb7..240810c 100644 --- a/src/app/pages/home/webHostingSection.js +++ b/src/app/pages/home/webHostingSection.js @@ -1,145 +1,31 @@ -import graphicUrl from '../../images/section-web-hosting.png'; -import { Heading } from '../../components'; -import { - Button, - Card, - CardBody, - CardHeader, - CardFooter, - Dashicon, -} from '@wordpress/components'; +import ActionField from "../../components/action-field"; +import { SectionSettings } from "../../components/section"; const WebHostingSection = () => { return ( -
    - { - - - - { __( 'Web Hosting', 'wp-plugin-web' ) } - -

    - { __( - 'Access & manage your Web.com account.', - 'wp-plugin-web' - ) } -

    -
    - -
    - - { ' ' } - { __( 'Manage Hosting', 'wp-plugin-web' ) } - -

    - { __( - 'Manage site backups, performance options and billing.', - 'wp-plugin-web' - ) } -

    -
    - -
    - -
    - - { ' ' } - { __( 'Email', 'wp-plugin-web' ) } - -

    - { __( - 'Create new email addresses and manage your inbox.', - 'wp-plugin-web' - ) } -

    -
    - -
    - -
    - - { ' ' } - { __( 'Domains', 'wp-plugin-web' ) } - -

    - { __( - 'Find fresh domains, point them at sites and get found online.', - 'wp-plugin-web' - ) } -

    -
    - -
    - -
    - - { ' ' } - { __( 'Help', 'wp-plugin-web' ) } - -

    - { __( - 'Find how-to articles in our Knowledge Base and speak with our award-winning support team.', - 'wp-plugin-web' - ) } -

    -
    - -
    -
    -
    + +
    + + {__("Manage Web account products, options and billing.", "wp-plugin-web")} + +
    +
    ); }; diff --git a/src/app/pages/marketplace/index.js b/src/app/pages/marketplace/index.js index a3b9606..2c6779e 100644 --- a/src/app/pages/marketplace/index.js +++ b/src/app/pages/marketplace/index.js @@ -1,61 +1,53 @@ -import './stylesheet.scss'; - -// to pass to marketplace module -import apiFetch from '@wordpress/api-fetch'; +import apiFetch from '@wordpress/api-fetch'; +import { useState, useEffect } from '@wordpress/element'; +import { useLocation } from 'react-router-dom'; import classnames from 'classnames'; -import { useState } from '@wordpress/element'; -import { useLocation, useNavigate } from 'react-router-dom'; -import { useEffect } from 'react'; -import { - Button, - Card, - CardBody, - CardHeader, - CardFooter, - CardMedia, - TabPanel, - Spinner -} from '@wordpress/components'; - +import { Page } from "../../components/page"; +import { SectionContainer, SectionHeader, SectionContent } from "../../components/section"; +import { NewfoldRuntime } from "@newfold-labs/wp-module-runtime"; // component sourced from marketplace module import { default as NewfoldMarketplace } from '../../../../vendor/newfold-labs/wp-module-marketplace/components/marketplace/'; const MarketplacePage = () => { - // Components to pass to module - const moduleComponents = { - Button, - Card, - CardBody, - CardFooter, - CardHeader, - CardMedia, - TabPanel, - Spinner - }; + // constants to pass to module + const moduleConstants = { + 'supportsCTB': false, + 'text': { + 'title': __('Marketplace', 'wp-plugin-web'), + 'subTitle': __('Explore our featured collection of tools and services.', 'wp-plugin-web'), + 'error': __('Oops, there was an error loading the marketplace, please try again later.', 'wp-plugin-web'), + 'noProducts': __('Sorry, no marketplace items. Please, try again later.', 'wp-plugin-web'), + 'loadMore': __('Load More', 'wp-plugin-web'), + } + }; // methods to pass to module const moduleMethods = { apiFetch, classnames, useState, useEffect, - useNavigate, - useLocation + useLocation, + NewfoldRuntime, }; - // constants to pass to module - const moduleConstants = { - 'resturl': window.WPPW.resturl, - 'eventendpoint': '/newfold-data/v1/events/', - 'perPage': 12, - 'supportsCTB': false, // not needed, but explicity setting to false anyway - } + + const moduleComponents = { + SectionHeader, + SectionContent, + } return ( - + + + + + + + ); }; diff --git a/src/app/pages/marketplace/stylesheet.scss b/src/app/pages/marketplace/stylesheet.scss deleted file mode 100644 index 138a856..0000000 --- a/src/app/pages/marketplace/stylesheet.scss +++ /dev/null @@ -1,227 +0,0 @@ -.newfold-marketplace-wrapper { - .grid { - display: grid; - gap: clamp(0.5rem, calc(1rem + 1vw), 2rem); - padding: 0; - - &.col2 { - @media screen and (min-width: 600px) { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - - @media screen and (min-width: 1100px) { - grid-template-columns: repeat(3, minmax(0, 1fr)); - } - } - } - - .newfold-marketplace-tabs { - display: flex; - flex-direction: column; - - .components-tab-panel__tabs { - display: flex; - /* <= WP 5.4 */ - flex-direction: row; - /* <= WP 5.6 */ - gap: 0; - max-width: max-content; - height: fit-content; - margin-bottom: 2rem; - // padding: 0rem .8rem 0 .8rem; - background-color: var(--color-primary-lighter); - box-shadow: 2px 2px 0 4px var(--color-primary-dark); - - @media screen and (max-width: 600px) { - min-width: initial; - overflow-x: scroll; - } - } - } - - .components-tab-panel__tabs-item { - font-size: 14px; - color: var(--color-primary-dark); - padding: 16px 1.5rem 16px 1.5rem; - min-width: 130px; - justify-content: center; - padding: 16px 3px 16px 3px; - height: auto; - transition: all .15s ease-in-out; - border-right: 1px solid var(--color-primary-light); - position: relative; - - @media screen and (max-width: 600px) { - padding-bottom: 11px; - border-bottom: 5px solid transparent; - } - - &:hover { - color: var(--color-primary); - } - - &:last-child { - border-right: none; - padding-right: 0; - } - - &.current-tab { - cursor: default; - - &:hover { - color: var(--color-primary-dark); - } - - &::before { - content: ''; - position: absolute; - left: auto; - right: auto; - height: 20px; - width: 20px; - top: 42px; - transform: rotate(45deg); - transition: none; - background: linear-gradient(133deg, transparent 50%, var(--color-primary-dark) 50%); - - @media screen and (max-width: 600px) { - display: none !important; - } - } - - @media screen and (max-width: 600px) { - border-bottom: 5px solid var(--color-primary-light); - } - } - - &.components-button:focus:not(:disabled) { - box-shadow: none; - } - } -} - -.marketplace-item { - border-top: 2px; - border-left: 2px; - border-bottom: 4px; - border-right: 4px; - border-style: solid; - border-color: var(--color-black); - overflow: hidden; - - &.components-card { - box-shadow: unset; - } - - div:first-child { - display: flex; - flex-direction: column; - } - - .components-card__media { - position: relative; - background-color: rgba(160, 170, 192, .35); - - &::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - transform: translateX(-100%); - background-image: linear-gradient(90deg, - rgba(#fff, 0) 0, - rgba(#fff, 0.2) 20%, - rgba(#fff, 0.5) 60%, - rgba(#fff, 0)); - animation: marketplace-skeleton 2s infinite; - content: ''; - } - - @keyframes marketplace-skeleton { - 100% { - transform: translateX(100%); - } - } - - img { - aspect-ratio: 16 / 9; - z-index: 2; - } - } - - .components-card__header { - position: relative; - border-bottom: none; - flex-wrap: wrap; - gap: .7rem; - - h2, - h3 { - font-size: .95rem; - min-width: min-content; - margin: 0; - } - - .has-full-price { - .price { - margin-top: 10px; - } - } - - .price { - background-color: var(--color-secondary-lighter); - box-shadow: 1px 1px 0 2px var(--color-secondary); - border-radius: 0; - color: var(--color-secondary-dark); - font-size: .95rem; - font-weight: 800; - min-width: max-content; - margin-left: 0; - padding: 0.25rem 0.75rem; - } - - .full-price { - filter: grayscale(.5); - font-size: .8rem !important; - } - } - - .components-card__body { - flex-grow: 1; - padding-top: 4px; - padding-bottom: 22px; - line-height: 1.35; - font-weight: 400; - } - - .components-card__footer { - justify-content: space-between; - - .is-secondary svg { - display: none; - } - - .is-secondary[target=_blank] { - box-shadow: unset; - outline: unset; - margin-right: -10px; - - &:hover, - &:active, - &:focus { - box-shadow: unset; - outline: unset; - background-color: transparent; - } - - svg { - display: inline; - width: 14px; - height: auto; - margin-top: 2px; - margin-left: 4px; - } - } - } -} \ No newline at end of file diff --git a/src/app/pages/performance/cacheSettings.js b/src/app/pages/performance/cacheSettings.js deleted file mode 100644 index f4d63db..0000000 --- a/src/app/pages/performance/cacheSettings.js +++ /dev/null @@ -1,152 +0,0 @@ -import AppStore from '../../data/store'; -import { Heading, ErrorCard } from '../../components'; -import { - webSettingsApiFetch, - dispatchUpdateSnackbar, -} from '../../util/helpers'; -import { - Card, - CardBody, - CardHeader, - RadioControl, -} from '@wordpress/components'; -import { useState } from '@wordpress/element'; -import { useUpdateEffect } from 'react-use'; - -const CacheSettings = () => { - const { store, setStore } = useContext( AppStore ); - const [ cacheLevel, setCacheLevel ] = useState( store.cacheLevel ); - const [ isError, setError ] = useState( false ); - - const cacheOptions = [ - { - label: ( - - { __( 'Disabled', 'wp-plugin-web' ) } - - { __( - 'No cache enabled. Every page load is fresh.', - 'wp-plugin-web' - ) } - - { __( 'Not recommended.', 'wp-plugin-web' ) } - - ), - value: 0, - notice: 'Caching disabled.', - }, - { - label: ( - - { __( 'Assets Only', 'wp-plugin-web' ) } - - { __( - 'Cache static assets like images and the appearance of your site for 1 hour.', - 'wp-plugin-web' - ) } - - - { __( - 'Tuned for online stores and member sites that need to be fresh.', - 'wp-plugin-web' - ) } - - - ), - value: 1, - notice: 'Cache enabled for assets only.', - }, - { - label: ( - - - { __( 'Assets & Web Pages', 'wp-plugin-web' ) } - - - { __( - 'Cache static assets for 24 hours and web pages for 2 hours.', - 'wp-plugin-web' - ) } - - - { __( - 'Tuned for sites that change at least weekly.', - 'wp-plugin-web' - ) } - - - ), - value: 2, - notice: 'Cache enabled for assets and pages.', - }, - { - label: ( - - - { __( - 'Assets & Web Pages - Extended', - 'wp-plugin-web' - ) } - - - { __( - 'Cache static assets for 1 week and web pages for 8 hours.', - 'wp-plugin-web' - ) } - - - { __( - 'Tuned for sites that update a few times a month or less.', - 'wp-plugin-web' - ) } - - - ), - value: 3, - notice: 'Cache enabled for assets and pages (extended).', - }, - ]; - - const getCacheLevelNoticeText = () => { - return cacheOptions[ cacheLevel ].notice; - }; - - useUpdateEffect( () => { - webSettingsApiFetch( { cacheLevel }, setError, ( response ) => { - setStore( { - ...store, - cacheLevel, - } ); - dispatchUpdateSnackbar( getCacheLevelNoticeText() ); - } ); - }, [ cacheLevel ] ); - - if ( isError ) { - return ; - } - return ( - - - - { __( 'Cache Level', 'wp-plugin-web' ) } - - - - { __( - 'Improve delivery speed for this site by storing a static cached copy that gets regenerated regularly. This can help attract and retain visitors!', - 'wp-plugin-web' - ) } - - - setCacheLevel( parseInt( value ) ) } - /> - - - ); -}; - -export default CacheSettings; diff --git a/src/app/pages/performance/clearCache.js b/src/app/pages/performance/clearCache.js deleted file mode 100644 index 5446225..0000000 --- a/src/app/pages/performance/clearCache.js +++ /dev/null @@ -1,72 +0,0 @@ -import { Heading, ErrorCard } from '../../components'; -import AppStore from '../../data/store'; -import { - webPurgeCacheApiFetch, - dispatchUpdateSnackbar, -} from '../../util/helpers'; -import { - Button, - Card, - CardBody, - CardHeader, - CardFooter, -} from '@wordpress/components'; -import { sprintf } from '@wordpress/i18n'; - -const ClearCache = () => { - const { store, setStore } = useContext( AppStore ); - const [ isError, setError ] = useState( false ); - - const getCacheClearNoticeText = () => { - return __( 'Cache cleared', 'wp-plugin-web' ); - }; - - const clearCache = () => { - webPurgeCacheApiFetch( {}, setError, ( response ) => { - dispatchUpdateSnackbar( getCacheClearNoticeText() ); - } ); - }; - - if ( isError ) { - return ; - } - return ( - - - - { __( 'Clear Cache', 'wp-plugin-web' ) } - - - - - { __( - 'We automatically clear your cache', - 'wp-plugin-web' - ) } - - { ' ' + - __( - "as you work (creating content, changing settings, installing plugins and more). But you can manually clear it here to be confident it's fresh.", - 'wp-plugin-web' - ) } - - - - - - ); -}; - -export default ClearCache; diff --git a/src/app/pages/performance/index.js b/src/app/pages/performance/index.js index 2292c63..6d8d1e6 100644 --- a/src/app/pages/performance/index.js +++ b/src/app/pages/performance/index.js @@ -1,33 +1,64 @@ -import './stylesheet.scss'; -import graphicUrl from '../../../../assets/svg/large-star.svg'; -import CacheSettings from './cacheSettings'; -import ClearCache from './clearCache'; -import SettingsCallout from './settingsCallout'; -import { useViewportMatch } from '@wordpress/compose'; +import AppStore from '../../data/store'; +import { Page } from '../../components/page'; +import { useState, useEffect, useContext, Fragment } from '@wordpress/element'; +import apiFetch from '@wordpress/api-fetch'; +import classnames from 'classnames'; +import { useUpdateEffect } from 'react-use'; +import { NewfoldRuntime } from "@newfold-labs/wp-module-runtime"; +import { SectionContainer, SectionHeader, SectionContent, SectionSettings } from '../../components/section'; +import { useNotification } from '../../components/notifications/feed'; +import { + webSettingsApiFetch as newfoldSettingsApiFetch, + webPurgeCacheApiFetch as newfoldPurgeCacheApiFetch +} from '../../util/helpers'; -const Performance = () => { - const isWideViewport = useViewportMatch( 'large' ); +import { default as NewfoldPerformance } from '../../../../vendor/newfold-labs/wp-module-performance/components/performance/'; + +const PerformancePage = () => { + + // constants to pass to module + const moduleConstants = {}; + + // methods to pass to module + const moduleMethods = { + apiFetch, + classnames, + useState, + useEffect, + useContext, + NewfoldRuntime, + useNotification, + newfoldSettingsApiFetch, + newfoldPurgeCacheApiFetch, + useUpdateEffect, + AppStore, + }; + + const moduleComponents = { + Page, + SectionHeader, + SectionContent, + SectionSettings, + SectionContainer, + Fragment, + } return ( -
    - - { isWideViewport && ( -
    - { -
    - ) } - - -
    + + + + + + ); }; -export default Performance; +export default PerformancePage; diff --git a/src/app/pages/performance/settingsCallout.js b/src/app/pages/performance/settingsCallout.js deleted file mode 100644 index 685611c..0000000 --- a/src/app/pages/performance/settingsCallout.js +++ /dev/null @@ -1,39 +0,0 @@ -import { Heading } from '../../components'; -import { - Card, - CardBody, - CardHeader, - CardFooter, - Button, -} from '@wordpress/components'; -import { settings } from '@wordpress/icons'; - -const SettingsCallout = () => { - return ( - - - - { __( 'Settings', 'wp-plugin-web' ) } - - - - { __( - 'Looking for other Settings? You can refine auto-updates, comments and backups of content revisions on the Settings page.', - 'wp-plugin-web' - ) } - - - - - - ); -}; - -export default SettingsCallout; diff --git a/src/app/pages/performance/stylesheet.scss b/src/app/pages/performance/stylesheet.scss deleted file mode 100644 index baa5806..0000000 --- a/src/app/pages/performance/stylesheet.scss +++ /dev/null @@ -1,61 +0,0 @@ -.wppw { - - .components-radio-control__option label span { - - strong { - font-size: 16px; - padding-top: 1px; - } - - span { - display: block; - opacity: 0.75; - padding: 0.5rem 0 0.25rem 1.75rem; - transition: .2s opacity ease; - } - - em { - display: block; - opacity: 0.6; - padding: 0 0 0.75rem 1.75rem; - transition: .2s opacity ease; - } - - &:hover { - span, - em { - opacity: 1; - } - } - - } - - /* WP 5.5 || WP 5.6 */ - [class*="wppw-wp-5.5"], - [class*="wppw-wp-5.6"] { - .components-radio-control__input[type="radio"]:checked::before { - margin-top: 5px; - margin-left: 5px; - - @media screen and (min-width: 782px) { - margin-top: 1px; - margin-left: 1px; - } - - } - } - - /* WP 5.7 */ - [class*="wppw-wp-5.7"] { - .components-radio-control__input[type="radio"]:checked::before { - transform: translate(3px, 3px); - - @media screen and (min-width: 600px) { - transform: translate(1px, 1px); - - } - - } - } - -} \ No newline at end of file diff --git a/src/app/pages/settings/automaticUpdates.js b/src/app/pages/settings/automaticUpdates.js index a68df9d..8ff09ec 100644 --- a/src/app/pages/settings/automaticUpdates.js +++ b/src/app/pages/settings/automaticUpdates.js @@ -1,231 +1,284 @@ import AppStore from '../../data/store'; -import { Heading, ErrorCard } from '../../components'; -import { - webSettingsApiFetch, - dispatchUpdateSnackbar, -} from '../../util/helpers'; -import { - Card, - CardBody, - CardHeader, - CardDivider, - ToggleControl, -} from '@wordpress/components'; -import { useState } from '@wordpress/element'; -import { useEffect } from 'react'; +import { webSettingsApiFetch } from '../../util/helpers'; import { useUpdateEffect } from 'react-use'; -import classNames from 'classnames'; +import { useState } from '@wordpress/element'; +import { Alert, ToggleField } from "@newfold/ui-component-library"; +import { SectionSettings } from "../../components/section"; +import { useNotification } from '../../components/notifications/feed'; -const AutomaticUpdates = () => { - const { store, setStore } = useContext( AppStore ); - const [ autoUpdatesAll, setAutoUpdatesAll ] = useState( +const AutomaticUpdatesAll = ({ setError, notify }) => { + const { store, setStore } = useContext(AppStore); + const [autoUpdatesAll, setAutoUpdatesAll] = useState( store.autoUpdatesMajorCore && - store.autoUpdatesPlugins && - store.autoUpdatesThemes - ? true - : false - ); - const [ autoUpdatesMajorCore, setAutoUpdatesCore ] = useState( - store.autoUpdatesMajorCore - ); - const [ autoUpdatesPlugins, setAutoUpdatesPlugins ] = useState( - store.autoUpdatesPlugins - ); - const [ autoUpdatesThemes, setAutoUpdatesThemes ] = useState( + store.autoUpdatesPlugins && store.autoUpdatesThemes + ? true + : false ); - const [ isError, setError ] = useState( false ); - const getAllNoticeText = () => { + const getAllNoticeTitle = () => { return autoUpdatesAll - ? __( 'Everything will auto-update.', 'wp-plugin-web' ) - : __( 'Custom auto-update settings.', 'wp-plugin-web' ); + ? __('Enabled All auto-updates', 'wp-plugin-web') + : __('Disabled All auto-updates', 'wp-plugin-web'); }; - const getAllHelpText = () => { + const getAllNoticeText = () => { return autoUpdatesAll - ? __( "We're on top of all your updates.", 'wp-plugin-web' ) - : __( 'Turn on for the safest, best experience.', 'wp-plugin-web' ); + ? __('Everything will automatically update.', 'wp-plugin-web') + : __('Custom auto-update settings.', 'wp-plugin-web'); }; - const getCoreNoticeText = () => { + + const toggleAutoUpdatesAll = () => { + if ( autoUpdatesAll ) { // is unchecking + // just uncheck this one + setAutoUpdatesAll(!autoUpdatesAll); + } else { // is checking + webSettingsApiFetch( + { + autoUpdatesMajorCore: true, + autoUpdatesPlugins: true, + autoUpdatesThemes: true + }, + setError, + (response) => { + setAutoUpdatesAll(!autoUpdatesAll); + } + ); + } + }; + + const notifySuccess = () => { + notify.push("everything-autoupdate-notice", { + title: getAllNoticeTitle(), + description: ( + + {getAllNoticeText()} + + ), + variant: "success", + autoDismiss: 5000, + }); + }; + + useEffect( () => { + if ( store.autoUpdatesMajorCore && store.autoUpdatesPlugins && store.autoUpdatesThemes ) { + setAutoUpdatesAll( true ); + } else { + setAutoUpdatesAll( false ); + } + }, [ store.autoUpdatesMajorCore, store.autoUpdatesPlugins, store.autoUpdatesThemes ] ); + + useUpdateEffect(() => { + + setStore({ + ...store, + autoUpdatesAll, + }); + + notifySuccess(); + }, [autoUpdatesAll]); + + return ( + + ); +} + +const AutomaticUpdatesMajorCore = ({ setError, notify }) => { + const { store, setStore } = useContext(AppStore); + const [autoUpdatesMajorCore, setAutoUpdatesCore] = useState( + store.autoUpdatesMajorCore + ); + + const getCoreNoticeTitle = () => { return autoUpdatesMajorCore - ? __( 'WordPress Core will auto-update.', 'wp-plugin-web' ) - : __( 'WordPress Core will not auto-update.', 'wp-plugin-web' ); + ? __('Enabled Core auto-updates', 'wp-plugin-web') + : __('Disabled Core auto-updates', 'wp-plugin-web'); }; - const getCoreHelpText = () => { + const getCoreNoticeText = () => { return autoUpdatesMajorCore - ? __( 'WordPress will automatically update.', 'wp-plugin-web' ) - : __( 'WordPress must be manually updated.', 'wp-plugin-web' ); + ? __('WordPress will automatically update.', 'wp-plugin-web') + : __('WordPress must be manually updated.', 'wp-plugin-web'); }; - const getPluginsNoticeText = () => { + + const toggleAutoUpdatesMajorCore = () => { + webSettingsApiFetch({ autoUpdatesMajorCore: !autoUpdatesMajorCore }, setError, (response) => { + setAutoUpdatesCore(!autoUpdatesMajorCore); + }); + }; + + const notifySuccess = () => { + notify.push("major-core-autoupdate-notice", { + title: getCoreNoticeTitle(), + description: ( + + {getCoreNoticeText()} + + ), + variant: "success", + autoDismiss: 5000, + }); + }; + + useUpdateEffect(() => { + setStore({ + ...store, + autoUpdatesMajorCore, + }); + + notifySuccess(); + }, [autoUpdatesMajorCore]); + + return ( + + ); +} + +const AutomaticUpdatesPlugins = ({ setError, notify }) => { + const { store, setStore } = useContext(AppStore); + const [autoUpdatesPlugins, setAutoUpdatesPlugins] = useState( + store.autoUpdatesPlugins + ); + + const getPluginsNoticeTitle = () => { return autoUpdatesPlugins - ? __( 'Plugins will auto-update.', 'wp-plugin-web' ) - : __( 'Plugins will not auto-update.', 'wp-plugin-web' ); + ? __('Enabled Plugins auto-update', 'wp-plugin-web') + : __('Disabled Plugins auto-update', 'wp-plugin-web'); }; - const getPluginsHelpText = () => { + const getPluginsNoticeText = () => { return autoUpdatesPlugins - ? __( 'All plugins will automatically update.', 'wp-plugin-web' ) - : __( 'Each plugin must be manually updated.', 'wp-plugin-web' ); + ? __('All plugins will automatically update.', 'wp-plugin-web') + : __('Each plugin must be manually updated.', 'wp-plugin-web'); }; - const getThemesNoticeText = () => { + + const toggleAutoUpdatesPlugins = () => { + webSettingsApiFetch({ autoUpdatesPlugins: !autoUpdatesPlugins }, setError, (response) => { + setAutoUpdatesPlugins(!autoUpdatesPlugins); + }); + }; + + const notifySuccess = () => { + notify.push("plugins-autoupdate-notice", { + title: getPluginsNoticeTitle(), + description: ( + + {getPluginsNoticeText()} + + ), + variant: "success", + autoDismiss: 5000, + }); + }; + + useUpdateEffect(() => { + setStore({ + ...store, + autoUpdatesPlugins, + }); + + notifySuccess(); + }, [autoUpdatesPlugins]); + + return ( + + ); +} + +const AutomaticUpdatesThemes = ({ setError, notify }) => { + const { store, setStore } = useContext(AppStore); + const [autoUpdatesThemes, setAutoUpdatesThemes] = useState( + store.autoUpdatesThemes + ); + + const getThemesNoticeTitle = () => { return autoUpdatesThemes - ? __( 'Themes will auto-update.', 'wp-plugin-web' ) - : __( 'Theme will not auto-update.', 'wp-plugin-web' ); + ? __('Enabled Themes auto-update', 'wp-plugin-web') + : __('Disabled Themes auto-update', 'wp-plugin-web'); }; - const getThemesHelpText = () => { + + const getThemesNoticeText = () => { return autoUpdatesThemes - ? __( 'All themes will automatically update.', 'wp-plugin-web' ) - : __( 'Each theme must be manually updated.', 'wp-plugin-web' ); + ? __('All themes will automatically update.', 'wp-plugin-web') + : __('Each theme must be manually updated.', 'wp-plugin-web'); }; - useEffect( () => { - if ( autoUpdatesMajorCore && autoUpdatesPlugins && autoUpdatesThemes ) { - setAutoUpdatesAll( true ); - } else { - setAutoUpdatesAll( false ); - } - }, [ autoUpdatesMajorCore, autoUpdatesPlugins, autoUpdatesThemes ] ); - - useUpdateEffect( () => { - if ( autoUpdatesAll ) { - setAutoUpdatesCore( autoUpdatesAll ); - setAutoUpdatesPlugins( autoUpdatesAll ); - setAutoUpdatesThemes( autoUpdatesAll ); - dispatchUpdateSnackbar( getAllNoticeText() ); - } else { - // don't set anything, just enable them - } - }, [ autoUpdatesAll ] ); - - useUpdateEffect( () => { - webSettingsApiFetch( - { autoUpdatesMajorCore }, - setError, - ( response ) => { - setStore( { - ...store, - autoUpdatesMajorCore, - } ); - if ( ! autoUpdatesAll ) { - dispatchUpdateSnackbar( getCoreNoticeText() ); - } - } - ); - }, [ autoUpdatesMajorCore ] ); - - useUpdateEffect( () => { - webSettingsApiFetch( { autoUpdatesPlugins }, setError, ( response ) => { - setStore( { - ...store, - autoUpdatesPlugins, - } ); - if ( ! autoUpdatesAll ) { - dispatchUpdateSnackbar( getPluginsNoticeText() ); - } - } ); - }, [ autoUpdatesPlugins ] ); - - useUpdateEffect( () => { - webSettingsApiFetch( { autoUpdatesThemes }, setError, ( response ) => { - setStore( { - ...store, - autoUpdatesThemes, - } ); - if ( ! autoUpdatesAll ) { - dispatchUpdateSnackbar( getThemesNoticeText() ); - } - } ); - }, [ autoUpdatesThemes ] ); - - if ( isError ) { - return ; - } + const toggleAutoUpdatesThemes = () => { + webSettingsApiFetch({ autoUpdatesThemes: !autoUpdatesThemes }, setError, (response) => { + setAutoUpdatesThemes(!autoUpdatesThemes); + }); + }; + + const notifySuccess = () => { + notify.push("themes-autoupdate-notice", { + title: getThemesNoticeTitle(), + description: ( + + {getThemesNoticeText()} + + ), + variant: "success", + autoDismiss: 5000, + }); + }; + + useUpdateEffect(() => { + setStore({ + ...store, + autoUpdatesThemes, + }); + + notifySuccess(); + }, [autoUpdatesThemes]); + + return ( + + ); +} + +const AutomaticUpdates = () => { + const [isError, setError] = useState(false); + + let notify = useNotification(); + return ( - - - - { __( 'Automatic Updates', 'wp-plugin-web' ) } - - - - { __( - 'We strongly recommend letting us manage updates to automatically receive critical security patches, bug fixes and new features as they become available.', - 'wp-plugin-web' - ) } - - - - { - setAutoUpdatesAll( ( value ) => ! value ); - } } - /> - - { ! autoUpdatesAll && ( - - - - { - setAutoUpdatesCore( ( value ) => ! value ); - } } - /> - - - - { - setAutoUpdatesPlugins( ( value ) => ! value ); - } } - /> - - - - { - setAutoUpdatesThemes( ( value ) => ! value ); - } } - /> - - - ) } - +
    + + + + + {isError && + + {__('Oops! Something went wrong. Please try again.', 'wp-plugin-web')} + + } +
    + ); -}; +} -export default AutomaticUpdates; +export default AutomaticUpdates; \ No newline at end of file diff --git a/src/app/pages/settings/comingSoon.js b/src/app/pages/settings/comingSoon.js index 5f545a0..a431bab 100644 --- a/src/app/pages/settings/comingSoon.js +++ b/src/app/pages/settings/comingSoon.js @@ -1,113 +1,115 @@ import AppStore from '../../data/store'; -import { Heading, ErrorCard, Accordion } from '../../components'; import { webSettingsApiFetch, - dispatchUpdateSnackbar, comingSoonAdminbarToggle, } from '../../util/helpers'; -import { - Card, - CardBody, - CardHeader, - CardDivider, - ToggleControl, -} from '@wordpress/components'; import { useState } from '@wordpress/element'; import { useUpdateEffect } from 'react-use'; +import { Alert, ToggleField } from "@newfold/ui-component-library"; +import { SectionSettings } from "../../components/section"; +import { useNotification } from '../../components/notifications/feed'; const ComingSoon = () => { - const { store, setStore } = useContext( AppStore ); - const [ comingSoon, setComingSoon ] = useState( store.comingSoon ); - const [ isError, setError ] = useState( false ); + const { store, setStore } = useContext(AppStore); + const [comingSoon, setComingSoon] = useState(store.comingSoon); + const [isError, setError] = useState(false); - const getComingSoonNoticeText = () => { + let notify = useNotification(); + + const getComingSoonNoticeTitle = () => { return comingSoon - ? __( 'Coming soon activated.', 'wp-plugin-web' ) - : __( 'Coming soon deactivated.', 'wp-plugin-web' ); + ? __('Coming soon activated', 'wp-plugin-web') + : __('Coming soon deactivated', 'wp-plugin-web'); }; - const getComingSoonHelpText = () => { + + const getComingSoonNoticeText = () => { return comingSoon ? __( - 'Coming soon page is active. Site requires login.', - 'wp-plugin-web' - ) + 'Coming soon page is active. Site requires login.', + 'wp-plugin-web' + ) : __( - 'Coming soon page is not active. Site is live to visitors.', - 'wp-plugin-web' - ); + 'Coming soon page is not active. Site is live to visitors.', + 'wp-plugin-web' + ); + }; + + const getComingSoonSectionTitle = () => { + const getStatus = () => { + return ( + comingSoon + ? {__('Coming Soon', 'wp-plugin-web')} + : {__('Live', 'wp-plugin-web')} + ); + }; + + return ( + {__('Site Status', 'wp-plugin-web')}: {getStatus()} + ) + }; + + const toggleComingSoon = () => { + webSettingsApiFetch({ comingSoon: !comingSoon }, setError, (response) => { + setComingSoon(!comingSoon); + }); + }; + + const notifySuccess = () => { + notify.push("coming-soon-toggle-notice", { + title: getComingSoonNoticeTitle(), + description: ( + + {getComingSoonNoticeText()} + + ), + variant: "success", + autoDismiss: 5000, + }); }; - useUpdateEffect( () => { - webSettingsApiFetch( { comingSoon }, setError, ( response ) => { - setStore( { - ...store, - comingSoon, - } ); - dispatchUpdateSnackbar( getComingSoonNoticeText() ); - comingSoonAdminbarToggle(); - } ); - }, [ comingSoon ] ); + useUpdateEffect(() => { + setStore({ + ...store, + comingSoon, + }); + + notifySuccess(); + comingSoonAdminbarToggle(comingSoon); + }, [comingSoon]); - if ( isError ) { - return ; - } return ( - - - - { __( 'Coming Soon', 'wp-plugin-web' ) } - - - -

    - { __( - 'Still building your site? Need to make a big change?', + +

    + -

    - { __( - 'Your Web.com Coming Soon page lets you hide your site from visitors while you make the magic happen.', - 'wp-plugin-web' - ) } -

    -

    - { __( - 'Come back here anytime to turn it on or off as you want to drop a curtain over your site.', - 'wp-plugin-web' - ) } -

    - - - - { - setComingSoon( ( value ) => ! value ); - } } + )} + checked={comingSoon} + onChange={() => { + toggleComingSoon(); + }} /> - { comingSoon && ( - -

    - { __( - 'Activate the "Jetpack" plugin, connect your site, and enable the "Subscriptions" module to build your following. Subscribers are notified when you publish new posts.', - 'wp-plugin-web' - ) } -

    -
    - ) } -
    - + + {comingSoon && + + {__('Your website is currently displaying a "Coming Soon" page.', 'wp-plugin-web')} + + } + + {isError && + + {__('Oops! Something went wrong. Please try again.', 'wp-plugin-web')} + + } +
    + ); -}; +} -export default ComingSoon; +export default ComingSoon; \ No newline at end of file diff --git a/src/app/pages/settings/commentSettings.js b/src/app/pages/settings/commentSettings.js index af8ea7d..3f67321 100644 --- a/src/app/pages/settings/commentSettings.js +++ b/src/app/pages/settings/commentSettings.js @@ -1,227 +1,248 @@ import AppStore from '../../data/store'; -import { Heading, ErrorCard } from '../../components'; -import { - webSettingsApiFetch, - dispatchUpdateSnackbar, -} from '../../util/helpers'; -import { _n } from '@wordpress/i18n'; -import { - Card, - CardBody, - CardHeader, - CardDivider, - ToggleControl, - SelectControl, -} from '@wordpress/components'; -import { useState } from '@wordpress/element'; +import { webSettingsApiFetch } from '../../util/helpers'; import { useUpdateEffect } from 'react-use'; +import { useState } from '@wordpress/element'; +import { Alert, SelectField, ToggleField } from "@newfold/ui-component-library"; +import { SectionSettings } from "../../components/section"; +import { useNotification } from '../../components/notifications/feed'; -const CommentSettings = () => { - const { store, setStore } = useContext( AppStore ); - const [ disableCommentsOldPosts, setDisableCommentsOldPosts ] = useState( +const OldPostsComments = ({ setError, notify }) => { + const { store, setStore } = useContext(AppStore); + const [disableCommentsOldPosts, setDisableCommentsOldPosts] = useState( store.disableCommentsOldPosts ); - const [ closeCommentsDays, setNumCloseCommentsDays ] = useState( - store.closeCommentsDays - ); - const [ commentsPerPage, setNumCommentsPerPage ] = useState( - store.commentsPerPage - ); - const [ isError, setError ] = useState( false ); - const disableCommentsHelpText = () => { + const disableCommentsNoticeTitle = () => { return disableCommentsOldPosts - ? __( 'Comments on old posts are disabled.', 'wp-plugin-web' ) - : __( 'Comments are allowed on old posts.', 'wp-plugin-web' ); + ? __('Disabled old post comments', 'wp-plugin-web') + : __('Enabled old post comments', 'wp-plugin-web'); }; + const disableCommentsNoticeText = () => { return disableCommentsOldPosts - ? __( 'Old post comments disabled.', 'wp-plugin-web' ) - : __( 'Old post comments enabled.', 'wp-plugin-web' ); + ? __('Comments on old posts are disabled.', 'wp-plugin-web') + : __('Comments are allowed on old posts.', 'wp-plugin-web'); + }; + + const toggleDisableCommentsOldPosts = () => { + webSettingsApiFetch({ disableCommentsOldPosts: !disableCommentsOldPosts }, setError, (response) => { + setDisableCommentsOldPosts(!disableCommentsOldPosts); + }); }; - const closeCommentsLabelText = () => { - // `Close comments after ${closeCommentsDays} day(s)` + + const notifySuccess = () => { + notify.push("disable-old-posts-comments-notice", { + title: disableCommentsNoticeTitle(), + description: ( + + {disableCommentsNoticeText()} + + ), + variant: "success", + autoDismiss: 5000, + }); + }; + + useUpdateEffect(() => { + setStore({ + ...store, + disableCommentsOldPosts, + }); + + notifySuccess(); + }, [disableCommentsOldPosts]); + + return ( + + ); +} + +const CloseCommentsDays = ({ setError, notify }) => { + const { store, setStore } = useContext(AppStore); + const [closeCommentsDays, setNumCloseCommentsDays] = useState( + store.closeCommentsDays + ); + + const closeCommentsDaysNoticeTitle = () => { return ( - - { __( 'Close comments after ', 'wp-plugin-web' ) } - { closeCommentsDays } - { _n( ' day.', ' days.', closeCommentsDays, 'wp-plugin-web' ) } - + __('Comments setting saved ', 'wp-plugin-web') ); }; - const closeCommentsHelpText = () => { + + const closeCommentsDaysNoticeText = () => { //`Comments on posts are disabled after ${closeCommentsDays} days.` return ( - - { __( - 'Comments on posts are disabled after ', - 'wp-plugin-web' - ) } - { closeCommentsDays } - { _n( ' day.', ' days.', closeCommentsDays, 'wp-plugin-web' ) } - + __('Comments on posts are disabled after ', 'wp-plugin-web') + + closeCommentsDays + + _n(' day.', ' days.', parseInt(closeCommentsDays), 'wp-plugin-web') ); }; - const closeCommentsNoticeText = () => { + + const closeCommentsDaysLabelText = () => { + //`Close comments after ${closeCommentsDays} days.` return ( - __( 'Disabled comments on posts older than ', 'wp-plugin-web' ) + + __('Close comments after ', 'wp-plugin-web') + closeCommentsDays + - _n( ' day.', ' days.', closeCommentsDays, 'wp-plugin-web' ) + _n(' day.', ' days.', parseInt(closeCommentsDays), 'wp-plugin-web') ); }; - const commentsPerPageLabelText = () => { - // `Display ${commentsPerPage} comment(s) per page` - return ( - - { __( 'Display ', 'wp-plugin-web' ) } - { commentsPerPage } - { _n( - ' comment per page.', - ' comments per page.', - commentsPerPage, - 'wp-plugin-web' - ) } - - ); + + const handleCloseCommentsDaysChange = (value) => { + webSettingsApiFetch({ closeCommentsDays: value }, setError, (response) => { + setNumCloseCommentsDays(value); + }); }; - const commentsPerPageHelpText = () => { + + const notifySuccess = () => { + notify.push("close-comments-days-notice", { + title: closeCommentsDaysNoticeTitle(), + description: ( + + {closeCommentsDaysNoticeText()} + + ), + variant: "success", + autoDismiss: 5000, + }); + }; + + useUpdateEffect(() => { + setStore({ + ...store, + closeCommentsDays, + }); + + notifySuccess(); + }, [closeCommentsDays]); + + return ( + + ); +} + +const CommentsPerPage = ({ setError, notify }) => { + const { store, setStore } = useContext(AppStore); + const [commentsPerPage, setNumCommentsPerPage] = useState( + store.commentsPerPage + ); + + const commentsPerPageNoticeTitle = () => { + return __('Comments setting saved.', 'wp-plugin-web'); + }; + + const commentsPerPageNoticeText = () => { //`Posts will display ${commentsPerPage} comments at a time.` return ( - - { __( 'Posts will display ', 'wp-plugin-web' ) } - { commentsPerPage } - { _n( - ' comment at a time.', - ' comments at a time.', - commentsPerPage, - 'wp-plugin-web' - ) } - + __('Posts will display ', 'wp-plugin-web') + + commentsPerPage + + _n( + ' comment at a time.', + ' comments at a time.', + parseInt(commentsPerPage), + 'wp-plugin-web' + ) ); }; - const commentsPerPageNoticeText = () => { - return __( 'Comments per page setting saved.', 'wp-plugin-web' ); + + const handleCommentsPerPageChange = (value) => { + webSettingsApiFetch({ commentsPerPage: value }, setError, (response) => { + setNumCommentsPerPage(value); + }); }; - useUpdateEffect( () => { - webSettingsApiFetch( - { - disableCommentsOldPosts: disableCommentsOldPosts - ? 'true' - : 'false', - }, - setError, - ( response ) => { - setStore( { - ...store, - disableCommentsOldPosts, - } ); - dispatchUpdateSnackbar( disableCommentsNoticeText() ); - } - ); - }, [ disableCommentsOldPosts ] ); - - useUpdateEffect( () => { - webSettingsApiFetch( { closeCommentsDays }, setError, ( response ) => { - setStore( { - ...store, - closeCommentsDays, - } ); - dispatchUpdateSnackbar( closeCommentsNoticeText() ); - } ); - }, [ closeCommentsDays ] ); - - useUpdateEffect( () => { - webSettingsApiFetch( { commentsPerPage }, setError, ( response ) => { - setStore( { - ...store, - commentsPerPage, - } ); - dispatchUpdateSnackbar( commentsPerPageNoticeText() ); - } ); - }, [ commentsPerPage ] ); - - if ( isError ) { - return ; - } + + const notifySuccess = () => { + notify.push("comments-per-page-notice", { + title: commentsPerPageNoticeTitle(), + description: ( + + {commentsPerPageNoticeText()} + + ), + variant: "success", + autoDismiss: 5000, + }); + }; + + useUpdateEffect(() => { + setStore({ + ...store, + commentsPerPage, + }); + + notifySuccess(); + }, [commentsPerPage]); + + return ( + + ); +} + +const CommentSettings = () => { + const [isError, setError] = useState(false); + + let notify = useNotification(); return ( - - - - { __( 'Comments', 'wp-plugin-web' ) } - - - - { __( - 'Make blog post comments disabled on older posts and control how many to display.', - 'wp-plugin-web' - ) } - - - { - setDisableCommentsOldPosts( ( value ) => ! value ); - } } - /> - - { disableCommentsOldPosts && ( - - - - - setNumCloseCommentsDays( value ) - } - /> - - - ) } - - - setNumCommentsPerPage( value ) } - /> - - + +
    + + + + {isError && + + {__('Oops! Something went wrong. Please try again.', 'wp-plugin-web')} + + } +
    +
    ); }; -export default CommentSettings; +export default CommentSettings; \ No newline at end of file diff --git a/src/app/pages/settings/contentSettings.js b/src/app/pages/settings/contentSettings.js index 4ac9213..ab4256a 100644 --- a/src/app/pages/settings/contentSettings.js +++ b/src/app/pages/settings/contentSettings.js @@ -1,174 +1,181 @@ import AppStore from '../../data/store'; -import { Heading, ErrorCard, Accordion } from '../../components'; -import { - webSettingsApiFetch, - dispatchUpdateSnackbar, -} from '../../util/helpers'; -import { - Card, - CardBody, - CardHeader, - SelectControl, -} from '@wordpress/components'; -import { useState } from '@wordpress/element'; +import { webSettingsApiFetch } from '../../util/helpers'; import { useUpdateEffect } from 'react-use'; +import { useState } from '@wordpress/element'; +import { Alert, SelectField } from "@newfold/ui-component-library"; +import { SectionSettings } from "../../components/section"; +import { useNotification } from '../../components/notifications/feed'; -const ContentSettings = () => { - const { store, setStore } = useContext( AppStore ); +const ContentRevisions = ({ setError, notify }) => { + const { store, setStore } = useContext(AppStore); const [ contentRevisions, setNumContentRevisions ] = useState( store.contentRevisions ); - const [ emptyTrashDays, setNumEmptyTrashDays ] = useState( - store.emptyTrashDays - ); - let numTrashWeeks = Math.floor( emptyTrashDays / 7 ); - const [ isError, setError ] = useState( false ); - const contentRevisionsLabelText = () => { - // `Keep ${contentRevisions} latest revision(s)` + const contentRevisionsNoticeTitle = () => { return ( - - { __( 'Keep ', 'wp-plugin-web' ) } - { contentRevisions } - { _n( - ' latest revision', - ' latest revisions', - parseInt( contentRevisions ), - 'wp-plugin-web' - ) } - + __('Post revision setting saved ', 'wp-plugin-web') ); }; - const contentRevisionsHelpText = () => { - //`Posts will save ${contentRevisions} revisions.` + + const contentRevisionsNoticeText = () => { return ( - - { __( 'Posts will save ', 'wp-plugin-web' ) } - { contentRevisions } - { _n( - ' revision.', - ' revisions.', - parseInt( contentRevisions ), - 'wp-plugin-web' - ) } - + __('Posts will save ', 'wp-plugin-web') + + contentRevisions + + _n(' revision.', ' revisions.', parseInt(contentRevisions), 'wp-plugin-web') ); }; - const contentRevisionsNoticeText = () => { - return 'Post revision setting saved'; + + const contentRevisionsDescriptionText = () => { + return ( + __('Saving drafts and updating published content creates revisions. Make changes with confidence, knowing you can take ', 'wp-plugin-web') + + contentRevisions + + _n(' step back.', ' steps back.', parseInt(contentRevisions), 'wp-plugin-web') + ); + }; + + const handleContentRevisionsChange = (value) => { + webSettingsApiFetch({ contentRevisions: value }, setError, (response) => { + setNumContentRevisions(value); + }); }; - const emptyTrashDaysLabelText = () => { - // `Empty trash every ${numTrashWeeks} week(s).` + + const notifySuccess = () => { + notify.push("content-revision-notice", { + title: contentRevisionsNoticeTitle(), + description: ( + + {contentRevisionsNoticeText()} + + ), + variant: "success", + autoDismiss: 5000, + }); + }; + + useUpdateEffect(() => { + setStore({ + ...store, + contentRevisions, + }); + + notifySuccess(); + }, [contentRevisions]); + + return ( + + ); +} + +const EmptyTrash = ({ setError, notify }) => { + const { store, setStore } = useContext(AppStore); + const [ emptyTrashDays, setNumEmptyTrashDays ] = useState( + store.emptyTrashDays + ); + let numTrashWeeks = Math.floor( emptyTrashDays / 7 ); + + const emptyTrashNoticeTitle = () => { return ( - - { __( 'Empty trash every ', 'wp-plugin-web' ) } - { numTrashWeeks } - { _n( ' week.', ' weeks.', numTrashWeeks, 'wp-plugin-web' ) } - + __('Trash setting saved ', 'wp-plugin-web') ); }; - const emptyTrashDaysHelpText = () => { - //`The trash will automatically empty every ${numTrashWeeks} week(s).` + + const emptyTrashNoticeText = () => { return ( - - { __( - 'The trash will automatically empty every ', - 'wp-plugin-web' - ) } - { numTrashWeeks } - { _n( ' week.', ' weeks.', numTrashWeeks, 'wp-plugin-web' ) } - + __('The trash will automatically empty every ', 'wp-plugin-web') + + numTrashWeeks + + _n( ' week.', ' weeks.', parseInt(numTrashWeeks), 'wp-plugin-web' ) ); }; - const emptyTrashDaysNoticeText = () => { - return 'Trash setting saved'; + + const handleEmptyTrashDaysChange = (value) => { + webSettingsApiFetch({ emptyTrashDays: value }, setError, (response) => { + setNumEmptyTrashDays(value); + }); }; - useUpdateEffect( () => { - webSettingsApiFetch( { contentRevisions }, setError, ( response ) => { - setStore( { - ...store, - contentRevisions, - } ); - dispatchUpdateSnackbar( contentRevisionsNoticeText() ); - } ); - }, [ contentRevisions ] ); - - useUpdateEffect( () => { + const notifySuccess = () => { + notify.push("empty-trash-notice", { + title: emptyTrashNoticeTitle(), + description: ( + + {emptyTrashNoticeText()} + + ), + variant: "success", + autoDismiss: 5000, + }); + }; + + useUpdateEffect(() => { + setStore({ + ...store, + emptyTrashDays, + }); numTrashWeeks = Math.floor( emptyTrashDays / 7 ); - webSettingsApiFetch( { emptyTrashDays }, setError, ( response ) => { - setStore( { - ...store, - emptyTrashDays, - } ); - dispatchUpdateSnackbar( emptyTrashDaysNoticeText() ); - } ); - }, [ emptyTrashDays ] ); - - if ( isError ) { - return ; - } + + notifySuccess(); + }, [emptyTrashDays]); + + return ( + + ); +} + +const ContentSettings = () => { + const [isError, setError] = useState(false); + + let notify = useNotification(); return ( - - - - { __( 'Content Options', 'wp-plugin-web' ) } - - - - setNumContentRevisions( value ) } - /> - - - - setNumEmptyTrashDays( value ) } - /> - - - -

    - { __( - 'When you have a large site with lots of revisions, it can slightly slow down your public site and WordPress Admin. For the best results, keep only a few revisions and empty the trash frequently.', - 'wp-plugin-web' - ) } -

    -
    -
    -
    + +
    + + + + {isError && + + {__('Oops! Something went wrong. Please try again.', 'wp-plugin-web')} + + } +
    +
    ); -}; +} -export default ContentSettings; +export default ContentSettings; \ No newline at end of file diff --git a/src/app/pages/settings/index.js b/src/app/pages/settings/index.js index 0203c0d..1b755b3 100644 --- a/src/app/pages/settings/index.js +++ b/src/app/pages/settings/index.js @@ -1,36 +1,38 @@ -import './stylesheet.scss'; -import graphicUrl from '../../../../assets/svg/large-star.svg'; import AutomaticUpdates from './automaticUpdates'; import ComingSoon from './comingSoon'; import CommentSettings from './commentSettings'; import ContentSettings from './contentSettings'; -import PerformanceCallout from './performanceCallout'; -import { useViewportMatch } from '@wordpress/compose'; +import { Page } from '../../components/page'; +import { SectionContainer, SectionHeader, SectionContent } from '../../components/section'; const Settings = () => { - const isWideViewport = useViewportMatch( 'large' ); return ( -
    - - { isWideViewport && ( -
    - { -
    - ) } - - - - -
    + + + + + + + + + + + + + + + + + + + + + + ); }; diff --git a/src/app/pages/settings/performanceCallout.js b/src/app/pages/settings/performanceCallout.js deleted file mode 100644 index 4a78184..0000000 --- a/src/app/pages/settings/performanceCallout.js +++ /dev/null @@ -1,39 +0,0 @@ -import { Heading } from '../../components'; -import { - Card, - CardBody, - CardHeader, - CardFooter, - Dashicon, - Button, -} from '@wordpress/components'; - -const PerformanceCallout = () => { - return ( - - - - { __( 'Performance', 'wp-plugin-web' ) } - - - - { __( - 'Manage site performance and caching settings as well as clear the site cache.', - 'wp-plugin-web' - ) } - - - - - - ); -}; - -export default PerformanceCallout; diff --git a/src/app/pages/settings/stylesheet.scss b/src/app/pages/settings/stylesheet.scss deleted file mode 100644 index 36bd117..0000000 --- a/src/app/pages/settings/stylesheet.scss +++ /dev/null @@ -1,21 +0,0 @@ - -.components-toggle-control .components-base-control__field { - margin-bottom: 0; - flex-direction: row-reverse; - justify-content: space-between; - - .components-toggle-control__label { - font-weight: 600; - } -} - -.components-base-control .components-base-control__help { - color: var(--color-text); - opacity: .8; - margin-top: .85rem; - font-size: .9rem; -} - -.wppw .components-select-control__input { - max-width: 100%; -} \ No newline at end of file diff --git a/src/app/stylesheet.scss b/src/app/stylesheet.scss index 5676fa0..1404aff 100644 --- a/src/app/stylesheet.scss +++ b/src/app/stylesheet.scss @@ -236,38 +236,3 @@ body.toplevel_page_web { color: var(--color-secondary-dark) !important; } } - - -.has-page-graphic { - padding-bottom: 26rem; -} - -.wppw-page-graphic { - bottom: 3.5rem; - opacity: .5; - position: absolute; - right: 1rem; - z-index: -1; -} - -.wppw { - .components-card { - box-shadow: inset -2px -2px 0px 4px var(--color-black); - - &.short { - margin-bottom: auto; - } - - &.disabled { - opacity: .5; - } - } - - .components-card-body, - .components-card__body { - - &.disabled { - opacity: .5; - } - } -} \ No newline at end of file diff --git a/src/app/tailwind.css b/src/app/tailwind.css new file mode 100644 index 0000000..dcc64f8 --- /dev/null +++ b/src/app/tailwind.css @@ -0,0 +1,293 @@ +/* Import main CSS including all components. */ +@import "@newfold/ui-component-library"; + +/* Tailwind layers */ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* Configs */ +@layer base { + .nfd-root { + @apply + nfd-text-body; + + a { + @apply + nfd-no-underline + nfd-text-primary + hover:nfd-text-primary-dark + focus:nfd-text-primary-dark + focus:nfd-outline-none + focus:nfd-ring-1 + focus:nfd-ring-offset-1 + focus:nfd-ring-offset-transparent + focus:nfd-ring-primary-dark + focus:nfd-rounded-sm + visited:nfd-text-primary + visited:hover:nfd-text-primary-dark; + } + } +} + +/* Titles */ +@layer components { + .nfd-root { + .nfd-title { + @apply + nfd-text-title + } + } +} + +/* Links */ +@layer components { + .nfd-root { + .nfd-link { + @apply + nfd-text-primary + + hover:nfd-text-primary-dark + focus:nfd-ring-primary-600 + visited:nfd-text-primary-dark + visited:hover:nfd-text-primary-dark; + } + + .nfd-link--primary { + @apply nfd-text-primary-600 hover:nfd-text-primary-500 focus:nfd-text-primary-500 focus:nfd-ring-primary-600; + } + + .nfd-link--error { + @apply nfd-text-red-600 hover:nfd-text-red-500 focus:nfd-text-red-500 focus:nfd-ring-red-600; + } + } +} + +/* Buttons */ +@layer components { + .nfd-root { + .nfd-button { + @apply + nfd-px-4 + nfd-gap-2 + focus:nfd-ring-primary; + + svg { + @apply + nfd-w-5 + nfd-h-5; + } + } + + /* Variants */ + + .nfd-button--primary { + @apply + nfd-bg-primary + + hover:nfd-bg-primary-dark + focus:nfd-ring-primary; + } + + .nfd-button--secondary { + @apply + nfd-text-black + nfd-bg-white + nfd-border-primary + + hover:nfd-text-black + hover:nfd-bg-primary-50 + focus:nfd-text-title + focus:nfd-ring-primary + visited:nfd-text-black + visited:hover:nfd-text-title; + } + + .nfd-button--standout { + @apply + nfd-bg-secondary + nfd-text-[#1E293B] + + hover:nfd-bg-secondary-dark + hover:nfd-text-[#1E293B] + focus:nfd-text-[#1E293B]; + } + } +} + +/* Toggle / Toggle Field */ +@layer components { + .nfd-root { + .nfd-toggle { + @apply + nfd-bg-[#CDD0D6] + + focus:nfd-ring-primary; + } + + .nfd-toggle--checked { + @apply nfd-bg-primary; + } + + .nfd-toggle__icon--check { + @apply nfd-text-primary; + } + + .nfd-toggle__icon--x { + @apply nfd-text-[#9CA3AF]; + } + + .nfd-toggle-field__description { + @apply + nfd-mt-3 + nfd-mr-2 + sm:nfd-mr-[10.5rem] + sm:nfd-mt-0; + } + } +} + +/* Checkbox */ +@layer components { + .nfd-root { + .nfd-checkbox { + .nfd-checkbox__input { + @apply + nfd-text-primary + nfd-shadow-none + + focus:nfd-ring-primary; + + &:checked { + &::before { + @apply nfd-hidden; + } + } + } + } + } +} + +/* Radio Input */ +@layer components { + .nfd-root { + .nfd-radio-group { + .nfd-radio__description { + @apply + nfd-mb-2 + nfd-ml-7 + lg:nfd-mr-[10.5rem]; + } + } + + .nfd-radio__input { + @apply + nfd-text-primary + nfd-shadow-none + + focus:nfd-ring-primary; + + &:checked { + &::before { + @apply nfd-bg-transparent; + } + } + } + } +} + +/* Select Field */ +@layer components { + .nfd-root { + .nfd-select__button { + @apply + focus:nfd-ring-primary + focus:nfd-border-primary; + } + + .nfd-select__option { + &--active { + @apply nfd-bg-[#CDD0D6]; + } + + &--selected { + @apply nfd-bg-primary; + } + } + + .nfd-select-field__spaced { + .nfd-select-field__select { + @apply + nfd-flex + nfd-items-center + nfd-justify-between + nfd-gap-4; + } + + .nfd-select__button { + @apply nfd-w-24; + } + + .nfd-select__options { + @apply + nfd-w-40 + nfd-right-0; + } + + .nfd-select-field__description { + @apply lg:nfd-mr-[10.5rem]; + } + } + } +} + +/* Notifications */ +@layer components { + .nfd-root { + + .nfd-notifications { + z-index: 9991; + } + + .nfd-notifications--bottom-left { + @apply nfd-left-[12%]; + } + } +} + +/* Modal */ +@layer components { + .nfd-root { + /* mobile menu modal */ + .wppw-app-sidenav-mobile { + .nfd-modal__close { + @apply + nfd-flex + nfd-bg-white + nfd-rounded-full + nfd-top-[-36px] + nfd-right-0; + } + + .nfd-modal__close-button { + @apply + nfd-text-body + nfd-rounded-full + nfd-p-1 + hover:nfd-text-title + focus:nfd-ring-primary; + } + } + } +} + +/* Text Input Field */ +@layer components { + .nfd-root { + .nfd-text-input { + @apply + focus:nfd-ring-primary + focus:nfd-border-primary; + } + } +} \ No newline at end of file diff --git a/src/app/util/helpers.js b/src/app/util/helpers.js index f6054f0..ba72378 100644 --- a/src/app/util/helpers.js +++ b/src/app/util/helpers.js @@ -1,5 +1,7 @@ import { dispatch } from '@wordpress/data'; import apiFetch from '@wordpress/api-fetch'; +import { addQueryArgs } from '@wordpress/url'; +import { NewfoldRuntime } from "@newfold-labs/wp-module-runtime"; let lastNoticeId; const W_NAV = document.querySelector( '#toplevel_page_web .wp-submenu' ); @@ -80,7 +82,7 @@ export const dispatchUpdateSnackbar = ( text = 'Settings Saved' ) => { export const webSettingsApiFetch = ( data, passError, thenCallback ) => { return apiFetch( { // path: 'web/v1/settings', // can't use path bacause it breaks on temp domains - url: window.WPPW.resturl + '/web/v1/settings', + url: NewfoldRuntime.createApiUrl( '/web/v1/settings' ), method: 'POST', data, } ) @@ -102,7 +104,7 @@ export const webSettingsApiFetch = ( data, passError, thenCallback ) => { */ export const webPurgeCacheApiFetch = ( data, passError, thenCallback ) => { return apiFetch( { - url: window.WPPW.resturl + '/web/v1/caching', + url: NewfoldRuntime.createApiUrl( '/web/v1/caching' ), method: 'DELETE', data, } ) @@ -130,3 +132,21 @@ export const comingSoonAdminbarToggle = ( comingSoon ) => { comingsoonadminbar.classList.remove( 'hideme' ); } }; + +/** + * Decorates an external link URL with UTM params. + * + * The utm_term, if passed, should be the link anchor text. + * The utm_content should be the unique identifier for the link. + * The utm_campaign is optional and reserved for special occasions. + * + * @param {string} url The original URL. + * @param {Object} params The URL parameters to add. + * + * @return {string} The new URL. + */ +export const addUtmParams = (url, params = {}) => { + params.utm_source = `wp-admin/admin.php?page=web${window.location.hash}`; + params.utm_medium = 'web_plugin'; + return addQueryArgs(url, params); +} \ No newline at end of file diff --git a/src/index.js b/src/index.js index 8ec0b98..f46c715 100644 --- a/src/index.js +++ b/src/index.js @@ -3,7 +3,7 @@ import './webpack-public-path'; import App from './app'; import domReady from '@wordpress/dom-ready'; -import { render } from '@wordpress/element'; +import { createRoot, render } from '@wordpress/element'; const WP_ADM_PAGE_ROOT_ELEMENT = 'wppw-app'; const W_ASCI = `Welcome to Web.com!`; @@ -11,9 +11,14 @@ console.log( W_ASCI ); const WPPWRender = () => { const DOM_ELEMENT = document.getElementById( WP_ADM_PAGE_ROOT_ELEMENT ); - if ( null !== DOM_ELEMENT && 'undefined' !== typeof render ) { - render( , DOM_ELEMENT ); - } + if (null !== DOM_ELEMENT) { + if ('undefined' !== typeof createRoot) { + // WP 6.2+ only + createRoot(DOM_ELEMENT).render(); + } else if ('undefined' !== typeof render) { + render(, DOM_ELEMENT); + } + } }; domReady( WPPWRender ); diff --git a/src/webpack-public-path.js b/src/webpack-public-path.js index 41cbcb9..699ba31 100644 --- a/src/webpack-public-path.js +++ b/src/webpack-public-path.js @@ -3,7 +3,7 @@ * so that lazy-loading works correctly. This value is set in /includes/Data.php in runtime(). */ export default () => { - if ( 'undefined' !== typeof window.WPPW && 'url' in window.WPPW ) { - __webpack_public_path__ = window.WPPW.url; + if ( 'undefined' !== typeof window.NewfoldRuntime && 'url' in window.NewfoldRuntime ) { + __webpack_public_path__ = window.NewfoldRuntime.url; } }; diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..0206fa2 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,49 @@ +import { TAILWINDCSS_PRESET } from "@newfold/ui-component-library"; + +module.exports = { + presets: [TAILWINDCSS_PRESET], + content: [ + // Include all JS files inside the UI library in your content. + ...TAILWINDCSS_PRESET.content, + "./src/**/*.js", // all source files + "./node_modules/@newfold-labs/wp-module-*/build/index.js", // all npm sourced module builds + "./vendor/newfold-labs/wp-module-*/components/**/*.js", // all composer sourced module components + ], + theme: { + extend: { + colors: { + primary: { + DEFAULT: "#1F2044", + 50: "#EBEBF6", + 100: "#C2C3E3", + 200: "#7274BE", + 300: "#444693", + 400: "#31336B", + 500: "#1F2044", + 600: "#1A1B39", + 700: "#16172F", + 800: "#0F1021", + 900: "#090913", + dark: "#191936", + light: "#2E93EE", + lighter: "#CDD8DF", + }, + secondary: { + DEFAULT: "#FFCF00", + dark: "#ECA93E", + light: "#FF9144", + lighter: "#FFF8DB", + }, + title: "#1F2044", + body: "#363636", + link: "#2E93EE", + line: "#E2E8F0", + white: "#FFFFFF", + offWhite: "#F5F6F8", + black: "#000000", + canvas: "#F5F6F8", + }, + }, + }, + plugins: [], +} \ No newline at end of file diff --git a/tests/cypress/integration/coming-soon.cy.js b/tests/cypress/integration/coming-soon.cy.js deleted file mode 100644 index 4606d03..0000000 --- a/tests/cypress/integration/coming-soon.cy.js +++ /dev/null @@ -1,119 +0,0 @@ -// - -describe('Coming Soon', function () { - - before(() => { - cy.visit('/wp-admin/admin.php?page=web#/settings'); - cy.injectAxe(); - - }); - - it('Coming Soon Toggle Works', () => { - - cy.get('.coming-soon-toggle input[type="checkbox"]').uncheck(); - cy.get('.coming-soon-toggle input[type="checkbox"]').check(); - cy.wait(100); - cy - .get('.edit-site-notices .components-snackbar__content') - .contains('div', 'Coming soon activated') - .should('be.visible'); - - cy - .get('.coming-soon-protip .accordion-summary') - .contains('p', 'Pro Tip') - .should('be.visible'); - cy.get('.coming-soon-protip').should('not.have.attr', 'open'); - cy.get('.coming-soon-protip summary').click(); - cy.wait(100); - cy.get('.coming-soon-protip').should('have.attr', 'open'); - }); - - it('Has Coming Soon Section on Home', () => { - cy.visit('/wp-admin/admin.php?page=web#/home'); - cy - .get('.wppw-section-coming-soon') - .scrollIntoView() - .contains('h3', 'Coming Soon') - .should('be.visible'); - - }); - - it('Has Coming Soon in Admin Toolbar', () => { - cy.reload(); - cy - .get('#wp-toolbar #wp-admin-bar-web-coming_soon') - .contains('div', 'Coming Soon Active') - .should('be.visible'); - }); - - it('Home Coming Soon Section Launches', () => { - cy.get('.wppw-section-coming-soon button.is-primary').click(); - cy.wait(500); - cy - .get('#wp-toolbar #wp-admin-bar-web-coming_soon') - .contains('div', 'Coming Soon Active') - .should('not.be.visible'); - - cy - .get('.wppw-section-coming-soon') - .scrollIntoView() - .contains('h3', 'Site Launched') - .should('be.visible'); - - cy.get('.wppw-section-coming-soon button.is-secondary').click(); - - - cy - .get('.wppw-section-coming-soon') - .scrollIntoView() - .contains('h3', 'Coming Soon') - .should('be.visible'); - }); - - it('Displays admin coming soon notice', () => { - cy.visit('/wp-admin/index.php'); - cy - .get('.notice-warning') - .contains('p', 'coming') - .should('be.visible'); - }); - - it('Displays Coming Soon on Frontend', () => { - cy.logout(); - cy.visit('/'); - cy - .get('body') - .contains('h1', 'Coming') - .should('be.visible'); - }); - - it('Launching launches site', () => { - cy.login(Cypress.env('wpUsername'), Cypress.env('wpPassword')); - cy.visit('/wp-admin/admin.php?page=web#/settings'); - cy.get('.coming-soon-toggle input[type="checkbox"]').should('be.checked'); - - cy.visit('/wp-admin/admin.php?page=web#/home'); - cy - .get('.wppw-section-coming-soon') - .scrollIntoView() - .contains('h3', 'Coming Soon') - .should('be.visible'); - - cy.get('.wppw-section-coming-soon button.is-primary').click(); - cy.get('.wppw-section-coming-soon button.is-link').click(); //dismiss - - cy - .get('.wppw-section-coming-soon') - .should('not.exist'); - - cy.logout(); - cy.visit('/'); - cy - .get('body') - .contains('h1', 'Coming soon') - .should('not.exist'); - - cy.login(Cypress.env('wpUsername'), Cypress.env('wpPassword')); - cy.visit('/wp-admin/admin.php?page=web#/settings'); - }) -}); diff --git a/tests/cypress/integration/help.cy.js b/tests/cypress/integration/help.cy.js index 1f4e701..1d6ebc6 100644 --- a/tests/cypress/integration/help.cy.js +++ b/tests/cypress/integration/help.cy.js @@ -1,21 +1,15 @@ // -describe('Help Page', function () { +describe('Help Page', () => { before(() => { - cy.visit('/wp-admin/admin.php?page=web#/help'); + cy.visit(`/wp-admin/admin.php?page=${Cypress.env('pluginId')}#/help`); }); it('Is Accessible', () => { cy.injectAxe(); cy.wait(500); - cy.checkA11y('.wppw-app-body'); - }); - - it('Email Card Exists', () => { - cy.get('.card-help-ticket').contains('h3', 'Email') - .scrollIntoView() - .should('be.visible'); + cy.a11y('.wppw-app-body'); }); it('Phone Card Exists', () => { @@ -24,34 +18,10 @@ describe('Help Page', function () { .should('be.visible'); }); - it('Chat Card Exists', () => { - cy.get('.card-help-chat').contains('h3', 'Chat') - .scrollIntoView() - .should('be.visible'); - }); - - it('Tweet Card Exists', () => { - cy.get('.card-help-twitter').contains('h3', 'Tweet') - .scrollIntoView() - .should('be.visible'); - }); - - it('KB Card Exists', () => { - cy.get('.card-help-kb').contains('h3', 'Knowledge Base') - .scrollIntoView() - .should('be.visible'); - }); - it('Blog Card Exists', () => { cy.get('.card-help-blog').contains('h3', 'Blog') .scrollIntoView() .should('be.visible'); }); - - it('Youtube Card Exists', () => { - cy.get('.card-help-video').contains('h3', 'Video') - .scrollIntoView() - .should('be.visible'); - }); - + }); diff --git a/tests/cypress/integration/home.cy.js b/tests/cypress/integration/home.cy.js index a24fca4..fc97d59 100644 --- a/tests/cypress/integration/home.cy.js +++ b/tests/cypress/integration/home.cy.js @@ -3,42 +3,50 @@ describe('Home Page', function () { before(() => { - cy.visit('/wp-admin/admin.php?page=web#/home'); - cy.injectAxe(); - + cy.visit(`/wp-admin/admin.php?page=${Cypress.env('pluginId')}#/home`); }); - it('Header Exists', () => { - cy - .get('.wppw-header').contains('h2', 'Web.com') + it('Site Info Exists', () => { + cy.window().then((win) => { + const siteTitle = win.NewfoldRuntime.site.title; + + cy.get('.wppw-app-site-info').contains('h3', siteTitle) .scrollIntoView() .should('be.visible'); + }) }); it('Is Accessible', () => { + cy.injectAxe(); cy.wait(500); - cy.checkA11y('.wppw-app-body'); + cy.a11y('.wppw-app-body'); }); - it('Web Content Section Exists', () => { + it('Maintenance Mode Section Exists', () => { cy - .get('.wppw-section-home-content').contains('h3', 'Content') + .get('.wppw-app-home-coming-soon').contains('h3', 'Site Status') .scrollIntoView() .should('be.visible'); }); - it('Settings Section Exists', () => { + it('Website Content Section Exists', () => { cy - .get('.wppw-section-home-settings').contains('h3', 'Settings') + .get('.wppw-app-home-content').contains('h3', 'Website Content') .scrollIntoView() .should('be.visible'); }); - it('Hosting Section Exists', () => { + it('Settings and Performance Section Exists', () => { cy - .get('.wppw-section-home-hosting').contains('h3', 'Hosting') + .get('.wppw-app-home-settings').contains('h3', 'Settings and Performance') .scrollIntoView() .should('be.visible'); }); + it('Web Hosting Section Exists', () => { + cy + .get('.wppw-app-home-hosting').contains('h3', 'Web Hosting') + .scrollIntoView() + .should('be.visible'); + }); }); diff --git a/tests/cypress/integration/marketplace.cy.js b/tests/cypress/integration/marketplace.cy.js deleted file mode 100644 index f4d9e2d..0000000 --- a/tests/cypress/integration/marketplace.cy.js +++ /dev/null @@ -1,135 +0,0 @@ -// - -describe('Marketplace Page', function () { - - before(() => { - cy.intercept({ - method: 'GET', - url: /newfold-marketplace(\/|%2F)v1(\/|%2F)marketplace/ - }, { - fixture: 'products' - }).as('products'); - cy.visit('/wp-admin/admin.php?page=web#/marketplace'); - cy.wait('@products'); - }); - - it('Exists', () => { - cy.contains('button', 'Featured'); - }); - - it('Is Accessible', () => { - cy.injectAxe(); - cy.wait(1000); - cy.checkA11y('.wppw-app-body'); - }); - - it('Product grid has 4 items', () => { - cy.get('.marketplace-item').should('have.length', 4); - }); - - it('First product card renders correctly', () => { - cy.get('#marketplace-item-1fc92f8a-bb9f-47c8-9808-aab9c82d6bf2').as('card'); - - cy.get('@card') - .findByRole('link', {name: 'Learn More'}) - .scrollIntoView() - .should('be.visible') - .should('have.attr', 'href') - .and('include', 'https://www.web.com/websites/website-design-services'); - - cy.get('@card').first().within(() => { - cy.get('.components-card__header') - .contains('Web Design Services') - .should('be.visible'); - cy.get('.components-card__media').should('be.visible'); - cy.get('.components-card__header .price').should('not.exist'); - }); - }); - - it('Second product card render correctly', () => { - cy.get('#marketplace-item-2a1dadb5-f58d-4ae4-a26b-27efb09136eb').as('card'); - - cy.get('@card') - .findByRole('link', {name: 'Buy Now'}) - .scrollIntoView() - .should('be.visible') - .should('have.attr', 'href') - .and('include', 'https://www.mojomarketplace.com/cart?item_id=5377b431-d8a8-431b-a711-50c10a141528'); - - cy.get('@card').first().within(() => { - cy.get('.components-card__header') - .contains('Highend') - .should('be.visible'); - cy.get('.components-card__media').should('be.visible'); - cy.get('.components-card__header .price') - .contains('$59.00') - .should('be.visible'); - }); - }); - - it('CTA links have target=_blank', () => { - cy.get('#marketplace-item-1fc92f8a-bb9f-47c8-9808-aab9c82d6bf2').as('card'); - - cy.get('@card') - .findByRole('link', {name: 'Learn More'}) - .scrollIntoView() - .should('have.attr', 'target') - .and('include', '_blank'); - }); - - it('Category Tab Filters properly', () => { - - cy.get('.newfold-marketplace-tab-services').click(); - cy.get('.marketplace-item').should('have.length', 12); - cy.get('#marketplace-item-1fc92f8a-bb9f-47c8-9808-aab9c82d6bf2 h2') - .scrollIntoView() - .should('be.visible') - .should('have.text', 'Web Design Services'); - - cy.get('.newfold-marketplace-tab-seo').click(); - cy.get('.marketplace-item').should('have.length', 6); - cy.get('#marketplace-item-a1ff70f1-9670-4e25-a0e1-a068d3e43a45 h2') - .scrollIntoView() - .should('be.visible') - .should('have.text', 'Yoast Premium'); - }); - - it('Load more button loads more products', () => { - cy.get('.newfold-marketplace-tab-services').click(); - cy.wait(300); - - cy.get('.marketplace-item').should('have.length', 12); - cy.contains('button', 'Load More'); - cy.get('.marketplace-list button') - .scrollIntoView() - .click(); - cy.wait(300); - - cy.get('.marketplace-item').should('have.length', 14); - }); - - it('Category tabs update path', () => { - cy.get('.newfold-marketplace-tab-services').click(); - cy.location().should((loc) => { - expect(loc.hash).to.eq('#/marketplace/services') - }); - }); - - // CTB Not supported yet - it.skip('Product CTB cards render correctly', () => { - cy.get('.marketplace-item-ec14a614-8672-4094-8310-cb0b1eb0f176').as('card'); - - cy.get('@card') - .findByRole('button', {name: 'Buy Now'}) - .scrollIntoView() - .should('be.visible') - .should('have.attr', 'data-action') - .and('include', 'load-nfd-ctb'); - - cy.get('@card').first().within(() => { - cy.get('.components-card__header').should('be.visible'); - cy.get('.components-card__media').should('be.visible'); - }); - }); - -}); diff --git a/tests/cypress/integration/navigation.cy.js b/tests/cypress/integration/navigation.cy.js index 2aa24ac..c1e3c40 100644 --- a/tests/cypress/integration/navigation.cy.js +++ b/tests/cypress/integration/navigation.cy.js @@ -3,9 +3,7 @@ describe('Navigation', function () { before(() => { - cy.visit('/wp-admin/admin.php?page=web'); - cy.injectAxe(); - + cy.visit(`/wp-admin/admin.php?page=${Cypress.env('pluginId')}#`); }); it('Logo Links to home', () => { @@ -27,34 +25,34 @@ describe('Navigation', function () { // test main nav it('Main nav links properly navigates', () => { cy - .get('.link-Marketplace'). + .get('.wppw-app-navitem-Marketplace'). should('not.have.class', 'active'); - cy.get('.link-Marketplace').click(); + cy.get('.wppw-app-navitem-Marketplace').click(); cy.wait(500); cy.hash().should('eq', '#/marketplace'); cy - .get('.link-Marketplace') + .get('.wppw-app-navitem-Marketplace') .should('have.class', 'active'); cy .get('#adminmenu #toplevel_page_web ul.wp-submenu li.current a') .should('have.attr', 'href') .and('match', /marketplace/); - cy.get('.link-Performance').click(); + cy.get('.wppw-app-navitem-Performance').click(); cy.wait(500); cy.hash().should('eq', '#/performance'); cy - .get('.link-Performance') + .get('.wppw-app-navitem-Performance') .should('have.class', 'active'); cy - .get('.link-Marketplace') + .get('.wppw-app-navitem-Marketplace') .should('not.have.class', 'active'); cy .get('#adminmenu #toplevel_page_web ul.wp-submenu li.current a') .should('have.attr', 'href') .and('match', /performance/); - cy.get('.link-Settings').click(); + cy.get('.wppw-app-navitem-Settings').click(); cy.wait(500); cy.hash().should('eq', '#/settings'); cy @@ -62,43 +60,71 @@ describe('Navigation', function () { .should('have.attr', 'href') .and('match', /settings/); }); - - it('Utility nav links properly navigates', () => { + + it('Subnav links properly navigates', () => { cy - .get('.utility-link-Performance') + .get('.wppw-app-navitem-Marketplace') + .scrollIntoView() .should('not.have.class', 'active'); - cy - .get('.utility-link-Performance').click(); + cy.get('.wppw-app-navitem-Marketplace').click(); + cy.wait(500); - cy.hash().should('eq', '#/performance'); + cy.hash().should('eq', '#/marketplace'); cy - .get('.utility-link-Performance') + .get('.wppw-app-navitem-Marketplace') .should('have.class', 'active'); - cy - .get('.utility-link-Settings').click(); + .get('#adminmenu #toplevel_page_web ul.wp-submenu li.current a') + .should('have.attr', 'href') + .and('match', /marketplace/); + + cy.get('.wppw-app-subnavitem-Services').click(); + cy.wait(500); + cy.hash().should('eq', '#/marketplace/services'); + cy + .get('.wppw-app-subnavitem-Services') + .should('have.class', 'active'); + cy + .get('#adminmenu #toplevel_page_web ul.wp-submenu li.current a') + .should('have.attr', 'href') + .and('match', /marketplace/); + cy + .get('.wppw-app-navitem-Marketplace') + .should('have.class', 'active'); + + + cy.get('.wppw-app-subnavitem-SEO').click(); cy.wait(500); - cy.hash().should('eq', '#/settings'); + cy.hash().should('eq', '#/marketplace/seo'); cy - .get('.utility-link-Settings') + .get('.wppw-app-subnavitem-SEO') .should('have.class', 'active'); cy - .get('.utility-link-Performance') + .get('.wppw-app-subnavitem-Services') .should('not.have.class', 'active'); - cy - .get('.utility-link-Help').click(); - cy.wait(500); - cy.hash().should('eq', '#/help'); + .get('#adminmenu #toplevel_page_web ul.wp-submenu li.current a') + .should('have.attr', 'href') + .and('match', /marketplace/); cy - .get('.utility-link-Help') + .get('.wppw-app-navitem-Marketplace') .should('have.class', 'active'); + + cy.get('.wppw-app-navitem-Performance').click(); + cy.wait(500); + cy + .get('.wppw-app-subnavitem-Services') + .should('not.have.class', 'active'); + cy + .get('.wppw-app-subnavitem-SEO') + .should('not.have.class', 'active'); cy - .get('.utility-link-Settings') + .get('.wppw-app-navitem-Marketplace') .should('not.have.class', 'active'); }); - it('Mobile nav links dispaly for mobile', () => { + // no mobile nav, but should probably add + it.skip('Mobile nav links dispaly for mobile', () => { cy .get('.mobile-toggle') .should('not.exist'); @@ -109,14 +135,14 @@ describe('Navigation', function () { .should('be.visible'); }); - it('Mobile nav links properly navigates', () => { + it.skip('Mobile nav links properly navigates', () => { cy.get('.mobile-link-Home').should('not.exist'); cy.viewport('iphone-x'); cy.get('.mobile-toggle').click(); cy.wait(500); cy.get('.mobile-link-Home').should('be.visible'); - cy.get('button[aria-label="Close Navigation"]').should('be.visible'); - cy.get('button[aria-label="Close Navigation"]').click(); + cy.get('button[aria-label="Close"]').should('be.visible') + cy.get('button[aria-label="Close"]').click(); cy.get('.mobile-link-Home').should('not.exist'); }); }); diff --git a/tests/cypress/integration/performance.cy.js b/tests/cypress/integration/performance.cy.js deleted file mode 100644 index b23eab2..0000000 --- a/tests/cypress/integration/performance.cy.js +++ /dev/null @@ -1,82 +0,0 @@ -// - -describe('Performance Page', function () { - - before(() => { - cy.visit('/wp-admin/admin.php?page=web#/performance'); - cy.injectAxe(); - - }); - - it('Is Accessible', () => { - cy.wait(500); - cy.checkA11y('.wppw-app-body'); - }); - - it('Has Cache Settings', () => { - cy - .get('.card-cache-settings') - .scrollIntoView() - .should('be.visible'); - }); - - it('Has Clear Cache Settings', () => { - cy - .get('.card-clear-cache') - .scrollIntoView() - .should('be.visible'); - }); - - it('Clear Cache Disabled when Cache is Disabled', () => { - - cy - .get('.input-cache-settings input[type="radio"]') - .first().check(); - - cy.wait(500); - - cy - .get('.card-clear-cache') - .scrollIntoView() - .should('have.class', 'disabled'); - - cy.get('.input-cache-settings input[type="radio"]').check('1'); - - cy - .get('.card-clear-cache') - .scrollIntoView() - .should('not.have.class', 'disabled'); - - cy - .get('.edit-site-notices .components-snackbar__content') - .contains('div', 'Cache') - .should('be.visible'); - }); - - it('Settings Callout Navigates to Settings Page', () => { - cy.hash().should('eq', '#/performance'); - cy.get('a.callout-link-settings').click(); - cy.wait(500); - cy.hash().should('eq', '#/settings'); - cy.get('a.callout-link-performance').click(); - cy.wait(500); - cy.hash().should('eq', '#/performance'); - cy - .get('.card-cache-settings') - .should('be.visible'); - }); - - // can't test clear cache without endurance page cache being installed - // how to do in cypress env? - // it('Clear Cache Button Functions', () => { - // cy - // .get('.card-clear-cache button') - // .click(); - - // cy - // .get('.edit-site-notices .components-snackbar__content') - // .contains('div', 'Cache cleared') - // .should('be.visible'); - // }); - -}); diff --git a/tests/cypress/integration/premium-plugins-tab.cy.js b/tests/cypress/integration/premium-plugins-tab.cy.js deleted file mode 100644 index 4c3f877..0000000 --- a/tests/cypress/integration/premium-plugins-tab.cy.js +++ /dev/null @@ -1,76 +0,0 @@ -// - -describe('Plugins Premium Tab', () => { - - before(() => { - cy.intercept({ - method: 'GET', - url: /newfold-marketplace(\/|%2F)v1(\/|%2F)marketplace/ - }, { - fixture: 'products', - delay: 1000 - }).as('products'); - cy.visit('/wp-admin/plugin-install.php?tab=premium-marketplace'); - cy.wait('@products'); - }); - - it('Premium tab exist', () => { - cy.get('.wrap') - .find('.nfd-premium-plugins-marketplace') - .contains('Unlock the full potential of your WordPress website with premium plugins from Web') - .should('be.visible'); - }); - - it('Is Accessible', () => { - cy.injectAxe(); - cy.wait(1000); - cy.checkA11y('.nfd-premium-plugins-marketplace'); - }); - - it('Should have products', () => { - cy.get('#the-list') - .children('.plugin-card') - .should('be.visible') - }); - - it('Product should display thumbnail', () => { - cy.get('.plugin-card:first-of-type') - .find('.nfd-plugin-card-thumbnail img') - .scrollIntoView() - .should('be.visible') - .should('have.attr', 'src') - }) - - it('Product should have a name', () => { - cy.get('.plugin-card:first-of-type') - .find('.nfd-plugin-card-title h3') - .invoke('text') - .should('not.be.empty') - }); - - it('Product should have description', () => { - cy.get('.plugin-card:first-of-type') - .find('.nfd-plugin-card-desc p') - .invoke('text') - .should('not.be.empty') - }) - - it('Product should have actions', () => { - // primary action - cy.get('.plugin-card:first-of-type') - .find('.nfd-plugin-card-actions a:first-of-type') - .scrollIntoView() - .should('be.visible') - .should('have.attr', 'href') - - // secondary action - cy.get('.plugin-card:first-of-type') - .find('.nfd-plugin-card-actions a:last-of-type') - .scrollIntoView() - .should('be.visible') - .should('have.text', 'More Details') - .should('have.attr', 'href') - - }) - -}) diff --git a/tests/cypress/integration/settings.cy.js b/tests/cypress/integration/settings.cy.js index a06b902..33a4ff0 100644 --- a/tests/cypress/integration/settings.cy.js +++ b/tests/cypress/integration/settings.cy.js @@ -3,118 +3,240 @@ describe('Settings Page', function () { before(() => { - cy.visit('/wp-admin/admin.php?page=web#/settings'); - cy.injectAxe(); - + cy.visit(`/wp-admin/admin.php?page=${Cypress.env('pluginId')}#/settings`); }); it('Is Accessible', () => { + cy.injectAxe(); cy.wait(500); cy.checkA11y('.wppw-app-body'); }); - it('Has Auto Updates Settings', () => { + it('Has Coming Soon', () => { cy - .get('.card-auto-updates') + .get('.wppw-app-settings-coming-soon') .scrollIntoView() .should('be.visible'); }); - it('Has Coming Soon', () => { + it('Has Auto Updates Settings', () => { cy - .get('.card-coming-soon') + .get('.wppw-app-settings-update') .scrollIntoView() .should('be.visible'); }); it('Has Content Settings', () => { cy - .get('.card-content-settings') + .get('.wppw-app-settings-content') .scrollIntoView() .should('be.visible'); }); it('Has Comments Settings', () => { cy - .get('.card-comment-settings') + .get('.wppw-app-settings-comments') .scrollIntoView() .should('be.visible'); }); - it('Everything Auto Update Toggle Works', () => { - cy.get('.autoupdate-all-toggle input[type="checkbox"]').check(); - cy.get('.autoupdate-all-toggle input[type="checkbox"]').should('be.checked'); - cy.get('.autoupdate-core-toggle input[type="checkbox"]').should('not.exist'); - cy.get('.autoupdate-plugin-toggle input[type="checkbox"]').should('not.exist'); - cy.get('.autoupdate-theme-toggle input[type="checkbox"]').should('not.exist'); + it('On load update all is checked, which forces other updates to check and disabled state', () => { + cy.get('[data-id="autoupdate-all-toggle"]').should('have.attr', 'aria-checked').and('include', 'true'); + cy.get('[data-id="autoupdate-core-toggle"]').should('be.disabled').should('have.attr', 'aria-checked').and('include', 'true'); + cy.get('[data-id="autoupdate-plugins-toggle"]').should('be.disabled').should('have.attr', 'aria-checked').and('include', 'true'); + cy.get('[data-id="autoupdate-themes-toggle"]').should('be.disabled').should('have.attr', 'aria-checked').and('include', 'true'); + }); - cy.get('.autoupdate-all-toggle input[type="checkbox"]').uncheck(); - cy.get('.autoupdate-core-toggle input[type="checkbox"]').should('not.be.disabled').should('be.checked'); - cy.get('.autoupdate-plugin-toggle input[type="checkbox"]').should('not.be.disabled').should('be.checked'); - cy.get('.autoupdate-theme-toggle input[type="checkbox"]').should('not.be.disabled').should('be.checked'); + it('Disable ALL toggle, leaves everything checked, but enables them', () => { + cy.get('[data-id="autoupdate-all-toggle"]').click(); + cy.wait(100); + cy.get('.nfd-notifications') + .contains('p', 'Disabled All auto-updates') + .should('be.visible'); + cy.get('[data-id="autoupdate-all-toggle"]').should('have.attr', 'aria-checked').and('include', 'false'); + cy.get('[data-id="autoupdate-core-toggle"]').should('not.be.disabled').should('have.attr', 'aria-checked').and('include', 'true'); + cy.get('[data-id="autoupdate-plugins-toggle"]').should('not.be.disabled').should('have.attr', 'aria-checked').and('include', 'true'); + cy.get('[data-id="autoupdate-themes-toggle"]').should('not.be.disabled').should('have.attr', 'aria-checked').and('include', 'true'); + }); - cy.get('.autoupdate-core-toggle input[type="checkbox"]').uncheck(); - cy.get('.autoupdate-core-toggle input[type="checkbox"]').should('not.be.disabled').should('not.be.checked'); - cy.get('.autoupdate-all-toggle input[type="checkbox"]').should('not.be.checked'); + it('Core toggle works', () => { + cy.get('[data-id="autoupdate-core-toggle"]').should('not.be.disabled').should('have.attr', 'aria-checked').and('include', 'true'); + cy.get('[data-id="autoupdate-core-toggle"]').click(); cy.wait(100); - cy - .get('.wppw-app-snackbar') - .contains('.components-snackbar__content', 'update') + cy.get('[data-id="autoupdate-core-toggle"]').should('have.attr', 'aria-checked').and('include', 'false'); + cy.get('.nfd-notifications') + .contains('p', 'Disabled Core auto-updates') .should('be.visible'); + cy.get('[data-id="autoupdate-all-toggle"]').should('have.attr', 'aria-checked').and('include', 'false'); + }); - cy.get('.autoupdate-plugin-toggle input[type="checkbox"]').uncheck(); - cy.get('.autoupdate-plugin-toggle input[type="checkbox"]').should('not.be.disabled').should('not.be.checked'); - cy.get('.autoupdate-all-toggle input[type="checkbox"]').should('not.be.checked'); + it('Plugins toggle works', () => { + cy.get('[data-id="autoupdate-plugins-toggle"]').should('not.be.disabled').should('have.attr', 'aria-checked').and('include', 'true'); + cy.get('[data-id="autoupdate-plugins-toggle"]').click(); + cy.wait(100); + cy.get('[data-id="autoupdate-plugins-toggle"]').should('have.attr', 'aria-checked').and('include', 'false'); + cy.get('.nfd-notifications') + .contains('p', 'Disabled Plugins auto-update') + .should('be.visible'); + cy.get('[data-id="autoupdate-all-toggle"]').should('have.attr', 'aria-checked').and('include', 'false'); + }); - cy.get('.autoupdate-plugin-toggle input[type="checkbox"]').check(); - cy.get('.autoupdate-core-toggle input[type="checkbox"]').check(); + it('Themes toggle works', () => { + cy.get('[data-id="autoupdate-themes-toggle"]').should('not.be.disabled').should('have.attr', 'aria-checked').and('include', 'true'); + cy.get('[data-id="autoupdate-themes-toggle"]').click(); cy.wait(100); - cy.get('.autoupdate-all-toggle input[type="checkbox"]').should('be.checked'); - cy - .get('.wppw-app-snackbar') - .contains('.components-snackbar__content', 'update') + cy.get('[data-id="autoupdate-themes-toggle"]').should('have.attr', 'aria-checked').and('include', 'false'); + cy.get('.nfd-notifications') + .contains('p', 'Disabled Themes auto-update') .should('be.visible'); + cy.get('[data-id="autoupdate-all-toggle"]').should('have.attr', 'aria-checked').and('include', 'false'); + }); + it('All toggle activates all', () => { + cy.get('[data-id="autoupdate-all-toggle"]').click(); + cy.wait(100); + cy.get('[data-id="autoupdate-all-toggle"]').should('have.attr', 'aria-checked').and('include', 'true'); + cy.get('[data-id="autoupdate-core-toggle"]').should('be.disabled').should('have.attr', 'aria-checked').and('include', 'true'); + cy.get('[data-id="autoupdate-plugins-toggle"]').should('be.disabled').should('have.attr', 'aria-checked').and('include', 'true'); + cy.get('[data-id="autoupdate-themes-toggle"]').should('be.disabled').should('have.attr', 'aria-checked').and('include', 'true'); + }); + + it('Disabling All toggle returns to previous state', () => { + cy.get('[data-id="autoupdate-all-toggle"]').click(); + cy.wait(100); + cy.get('.nfd-notifications') + .contains('p', 'Disabled All auto-updates') + .should('be.visible'); + cy.get('[data-id="autoupdate-all-toggle"]').should('have.attr', 'aria-checked').and('include', 'false'); + cy.get('[data-id="autoupdate-core-toggle"]').should('not.be.disabled').should('have.attr', 'aria-checked').and('include', 'false'); + cy.get('[data-id="autoupdate-plugins-toggle"]').should('not.be.disabled').should('have.attr', 'aria-checked').and('include', 'false'); + cy.get('[data-id="autoupdate-themes-toggle"]').should('not.be.disabled').should('have.attr', 'aria-checked').and('include', 'false'); + }); + + it('All Toggle takes over again when all are enabled', () => { + cy.get('[data-id="autoupdate-core-toggle"]').click(); + cy.get('[data-id="autoupdate-plugins-toggle"]').click(); + cy.get('[data-id="autoupdate-themes-toggle"]').click(); + cy.wait(100); + cy.get('[data-id="autoupdate-all-toggle"]').should('have.attr', 'aria-checked').and('include', 'true'); + cy.get('[data-id="autoupdate-core-toggle"]').should('be.disabled').should('have.attr', 'aria-checked').and('include', 'true'); + cy.get('[data-id="autoupdate-plugins-toggle"]').should('be.disabled').should('have.attr', 'aria-checked').and('include', 'true'); + cy.get('[data-id="autoupdate-themes-toggle"]').should('be.disabled').should('have.attr', 'aria-checked').and('include', 'true'); }); it('Content Settings Work', () => { - cy.get('.content-revisions-select select').select('20'); - cy.get('.content-revisions-select select').select('1'); - cy - .get('.content-revisions-select label') - .scrollIntoView() - .contains('strong', '1') + cy.get('[data-id="content-revisions-select"]').click(); + cy.wait(100); + cy.get('[data-id="content-revisions-select"]') + .parent() + .next('ul.nfd-select__options') + .find('li:first') + .click(); // 1 + cy.wait(100); + cy.get('#content-revisions-select__description') + .contains('you can take 1 step back.') .should('be.visible'); - cy - .get('.content-revisions-setting .components-base-control__help') + + cy.get('[data-id="content-revisions-select"]').click(); + cy.wait(1000); + cy.get('[data-id="content-revisions-select"]') + .parent() + .next('ul.nfd-select__options') + .find('li:last') + .click(); // 40 + cy.wait(100); + cy.get('#content-revisions-select__description') + .contains('you can take 40 steps back.') .should('be.visible'); - cy.get('.content-revisions-select select').select('40'); - cy.get('.content-revisions-select label').contains('span', '40').should('be.visible'); + cy.get('[data-id="content-revisions-select"]').click(); + cy.wait(500); + cy.get('[data-id="content-revisions-select"]') + .parent() + .next('ul.nfd-select__options') + .find('li:nth-child(2)') + .click(); // 5 + cy.get('#content-revisions-select__description') + .contains('you can take 5 steps back.') + .should('be.visible'); + + // Empty Trash Setting + cy.get('[data-id="empty-trash-select"]').click(); + cy.wait(500); + cy.get('[data-id="empty-trash-select"]') + .parent() + .next('ul.nfd-select__options') + .find('li:nth-child(2)') + .click(); // 2 cy.wait(100); - cy - .get('.wppw-app-snackbar') - .contains('.components-snackbar__content', 'revision') + cy.get('#empty-trash-select__description') + .contains('The trash will automatically empty every 2 weeks.') + .should('be.visible'); + + cy.get('[data-id="empty-trash-select"]').click(); + cy.wait(500); + cy.get('[data-id="empty-trash-select"]') + .parent() + .next('ul.nfd-select__options') + .find('li:last') + .click(); // 4 + cy.wait(100); + cy.get('#empty-trash-select__description') + .contains('The trash will automatically empty every 4 weeks.') .should('be.visible'); }); it('Comment Settings Work', () => { - cy.get('.disable-comments-toggle input[type="checkbox"]').uncheck(); - cy.get('.close-comments-days-select select').should('not.exist'); - cy.get('.disable-comments-toggle input[type="checkbox"]').check(); + cy.get('[data-id="comments-per-page-select"]').click(); + cy.wait(500); + cy.get('[data-id="comments-per-page-select"]') + .parent() + .next('ul.nfd-select__options') + .find('li:first') + .click(); // 10 + cy.wait(100); + cy.get('.wppw-app-settings-comments') + .contains('label', 'Display 10 comments per page.') + .should('be.visible'); + + cy.get('[data-id="disable-comments-toggle"]').should('have.attr', 'aria-checked').and('include', 'false'); + cy.get('[data-id="close-comments-days-select"]').should('be.disabled'); + cy.get('[data-id="disable-comments-toggle"]').click(); + cy.wait(100); - cy.get('.close-comments-days-select select').should('not.be.disabled'); - cy.get('.close-comments-days-select select').select('3'); - cy.get('.close-comments-days-select label').contains('span', '3').should('be.visible'); + cy.get('[data-id="disable-comments-toggle"]').should('have.attr', 'aria-checked').and('include', 'true'); + cy.get('[data-id="close-comments-days-select"]').should('not.be.disabled'); - cy.get('.comments-per-page-select select').select('10'); - cy.get('.comments-per-page-select label').contains('span', '10').should('be.visible'); + // Close comments after days + cy.get('[data-id="close-comments-days-select"]').click(); cy.wait(100); - cy - .get('.wppw-app-snackbar') - .contains('.components-snackbar__content', 'Comments') + cy.get('[data-id="close-comments-days-select"]') + .parent() + .next('ul.nfd-select__options') + .find('li:last') + .click(); // 100 + cy.wait(100); + cy.get('.wppw-app-settings-comments') + .contains('label', 'Close comments after 100 days.') .should('be.visible'); + + cy.get('[data-id="close-comments-days-select"]').click(); + cy.wait(100); + cy.get('[data-id="close-comments-days-select"]') + .parent() + .next('ul.nfd-select__options') + .find('li:nth-child(6)') + .click(); // 14 + cy.wait(100); + cy.get('.wppw-app-settings-comments') + .contains('label', 'Close comments after 14 days.') + .should('be.visible'); + + cy.get('[data-id="disable-comments-toggle"]').click(); + cy.wait(100); + cy.get('[data-id="disable-comments-toggle"]').should('have.attr', 'aria-checked').and('include', 'false'); + cy.get('[data-id="close-comments-days-select"]').should('be.disabled'); }); -}); +}); \ No newline at end of file diff --git a/tests/cypress/support/commands.js b/tests/cypress/support/commands.js index 4d7a52a..119a57d 100644 --- a/tests/cypress/support/commands.js +++ b/tests/cypress/support/commands.js @@ -59,3 +59,31 @@ Cypress.Commands.add('logout', () => { } ); }); + +// Print cypress-axe violations to the terminal +function printAccessibilityViolations(violations) { + cy.task( + 'log', + `${violations.length} accessibility violation${ + violations.length === 1 ? '' : 's' + } ${violations.length === 1 ? 'was' : 'were'} detected` + ) + // pluck specific keys to keep the table readable + const violationData = violations.map( + ({ id, impact, description, nodes }) => ({ + id, + impact, + description, + nodes: nodes.length + }) + ) + + cy.task('table', violationData) +} + +Cypress.Commands.add( + 'a11y', + (context) => { + cy.checkA11y(context, null, printAccessibilityViolations, false); + }, +); \ No newline at end of file diff --git a/wp-plugin-web.php b/wp-plugin-web.php index a0228d6..b691233 100644 --- a/wp-plugin-web.php +++ b/wp-plugin-web.php @@ -12,10 +12,10 @@ * Plugin URI: https://web.com * Update URI: https://github.com/newfold-labs/wp-plugin-web/ * Description: WordPress plugin that integrates a WordPress site with the Web.com control panel, including performance, security, and update features. - * Version: 1.3.0 + * Version: 2.0.0 * Requires at least: 4.7 * Requires PHP: 5.6 - * Tested up to: 6.3.2 + * Tested up to: 6.4.1 * Author: Web.com * Author URI: https://web.com * Text Domain: wp-plugin-web @@ -32,7 +32,7 @@ } // Define constants -define( 'WEB_PLUGIN_VERSION', '1.3.0' ); +define( 'WEB_PLUGIN_VERSION', '2.0.0' ); define( 'WEB_PLUGIN_FILE', __FILE__ ); define( 'WEB_PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); define( 'WEB_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); From 3e4767d0231455872cb5bf03bcb2a4a3891a606d Mon Sep 17 00:00:00 2001 From: Evan Mullins Date: Tue, 14 Nov 2023 15:34:40 -0500 Subject: [PATCH 2/2] remove legacy performance code --- bootstrap.php | 1 - inc/performance.php | 136 -------------------------------------------- 2 files changed, 137 deletions(-) delete mode 100644 inc/performance.php diff --git a/bootstrap.php b/bootstrap.php index 07172d7..8617247 100644 --- a/bootstrap.php +++ b/bootstrap.php @@ -136,7 +136,6 @@ function() { require WEB_PLUGIN_DIR . '/inc/base.php'; require WEB_PLUGIN_DIR . '/inc/jetpack.php'; require WEB_PLUGIN_DIR . '/inc/partners.php'; -require WEB_PLUGIN_DIR . '/inc/performance.php'; require WEB_PLUGIN_DIR . '/inc/RestApi/CachingController.php'; require WEB_PLUGIN_DIR . '/inc/RestApi/SettingsController.php'; require WEB_PLUGIN_DIR . '/inc/RestApi/rest-api.php'; diff --git a/inc/performance.php b/inc/performance.php deleted file mode 100644 index 67e86df..0000000 --- a/inc/performance.php +++ /dev/null @@ -1,136 +0,0 @@ - 'success', - 'message' => 'Cache level updated successfully.', - ); - } else { - $response = array( - 'status' => 'error', - 'message' => 'Unable to update cache level.', - ); - } - } else { - $response = array( - 'status' => 'error', - 'message' => 'Unable to add cache plugin.', - ); - } - - echo wp_json_encode( $response ); - } - die; -} -add_action( 'wp_ajax_mm_cache', __NAMESPACE__ . '\\mojo_cache_toggle' ); - -/** - * Callback for adding caching MU plugins. - * - * @param string|null $type - Type of caching - * @return array - */ -function mojo_cache_add( $type = null ) { - $cache = array(); - if ( ! is_dir( WP_CONTENT_DIR . '/mu-plugins' ) ) { - mkdir( WP_CONTENT_DIR . '/mu-plugins' ); - } - switch ( $type ) { - case 'page': - $cache['code'] = 'https://raw.githubusercontent.com/bluehost/endurance-page-cache/production/endurance-page-cache.php'; - $cache['location'] = WP_CONTENT_DIR . '/mu-plugins/endurance-page-cache.php'; - break; - - case 'object': - if ( class_exists( 'memcached' ) || class_exists( 'memcache' ) ) { - $response = array( - 'status' => 'error', - 'message' => 'Object cache coming soon.', - ); - } else { - $response = array( - 'status' => 'error', - 'message' => 'Object cache not available on your hosting plan.', - ); - } - break; - } - if ( isset( $cache['code'] ) && isset( $cache['location'] ) ) { - $request = wp_remote_get( $cache['code'] ); - if ( ! is_wp_error( $request ) ) { - file_put_contents( $cache['location'], $request['body'] ); // phpcs:ignore - if ( file_exists( $cache['location'] ) ) { - $response = array( - 'status' => 'success', - 'message' => ucfirst( $type ) . ' cache added successfully.', - ); - } - } - } - - if ( ! isset( $response ) ) { - $response = array( - 'status' => 'error', - 'message' => 'Unable to add ' . ucfirst( $type ) . ' cache.', - ); - } - return $response; - -} - -/** - * Callback for removing caching MU plugins. - * - * @param string|null $type - Type of caching - * @return array - */ -function mojo_cache_remove( $type = null ) { - switch ( $type ) { - case 'browser': - // do not remove cache file since it powers both types and the CDN. - break; - case 'page': - // do not remove cache file since it powers both types and the CDN. - break; - case 'object': - $file = WP_CONTENT_DIR . '/object-cache.php'; - break; - } - if ( file_exists( $file ) ) { - if ( unlink( $file ) ) { - $response = array( - 'status' => 'success', - 'message' => ucfirst( $type ) . ' cache removed successfully.', - ); - } else { - $response = array( - 'status' => 'error', - 'message' => 'Could not remove cache file.', - ); - } - } else { - $response = array( - 'status' => 'error', - 'message' => 'Cache file does not exist.', - ); - } - return $response; -} -