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 bcdb08b..0000000 Binary files a/src/app/images/section-settings-and-perf.png and /dev/null differ diff --git a/src/app/images/section-web-content.png b/src/app/images/section-web-content.png deleted file mode 100644 index e5a042e..0000000 Binary files a/src/app/images/section-web-content.png and /dev/null differ diff --git a/src/app/images/section-web-hosting.png b/src/app/images/section-web-hosting.png deleted file mode 100644 index a397b7d..0000000 Binary files a/src/app/images/section-web-hosting.png and /dev/null differ diff --git a/src/app/images/star-gray.jpg b/src/app/images/star-gray.jpg deleted file mode 100644 index 8f73f29..0000000 Binary files a/src/app/images/star-gray.jpg and /dev/null differ 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__ ) );