From e020018008b0dbd33ba8530a5f33904c2086d1ae Mon Sep 17 00:00:00 2001 From: Yakir Sitbon Date: Sun, 23 Jul 2023 13:38:23 +0300 Subject: [PATCH 001/292] Bump WP version --- readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.txt b/readme.txt index 523c5a37..1d8623f9 100644 --- a/readme.txt +++ b/readme.txt @@ -2,7 +2,7 @@ Contributors: pojo.me, KingYes, ariel.k, jzaltzberg, bainternet Tags: Accessibility, A11y, Toolbar, Tools, wcag, accessible Requires at least: 4.1 -Tested up to: 6.1 +Tested up to: 6.3 Requires PHP: 5.4 Stable tag: 2.1.0 License: GPLv2 or later From ae23a192da6f90e66c6a66d6d847156678bd82ca Mon Sep 17 00:00:00 2001 From: Raz Ohad Date: Tue, 5 Nov 2024 19:06:44 +0700 Subject: [PATCH 002/292] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Initial=20Refactor?= =?UTF-8?q?=20commit=20[APP-687]=20(#109)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Initial refactor commit * ✅ Added build and tests CI/CD * PR Rejects * Rejects leftover --- .build-rsync-exclude | 33 + .eslintignore | 10 + .eslintrc | 52 ++ .github/checkstyle-problem-matcher.json | 23 + .github/scripts/publish-to-wordpress-org.sh | 65 ++ .github/scripts/update-version-in-files.js | 65 ++ .github/scripts/validate-build-files.sh | 49 ++ .github/workflows/build.yml | 92 +++ .github/workflows/js-ci.yml | 45 ++ .github/workflows/php-coding-standards.yml | 55 ++ .github/workflows/phpunit.yml | 146 ++++ .gitignore | 8 + .jshintrc | 16 - .travis.yml | 35 - Gruntfile.js | 297 -------- classes/database/database-constants.php | 73 ++ classes/database/entry.php | 386 ++++++++++ .../exceptions/missing-table-exception.php | 18 + classes/database/table.php | 574 +++++++++++++++ classes/logger.php | 37 + classes/module-base.php | 267 +++++++ classes/rest/route.php | 387 ++++++++++ classes/utils.php | 37 + classes/utils/assets.php | 144 ++++ composer.json | 43 +- includes/manager.php | 57 ++ includes/pojo-a11y-settings.php | 645 ----------------- .../legacy/assets}/css/style.css | 0 .../legacy/assets}/css/style.min.css | 0 .../legacy/assets}/js/app.dev.js | 0 .../legacy/assets}/js/app.min.js | 0 .../legacy/assets}/js/skip-link-focus-fix.js | 0 .../legacy/assets}/less/_background.less | 0 .../legacy/assets}/less/_high-contrast.less | 0 .../legacy/assets}/less/_mixing.less | 0 .../legacy/assets}/less/_toolbar.less | 0 .../legacy/assets}/less/_underline.less | 0 .../legacy/assets}/less/_visibility.less | 0 .../legacy/assets}/less/style.less | 0 .../legacy/components/admin.php | 24 +- .../legacy/components/customizer.php | 308 ++++---- .../legacy/components/elementor.php | 11 +- .../legacy/components/frontend.php | 112 +-- modules/legacy/components/settings.php | 671 ++++++++++++++++++ modules/legacy/module.php | 67 ++ package.json | 54 +- phpunit.xml.dist | 43 ++ plugin.php | 111 +++ pojo-accessibility.php | 100 +-- ruleset.xml | 54 ++ tests/bootstrap.php | 54 +- tests/phpunit/helpers/functions.php | 8 + tests/phpunit/helpers/module-test-base.php | 77 ++ tests/phpunit/helpers/route-test.php | 31 + tests/phpunit/helpers/test-base.php | 40 ++ .../plugin/modules/legacy/module-test.php | 20 + tests/test-base.php | 13 - webpack.config.js | 20 + 58 files changed, 4147 insertions(+), 1330 deletions(-) create mode 100644 .build-rsync-exclude create mode 100644 .eslintignore create mode 100644 .eslintrc create mode 100644 .github/checkstyle-problem-matcher.json create mode 100644 .github/scripts/publish-to-wordpress-org.sh create mode 100644 .github/scripts/update-version-in-files.js create mode 100644 .github/scripts/validate-build-files.sh create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/js-ci.yml create mode 100644 .github/workflows/php-coding-standards.yml create mode 100644 .github/workflows/phpunit.yml delete mode 100755 .jshintrc delete mode 100644 .travis.yml delete mode 100644 Gruntfile.js create mode 100644 classes/database/database-constants.php create mode 100644 classes/database/entry.php create mode 100644 classes/database/exceptions/missing-table-exception.php create mode 100644 classes/database/table.php create mode 100644 classes/logger.php create mode 100644 classes/module-base.php create mode 100644 classes/rest/route.php create mode 100644 classes/utils.php create mode 100644 classes/utils/assets.php create mode 100644 includes/manager.php delete mode 100644 includes/pojo-a11y-settings.php rename {assets => modules/legacy/assets}/css/style.css (100%) rename {assets => modules/legacy/assets}/css/style.min.css (100%) rename {assets => modules/legacy/assets}/js/app.dev.js (100%) rename {assets => modules/legacy/assets}/js/app.min.js (100%) rename {assets => modules/legacy/assets}/js/skip-link-focus-fix.js (100%) rename {assets => modules/legacy/assets}/less/_background.less (100%) rename {assets => modules/legacy/assets}/less/_high-contrast.less (100%) rename {assets => modules/legacy/assets}/less/_mixing.less (100%) rename {assets => modules/legacy/assets}/less/_toolbar.less (100%) rename {assets => modules/legacy/assets}/less/_underline.less (100%) rename {assets => modules/legacy/assets}/less/_visibility.less (100%) rename {assets => modules/legacy/assets}/less/style.less (100%) rename includes/pojo-a11y-admin-ui.php => modules/legacy/components/admin.php (93%) rename includes/pojo-a11y-customizer.php => modules/legacy/components/customizer.php (50%) rename includes/pojo-a11y-elementor.php => modules/legacy/components/elementor.php (66%) rename includes/pojo-a11y-frontend.php => modules/legacy/components/frontend.php (89%) create mode 100644 modules/legacy/components/settings.php create mode 100644 modules/legacy/module.php create mode 100644 phpunit.xml.dist create mode 100644 plugin.php create mode 100644 ruleset.xml mode change 100755 => 100644 tests/bootstrap.php create mode 100644 tests/phpunit/helpers/functions.php create mode 100644 tests/phpunit/helpers/module-test-base.php create mode 100644 tests/phpunit/helpers/route-test.php create mode 100644 tests/phpunit/helpers/test-base.php create mode 100644 tests/phpunit/plugin/modules/legacy/module-test.php delete mode 100755 tests/test-base.php create mode 100644 webpack.config.js diff --git a/.build-rsync-exclude b/.build-rsync-exclude new file mode 100644 index 00000000..5a087443 --- /dev/null +++ b/.build-rsync-exclude @@ -0,0 +1,33 @@ +.bpg.json +.babelrc +ruleset.xml +webpack.config.js +phpunit.xml.dist +.DS_Store +node_modules/ +.git +.gitignore +.gitmodules +.github/ +.editorconfig +.gitattributes +.eslintrc +.eslintignore +.phpcs.xml.dist +.phpunit.xml.d +coverage/ +assets/dev/ +.phpunit.result* +bin/ +tests/ +package.json +composer.json +composer.lock +package-lock.json +jest.config.js + +.build-rsync-exclude +one-click-accessibility/ +one-click-accessibility.zip +.svn-assets/ +.husky/ diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..9184afc5 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,10 @@ +assets/lib/**/*.js +assets/js/*.js +**/*.min.js +**/node_modules/** +**/vendor/** +build/** +libraries/** +coverage/** +assets/build/** +tests/** diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 00000000..bd2111c7 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,52 @@ +{ + "extends": [ + "plugin:react/recommended", + "plugin:@wordpress/eslint-plugin/recommended-with-formatting", + "plugin:import/recommended", + "plugin:jsx-a11y/strict" + ], + "plugins": [ + "babel", + "react" + ], + "env": { + "browser": true, + "node": true, + "es6": true, + "jquery": true + }, + "globals": { + "jQuery": "writable" + }, + "parserOptions": { + "ecmaVersion": 8, + "sourceType": "module", + "requireConfigFile": false + }, + "rules": { + "no-console": "off", + "react-hooks/exhaustive-deps": "off", + "strict": [ "error", "global" ], + "curly": "warn", + "import/order": [ + "error", + { + "groups": [ + "builtin", + "external", + "internal", + "parent", + "sibling", + "index", + "object", + "type" + ], + "alphabetize": { + "order": "asc", + "caseInsensitive": false + } + } + ] + }, + "parser": "@babel/eslint-parser" +} diff --git a/.github/checkstyle-problem-matcher.json b/.github/checkstyle-problem-matcher.json new file mode 100644 index 00000000..5c6ce669 --- /dev/null +++ b/.github/checkstyle-problem-matcher.json @@ -0,0 +1,23 @@ +{ + "problemMatcher": [ + { + "owner": "phpcs", + "severity": "error", + "pattern": [ + { + "regexp": "^$", + "file": 1 + }, + { + "regexp": "+)$", + "line": 1, + "column": 2, + "severity": 3, + "message": 4, + "code": 5, + "loop": true + } + ] + } + ] +} diff --git a/.github/scripts/publish-to-wordpress-org.sh b/.github/scripts/publish-to-wordpress-org.sh new file mode 100644 index 00000000..dcbed84f --- /dev/null +++ b/.github/scripts/publish-to-wordpress-org.sh @@ -0,0 +1,65 @@ +#!/bin/bash +set -eo pipefail + +if [[ -z "$SVN_USERNAME" ]]; then + echo "Set the SVN_USERNAME secret" + exit 1 +fi + +if [[ -z "$SVN_PASSWORD" ]]; then + echo "Set the SVN_PASSWORD secret" + exit 1 +fi + +if [[ -z "$PLUGIN_VERSION" ]]; then + echo "Set the PLUGIN_VERSION env var" + exit 1 +fi + +if [[ -z "$PLUGIN_SLUG" ]]; then + echo "Set the PLUGIN_SLUG env var" + exit 1 +fi + +echo "Publish version: ${PLUGIN_VERSION}" + +PLUGIN_PATH="$GITHUB_WORKSPACE/${PLUGIN_SLUG}" +SVN_PATH="$GITHUB_WORKSPACE/svn" + +cd $PLUGIN_PATH +mkdir -p $SVN_PATH +cd $SVN_PATH + +echo "Checkout from SVN" +svn co https://plugins.svn.wordpress.org/${PLUGIN_SLUG}/trunk + +echo "Clean trunk folder" +cd $SVN_PATH/trunk +find . -maxdepth 1 -not -name ".svn" -not -name "." -not -name ".." -exec rm -rf {} + + +echo "Copy files" +rsync -ah --progress $PLUGIN_PATH/* $SVN_PATH/trunk + +echo "Preparing files" +cd $SVN_PATH/trunk + +echo "svn delete" +svn status | grep -v '^.[ \t]*\\..*' | { grep '^!' || true; } | awk '{print $2}' | xargs -r svn delete; + +echo "svn add" +svn status | grep -v '^.[ \t]*\\..*' | { grep '^?' || true; } | awk '{print $2}' | xargs -r svn add; + +svn status + +echo "Commit files to trunk" +svn ci -m "Upload v${PLUGIN_VERSION}" --no-auth-cache --non-interactive --username "$SVN_USERNAME" --password "$SVN_PASSWORD" + +echo "Copy files from trunk to tag ${PLUGIN_VERSION}" +svn cp https://plugins.svn.wordpress.org/${PLUGIN_SLUG}/trunk https://plugins.svn.wordpress.org/${PLUGIN_SLUG}/tags/${PLUGIN_VERSION} --message "Tagged ${PLUGIN_VERSION}" --no-auth-cache --non-interactive --username "$SVN_USERNAME" --password "$SVN_PASSWORD" +svn update + +echo "Remove the SVN folder from the workspace (for multiple releases in the same Action)" +#rm -rf $SVN_PATH + +echo "Back to the workspace root" +cd $GITHUB_WORKSPACE diff --git a/.github/scripts/update-version-in-files.js b/.github/scripts/update-version-in-files.js new file mode 100644 index 00000000..4d816d74 --- /dev/null +++ b/.github/scripts/update-version-in-files.js @@ -0,0 +1,65 @@ +'use strict'; + +const fs = require( "fs" ); +const MAIN_FILE_NAME = 'pojo-accessibility.php'; +const VERSION_CONSTANT = 'EA11Y_VERSION'; + +const { VERSION } = process.env; + if ( ! VERSION ) { + throw new Error( 'VERSION is not defined in the environment variables.' ); +} + +async function replaceInFileWithArray( filePath, replacementArray ) { + try { + let content = fs.readFileSync( filePath, { encoding: 'utf8' } ); + + for ( const replacement of replacementArray ) { + console.log( `Replacing ${ replacement.from } with ${ replacement.to } in ${ filePath }` ); + content = content.replace( replacement.from, replacement.to ); + } + console.log( content ); + //fs.writeFileSync( filePath, content, { encoding: 'utf8' } ); + console.log( `All replacements in ${ filePath } were successful.`); + } catch (error) { + console.error( `An error occurred in ${ filePath }:`, error ); + } +} + +const run = async () => { + try { + // update stable tag in readme.txt + await replaceInFileWithArray( './readme.txt', + [ + { + from: /Stable tag: (.*)/m, + to: `Stable tag: ${ VERSION }`, + }, + { + from: /= NEXT_VERSION =/m, + to: `= ${ VERSION } =`, + }, + ] + ); + + // update version in MAIN_FILE_NAME + await replaceInFileWithArray( `./${MAIN_FILE_NAME}`, + [ + { + from: /\* Version: (.*)/m, + to: `* Version: ${ VERSION }`, + }, + { + from: new RegExp(`define\\( '${VERSION_CONSTANT}', '(.*)' \\);`, 'm' ), + to: `define( '${VERSION_CONSTANT}', '${VERSION}' );`, + } + ] + ); + + } catch ( err ) { + // eslint-disable-next-line no-console + console.error( 'Error occurred:', err ); + process.exit( 1 ); + } +}; + +run(); diff --git a/.github/scripts/validate-build-files.sh b/.github/scripts/validate-build-files.sh new file mode 100644 index 00000000..31fb621e --- /dev/null +++ b/.github/scripts/validate-build-files.sh @@ -0,0 +1,49 @@ +#!/bin/bash +set -eo pipefail + +if [[ -z "$PLUGIN_SLUG" ]]; then + echo "Set the PLUGIN_SLUG env var" + exit 1 +fi + +if [[ -z "$PLUGIN_VERSION" ]]; then + echo "Set the PLUGIN_VERSION env var" + exit 1 +fi + +PLUGIN_PATH="$GITHUB_WORKSPACE/${PLUGIN_SLUG}" + +cd $PLUGIN_PATH + +PLUGIN_MAIN_FILE="${PLUGIN_SLUG}.php" + +if [ ! -f "${PLUGIN_MAIN_FILE}" ]; then + echo "${PLUGIN_MAIN_FILE} file does not exist" + exit 1 +fi + +if [ ! -f "readme.txt" ]; then + echo "readme.txt file does not exist" + exit 1 +fi + +if [[ $(grep -c "Version: $PLUGIN_VERSION" "$PLUGIN_MAIN_FILE") -eq 0 ]]; then + echo "${PLUGIN_MAIN_FILE} file does not contain the correct build version : $PLUGIN_VERSION" + EXISTING_VERSION=$(sed -n 's/.*Version: \(.*\)/\1/p' "$PLUGIN_MAIN_FILE") + echo "Existing version: $EXISTING_VERSION" + exit 1 +fi + +if [[ $(grep -c "Stable tag: $PLUGIN_VERSION" "readme.txt") -eq 0 ]]; then + echo "readme.txt file does not contain the correct stable tag version : $PLUGIN_VERSION" + EXISTING_VERSION=$(sed -n 's/.*Stable tag: \(.*\)/\1/p' "readme.txt") + echo "Existing version: $EXISTING_VERSION" + exit 1 +fi + +echo "validate-build-files Details:" +echo "---" +echo "SVN Tag name: $PLUGIN_VERSION" +echo "Package Version: $PACKAGE_VERSION" +echo "Trunk Files:" +ls -la diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..bfe9bf8f --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,92 @@ +name: Build +on: + pull_request: + workflow_call: + workflow_dispatch: + inputs: + push_to_slack: + description: 'Push to Slack' + type: boolean + required: true + default: 'false' + +concurrency: + cancel-in-progress: true + group: ${{ github.workflow }}-${{ github.ref }} + +permissions: + contents: read + +jobs: + build: + name: Build + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up PHP + uses: shivammathur/setup-php@a36e1e52ff4a1c9e9c9be31551ee4712a6cb6bd0 # 2.27.1 + with: + php-version: '7.4' + env: + fail-fast: 'true' + + - name: OAuth Composer Authentication + run: + composer config -g github-oauth.github.com ${{ secrets.DEVOPS_TOKEN }} + + - name: Install Composer dependencies cache + uses: ramsey/composer-install@v2 + + - name: Install Composer dependencies + run: + composer install --no-dev + + - name: Get current date + id: date + run: echo "::set-output name=date::$(date +'%Y-%m-%d')" + + - name: "Debug info: show tooling versions" + continue-on-error: true + run: | + set +e + echo "Start debug Info" + echo "Date: ${{ steps.date.outputs.date }}" + echo "PHP Version: $(php -v)" + echo "Composer Version: $(composer --version)" + echo "Node Version: $(node --version)" + echo "NPM Version: $(npm --version)" + echo "GIT Version: $(git --version)" + echo "The github context is:" + echo "${{ toJson(github) }}" + echo "End debug Info" + echo "exitcode=$?" >> $GITHUB_OUTPUT + + - name: Install dependencies + run: npm ci + + - name: Build + run: npm run build + + - name: Build Plugin + run: | + rsync -av --exclude-from=.build-rsync-exclude . one-click-accessibility + zip -r one-click-accessibility.zip one-click-accessibility + + - name: Archive + uses: actions/upload-artifact@v4 + with: + name: one-click-accessibility + path: one-click-accessibility.zip + retention-days: 14 + + - name: Push to Slack on PR merge + if: ${{ github.event.pull_request.merged == true }} + run: | + curl -F file=@one-click-accessibility.zip -F "initial_comment=One Click Accessibility - A new PR has been pushed to the master branch by ${{ github.actor }}." title="${{ github.event.pull_request.title }}" -F channels=C07LFCFNGDB -H "Authorization: Bearer ${{ secrets.CLOUD_SLACK_BOT_TOKEN }}" https://slack.com/api/files.upload + + - name: Push to Slack on Manual Trigger + if: ${{ github.event.inputs.push_to_slack == 'true' }} + run: | + curl -F file=@one-click-accessibility.zip -F "initial_comment=One Click Accessibility - A new build was triggered by ${{ github.actor }}." title="Manuall ${{ steps.date.outputs.date }}" -F channels=C07LFCFNGDB -H "Authorization: Bearer ${{ secrets.CLOUD_SLACK_BOT_TOKEN }}" https://slack.com/api/files.upload diff --git a/.github/workflows/js-ci.yml b/.github/workflows/js-ci.yml new file mode 100644 index 00000000..efcf141b --- /dev/null +++ b/.github/workflows/js-ci.yml @@ -0,0 +1,45 @@ +name: NPM CI + +on: + push: + branches: + - main + pull_request: + workflow_dispatch: + +concurrency: + cancel-in-progress: true + group: ${{ github.workflow }}-${{ github.ref }} + +env: + token: ${{ secrets.CLOUD_DEVOPS_TOKEN }} + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [18.x] + + steps: + - uses: actions/checkout@v2 + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + cache-dependency-path: package-lock.json + + - name: Install Dependencies + run: npm ci + + - name: Build + run: npm run build + + - name: Lint + run: npm run lint:js + +# - name: Test +# run: npm run test diff --git a/.github/workflows/php-coding-standards.yml b/.github/workflows/php-coding-standards.yml new file mode 100644 index 00000000..26a91dc4 --- /dev/null +++ b/.github/workflows/php-coding-standards.yml @@ -0,0 +1,55 @@ +name: PHP Lint + +on: + push: + branches: + - main + pull_request: + workflow_dispatch: + +concurrency: + cancel-in-progress: true + group: ${{ github.workflow }}-${{ github.ref }} + +permissions: + contents: read + +jobs: + PHP-Code-Standards: + name: Lint PHP files + runs-on: ubuntu-latest + if: "!contains(github.event.head_commit.message, '[skip PHPCS]') || !contains(github.event.head_commit.message, '[skip CI]')" + steps: + - name: Check out source code + uses: actions/checkout@v4 + + - name: Set up PHP + uses: shivammathur/setup-php@a36e1e52ff4a1c9e9c9be31551ee4712a6cb6bd0 # 2.27.1 + with: + php-version: '7.4' + coverage: none + tools: composer, cs2pr, phpcs + env: + fail-fast: 'true' + + - name: Log debug information + run: | + export PATH=$HOME/.composer/vendor/bin:$PATH + php --version + phpcs -i + composer --version + + - name: Oauth Composer authentication + run: composer config -g github-oauth.github.com ${{ secrets.DEVOPS_TOKEN }} + + - name: Install dependencies + uses: ramsey/composer-install@83af392bf5f031813d25e6fe4cd626cdba9a2df6 # 2.2.0 + + - name: Add error matcher + run: echo "::add-matcher::$(pwd)/.github/checkstyle-problem-matcher.json" + + - name: Run style check + run: | + export PATH=$HOME/.composer/vendor/bin:$PATH + composer run lint -- --report=checkstyle + diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml new file mode 100644 index 00000000..2f9665c7 --- /dev/null +++ b/.github/workflows/phpunit.yml @@ -0,0 +1,146 @@ +name: PHPUnit + +on: + push: + branches: + - main + pull_request: + workflow_dispatch: + +concurrency: + cancel-in-progress: true + group: ${{ github.workflow }}-${{ github.ref }} + +permissions: + contents: read + +jobs: + unit-tests: + name: "WP ${{ matrix.wp }}, multisite: ${{ matrix.ms }}, PHP: ${{ matrix.php }}" + if: "!contains(github.event.head_commit.message, '[ci skip]')" + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: [7.4, 8.0, 8.1, 8.2] + wp: [6.4.x, latest, nightly] + ms: [no, yes] + coverage: [no] + phpunit: [9] + include: + # PHP 7.4 is not supported by PHPUnit 9 + - phpunit: 7 + php: 7.4 + # add coverage job + - coverage: yes + php: 8.0 + wp: latest + ms: no + phpunit: 9 + + services: + mysql: + image: mariadb:latest + ports: + - "3306:3306" + env: + MYSQL_ROOT_PASSWORD: wordpress + MARIADB_INITDB_SKIP_TZINFO: 1 + MYSQL_USER: wordpress + MYSQL_PASSWORD: wordpress + MYSQL_DATABASE: wordpress_test + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Matrix variables + id: matrix + run: | + echo "::group::Matrix variables" + echo "PHP version = ${{ matrix.php }}" + echo "WordPress = ${{ matrix.wp }}" + echo "Multisite = ${{ matrix.ms }}" + echo "Coverage = ${{ matrix.coverage }}" + echo "PHPUnit = ${{ matrix.phpunit }}" + echo "::endgroup::" + + - name: Decide whether to enable coverage + id: coverage + run: | + if [ "${{ matrix.coverage }}" = "yes" ]; then + echo "coverage=pcov" >> $GITHUB_OUTPUT + echo 'ini=pcov.directory=inc, pcov.exclude="~/(vendor|tests|node_modules)/~"' + else + echo "coverage=none" >> $GITHUB_OUTPUT + echo "ini=opcache.enable_cli=1, opcache.jit=tracing, opcache.jit_buffer_size=64M" >> $GITHUB_OUTPUT + fi + + - name: Set up PHP + uses: shivammathur/setup-php@a36e1e52ff4a1c9e9c9be31551ee4712a6cb6bd0 # 2.27.1 + with: + coverage: ${{ steps.coverage.outputs.coverage }} + ini-values: ${{ steps.coverage.outputs.ini }} + php-version: ${{ matrix.php }} + env: + fail-fast: 'true' + + - name: Install PHPUnit + run: | + wget -q -O /usr/local/bin/phpunit "https://phar.phpunit.de/phpunit-${{ matrix.phpunit }}.phar" + chmod +x /usr/local/bin/phpunit + + - name: Oauth Composer authentication + run: + composer config -g github-oauth.github.com ${{ secrets.DEVOPS_TOKEN }} + + - name: Install dependencies + uses: ramsey/composer-install@83af392bf5f031813d25e6fe4cd626cdba9a2df6 # 2.2.0 + + #- name: Install Node.js + # uses: actions/setup-node@v2 + # with: + # node-version: 18.x + + #- name: Install dependencies + # run: npm ci + + #- name: Build assets + # run: npm run build + + - name: Set up WordPress and WordPress Test Library + uses: sjinks/setup-wordpress-test-library@dd7f8144e892b042e034d713b734f7a19446abe1 # 2.0.1 + with: + version: ${{ matrix.wp }} + + - name: Set up multisite mode + run: echo "WP_MULTISITE=1" >> $GITHUB_ENV + if: matrix.ms == 'yes' + + - name: Update wp-test-config.php + run: | + if php -r 'exit(PHP_VERSION_ID < 80100);'; then + echo "Disabling WP_DEBUG in wp-test-config.php" + sed -i "s@define( 'WP_DEBUG', true );@// define( 'WP_DEBUG', true );@" /tmp/wordpress-tests-lib/wp-tests-config.php + fi + + - name: Verify MariaDB connection + run: | + while ! mysqladmin ping -h 127.0.0.1 -P ${{ job.services.mysql.ports[3306] }} --silent; do + sleep 1 + done + timeout-minutes: 1 + + - name: Run tests + run: | + OPTIONS= + if [ "${{ steps.coverage.outputs.coverage }}" != 'none' ]; then + OPTIONS="$OPTIONS --coverage-clover=clover.xml" + fi + phpunit --order-by=random ${OPTIONS} + + - name: Upload coverage report + uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d # v3.1.4 + with: + files: clover.xml + flags: unittests + if: ${{ steps.coverage.outputs.coverage != 'none' }} diff --git a/.gitignore b/.gitignore index 26b1f11f..4d1728c0 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,11 @@ composer.lock npm-debug.log .DS_Store package-lock.json +bin/.env +*/node_modules +!assets/dev/* +assets/js/ +coverage/ +.phpunit.result.cache +.editorconfig +.vscode diff --git a/.jshintrc b/.jshintrc deleted file mode 100755 index 1164285c..00000000 --- a/.jshintrc +++ /dev/null @@ -1,16 +0,0 @@ -{ - "bitwise": true, - "browser": true, - "curly": true, - "eqeqeq": true, - "eqnull": true, - "esnext": true, - "immed": true, - "jquery": true, - "latedef": true, - "newcap": true, - "noarg": true, - "node": true, - "strict": false, - "trailing": true -} \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 5ab28c59..00000000 --- a/.travis.yml +++ /dev/null @@ -1,35 +0,0 @@ -# Travis CI Configuration File - -sudo: false - -# Tell Travis CI we're using PHP -language: php - -# PHP version used in first build configuration. -php: - - 5.3 - - 5.4 - - 5.5 - - 5.6 - - 7.0 - -# WordPress version used in first build configuration. -env: - - WP_VERSION=latest WP_MULTISITE=0 - - WP_VERSION=latest WP_MULTISITE=1 - - WP_VERSION=4.0 WP_MULTISITE=0 - - WP_VERSION=4.0 WP_MULTISITE=1 - - WP_VERSION=4.1 WP_MULTISITE=0 - - WP_VERSION=4.1 WP_MULTISITE=1 - - WP_VERSION=4.2 WP_MULTISITE=0 - - WP_VERSION=4.2 WP_MULTISITE=1 - - WP_VERSION=4.3 WP_MULTISITE=0 - - WP_VERSION=4.3 WP_MULTISITE=1 - -before_script: - - bash bin/install-wp-tests.sh wordpress_test root '' localhost $WP_VERSION - -after_success: - - bash <(curl -s https://codecov.io/bash) - -script: phpunit --coverage-clover=coverage.xml \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index 6f76dcaf..00000000 --- a/Gruntfile.js +++ /dev/null @@ -1,297 +0,0 @@ -/** - * Pojo Makefile - */ -'use strict'; - -module.exports = function( grunt ) { - - require( 'matchdep' ).filterDev( 'grunt-*' ).forEach( grunt.loadNpmTasks ); - - // Project configuration. - grunt.initConfig( { - pkg: grunt.file.readJSON( 'package.json' ), - - banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' + - '<%= grunt.template.today("dd-mm-yyyy") %> */', - - checktextdomain: { - standard: { - options:{ - text_domain: 'pojo-accessibility', - correct_domain: true, - keywords: [ - // WordPress keywords - '__:1,2d', - '_e:1,2d', - '_x:1,2c,3d', - 'esc_html__:1,2d', - 'esc_html_e:1,2d', - 'esc_html_x:1,2c,3d', - 'esc_attr__:1,2d', - 'esc_attr_e:1,2d', - 'esc_attr_x:1,2c,3d', - '_ex:1,2c,3d', - '_n:1,2,4d', - '_nx:1,2,4c,5d', - '_n_noop:1,2,3d', - '_nx_noop:1,2,3c,4d' - ] - }, - files: [ { - src: [ - '**/*.php', - '!node_modules/**', - '!build/**', - '!tests/**', - '!vendor/**', - '!*~' - ], - expand: true - } ] - } - }, - - usebanner: { - dist: { - options: { - banner: '<%= banner %>' - }, - files: { - src: [ - 'assets/js/app.min.js', - 'assets/css/style.css', - 'assets/css/style.min.css' - ] - } - } - }, - - jshint: { - options: { - jshintrc: '.jshintrc' - }, - all: [ - 'Gruntfile.js', - 'assets/js/skip-link-focus-fix.js', - 'assets/js/app.dev.js' - ] - }, - - uglify: { - options: {}, - dist: { - files: { - 'assets/js/app.min.js': [ - 'assets/js/skip-link-focus-fix.js', - 'assets/js/app.dev.js' - ] - } - } - }, - - less: { - dist: { - options: { - //cleancss: true - }, - files: { - 'assets/css/style.css': 'assets/less/style.less' - } - }, - - mincss: { - options: { - compress: true - }, - files: { - 'assets/css/style.min.css': 'assets/less/style.less' - } - } - }, - - watch: { - js: { - files: [ - '**/*.js', - '!**/*.min.js' - ], - tasks: [ - 'scripts' - ], - options: {} - }, - - less: { - - files: [ - '**/*.less' - ], - tasks: [ - 'styles' - ], - options: {} - } - }, - - bumpup: { - options: { - updateProps: { - pkg: 'package.json' - } - }, - file: 'package.json' - }, - - replace: { - plugin_main: { - src: [ 'pojo-accessibility.php' ], - overwrite: true, - replacements: [ - { - from: /Version: \d{1,1}\.\d{1,2}\.\d{1,2}/g, - to: 'Version: <%= pkg.version %>' - } - ] - }, - - readme: { - src: [ 'readme.txt' ], - overwrite: true, - replacements: [ - { - from: /Stable tag: \d{1,1}\.\d{1,2}\.\d{1,2}/g, - to: 'Stable tag: <%= pkg.version %>' - } - ] - } - }, - - shell: { - git_add_all : { - command: [ - 'git add --all', - 'git commit -m "Bump to <%= pkg.version %>"' - ].join( '&&' ) - } - }, - - release: { - options: { - bump: false, - npm: false, - commit: false, - tagName: 'v<%= version %>', - commitMessage: 'released v<%= version %>', - tagMessage: 'Tagged as v<%= version %>' - } - }, - - wp_readme_to_markdown: { - github: { - options: { - screenshot_url: 'assets/{screenshot}.png', - wordpressPluginSlug: 'pojo-accessibility', - travisUrlRepo: 'https://travis-ci.org/pojome/one-click-accessibility', - gruntDependencyStatusUrl: 'https://david-dm.org/pojome/pojo-accessibility' - }, - files: { - 'README.md': 'readme.txt' - } - } - }, - - copy: { - main: { - src: [ - '**', - '!node_modules/**', - '!build/**', - '!bin/**', - '!.git/**', - '!tests/**', - '!.travis.yml', - '!.jshintrc', - '!README.md', - '!phpunit.xml', - '!vendor/**', - '!Gruntfile.js', - '!package.json', - '!package-lock.json', - '!npm-debug.log', - '!composer.json', - '!composer.lock', - '!assets/less/**', - '!wp-assets/**', - '!.gitignore', - '!.gitmodules', - '!*~' - ], - expand: true, - dest: 'build/' - } - }, - - clean: { - //Clean up build folder - main: [ - 'build' - ] - }, - - wp_deploy: { - deploy:{ - options: { - plugin_slug: '<%= pkg.slug %>', - svn_user: 'KingYes', - build_dir: 'build/', - assets_dir: 'wp-assets/' - } - } - }, - - phpunit: { - classes: { - dir: '' - }, - options: { - bin: 'phpunit', - bootstrap: 'tests/bootstrap.php', - colors: true - } - } - - } ); - - // Default task(s). - grunt.registerTask( 'default', [ - 'checktextdomain', - 'scripts', - 'styles', - 'usebanner', - 'wp_readme_to_markdown', - //'phpunit' - ] ); - - grunt.registerTask( 'build', [ - 'default', - 'clean', - 'copy' - ] ); - - grunt.registerTask( 'scripts', [ - 'jshint', - 'uglify' - ] ); - - grunt.registerTask( 'styles', [ - 'less' - ] ); - - grunt.registerTask( 'publish', [ - 'default', - 'bumpup', - 'replace', - 'shell:git_add_all', - 'release' - ] ); -}; diff --git a/classes/database/database-constants.php b/classes/database/database-constants.php new file mode 100644 index 00000000..1af5f37f --- /dev/null +++ b/classes/database/database-constants.php @@ -0,0 +1,73 @@ + value entries for direct comparison + * joined with the AND logical operator, or in the format of column => [column => + * string, value =>string|int|array, comparison operator => string, + * relation_before=>string, optional, relation_after=>string, optional]. + * + * @return Entry Returns the entry with the data found. + */ + private function init_by( string $by, $value ): Entry { + $data = static::get_by( $by, $value ); + + return $this->init_by_data( $data ); + } + + /** + * get_by + * + * Returns the first row in the table that satisfies the conditions set by the parameters. + * + * @param string $by The name of the field to compare the value parameter to in case the + * /value/ parameter is a string. + * Optional. + * Defaults to an empty string. + * @param array|string $value If a string, the value to compare against the column specified + * by the /by/ parameter. + * If an array, can be either a list of column => value entries for direct comparison + * joined with the AND logical operator, or in the format of column => [column => + * string, value =>string|int|array, comparison operator => string, + * relation_before=>string, optional, relation_after=>string, optional]. Optional. + * Defaults to an empty string. + * + * @return mixed|\stdClass|null An object representing the row or NULL in case of an error. + */ + protected function get_by( string $by = '', $value = '' ) { + $fields = '*'; + $where = is_array( $value ) ? $value : [ $by => $value ]; + + return $this->db_table::first( $fields, $where ); + } + + /** + * init_by_data + * + * Returns an Entry object with its data set to the data passed by the /data/ parameter. + * + * @param array|object $data The data to set the entry with. + * + * @return $this Returns an entry loaded with the data passes in the parameter, or en Empty entry (representing + * null) on error + */ + protected function init_by_data( $data ): Entry { + if ( ! $data || is_wp_error( $data ) ) { + return $this->return_empty(); + } + + return $this->set_data( $data ); + } + + /** + * return_empty + * + * Returns an empty entry project, representing an empty set/null. + * + * NOTE: An empty entry cannot be saved in the database unless you either unset the + * /id/ field or set it for a valid value for an update. + * + * @return Entry Returns the object back + */ + private function return_empty(): Entry { + $this->set_data( [] ); + + return $this->set( 'id', 0 ); + } + + /** + * set_data + * + * Sets the data of this entry object + * + * @param array|object $data The data to set in the current object in the format of key => value + * + * @return $this Returns the object back + */ + public function set_data( $data ): Entry { + $this->entry_data = (array) $data; + + return $this; + } + + /** + * init_by_id + * + * Loads the Entry with data from the database fetched by the /id/ column compared to the value passed with the + * /id/ parameter. + * + * @param string $id The value of the /id/ field + * + * @return $this The Entry loaded with the data gotten from the database by the specified ID. + */ + protected function init_by_id( $id ): Entry { + $data = static::get_by( 'id', $id ); + + return $this->init_by_data( $data ); + } + + /** + * __get + * magic get properties + * + * Returns an Entry's data field by key name + * + * @param string $name The name of the field to return + * + * @return mixed|null The value of the field or null if it doesn't exist' + */ + public function __get( $name ) { + return $this->entry_data[ $name ] ?? null; + } + + /** + * __set + * magic set properties + * + * Sets an Entry's data field value by the specified key + * + * @param string $name The key of the field being set + * @param mixed $value The new value for the field + * + * @return $this Returns the current object back + */ + public function __set( string $name, $value ) { + return $this->set( $name, $value ); + } + + /** + * set + * + * Sets and entry data field value by the specified key + * + * @param string $name The key of the field being set + * @param mixed $value The new value for the field + * + * @return $this Returns the current object back + */ + public function set( string $name, $value ): Entry { + $this->entry_data[ $name ] = $value; + + return $this; + } + + /** + * class_short_name + * + * Returns just the name of the class, without its namespace. Used for hooks. + * Taken from https://coderwall.com/p/cpxxxw/php-get-class-name-without-namespace + * + * NOTE: Called on a class without a namespace will return the name of the class + * without the first letter in the name + * @return string The name of the current class + */ + private function class_short_name(): string { + $class_name = get_called_class(); + + return ( substr( $class_name, strrpos( $class_name, '\\' ) + 1 ) ); + } + + /** + * trigger_change + * + * Raises action hooks following the create, delete and update operations. + * Raises the hook [ea11y/db/class_name>/change]. If the /event/ + * parameter is not null, then it also raises the hook [ea11y/db/class_name/event]. + * + * The parameters sent to both hooks is a reference to the current object and the value of the /data/ parameter. + * + * @param int|bool $data Numbers of rows changed or FALSE on database action failure + * @param string|null $event The name of the custom event hook to raise in addition to the /changed/ event hook + * Optional. + * Defaults to null. In this case, will raise only the defaults /changed/ event. + */ + private function trigger_change( $data, string $event = null ): void { + if ( $event ) { + /** + * event specific + * @var Entry $this + * @var false|int $data + */ + do_action( 'ea11y/db/' . $this->class_short_name() . '/' . $event, $this, $data ); + } + + /** + * entity change + * @var Entry $this + * @var false|int $data + */ + do_action( 'ea11y/db/' . $this->class_short_name() . '/change', $this, $data ); + } + + /** + * save + * + * Writes the entry to the database. + * If the entry has a field called /id/ set, will + * perform an update, if it doesn't, will perform an insert. + * Update and create function triggers the change action hooks and the respective custom event + * @return false|int The number of rows inserted or FALSE on error. + */ + public function save() { + if ( isset( $this->entry_data[ 'id' ] ) ) { + return $this->update( [ 'id' => $this->entry_data[ 'id' ] ] ); + } + + return $this->create(); + } + + + /** + * delete + * + * Delete entries from the table. + * Bases on the field specified by the /by/ parameter and its current value. + * Triggers change action hooks and raises the /delete/ custom event. + * + * @param string $by The field name to delete by. + * Optional. + * Defaults to 'id'. + * + * @return false|int The number of rows deleted or false on error. + */ + public function delete( string $by = 'id' ) { + $results = $this->db_table::delete( [ $by => $this->{$by} ] ); + + $this->trigger_change( $results, 'delete' ); + + return $results; + } + + /** + * update + * + * Updates the database with the data of this entry based on the conditions passed + * by the /where/ parameter. + * Triggers change action hooks and raises the /update/ custom event. + * + * NOTE: If no conditions are supplied, the update is going to be performed on all rows, + * + * @param array $where Array of column => (raw) values as a group of AND WHERE conditionals for the UPDATE + * statement. Optional. Defaults to an empty array. + * + * @return false|int The number of rows updated or false on error. + */ + public function update( array $where = [] ) { + $results = $this->db_table::update( $this->entry_data, $where ); + + $this->trigger_change( $results, 'update' ); + + return $results; + } + + /** + * create + * + * Inserts the entry to the database table. + * Trigger change action hooks and raises the /create/ custom event, + * + * @param string $id On successful insertion, will set the field passes in the /id/ parameter + * ot the value of the last inserted ID as returned from the database. + * Optional. + * Defaults to 'id' + * + * @return false|int The numbers of rows affected or FALSE on error + */ + public function create( string $id = 'id' ) { + $results = $this->db_table::insert( $this->entry_data ); + if ( $results ) { + // Set row id once created + $this->set( $id, $this->db_table::db()->insert_id ); + } + + $this->trigger_change( $results, 'create' ); + + return $results; + } + + /** + * reset + * + * Clears all of this entry's data. + */ + public function reset(): void { + $this->entry_data = []; + } + + /** + * @return bool + */ + public function exists(): bool { + return isset( $this->entry_data['id'] ) && 0 < $this->entry_data['id']; + } + + /** + * DB_Entry_Base constructor. + * Uses the passed on arguments to initialize/set the Entry. + * Will through an exception in case the Entry's table property is not set correctly, and the /Table/ class + * linking this entry to a database table is not found. + * + * @param array $args The arguments to set this Entry by. + * If arguments /by/ and /value/ are set, + * will fetch the data according to the column name specified by /by/ and the value(s) specified + * by /value/. See doc for /init_by/ for details. + * + * if argument /data/ is set, will set the Entry's data with the data specified. + * See doc for /init_by_data/ for details. + * + * if argument /id/ is specified, will load the data of the row whose /id/ column has the value specified by the + * argument. + * + * Optional. + * Defaults to an empty array which will make this entry as the Empty Entry representing null, + * which cannot be saved unless properly modified to a non-null entry. + * + * @throws Missing_Table_Exception If the Entry table property is not found. + */ + public function __construct( array $args = [] ) { + $this->db_table = static::get_helper_class(); + + if ( empty( $this->db_table ) ) { + throw new Missing_Table_Exception(); + } + if ( isset( $args[ 'by' ] ) && isset( $args[ 'value' ] ) ) { + return $this->init_by( $args[ 'by' ], $args[ 'value' ] ); + } + + if ( isset( $args[ 'data' ] ) ) { + return $this->init_by_data( $args[ 'data' ] ); + } + + if ( isset( $args[ 'id' ] ) ) { + return $this->init_by_id( $args[ 'id' ] ); + } + + return $this->return_empty(); + } +} diff --git a/classes/database/exceptions/missing-table-exception.php b/classes/database/exceptions/missing-table-exception.php new file mode 100644 index 00000000..5a9a2495 --- /dev/null +++ b/classes/database/exceptions/missing-table-exception.php @@ -0,0 +1,18 @@ +prefix . static::$table_name; + } + + /** + * set_table_prefix + * + * Saves the table name as a property in the WP database object and + * sets it value to the table name and its prefix. + */ + protected static function set_table_prefix(): void { + static::db()->{static::$table_name} = static::table_name(); + } + + /** + * get_columns + * + * Should return an array of table columns details in the format of + * column_name => [ type => db_type, key => key_data (optional), flags => other_modifiers (optional) ] + * + * NOTE: A primary key column named /id/ which is an auto-incremented int/big int is assumed to exist and must be one + * of the columns this function returns. + * @return array The table column data. + */ + public static function get_columns(): array { + return []; + } + + /** + * get_extra_keys + * + * Extra keys to the table definitions to be merged with column key definitions + * @return string[] SQL table key definitions + */ + protected static function get_extra_keys(): array { + return []; + } + + /** + * get_keys + * + * Extracts the key definitions from the table's columns and merges with + * any extra key definitions + * @return string[] SQL table key definitions + */ + protected static function get_keys(): array { + $columns = static::get_columns(); + $keys = []; + foreach ( $columns as $column ) { + if ( ! isset( $column['key'] ) ) { + continue; + } + $keys[] = $column['key']; + } + return array_merge( $keys, static::get_extra_keys() ); + } + + /** + * install + * + * This function compares the version of the installed table and the current version as reported by + * the class. + * If the versions are different, the table will be installed or updated, and the option + * will be set to the current version. + */ + public static function install(): void { + $installed_ver = get_option( static::DB_VERSION_FLAG_NAME, -1 ); + + if ( static::DB_VERSION !== $installed_ver ) { + + $sql = static::get_create_table_sql(); + + require_once ABSPATH . 'wp-admin/includes/upgrade.php'; + dbDelta( $sql ); + + update_option( static::DB_VERSION_FLAG_NAME, static::DB_VERSION, false ); + } + + static::set_table_prefix(); + } + + /** + * get_create_table_sql + * + * Generates the SQL command to run in the database to create the table + * based on the definitions of columns and keys. + * @return string The SQL command to create the table + */ + protected static function get_create_table_sql(): string { + $table = static::table_name(); + $keys = static::get_keys(); + $charset_collate = static::db()->get_charset_collate(); + $table_columns = []; + $sql = []; + $sql[] = 'CREATE TABLE ' . $table . ' ('; + $columns = static::get_columns(); + foreach ( $columns as $column_name => $column ) { + $table_columns[] = sprintf( '`%s` %s %s,', + $column_name, + $column['type'], + $column['flags'] ?? '' + ); + } + + $sql[] = "\t" . implode( "\n\t", $table_columns ); + $sql[] = "\t" . implode( ",\n\t", $keys ); + $sql[] = ") AUTO_INCREMENT=11 {$charset_collate};"; + return implode( "\n", $sql ); + } + + /** + * where + * + * Generates a proper WHERE clause for an SQL query. + * @param string|array $where Either a string of where clause (returns as is) or an array of + * conditions join with an AND, and in the format of column => (int|string) for exact value comparison + * or in the format of column => [column => string, value =>string|int|array, + * comparison operator => string, relation_before=>string, optional, relation_after=>string, optional] + * + * @return string WHERE clause built from the function input + */ + public static function where( $where ): string { + if ( ! is_array( $where ) ) { + return $where; + } + $needs_relationship = false; + $where_string = ''; + foreach ( $where as $key => $filter ) { + if ( ! is_array( $filter ) ) { + if ( $needs_relationship ) { + $where_string .= ' AND'; + } + $where_string .= ' ' . self::get_where_string( $key, $filter ); + $needs_relationship = true; + continue; + } + + $where_string .= self::maybe_add_relation( $filter ); + $where_string .= self::get_where_string( $filter['column'], $filter['value'], $filter['operator'] ); + $where_string .= self::maybe_add_relation( $filter, false ); + + } + return $where_string; + + } + + /** + * maybe_add_relation + * + * Adds a logical relation ship (AND, OR...) if exists, based on the position (before|after) related to the condition. + * @param array $filter Object array describing the where condition that may contain the keys /relation_before/ + * or /relation_after/ containing the logical relationship to add to the main WHERE condition. + * @param bool $is_before Whether the current position in the text is before the condition the object describes. + * Optional. + * Defaults to TRUE. + * + * @return string If the logical relationship exists, returns it. Otherwise - an empty string. + */ + private static function maybe_add_relation( array $filter, bool $is_before = true ): string { + $key_to_check = $is_before ? 'relation_before' : 'relation_after'; + return isset( $filter[ $key_to_check ] ) ? ' ' . $filter[ $key_to_check ] : ' '; + } + + /** + * get_where_string + * + * @param string $key The column name in the condition + * @param string|int|array $value The value being compared. If an array will be translated to a set. + * @param string $operator The comparison operator. + * Optional. + * Defaults to '='. + * @param null $format Unused. + * + * @return string An SQL condition based on the parameters. + */ + private static function get_where_string( string $key, $value, string $operator = '=', $format = null ): string { + $param_string = is_int( $value ) ? '%d' : '%s'; + if ( is_array( $value ) ) { + $param_string = '('; + $count = count( $value ); + for ( $i = 0; $i < $count; $i++ ) { + $param_string .= is_int( $value[ $i ] ) ? '%d' : '%s'; + $param_string .= ( $i !== $count - 1 ) ? ', ' : ''; + } + $param_string .= ')'; + } + return static::db()->prepare( "$key $operator $param_string", $value ); + } + + /** + * get_columns_for_insert + * This function tries to get the column names for an INSERT operation based on the table column + * definition, and if that fails based on the /data/ parameter. + * The function will remove any column called /id/. + * @param mixed $data If a two-dimensional array, where the elements are in the form of column => value, + * the function will try to get the names of the columns off the first element. + * + * @return false|string A string representing the list of columns, comma separated and surrounded by parenthesis; + * or false in case of function failure. + */ + private static function get_columns_for_insert( $data ) { + $cols = static::get_columns(); + if ( count( $cols ) ) { + $columns = array_keys( $cols ); + } elseif ( is_array( $data ) ) { + //try to get from data + $columns = array_keys( $data[0] ); + } + + if ( empty( $columns ) || ! is_array( $columns ) ) { + return false; + } + + // remove id $column + if ( ! empty( $columns['id'] ) ) { + unset( $columns['id'] ); + } + $index = array_search( 'id', $columns, true ); + if ( false !== $index ) { + unset( $columns[ $index ] ); + } + + return ' (`' . implode( '`,`', $columns ) . '`) '; + } + + /** + * select_var + * + * Selects a single cell in the table and returns its value as string. + * Will return the first cell of the first row in the result set. + * @param string|array $fields A string of comma-separated list, or an array of columns from the table. + * Optional. + * Defaults to '*' (all table columns) + * @param string|array $where A string of WHERE conditions or an array of column => value entries connected with the + * AND logical operator. Or in the format of column => [column => string, value =>string|int|array, + * comparison operator => string, relation_before=>string, optional, relation_after=>string, optional] + * Optional. + * Defaults tp '1', which is evaluated to true and will bring all records (no condition). + * @param int|null $limit Limit the number of results to return to this number, or NULL for no limit. + * Optional. + * Defaults to NULL (no limit) + * @param int|null $offset Skip this number of results or NULL for no skip + * Optional. + * Defaults to NULL (no offset) + * @param string $join JOIN table clause. + * Optional. + * Defaults to an empty string (no join) + * + * @return string|null The query result or NULL on error. + */ + public static function select_var( $fields = '*', $where = '1', int $limit = null, int $offset = null, string $join = '' ): ?string { + return static::db()->get_var( static::build_sql_string( $fields, $where, $limit, $offset, $join ) ); + } + + /** + * build_sql_string + * + * Generates a SELECT query based on the function input. + * @param string|array $fields A string of comma-separated list, or an array of columns from the table. + * Optional. + * Defaults to '*' (all table columns) + * @param string|array $where A string of WHERE conditions or an array of column => value entries connected with + * the AND logical operator. r in the format of column => [column => string, value =>string|int|array, + * comparison operator => string, relation_before=>string, optional, relation_after=>string, optional] + * Optional. + * Defaults to '1', which is evaluated to true and will bring all records (no condition). + * @param int|null $limit Maximum number of results to return. + * Optional. + * Defaults to NULL (no limit) + * @param int|null $offset Start the results from a certain ordinal position. + * Optional. + * Defaults to NULL (no offset) + * @param string $join A table JOIN clause. + * Optional. + * Defaults to an empty string (no join) + * @param array $order_by an array of column => direction (asc|desc) to sort the results by. + * Optional. + * Defaults to an empty array (Default sort). + * + * @return string The SQL SELECT statement built according to the function parameters. + */ + private static function build_sql_string( $fields = '*', $where = '1', int $limit = null, int $offset = null, string $join = '', array $order_by = [] ): string { + if ( is_array( $fields ) ) { + $fields = implode( ', ', $fields ); + } + + $db = static::db(); + $query_string = 'SELECT %s FROM %s %s WHERE %s'; + $query_string = sprintf( $query_string, + $fields, + static::table_name(), + $join, + static::where( $where ) + ); + + if ( $order_by ) { + $query_string .= static::build_order_by_sql_string( $order_by ); + } + + if ( $limit ) { + $query_string .= $db->prepare( ' LIMIT %d', $limit ); + } + + if ( $offset ) { + $query_string .= $db->prepare( ' OFFSET %d', $offset ); + } + + return $query_string; + } + + /** + * build_order_by_sql_string + * + * Generates the ORDER BY clause of the query based on the passed on parameter + * @param array $order_by An array of column => direction (asc/desc) pairs + * + * @return string The ORDER BY clause for a query + */ + public static function build_order_by_sql_string( array $order_by ): string { + return ' ORDER BY ' . implode( ', ', array_map( function( $column, $direction ) { + return "{$column} {$direction}"; + }, array_keys( $order_by ), $order_by ) ); + } + + /** + * select + * + * Runs a SELECT query and returns the results as an array of objects, each object represents a row, + * @param string|array $fields A string of comma-separated list, or an array of columns from the table. + * Optional. + * Defaults to '*' (all table columns) + * @param string|array $where A string of WHERE conditions, or an array of column => value enteries + * for direct comparison joined with the AND logical operator, or in the format of column => [column => string, value =>string|int|array, + * comparison operator => string, relation_before=>string, optional, relation_after=>string, optional] + * Optional. + * Defaults to '1', which is evaluated to true and will bring all records (no condition). + * @param int|null $limit Maximum number of results to return. + * Optional. + * Defaults to NULL (no limit) + * @param int|null $offset Start the results from a certain ordinal position. + * Optional. + * Defaults to NULL (no offset) + * @param string|array $join A table JOIN clause. + * Optional. + * Defaults to an empty string (no join) + * @param array $order_by an array of column => direction (asc|desc) to sort the results by. + * Optional. + * Defaults to an empty array (Default sort). + * + * @return array|object|\stdClass[]|null On success, an array of objects. Null on error. + */ + public static function select( $fields = '*', $where = '1', int $limit = null, int $offset = null, $join = '', array $order_by = [] ) { + // TODO: handle $wpdb->last_error + $query = static::build_sql_string( $fields, $where, $limit, $offset, $join, $order_by ); + return static::db()->get_results( $query ); + } + + /** + * get_col + * + * Returns the first column of the result set. + * @param string $column The column to return. + * Optional. + * Defaults to an empty string. + * @param string|array $where A string of WHERE conditions or an array of column => value entries + * for direct comparison joined with the AND logical operator or in the format of column => [column => string, value =>string|int|array, + * comparison operator => string, relation_before=>string, optional, relation_after=>string, optional] + * Optional. + * Defaults to '1', which is evaluated to true and will bring all records (no condition). + * @param int|null $limit Maximum number of results to return. + * Optional. + * Defaults to NULL (no limit) + * @param int|null $offset Start the results from a certain ordinal position. + * Optional. + * Defaults to NULL (no offset) + * @param string $join A table JOIN clause. + * Optional. + * Defaults to an empty string (no join) + * @param array $order_by an array of column => direction (asc|desc) to sort the results by. + * Optional. + * Defaults to an empty array (Default sort). + * + * @return string[] Array of the values of the column as strings, or an empty one on error. + */ + public static function get_col( string $column = '', $where = '1', int $limit = null, int $offset = null, string $join = '', array $order_by = [] ) : array { + return static::db()->get_col( static::build_sql_string( $column, $where, $limit, $offset, $join, $order_by ) ); + } + + /** + * first + * + * Returns the first row in the table according to the query filters. + * @param string|array $fields A string of comma-separated list, or an array of columns from the table. + * Optional. + * Defaults to '*' (all table columns) + * @param string|array $where A string of WHERE conditions or an array of column => value entries + * for direct comparison joined with the logical AND operator, + * or in the format of column => [column => string, value =>string|int|array, + * comparison operator => string, relation_before=>string, optional, relation_after=>string, optional] + * Optional. + * Defaults to '1', which is evaluated to true and will bring all records (no condition). + * @param int $limit Unnecessary since we are only returning the first row. + * Optional. + * Defaults to 1. + * @param null $offset Start the results from a certain ordinal position. + * Optional. + * Defaults to NULL (no offset) + * @param string $join A table JOIN clause. + * Optional. + * Defaults to an empty string (no join) + * + * @return \stdClass|null An object representing the first row, or null on error + */ + public static function first( $fields = '*', $where = '1', int $limit = 1, $offset = null, string $join = '' ): ?\stdClass { + $result = static::select( $fields, $where, $limit, $offset, $join ); + return ( ! empty( $result[0] ) ) ? $result[0] : null; + } + + /** + * replace + * + * Replace a row in a table if it exists or insert a new row in a table if the row does not already exist. + * @param array $data Array of data in the form of column => (raw) value. + * Optional. + * Defaults to an empty array. + * + * @return false|int The number of rows affected or FALSE on error. + */ + public static function replace( array $data = [] ) { + return static::db()->replace( static::table_name(), $data ); + } + + /** + * insert + * + * Insert a single row into the table. + * @param array $data Array of data to insert in column => (raw) value format. + * Optional, defaults to an empty array. + * + * @return false|int The number of rows affected or FALSE on error + */ + public static function insert( array $data = [] ) { + return static::db()->insert( static::table_name(), $data ); + } + + /** + * insert_many + * Performs a bulk INSERT of many datasets/rows to the table + * + * @param array $data Optional. Defaults to an empty array. + * An array of datasets to be INSERTed into the table. Each value needs to be seperated by a comma, + * each data set needs to be surrounded by parenthesis. + * @param string|null $columns Optional. The columns being inserted. Defaults to NULL. + * Either a string of comma-separated column names surrounded by parenthesis, or NULL for the + * function to try guessing based on the data and column definitions. + * + * @return false|int Number of rows affected or false on error + */ + public static function insert_many( array $data = [], string $columns = null ) { + if ( null === $columns ) { + $columns = static::get_columns_for_insert( $data ); + if ( ! $columns ) { + return false; + } + } + $insert_sql = 'INSERT INTO ' . static::table_name() . $columns . ' VALUES ' . implode( ",\n", $data ) . ';'; + return static::db()->query( $insert_sql ); // no params so no need for `prepare`. + } + + /** + * update + * + * Updates data in the table, based on where conditionals + * @param array $data Optional. Array of column => (raw) values to be updated. + * Defaults to an empty array. + * @param array $where Optional. Array of column => (raw) values as a group of AND + * WHERE conditionals for the UPDATE statement. Defaults to an empty array. + * + * @return false|int The numbers of rows affected, or FALSE on error + */ + public static function update( array $data = [], array $where = [] ) { + return static::db()->update( static::table_name(), $data, $where ); + } + + /** + * delete + * + * Delete rows from this table based on optional where conditions. + * + * @param array $where Optional. And array of column => (raw) values + * as a group of AND conditions for the DELETE statement. Defaults to an empty array. + * + * @return false|int The number of rows updated, or false on error. + */ + public static function delete( array $where = [] ) { + return static::db()->delete( static::table_name(), $where ); + } + + /** + * query + * + * Execute any SQL query on the database. + * It is best used when there is a need for specific, + * custom, or otherwise complex SQL queries. + * @param string $query The query to be executed. Defaults to an empty string + * + * @return false|int Boolean true for CREATE, ALTER, TRUNCATE and DROP queries. + * Number of rows affected/selected for all other queries. Boolean false on error. + */ + public static function query( string $query = '' ) { + return static::db()->query( $query ); + } + + /** + * get_class_name + * + * Returns the name of this /Table/ class (or its derivative) + * @return string - The name of the current class + */ + public static function get_class_name(): string { + return get_called_class(); + } +} diff --git a/classes/logger.php b/classes/logger.php new file mode 100644 index 00000000..e68a69b8 --- /dev/null +++ b/classes/logger.php @@ -0,0 +1,37 @@ +reflection ) { + try { + $this->reflection = new ReflectionClass( $this ); + } catch ( ReflectionException $e ) { + if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log + error_log( $e->getMessage() ); + } + } + } + + return $this->reflection; + } + + /** + * Add module component. + * + * Add new component to the current module. + * @access public + * + * @param string $id Component ID. + * @param mixed $instance An instance of the component. + */ + public function add_component( $id, $instance ) { + $this->components[ $id ] = $instance; + } + + /** + * Add module route. + * + * Add new route to the current module. + * @access public + * + * @param string $id Route ID. + * @param mixed $instance An instance of the route. + */ + public function add_route( string $id, $instance ) { + $this->routes[ $id ] = $instance; + } + + /** + * @access public + * @return Module[] + */ + public function get_components() { + return $this->components; + } + + /** + * Get module component. + * + * Retrieve the module component. + * @access public + * + * @param string $id Component ID. + * + * @return mixed An instance of the component, or `false` if the component + * doesn't exist. + * @codeCoverageIgnore + */ + public function get_component( $id ) { + if ( isset( $this->components[ $id ] ) ) { + return $this->components[ $id ]; + } + + return false; + } + + /** + * Retrieve the namespace of the class + * + * @access public + * @static + */ + public static function namespace_name() { + $class_name = static::class_name(); + return substr( $class_name, 0, strrpos( $class_name, '\\' ) ); + } + + + + public static function routes_list() : array { + return []; + } + + public static function component_list() : array { + return []; + } + + /** + * Adds an array of components. + * Assumes namespace structure contains `\Components\` + * + * @param array $components_ids => component's class name. + */ + public function register_components( $components_ids = null ) { + $namespace = static::namespace_name(); + $components_ids = $components_ids ?? static::component_list(); + foreach ( $components_ids as $component_id ) { + $class_name = $namespace . '\\Components\\' . $component_id; + $this->add_component( $component_id, new $class_name() ); + } + } + + /** + * Adds an array of routes. + * Assumes namespace structure contains `\Rest\` + */ + public function register_routes() { + $namespace = static::namespace_name(); + $routes_ids = static::routes_list(); + + foreach ( $routes_ids as $route_id ) { + $class_name = $namespace . '\\Rest\\' . $route_id; + $this->add_route( $route_id, new $class_name() ); + } + } +} + diff --git a/classes/rest/route.php b/classes/rest/route.php new file mode 100644 index 00000000..921b8a49 --- /dev/null +++ b/classes/rest/route.php @@ -0,0 +1,387 @@ +get_methods(); + if ( empty( $methods ) ) { + return; + } + + //$callbacks = false; + $callbacks = []; + foreach ( (array) $methods as $method ) { + if ( ! in_array( $method, $this->valid_http_methods, true ) ) { + continue; + } + $callbacks[] = $this->build_endpoint_method_config( $method ); + } + + $arguments = $this->get_arguments(); + + if ( ! $callbacks && empty( $arguments ) ) { + return; + } + + $arguments = array_merge( $arguments, (array) $callbacks ); + register_rest_route( $this->namespace, '/' . $this->get_endpoint() . '/', $arguments, $this->override ); + } + + /** + * get_methods + * Rest Endpoint methods + * + * Returns an array of the supported REST methods for this route + * @return array REST methods being configured for this route. + */ + abstract public function get_methods(): array; + + /** + * get_callback + * + * Returns a reference to the callback function to handle the REST method specified by the /method/ parameter. + * @param string $method The REST method name + * + * @return callable A reference to a member function with the same name as the REST method being passed as a parameter, + * or a reference to the default function /callback/. + */ + public function get_callback_method( string $method ): callable { + $method_name = strtolower( $method ); + $callback = $this->method_exists_in_current_class( $method_name ) ? $method_name : 'callback'; + return [ $this, $callback ]; + } + + /** + * get_permission_callback_method + * + * Returns a reference to the permission callback for the method if exists or the default one if it doesn't. + * @param string $method The REST method name + * + * @return callable If a method called (rest-method)_permission_callback exists, returns a reference to it, otherwise + * returns a reference to the default member method /permission_callback/. + */ + public function get_permission_callback_method( string $method ): callable { + $method_name = strtolower( $method ); + $permission_callback_method = $method_name . '_permission_callback'; + $permission_callback = $this->method_exists_in_current_class( $permission_callback_method ) ? $permission_callback_method : 'permission_callback'; + return [ $this, $permission_callback ]; + } + + /** + * maybe_add_args_to_config + * + * Checks if the class has a method call (rest-method)_args. + * If it does, the function calls it and adds its response to the config object passed to the function, under the /args/ key. + * @param string $method The REST method name being configured + * @param array $config The configuration object for the method + * + * @return array The configuration object for the method, possibly after being amended + */ + public function maybe_add_args_to_config( string $method, array $config ): array { + $method_name = strtolower( $method ); + $method_args = $method_name . '_args'; + if ( $this->method_exists_in_current_class( $method_args ) ) { + $config['args'] = $this->{$method_args}(); + } + return $config; + } + + /** + * maybe_add_response_to_swagger + * + * If the function method /(rest-method)_response_callback/ exists, adds the filter + * /swagger_api_response_(namespace with slashes replaced with underscores)_(endpoint with slashes replaced with underscores)/ + * with the aforementioned function method. + * This filter is used with the WP API Swagger UI plugin to create documentation for the API. + * The value being passed is an array: [ + '200' => ['description' => 'OK'], + '404' => ['description' => 'Not Found'], + '400' => ['description' => 'Bad Request'] + ] + * @param string $method REST method name + */ + public function maybe_add_response_to_swagger( string $method ): void { + $method_name = strtolower( $method ); + $method_response_callback = $method_name . '_response_callback'; + if ( $this->method_exists_in_current_class( $method_response_callback ) ) { + $response_filter = $method_name . '_' . str_replace( + '/', + '_', + $this->namespace . '/' . $this->get_endpoint() + ); + add_filter( 'swagger_api_responses_' . $response_filter, [ $this, $method_response_callback ] ); + } + } + + /** + * build_endpoint_method_config + * + * Builds a configuration array for the endpoint based on the presence of the callback, permission, additional parameters, + * and response to Swagger member functions. + * @param string $method The REST method for the endpoint + * + * @return array The endpoint configuration for the method specified by the parameter + */ + private function build_endpoint_method_config( string $method ): array { + $config = [ + 'methods' => $method, + 'callback' => $this->get_callback_method( $method ), + 'permission_callback' => $this->get_permission_callback_method( $method ), + ]; + $config = $this->maybe_add_args_to_config( $method, $config ); + return $config; + } + + /** + * method_exists_in_current_class + * + * Uses reflection to check if this class has the /method/ method. + * @param string $method The name of the method being checked. + * + * @return bool TRUE if the class has the /method/ method, FALSE otherwise. + */ + private function method_exists_in_current_class( string $method ): bool { + $class_name = get_class( $this ); + try { + $reflection = new ReflectionClass( $class_name ); + } catch ( \ReflectionException $e ) { + return false; + } + if ( ! $reflection->hasMethod( $method ) ) { + return false; + } + $method_ref = $reflection->getMethod( $method ); + + return ( $method_ref && $class_name === $method_ref->class ); + } + + /** + * @param $data + * + * @return WP_REST_Response + */ + public function respond_success_json( $data = [] ): WP_REST_Response { + return new WP_REST_Response([ + 'success' => true, + 'data' => $data, + ]); + } + + /** + * @param array{message: string, code: string} $data + * + * @return WP_Error + */ + public function respond_error_json( array $data ): WP_Error { + if ( ! isset( $data['message'] ) || ! isset( $data['code'] ) ) { + _doing_it_wrong( + __FUNCTION__, + esc_html__( 'Both `message` and `code` keys must be provided', 'pojo-accessibility' ), + '1.0.0' + ); // @codeCoverageIgnore + } + + return new WP_Error( + $data['code'] ?? 'internal_server_error', + $data['message'] ?? esc_html__( 'Internal server error', 'pojo-accessibility' ), + ); + } + + public function verify_capability( $capability = 'manage_options' ) { + if ( ! current_user_can( $capability ) ) { + return $this->respond_error_json([ + 'message' => esc_html__( 'You do not have sufficient permissions to access this data.', 'pojo-accessibility' ), + 'code' => '401 Unauthorized', + ]); + } + } + + /** + * permission_callback + * Permissions callback fallback for the endpoint + * Gets the current user ID and sets the /current_user_id/ property. + * If the /auth/ property is set to /true/ will make sure that the user is logged in (has an id greater than 0) + * + * @param WP_REST_Request $request unused + * + * @return bool TRUE, if permission granted, FALSE otherwise + */ + public function permission_callback( WP_REST_Request $request ): bool { + // try to get current user + $this->current_user_id = get_current_user_id(); + if ( $this->auth ) { + return $this->current_user_id > 0; + } + + return true; + } + + /** + * callback + * Fallback callback function, returns a response consisting of the string /ok/. + * + * @param WP_REST_Request $request unused + * + * @return WP_REST_Response Default Response of the string 'ok'. + */ + public function callback( WP_REST_Request $request ): WP_REST_Response { + return rest_ensure_response( [ 'OK' ] ); + } + + /** + * respond_wrong_method + * + * Creates a WordPress error object with the /rest_no_route/ code and the message and code supplied or the defaults. + * @param null $message The error message for the wrong method. + * Optional. + * Defaults to null, which makes sets the message to /No route was found matching the URL and request method/ + * @param int $code The HTTP status code. + * Optional. + * Defaults to 404 (Not found). + * + * @return WP_Error The WordPress error object with the error message and status code supplied + */ + public function respond_wrong_method( $message = null, int $code = 404 ): WP_Error { + if ( null === $message ) { + $message = __( 'No route was found matching the URL and request method', 'pojo-accessibility' ); + } + + return new WP_Error( 'rest_no_route', $message, [ 'status' => $code ] ); + } + + /** + * respond_with_code + * Create a new /WP_REST_Response/ object with the specified data and HTTP response code. + * + * @param array|null $data The data to return in this response + * @param int $code The HTTP response code. + * Optional. + * Defaults to 200 (OK). + * + * @return WP_REST_Response The WordPress response object loaded with the data and the response code. + */ + public function respond_with_code( ?array $data = null, int $code = 200 ): WP_REST_Response { + return new WP_REST_Response( $data, $code ); + } + + /** + * get_user_from_request + * + * Returns the current user object. + * Depends on the property /current_user_id/ to be set. + * @return WP_User|false The user object or false if not found or on error. + */ + public function get_user_from_request() { + return get_user_by( 'id', $this->current_user_id ); + } + + /** + * get_arguments + * Rest Endpoint extra arguments + * @return array Additional arguments for the route configuration + */ + public function get_arguments(): array { + return []; + } + + /** + * get_endpoint + * Rest route Endpoint + * @return string Endpoint uri component (comes after the route namespace) + */ + abstract public function get_endpoint(): string; + + /** + * get_name + * @return string The name of the route + */ + abstract public function get_name(): string; + + /** + * get_self_url + * + * @param string $endpoint + * + * @return string + */ + public function get_self_url( string $endpoint = '' ): string { + return rest_url( $this->namespace . '/' . $endpoint ); + } + + public function verify_nonce( $nonce = '', $name = '' ) { + if ( ! wp_verify_nonce( sanitize_text_field( wp_unslash( $nonce ) ), $name ) ) { + return $this->respond_error_json([ + 'message' => esc_html__( 'Invalid nonce', 'pojo-accessibility' ), + 'code' => 'bad_request', + ]); + } + } + + public function verify_nonce_and_capability( $nonce = '', $name = '', $capability = 'manage_options' ) { + $this->verify_nonce( $nonce, $name ); + + if ( ! current_user_can( $capability ) ) { + return $this->respond_error_json([ + 'message' => esc_html__( 'You do not have sufficient permissions to access this data.', 'pojo-accessibility' ), + 'code' => 'bad_request', + ]); + } + } + +} diff --git a/classes/utils.php b/classes/utils.php new file mode 100644 index 00000000..ee124871 --- /dev/null +++ b/classes/utils.php @@ -0,0 +1,37 @@ +id, 'ea11y-' ); + } + public static function user_is_admin(): bool { + return current_user_can( 'manage_options' ); + } + public static function is_wp_dashboard_page(): bool { + $current_screen = get_current_screen(); + + return str_contains( $current_screen->id, 'dashboard' ); + } + + public static function is_wp_settings_page(): bool { + $current_screen = get_current_screen(); + + return str_contains( $current_screen->id, 'options-' ); + } + + public static function is_elementor_installed() { + $file_path = 'elementor/elementor.php'; + $installed_plugins = get_plugins(); + return isset( $installed_plugins[ $file_path ] ); + } + +} diff --git a/classes/utils/assets.php b/classes/utils/assets.php new file mode 100644 index 00000000..db3ac8ed --- /dev/null +++ b/classes/utils/assets.php @@ -0,0 +1,144 @@ + self::get_assets_version( $version ), + 'suffix' => self::get_assets_suffix(), + ]; + } + + /** + * get_assets_path + * + * @param string $asset_name + * @param string $asset_type + * @param string $suffix + * + * @return string + */ + private static function get_assets_path( string $asset_name, string $asset_type, string $suffix = '' ) : string { + return EA11Y_ASSETS_URL . '/build/' . $asset_name . $suffix . '.' . $asset_type; + } + + /** + * enqueue_app_assets + * + * @param string $handle + * @param bool $with_css + */ + public static function enqueue_app_assets( string $handle = '', bool $with_css = true ) : void { + $dir = EA11Y_ASSETS_PATH . 'build/'; + $url = EA11Y_ASSETS_URL . 'build/'; + + $script_asset_path = $dir . $handle . '.asset.php'; + if ( ! file_exists( $script_asset_path ) ) { + throw new \Error( + 'You need to run `npm start` or `npm run build` for the "' . esc_html( $handle ) . '" script first.' + ); + } + + // enqueue js + $script_asset = require $script_asset_path; + wp_enqueue_script( + $handle, + $url . $handle . '.js', + array_merge( $script_asset['dependencies'], [ 'wp-util' ] ), + $script_asset['version'], + true, + ); + + // add translation support + wp_set_script_translations( $handle, 'elementor-sw' ); + + if ( ! $with_css ) { + return; + } + // enqueue css + $css_file_name = 'style-' . $handle . '.css'; + $css_version = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? filemtime( $dir . $css_file_name ) : EA11Y_VERSION; + wp_enqueue_style( + $handle, + $url . $css_file_name, + [ 'wp-components' ], + $css_version + ); + } +} diff --git a/composer.json b/composer.json index d91f30d5..97f699d3 100644 --- a/composer.json +++ b/composer.json @@ -9,7 +9,44 @@ "email": "yakir@pojo.me" } ], - "require": { - "phpunit/phpunit": "4.8.8" - } + "require-dev": { + "johnpbloch/wordpress-core": "^6.0", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "squizlabs/php_codesniffer": "^3.6", + "wp-coding-standards/wpcs": "2.3", + "php-stubs/wordpress-stubs": "^6.0", + "elementor/eunit": "^0.0.10", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpunit/php-code-coverage": "^9.2", + "wildwolf/wordpress-test-library-stubs": "^6.0", + "wp-phpunit/wp-phpunit": "^6.0", + "yoast/phpunit-polyfills": "^2.0" + }, + "scripts": { + "lint": "phpcs --standard=./ruleset.xml ./**/*.php" + }, + "require": { + "firebase/php-jwt": "^6.10" + }, + "config": { + "allow-plugins": { + "composer/installers": true, + "dealerdirect/phpcodesniffer-composer-installer": true + } + }, + "extra": { + "imposter": { + "namespace": "...", + "excludes": [ "firebase/php-jwt"] + }, + "installer-paths": { + "vendor/{$vendor}/{$name}/": [ "firebase/php-jwt"] + } + }, + "repositories":[ + { + "type": "vcs", + "url": "git@github.com:elementor/eunit.git" + } + ] } diff --git a/includes/manager.php b/includes/manager.php new file mode 100644 index 00000000..a8b29d6b --- /dev/null +++ b/includes/manager.php @@ -0,0 +1,57 @@ +modules[ $module_name ] = $class_name::instance(); + } + } + } + + /** + * @param string $module_name + * + * @return Module_Base|Module_Base[] + */ + public function get_modules( string $module_name ) { + if ( $module_name ) { + if ( isset( $this->modules[ $module_name ] ) ) { + return $this->modules[ $module_name ]; + } + + return null; + } + + return $this->modules; + } +} diff --git a/includes/pojo-a11y-settings.php b/includes/pojo-a11y-settings.php deleted file mode 100644 index f2e43c23..00000000 --- a/includes/pojo-a11y-settings.php +++ /dev/null @@ -1,645 +0,0 @@ - 'pojo_a11y_toolbar', - 'title' => __( 'Display Toolbar', 'pojo-accessibility' ), - 'type' => self::FIELD_SELECT, - 'options' => array( - 'enable' => __( 'Show on all devices', 'pojo-accessibility' ), - 'visible-desktop' => __( 'Visible Desktop', 'pojo-accessibility' ), - 'visible-tablet' => __( 'Visible Tablet', 'pojo-accessibility' ), - 'visible-phone' => __( 'Visible Phone', 'pojo-accessibility' ), - 'hidden-desktop' => __( 'Hidden Desktop', 'pojo-accessibility' ), - 'hidden-tablet' => __( 'Hidden Tablet', 'pojo-accessibility' ), - 'hidden-phone' => __( 'Hidden Phone', 'pojo-accessibility' ), - 'disable' => __( 'Disable', 'pojo-accessibility' ), - ), - 'std' => 'enable', - ); - - $toolbar_options_classes = 'pojo-a11y-toolbar-button'; - - $fields[] = array( - 'id' => 'pojo_a11y_toolbar_title', - 'title' => __( 'Title', 'pojo-accessibility' ), - 'type' => self::FIELD_TEXT, - 'desc' => __( 'Title top of the toolbar (recommended).', 'pojo-accessibility' ), - 'class' => $toolbar_options_classes, - 'std' => __( 'Accessibility Tools', 'pojo-accessibility' ), - ); - - $fields[] = array( - 'id' => 'pojo_a11y_toolbar_button_resize_font', - 'title' => __( 'Resize Font', 'pojo-accessibility' ), - 'type' => self::FIELD_SELECT, - 'class' => $toolbar_options_classes, - 'options' => array( - 'enable' => __( 'Enable', 'pojo-accessibility' ), - 'disable' => __( 'Disable', 'pojo-accessibility' ), - ), - 'std' => 'enable', - ); - - $fields[] = array( - 'id' => 'pojo_a11y_toolbar_button_resize_font_add_title', - 'title' => __( 'Increase Text', 'pojo-accessibility' ), - 'type' => self::FIELD_TEXT, - 'class' => $toolbar_options_classes . ' pojo-settings-child-row no-border', - 'std' => __( 'Increase Text', 'pojo-accessibility' ), - ); - - $fields[] = array( - 'id' => 'pojo_a11y_toolbar_button_resize_font_less_title', - 'title' => __( 'Decrease Text', 'pojo-accessibility' ), - 'type' => self::FIELD_TEXT, - 'class' => $toolbar_options_classes . ' pojo-settings-child-row', - 'std' => __( 'Decrease Text', 'pojo-accessibility' ), - ); - - $fields[] = array( - 'id' => 'pojo_a11y_toolbar_button_grayscale', - 'title' => __( 'Grayscale', 'pojo-accessibility' ), - 'type' => self::FIELD_SELECT, - 'class' => $toolbar_options_classes, - 'options' => array( - 'enable' => __( 'Enable', 'pojo-accessibility' ), - 'disable' => __( 'Disable', 'pojo-accessibility' ), - ), - 'std' => 'enable', - ); - - $fields[] = array( - 'id' => 'pojo_a11y_toolbar_button_grayscale_title', - 'title' => __( 'Grayscale Title', 'pojo-accessibility' ), - 'type' => self::FIELD_TEXT, - 'class' => $toolbar_options_classes . ' pojo-settings-child-row', - 'std' => __( 'Grayscale', 'pojo-accessibility' ), - ); - - $fields[] = array( - 'id' => 'pojo_a11y_toolbar_button_high_contrast', - 'title' => __( 'High Contrast', 'pojo-accessibility' ), - 'type' => self::FIELD_SELECT, - 'class' => $toolbar_options_classes, - 'options' => array( - 'enable' => __( 'Enable', 'pojo-accessibility' ), - 'disable' => __( 'Disable', 'pojo-accessibility' ), - ), - 'std' => 'enable', - ); - - $fields[] = array( - 'id' => 'pojo_a11y_toolbar_button_high_contrast_title', - 'title' => __( 'High Contrast Title', 'pojo-accessibility' ), - 'type' => self::FIELD_TEXT, - 'class' => $toolbar_options_classes . ' pojo-settings-child-row', - 'std' => __( 'High Contrast', 'pojo-accessibility' ), - ); - - $fields[] = array( - 'id' => 'pojo_a11y_toolbar_button_negative_contrast', - 'title' => __( 'Negative Contrast', 'pojo-accessibility' ), - 'type' => self::FIELD_SELECT, - 'class' => $toolbar_options_classes, - 'options' => array( - 'enable' => __( 'Enable', 'pojo-accessibility' ), - 'disable' => __( 'Disable', 'pojo-accessibility' ), - ), - 'std' => 'enable', - ); - - $fields[] = array( - 'id' => 'pojo_a11y_toolbar_button_negative_contrast_title', - 'title' => __( 'Negative Contrast Title', 'pojo-accessibility' ), - 'type' => self::FIELD_TEXT, - 'class' => $toolbar_options_classes . ' pojo-settings-child-row', - 'std' => __( 'Negative Contrast', 'pojo-accessibility' ), - ); - - $fields[] = array( - 'id' => 'pojo_a11y_toolbar_button_light_bg', - 'title' => __( 'Light Background', 'pojo-accessibility' ), - 'type' => self::FIELD_SELECT, - 'class' => $toolbar_options_classes, - 'options' => array( - 'enable' => __( 'Enable', 'pojo-accessibility' ), - 'disable' => __( 'Disable', 'pojo-accessibility' ), - ), - 'std' => 'enable', - ); - - $fields[] = array( - 'id' => 'pojo_a11y_toolbar_button_light_bg_title', - 'title' => __( 'Light Background Title', 'pojo-accessibility' ), - 'type' => self::FIELD_TEXT, - 'class' => $toolbar_options_classes . ' pojo-settings-child-row', - 'std' => __( 'Light Background', 'pojo-accessibility' ), - ); - - $fields[] = array( - 'id' => 'pojo_a11y_toolbar_button_links_underline', - 'title' => __( 'Links Underline', 'pojo-accessibility' ), - 'type' => self::FIELD_SELECT, - 'class' => $toolbar_options_classes, - 'options' => array( - 'enable' => __( 'Enable', 'pojo-accessibility' ), - 'disable' => __( 'Disable', 'pojo-accessibility' ), - ), - 'std' => 'enable', - ); - - $fields[] = array( - 'id' => 'pojo_a11y_toolbar_button_links_underline_title', - 'title' => __( 'Links Underline Title', 'pojo-accessibility' ), - 'type' => self::FIELD_TEXT, - 'class' => $toolbar_options_classes . ' pojo-settings-child-row', - 'std' => __( 'Links Underline', 'pojo-accessibility' ), - ); - - $fields[] = array( - 'id' => 'pojo_a11y_toolbar_button_readable_font', - 'title' => __( 'Readable Font', 'pojo-accessibility' ), - 'type' => self::FIELD_SELECT, - 'class' => $toolbar_options_classes, - 'options' => array( - 'enable' => __( 'Enable', 'pojo-accessibility' ), - 'disable' => __( 'Disable', 'pojo-accessibility' ), - ), - 'std' => 'enable', - ); - - $fields[] = array( - 'id' => 'pojo_a11y_toolbar_button_readable_font_title', - 'title' => __( 'Readable Font Title', 'pojo-accessibility' ), - 'type' => self::FIELD_TEXT, - 'class' => $toolbar_options_classes . ' pojo-settings-child-row', - 'std' => __( 'Readable Font', 'pojo-accessibility' ), - ); - - $fields[] = array( - 'id' => 'pojo_a11y_toolbar_button_sitemap_title', - 'title' => __( 'Sitemap Title', 'pojo-accessibility' ), - 'type' => self::FIELD_TEXT, - 'class' => $toolbar_options_classes, - 'std' => __( 'Sitemap', 'pojo-accessibility' ), - ); - - $fields[] = array( - 'id' => 'pojo_a11y_toolbar_button_sitemap_link', - 'title' => __( 'Sitemap Link', 'pojo-accessibility' ), - 'type' => self::FIELD_TEXT, - 'placeholder' => 'http://your-domain.com/sitemap', - 'desc' => __( 'Link for sitemap page in your website. Leave blank to disable.', 'pojo-accessibility' ), - 'class' => $toolbar_options_classes . ' pojo-settings-child-row', - 'std' => '', - ); - - $fields[] = array( - 'id' => 'pojo_a11y_toolbar_button_help_title', - 'title' => __( 'Help Title', 'pojo-accessibility' ), - 'type' => self::FIELD_TEXT, - 'class' => $toolbar_options_classes, - 'std' => __( 'Help', 'pojo-accessibility' ), - ); - - $fields[] = array( - 'id' => 'pojo_a11y_toolbar_button_help_link', - 'title' => __( 'Help Link', 'pojo-accessibility' ), - 'type' => self::FIELD_TEXT, - 'placeholder' => 'http://your-domain.com/help', - 'desc' => __( 'Link for help page in your website. Leave blank to disable.', 'pojo-accessibility' ), - 'class' => $toolbar_options_classes . ' pojo-settings-child-row', - 'std' => '', - ); - - $fields[] = array( - 'id' => 'pojo_a11y_toolbar_button_feedback_title', - 'title' => __( 'Feedback Title', 'pojo-accessibility' ), - 'type' => self::FIELD_TEXT, - 'class' => $toolbar_options_classes, - 'std' => __( 'Feedback', 'pojo-accessibility' ), - ); - - $fields[] = array( - 'id' => 'pojo_a11y_toolbar_button_feedback_link', - 'title' => __( 'Feedback Link', 'pojo-accessibility' ), - 'type' => self::FIELD_TEXT, - 'placeholder' => 'http://your-domain.com/feedback', - 'desc' => __( 'Link for feedback page in your website. Leave blank to disable.', 'pojo-accessibility' ), - 'class' => $toolbar_options_classes . ' pojo-settings-child-row', - 'std' => '', - ); - - $sections[] = array( - 'id' => 'section-a11y-toolbar', - 'page' => self::TOOLBAR_PAGE, - 'title' => __( 'Toolbar Settings', 'pojo-accessibility' ), - 'intro' => '', - 'fields' => $fields, - ); - - $sections[] = array( - 'id' => 'section-a11y-styles', - 'page' => self::TOOLBAR_PAGE, - 'title' => __( 'Style Settings', 'pojo-accessibility' ), - 'intro' => sprintf( __( 'For style settings of accessibility tools go to > Customize > Accessibility.', 'pojo-accessibility' ), $this->get_admin_url( 'customizer' ) ), - 'fields' => array(), - ); - - return $sections; - } - - public function section_a11y_settings( $sections ) { - $fields = array(); - - $fields[] = array( - 'id' => 'pojo_a11y_focusable', - 'title' => __( 'Add Outline Focus', 'pojo-accessibility' ), - 'type' => self::FIELD_SELECT, - 'desc' => __( 'Add outline to elements on keyboard focus.', 'pojo-accessibility' ), - 'options' => array( - 'enable' => __( 'Enable', 'pojo-accessibility' ), - 'disable' => __( 'Disable', 'pojo-accessibility' ), - ), - 'std' => 'disable', - ); - - $fields[] = array( - 'id' => 'pojo_a11y_skip_to_content_link', - 'title' => __( 'Skip to Content link', 'pojo-accessibility' ), - 'type' => self::FIELD_SELECT, - 'desc' => __( 'Add skip to content link when using keyboard.', 'pojo-accessibility' ), - 'options' => array( - 'enable' => __( 'Enable', 'pojo-accessibility' ), - 'disable' => __( 'Disable', 'pojo-accessibility' ), - ), - 'std' => 'enable', - ); - - $fields[] = array( - 'id' => 'pojo_a11y_skip_to_content_link_element_id', - 'title' => __( 'Skip to Content Element ID', 'pojo-accessibility' ), - 'placeholder' => 'content', - 'type' => self::FIELD_TEXT, - 'std' => 'content', - ); - - $fields[] = array( - 'id' => 'pojo_a11y_remove_link_target', - 'title' => __( 'Remove target attribute from links', 'pojo-accessibility' ), - 'type' => self::FIELD_SELECT, - 'desc' => __( 'This option will reset all your target links to open in the same window or tab.', 'pojo-accessibility' ), - 'options' => array( - 'enable' => __( 'Enable', 'pojo-accessibility' ), - 'disable' => __( 'Disable', 'pojo-accessibility' ), - ), - 'std' => 'disable', - ); - - $fields[] = array( - 'id' => 'pojo_a11y_add_role_links', - 'title' => __( 'Add landmark roles to all links', 'pojo-accessibility' ), - 'type' => self::FIELD_SELECT, - 'desc' => __( 'This option will add role="link" to all links on the page.', 'pojo-accessibility' ), - 'options' => array( - 'enable' => __( 'Enable', 'pojo-accessibility' ), - 'disable' => __( 'Disable', 'pojo-accessibility' ), - ), - 'std' => 'enable', - ); - - $fields[] = array( - 'id' => 'pojo_a11y_save', - 'title' => __( 'Sitewide Accessibility', 'pojo-accessibility' ), - 'desc' => __( 'Consistent accessibility throughout your site visit. Site remembers you and stays accessible.', 'pojo-accessibility' ), - 'type' => self::FIELD_SELECT, - 'options' => array( - 'enable' => __( 'Enable', 'pojo-accessibility' ), - 'disable' => __( 'Disable', 'pojo-accessibility' ), - ), - 'std' => 'enable', - ); - - $fields[] = array( - 'id' => 'pojo_a11y_save_expiration', - 'title' => __( 'Remember user for', 'pojo-accessibility' ), - 'type' => self::FIELD_SELECT, - 'desc' => __( 'Define how long your toolbar settings will be remembered', 'pojo-accessibility' ), - 'options' => array( - '1' => __( '1 Hour', 'pojo-accessibility' ), - '6' => __( '6 Hours', 'pojo-accessibility' ), - '12' => __( '12 Hours', 'pojo-accessibility' ), - '24' => __( '1 Day', 'pojo-accessibility' ), - '48' => __( '2 Days', 'pojo-accessibility' ), - '72' => __( '3 Days', 'pojo-accessibility' ), - '168' => __( '1 Week', 'pojo-accessibility' ), - '720' => __( '1 Month', 'pojo-accessibility' ), - ), - 'std' => '12', - ); - - $sections[] = array( - 'id' => 'section-a11y-settings', - 'page' => self::SETTINGS_PAGE, - 'title' => __( 'General Settings', 'pojo-accessibility' ), - 'intro' => '', - 'fields' => $fields, - ); - - return $sections; - } - - public function print_js() { - // TODO: Maybe need to move to other file - ?> - - section_a11y_toolbar( $sections ); - $sections = $this->section_a11y_settings( $sections ); - $this->_sections = $sections; - return $this->_sections; - } - - public function add_settings_section( $args = array() ) { - $args = wp_parse_args( $args, array( - 'id' => '', - 'title' => '', - ) ); - - foreach ( $this->_sections as $section ) { - if ( $args['id'] !== $section['id'] ) { - continue; - } - if ( empty( $section['intro'] ) ) { - return; - } - printf( '

%s

', $section['intro'] ); - break; - } - } - - public function add_settings_field( $args = array() ) { - if ( empty( $args ) ) { - return; - } - - $args = wp_parse_args( $args, array( - 'id' => '', - 'std' => '', - 'type' => self::FIELD_TEXT, - ) ); - - if ( empty( $args['id'] ) || empty( $args['type'] ) ) { - return; - } - - $field_callback = 'render_' . $args['type'] . '_field'; - if ( method_exists( $this, $field_callback ) ) { - call_user_func( array( $this, $field_callback ), $args ); - } - } - - public function render_select_field( $field ) { - $options = array(); - foreach ( $field['options'] as $option_key => $option_value ) { - $options[] = sprintf( - '', - esc_attr( $option_key ), - selected( get_option( $field['id'], $field['std'] ), $option_key, false ), - $option_value - ); - } - ?> - - - -

- - - /> - - -

- - get_settings_sections() as $section_key => $section ) { - add_settings_section( - $section['id'], - $section['title'], - array( &$this, 'add_settings_section' ), - $section['page'] - ); - - if ( empty( $section['fields'] ) ) { - continue; - } - - foreach ( $section['fields'] as $field ) { - add_settings_field( - $field['id'], - $field['title'], - array( &$this, 'add_settings_field' ), - $section['page'], - $section['id'], - $field - ); - - $sanitize_callback = array( $this, 'field_html' ); - if ( ! empty( $field['type'] ) && self::FIELD_CHECKBOX_LIST === $field['type'] ) { - $sanitize_callback = array( $this, 'field_checkbox_list' ); - } - if ( ! empty( $field['sanitize_callback'] ) ) { - $sanitize_callback = $field['sanitize_callback']; - } - - register_setting( $section['page'], $field['id'], $sanitize_callback ); - } - } - } - - public static function field_html( $input ) { - return stripslashes( wp_filter_post_kses( addslashes( $input ) ) ); - } - - public static function field_checkbox_list( $input ) { - if ( empty( $input ) ) { - $input = array(); - } - - return $input; - } - - public function display_settings_page() { - $screen = get_current_screen(); - $screen_id = $screen->id; - if ( false !== strpos( $screen_id, 'toolbar' ) ) { - $screen_id = self::TOOLBAR_PAGE; - } - ?> -
-

_page_title; ?>

- -
- -
- -
- menu_slug = add_menu_page( - __( 'Accessibility', 'pojo-accessibility' ), - __( 'Accessibility', 'pojo-accessibility' ), - 'manage_options', - 'accessibility-settings', - array( &$this, 'display_settings_page' ), - 'dashicons-universal-access-alt' - ); - add_submenu_page( - 'accessibility-settings', - __( 'Accessibility Settings', 'pojo-accessibility' ), - __( 'Settings', 'pojo-accessibility' ), - 'manage_options', - 'accessibility-settings', - array( &$this, 'display_settings_page' ) - ); - add_submenu_page( - 'accessibility-settings', - __( 'Accessibility Toolbar', 'pojo-accessibility' ), - __( 'Toolbar', 'pojo-accessibility' ), - 'manage_options', - 'accessibility-toolbar', - array( &$this, 'display_settings_page' ) - ); - add_submenu_page( - 'accessibility-settings', - __( 'Customize', 'pojo-accessibility' ), - __( 'Customize', 'pojo-accessibility' ), - 'manage_options', - '/customize.php?autofocus[section]=accessibility' - ); - } - - public function plugin_action_links( $links, $plugin_file ) { - if ( POJO_A11Y_BASE === $plugin_file ) { - $settings = '' . __( 'Settings', 'pojo-accessibility' ) . ''; - $toolbar = '' . __( 'Toolbar', 'pojo-accessibility' ) . ''; - $customizer = '' . __( 'Customize', 'pojo-accessibility' ) . ''; - array_unshift( $links, $customizer ); - array_unshift( $links, $toolbar ); - array_unshift( $links, $settings ); - } - return $links; - } - - private function get_admin_url( $type ) { - switch ( $type ) { - case 'customizer': - return admin_url( 'customize.php?autofocus[section]=accessibility' ); - break; - case 'general': - return admin_url( 'admin.php?page=accessibility-settings' ); - break; - case 'toolbar': - return admin_url( 'admin.php?page=accessibility-toolbar' ); - break; - } - } - - private function get_default_values() { - if ( empty( $this->_defaults ) ) { - if ( empty( $this->_sections ) ) { - $this->get_settings_sections(); - } - $defaults = array(); - foreach ( $this->_sections as $section ) { - foreach ( $section['fields'] as $field ) { - $defaults[ $field['id'] ] = isset( $field['std'] ) ? $field['std'] : ''; - } - } - $this->_defaults = $defaults; - } - } - - public function get_default_title_text( $option ) { - $this->get_default_values(); - $default = isset( $this->_defaults[ $option ] ) ? $this->_defaults[ $option ] : ''; - - return get_option( $option, $default ); - } - - public function __construct() { - $this->_page_title = __( 'One Click Accessibility', 'pojo-accessibility' ); - $this->_page_menu_title = __( 'One Click Accessibility', 'pojo-accessibility' ); - $this->_menu_parent = 'themes.php'; - - add_action( 'admin_menu', array( &$this, 'admin_menu' ), 20 ); - add_action( 'admin_init', array( &$this, 'admin_init' ), 20 ); - add_action( 'admin_footer', array( &$this, 'print_js' ) ); - add_filter( 'plugin_action_links_' . POJO_A11Y_BASE, [ $this, 'plugin_action_links' ], 10, 2 ); - } -} \ No newline at end of file diff --git a/assets/css/style.css b/modules/legacy/assets/css/style.css similarity index 100% rename from assets/css/style.css rename to modules/legacy/assets/css/style.css diff --git a/assets/css/style.min.css b/modules/legacy/assets/css/style.min.css similarity index 100% rename from assets/css/style.min.css rename to modules/legacy/assets/css/style.min.css diff --git a/assets/js/app.dev.js b/modules/legacy/assets/js/app.dev.js similarity index 100% rename from assets/js/app.dev.js rename to modules/legacy/assets/js/app.dev.js diff --git a/assets/js/app.min.js b/modules/legacy/assets/js/app.min.js similarity index 100% rename from assets/js/app.min.js rename to modules/legacy/assets/js/app.min.js diff --git a/assets/js/skip-link-focus-fix.js b/modules/legacy/assets/js/skip-link-focus-fix.js similarity index 100% rename from assets/js/skip-link-focus-fix.js rename to modules/legacy/assets/js/skip-link-focus-fix.js diff --git a/assets/less/_background.less b/modules/legacy/assets/less/_background.less similarity index 100% rename from assets/less/_background.less rename to modules/legacy/assets/less/_background.less diff --git a/assets/less/_high-contrast.less b/modules/legacy/assets/less/_high-contrast.less similarity index 100% rename from assets/less/_high-contrast.less rename to modules/legacy/assets/less/_high-contrast.less diff --git a/assets/less/_mixing.less b/modules/legacy/assets/less/_mixing.less similarity index 100% rename from assets/less/_mixing.less rename to modules/legacy/assets/less/_mixing.less diff --git a/assets/less/_toolbar.less b/modules/legacy/assets/less/_toolbar.less similarity index 100% rename from assets/less/_toolbar.less rename to modules/legacy/assets/less/_toolbar.less diff --git a/assets/less/_underline.less b/modules/legacy/assets/less/_underline.less similarity index 100% rename from assets/less/_underline.less rename to modules/legacy/assets/less/_underline.less diff --git a/assets/less/_visibility.less b/modules/legacy/assets/less/_visibility.less similarity index 100% rename from assets/less/_visibility.less rename to modules/legacy/assets/less/_visibility.less diff --git a/assets/less/style.less b/modules/legacy/assets/less/style.less similarity index 100% rename from assets/less/style.less rename to modules/legacy/assets/less/style.less diff --git a/includes/pojo-a11y-admin-ui.php b/modules/legacy/components/admin.php similarity index 93% rename from includes/pojo-a11y-admin-ui.php rename to modules/legacy/components/admin.php index 05c963a8..ffc15fd2 100644 --- a/includes/pojo-a11y-admin-ui.php +++ b/modules/legacy/components/admin.php @@ -1,23 +1,27 @@ _is_elementor_installed() ) { + if ( ! current_user_can( 'install_plugins' ) || Utils::is_elementor_installed() ) { return; } @@ -152,7 +156,7 @@ public function admin_footer_text( $footer_text ) { $current_screen = get_current_screen(); if ( in_array( $current_screen->id, array( self::SETTINGS_SLUG, self::TOOLBAR_SLUG ) ) ) { $footer_text = sprintf( - /* translators: 1: One Click Accessibility, 2: Link to plugin review */ + /* translators: 1: One Click Accessibility, 2: Link to plugin review */ __( 'Enjoyed %1$s? Please leave us a %2$s rating. We really appreciate your support!', 'pojo-accessibility' ), '' . __( 'One Click Accessibility', 'pojo-accessibility' ) . '', '★★★★★' diff --git a/includes/pojo-a11y-customizer.php b/modules/legacy/components/customizer.php similarity index 50% rename from includes/pojo-a11y-customizer.php rename to modules/legacy/components/customizer.php index ed8985fa..464c831f 100644 --- a/includes/pojo-a11y-customizer.php +++ b/modules/legacy/components/customizer.php @@ -1,158 +1,166 @@ 'a11y_toolbar_icon', - 'title' => __( 'Toolbar Icon', 'pojo-accessibility' ), - 'type' => 'select', - 'choices' => array( - 'one-click' => __( 'One Click', 'pojo-accessibility' ), - 'wheelchair' => __( 'Wheelchair', 'pojo-accessibility' ), + $fields = []; + + $fields[] = [ + 'id' => 'a11y_toolbar_icon', + 'title' => __( 'Toolbar Icon', 'pojo-accessibility' ), + 'type' => 'select', + 'choices' => [ + 'one-click' => __( 'One Click', 'pojo-accessibility' ), + 'wheelchair' => __( 'Wheelchair', 'pojo-accessibility' ), 'accessibility' => __( 'Accessibility', 'pojo-accessibility' ), - ), - 'std' => 'one-click', + ], + 'std' => 'one-click', 'description' => __( 'Set Toolbar Icon', 'pojo-accessibility' ), - ); - - $fields[] = array( - 'id' => 'a11y_toolbar_position', - 'title' => __( 'Toolbar Position', 'pojo-accessibility' ), - 'type' => 'select', - 'choices' => array( - 'left' => __( 'Left', 'pojo-accessibility' ), + ]; + + $fields[] = [ + 'id' => 'a11y_toolbar_position', + 'title' => __( 'Toolbar Position', 'pojo-accessibility' ), + 'type' => 'select', + 'choices' => [ + 'left' => __( 'Left', 'pojo-accessibility' ), 'right' => __( 'Right', 'pojo-accessibility' ), - ), - 'std' => is_rtl() ? 'right' : 'left', + ], + 'std' => is_rtl() ? 'right' : 'left', 'description' => __( 'Set Toolbar Position', 'pojo-accessibility' ), - ); + ]; - $fields[] = array( - 'id' => 'a11y_toolbar_distance_top', - 'title' => __( 'Offset from Top (Desktop)', 'pojo-accessibility' ), - 'type' => 'text', - 'std' => '100px', + $fields[] = [ + 'id' => 'a11y_toolbar_distance_top', + 'title' => __( 'Offset from Top (Desktop)', 'pojo-accessibility' ), + 'type' => 'text', + 'std' => '100px', 'description' => __( 'Set Toolbar top offset (Desktop)', 'pojo-accessibility' ), - ); + ]; - $fields[] = array( - 'id' => 'a11y_toolbar_distance_top_mobile', - 'title' => __( 'Offset from Top (Mobile)', 'pojo-accessibility' ), - 'type' => 'text', - 'std' => '50px', + $fields[] = [ + 'id' => 'a11y_toolbar_distance_top_mobile', + 'title' => __( 'Offset from Top (Mobile)', 'pojo-accessibility' ), + 'type' => 'text', + 'std' => '50px', 'description' => __( 'Set Toolbar top offset (Mobile)', 'pojo-accessibility' ), - ); - - $fields[] = array( - 'id' => 'a11y_bg_toolbar', - 'title' => __( 'Toolbar Background', 'pojo-accessibility' ), - 'type' => 'color', - 'std' => '#ffffff', - 'selector' => '#pojo-a11y-toolbar .pojo-a11y-toolbar-overlay', + ]; + + $fields[] = [ + 'id' => 'a11y_bg_toolbar', + 'title' => __( 'Toolbar Background', 'pojo-accessibility' ), + 'type' => 'color', + 'std' => '#ffffff', + 'selector' => '#pojo-a11y-toolbar .pojo-a11y-toolbar-overlay', 'change_type' => 'bg_color', 'description' => __( 'Set Toolbar background color', 'pojo-accessibility' ), - ); - - $fields[] = array( - 'id' => 'a11y_color_toolbar', - 'title' => __( 'Toolbar Color', 'pojo-accessibility' ), - 'type' => 'color', - 'std' => '#333333', - 'selector' => '#pojo-a11y-toolbar .pojo-a11y-toolbar-overlay ul.pojo-a11y-toolbar-items li.pojo-a11y-toolbar-item a, #pojo-a11y-toolbar .pojo-a11y-toolbar-overlay p.pojo-a11y-toolbar-title', + ]; + + $fields[] = [ + 'id' => 'a11y_color_toolbar', + 'title' => __( 'Toolbar Color', 'pojo-accessibility' ), + 'type' => 'color', + 'std' => '#333333', + 'selector' => '#pojo-a11y-toolbar .pojo-a11y-toolbar-overlay ul.pojo-a11y-toolbar-items li.pojo-a11y-toolbar-item a, #pojo-a11y-toolbar .pojo-a11y-toolbar-overlay p.pojo-a11y-toolbar-title', 'change_type' => 'color', 'description' => __( 'Set Toolbar text color', 'pojo-accessibility' ), - ); + ]; - $fields[] = array( - 'id' => 'a11y_toggle_button_bg_color', - 'title' => __( 'Toggle Button Background', 'pojo-accessibility' ), - 'type' => 'color', - 'std' => '#4054b2', + $fields[] = [ + 'id' => 'a11y_toggle_button_bg_color', + 'title' => __( 'Toggle Button Background', 'pojo-accessibility' ), + 'type' => 'color', + 'std' => '#4054b2', 'description' => __( 'Set Toolbar toggle button background color', 'pojo-accessibility' ), - ); - - $fields[] = array( - 'id' => 'a11y_toggle_button_color', - 'title' => __( 'Toggle Button Color', 'pojo-accessibility' ), - 'type' => 'color', - 'std' => '#ffffff', - 'selector' => '#pojo-a11y-toolbar .pojo-a11y-toolbar-toggle a', + ]; + + $fields[] = [ + 'id' => 'a11y_toggle_button_color', + 'title' => __( 'Toggle Button Color', 'pojo-accessibility' ), + 'type' => 'color', + 'std' => '#ffffff', + 'selector' => '#pojo-a11y-toolbar .pojo-a11y-toolbar-toggle a', 'change_type' => 'color', 'description' => __( 'Set Toolbar toggle button icon color', 'pojo-accessibility' ), - ); - - $fields[] = array( - 'id' => 'a11y_bg_active', - 'title' => __( 'Active Background', 'pojo-accessibility' ), - 'type' => 'color', - 'std' => '#4054b2', - 'selector' => '#pojo-a11y-toolbar .pojo-a11y-toolbar-overlay ul.pojo-a11y-toolbar-items li.pojo-a11y-toolbar-item a.active', + ]; + + $fields[] = [ + 'id' => 'a11y_bg_active', + 'title' => __( 'Active Background', 'pojo-accessibility' ), + 'type' => 'color', + 'std' => '#4054b2', + 'selector' => '#pojo-a11y-toolbar .pojo-a11y-toolbar-overlay ul.pojo-a11y-toolbar-items li.pojo-a11y-toolbar-item a.active', 'change_type' => 'bg_color', 'description' => __( 'Set Toolbar active background color', 'pojo-accessibility' ), - ); - - $fields[] = array( - 'id' => 'a11y_color_active', - 'title' => __( 'Active Color', 'pojo-accessibility' ), - 'type' => 'color', - 'std' => '#ffffff', - 'selector' => '#pojo-a11y-toolbar .pojo-a11y-toolbar-overlay ul.pojo-a11y-toolbar-items li.pojo-a11y-toolbar-item a.active', + ]; + + $fields[] = [ + 'id' => 'a11y_color_active', + 'title' => __( 'Active Color', 'pojo-accessibility' ), + 'type' => 'color', + 'std' => '#ffffff', + 'selector' => '#pojo-a11y-toolbar .pojo-a11y-toolbar-overlay ul.pojo-a11y-toolbar-items li.pojo-a11y-toolbar-item a.active', 'change_type' => 'color', 'description' => __( 'Set Toolbar active text color', 'pojo-accessibility' ), - ); - - $fields[] = array( - 'id' => 'a11y_focus_outline_style', - 'title' => __( 'Focus Outline Style', 'pojo-accessibility' ), - 'type' => 'select', - 'choices' => array( - 'solid' => __( 'Solid', 'pojo-accessibility' ), - 'dotted' => __( 'Dotted', 'pojo-accessibility' ), - 'dashed' => __( 'Dashed', 'pojo-accessibility' ), - 'double' => __( 'Double', 'pojo-accessibility' ), - 'groove' => __( 'Groove', 'pojo-accessibility' ), - 'ridge' => __( 'Ridge', 'pojo-accessibility' ), - 'outset' => __( 'Outset', 'pojo-accessibility' ), + ]; + + $fields[] = [ + 'id' => 'a11y_focus_outline_style', + 'title' => __( 'Focus Outline Style', 'pojo-accessibility' ), + 'type' => 'select', + 'choices' => [ + 'solid' => __( 'Solid', 'pojo-accessibility' ), + 'dotted' => __( 'Dotted', 'pojo-accessibility' ), + 'dashed' => __( 'Dashed', 'pojo-accessibility' ), + 'double' => __( 'Double', 'pojo-accessibility' ), + 'groove' => __( 'Groove', 'pojo-accessibility' ), + 'ridge' => __( 'Ridge', 'pojo-accessibility' ), + 'outset' => __( 'Outset', 'pojo-accessibility' ), 'initial' => __( 'Initial', 'pojo-accessibility' ), - ), - 'std' => 'solid', + ], + 'std' => 'solid', 'description' => __( 'Set Focus outline style', 'pojo-accessibility' ), - ); - - $fields[] = array( - 'id' => 'a11y_focus_outline_width', - 'title' => __( 'Focus Outline Width', 'pojo-accessibility' ), - 'type' => 'select', - 'choices' => array( - '1px' => '1px', - '2px' => '2px', - '3px' => '3px', - '4px' => '4px', - '5px' => '5px', - '6px' => '6px', - '7px' => '7px', - '8px' => '8px', - '9px' => '9px', + ]; + + $fields[] = [ + 'id' => 'a11y_focus_outline_width', + 'title' => __( 'Focus Outline Width', 'pojo-accessibility' ), + 'type' => 'select', + 'choices' => [ + '1px' => '1px', + '2px' => '2px', + '3px' => '3px', + '4px' => '4px', + '5px' => '5px', + '6px' => '6px', + '7px' => '7px', + '8px' => '8px', + '9px' => '9px', '10px' => '10px', - ), - 'std' => '1px', + ], + 'std' => '1px', 'description' => __( 'Set Focus outline width', 'pojo-accessibility' ), - ); + ]; - $fields[] = array( - 'id' => 'a11y_focus_outline_color', - 'title' => __( 'Focus Outline Color', 'pojo-accessibility' ), - 'type' => 'color', - 'std' => '#FF0000', + $fields[] = [ + 'id' => 'a11y_focus_outline_color', + 'title' => __( 'Focus Outline Color', 'pojo-accessibility' ), + 'type' => 'color', + 'std' => '#FF0000', 'description' => __( 'Set Focus outline color', 'pojo-accessibility' ), - ); + ]; return $fields; } @@ -162,51 +170,52 @@ public function customize_a11y( $wp_customize ) { $section_description = '

' . __( 'Use the control below to customize the appearance and layout of the Accessibility Toolbar', 'pojo-accessibility' ) . '

' . sprintf( __( 'Additional Toolbar settings can be configured at the %s page.', 'pojo-accessibility' ), - '' . __( 'Accessibility Toolbar', 'pojo-accessibility' ) . '' + '' . __( 'Accessibility Toolbar', 'pojo-accessibility' ) . '' ) . '

'; - $wp_customize->add_section( 'accessibility', array( - 'title' => __( 'Accessibility', 'pojo-accessibility' ), - 'priority' => 30, + $wp_customize->add_section( 'accessibility', [ + 'title' => __( 'Accessibility', 'pojo-accessibility' ), + 'priority' => 30, 'description' => $section_description, - ) ); + ] ); foreach ( $fields as $field ) { $customizer_id = POJO_A11Y_CUSTOMIZER_OPTIONS . '[' . $field['id'] . ']'; - $wp_customize->add_setting( $customizer_id, array( + $wp_customize->add_setting( $customizer_id, [ 'default' => $field['std'] ? $field['std'] : null, - 'type' => 'option', - ) ); + 'type' => 'option', + ] ); switch ( $field['type'] ) { case 'color': - $wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, $field['id'], array( - 'label' => $field['title'], - 'section' => 'accessibility', - 'settings' => $customizer_id, + $wp_customize->add_control( new \WP_Customize_Color_Control( $wp_customize, $field['id'], [ + 'label' => $field['title'], + 'section' => 'accessibility', + 'settings' => $customizer_id, 'description' => isset( $field['description'] ) ? $field['description'] : null, - ) ) ); + ] ) ); break; case 'select': case 'text': - $wp_customize->add_control( $field['id'], array( - 'label' => $field['title'], - 'section' => 'accessibility', - 'settings' => $customizer_id, - 'type' => $field['type'], - 'choices' => isset( $field['choices'] ) ? $field['choices'] : null, + $wp_customize->add_control( $field['id'], [ + 'label' => $field['title'], + 'section' => 'accessibility', + 'settings' => $customizer_id, + 'type' => $field['type'], + 'choices' => isset( $field['choices'] ) ? $field['choices'] : null, 'description' => isset( $field['description'] ) ? $field['description'] : null, - ) ); + ] ); break; } } } public function get_custom_css_code() { - $options = $this->get_customizer_options(); + $options = $this->get_customizer_options(); $bg_color = $options['a11y_toggle_button_bg_color']; // get_theme_mod( 'a11y_toggle_button_bg_color', '#4054b2' ); if ( ! empty( $bg_color ) ) { $this->add_css_rule( '#pojo-a11y-toolbar .pojo-a11y-toolbar-toggle a', 'background-color', $bg_color ); - $this->add_css_rule( '#pojo-a11y-toolbar .pojo-a11y-toolbar-overlay, #pojo-a11y-toolbar .pojo-a11y-toolbar-overlay ul.pojo-a11y-toolbar-items.pojo-a11y-links', 'border-color', $bg_color ); + $this->add_css_rule( '#pojo-a11y-toolbar .pojo-a11y-toolbar-overlay, #pojo-a11y-toolbar .pojo-a11y-toolbar-overlay ul.pojo-a11y-toolbar-items.pojo-a11y-links', + 'border-color', $bg_color ); } $outline_style = $options['a11y_focus_outline_style']; //get_theme_mod( 'a11y_focus_outline_style', 'solid' ); @@ -255,12 +264,13 @@ private function get_customizer_options() { if ( false === $options ) { $options = get_option( POJO_A11Y_CUSTOMIZER_OPTIONS ); } + return $options; } private function add_css_rule( $selector, $rule, $value ) { if ( ! isset( $this->css_rules[ $selector ] ) ) { - $this->css_rules[ $selector ] = array(); + $this->css_rules[ $selector ] = []; } $this->css_rules[ $selector ][] = $rule . ': ' . $value . ';'; } @@ -279,7 +289,7 @@ public function print_css_code() { } public function __construct() { - add_filter( 'customize_register', array( &$this, 'customize_a11y' ), 610 ); - add_filter( 'wp_head', array( &$this, 'print_css_code' ) ); + add_filter( 'customize_register', [ $this, 'customize_a11y' ], 610 ); + add_filter( 'wp_head', [ $this, 'print_css_code' ] ); } -} \ No newline at end of file +} diff --git a/includes/pojo-a11y-elementor.php b/modules/legacy/components/elementor.php similarity index 66% rename from includes/pojo-a11y-elementor.php rename to modules/legacy/components/elementor.php index 819c1aa5..a260e5c6 100644 --- a/includes/pojo-a11y-elementor.php +++ b/modules/legacy/components/elementor.php @@ -1,8 +1,15 @@ preview->is_preview_mode() ) { $is_active = false; diff --git a/includes/pojo-a11y-frontend.php b/modules/legacy/components/frontend.php similarity index 89% rename from includes/pojo-a11y-frontend.php rename to modules/legacy/components/frontend.php index 05a56599..1e957e17 100644 --- a/includes/pojo-a11y-frontend.php +++ b/modules/legacy/components/frontend.php @@ -1,8 +1,18 @@ settings->get_default_title_text( "pojo_a11y_toolbar_button_{$button_type}_title" ); + /** + * @var Settings $settings + */ + $settings = Module::get_settings(); + $title = $settings->get_default_title_text( "pojo_a11y_toolbar_button_{$button_type}_title" ); return '' . $this->get_toolbar_svg( $button_type, $title ) . '' . $title . ''; } public function enqueue_scripts() { wp_register_script( 'pojo-a11y', - POJO_A11Y_ASSETS_URL . 'js/app.min.js', - array( - 'jquery', - ), + EA11Y_URL . 'modules/legacy/js/app.min.js', + [ 'jquery' ], '1.0.0', true ); wp_register_style( 'pojo-a11y', - POJO_A11Y_ASSETS_URL . 'css/style.min.css', - array(), + EA11Y_URL . 'modules/legacy/assets/css/style.min.css', + [], '1.0.0' ); @@ -46,13 +58,13 @@ public function enqueue_scripts() { wp_localize_script( 'pojo-a11y', 'PojoA11yOptions', - array( + [ 'focusable' => ( 'enable' === get_option( 'pojo_a11y_focusable' ) ), 'remove_link_target' => ( 'enable' === get_option( 'pojo_a11y_remove_link_target' ) ), 'add_role_links' => ( 'enable' === get_option( 'pojo_a11y_add_role_links' ) ), 'enable_save' => ( 'enable' === get_option( 'pojo_a11y_save' ) ), 'save_expiration' => get_option( 'pojo_a11y_save_expiration' ), - ) + ] ); } @@ -77,16 +89,16 @@ public function print_toolbar() { $customizer_options = get_option( POJO_A11Y_CUSTOMIZER_OPTIONS ); $toolbar_position = $customizer_options['a11y_toolbar_position']; - if ( empty( $toolbar_position ) || ! in_array( $toolbar_position, array( 'right', 'left' ) ) ) { + if ( empty( $toolbar_position ) || ! in_array( $toolbar_position, [ 'right', 'left' ] ) ) { $toolbar_position = 'left'; } - - $toolbar_title = Pojo_Accessibility::$instance->settings->get_default_title_text( 'pojo_a11y_toolbar_title' ); + $settings = Module::get_settings(); + $toolbar_title = $settings->get_default_title_text( 'pojo_a11y_toolbar_title' ); $toolbar_visibility = get_option( 'pojo_a11y_toolbar' ); - $wrapper_classes = array( + $wrapper_classes = [ 'pojo-a11y-toolbar-' . $toolbar_position, - ); + ]; if ( 'enable' !== $toolbar_visibility ) { $wrapper_classes[] = 'pojo-a11y-' . $toolbar_visibility; @@ -114,7 +126,7 @@ public function print_toolbar() { @@ -219,7 +231,7 @@ public function print_toolbar() { } private function get_toolbar_svg( $icon, $icon_title = '' ) { - $icons = array( + $icons = [ 'resize_font_add' => '', 'resize_font_less' => '', 'grayscale' => '', @@ -232,7 +244,7 @@ private function get_toolbar_svg( $icon, $icon_title = '' ) { 'sitemap' => '', 'help' => '', 'feedback' => '', - ); + ]; if ( isset( $icons[ $icon ] ) ) { $icon_title_html = ''; @@ -248,11 +260,11 @@ private function get_toolbar_svg( $icon, $icon_title = '' ) { private function get_svg_icon( $icon ) { if ( null === $this->svg_icons ) { - $this->svg_icons = array( + $this->svg_icons = [ 'wheelchair' => '', 'one-click' => '', 'accessibility' => '', - ); + ]; } if ( isset( $this->svg_icons[ $icon ] ) ) { @@ -263,10 +275,8 @@ private function get_svg_icon( $icon ) { } public function __construct() { - add_action( 'wp_enqueue_scripts', array( &$this, 'enqueue_scripts' ) ); - - add_action( 'wp_footer', array( &$this, 'print_skip_to_content_link' ), 20 ); - add_action( 'wp_footer', array( &$this, 'print_toolbar' ), 30 ); + add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_scripts' ] ); + add_action( 'wp_footer', [ $this, 'print_skip_to_content_link' ], 20 ); + add_action( 'wp_footer', [ $this, 'print_toolbar' ], 30 ); } - } diff --git a/modules/legacy/components/settings.php b/modules/legacy/components/settings.php new file mode 100644 index 00000000..6e86fb4d --- /dev/null +++ b/modules/legacy/components/settings.php @@ -0,0 +1,671 @@ + 'pojo_a11y_toolbar', + 'title' => __( 'Display Toolbar', 'pojo-accessibility' ), + 'type' => self::FIELD_SELECT, + 'options' => [ + 'enable' => __( 'Show on all devices', 'pojo-accessibility' ), + 'visible-desktop' => __( 'Visible Desktop', 'pojo-accessibility' ), + 'visible-tablet' => __( 'Visible Tablet', 'pojo-accessibility' ), + 'visible-phone' => __( 'Visible Phone', 'pojo-accessibility' ), + 'hidden-desktop' => __( 'Hidden Desktop', 'pojo-accessibility' ), + 'hidden-tablet' => __( 'Hidden Tablet', 'pojo-accessibility' ), + 'hidden-phone' => __( 'Hidden Phone', 'pojo-accessibility' ), + 'disable' => __( 'Disable', 'pojo-accessibility' ), + ], + 'std' => 'enable', + ]; + + $toolbar_options_classes = 'pojo-a11y-toolbar-button'; + + $fields[] = [ + 'id' => 'pojo_a11y_toolbar_title', + 'title' => __( 'Title', 'pojo-accessibility' ), + 'type' => self::FIELD_TEXT, + 'desc' => __( 'Title top of the toolbar (recommended).', 'pojo-accessibility' ), + 'class' => $toolbar_options_classes, + 'std' => __( 'Accessibility Tools', 'pojo-accessibility' ), + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_toolbar_button_resize_font', + 'title' => __( 'Resize Font', 'pojo-accessibility' ), + 'type' => self::FIELD_SELECT, + 'class' => $toolbar_options_classes, + 'options' => [ + 'enable' => __( 'Enable', 'pojo-accessibility' ), + 'disable' => __( 'Disable', 'pojo-accessibility' ), + ], + 'std' => 'enable', + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_toolbar_button_resize_font_add_title', + 'title' => __( 'Increase Text', 'pojo-accessibility' ), + 'type' => self::FIELD_TEXT, + 'class' => $toolbar_options_classes . ' pojo-settings-child-row no-border', + 'std' => __( 'Increase Text', 'pojo-accessibility' ), + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_toolbar_button_resize_font_less_title', + 'title' => __( 'Decrease Text', 'pojo-accessibility' ), + 'type' => self::FIELD_TEXT, + 'class' => $toolbar_options_classes . ' pojo-settings-child-row', + 'std' => __( 'Decrease Text', 'pojo-accessibility' ), + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_toolbar_button_grayscale', + 'title' => __( 'Grayscale', 'pojo-accessibility' ), + 'type' => self::FIELD_SELECT, + 'class' => $toolbar_options_classes, + 'options' => [ + 'enable' => __( 'Enable', 'pojo-accessibility' ), + 'disable' => __( 'Disable', 'pojo-accessibility' ), + ], + 'std' => 'enable', + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_toolbar_button_grayscale_title', + 'title' => __( 'Grayscale Title', 'pojo-accessibility' ), + 'type' => self::FIELD_TEXT, + 'class' => $toolbar_options_classes . ' pojo-settings-child-row', + 'std' => __( 'Grayscale', 'pojo-accessibility' ), + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_toolbar_button_high_contrast', + 'title' => __( 'High Contrast', 'pojo-accessibility' ), + 'type' => self::FIELD_SELECT, + 'class' => $toolbar_options_classes, + 'options' => [ + 'enable' => __( 'Enable', 'pojo-accessibility' ), + 'disable' => __( 'Disable', 'pojo-accessibility' ), + ], + 'std' => 'enable', + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_toolbar_button_high_contrast_title', + 'title' => __( 'High Contrast Title', 'pojo-accessibility' ), + 'type' => self::FIELD_TEXT, + 'class' => $toolbar_options_classes . ' pojo-settings-child-row', + 'std' => __( 'High Contrast', 'pojo-accessibility' ), + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_toolbar_button_negative_contrast', + 'title' => __( 'Negative Contrast', 'pojo-accessibility' ), + 'type' => self::FIELD_SELECT, + 'class' => $toolbar_options_classes, + 'options' => [ + 'enable' => __( 'Enable', 'pojo-accessibility' ), + 'disable' => __( 'Disable', 'pojo-accessibility' ), + ], + 'std' => 'enable', + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_toolbar_button_negative_contrast_title', + 'title' => __( 'Negative Contrast Title', 'pojo-accessibility' ), + 'type' => self::FIELD_TEXT, + 'class' => $toolbar_options_classes . ' pojo-settings-child-row', + 'std' => __( 'Negative Contrast', 'pojo-accessibility' ), + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_toolbar_button_light_bg', + 'title' => __( 'Light Background', 'pojo-accessibility' ), + 'type' => self::FIELD_SELECT, + 'class' => $toolbar_options_classes, + 'options' => [ + 'enable' => __( 'Enable', 'pojo-accessibility' ), + 'disable' => __( 'Disable', 'pojo-accessibility' ), + ], + 'std' => 'enable', + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_toolbar_button_light_bg_title', + 'title' => __( 'Light Background Title', 'pojo-accessibility' ), + 'type' => self::FIELD_TEXT, + 'class' => $toolbar_options_classes . ' pojo-settings-child-row', + 'std' => __( 'Light Background', 'pojo-accessibility' ), + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_toolbar_button_links_underline', + 'title' => __( 'Links Underline', 'pojo-accessibility' ), + 'type' => self::FIELD_SELECT, + 'class' => $toolbar_options_classes, + 'options' => [ + 'enable' => __( 'Enable', 'pojo-accessibility' ), + 'disable' => __( 'Disable', 'pojo-accessibility' ), + ], + 'std' => 'enable', + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_toolbar_button_links_underline_title', + 'title' => __( 'Links Underline Title', 'pojo-accessibility' ), + 'type' => self::FIELD_TEXT, + 'class' => $toolbar_options_classes . ' pojo-settings-child-row', + 'std' => __( 'Links Underline', 'pojo-accessibility' ), + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_toolbar_button_readable_font', + 'title' => __( 'Readable Font', 'pojo-accessibility' ), + 'type' => self::FIELD_SELECT, + 'class' => $toolbar_options_classes, + 'options' => [ + 'enable' => __( 'Enable', 'pojo-accessibility' ), + 'disable' => __( 'Disable', 'pojo-accessibility' ), + ], + 'std' => 'enable', + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_toolbar_button_readable_font_title', + 'title' => __( 'Readable Font Title', 'pojo-accessibility' ), + 'type' => self::FIELD_TEXT, + 'class' => $toolbar_options_classes . ' pojo-settings-child-row', + 'std' => __( 'Readable Font', 'pojo-accessibility' ), + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_toolbar_button_sitemap_title', + 'title' => __( 'Sitemap Title', 'pojo-accessibility' ), + 'type' => self::FIELD_TEXT, + 'class' => $toolbar_options_classes, + 'std' => __( 'Sitemap', 'pojo-accessibility' ), + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_toolbar_button_sitemap_link', + 'title' => __( 'Sitemap Link', 'pojo-accessibility' ), + 'type' => self::FIELD_TEXT, + 'placeholder' => 'http://your-domain.com/sitemap', + 'desc' => __( 'Link for sitemap page in your website. Leave blank to disable.', + 'pojo-accessibility' ), + 'class' => $toolbar_options_classes . ' pojo-settings-child-row', + 'std' => '', + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_toolbar_button_help_title', + 'title' => __( 'Help Title', 'pojo-accessibility' ), + 'type' => self::FIELD_TEXT, + 'class' => $toolbar_options_classes, + 'std' => __( 'Help', 'pojo-accessibility' ), + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_toolbar_button_help_link', + 'title' => __( 'Help Link', 'pojo-accessibility' ), + 'type' => self::FIELD_TEXT, + 'placeholder' => 'http://your-domain.com/help', + 'desc' => __( 'Link for help page in your website. Leave blank to disable.', 'pojo-accessibility' ), + 'class' => $toolbar_options_classes . ' pojo-settings-child-row', + 'std' => '', + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_toolbar_button_feedback_title', + 'title' => __( 'Feedback Title', 'pojo-accessibility' ), + 'type' => self::FIELD_TEXT, + 'class' => $toolbar_options_classes, + 'std' => __( 'Feedback', 'pojo-accessibility' ), + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_toolbar_button_feedback_link', + 'title' => __( 'Feedback Link', 'pojo-accessibility' ), + 'type' => self::FIELD_TEXT, + 'placeholder' => 'http://your-domain.com/feedback', + 'desc' => __( 'Link for feedback page in your website. Leave blank to disable.', + 'pojo-accessibility' ), + 'class' => $toolbar_options_classes . ' pojo-settings-child-row', + 'std' => '', + ]; + + $sections[] = [ + 'id' => 'section-a11y-toolbar', + 'page' => self::TOOLBAR_PAGE, + 'title' => __( 'Toolbar Settings', 'pojo-accessibility' ), + 'intro' => '', + 'fields' => $fields, + ]; + + $sections[] = [ + 'id' => 'section-a11y-styles', + 'page' => self::TOOLBAR_PAGE, + 'title' => __( 'Style Settings', 'pojo-accessibility' ), + 'intro' => sprintf( __( 'For style settings of accessibility tools go to > Customize > Accessibility.', 'pojo-accessibility' ), + $this->get_admin_url( 'customizer' ) + ), + 'fields' => [], + ]; + + return $sections; + } + + public function section_a11y_settings( $sections ) { + $fields = []; + + $fields[] = [ + 'id' => 'pojo_a11y_focusable', + 'title' => __( 'Add Outline Focus', 'pojo-accessibility' ), + 'type' => self::FIELD_SELECT, + 'desc' => __( 'Add outline to elements on keyboard focus.', 'pojo-accessibility' ), + 'options' => [ + 'enable' => __( 'Enable', 'pojo-accessibility' ), + 'disable' => __( 'Disable', 'pojo-accessibility' ), + ], + 'std' => 'disable', + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_skip_to_content_link', + 'title' => __( 'Skip to Content link', 'pojo-accessibility' ), + 'type' => self::FIELD_SELECT, + 'desc' => __( 'Add skip to content link when using keyboard.', 'pojo-accessibility' ), + 'options' => [ + 'enable' => __( 'Enable', 'pojo-accessibility' ), + 'disable' => __( 'Disable', 'pojo-accessibility' ), + ], + 'std' => 'enable', + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_skip_to_content_link_element_id', + 'title' => __( 'Skip to Content Element ID', 'pojo-accessibility' ), + 'placeholder' => 'content', + 'type' => self::FIELD_TEXT, + 'std' => 'content', + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_remove_link_target', + 'title' => __( 'Remove target attribute from links', 'pojo-accessibility' ), + 'type' => self::FIELD_SELECT, + 'desc' => __( 'This option will reset all your target links to open in the same window or tab.', + 'pojo-accessibility' ), + 'options' => [ + 'enable' => __( 'Enable', 'pojo-accessibility' ), + 'disable' => __( 'Disable', 'pojo-accessibility' ), + ], + 'std' => 'disable', + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_add_role_links', + 'title' => __( 'Add landmark roles to all links', 'pojo-accessibility' ), + 'type' => self::FIELD_SELECT, + 'desc' => __( 'This option will add role="link" to all links on the page.', + 'pojo-accessibility' ), + 'options' => [ + 'enable' => __( 'Enable', 'pojo-accessibility' ), + 'disable' => __( 'Disable', 'pojo-accessibility' ), + ], + 'std' => 'enable', + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_save', + 'title' => __( 'Sitewide Accessibility', 'pojo-accessibility' ), + 'desc' => __( 'Consistent accessibility throughout your site visit. Site remembers you and stays accessible.', + 'pojo-accessibility' ), + 'type' => self::FIELD_SELECT, + 'options' => [ + 'enable' => __( 'Enable', 'pojo-accessibility' ), + 'disable' => __( 'Disable', 'pojo-accessibility' ), + ], + 'std' => 'enable', + ]; + + $fields[] = [ + 'id' => 'pojo_a11y_save_expiration', + 'title' => __( 'Remember user for', 'pojo-accessibility' ), + 'type' => self::FIELD_SELECT, + 'desc' => __( 'Define how long your toolbar settings will be remembered', 'pojo-accessibility' ), + 'options' => [ + '1' => __( '1 Hour', 'pojo-accessibility' ), + '6' => __( '6 Hours', 'pojo-accessibility' ), + '12' => __( '12 Hours', 'pojo-accessibility' ), + '24' => __( '1 Day', 'pojo-accessibility' ), + '48' => __( '2 Days', 'pojo-accessibility' ), + '72' => __( '3 Days', 'pojo-accessibility' ), + '168' => __( '1 Week', 'pojo-accessibility' ), + '720' => __( '1 Month', 'pojo-accessibility' ), + ], + 'std' => '12', + ]; + + $sections[] = [ + 'id' => 'section-a11y-settings', + 'page' => self::SETTINGS_PAGE, + 'title' => __( 'General Settings', 'pojo-accessibility' ), + 'intro' => '', + 'fields' => $fields, + ]; + + return $sections; + } + + public function print_js() { + // TODO: Maybe need to move to other file + ?> + + section_a11y_toolbar( $sections ); + $sections = $this->section_a11y_settings( $sections ); + $this->_sections = $sections; + + return $this->_sections; + } + + public function add_settings_section( $args = [] ) { + $args = wp_parse_args( $args, [ + 'id' => '', + 'title' => '', + ] ); + + foreach ( $this->_sections as $section ) { + if ( $args['id'] !== $section['id'] ) { + continue; + } + if ( empty( $section['intro'] ) ) { + return; + } + printf( '

%s

', $section['intro'] ); + break; + } + } + + public function add_settings_field( $args = [] ) { + if ( empty( $args ) ) { + return; + } + + $args = wp_parse_args( $args, [ + 'id' => '', + 'std' => '', + 'type' => self::FIELD_TEXT, + ] ); + + if ( empty( $args['id'] ) || empty( $args['type'] ) ) { + return; + } + + $field_callback = 'render_' . $args['type'] . '_field'; + if ( method_exists( $this, $field_callback ) ) { + call_user_func( [ $this, $field_callback ], $args ); + } + } + + public function render_select_field( $field ) { + $options = []; + foreach ( $field['options'] as $option_key => $option_value ) { + $options[] = sprintf( + '', + esc_attr( $option_key ), + selected( get_option( $field['id'], $field['std'] ), $option_key, false ), + $option_value + ); + } + ?> + + + +

+ + + /> + + +

+ + get_settings_sections() as $section_key => $section ) { + add_settings_section( + $section['id'], + $section['title'], + [ &$this, 'add_settings_section' ], + $section['page'] + ); + + if ( empty( $section['fields'] ) ) { + continue; + } + + foreach ( $section['fields'] as $field ) { + add_settings_field( + $field['id'], + $field['title'], + [ &$this, 'add_settings_field' ], + $section['page'], + $section['id'], + $field + ); + + $sanitize_callback = [ $this, 'field_html' ]; + if ( ! empty( $field['type'] ) && self::FIELD_CHECKBOX_LIST === $field['type'] ) { + $sanitize_callback = [ $this, 'field_checkbox_list' ]; + } + if ( ! empty( $field['sanitize_callback'] ) ) { + $sanitize_callback = $field['sanitize_callback']; + } + + register_setting( $section['page'], $field['id'], $sanitize_callback ); + } + } + } + + public static function field_html( $input ) { + return stripslashes( wp_filter_post_kses( addslashes( $input ) ) ); + } + + public static function field_checkbox_list( $input ) { + if ( empty( $input ) ) { + $input = []; + } + + return $input; + } + + public function display_settings_page() { + $screen = get_current_screen(); + $screen_id = $screen->id; + if ( false !== strpos( $screen_id, 'toolbar' ) ) { + $screen_id = self::TOOLBAR_PAGE; + } + ?> +
+

_page_title; ?>

+ +
+ +
+ +
+ menu_slug = add_menu_page( + __( 'Accessibility', 'pojo-accessibility' ), + __( 'Accessibility', 'pojo-accessibility' ), + 'manage_options', + 'accessibility-settings', + [ &$this, 'display_settings_page' ], + 'dashicons-universal-access-alt' + ); + add_submenu_page( + 'accessibility-settings', + __( 'Accessibility Settings', 'pojo-accessibility' ), + __( 'Settings', 'pojo-accessibility' ), + 'manage_options', + 'accessibility-settings', + [ &$this, 'display_settings_page' ] + ); + add_submenu_page( + 'accessibility-settings', + __( 'Accessibility Toolbar', 'pojo-accessibility' ), + __( 'Toolbar', 'pojo-accessibility' ), + 'manage_options', + 'accessibility-toolbar', + [ &$this, 'display_settings_page' ] + ); + add_submenu_page( + 'accessibility-settings', + __( 'Customize', 'pojo-accessibility' ), + __( 'Customize', 'pojo-accessibility' ), + 'manage_options', + '/customize.php?autofocus[section]=accessibility' + ); + } + + public function plugin_action_links( $links, $plugin_file ) { + if ( EA11Y_BASE === $plugin_file ) { + $settings = '' . __( 'Settings', 'pojo-accessibility' ) . ''; + $toolbar = '' . __( 'Toolbar', 'pojo-accessibility' ) . ''; + $customizer = '' . __( 'Customize', 'pojo-accessibility' ) . ''; + array_unshift( $links, $customizer ); + array_unshift( $links, $toolbar ); + array_unshift( $links, $settings ); + } + + return $links; + } + + private function get_admin_url( $type ) { + switch ( $type ) { + case 'customizer': + return admin_url( 'customize.php?autofocus[section]=accessibility' ); + break; + case 'general': + return admin_url( 'admin.php?page=accessibility-settings' ); + break; + case 'toolbar': + return admin_url( 'admin.php?page=accessibility-toolbar' ); + break; + } + } + + private function get_default_values() { + if ( empty( $this->_defaults ) ) { + if ( empty( $this->_sections ) ) { + $this->get_settings_sections(); + } + $defaults = []; + foreach ( $this->_sections as $section ) { + foreach ( $section['fields'] as $field ) { + $defaults[ $field['id'] ] = isset( $field['std'] ) ? $field['std'] : ''; + } + } + $this->_defaults = $defaults; + } + } + + public function get_default_title_text( $option ) { + $this->get_default_values(); + $default = isset( $this->_defaults[ $option ] ) ? $this->_defaults[ $option ] : ''; + + return get_option( $option, $default ); + } + + public function __construct() { + $this->_page_title = __( 'One Click Accessibility', 'pojo-accessibility' ); + $this->_page_menu_title = __( 'One Click Accessibility', 'pojo-accessibility' ); + $this->_menu_parent = 'themes.php'; + + add_action( 'admin_menu', [ &$this, 'admin_menu' ], 20 ); + add_action( 'admin_init', [ &$this, 'admin_init' ], 20 ); + add_action( 'admin_footer', [ &$this, 'print_js' ] ); + add_filter( 'plugin_action_links_' . EA11Y_BASE, [ $this, 'plugin_action_links' ], 10, 2 ); + } +} diff --git a/modules/legacy/module.php b/modules/legacy/module.php new file mode 100644 index 00000000..3b04414b --- /dev/null +++ b/modules/legacy/module.php @@ -0,0 +1,67 @@ +get_components( 'Customizer' ); + $customizer_fields = $customizer->get_customizer_fields(); + $options = []; + $mods = get_theme_mods(); + foreach ( $customizer_fields as $field ) { + if ( isset( $mods[ $field['id'] ] ) ) { + $options[ $field['id'] ] = $mods[ $field['id'] ]; + } else { + $options[ $field['id'] ] = $field['std']; + } + } + update_option( POJO_A11Y_CUSTOMIZER_OPTIONS, $options ); + } + } + + public function add_elementor_support() { + $this->register_components( [ 'Elementor' ] ); + } + + public static function get_settings() { + /** + * @var Settings $settings + */ + return Plugin::instance()->modules_manager->get_modules( 'Legacy' )->get_component( 'Settings' ); + } + + /** + * Module constructor. + */ + public function __construct() { + $this->register_components(); + add_action( 'admin_init', [ $this, 'backwards_compatibility' ] ); + add_action( 'elementor/init', [ $this, 'add_elementor_support' ] ); + } +} diff --git a/package.json b/package.json index 8caef295..2ed55696 100644 --- a/package.json +++ b/package.json @@ -4,23 +4,41 @@ "homepage": "http://pojo.me/", "description": "", "version": "2.1.0", + "scripts": { + "build": "wp-scripts build", + "start": "wp-scripts start", + "format": "wp-scripts format", + "lint:js": "wp-scripts lint-js", + "prepare": "husky install", + "local:start": "wp-env start", + "local:stop": "wp-env stop", + "local:composer:dev": "wp-env run cli --env-cwd=wp-content/plugins/one-click-accessibility composer install", + "local:composer:build": "wp-env run cli --env-cwd=wp-content/plugins/one-click-accessibility composer install --no-dev", + "local:wp-cli": "wp-env run cli --env-cwd=wp-content/plugins/one-click-accessibility wp", + "local:phpunit": "wp-env run tests-cli --env-cwd=wp-content/plugins/one-click-accessibility ./vendor/bin/phpunit", + "local:phpunit:cov": "wp-env start --xdebug=coverage && wp-env run tests-cli --env-cwd=wp-content/plugins/one-click-accessibility ./vendor/bin/phpunit --coverage-html /var/www/html/wp-content/plugins/one-click-accessibility/coverage" + }, "devDependencies": { - "grunt": "~1.0.2", - "grunt-checktextdomain": "~1.0.1", - "grunt-phpunit": "~0.3.6", - "grunt-wp-readme-to-markdown-with-extra": "~2.2.0", - "grunt-contrib-jshint": "~1.1.0", - "grunt-contrib-watch": "~1.0.1", - "grunt-contrib-uglify": "~3.3.0", - "grunt-contrib-less": "~1.4.1", - "grunt-banner": "~0.6.0", - "grunt-bumpup": "~0.6.3", - "grunt-shell": "~2.1.0", - "grunt-text-replace": "~0.4.0", - "grunt-release": "~0.14.0", - "grunt-contrib-copy": "~1.0.0", - "grunt-contrib-clean": "~1.1.0", - "grunt-wp-deploy": "~1.2.1", - "matchdep": "~2.0.0" + "@eslint/js": "^9.13.0", + "@wordpress/dom-ready": "^4.10.0", + "@wordpress/env": "^10.10.0", + "@wordpress/eslint-plugin": "^21.3.0", + "@wordpress/scripts": "^30.3.0", + "eslint": "^8.57.1", + "eslint-plugin-babel": "^5.3.1", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.10.1", + "eslint-plugin-react": "^7.37.1" + }, + "dependencies": { + "@elementor/icons": "^1.17.0", + "@elementor/ui": "^1.21.2", + "@wordpress/api-fetch": "^7.10.0", + "@wordpress/core-data": "^7.10.0", + "@wordpress/data": "^10.10.0", + "@wordpress/date": "^5.10.0", + "@wordpress/element": "^6.10.0", + "@wordpress/i18n": "^5.10.0", + "@wordpress/url": "^4.10.0" } -} \ No newline at end of file +} diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 00000000..24f5e897 --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,43 @@ + + + + + + + + + + + + ./tests/phpunit/plugin + + + + + + ./ + + .github + assets + bin + build + docs + node_modules + tests + includes/libraries + libraries + libraries/action-scheduler + vendor + coverage + + + + diff --git a/plugin.php b/plugin.php new file mode 100644 index 00000000..d0f561bd --- /dev/null +++ b/plugin.php @@ -0,0 +1,111 @@ +classes_aliases[ $class ] ); + + // Backward Compatibility: Save old class name for set an alias after the new class is loaded + if ( $has_class_alias ) { + $class_alias_name = $this->classes_aliases[ $class ]; + $class_to_load = $class_alias_name; + } else { + $class_to_load = $class; + } + + if ( ! class_exists( $class_to_load ) ) { + $filename = strtolower( + preg_replace( + [ '/^' . __NAMESPACE__ . '\\\/', '/([a-z])([A-Z])/', '/_/', '/\\\/' ], + [ '', '$1-$2', '-', DIRECTORY_SEPARATOR ], + $class_to_load + ) + ); + $filename = EA11Y_PATH . $filename . '.php'; + + if ( is_readable( $filename ) ) { + include $filename; + } + } + + if ( $has_class_alias ) { + class_alias( $class_alias_name, $class ); + } + } + + private function includes() { + require_once EA11Y_PATH . 'includes/manager.php'; + $this->modules_manager = new \EA11y\Manager(); + } + + /** + * Plugin class constructor + * + * Register plugin action hooks and filters + * + * @access public + */ + public function __construct() { + static $autoloader_registered = false; + if ( ! $autoloader_registered ) { + $autoloader_registered = spl_autoload_register( [ $this, 'autoload' ] ); + } + $this->includes(); + } +} +// Instantiate Plugin Class +Plugin::instance(); diff --git a/pojo-accessibility.php b/pojo-accessibility.php index 54f0af1c..b41e9e94 100644 --- a/pojo-accessibility.php +++ b/pojo-accessibility.php @@ -9,15 +9,21 @@ Text Domain: pojo-accessibility Domain Path: /languages/ */ -if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly +if ( ! defined( 'ABSPATH' ) ) { + exit; +} // Exit if accessed directly -define( 'POJO_A11Y__FILE__', __FILE__ ); -define( 'POJO_A11Y_BASE', plugin_basename( POJO_A11Y__FILE__ ) ); -define( 'POJO_A11Y_URL', plugins_url( '/', POJO_A11Y__FILE__ ) ); -define( 'POJO_A11Y_ASSETS_PATH', plugin_dir_path( POJO_A11Y__FILE__ ) . 'assets/' ); -define( 'POJO_A11Y_ASSETS_URL', POJO_A11Y_URL . 'assets/' ); +// Legacy define( 'POJO_A11Y_CUSTOMIZER_OPTIONS', 'pojo_a11y_customizer_options' ); +define( 'EA11Y_VERSION', '2.1.0' ); +define( 'EA11Y_MAIN_FILE', __FILE__ ); +define( 'EA11Y_BASE', plugin_basename( EA11Y_MAIN_FILE ) ); +define( 'EA11Y_PATH', plugin_dir_path( __FILE__ ) ); +define( 'EA11Y_URL', plugins_url( '/', __FILE__ ) ); +define( 'EA11Y_ASSETS_PATH', EA11Y_PATH . 'assets/' ); +define( 'EA11Y_ASSETS_URL', EA11Y_URL . 'assets/' ); + final class Pojo_Accessibility { /** @@ -26,38 +32,16 @@ final class Pojo_Accessibility { */ public static $instance = null; - /** - * @var Pojo_A11y_Frontend - */ - public $frontend; - - /** - * @var Pojo_A11y_Customizer - */ - public $customizer; - - /** - * @var Pojo_A11y_Settings - */ - public $settings; - - /** - * @var Pojo_A11y_Admin_UI - */ - public $admin_ui; - - public function load_textdomain() { + public function i18n() { load_plugin_textdomain( 'pojo-accessibility' ); } /** * Throw error on object clone - * * The whole idea of the singleton design pattern is that there is a single * object therefore, we don't want the object to be cloned. - * - * @since 1.0.0 * @return void + * @since 1.0.0 */ public function __clone() { // Cloning instances of the class is forbidden @@ -66,9 +50,8 @@ public function __clone() { /** * Disable unserializing of the class - * - * @since 1.0.0 * @return void + * @since 1.0.0 */ public function __wakeup() { // Unserializing instances of the class is forbidden @@ -82,49 +65,30 @@ public static function instance() { if ( is_null( self::$instance ) ) { self::$instance = new self(); } - return self::$instance; - } - - public function bootstrap() { - require( 'includes/pojo-a11y-frontend.php' ); - require( 'includes/pojo-a11y-customizer.php' ); - require( 'includes/pojo-a11y-settings.php' ); - require( 'includes/pojo-a11y-admin-ui.php' ); - $this->frontend = new Pojo_A11y_Frontend(); - $this->customizer = new Pojo_A11y_Customizer(); - $this->settings = new Pojo_A11y_Settings(); - $this->admin_ui = new Pojo_A11y_Admin_UI(); - } - - public function backwards_compatibility() { - if ( false === get_option( POJO_A11Y_CUSTOMIZER_OPTIONS, false ) ) { - $customizer_fields = $this->customizer->get_customizer_fields(); - $options = array(); - $mods = get_theme_mods(); - foreach ( $customizer_fields as $field ) { - if ( isset( $mods[ $field['id'] ] ) ) { - $options[ $field['id'] ] = $mods[ $field['id'] ]; - } else { - $options[ $field['id'] ] = $field['std']; - } - } - update_option( POJO_A11Y_CUSTOMIZER_OPTIONS, $options ); - } + return self::$instance; } - public function add_elementor_support() { - require( 'includes/pojo-a11y-elementor.php' ); - - new Pojo_A11y_Elementor(); + /** + * Initialize the plugin + * Do your Validations here: + * for example checks for basic plugin requirements, if one check fail don't continue, + * if all check have passed include the plugin class. + * Fired by `plugins_loaded` action hook. + * @since 2.2.0 + * @access public + */ + public function init() { + // Once we get here, We have passed all validation checks, so we can safely include our plugin + require_once 'plugin.php'; } private function __construct() { - add_action( 'init', array( &$this, 'bootstrap' ) ); - add_action( 'admin_init', array( &$this, 'backwards_compatibility' ) ); - add_action( 'plugins_loaded', array( &$this, 'load_textdomain' ) ); + // Load translation + add_action( 'init', [ $this, 'i18n' ] ); - add_action( 'elementor/init', array( $this, 'add_elementor_support' ) ); + // Init Plugin + add_action( 'plugins_loaded', [ $this, 'init' ] ); } } diff --git a/ruleset.xml b/ruleset.xml new file mode 100644 index 00000000..654bb9fe --- /dev/null +++ b/ruleset.xml @@ -0,0 +1,54 @@ + + + Elementor Coding Standard + + + + + + vendor/ + tmp/ + build/ + node_modules/ + includes/libraries/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/bootstrap.php b/tests/bootstrap.php old mode 100755 new mode 100644 index 2b9ce1bf..b2392946 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -1,32 +1,40 @@ array( PLUGIN_PATH ), -); +if ( ! file_exists( $_tests_dir . '/includes/functions.php' ) ) { + // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- CLI + throw new Exception( "Could not find $_tests_dir/includes/functions.php, have you run bin/install-wp-tests.sh?" ); // NOSONAR +} +// Give access to tests_add_filter() function. +/** @psalm-suppress UnresolvableInclude */ require_once $_tests_dir . '/includes/functions.php'; -tests_add_filter( - 'muplugins_loaded', - function() { - // Manually load plugin - require dirname( __DIR__ ) . '/' . PLUGIN_FILE; - } -); +function _manually_load_plugin(): void { + require dirname( __DIR__ ) . '/pojo-accessibility.php'; +} + +tests_add_filter( 'muplugins_loaded', '_manually_load_plugin' ); + +// Start up the WP testing environment. +/** @psalm-suppress UnresolvableInclude */ +require $_tests_dir . '/includes/bootstrap.php'; -// Removes all sql tables on shutdown -// Do this action last -tests_add_filter( 'shutdown', 'drop_tables', 999999 ); +// @phpcs:disable -require $_tests_dir . '/includes/bootstrap.php'; \ No newline at end of file +//module tests +include_once dirname( __DIR__ ) . '/tests/phpunit/helpers/module-test-base.php'; +//rest tests +include_once dirname( __DIR__ ) . '/tests/phpunit/helpers/route-test.php'; +//test base with factories +include_once dirname( __DIR__ ) . '/tests/phpunit/helpers/test-base.php'; +// functions +include_once dirname( __DIR__ ) . '/tests/phpunit/helpers/functions.php'; +// phpcs:enable diff --git a/tests/phpunit/helpers/functions.php b/tests/phpunit/helpers/functions.php new file mode 100644 index 00000000..979173de --- /dev/null +++ b/tests/phpunit/helpers/functions.php @@ -0,0 +1,8 @@ +module; + + + if ( ! method_exists( $module, 'routes_list' ) || empty( $module::routes_list() ) ) { + $this->assertTrue( true, 'No routes to test' ); + return; + } + $routes = $module::routes_list(); + + $this->assertTrue( is_array( $routes ), + 'Test that the routes are returned as an array' + ); + + $this->assertCount( count( $this->routes ), $routes, + 'Test that the number of routes are as expected' + ); + + foreach ( $this->routes as $route ) { + $this->assertContains( $route, $routes, + 'Test that Route "' . $route . '" is registered' + ); + } + } + + public function test_components() { + /** + * @var Module_Base $module + */ + $module = $this->module; + if ( method_exists( $module, 'component_list' ) === false || empty( $module::component_list() ) ) { + $this->assertTrue( true, 'No components to test' ); + return; + } + $components = $module::component_list(); + + $this->assertTrue( is_array( $components ), + 'Test that the components are returned as an array' + ); + + $this->assertCount( count( $this->components ), $components, + 'Test that the number of components are as expected' + ); + + foreach ( $this->components as $component ) { + $this->assertContains( $component, $components, + 'Test that component "' . $component . '" is registered' + ); + } + } + + /** + * test_constructor + */ + public function test_constructor() { + $this->test_components(); + $this->test_routes(); + } +} diff --git a/tests/phpunit/helpers/route-test.php b/tests/phpunit/helpers/route-test.php new file mode 100644 index 00000000..446ce0f0 --- /dev/null +++ b/tests/phpunit/helpers/route-test.php @@ -0,0 +1,31 @@ +route with an actual instance of the route class we are testing + $this->route = $this->get_plugin_module( $this->module_name )->routes[ $this->class_name ]; + + /** + * this includes automated unit tests for: + * - Test that the route is registered + * - Test route name is correct + * - Test allowed methods are correct + * - Test Endpoint is configured correctly + */ + } +} diff --git a/tests/phpunit/helpers/test-base.php b/tests/phpunit/helpers/test-base.php new file mode 100644 index 00000000..a9d165c8 --- /dev/null +++ b/tests/phpunit/helpers/test-base.php @@ -0,0 +1,40 @@ +subscriber = $this->factory->user->create( [ 'role' => 'subscriber' ] ); + $this->editor = $this->factory->user->create( [ 'role' => 'editor' ] ); + $this->administrator = $this->factory->user->create( [ 'role' => 'administrator' ] ); + + // Factories + $this->factory->log = new \WP_UnitTest_Factory_For_Log( $this->factory ); + } + + + /** + * tearDown + */ + public function tearDown() : void { + parent::tearDown(); + } + + public function get_plugin() { + return \EA11y\Plugin::instance(); + } + + public function get_plugin_module( $name ) { + /** + * @var Module_Base $module + */ + $module = '\EA11y\\Modules\\' . $name . '\Module'; + return $module::instance(); + } +} diff --git a/tests/phpunit/plugin/modules/legacy/module-test.php b/tests/phpunit/plugin/modules/legacy/module-test.php new file mode 100644 index 00000000..4f5af7ab --- /dev/null +++ b/tests/phpunit/plugin/modules/legacy/module-test.php @@ -0,0 +1,20 @@ +assertTrue( is_plugin_active( PLUGIN_PATH ) ); - } - - public function test_getInstance() { - $this->assertInstanceOf( 'Pojo_Accessibility', Pojo_Accessibility::instance() ); - } - -} \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 00000000..7216c1cf --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,20 @@ +const path = require( 'path' ); +const defaultConfig = require( '@wordpress/scripts/config/webpack.config' ); + +// add your entry points here +const entryPoints = { + // admin: path.resolve( + // process.cwd(), + // 'assets/dev/js', + // 'admin.js', + // ), +}; + +module.exports = { + ...defaultConfig, + entry: entryPoints, + output: { + ...defaultConfig.output, + path: path.resolve( process.cwd(), 'assets/build' ), + }, +}; From afdac766505bf4c90738c4d41c32eff89b6b936a Mon Sep 17 00:00:00 2001 From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com> Date: Thu, 7 Nov 2024 13:02:12 +0530 Subject: [PATCH 003/292] Setup base (#110) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Initial refactor commit * ✅ Added build and tests CI/CD * update: add src for admin settings * update: incorrect constant names * update: namespace * add: accessibility settings * update: webpack to output files inside a folder * update: build output folders * update: removed commented code * update: npm scripts * add: webpack config * add: hooks * update: move admin setting to the module folder * update: assets loading logic * update: settings variable * update: removed duplicate css import * Update modules/settings/assets/js/api/index.js Co-authored-by: VasylD --------- Co-authored-by: Ohad Co-authored-by: VasylD --- classes/utils/assets.php | 10 +- includes/manager.php | 1 + modules/settings/assets/css/style.css | 37 +++++ modules/settings/assets/js/admin.js | 26 ++++ .../assets/js/api/exceptions/APIError.js | 9 ++ modules/settings/assets/js/api/index.js | 132 ++++++++++++++++++ modules/settings/assets/js/app.js | 14 ++ .../js/components/admin-top-bar/index.js | 35 +++++ modules/settings/assets/js/constants/index.js | 2 + modules/settings/assets/js/hooks/index.js | 0 modules/settings/assets/js/hooks/use-auth.js | 33 +++++ modules/settings/assets/js/hooks/use-modal.js | 22 +++ .../assets/js/icons/elementor-logo.js | 21 +++ modules/settings/module.php | 97 +++++++++++++ webpack.config.js | 10 +- 15 files changed, 439 insertions(+), 10 deletions(-) create mode 100644 modules/settings/assets/css/style.css create mode 100644 modules/settings/assets/js/admin.js create mode 100644 modules/settings/assets/js/api/exceptions/APIError.js create mode 100644 modules/settings/assets/js/api/index.js create mode 100644 modules/settings/assets/js/app.js create mode 100644 modules/settings/assets/js/components/admin-top-bar/index.js create mode 100644 modules/settings/assets/js/constants/index.js create mode 100644 modules/settings/assets/js/hooks/index.js create mode 100644 modules/settings/assets/js/hooks/use-auth.js create mode 100644 modules/settings/assets/js/hooks/use-modal.js create mode 100644 modules/settings/assets/js/icons/elementor-logo.js create mode 100644 modules/settings/module.php diff --git a/classes/utils/assets.php b/classes/utils/assets.php index db3ac8ed..aa2e2cf5 100644 --- a/classes/utils/assets.php +++ b/classes/utils/assets.php @@ -60,7 +60,7 @@ public static function enqueue_styles( string $handle, string $style_name, array * @return string */ private static function get_assets_version( string $version = '' ) : string { - return empty( $version ) ? EA11Y_VERSION : $version; + return empty( $version ) ? \EA11Y_VERSION : $version; } /** @@ -95,7 +95,7 @@ private static function get_asset_version_and_suffix( string $version = '' ) : a * @return string */ private static function get_assets_path( string $asset_name, string $asset_type, string $suffix = '' ) : string { - return EA11Y_ASSETS_URL . '/build/' . $asset_name . $suffix . '.' . $asset_type; + return \EA11Y_ASSETS_URL . '/build/' . $asset_name . $suffix . '.' . $asset_type; } /** @@ -105,8 +105,8 @@ private static function get_assets_path( string $asset_name, string $asset_type, * @param bool $with_css */ public static function enqueue_app_assets( string $handle = '', bool $with_css = true ) : void { - $dir = EA11Y_ASSETS_PATH . 'build/'; - $url = EA11Y_ASSETS_URL . 'build/'; + $dir = \EA11Y_ASSETS_PATH . 'build/'; + $url = \EA11Y_ASSETS_URL . 'build/'; $script_asset_path = $dir . $handle . '.asset.php'; if ( ! file_exists( $script_asset_path ) ) { @@ -133,7 +133,7 @@ public static function enqueue_app_assets( string $handle = '', bool $with_css = } // enqueue css $css_file_name = 'style-' . $handle . '.css'; - $css_version = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? filemtime( $dir . $css_file_name ) : EA11Y_VERSION; + $css_version = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? filemtime( $dir . $css_file_name ) : \EA11Y_VERSION; wp_enqueue_style( $handle, $url . $css_file_name, diff --git a/includes/manager.php b/includes/manager.php index a8b29d6b..b8517576 100644 --- a/includes/manager.php +++ b/includes/manager.php @@ -17,6 +17,7 @@ final class Manager { public static function get_module_list(): array { return [ 'Legacy', + 'Settings' ]; } diff --git a/modules/settings/assets/css/style.css b/modules/settings/assets/css/style.css new file mode 100644 index 00000000..72965c8e --- /dev/null +++ b/modules/settings/assets/css/style.css @@ -0,0 +1,37 @@ +body { + background: #fff; +} +.wrap { + margin-top: 0; +} + +html:not([dir='rtl']) #ea11y-app { + margin-left: -20px; + background: white; +} + +html[dir='rtl'] #ea11y-app { + margin-right: -20px; + background: white; +} + +html:not([dir='rtl']) #ea11y-app-top-bar { + margin-left: -20px; + margin-bottom: 20px; +} + +html[dir='rtl'] #ea11y-app-top-bar { + margin-right: -20px; + margin-bottom: 20px; +} + +#ea11y-app * { + box-sizing: border-box; +} + +.ea11y-textfield .MuiInputBase-input { + height: 40px; + padding: 8px 12px; + box-shadow: none; + border-color: rgba(12, 13, 14, 0.23); +} \ No newline at end of file diff --git a/modules/settings/assets/js/admin.js b/modules/settings/assets/js/admin.js new file mode 100644 index 00000000..4e51e3ad --- /dev/null +++ b/modules/settings/assets/js/admin.js @@ -0,0 +1,26 @@ +import { ThemeProvider } from '@elementor/ui/styles'; +import { StrictMode, Fragment, createRoot } from '@wordpress/element'; +import App from './app'; +import AdminTopBar from './components/admin-top-bar'; + +const rootNode = document.getElementById( 'ea11y-app' ); +const topBarNode = document.getElementById( 'ea11y-app-top-bar' ); + +// Can't use the settings hook in the global scope so accessing directly +const isDevelopment = window?.ea11ySettingsData?.isDevelopment; +const AppWrapper = Boolean( isDevelopment ) ? StrictMode : Fragment; + +const root = createRoot( rootNode ); +const topBar = createRoot( topBarNode ); + +topBar.render( + + + , +); + +root.render( + + + , +); diff --git a/modules/settings/assets/js/api/exceptions/APIError.js b/modules/settings/assets/js/api/exceptions/APIError.js new file mode 100644 index 00000000..f13a1f1f --- /dev/null +++ b/modules/settings/assets/js/api/exceptions/APIError.js @@ -0,0 +1,9 @@ +class APIError extends Error { + constructor( message ) { + super( message ); + + this.name = 'APIError'; + } +} + +export default APIError; diff --git a/modules/settings/assets/js/api/index.js b/modules/settings/assets/js/api/index.js new file mode 100644 index 00000000..2648f103 --- /dev/null +++ b/modules/settings/assets/js/api/index.js @@ -0,0 +1,132 @@ +import apiFetch from '@wordpress/api-fetch'; +import { addQueryArgs } from '@wordpress/url'; +import APIError from './exceptions/APIError'; + +const wpV2Prefix = '/wp/v2'; +const v1Prefix = '/ea11y/v1'; + +class API { + static async request( { path, data, method = 'POST' } ) { + try { + if ( 'GET' === method && ! path.startsWith( wpV2Prefix ) ) { + path = addQueryArgs( path, { sb_time: new Date().getTime() } ); + } + + const response = await apiFetch( { + path, + method, + data, + } ); + + if ( path.startsWith( wpV2Prefix ) ) { + return response; + } + + if ( ! response.success ) { + throw new APIError( response.data.message ); + } + + return response.data; + } catch ( e ) { + if ( e instanceof APIError ) { + throw e; + } else { + throw new APIError( e.message ); + } + } + } + + static async initConnect( context = 'new' ) { + const data = { + wp_rest: window?.ea11ySettingsData?.wpRestNonce, + }; + + if ( 'update' === context ) { + data.update_redirect_uri = true; + } + + return API.request( { + method: 'POST', + path: `${ v1Prefix }/connect/authorize`, + data, + } ); + } + + static async clearSession() { + return API.request( { + method: 'POST', + path: `${ v1Prefix }/connect/deactivate_and_disconnect`, + data: { + wp_rest: window?.ea11ySettingsData?.wpRestNonce, + clear_session: true, + }, + } ); + } + + static async deactivateAndDisconnect() { + return API.request( { + method: 'POST', + path: `${ v1Prefix }/connect/deactivate_and_disconnect`, + data: { + wp_rest: window?.ea11ySettingsData?.wpRestNonce, + }, + } ); + } + + static async deactivate() { + return API.request( { + method: 'POST', + path: `${ v1Prefix }/connect/deactivate`, + data: { + wp_rest: window?.ea11ySettingsData?.wpRestNonce, + }, + } ); + } + + static async disconnect() { + return API.request( { + method: 'POST', + path: `${ v1Prefix }/connect/disconnect`, + data: { + wp_rest: window?.ea11ySettingsData?.wpRestNonce, + }, + } ); + } + + static async reconnect() { + return API.request( { + method: 'POST', + path: `${ v1Prefix }/connect/reconnect`, + data: { + wp_rest: window?.ea11ySettingsData?.wpRestNonce, + }, + } ); + } + + static async getSettings() { + return API.request( { + method: 'GET', + path: `${ wpV2Prefix }/settings`, + } ); + } + + static async updateSettings( data ) { + return API.request( { + method: 'PUT', + path: `${ wpV2Prefix }/settings`, + data, + } ); + } + + /** + * @return {Promise} {} + */ + static async getPluginSettings() { + return API.request( { + method: 'GET', + path: `${ v1Prefix }/settings/get-settings`, + } ); + } +} + +export default API; diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js new file mode 100644 index 00000000..35d5bfb3 --- /dev/null +++ b/modules/settings/assets/js/app.js @@ -0,0 +1,14 @@ +import '../css/style.css'; +import DirectionProvider from '@elementor/ui/DirectionProvider'; +import { ThemeProvider } from '@elementor/ui/styles'; + +const App = () => { + return ( + + + + + ); +}; + +export default App; diff --git a/modules/settings/assets/js/components/admin-top-bar/index.js b/modules/settings/assets/js/components/admin-top-bar/index.js new file mode 100644 index 00000000..b789079b --- /dev/null +++ b/modules/settings/assets/js/components/admin-top-bar/index.js @@ -0,0 +1,35 @@ +import HelpIcon from '@elementor/icons/HelpIcon'; +import AppBar from '@elementor/ui/AppBar'; +import Grid from '@elementor/ui/Grid'; +import Link from '@elementor/ui/Link'; +import Toolbar from '@elementor/ui/Toolbar'; +import Typography from '@elementor/ui/Typography'; +import { __ } from '@wordpress/i18n'; +import { HELP_LINK } from '../../constants'; +import ElementorLogo from '../../icons/elementor-logo'; + +const AdminTopBar = () => { + return ( + + + + + + { __( 'Accessibility', 'pojo-accessibility' ) } + + + + + + + + + ); +}; + +export default AdminTopBar; diff --git a/modules/settings/assets/js/constants/index.js b/modules/settings/assets/js/constants/index.js new file mode 100644 index 00000000..c4169b45 --- /dev/null +++ b/modules/settings/assets/js/constants/index.js @@ -0,0 +1,2 @@ +export const HELP_LINK = 'https://go.elementor.com/'; +export const UPGRADE_LINK = 'https://go.elementor.com/'; diff --git a/modules/settings/assets/js/hooks/index.js b/modules/settings/assets/js/hooks/index.js new file mode 100644 index 00000000..e69de29b diff --git a/modules/settings/assets/js/hooks/use-auth.js b/modules/settings/assets/js/hooks/use-auth.js new file mode 100644 index 00000000..22ae0650 --- /dev/null +++ b/modules/settings/assets/js/hooks/use-auth.js @@ -0,0 +1,33 @@ +import API from '../api'; +import { UPGRADE_LINK } from '../constants'; +import { usePluginSettingsContext } from '../context/plugin-settings-context'; + +const useAuth = () => { + const { subscriptionId } = 123; + + const redirectToConnect = async () => { + const link = await getConnectLink(); + + window.open( link, '_self' ).focus(); + }; + + const getConnectLink = async () => { + return API.initConnect(); + }; + + const getUpgradeLink = () => { + const url = new URL( UPGRADE_LINK ); + + url.searchParams.append( 'subscription_id', subscriptionId ); + + return url.toString(); + }; + + return { + redirectToConnect, + getConnectLink, + getUpgradeLink, + }; +}; + +export default useAuth; diff --git a/modules/settings/assets/js/hooks/use-modal.js b/modules/settings/assets/js/hooks/use-modal.js new file mode 100644 index 00000000..6ae362b5 --- /dev/null +++ b/modules/settings/assets/js/hooks/use-modal.js @@ -0,0 +1,22 @@ +import { useState } from '@wordpress/element'; + +const useModal = ( defaultIsOpen = true ) => { + const [ isOpen, setIsOpen ] = useState( defaultIsOpen ); + + const open = () => { + setIsOpen( true ); + }; + + const close = () => { + setIsOpen( false ); + }; + + return { + isOpen, + setIsOpen, + open, + close, + }; +}; + +export default useModal; diff --git a/modules/settings/assets/js/icons/elementor-logo.js b/modules/settings/assets/js/icons/elementor-logo.js new file mode 100644 index 00000000..cc62ff43 --- /dev/null +++ b/modules/settings/assets/js/icons/elementor-logo.js @@ -0,0 +1,21 @@ +import SvgIcon from '@elementor/ui/SvgIcon'; + +const ElementorLogo = ( { size } ) => { + return ( + + + + + + + + + + + + ); +}; + +export default ElementorLogo; diff --git a/modules/settings/module.php b/modules/settings/module.php new file mode 100644 index 00000000..4cbd68f0 --- /dev/null +++ b/modules/settings/module.php @@ -0,0 +1,97 @@ +id ) { + return; + } + + ?> +
+ + +
+

+
+ +
+ wp_create_nonce( 'wp_rest' ) ] + ); + } + + /** + * Module constructor. + */ + public function __construct() { + $this->register_components(); + add_action( 'admin_menu', [ $this, 'register_page' ] ); + add_action( 'in_admin_header', [ $this, 'render_top_bar' ] ); + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] ); + } +} diff --git a/webpack.config.js b/webpack.config.js index 7216c1cf..b40d4aae 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -3,11 +3,11 @@ const defaultConfig = require( '@wordpress/scripts/config/webpack.config' ); // add your entry points here const entryPoints = { - // admin: path.resolve( - // process.cwd(), - // 'assets/dev/js', - // 'admin.js', - // ), + admin: path.resolve( + process.cwd(), + 'modules/settings/assets/js', + 'admin.js', + ), }; module.exports = { From 88d5396bf539edda9829383e1c0adfc5e7e365f0 Mon Sep 17 00:00:00 2001 From: Raz Ohad Date: Wed, 13 Nov 2024 15:18:09 +0700 Subject: [PATCH 004/292] =?UTF-8?q?[Infra]=20=E2=9C=85=20updated=20Github?= =?UTF-8?q?=20actions=20(#114)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * updated github actions * removed composer github auth * PHPCS * removed package-lock.json from ignore to allow `npm ci` * added missing husky * ignore legacy * removed unused non existing import --- .eslintignore | 1 + .github/workflows/build.yml | 8 +- .github/workflows/js-ci.yml | 4 +- .github/workflows/php-coding-standards.yml | 7 +- .github/workflows/phpunit.yml | 19 +- .gitignore | 1 - .husky/pre-commit | 1 + includes/manager.php | 2 +- modules/settings/assets/js/hooks/use-auth.js | 1 - package-lock.json | 23044 +++++++++++++++++ package.json | 3 +- 11 files changed, 23059 insertions(+), 32 deletions(-) create mode 100644 .husky/pre-commit create mode 100644 package-lock.json diff --git a/.eslintignore b/.eslintignore index 9184afc5..fdd896e1 100644 --- a/.eslintignore +++ b/.eslintignore @@ -8,3 +8,4 @@ libraries/** coverage/** assets/build/** tests/** +modules/legacy/assets/** diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bfe9bf8f..ff59e6b8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,18 +26,14 @@ jobs: uses: actions/checkout@v4 - name: Set up PHP - uses: shivammathur/setup-php@a36e1e52ff4a1c9e9c9be31551ee4712a6cb6bd0 # 2.27.1 + uses: shivammathur/setup-php@v2 with: php-version: '7.4' env: fail-fast: 'true' - - name: OAuth Composer Authentication - run: - composer config -g github-oauth.github.com ${{ secrets.DEVOPS_TOKEN }} - - name: Install Composer dependencies cache - uses: ramsey/composer-install@v2 + uses: ramsey/composer-install@v3 - name: Install Composer dependencies run: diff --git a/.github/workflows/js-ci.yml b/.github/workflows/js-ci.yml index efcf141b..f5dfef7f 100644 --- a/.github/workflows/js-ci.yml +++ b/.github/workflows/js-ci.yml @@ -23,10 +23,10 @@ jobs: node-version: [18.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@@v4 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: 'npm' diff --git a/.github/workflows/php-coding-standards.yml b/.github/workflows/php-coding-standards.yml index 26a91dc4..1369ad63 100644 --- a/.github/workflows/php-coding-standards.yml +++ b/.github/workflows/php-coding-standards.yml @@ -24,7 +24,7 @@ jobs: uses: actions/checkout@v4 - name: Set up PHP - uses: shivammathur/setup-php@a36e1e52ff4a1c9e9c9be31551ee4712a6cb6bd0 # 2.27.1 + uses: shivammathur/setup-php@v2 with: php-version: '7.4' coverage: none @@ -39,11 +39,8 @@ jobs: phpcs -i composer --version - - name: Oauth Composer authentication - run: composer config -g github-oauth.github.com ${{ secrets.DEVOPS_TOKEN }} - - name: Install dependencies - uses: ramsey/composer-install@83af392bf5f031813d25e6fe4cd626cdba9a2df6 # 2.2.0 + uses: ramsey/composer-install@v3 - name: Add error matcher run: echo "::add-matcher::$(pwd)/.github/checkstyle-problem-matcher.json" diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml index 2f9665c7..a85ad10d 100644 --- a/.github/workflows/phpunit.yml +++ b/.github/workflows/phpunit.yml @@ -51,7 +51,7 @@ jobs: MYSQL_DATABASE: wordpress_test steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Matrix variables id: matrix @@ -76,7 +76,7 @@ jobs: fi - name: Set up PHP - uses: shivammathur/setup-php@a36e1e52ff4a1c9e9c9be31551ee4712a6cb6bd0 # 2.27.1 + uses: shivammathur/setup-php@v2 with: coverage: ${{ steps.coverage.outputs.coverage }} ini-values: ${{ steps.coverage.outputs.ini }} @@ -89,12 +89,8 @@ jobs: wget -q -O /usr/local/bin/phpunit "https://phar.phpunit.de/phpunit-${{ matrix.phpunit }}.phar" chmod +x /usr/local/bin/phpunit - - name: Oauth Composer authentication - run: - composer config -g github-oauth.github.com ${{ secrets.DEVOPS_TOKEN }} - - name: Install dependencies - uses: ramsey/composer-install@83af392bf5f031813d25e6fe4cd626cdba9a2df6 # 2.2.0 + uses: ramsey/composer-install@v3 #- name: Install Node.js # uses: actions/setup-node@v2 @@ -108,7 +104,7 @@ jobs: # run: npm run build - name: Set up WordPress and WordPress Test Library - uses: sjinks/setup-wordpress-test-library@dd7f8144e892b042e034d713b734f7a19446abe1 # 2.0.1 + uses: sjinks/setup-wordpress-test-library@master with: version: ${{ matrix.wp }} @@ -137,10 +133,3 @@ jobs: OPTIONS="$OPTIONS --coverage-clover=clover.xml" fi phpunit --order-by=random ${OPTIONS} - - - name: Upload coverage report - uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d # v3.1.4 - with: - files: clover.xml - flags: unittests - if: ${{ steps.coverage.outputs.coverage != 'none' }} diff --git a/.gitignore b/.gitignore index 4d1728c0..e0a3e550 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,6 @@ vendor/ composer.lock npm-debug.log .DS_Store -package-lock.json bin/.env */node_modules !assets/dev/* diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 00000000..6566d25c --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +npm run lint:js diff --git a/includes/manager.php b/includes/manager.php index b8517576..cc781854 100644 --- a/includes/manager.php +++ b/includes/manager.php @@ -17,7 +17,7 @@ final class Manager { public static function get_module_list(): array { return [ 'Legacy', - 'Settings' + 'Settings', ]; } diff --git a/modules/settings/assets/js/hooks/use-auth.js b/modules/settings/assets/js/hooks/use-auth.js index 22ae0650..4ce59147 100644 --- a/modules/settings/assets/js/hooks/use-auth.js +++ b/modules/settings/assets/js/hooks/use-auth.js @@ -1,6 +1,5 @@ import API from '../api'; import { UPGRADE_LINK } from '../constants'; -import { usePluginSettingsContext } from '../context/plugin-settings-context'; const useAuth = () => { const { subscriptionId } = 123; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..6f980a24 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,23044 @@ +{ + "name": "pojo-accessibility", + "version": "2.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "pojo-accessibility", + "version": "2.1.0", + "dependencies": { + "@elementor/icons": "^1.17.0", + "@elementor/ui": "^1.21.2", + "@wordpress/api-fetch": "^7.10.0", + "@wordpress/core-data": "^7.10.0", + "@wordpress/data": "^10.10.0", + "@wordpress/date": "^5.10.0", + "@wordpress/element": "^6.10.0", + "@wordpress/i18n": "^5.10.0", + "@wordpress/url": "^4.10.0" + }, + "devDependencies": { + "@eslint/js": "^9.13.0", + "@wordpress/dom-ready": "^4.10.0", + "@wordpress/env": "^10.10.0", + "@wordpress/eslint-plugin": "^21.3.0", + "@wordpress/scripts": "^30.3.0", + "eslint": "^8.57.1", + "eslint-plugin-babel": "^5.3.1", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.10.1", + "eslint-plugin-react": "^7.37.1", + "husky": "^9.1.6" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ariakit/core": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/@ariakit/core/-/core-0.4.12.tgz", + "integrity": "sha512-+NNpy88tdP/w9mOBPuDrMTbtapPbo/8yVIzpQB7TAmN0sPh/Cq3nU1f2KCTCIujPmwRvAcMSW9UHOlFmbKEPOA==" + }, + "node_modules/@ariakit/react": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/@ariakit/react/-/react-0.4.13.tgz", + "integrity": "sha512-pTGYgoqCojfyt2xNJ5VQhejxXwwtcP7VDDqcnnVChv7TA2TWWyYerJ5m4oxViI1pgeNqnHZwKlQ79ZipF7W2kQ==", + "dependencies": { + "@ariakit/react-core": "0.4.13" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ariakit" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@ariakit/react-core": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/@ariakit/react-core/-/react-core-0.4.13.tgz", + "integrity": "sha512-iIjQeupP9d0pOubOzX4a0UPXbhXbp0ZCduDpkv7+u/pYP/utk/YRECD0M/QpZr6YSeltmDiNxKjdyK8r9Yhv4Q==", + "dependencies": { + "@ariakit/core": "0.4.12", + "@floating-ui/dom": "^1.0.0", + "use-sync-external-store": "^1.2.0" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", + "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.25.7.tgz", + "integrity": "sha512-B+BO9x86VYsQHimucBAL1fxTJKF4wyKY6ZVzee9QgzdZOUfs3BaR6AQrgoGrRI+7IFS1wUz/VyQ+SoBcSpdPbw==", + "dev": true, + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", + "dependencies": { + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz", + "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz", + "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", + "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "dev": true, + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", + "dependencies": { + "@babel/types": "^7.26.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "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, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", + "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz", + "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz", + "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-simple-access": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", + "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.9.tgz", + "integrity": "sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", + "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.7.tgz", + "integrity": "sha512-vILAg5nwGlR9EXE8JIOX4NHXd49lrYbN8hnjffDtoULwpL9hUx/N55nqh2qd0q6FyNDfjl9V79ecKGvFbcSA0Q==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-jsx": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", + "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development/node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", + "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", + "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.7.tgz", + "integrity": "sha512-Y9p487tyTzB0yDYQOtWnC+9HGOuogtP3/wNpun1xJXEEvI6vip59BSBTsHnekZLqxmPcgsrAKt46HAAb//xGhg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz", + "integrity": "sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.7.tgz", + "integrity": "sha512-Gibz4OUdyNqqLj+7OAvBZxOD7CklCtMA5/j0JgUEwOnaRULsPDXmic2iKxL2DX2vQduPR5wH2hjZas/Vr/Oc0g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.25.7", + "@babel/plugin-syntax-import-attributes": "^7.25.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.7", + "@babel/plugin-transform-async-to-generator": "^7.25.7", + "@babel/plugin-transform-block-scoped-functions": "^7.25.7", + "@babel/plugin-transform-block-scoping": "^7.25.7", + "@babel/plugin-transform-class-properties": "^7.25.7", + "@babel/plugin-transform-class-static-block": "^7.25.7", + "@babel/plugin-transform-classes": "^7.25.7", + "@babel/plugin-transform-computed-properties": "^7.25.7", + "@babel/plugin-transform-destructuring": "^7.25.7", + "@babel/plugin-transform-dotall-regex": "^7.25.7", + "@babel/plugin-transform-duplicate-keys": "^7.25.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.7", + "@babel/plugin-transform-dynamic-import": "^7.25.7", + "@babel/plugin-transform-exponentiation-operator": "^7.25.7", + "@babel/plugin-transform-export-namespace-from": "^7.25.7", + "@babel/plugin-transform-for-of": "^7.25.7", + "@babel/plugin-transform-function-name": "^7.25.7", + "@babel/plugin-transform-json-strings": "^7.25.7", + "@babel/plugin-transform-literals": "^7.25.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.7", + "@babel/plugin-transform-member-expression-literals": "^7.25.7", + "@babel/plugin-transform-modules-amd": "^7.25.7", + "@babel/plugin-transform-modules-commonjs": "^7.25.7", + "@babel/plugin-transform-modules-systemjs": "^7.25.7", + "@babel/plugin-transform-modules-umd": "^7.25.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.7", + "@babel/plugin-transform-new-target": "^7.25.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.7", + "@babel/plugin-transform-numeric-separator": "^7.25.7", + "@babel/plugin-transform-object-rest-spread": "^7.25.7", + "@babel/plugin-transform-object-super": "^7.25.7", + "@babel/plugin-transform-optional-catch-binding": "^7.25.7", + "@babel/plugin-transform-optional-chaining": "^7.25.7", + "@babel/plugin-transform-parameters": "^7.25.7", + "@babel/plugin-transform-private-methods": "^7.25.7", + "@babel/plugin-transform-private-property-in-object": "^7.25.7", + "@babel/plugin-transform-property-literals": "^7.25.7", + "@babel/plugin-transform-regenerator": "^7.25.7", + "@babel/plugin-transform-reserved-words": "^7.25.7", + "@babel/plugin-transform-shorthand-properties": "^7.25.7", + "@babel/plugin-transform-spread": "^7.25.7", + "@babel/plugin-transform-sticky-regex": "^7.25.7", + "@babel/plugin-transform-template-literals": "^7.25.7", + "@babel/plugin-transform-typeof-symbol": "^7.25.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.7", + "@babel/plugin-transform-unicode-property-regex": "^7.25.7", + "@babel/plugin-transform-unicode-regex": "^7.25.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.38.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.25.9.tgz", + "integrity": "sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-transform-react-display-name": "^7.25.9", + "@babel/plugin-transform-react-jsx": "^7.25.9", + "@babel/plugin-transform-react-jsx-development": "^7.25.9", + "@babel/plugin-transform-react-pure-annotations": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react/node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", + "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.25.7.tgz", + "integrity": "sha512-rkkpaXJZOFN45Fb+Gki0c+KMIglk4+zZXOoMJuyEK8y8Kkc8Jd3BDmP7qPsz0zQMJj+UD7EprF+AqAXcILnexw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-syntax-jsx": "^7.25.7", + "@babel/plugin-transform-modules-commonjs": "^7.25.7", + "@babel/plugin-transform-typescript": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", + "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.1" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz", + "integrity": "sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.1.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@dual-bundle/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/@elementor/icons": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@elementor/icons/-/icons-1.18.1.tgz", + "integrity": "sha512-/69Adp/Q0ebKQOnNKekzX3ym7CQNotBq4JXO+pqtUXbqwbL0O7k56aR81yZSVns1TMOip5+Qxbgxemth0k0FlQ==", + "peerDependencies": { + "@elementor/ui": "^1.4.61", + "react": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@elementor/ui": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/@elementor/ui/-/ui-1.21.7.tgz", + "integrity": "sha512-bY9GxS8/ZKafAX3yzCGgWmsuHxsl2N5IUITkG8BjazdS4ujXVpFJ/1JY7yZG3mxPcsIrk2cYn5pl0tHwVgG+6Q==", + "dependencies": { + "@emotion/cache": "11.13.0", + "@emotion/react": "11.13.0", + "@emotion/styled": "11.13.0", + "@mui/material": "5.15.17", + "@mui/x-date-pickers": "6.18.1", + "clsx": "2.1.0", + "colord": "2.9.3", + "dayjs": "1.11.10", + "material-ui-popup-state": "5.0.11", + "react-colorful": "5.6.1", + "stylis": "4.1.3", + "stylis-plugin-rtl": "2.1.1" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", + "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.2.0", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/@emotion/babel-plugin/node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "node_modules/@emotion/cache": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.0.tgz", + "integrity": "sha512-hPV345J/tH0Cwk2wnU/3PBzORQ9HeX+kQSbwI+jslzpRCHE6fSGTohswksA/Ensr8znPzwfzKZCmAM9Lmlhp7g==", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache/node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "node_modules/@emotion/css": { + "version": "11.13.4", + "resolved": "https://registry.npmjs.org/@emotion/css/-/css-11.13.4.tgz", + "integrity": "sha512-CthbOD5EBw+iN0rfM96Tuv5kaZN4nxPyYDvGUs0bc7wZBBiU/0mse+l+0O9RshW2d+v5HH1cme+BAbLJ/3Folw==", + "dependencies": { + "@emotion/babel-plugin": "^11.12.0", + "@emotion/cache": "^11.13.0", + "@emotion/serialize": "^1.3.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", + "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" + }, + "node_modules/@emotion/react": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.0.tgz", + "integrity": "sha512-WkL+bw1REC2VNV1goQyfxjx1GYJkcc23CRQkXX+vZNLINyfI7o+uUn/rTGPt/xJ3bJHd5GcljgnxHf4wRw5VWQ==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/cache": "^11.13.0", + "@emotion/serialize": "^1.3.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.2.tgz", + "integrity": "sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==" + }, + "node_modules/@emotion/styled": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz", + "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", + "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.1.tgz", + "integrity": "sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==" + }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.41.0.tgz", + "integrity": "sha512-aKUhyn1QI5Ksbqcr3fFJj16p99QdjUxXAEuFst1Z47DRyoiMwivIH9MV/ARcJOCXVjPfjITciej8ZD2O/6qUmw==", + "dev": true, + "dependencies": { + "comment-parser": "1.4.1", + "esquery": "^1.5.0", + "jsdoc-type-pratt-parser": "~4.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz", + "integrity": "sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", + "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", + "dependencies": { + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.12", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz", + "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", + "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==" + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "dev": true + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "dev": true + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true + }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.40", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", + "integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@floating-ui/react-dom": "^2.0.8", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.7.tgz", + "integrity": "sha512-RtsCt4Geed2/v74sbihWzzRs+HsIQCfclHeORh5Ynu2fS4icIKozcSubwuG7vtzq2uW3fOR1zITSP84TNt2GoQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/material": { + "version": "5.15.17", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.17.tgz", + "integrity": "sha512-ru/MLvTkCh0AZXmqwIpqGTOoVBS/sX48zArXq/DvktxXZx4fskiRA2PEc7Rk5ZlFiZhKh4moL4an+l8zZwq49Q==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/base": "5.0.0-beta.40", + "@mui/core-downloads-tracker": "^5.15.17", + "@mui/system": "^5.15.15", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.6.tgz", + "integrity": "sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.16.6", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.6.tgz", + "integrity": "sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.7.tgz", + "integrity": "sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.16.6", + "@mui/styled-engine": "^5.16.6", + "@mui/types": "^7.2.15", + "@mui/utils": "^5.16.6", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.19", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.19.tgz", + "integrity": "sha512-6XpZEM/Q3epK9RN8ENoXuygnqUQxE+siN/6rGRi2iwJPgBUR25mphYQ9ZI87plGh58YoZ5pp40bFvKYOCDJ3tA==", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", + "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/types": "^7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/x-date-pickers": { + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.18.1.tgz", + "integrity": "sha512-22gWCzejBGG4Kycpk/yYhzV6Pj/xVBvaz5A1rQmCD/0DCXTDJvXPG8qvzrNlp1wj8q+rAQO82e/+conUGgYgYg==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/base": "^5.0.0-beta.22", + "@mui/utils": "^5.14.16", + "@types/react-transition-group": "^4.4.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/material": "^5.8.6", + "@mui/system": "^5.8.0", + "date-fns": "^2.25.0", + "date-fns-jalali": "^2.13.0-0", + "dayjs": "^1.10.7", + "luxon": "^3.0.2", + "moment": "^2.29.4", + "moment-hijri": "^2.1.2", + "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "date-fns": { + "optional": true + }, + "date-fns-jalali": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + }, + "moment-hijri": { + "optional": true + }, + "moment-jalaali": { + "optional": true + } + } + }, + "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", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "dev": true, + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", + "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.0", + "@parcel/watcher-darwin-arm64": "2.5.0", + "@parcel/watcher-darwin-x64": "2.5.0", + "@parcel/watcher-freebsd-x64": "2.5.0", + "@parcel/watcher-linux-arm-glibc": "2.5.0", + "@parcel/watcher-linux-arm-musl": "2.5.0", + "@parcel/watcher-linux-arm64-glibc": "2.5.0", + "@parcel/watcher-linux-arm64-musl": "2.5.0", + "@parcel/watcher-linux-x64-glibc": "2.5.0", + "@parcel/watcher-linux-x64-musl": "2.5.0", + "@parcel/watcher-win32-arm64": "2.5.0", + "@parcel/watcher-win32-ia32": "2.5.0", + "@parcel/watcher-win32-x64": "2.5.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", + "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", + "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", + "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", + "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", + "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", + "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", + "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", + "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", + "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", + "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", + "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", + "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", + "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@playwright/test": { + "version": "1.48.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.2.tgz", + "integrity": "sha512-54w1xCWfXuax7dz4W2M9uw0gDyh+ti/0K/MxcCUxChFh37kkdxPdfZDw5QBbuPUJHr1CiHJ1hXgSs+GgeQc5Zw==", + "dev": true, + "peer": true, + "dependencies": { + "playwright": "1.48.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.15.tgz", + "integrity": "sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==", + "dev": true, + "dependencies": { + "ansi-html": "^0.0.9", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^4.2.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <5.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x || 5.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.28", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", + "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", + "dev": true + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.4.1.tgz", + "integrity": "sha512-0kdAbmic3J09I6dT8e9vE2JOCSt13wHCW5x/ly8TSt2bDtuIWe2TgLZZDHdcziw9AVCzflMAXCrVyRIhIs44Ng==", + "dev": true, + "dependencies": { + "debug": "^4.3.7", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.4.0", + "semver": "^7.6.3", + "tar-fs": "^3.0.6", + "unbzip2-stream": "^1.4.3", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@puppeteer/browsers/node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/@puppeteer/browsers/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.2.tgz", + "integrity": "sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.1", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-portal": "1.1.2", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.6.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.1.tgz", + "integrity": "sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz", + "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", + "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.2.tgz", + "integrity": "sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.1.tgz", + "integrity": "sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@react-spring/animated": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", + "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", + "dependencies": { + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/core": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", + "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/rafz": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", + "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==" + }, + "node_modules/@react-spring/shared": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", + "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", + "dependencies": { + "@react-spring/rafz": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/types": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", + "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==" + }, + "node_modules/@react-spring/web": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.5.tgz", + "integrity": "sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==", + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/core": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, + "node_modules/@sentry/core": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.19.7.tgz", + "integrity": "sha512-tOfZ/umqB2AcHPGbIrsFLcvApdTm9ggpi/kQZFkej7kMphjT+SGBiQfYtjyg9jcRW+ilAR4JXC9BGKsdEQ+8Vw==", + "dev": true, + "dependencies": { + "@sentry/hub": "6.19.7", + "@sentry/minimal": "6.19.7", + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/core/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@sentry/hub": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz", + "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==", + "dev": true, + "dependencies": { + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/hub/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@sentry/minimal": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz", + "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==", + "dev": true, + "dependencies": { + "@sentry/hub": "6.19.7", + "@sentry/types": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/minimal/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@sentry/node": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-6.19.7.tgz", + "integrity": "sha512-gtmRC4dAXKODMpHXKfrkfvyBL3cI8y64vEi3fDD046uqYcrWdgoQsffuBbxMAizc6Ez1ia+f0Flue6p15Qaltg==", + "dev": true, + "dependencies": { + "@sentry/core": "6.19.7", + "@sentry/hub": "6.19.7", + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/node/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@sentry/types": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz", + "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz", + "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==", + "dev": true, + "dependencies": { + "@sentry/types": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "dev": true + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@stylistic/stylelint-plugin": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.1.1.tgz", + "integrity": "sha512-XagAHHIa528EvyGybv8EEYGK5zrVW74cHpsjhtovVATbhDRuJYfE+X4HCaAieW9lCkwbX6L+X0I4CiUG3w/hFw==", + "dev": true, + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.1", + "@csstools/media-query-list-parser": "^3.0.1", + "is-plain-object": "^5.0.0", + "postcss-selector-parser": "^6.1.2", + "postcss-value-parser": "^4.2.0", + "style-search": "^0.1.0", + "stylelint": "^16.8.2" + }, + "engines": { + "node": "^18.12 || >=20.9" + }, + "peerDependencies": { + "stylelint": "^16.8.0" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "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, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "dev": true, + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core/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/@svgr/core/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@svgr/core/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/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "dev": true, + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo/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/@svgr/plugin-svgo/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@svgr/plugin-svgo/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/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tannin/compile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@tannin/compile/-/compile-1.1.0.tgz", + "integrity": "sha512-n8m9eNDfoNZoxdvWiTfW/hSPhehzLJ3zW7f8E7oT6mCROoMNWCB4TYtv041+2FMAxweiE0j7i1jubQU4MEC/Gg==", + "dependencies": { + "@tannin/evaluate": "^1.2.0", + "@tannin/postfix": "^1.1.0" + } + }, + "node_modules/@tannin/evaluate": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@tannin/evaluate/-/evaluate-1.2.0.tgz", + "integrity": "sha512-3ioXvNowbO/wSrxsDG5DKIMxC81P0QrQTYai8zFNY+umuoHWRPbQ/TuuDEOju9E+jQDXmj6yI5GyejNuh8I+eg==" + }, + "node_modules/@tannin/plural-forms": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@tannin/plural-forms/-/plural-forms-1.1.0.tgz", + "integrity": "sha512-xl9R2mDZO/qiHam1AgMnAES6IKIg7OBhcXqy6eDsRCdXuxAFPcjrej9HMjyCLE0DJ/8cHf0i5OQTstuBRhpbHw==", + "dependencies": { + "@tannin/compile": "^1.1.0" + } + }, + "node_modules/@tannin/postfix": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@tannin/postfix/-/postfix-1.1.0.tgz", + "integrity": "sha512-oocsqY7g0cR+Gur5jRQLSrX2OtpMLMse1I10JQBm8CdGMrDkh1Mg2gjsiquMHRtBs4Qwu5wgEp5GgIYHk4SNPw==" + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.1.tgz", + "integrity": "sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/gradient-parser": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@types/gradient-parser/-/gradient-parser-0.1.3.tgz", + "integrity": "sha512-XDbrTSBlQV9nxE1GiDL3FaOPy4G/KaJkhDutBX48Kg8CYZMBARyyDFGCWfWJn4pobmInmwud1xxH7VJMAr0CKQ==" + }, + "node_modules/@types/highlight-words-core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/highlight-words-core/-/highlight-words-core-1.2.1.tgz", + "integrity": "sha512-9VZUA5omXBfn+hDxFjUDu1FOJTBM3LmvqfDey+Z6Aa8B8/JmF5SMj6FBrjfgJ/Q3YXOZd3qyTDfJyMZSs/wCUA==" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true + }, + "node_modules/@types/mousetrap": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/@types/mousetrap/-/mousetrap-1.6.15.tgz", + "integrity": "sha512-qL0hyIMNPow317QWW/63RvL1x5MVMV+Ru3NaY9f/CuEpCqrmb7WeuK2071ZY5hczOnm38qExWM2i2WtkXLSqFw==" + }, + "node_modules/@types/node": { + "version": "22.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", + "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", + "dependencies": { + "undici-types": "~6.19.8" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==" + }, + "node_modules/@types/qs": { + "version": "6.9.17", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", + "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.3.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", + "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", + "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/simple-peer": { + "version": "9.11.8", + "resolved": "https://registry.npmjs.org/@types/simple-peer/-/simple-peer-9.11.8.tgz", + "integrity": "sha512-rvqefdp2rvIA6wiomMgKWd2UZNPe6LM2EV5AuY3CPQJF+8TbdrL5TjYdMf0VAjGczzlkH4l1NjDkihwbj3Xodw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/source-list-map": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.6.tgz", + "integrity": "sha512-5JcVt1u5HDmlXkwOD2nslZVllBBc7HDuOICfiZah2Z0is8M8g+ddAEawbmd3VjedfDHBzxCaXLs07QEmb7y54g==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/tapable": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.12.tgz", + "integrity": "sha512-bTHG8fcxEqv1M9+TD14P8ok8hjxoOCkfKc8XXLaaD05kI7ohpeI956jtDOD3XHKBQrlyPughUtzm1jtVhHpA5Q==", + "dev": true + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true + }, + "node_modules/@types/uglify-js": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.5.tgz", + "integrity": "sha512-TU+fZFBTBcXj/GpDpDaBmgWk/gn96kMZ+uocaFUlV2f8a6WdMzzI44QBCmGcCiYR0Y6ZlNRiyUyKKt5nl/lbzQ==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/@types/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/webpack": { + "version": "4.41.40", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.40.tgz", + "integrity": "sha512-u6kMFSBM9HcoTpUXnL6mt2HSzftqb3JgYV6oxIgL2dl6sX6aCa5k6SOkzv5DuZjBTPUE/dJltKtwwuqrkZHpfw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-4nZOdMwSPHZ4pTEZzSp0AsTM4K7Qmu40UKW4tJDiOVs20UzYF9l+qUe4s0ftfN0pin06n+5cWWDJXH+sbhAiDw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + } + }, + "node_modules/@types/webpack-sources/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/webpack/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/ws": { + "version": "8.5.13", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", + "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@use-gesture/core": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", + "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==" + }, + "node_modules/@use-gesture/react": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", + "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", + "dependencies": { + "@use-gesture/core": "10.3.1" + }, + "peerDependencies": { + "react": ">= 16.8.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@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, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@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, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@wordpress/a11y": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/a11y/-/a11y-4.11.0.tgz", + "integrity": "sha512-gUrsmDvxuD8HXYmoND+niJw4Tk0qMDqMsOryzuQEymyO63o89DfoT1NBpJUk8P9P+xSCRHp5EoxaMUQ0Kiz81w==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/dom-ready": "*", + "@wordpress/i18n": "*" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/a11y/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/api-fetch": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-7.11.0.tgz", + "integrity": "sha512-JOlkaGIdclT+Pxi+zlkEHYGtS4LLRRsg7soZ2bXXmdo0CBUycdumu0G3AJeK7R8RAVBhfcI4ZjZ5BXeRdOO00A==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/i18n": "*", + "@wordpress/url": "*" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/api-fetch/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/autop": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/autop/-/autop-4.11.0.tgz", + "integrity": "sha512-Nb5SPCVayQoR0Xcgp16aTCvPEpbiPtJoEi4F8RoHFjN0rIShzA8i7ArzGXJy3PMkAozxGK0nF/I77yelF2SDyw==", + "dependencies": { + "@babel/runtime": "7.25.7" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/autop/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/babel-preset-default": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-8.11.0.tgz", + "integrity": "sha512-allmuNraEE8R2hu4GV65GLF4EHAqkPZHTMNZZs7ujBy/JYYmVRYrg5WQOG6W9addQyjo6Ugx9s2R6Vh8fnYv/A==", + "dev": true, + "dependencies": { + "@babel/core": "7.25.7", + "@babel/plugin-transform-react-jsx": "7.25.7", + "@babel/plugin-transform-runtime": "7.25.7", + "@babel/preset-env": "7.25.7", + "@babel/preset-typescript": "7.25.7", + "@babel/runtime": "7.25.7", + "@wordpress/browserslist-config": "*", + "@wordpress/warning": "*", + "browserslist": "^4.21.10", + "core-js": "^3.31.0", + "react": "^18.3.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/babel-preset-default/node_modules/@babel/core": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", + "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@wordpress/babel-preset-default/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/base-styles": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-5.11.0.tgz", + "integrity": "sha512-czK3/eTq/cKUwa8dFNpVdtzlVXbA4fo/b9i+N5fWzwKlZ8jAT/OtdCS+6zTyrv7yVO6R12F4ruXWRXoDKRasIg==", + "dev": true, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/blob": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/blob/-/blob-4.11.0.tgz", + "integrity": "sha512-WoJL2wmSK8bzx7vz5yFapdISG7JCQOWWn7lRR+x7xKlkgBr9mDx9dmV8Ih0jE/O8JIhe+YDxEjlS7OsIX2s02w==", + "dependencies": { + "@babel/runtime": "7.25.7" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/blob/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/block-editor": { + "version": "14.6.0", + "resolved": "https://registry.npmjs.org/@wordpress/block-editor/-/block-editor-14.6.0.tgz", + "integrity": "sha512-Pala/+i7izwB7QJbr6tVfg2XR0p6wb2biIoF2DjzNh+draoTjPtxCbZQrOJSd8hfyXQOOQPuLiAGdsq50PEZsA==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@emotion/react": "^11.7.1", + "@emotion/styled": "^11.6.0", + "@react-spring/web": "^9.4.5", + "@wordpress/a11y": "*", + "@wordpress/api-fetch": "*", + "@wordpress/blob": "*", + "@wordpress/block-serialization-default-parser": "*", + "@wordpress/blocks": "*", + "@wordpress/commands": "*", + "@wordpress/components": "*", + "@wordpress/compose": "*", + "@wordpress/data": "*", + "@wordpress/date": "*", + "@wordpress/deprecated": "*", + "@wordpress/dom": "*", + "@wordpress/element": "*", + "@wordpress/escape-html": "*", + "@wordpress/hooks": "*", + "@wordpress/html-entities": "*", + "@wordpress/i18n": "*", + "@wordpress/icons": "*", + "@wordpress/is-shallow-equal": "*", + "@wordpress/keyboard-shortcuts": "*", + "@wordpress/keycodes": "*", + "@wordpress/notices": "*", + "@wordpress/preferences": "*", + "@wordpress/private-apis": "*", + "@wordpress/rich-text": "*", + "@wordpress/style-engine": "*", + "@wordpress/token-list": "*", + "@wordpress/url": "*", + "@wordpress/warning": "*", + "@wordpress/wordcount": "*", + "change-case": "^4.1.2", + "clsx": "^2.1.1", + "colord": "^2.7.0", + "deepmerge": "^4.3.0", + "diff": "^4.0.2", + "fast-deep-equal": "^3.1.3", + "memize": "^2.1.0", + "parsel-js": "^1.1.2", + "postcss": "^8.4.21", + "postcss-prefix-selector": "^1.16.0", + "postcss-urlrebase": "^1.4.0", + "react-autosize-textarea": "^7.1.0", + "react-easy-crop": "^5.0.6", + "remove-accents": "^0.5.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@wordpress/block-editor/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/block-editor/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@wordpress/block-serialization-default-parser": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-5.11.0.tgz", + "integrity": "sha512-D9pfzKTW+X85ve9Icx/9ugMQioWCT/2FUQ0C3fADN5mzlO40kNRIGDU8jPH7s0HRvQX2or0Uk7k09Mx1NlSvJg==", + "dependencies": { + "@babel/runtime": "7.25.7" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/block-serialization-default-parser/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/blocks": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@wordpress/blocks/-/blocks-14.0.0.tgz", + "integrity": "sha512-alcZFTdtWSkAwMPXuQXyFQT0BMCNORnVLUQlAuyycC8xZoT5kcpGYffStQGmYgp8EHxyH5ic8K6fZ8TdgvEUFw==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/autop": "*", + "@wordpress/blob": "*", + "@wordpress/block-serialization-default-parser": "*", + "@wordpress/data": "*", + "@wordpress/deprecated": "*", + "@wordpress/dom": "*", + "@wordpress/element": "*", + "@wordpress/hooks": "*", + "@wordpress/html-entities": "*", + "@wordpress/i18n": "*", + "@wordpress/is-shallow-equal": "*", + "@wordpress/private-apis": "*", + "@wordpress/rich-text": "*", + "@wordpress/shortcode": "*", + "@wordpress/warning": "*", + "change-case": "^4.1.2", + "colord": "^2.7.0", + "fast-deep-equal": "^3.1.3", + "hpq": "^1.3.0", + "is-plain-object": "^5.0.0", + "memize": "^2.1.0", + "react-is": "^18.3.0", + "remove-accents": "^0.5.0", + "showdown": "^1.9.1", + "simple-html-tokenizer": "^0.5.7", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/@wordpress/blocks/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/browserslist-config": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.11.0.tgz", + "integrity": "sha512-wUDbJ3x7c8iMZLtwo+7VlWZ/vDc47PDW2eSAKW18RrQBSTdaNmWi4qiyFYi7Ye2XkyfUd2gp71MTJjZi6n/V2A==", + "dev": true, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/commands": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/commands/-/commands-1.11.0.tgz", + "integrity": "sha512-pXC4/xrVjoXFcK0+0aU3Fpyd+/SfF5rQ9PX2q5DIpOC/aSULkC8NdjjIqOgzLlgpEZhkuIvL3r4YzZUgvrV0BQ==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/components": "*", + "@wordpress/data": "*", + "@wordpress/element": "*", + "@wordpress/i18n": "*", + "@wordpress/icons": "*", + "@wordpress/keyboard-shortcuts": "*", + "@wordpress/private-apis": "*", + "clsx": "^2.1.1", + "cmdk": "^1.0.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@wordpress/commands/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/commands/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@wordpress/components": { + "version": "28.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-28.11.0.tgz", + "integrity": "sha512-vDzT1GVaDYhOxjiTkLUA5X/ebatiYBuP2yuynhm+fuWsyoalmlpYfvZAARa/PH+E60C7gpY1CNkU92niJdpr4A==", + "dependencies": { + "@ariakit/react": "^0.4.10", + "@babel/runtime": "7.25.7", + "@emotion/cache": "^11.7.1", + "@emotion/css": "^11.7.1", + "@emotion/react": "^11.7.1", + "@emotion/serialize": "^1.0.2", + "@emotion/styled": "^11.6.0", + "@emotion/utils": "^1.0.0", + "@floating-ui/react-dom": "^2.0.8", + "@types/gradient-parser": "0.1.3", + "@types/highlight-words-core": "1.2.1", + "@use-gesture/react": "^10.3.1", + "@wordpress/a11y": "*", + "@wordpress/compose": "*", + "@wordpress/date": "*", + "@wordpress/deprecated": "*", + "@wordpress/dom": "*", + "@wordpress/element": "*", + "@wordpress/escape-html": "*", + "@wordpress/hooks": "*", + "@wordpress/html-entities": "*", + "@wordpress/i18n": "*", + "@wordpress/icons": "*", + "@wordpress/is-shallow-equal": "*", + "@wordpress/keycodes": "*", + "@wordpress/primitives": "*", + "@wordpress/private-apis": "*", + "@wordpress/rich-text": "*", + "@wordpress/warning": "*", + "change-case": "^4.1.2", + "clsx": "^2.1.1", + "colord": "^2.7.0", + "date-fns": "^3.6.0", + "deepmerge": "^4.3.0", + "fast-deep-equal": "^3.1.3", + "framer-motion": "^11.1.9", + "gradient-parser": "^0.1.5", + "highlight-words-core": "^1.2.2", + "is-plain-object": "^5.0.0", + "memize": "^2.1.0", + "path-to-regexp": "^6.2.1", + "re-resizable": "^6.4.0", + "react-colorful": "^5.3.1", + "remove-accents": "^0.5.0", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@wordpress/components/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/components/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@wordpress/components/node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/@wordpress/compose": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-7.11.0.tgz", + "integrity": "sha512-8Gv95+lJza3WiHxvaZgA2nKAlaEJonpFa82jF2c2ecGxHJNJUiF+kwmfr/yJpjVxSvNvHfpZlTuXHDi4hoMfYg==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@types/mousetrap": "^1.6.8", + "@wordpress/deprecated": "*", + "@wordpress/dom": "*", + "@wordpress/element": "*", + "@wordpress/is-shallow-equal": "*", + "@wordpress/keycodes": "*", + "@wordpress/priority-queue": "*", + "@wordpress/undo-manager": "*", + "change-case": "^4.1.2", + "clipboard": "^2.0.11", + "mousetrap": "^1.6.5", + "use-memo-one": "^1.1.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/@wordpress/compose/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/core-data": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/core-data/-/core-data-7.11.0.tgz", + "integrity": "sha512-uxkL9h0AGn+MoZMlX0bkt6Kz4SAxEgWtzTrK8+b8XOmb66aHnTu2e7iA2aB5sZqlDuSiEfHfsNP9A6yefwasZw==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/api-fetch": "*", + "@wordpress/block-editor": "*", + "@wordpress/blocks": "*", + "@wordpress/compose": "*", + "@wordpress/data": "*", + "@wordpress/deprecated": "*", + "@wordpress/element": "*", + "@wordpress/html-entities": "*", + "@wordpress/i18n": "*", + "@wordpress/is-shallow-equal": "*", + "@wordpress/private-apis": "*", + "@wordpress/rich-text": "*", + "@wordpress/sync": "*", + "@wordpress/undo-manager": "*", + "@wordpress/url": "*", + "@wordpress/warning": "*", + "change-case": "^4.1.2", + "equivalent-key-map": "^0.2.2", + "fast-deep-equal": "^3.1.3", + "memize": "^2.1.0", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@wordpress/core-data/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/data": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-10.11.0.tgz", + "integrity": "sha512-2JvezC51tv8zpg1zUo+VNegtTHHKWBNGZ0uRFoeH6riswT4iZMXsZ83vrWZSCR/bY6ilK0kN/UHDvvSRYov2Rw==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/compose": "*", + "@wordpress/deprecated": "*", + "@wordpress/element": "*", + "@wordpress/is-shallow-equal": "*", + "@wordpress/priority-queue": "*", + "@wordpress/private-apis": "*", + "@wordpress/redux-routine": "*", + "deepmerge": "^4.3.0", + "equivalent-key-map": "^0.2.2", + "is-plain-object": "^5.0.0", + "is-promise": "^4.0.0", + "redux": "^4.1.2", + "rememo": "^4.0.2", + "use-memo-one": "^1.1.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/@wordpress/data/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/date": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/date/-/date-5.11.0.tgz", + "integrity": "sha512-pDoTw1c3BTtgeG9xfIARTU6iCQ40Sksfaekhwz8EHPa9dgE1BU1ko4nb2VPTck6iQFggwfDlQcbg2Wf/ui8Kcw==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/deprecated": "*", + "moment": "^2.29.4", + "moment-timezone": "^0.5.40" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/date/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/dependency-extraction-webpack-plugin": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-6.11.0.tgz", + "integrity": "sha512-MRMu3f/zG428iXuBBwaZKumonQ6Cxz2KDerQkIYkpXFq7aZK/vZRdTeR/MYXZNABmAV54Ss0xp6QJxOBW/WVbQ==", + "dev": true, + "dependencies": { + "json2php": "^0.0.7" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/@wordpress/dependency-extraction-webpack-plugin/node_modules/json2php": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/json2php/-/json2php-0.0.7.tgz", + "integrity": "sha512-dnSoUiLAoVaMXxFsVi4CrPVYMKOuDBXTghXSmMINX44RZ8WM9cXlY7UqrQnlAcODCVO7FV3+8t/5nDKAjimLfg==", + "dev": true + }, + "node_modules/@wordpress/deprecated": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-4.11.0.tgz", + "integrity": "sha512-CPXMS2IbGonba6Ny3IhzOudZ8QSCQzjg8AaS8dAq6p47AIUNxfj8bef+7C36lJKt9KPDkez7eY5x7UF5CaDkug==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/hooks": "*" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/deprecated/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/dom": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/dom/-/dom-4.11.0.tgz", + "integrity": "sha512-8u9USBEpGiQvVZeWSY82Ze3Yrwj5JkmmPUF+HfKvqywFlYIZfYLLc5lNrvUCqw7klIje+LO3MnKR3kfRx/uozA==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/deprecated": "*" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/dom-ready": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-4.11.0.tgz", + "integrity": "sha512-wAqRxFpP19m8KwXzand3BrrqRkU7SXH9/fdk1q/Q+oqoXIrLMDFWsH6xbXgM4q/id2Z4ZMK5dZQ3tYf/0qDpFg==", + "dependencies": { + "@babel/runtime": "7.25.7" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/dom-ready/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/dom/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/e2e-test-utils-playwright": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.11.0.tgz", + "integrity": "sha512-0kSY0rOpKirXgXsNJQ/Mj3NLJhmN1lwkECZFF53iYs/kOAXNaVxs6Ys3T8hleoO47/KZLY7AoEJTxKwK0fWixQ==", + "dev": true, + "dependencies": { + "change-case": "^4.1.2", + "form-data": "^4.0.0", + "get-port": "^5.1.1", + "lighthouse": "^10.4.0", + "mime": "^3.0.0", + "web-vitals": "^4.2.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "@playwright/test": ">=1" + } + }, + "node_modules/@wordpress/element": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-6.11.0.tgz", + "integrity": "sha512-UvHFYkT+EEaXEyEfw+iqLHRO9OwBjjsUydEMHcqntzkNcsYeAbmaL9V8R9ikXHLe6ftdbkwoXgF85xVPhVsL+Q==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@types/react": "^18.2.79", + "@types/react-dom": "^18.2.25", + "@wordpress/escape-html": "*", + "change-case": "^4.1.2", + "is-plain-object": "^5.0.0", + "react": "^18.3.0", + "react-dom": "^18.3.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/element/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/env": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/env/-/env-10.11.0.tgz", + "integrity": "sha512-Sd31oiYxy9/pNMfYw7XgtCBoD4PpvcK1UQ/FVFP+DsTTuo55Ma4UAHMKfg2NhnZWqhJTgPC6XXzicGpr/lK4RQ==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "copy-dir": "^1.3.0", + "docker-compose": "^0.24.3", + "extract-zip": "^1.6.7", + "got": "^11.8.5", + "inquirer": "^7.1.0", + "js-yaml": "^3.13.1", + "ora": "^4.0.2", + "rimraf": "^3.0.2", + "simple-git": "^3.5.0", + "terminal-link": "^2.0.0", + "yargs": "^17.3.0" + }, + "bin": { + "wp-env": "bin/wp-env" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/escape-html": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-3.11.0.tgz", + "integrity": "sha512-TGiUoUpnPxNKCvpZzskIjtgPH8UhZAYTflbHTaA9IALBc1alq0SDdmMAfQ7qhnKer4CPU9+dSXv79q7olobeLQ==", + "dependencies": { + "@babel/runtime": "7.25.7" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/escape-html/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/eslint-plugin": { + "version": "21.4.0", + "resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-21.4.0.tgz", + "integrity": "sha512-8V/cpGDDTG0loqWUjmz2mqVG55hKYTfSRC43xh2aqRIGyeKfMiqaHxD/BgEi94HFdcAhAX6DYwlPnHR18Dc/tw==", + "dev": true, + "dependencies": { + "@babel/eslint-parser": "7.25.7", + "@typescript-eslint/eslint-plugin": "^6.4.1", + "@typescript-eslint/parser": "^6.4.1", + "@wordpress/babel-preset-default": "*", + "@wordpress/prettier-config": "*", + "cosmiconfig": "^7.0.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-jest": "^27.2.3", + "eslint-plugin-jsdoc": "^46.4.6", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-playwright": "^0.15.3", + "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-react": "^7.27.0", + "eslint-plugin-react-hooks": "^4.3.0", + "globals": "^13.12.0", + "requireindex": "^1.2.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "@babel/core": ">=7", + "eslint": ">=8", + "prettier": ">=3", + "typescript": ">=4" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@wordpress/eslint-plugin/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@wordpress/eslint-plugin/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@wordpress/hooks": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-4.11.0.tgz", + "integrity": "sha512-MvsbtOCXKSxJbdgTM5fx8JDbtjA5dlM8GEyr1LEz+1AHwWy5loQx17DEodAkHPu3NCelJ18LSL6AJYJ9simB8g==", + "dependencies": { + "@babel/runtime": "7.25.7" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/hooks/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/html-entities": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/html-entities/-/html-entities-4.11.0.tgz", + "integrity": "sha512-OMpq/oP7CvfMojedgeI9unIAx0wuB8n10JwM72xi0CI/NYuymAcaOoD3OGkmS+4i6IW/geC3AooyWwRduzY85Q==", + "dependencies": { + "@babel/runtime": "7.25.7" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/html-entities/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/i18n": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-5.11.0.tgz", + "integrity": "sha512-U8CoXAIcmxcOHD1VeGRoo6iLjx71eE4LstQjHjKGT3J4Lz43O8MunT+/cm606FCcQgunPCyaALquD2vSf+JD9w==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/hooks": "*", + "gettext-parser": "^1.3.1", + "memize": "^2.1.0", + "sprintf-js": "^1.1.1", + "tannin": "^1.2.0" + }, + "bin": { + "pot-to-php": "tools/pot-to-php.js" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/i18n/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/icons": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-10.11.0.tgz", + "integrity": "sha512-RMetpFwUIeh3sVj2+p6+QX5AW8pF7DvQzxH9jUr8YjaF2iLE64vy6m0cZz/X8xkSktHrXMuPJIr7YIVF20TEyw==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/element": "*", + "@wordpress/primitives": "*" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/icons/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/is-shallow-equal": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-5.11.0.tgz", + "integrity": "sha512-LWMFSHcsD/FecJytZP3uboNUkVyowUN4HtFz3rJkAjpcvgZV9S++4ALejzN9jegOWfD6KNKAyWc7FyV25WXPYw==", + "dependencies": { + "@babel/runtime": "7.25.7" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/is-shallow-equal/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/jest-console": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-8.11.0.tgz", + "integrity": "sha512-kkeSrY6YThTSgPKMTo5DA98irIjvgIl8V0Bk0x9M2uoDCCYsz3EJFECrvYR31z7K6EeeJVMhdhnNJriK58PP+A==", + "dev": true, + "dependencies": { + "@babel/runtime": "7.25.7", + "jest-matcher-utils": "^29.6.2" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "jest": ">=29" + } + }, + "node_modules/@wordpress/jest-console/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/jest-preset-default": { + "version": "12.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/jest-preset-default/-/jest-preset-default-12.11.0.tgz", + "integrity": "sha512-yjU6am+emR++CmDb+si3e+5aNwFk2zz1R4ti/Uq/EeRRFfcCxCopMhnd1J7BiU3BJ3Vm7qJlJgYhhJAqm65jVQ==", + "dev": true, + "dependencies": { + "@wordpress/jest-console": "*", + "babel-jest": "29.7.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "@babel/core": ">=7", + "jest": ">=29" + } + }, + "node_modules/@wordpress/keyboard-shortcuts": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/keyboard-shortcuts/-/keyboard-shortcuts-5.11.0.tgz", + "integrity": "sha512-W48yh49N7tyy7Wc/yUm8mGG1hYfsmD9P6wOFX6vfte9uqgcCzcKMDwRUaXY4ShJ1KtHn/yiWC3JV66CtRdIbtQ==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/data": "*", + "@wordpress/element": "*", + "@wordpress/keycodes": "*" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/@wordpress/keyboard-shortcuts/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/keycodes": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-4.11.0.tgz", + "integrity": "sha512-aI8ftrEU62Y25p4881+d5zglPNOmWJJTokfC0eF4iW6DRnBy/btOMC6zIf+oATjG2pGTyMfHveALJf0YSpdyEw==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/i18n": "*" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/keycodes/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/notices": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/notices/-/notices-5.11.0.tgz", + "integrity": "sha512-RyTXLU27EcDYYqnjDoGw76H5pg7R9wfjvcadqhCITWTZwKSRfzAs/Cp3qlfZPYAO5IWgpWDEBMkyJv2V2aV5BQ==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/a11y": "*", + "@wordpress/data": "*" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/@wordpress/notices/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/npm-package-json-lint-config": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-5.11.0.tgz", + "integrity": "sha512-m65XI5stIUgH/OewrOvBIEYurbm5kSDndieU9t4gWCXXXD5n9RpHOsoex/hsRzZ5ZjTtpgvArJ+dv18+hqIOAw==", + "dev": true, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "npm-package-json-lint": ">=6.0.0" + } + }, + "node_modules/@wordpress/postcss-plugins-preset": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/postcss-plugins-preset/-/postcss-plugins-preset-5.11.0.tgz", + "integrity": "sha512-oVZEfLJSxGGMhQCk9+vghgQjxG8l5KGqFUP2Q/2mosc9D20DvSsT8r280R6uiwaD5KUDuYcpdJlD4eVY6t8AIA==", + "dev": true, + "dependencies": { + "@wordpress/base-styles": "*", + "autoprefixer": "^10.2.5" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/@wordpress/preferences": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/preferences/-/preferences-4.11.0.tgz", + "integrity": "sha512-oI1Bi8mHDsZsE0c215F+XndEl2224jh72NLxG4DBI6lDEkVWteBsJBZJDS1z8NOUYXoIFrLqgCsFcEoL6CGGng==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/a11y": "*", + "@wordpress/components": "*", + "@wordpress/compose": "*", + "@wordpress/data": "*", + "@wordpress/deprecated": "*", + "@wordpress/element": "*", + "@wordpress/i18n": "*", + "@wordpress/icons": "*", + "@wordpress/private-apis": "*", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@wordpress/preferences/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/preferences/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@wordpress/prettier-config": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-4.11.0.tgz", + "integrity": "sha512-Aoc8+xWOyiXekodjaEjS44z85XK877LzHZqsQuhC0kNgneDLrKkwI5qNgzwzAMbJ9jI58MPqVISCOX0bDLUPbw==", + "dev": true, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "prettier": ">=3" + } + }, + "node_modules/@wordpress/primitives": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-4.11.0.tgz", + "integrity": "sha512-CoBXbh0mOSxcZtuzL7gK3RVumFx71DXQBfd3IkbRHuuVxa+2hI4KDuFyomSsbjQDshHsfuVrKUvuT3UGt6pdpQ==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/element": "*", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/@wordpress/primitives/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/primitives/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@wordpress/priority-queue": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/priority-queue/-/priority-queue-3.11.0.tgz", + "integrity": "sha512-gllst2BJrDnEeXQYAuDXl31st/rhXcdeHOYt9UgOH1CnzPym3H0cdKR+zp9osGECCWN5pyoFalgckMZ5mPRAGg==", + "dependencies": { + "@babel/runtime": "7.25.7", + "requestidlecallback": "^0.3.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/priority-queue/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/private-apis": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/private-apis/-/private-apis-1.11.0.tgz", + "integrity": "sha512-ohTXVFf+a5t585qivy1XWfu0JDoloB/t19mJpFAcLGw1zw6wWs4upYyOsiJ8skSL+mbHCWpSWWZjGre/LcD0Ew==", + "dependencies": { + "@babel/runtime": "7.25.7" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/private-apis/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/redux-routine": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/redux-routine/-/redux-routine-5.11.0.tgz", + "integrity": "sha512-RKBRTO+qZLDlh0/H5vDtsHLrBbIDweEhKyexfrm40klDsIzLO7OrW0zeM1wBGfHz3JxPOck859gGBoa7tyJf6A==", + "dependencies": { + "@babel/runtime": "7.25.7", + "is-plain-object": "^5.0.0", + "is-promise": "^4.0.0", + "rungen": "^0.3.2" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "redux": ">=4" + } + }, + "node_modules/@wordpress/redux-routine/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/rich-text": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/rich-text/-/rich-text-7.11.0.tgz", + "integrity": "sha512-xrTvJ6H9UOnH+aA4QzeSQKV+rQS9RD87y1XoLZxrynDxLjsNO95PVhopfs0qIGNLr8wFhMtb0LQ+KXkxqA7fDw==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/a11y": "*", + "@wordpress/compose": "*", + "@wordpress/data": "*", + "@wordpress/deprecated": "*", + "@wordpress/element": "*", + "@wordpress/escape-html": "*", + "@wordpress/i18n": "*", + "@wordpress/keycodes": "*", + "memize": "^2.1.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/@wordpress/rich-text/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/scripts": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-30.4.0.tgz", + "integrity": "sha512-hAX8XB8hWlxAyktT4KkBpGttRwSynmtkpLvbVKeKnj+BjABFs4TGb/HCF9hFpUK3huCAg8Ft/sjjczW+5tqspQ==", + "dev": true, + "dependencies": { + "@babel/core": "7.25.7", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", + "@svgr/webpack": "^8.0.1", + "@wordpress/babel-preset-default": "*", + "@wordpress/browserslist-config": "*", + "@wordpress/dependency-extraction-webpack-plugin": "*", + "@wordpress/e2e-test-utils-playwright": "*", + "@wordpress/eslint-plugin": "*", + "@wordpress/jest-preset-default": "*", + "@wordpress/npm-package-json-lint-config": "*", + "@wordpress/postcss-plugins-preset": "*", + "@wordpress/prettier-config": "*", + "@wordpress/stylelint-config": "*", + "adm-zip": "^0.5.9", + "babel-jest": "29.7.0", + "babel-loader": "9.2.1", + "browserslist": "^4.21.10", + "chalk": "^4.0.0", + "check-node-version": "^4.1.0", + "clean-webpack-plugin": "^3.0.0", + "copy-webpack-plugin": "^10.2.0", + "cross-spawn": "^5.1.0", + "css-loader": "^6.2.0", + "cssnano": "^6.0.1", + "cwd": "^0.10.0", + "dir-glob": "^3.0.1", + "eslint": "^8.3.0", + "expect-puppeteer": "^4.4.0", + "fast-glob": "^3.2.7", + "filenamify": "^4.2.0", + "jest": "^29.6.2", + "jest-dev-server": "^9.0.1", + "jest-environment-jsdom": "^29.6.2", + "jest-environment-node": "^29.6.2", + "json2php": "^0.0.9", + "markdownlint-cli": "^0.31.1", + "merge-deep": "^3.0.3", + "mini-css-extract-plugin": "^2.5.1", + "minimist": "^1.2.0", + "npm-package-json-lint": "^6.4.0", + "npm-packlist": "^3.0.0", + "postcss": "^8.4.5", + "postcss-import": "^16.1.0", + "postcss-loader": "^6.2.1", + "prettier": "npm:wp-prettier@3.0.3", + "puppeteer-core": "^23.1.0", + "react-refresh": "^0.14.0", + "read-pkg-up": "^7.0.1", + "resolve-bin": "^0.4.0", + "rtlcss-webpack-plugin": "^4.0.7", + "sass": "^1.35.2", + "sass-loader": "^12.1.0", + "schema-utils": "^4.2.0", + "source-map-loader": "^3.0.0", + "stylelint": "^16.8.2", + "terser-webpack-plugin": "^5.3.10", + "url-loader": "^4.1.1", + "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.9.1", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^4.15.1" + }, + "bin": { + "wp-scripts": "bin/wp-scripts.js" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "@playwright/test": "^1.48.1", + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@wordpress/scripts/node_modules/@babel/core": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", + "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@wordpress/scripts/node_modules/prettier": { + "name": "wp-prettier", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-3.0.3.tgz", + "integrity": "sha512-X4UlrxDTH8oom9qXlcjnydsjAOD2BmB6yFmvS4Z2zdTzqqpRWb+fbqrH412+l+OUXmbzJlSXjlMFYPgYG12IAA==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/@wordpress/shortcode": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/shortcode/-/shortcode-4.11.0.tgz", + "integrity": "sha512-J2k8SYLR/aziSMilZGa0Plps7utQGXqRB2p/s/e2fj7SpV2p8futJZl0mlejTCBZC3q4izqkKkOItknTRRyu3w==", + "dependencies": { + "@babel/runtime": "7.25.7", + "memize": "^2.0.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/shortcode/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/style-engine": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/style-engine/-/style-engine-2.11.0.tgz", + "integrity": "sha512-Yb/JhUZq6yetHiqXfPJ4yCZH9Ov4m8JLMEr+p93DbLamaEXbes+ZDm502Dvx1U2jR9bphgqBBvXUHZsbLnN6Mw==", + "dependencies": { + "@babel/runtime": "7.25.7", + "change-case": "^4.1.2" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/style-engine/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/stylelint-config": { + "version": "23.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-23.3.0.tgz", + "integrity": "sha512-QRNPSgYgAlCC1HuCnGiBIVLlraK0JSYxAbWbNqlubfh8Xu7etUg1LBBY0ZI3wFQ5wwgioOwMDiv6++vqcD71RQ==", + "dev": true, + "dependencies": { + "@stylistic/stylelint-plugin": "^3.0.1", + "stylelint-config-recommended": "^14.0.1", + "stylelint-config-recommended-scss": "^14.1.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "stylelint": "^16.8.2" + } + }, + "node_modules/@wordpress/sync": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/sync/-/sync-1.11.0.tgz", + "integrity": "sha512-bC4sbUMEl1M+Htdff25avEiqrMseacW1JD1G6qM4voGcqsoqNuehNjjui+8GfHcD3kdbBd+H24mFBUL3eqeQig==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@types/simple-peer": "^9.11.5", + "@wordpress/url": "*", + "import-locals": "^2.0.0", + "lib0": "^0.2.42", + "simple-peer": "^9.11.0", + "y-indexeddb": "~9.0.11", + "y-protocols": "^1.0.5", + "y-webrtc": "~10.2.5", + "yjs": "~13.6.6" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/sync/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/token-list": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/token-list/-/token-list-3.11.0.tgz", + "integrity": "sha512-W+p9koG9tWQgxhW9rOqBxhMoqy68zu5km+Km49QZrNBhX4/vNu4kEY8pShStaRZCYxsvO4cf6sT7Jibt3c49Dg==", + "dependencies": { + "@babel/runtime": "7.25.7" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/token-list/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/undo-manager": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/undo-manager/-/undo-manager-1.11.0.tgz", + "integrity": "sha512-Z+GlI2e4bMRI0fjqUTFFy8MuGtWgxlc4PcDtN4qJkFVix83TnAJO5DEDo4UlntzPKfj+zv0Ua8HWm4luhvqAkw==", + "dependencies": { + "@babel/runtime": "7.25.7", + "@wordpress/is-shallow-equal": "*" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/undo-manager/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/url": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-4.11.0.tgz", + "integrity": "sha512-Q9gyGCxagefDu8MRICYSxl97+UjDTFkaKXpxmD+hxkc95p4QA5C0URQLNZ5e/DSKBIGr0sTQ+ZoloueIu9m82g==", + "dependencies": { + "@babel/runtime": "7.25.7", + "remove-accents": "^0.5.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/url/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/warning": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.11.0.tgz", + "integrity": "sha512-tXCsxlMAYXbRCgZmVHsBkoBGnrytZPGGezGXANRTsyJ00QoQJgxvnH6u22Rs/NOIVHQ5o65/9jKC3g0e6qn7PA==", + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/wordcount": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/wordcount/-/wordcount-4.11.0.tgz", + "integrity": "sha512-7RvPdjkrqmz/055SG/QCGH8UwdMhFz2YoNVPI1vA3iNglNxqwyb2k5ng7g3MJanPZNaUj0kuHknHhiCf/nLVHQ==", + "dependencies": { + "@babel/runtime": "7.25.7" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/wordcount/node_modules/@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/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, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adm-zip": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "dev": true, + "engines": { + "node": ">=12.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "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, + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", + "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/argparse/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/aria-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/autosize": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/autosize/-/autosize-4.0.4.tgz", + "integrity": "sha512-5yxLQ22O0fCRGoxGfeLSNt3J8LB1v+umtpMnPW6XjkTWXKoN0AmXAIhelJcDtFT/Y/wYWmfE+oqU10Q0b8FhaQ==" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz", + "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "dev": true + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-loader": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "dev": true, + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.3", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-runtime": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.25.0.tgz", + "integrity": "sha512-zeCYxDePWYAT/DfmQWIHsMSFW2vv45UIwIAMjGvQVsTd47RwsiRH0uK1yzyWZ7LDBKdhnGDPM6NYEO5CZyhPrg==", + "dev": true, + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.10.0" + } + }, + "node_modules/babel-runtime/node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "dev": true, + "hasInstallScript": true + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/bare-events": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", + "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", + "dev": true, + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", + "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", + "dev": true, + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" + } + }, + "node_modules/bare-os": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", + "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", + "dev": true, + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "dev": true, + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "node_modules/bare-stream": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.2.tgz", + "integrity": "sha512-EFZHSIBkDgSHIwj2l2QZfP4U5OcD4xFAOwhSb/vlr9PIqyGJGvB/nfClJbcnh3EY4jtPE4zsb5ztae96bVF79A==", + "dev": true, + "optional": true, + "dependencies": { + "streamx": "^2.20.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys/node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001680", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz", + "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "dependencies": { + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/check-node-version": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/check-node-version/-/check-node-version-4.2.1.tgz", + "integrity": "sha512-YYmFYHV/X7kSJhuN/QYHUu998n/TRuDe8UenM3+m5NrkiH670lb9ILqHIvBencvJc4SDh+XcbXMR4b+TtubJiw==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "map-values": "^1.0.1", + "minimist": "^1.2.0", + "object-filter": "^1.0.2", + "run-parallel": "^1.1.4", + "semver": "^6.3.0" + }, + "bin": { + "check-node-version": "bin.js" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/check-node-version/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "dev": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chrome-launcher": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", + "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0" + }, + "bin": { + "print-chrome-path": "bin/print-chrome-path.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/chromium-bidi": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.8.0.tgz", + "integrity": "sha512-uJydbGdTw0DEUjhoogGveneJVWX/9YuqkWePzMmkBYwtdAqo5d3J/ovNKFr+/2hWXYmYCr6it8mSSTIj6SS6Ug==", + "dev": true, + "dependencies": { + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0", + "zod": "3.23.8" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "dev": true + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, + "node_modules/clean-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==", + "dev": true, + "dependencies": { + "@types/webpack": "^4.4.31", + "del": "^4.1.1" + }, + "engines": { + "node": ">=8.9.0" + }, + "peerDependencies": { + "webpack": "*" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/clipboard": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", + "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", + "integrity": "sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg==", + "dev": true, + "dependencies": { + "for-own": "^0.1.3", + "is-plain-object": "^2.0.1", + "kind-of": "^3.0.2", + "lazy-cache": "^1.0.3", + "shallow-clone": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cmdk": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.0.4.tgz", + "integrity": "sha512-AnsjfHyHpQ/EFeAnG216WY7A5LiYCoZzCSygiLvfXC3H3LFGCprErteUcszaVluGOhuOTbJS3jWHrSDYPBBygg==", + "dependencies": { + "@radix-ui/react-dialog": "^1.1.2", + "@radix-ui/react-id": "^1.1.0", + "@radix-ui/react-primitive": "^2.0.0", + "use-sync-external-store": "^1.2.2" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz", + "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.0.2", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/computed-style": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/computed-style/-/computed-style-0.1.4.tgz", + "integrity": "sha512-WpAmaKbMNmS3OProfHIdJiNleNJdgUrJfbKArXua28QF7+0CoZjlLn0lp6vlc+dl5r2/X9GQiQRQQU4BzSa69w==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/configstore/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/configstore/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/copy-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/copy-dir/-/copy-dir-1.3.0.tgz", + "integrity": "sha512-Q4+qBFnN4bwGwvtXXzbp4P/4iNk0MaiGAzvQ8OiMtlLjkIKjmNN689uVzShSM0908q7GoFHXIPx4zi75ocoaHw==", + "dev": true + }, + "node_modules/copy-webpack-plugin": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", + "integrity": "sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^12.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 12.20.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", + "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", + "dev": true, + "dependencies": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.9", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.39.0.tgz", + "integrity": "sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", + "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", + "dev": true, + "dependencies": { + "browserslist": "^4.24.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.39.0.tgz", + "integrity": "sha512-7fEcWwKI4rJinnK+wLTezeg2smbFFdSBP6E2kQZNbnzM2s1rpKQ6aaRteZSSg7FLU3P0HGGVo/gbpfanU36urg==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dev": true, + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/cross-spawn/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/cross-spawn/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/csp_evaluator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/csp_evaluator/-/csp_evaluator-1.1.1.tgz", + "integrity": "sha512-N3ASg0C4kNPUaNxt1XAvzHIVuzdtr8KLgfk1O8WDyimp1GisPAHESupArO2ieHk9QWbrJ/WkQODyh21Ps/xhxw==", + "dev": true + }, + "node_modules/css-declaration-sorter": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-functions-list": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", + "dev": true, + "engines": { + "node": ">=12 || >=16" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-loader/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.0.1.tgz", + "integrity": "sha512-8Fxxv+tGhORlshCdCwnNJytvlvq46sOLSYEx2ZIGurahWvMucSRnyjPA3AmrMq4VPRYbHVpWj5VkiVasrM2H4Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.12.1", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssjanus": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssjanus/-/cssjanus-2.3.0.tgz", + "integrity": "sha512-ZZXXn51SnxRxAZ6fdY7mBDPmA4OZd83q/J9Gdqz3YmE9TUq+9tZl+tdOnCi7PpNygI6PEkehj9rgifv5+W8a5A==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/cssnano": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", + "dev": true, + "dependencies": { + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-default": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-utils": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", + "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/cwd": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", + "integrity": "sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==", + "dev": true, + "dependencies": { + "find-pkg": "^0.1.2", + "fs-exists-sync": "^0.1.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "optional": true, + "peer": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "node_modules/devtools-protocol": { + "version": "0.0.1155343", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1155343.tgz", + "integrity": "sha512-oD9vGBV2wTc7fAzAM6KC0chSgs234V8+qDEeK+mcbRj2UvcuA7lgBztGi/opj/iahcXD3BSj8Ymvib628yy9FA==", + "dev": true + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/docker-compose": { + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-0.24.8.tgz", + "integrity": "sha512-plizRs/Vf15H+GCVxq2EUvyPK7ei9b/cVesHvjnX4xaXjM9spHe2Ytq0BitndFgvTJ3E3NljPNUEl7BAN43iZw==", + "dev": true, + "dependencies": { + "yaml": "^2.2.2" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/docker-compose/node_modules/yaml": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", + "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.57", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.57.tgz", + "integrity": "sha512-xS65H/tqgOwUBa5UmOuNSLuslDo7zho0y/lgQw35pnrqiZh7UOWHCeL/Bt6noJATbA6tpQJGCifsFsIRZj1Fqg==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/envinfo": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", + "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/equivalent-key-map": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/equivalent-key-map/-/equivalent-key-map-0.2.2.tgz", + "integrity": "sha512-xvHeyCDbZzkpN4VHQj/n+j2lOwL0VWszG30X4cOrc9Y7Tuo2qCdZK/0AMod23Z5dCtNUbaju6p0rwOhHUk05ew==" + }, + "node_modules/err-code": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", + "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.23.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.4.tgz", + "integrity": "sha512-HR1gxH5OaiN7XH7uiWH0RLw0RcFySiSoW1ctxmD1ahTw3uGBtkmm/ng0tDU1OtYx5OK6EOL5Y6O21cDflG3Jcg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz", + "integrity": "sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.3", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "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, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-5.3.1.tgz", + "integrity": "sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g==", + "dev": true, + "dependencies": { + "eslint-rule-composer": "^0.3.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": ">=4.0.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "dev": true, + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "27.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", + "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^5.10.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", + "eslint": "^7.0.0 || ^8.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "46.10.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.10.1.tgz", + "integrity": "sha512-x8wxIpv00Y50NyweDUpa+58ffgSAI5sqe+zcZh33xphD0AVh+1kqr1ombaTRb7Fhpove1zfUuujlX9DWWBP5ag==", + "dev": true, + "dependencies": { + "@es-joy/jsdoccomment": "~0.41.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.1", + "debug": "^4.3.4", + "escape-string-regexp": "^4.0.0", + "esquery": "^1.5.0", + "is-builtin-module": "^3.2.1", + "semver": "^7.5.4", + "spdx-expression-parse": "^4.0.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-playwright": { + "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, + "peerDependencies": { + "eslint": ">=7", + "eslint-plugin-jest": ">=25" + }, + "peerDependenciesMeta": { + "eslint-plugin-jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", + "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.1.0", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/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/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/cross-spawn": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", + "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", + "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/execa/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/expect-puppeteer": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/expect-puppeteer/-/expect-puppeteer-4.4.0.tgz", + "integrity": "sha512-6Ey4Xy2xvmuQu7z7YQtMsaMV0EHJRpVxIDOd5GRrm04/I3nkTKIutELfECsLp6le+b3SSa3cXhPiw6PgqzxYWA==", + "dev": true + }, + "node_modules/express": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "dev": true + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + } + }, + "node_modules/extract-zip/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/extract-zip/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "dev": true, + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-file-up": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz", + "integrity": "sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==", + "dev": true, + "dependencies": { + "fs-exists-sync": "^0.1.0", + "resolve-dir": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-parent-dir": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.1.tgz", + "integrity": "sha512-o4UcykWV/XN9wm+jMEtWLPlV8RXCZnMhQI6F6OdHeSez7iiJWePw8ijOlskJZMsaQoGR/b7dH6lO02HhaTN7+A==", + "dev": true + }, + "node_modules/find-pkg": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz", + "integrity": "sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==", + "dev": true, + "dependencies": { + "find-file-up": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-process": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz", + "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "commander": "^5.1.0", + "debug": "^4.1.1" + }, + "bin": { + "find-process": "bin/find-process.js" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/framer-motion": { + "version": "11.11.13", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.11.13.tgz", + "integrity": "sha512-aoEA83gsqRRsnh4TN7S9YNcKVLrg+GtPNnxNMd9bGn23+pLmuKGQeccPnqffEKzlkgmy2MkMo0jRkK41S2LzWw==", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-browser-rtc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-browser-rtc/-/get-browser-rtc-1.1.0.tgz", + "integrity": "sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ==" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "dev": true, + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/gettext-parser": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.4.0.tgz", + "integrity": "sha512-sedZYLHlHeBop/gZ1jdg59hlUEcpcZJofLq2JFwJT1zTqAU3l2wFv6IsuwFHGqbiT9DWzMUW4/em2+hspnmMMA==", + "dependencies": { + "encoding": "^0.1.12", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==", + "dev": true, + "dependencies": { + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true + }, + "node_modules/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", + "dependencies": { + "delegate": "^3.1.2" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/gradient-parser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/gradient-parser/-/gradient-parser-0.1.5.tgz", + "integrity": "sha512-+uPlcVbjrKOnTzvz0MjTj7BfACj8OmxIa1moIjJV7btvhUMSJk0D47RfDCgDrZE3dYMz9Cf5xKJwnrKLjUq0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "dependencies": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/highlight-words-core": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/highlight-words-core/-/highlight-words-core-1.2.3.tgz", + "integrity": "sha512-m1O9HW3/GNHxzSIXWw1wCNXXsgLlxrP0OI6+ycGUhiUHkikqW3OrwVHz+lxeNBe5yqLESdIcj8PowHQ2zLvUvQ==" + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/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==" + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpq": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/hpq/-/hpq-1.4.0.tgz", + "integrity": "sha512-ycJQMRaRPBcfnoT1gS5I1XCvbbw9KO94Y0vkwksuOjcJMqNZtb03MF2tCItLI2mQbkZWSSeFinoRDPmjzv4tKg==" + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-link-header": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/http-link-header/-/http-link-header-1.1.3.tgz", + "integrity": "sha512-3cZ0SRL8fb9MUlU3mKM61FcQvPfXx2dBrZW3Vbg5CXa8jFlK8OaEpePenLe1oEXQduhz8b0QjsqfS59QP4AJDQ==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/husky": { + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.6.tgz", + "integrity": "sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==", + "dev": true, + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-4.0.1.tgz", + "integrity": "sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/image-ssim": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/image-ssim/-/image-ssim-0.2.0.tgz", + "integrity": "sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==", + "dev": true + }, + "node_modules/immutable": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.2.tgz", + "integrity": "sha512-1NU7hWZDkV7hJ4PJ9dur9gTNQ4ePNPN4k9/0YhwjzykTi/+3Q5pF93YU5QoVj8BuOnhLgaY8gs0U2pj4kSYVcw==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-locals": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-locals/-/import-locals-2.0.0.tgz", + "integrity": "sha512-1/bPE89IZhyf7dr5Pkz7b4UyVXy5pEt7PTEfye15UEn3AK8+2zwcDCfKk9Pwun4ltfhOSszOrReSsFcDKw/yoA==" + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/intl-messageformat": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-4.4.0.tgz", + "integrity": "sha512-z+Bj2rS3LZSYU4+sNitdHrwnBhr0wO80ZJSW8EzKDBowwUe3Q/UsvgCGjrwa+HPzoGCLEb9HAjfJgo4j2Sac8w==", + "dev": true, + "dependencies": { + "intl-messageformat-parser": "^1.8.1" + } + }, + "node_modules/intl-messageformat-parser": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.8.1.tgz", + "integrity": "sha512-IMSCKVf0USrM/959vj3xac7s8f87sc+80Y/ipBzdKy4ifBv5Gsj2tZ41EAaURVg01QU71fYr77uA8Meh6kELbg==", + "deprecated": "We've written a new parser that's 6x faster and is backwards compatible. Please use @formatjs/icu-messageformat-parser", + "dev": true + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/irregular-plurals": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", + "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd/node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isomorphic.js": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", + "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==", + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", + "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-dev-server": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-9.0.2.tgz", + "integrity": "sha512-Zc/JB0IlNNrpXkhBw+h86cGrde/Mey52KvF+FER2eyrtYJTHObOwW7Iarxm3rPyTKby5+3Y2QZtl8pRz/5GCxg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "cwd": "^0.10.0", + "find-process": "^1.4.7", + "prompts": "^2.4.2", + "spawnd": "^9.0.2", + "tree-kill": "^1.2.2", + "wait-on": "^7.2.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/jpeg-js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", + "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", + "dev": true + }, + "node_modules/js-library-detector": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/js-library-detector/-/js-library-detector-6.7.0.tgz", + "integrity": "sha512-c80Qupofp43y4cJ7+8TTDN/AsDwLi5oOm/plBrWI+iQt485vKXCco+yVmOwEgdo9VOdsYTuV0UlTeetVPTriXA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", + "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", + "dev": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json2php": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/json2php/-/json2php-0.0.9.tgz", + "integrity": "sha512-fQMYwvPsQt8hxRnCGyg1r2JVi6yL8Um0DIIawiKiMK9yhAAkcRNj5UsBWoaFvFzPpcWbgw9L6wzj+UMYA702Mw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/known-css-properties": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz", + "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", + "dev": true + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/launch-editor": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", + "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lib0": { + "version": "0.2.98", + "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.98.tgz", + "integrity": "sha512-XteTiNO0qEXqqweWx+b21p/fBnNHUA1NwAtJNJek1oPrewEZs2uiT4gWivHKr9GqCjDPAhchz0UQO8NwU3bBNA==", + "dependencies": { + "isomorphic.js": "^0.2.4" + }, + "bin": { + "0ecdsa-generate-keypair": "bin/0ecdsa-generate-keypair.js", + "0gentesthtml": "bin/gentesthtml.js", + "0serve": "bin/0serve.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, + "node_modules/lighthouse": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-10.4.0.tgz", + "integrity": "sha512-XQWHEWkJ8YxSPsxttBJORy5+hQrzbvGkYfeP3fJjyYKioWkF2MXfFqNK4ZuV4jL8pBu7Z91qnQP6In0bq1yXww==", + "dev": true, + "dependencies": { + "@sentry/node": "^6.17.4", + "axe-core": "4.7.2", + "chrome-launcher": "^0.15.2", + "configstore": "^5.0.1", + "csp_evaluator": "1.1.1", + "devtools-protocol": "0.0.1155343", + "enquirer": "^2.3.6", + "http-link-header": "^1.1.1", + "intl-messageformat": "^4.4.0", + "jpeg-js": "^0.4.4", + "js-library-detector": "^6.6.0", + "lighthouse-logger": "^1.4.1", + "lighthouse-stack-packs": "1.11.0", + "lodash": "^4.17.21", + "lookup-closest-locale": "6.2.0", + "metaviewport-parser": "0.3.0", + "open": "^8.4.0", + "parse-cache-control": "1.0.1", + "ps-list": "^8.0.0", + "puppeteer-core": "^20.8.0", + "robots-parser": "^3.0.0", + "semver": "^5.3.0", + "speedline-core": "^1.4.3", + "third-party-web": "^0.23.3", + "ws": "^7.0.0", + "yargs": "^17.3.1", + "yargs-parser": "^21.0.0" + }, + "bin": { + "chrome-debug": "core/scripts/manual-chrome-launcher.js", + "lighthouse": "cli/index.js", + "smokehouse": "cli/test/smokehouse/frontends/smokehouse-bin.js" + }, + "engines": { + "node": ">=16.16" + } + }, + "node_modules/lighthouse-logger": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", + "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "marky": "^1.2.2" + } + }, + "node_modules/lighthouse-logger/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/lighthouse-logger/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/lighthouse-stack-packs": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.11.0.tgz", + "integrity": "sha512-sRr0z1S/I26VffRLq9KJsKtLk856YrJlNGmcJmbLX8dFn3MuzVPUbstuChEhqnSxZb8TZmVfthuXuwhG9vRoSw==", + "dev": true + }, + "node_modules/lighthouse/node_modules/@puppeteer/browsers": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz", + "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==", + "dev": true, + "dependencies": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.3.0", + "tar-fs": "3.0.4", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.1" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=16.3.0" + }, + "peerDependencies": { + "typescript": ">= 4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/lighthouse/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/lighthouse/node_modules/axe-core": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", + "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/lighthouse/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/lighthouse/node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/lighthouse/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/lighthouse/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/lighthouse/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/lighthouse/node_modules/mitt": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", + "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==", + "dev": true + }, + "node_modules/lighthouse/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/lighthouse/node_modules/proxy-agent": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", + "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/lighthouse/node_modules/puppeteer-core": { + "version": "20.9.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", + "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", + "dev": true, + "dependencies": { + "@puppeteer/browsers": "1.4.6", + "chromium-bidi": "0.4.16", + "cross-fetch": "4.0.0", + "debug": "4.3.4", + "devtools-protocol": "0.0.1147663", + "ws": "8.13.0" + }, + "engines": { + "node": ">=16.3.0" + }, + "peerDependencies": { + "typescript": ">= 4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/chromium-bidi": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", + "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==", + "dev": true, + "dependencies": { + "mitt": "3.0.0" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/devtools-protocol": { + "version": "0.0.1147663", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", + "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==", + "dev": true + }, + "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/ws": { + "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, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/lighthouse/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/lighthouse/node_modules/tar-fs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", + "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", + "dev": true, + "dependencies": { + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + } + }, + "node_modules/lighthouse/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/lighthouse/node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/line-height": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/line-height/-/line-height-0.3.1.tgz", + "integrity": "sha512-YExecgqPwnp5gplD2+Y8e8A5+jKpr25+DzMbFdI1/1UAr0FJrTFv4VkHLf8/6B590i1wUPJWMKKldkd/bdQ//w==", + "dependencies": { + "computed-style": "~0.1.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "dev": true, + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lookup-closest-locale": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/lookup-closest-locale/-/lookup-closest-locale-6.2.0.tgz", + "integrity": "sha512-/c2kL+Vnp1jnV6K6RpDTHK3dgg0Tu2VVp+elEiJpjfS1UyY7AjOYHohRug6wT0OpoX2qFgNORndE9RqesfVxWQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/map-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-values/-/map-values-1.0.1.tgz", + "integrity": "sha512-BbShUnr5OartXJe1GeccAWtfro11hhgNJg6G9/UtWKjVGvV5U4C09cg5nk8JUevhXODaXY+hQ3xxMUKSs62ONQ==", + "dev": true + }, + "node_modules/markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it/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/markdown-it/node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/markdownlint": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.25.1.tgz", + "integrity": "sha512-AG7UkLzNa1fxiOv5B+owPsPhtM4D6DoODhsJgiaNg1xowXovrYgOnLqAgOOFQpWOlHFVQUzjMY5ypNNTeov92g==", + "dev": true, + "dependencies": { + "markdown-it": "12.3.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/markdownlint-cli": { + "version": "0.31.1", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.31.1.tgz", + "integrity": "sha512-keIOMwQn+Ch7MoBwA+TdkyVMuxAeZFEGmIIlvwgV0Z1TGS5MxPnRr29XCLhkNzCHU+uNKGjU+VEjLX+Z9kli6g==", + "dev": true, + "dependencies": { + "commander": "~9.0.0", + "get-stdin": "~9.0.0", + "glob": "~7.2.0", + "ignore": "~5.2.0", + "js-yaml": "^4.1.0", + "jsonc-parser": "~3.0.0", + "markdownlint": "~0.25.1", + "markdownlint-rule-helpers": "~0.16.0", + "minimatch": "~3.0.5", + "run-con": "~1.2.10" + }, + "bin": { + "markdownlint": "markdownlint.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/markdownlint-cli/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/markdownlint-cli/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/markdownlint-cli/node_modules/commander": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.0.0.tgz", + "integrity": "sha512-JJfP2saEKbQqvW+FI93OYUB4ByV5cizMpFMiiJI8xDbBvQvSkIk0VvQdn1CZ8mqAO8Loq2h0gYTYtDFUZUeERw==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/markdownlint-cli/node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/markdownlint-cli/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/markdownlint-cli/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/markdownlint-rule-helpers": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.16.0.tgz", + "integrity": "sha512-oEacRUVeTJ5D5hW1UYd2qExYI0oELdYK72k1TKGvIeYJIbqQWAz476NAc7LNixSySUhcNl++d02DvX0ccDk9/w==", + "dev": true + }, + "node_modules/marky": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", + "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", + "dev": true + }, + "node_modules/material-ui-popup-state": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/material-ui-popup-state/-/material-ui-popup-state-5.0.11.tgz", + "integrity": "sha512-wakm27MYILS5gdLJNYDUj1rhW4H3akv2WKGNFsoLKzHOl2qMOhhq6p1+UAok4qt9E6U7189zjpRLw6pDwhbvqw==", + "dependencies": { + "@babel/runtime": "^7.20.6", + "@types/prop-types": "^15.7.3", + "@types/react": "^18.0.26", + "classnames": "^2.2.6", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdn-data": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.1.tgz", + "integrity": "sha512-rsfnCbOHjqrhWxwt5/wtSLzpoKTzW7OXdT5lLOIH1OTYhWu9rRJveGq0sKvDZODABH7RX+uoR+DYcpFnq4Tf6Q==", + "dev": true + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/memize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/memize/-/memize-2.1.0.tgz", + "integrity": "sha512-yywVJy8ctVlN5lNPxsep5urnZ6TTclwPEyigM9M3Bi8vseJBOfqNrGWN/r8NzuIt3PovM323W04blJfGQfQSVg==" + }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/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/merge-deep": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz", + "integrity": "sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "clone-deep": "^0.2.4", + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/metaviewport-parser": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/metaviewport-parser/-/metaviewport-parser-0.3.0.tgz", + "integrity": "sha512-EoYJ8xfjQ6kpe9VbVHvZTZHiOl4HL1Z18CrZ+qahvLXT7ZO4YTC2JMyt5FaUp9JJp6J4Ybb/z7IsCXZt86/QkQ==", + "dev": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimist-options/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/minimist-options/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, + "node_modules/mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==", + "dev": true, + "dependencies": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-object/node_modules/for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.46.tgz", + "integrity": "sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mousetrap": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz", + "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==" + }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "optional": true + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/normalize-wheel": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz", + "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==" + }, + "node_modules/npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "node_modules/npm-package-json-lint": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/npm-package-json-lint/-/npm-package-json-lint-6.4.0.tgz", + "integrity": "sha512-cuXAJJB1Rdqz0UO6w524matlBqDBjcNt7Ru+RDIu4y6RI1gVqiWBnylrK8sPRk81gGBA0X8hJbDXolVOoTc+sA==", + "dev": true, + "dependencies": { + "ajv": "^6.12.6", + "ajv-errors": "^1.0.1", + "chalk": "^4.1.2", + "cosmiconfig": "^8.0.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "ignore": "^5.2.0", + "is-plain-obj": "^3.0.0", + "jsonc-parser": "^3.2.0", + "log-symbols": "^4.1.0", + "meow": "^9.0.0", + "plur": "^4.0.0", + "semver": "^7.3.8", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1", + "type-fest": "^3.2.0", + "validate-npm-package-name": "^5.0.0" + }, + "bin": { + "npmPkgJsonLint": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/npm-package-json-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/npm-package-json-lint/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/npm-package-json-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/npm-package-json-lint/node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true + }, + "node_modules/npm-package-json-lint/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-package-json-lint/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-packlist": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-3.0.0.tgz", + "integrity": "sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==", + "dev": true, + "dependencies": { + "glob": "^7.1.6", + "ignore-walk": "^4.0.1", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.13", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.13.tgz", + "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-filter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-filter/-/object-filter-1.0.2.tgz", + "integrity": "sha512-NahvP2vZcy1ZiiYah30CEPw0FpDcSkSePJBMpzl5EQgCmISijiGuJm3SPYp7U+Lf2TljyaIw3E5EgkEx/TNEVA==", + "dev": true + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.1.1.tgz", + "integrity": "sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ora/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/ora/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ora/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/log-symbols/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", + "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", + "dev": true, + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.5", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", + "dev": true + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dev": true, + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parsel-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/parsel-js/-/parsel-js-1.1.2.tgz", + "integrity": "sha512-D66DG2nKx4Yoq66TMEyCUHlR2STGqO7vsBrX7tgyS9cfQyO6XD5JyzOiflwmWN6a4wbUAqpmHqmrxlTQVGZcbA==" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==" + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pkg-dir/node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/playwright": { + "version": "1.48.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.2.tgz", + "integrity": "sha512-NjYvYgp4BPmiwfe31j4gHLa3J7bD2WiBz8Lk2RoSsmX38SVIARZ18VYjxLjAcDsAhA+F4iSEXTSGgjua0rrlgQ==", + "dev": true, + "peer": true, + "dependencies": { + "playwright-core": "1.48.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.48.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.2.tgz", + "integrity": "sha512-sjjw+qrLFlriJo64du+EK0kJgZzoQPsabGF4lBvsid+3CNIZIYLgnMj9V6JY5VhM2Peh20DJWIVpVljLLnlawA==", + "dev": true, + "peer": true, + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/plur": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", + "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", + "dev": true, + "dependencies": { + "irregular-plurals": "^3.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-convert-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-comments": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-empty": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-import": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-16.1.0.tgz", + "integrity": "sha512-7hsAZ4xGXl4MW+OKEWCnF6T5jqBw80/EE9aXg1r2yyn1RsVEU8EtKXbijEODa+rg7iih4bKf7vlvTGYR4CnPNg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true + }, + "node_modules/postcss-merge-longhand": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^6.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-rules": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", + "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", + "dev": true, + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-params": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", + "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.1.0.tgz", + "integrity": "sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", + "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", + "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", + "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", + "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-string": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", + "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", + "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", + "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", + "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", + "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-ordered-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", + "dev": true, + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-prefix-selector": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.1.tgz", + "integrity": "sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==", + "peerDependencies": { + "postcss": ">4 <9" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", + "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", + "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true + }, + "node_modules/postcss-safe-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/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, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", + "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.2.0" + }, + "engines": { + "node": "^14 || ^16 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-urlrebase": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/postcss-urlrebase/-/postcss-urlrebase-1.4.0.tgz", + "integrity": "sha512-rRaxMmWvXrn8Rk1PqsxmaJwldRHsr0WbbASKKCZYxXwotHkM/5X/6IrwaEe8pdzpbNGCEY86yhYMN0MhgOkADA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.3.0" + } + }, + "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==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "peer": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "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==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/ps-list": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-8.1.1.tgz", + "integrity": "sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, + "node_modules/psl": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.10.0.tgz", + "integrity": "sha512-KSKHEbjAnpUuAUserOq0FxGXCUrzC3WniuSJhvdbs102rL55266ZcHBqLWOsG30spQMlPdpy7icATiAQehg/iA==", + "dev": true, + "dependencies": { + "punycode": "^2.3.1" + } + }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer-core": { + "version": "23.7.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.7.1.tgz", + "integrity": "sha512-Om/qCZhd+HLoAr7GltrRAZpS3uOXwHu7tXAoDbNcJADHjG2zeAlDArgyIPXYGG4QB/EQUHk13Q6RklNxGM73Pg==", + "dev": true, + "dependencies": { + "@puppeteer/browsers": "2.4.1", + "chromium-bidi": "0.8.0", + "debug": "^4.3.7", + "devtools-protocol": "0.0.1354347", + "typed-query-selector": "^2.12.0", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core/node_modules/devtools-protocol": { + "version": "0.0.1354347", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1354347.tgz", + "integrity": "sha512-BlmkSqV0V84E2WnEnoPnwyix57rQxAM5SKJjf4TbYOCGLAWtz8CDH8RIaGOjPgPCXo2Mce3kxSY497OySidY3Q==", + "dev": true + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/re-resizable": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.10.1.tgz", + "integrity": "sha512-m33nSWRH57UZLmep5M/LatkZ2NRqimVD/bOOpvymw5Zf33+eTSEixsUugscOZzAtK0/nx+OSuOf8VbKJx/4ptw==", + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-autosize-textarea": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/react-autosize-textarea/-/react-autosize-textarea-7.1.0.tgz", + "integrity": "sha512-BHpjCDkuOlllZn3nLazY2F8oYO1tS2jHnWhcjTWQdcKiiMU6gHLNt/fzmqMSyerR0eTdKtfSIqtSeTtghNwS+g==", + "dependencies": { + "autosize": "^4.0.2", + "line-height": "^0.3.1", + "prop-types": "^15.5.6" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16.0.0", + "react-dom": "^0.14.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/react-colorful": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", + "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-easy-crop": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/react-easy-crop/-/react-easy-crop-5.1.0.tgz", + "integrity": "sha512-UsYeF/N7zoqtfOSD+2xSt1nRaoBYCI2YLkzmq+hi+aVepS4/bAMhbrLwJtDAP60jsVzWRiQCX7JG+ZtfWcHsiw==", + "dependencies": { + "normalize-wheel": "^1.0.1", + "tslib": "^2.0.1" + }, + "peerDependencies": { + "react": ">=16.4.0", + "react-dom": ">=16.4.0" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz", + "integrity": "sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.6", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", + "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.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==", + "dev": true, + "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==", + "dev": true, + "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", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "dev": true, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "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/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", + "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.11.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.2.tgz", + "integrity": "sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==", + "dev": true, + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/rememo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/rememo/-/rememo-4.0.2.tgz", + "integrity": "sha512-NVfSP9NstE3QPNs/TnegQY0vnJnstKQSpcrsI2kBTB3dB2PkdfKdTa+abbjMIDqpc63fE5LfjLgfMst0ULMFxQ==" + }, + "node_modules/remove-accents": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", + "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==" + }, + "node_modules/requestidlecallback": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/requestidlecallback/-/requestidlecallback-0.3.0.tgz", + "integrity": "sha512-TWHFkT7S9p7IxLC5A1hYmAYQx2Eb9w1skrXmQ+dS1URyvR8tenMLl4lHbqEOUnpEYxNKpkVMXUgknVpBZWXXfQ==" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/requireindex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", + "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", + "dev": true, + "engines": { + "node": ">=0.10.5" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "node_modules/resolve-bin": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/resolve-bin/-/resolve-bin-0.4.3.tgz", + "integrity": "sha512-9u8TMpc+SEHXxQXblXHz5yRvRZERkCZimFN9oz85QI3uhkh7nqfjm6OGTLg+8vucpXGcY4jLK6WkylPmt7GSvw==", + "dev": true, + "dependencies": { + "find-parent-dir": "~0.3.0" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==", + "dev": true, + "dependencies": { + "expand-tilde": "^1.2.2", + "global-modules": "^0.2.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/robots-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/robots-parser/-/robots-parser-3.0.1.tgz", + "integrity": "sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/rtlcss": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz", + "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.3.11", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + } + }, + "node_modules/rtlcss-webpack-plugin": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/rtlcss-webpack-plugin/-/rtlcss-webpack-plugin-4.0.7.tgz", + "integrity": "sha512-ouSbJtgcLBBQIsMgarxsDnfgRqm/AS4BKls/mz/Xb6HSl+PdEzefTR+Wz5uWQx4odoX0g261Z7yb3QBz0MTm0g==", + "dev": true, + "dependencies": { + "babel-runtime": "~6.25.0", + "rtlcss": "^3.5.0" + } + }, + "node_modules/rtlcss/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rtlcss/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rtlcss/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-con": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.2.12.tgz", + "integrity": "sha512-5257ILMYIF4RztL9uoZ7V9Q97zHtNHn5bN3NobeAnzB1P3ASLgg8qocM2u+R18ttp+VEM78N2LK8XcNVtnSRrg==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~3.0.0", + "minimist": "^1.2.8", + "strip-json-comments": "~3.1.1" + }, + "bin": { + "run-con": "cli.js" + } + }, + "node_modules/run-con/node_modules/ini": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", + "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rungen": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/rungen/-/rungen-0.3.2.tgz", + "integrity": "sha512-zWl10xu2D7zoR8zSC2U6bg5bYF6T/Wk7rxwp8IPaJH7f0Ge21G03kNHVgHR7tyVkSSfAOG0Rqf/Cl38JftSmtw==" + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sass": { + "version": "1.80.7", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.7.tgz", + "integrity": "sha512-MVWvN0u5meytrSjsU7AWsbhoXi1sc58zADXFllfZzbsBT1GHjjar6JwBINYPRrkx/zqnQ6uqbQuHgE95O+C+eQ==", + "dev": true, + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass-loader": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "dev": true, + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==" + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", + "integrity": "sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.1", + "kind-of": "^2.0.1", + "lazy-cache": "^0.2.3", + "mixin-object": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shallow-clone/node_modules/kind-of": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "integrity": "sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg==", + "dev": true, + "dependencies": { + "is-buffer": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shallow-clone/node_modules/lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/showdown": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/showdown/-/showdown-1.9.1.tgz", + "integrity": "sha512-9cGuS382HcvExtf5AHk7Cb4pAeQQ+h0eTr33V1mu+crYWV4KvWAw6el92bDrqGEk5d46Ai/fhbEUwqJ/mTCNEA==", + "dependencies": { + "yargs": "^14.2" + }, + "bin": { + "showdown": "bin/showdown.js" + } + }, + "node_modules/showdown/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/showdown/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/showdown/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/showdown/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/showdown/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/showdown/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/showdown/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/showdown/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/showdown/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/showdown/node_modules/yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "dependencies": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + } + }, + "node_modules/showdown/node_modules/yargs-parser": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz", + "integrity": "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-git": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.27.0.tgz", + "integrity": "sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==", + "dev": true, + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.5" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, + "node_modules/simple-html-tokenizer": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.5.11.tgz", + "integrity": "sha512-C2WEK/Z3HoSFbYq8tI7ni3eOo/NneSPRoPpcM7WdLjFOArFuyXEjAoCdOC3DgMfRyziZQ1hCNR4mrNdWEvD0og==" + }, + "node_modules/simple-peer": { + "version": "9.11.1", + "resolved": "https://registry.npmjs.org/simple-peer/-/simple-peer-9.11.1.tgz", + "integrity": "sha512-D1SaWpOW8afq1CZGWB8xTfrT3FekjQmPValrqncJMX7QFl8YwhrPTZvMCANLtgBwwdS+7zURyqxDDEmY558tTw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "buffer": "^6.0.3", + "debug": "^4.3.2", + "err-code": "^3.0.1", + "get-browser-rtc": "^1.1.0", + "queue-microtask": "^1.2.3", + "randombytes": "^2.1.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/simple-peer/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dev": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", + "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", + "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawnd": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-9.0.2.tgz", + "integrity": "sha512-nl8DVHEDQ57IcKakzpjanspVChkMpGLuVwMR/eOn9cXE55Qr6luD2Kn06sA0ootRMdgrU4tInN6lA6ohTNvysw==", + "dev": true, + "dependencies": { + "signal-exit": "^4.1.0", + "tree-kill": "^1.2.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/spawnd/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-correct/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/speedline-core": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/speedline-core/-/speedline-core-1.4.3.tgz", + "integrity": "sha512-DI7/OuAUD+GMpR6dmu8lliO2Wg5zfeh+/xsdyJZCzd8o5JgFUjCeLsBDuZjIQJdwXS3J0L/uZYrELKYqx+PXog==", + "dev": true, + "dependencies": { + "@types/node": "*", + "image-ssim": "^0.2.0", + "jpeg-js": "^0.4.1" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamx": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.1.tgz", + "integrity": "sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-outer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/style-search": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", + "dev": true + }, + "node_modules/stylehacks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/stylelint": { + "version": "16.10.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.10.0.tgz", + "integrity": "sha512-z/8X2rZ52dt2c0stVwI9QL2AFJhLhbPkyfpDFcizs200V/g7v+UYY6SNcB9hKOLcDDX/yGLDsY/pX08sLkz9xQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.1", + "@csstools/media-query-list-parser": "^3.0.1", + "@csstools/selector-specificity": "^4.0.0", + "@dual-bundle/import-meta-resolve": "^4.1.0", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^9.0.0", + "css-functions-list": "^3.2.3", + "css-tree": "^3.0.0", + "debug": "^4.3.7", + "fast-glob": "^3.3.2", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^9.1.0", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.3.1", + "ignore": "^6.0.2", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.34.0", + "mathml-tag-names": "^2.1.3", + "meow": "^13.2.0", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "picocolors": "^1.0.1", + "postcss": "^8.4.47", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-safe-parser": "^7.0.1", + "postcss-selector-parser": "^6.1.2", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "supports-hyperlinks": "^3.1.0", + "svg-tags": "^1.0.0", + "table": "^6.8.2", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "stylelint": "bin/stylelint.mjs" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz", + "integrity": "sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.1.0" + } + }, + "node_modules/stylelint-config-recommended-scss": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.1.0.tgz", + "integrity": "sha512-bhaMhh1u5dQqSsf6ri2GVWWQW5iUjBYgcHkh7SgDDn92ijoItC/cfO/W+fpXshgTQWhwFkP1rVcewcv4jaftRg==", + "dev": true, + "dependencies": { + "postcss-scss": "^4.0.9", + "stylelint-config-recommended": "^14.0.1", + "stylelint-scss": "^6.4.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "postcss": "^8.3.3", + "stylelint": "^16.6.1" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + } + } + }, + "node_modules/stylelint-scss": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.9.0.tgz", + "integrity": "sha512-oWOR+g6ccagfrENecImGmorWWjVyWpt2R8bmkhOW8FkNNPGStZPQMqb8QWMW4Lwu9TyPqmyjHkkAsy3weqsnNw==", + "dev": true, + "dependencies": { + "css-tree": "^3.0.1", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.35.0", + "mdn-data": "^2.12.2", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-selector-parser": "^6.1.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.0.2" + } + }, + "node_modules/stylelint-scss/node_modules/known-css-properties": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", + "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", + "dev": true + }, + "node_modules/stylelint-scss/node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true + }, + "node_modules/stylelint/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/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true + }, + "node_modules/stylelint/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/stylelint/node_modules/file-entry-cache": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", + "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==", + "dev": true, + "dependencies": { + "flat-cache": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/stylelint/node_modules/flat-cache": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", + "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", + "dev": true, + "dependencies": { + "flatted": "^3.3.1", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/stylelint/node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stylelint/node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stylelint/node_modules/ignore": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", + "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/stylelint/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/stylelint/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylelint/node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/stylelint/node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/stylis": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", + "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" + }, + "node_modules/stylis-plugin-rtl": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/stylis-plugin-rtl/-/stylis-plugin-rtl-2.1.1.tgz", + "integrity": "sha512-q6xIkri6fBufIO/sV55md2CbgS5c6gg9EhSVATtHHCdOnbN/jcI0u3lYhNVeuI65c4lQPo67g8xmq5jrREvzlg==", + "dependencies": { + "cssjanus": "^2.0.1" + }, + "peerDependencies": { + "stylis": "4.x" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", + "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/svgo/node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/svgo/node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/synckit": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/table": { + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", + "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/tannin": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tannin/-/tannin-1.2.0.tgz", + "integrity": "sha512-U7GgX/RcSeUETbV7gYgoz8PD7Ni4y95pgIP/Z6ayI3CfhSujwKEBlGFTCRN+Aqnuyf4AN2yHL+L8x+TCGjb9uA==", + "dependencies": { + "@tannin/plural-forms": "^1.1.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-fs": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link/node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/terser": { + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", + "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-decoder": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.1.tgz", + "integrity": "sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/third-party-web": { + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.23.4.tgz", + "integrity": "sha512-kwYnSZRhEvv0SBW2fp8SBBKRglMoBjV8xz6C31m0ewqOtknB5UL+Ihg+M81hyFY5ldkZuGWPb+e4GVDkzf/gYg==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-repeated/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz", + "integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-query-selector": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", + "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "dev": true + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "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", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "dev": true + }, + "node_modules/use-callback-ref": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", + "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-memo-one": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/wait-on": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", + "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==", + "dev": true, + "dependencies": { + "axios": "^1.6.1", + "joi": "^17.11.0", + "lodash": "^4.17.21", + "minimist": "^1.2.8", + "rxjs": "^7.8.1" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/wait-on/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/web-vitals": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", + "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", + "dev": true + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/webpack": { + "version": "5.96.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", + "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-cli/node_modules/cross-spawn": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", + "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/webpack-cli/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-cli/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-cli/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-merge/node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-merge/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-merge/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-merge/node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "devOptional": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/y-indexeddb": { + "version": "9.0.12", + "resolved": "https://registry.npmjs.org/y-indexeddb/-/y-indexeddb-9.0.12.tgz", + "integrity": "sha512-9oCFRSPPzBK7/w5vOkJBaVCQZKHXB/v6SIT+WYhnJxlEC61juqG0hBrAf+y3gmSMLFLwICNH9nQ53uscuse6Hg==", + "dependencies": { + "lib0": "^0.2.74" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "peerDependencies": { + "yjs": "^13.0.0" + } + }, + "node_modules/y-protocols": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.6.tgz", + "integrity": "sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q==", + "dependencies": { + "lib0": "^0.2.85" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "peerDependencies": { + "yjs": "^13.0.0" + } + }, + "node_modules/y-webrtc": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/y-webrtc/-/y-webrtc-10.2.6.tgz", + "integrity": "sha512-1kZ4YYwksFZi8+l8mTebVX9vW6Q5MnqxMkvNU700X5dBE38usurt/JgeXSIQRpK3NwUYYb9y63Jn9FMpMH6/vA==", + "dependencies": { + "lib0": "^0.2.42", + "simple-peer": "^9.11.0", + "y-protocols": "^1.0.6" + }, + "bin": { + "y-webrtc-signaling": "bin/server.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "optionalDependencies": { + "ws": "^8.14.2" + }, + "peerDependencies": { + "yjs": "^13.6.8" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yjs": { + "version": "13.6.20", + "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.20.tgz", + "integrity": "sha512-Z2YZI+SYqK7XdWlloI3lhMiKnCdFCVC4PchpdO+mCYwtiTwncjUbnRK9R1JmkNfdmHyDXuWN3ibJAt0wsqTbLQ==", + "dependencies": { + "lib0": "^0.2.98" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/package.json b/package.json index 2ed55696..e5a1f257 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,8 @@ "eslint-plugin-babel": "^5.3.1", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.1", - "eslint-plugin-react": "^7.37.1" + "eslint-plugin-react": "^7.37.1", + "husky": "^9.1.6" }, "dependencies": { "@elementor/icons": "^1.17.0", From 942076b1298b85eba80bb079c3a2a593c4a7b706 Mon Sep 17 00:00:00 2001 From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com> Date: Wed, 13 Nov 2024 16:50:23 +0530 Subject: [PATCH 005/292] Add connect modal (#111) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Initial refactor commit * ✅ Added build and tests CI/CD * update: add src for admin settings * update: incorrect constant names * update: namespace * add: accessibility settings * update: webpack to output files inside a folder * update: build output folders * update: removed commented code * update: npm scripts * add: webpack config * add: hooks * update: move admin setting to the module folder * update: assets loading logic * update: add rule to move jsx props to multiline imporving readability * add: connect modal * update: hooks import for better readability * update: replace functions with hooks * fix: alignment and style * update: imports * update: removed conflicting imports * fix: add compatibility for mobile devices --------- Co-authored-by: Ohad --- .eslintrc | 1 + modules/settings/assets/js/app.js | 2 + .../connect-modal/connect-modal-icon.js | 68 +++++++++++++++++++ .../js/components/connect-modal/index.js | 51 ++++++++++++++ .../settings/assets/js/components/index.js | 1 + modules/settings/assets/js/hooks/index.js | 2 + modules/settings/assets/js/hooks/use-auth.js | 4 +- modules/settings/assets/js/hooks/use-modal.js | 3 +- 8 files changed, 127 insertions(+), 5 deletions(-) create mode 100644 modules/settings/assets/js/components/connect-modal/connect-modal-icon.js create mode 100644 modules/settings/assets/js/components/connect-modal/index.js create mode 100644 modules/settings/assets/js/components/index.js diff --git a/.eslintrc b/.eslintrc index bd2111c7..0ad9518b 100644 --- a/.eslintrc +++ b/.eslintrc @@ -26,6 +26,7 @@ "rules": { "no-console": "off", "react-hooks/exhaustive-deps": "off", + "react/jsx-max-props-per-line": [1, { "maximum": { "single": 2, "multi": 1 } }], "strict": [ "error", "global" ], "curly": "warn", "import/order": [ diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js index 35d5bfb3..2ca43d10 100644 --- a/modules/settings/assets/js/app.js +++ b/modules/settings/assets/js/app.js @@ -1,11 +1,13 @@ import '../css/style.css'; import DirectionProvider from '@elementor/ui/DirectionProvider'; import { ThemeProvider } from '@elementor/ui/styles'; +import { ConnectModal } from './components'; const App = () => { return ( + ); diff --git a/modules/settings/assets/js/components/connect-modal/connect-modal-icon.js b/modules/settings/assets/js/components/connect-modal/connect-modal-icon.js new file mode 100644 index 00000000..98915a2a --- /dev/null +++ b/modules/settings/assets/js/components/connect-modal/connect-modal-icon.js @@ -0,0 +1,68 @@ +import SvgIcon from '@elementor/ui/SvgIcon'; + +const ConnectModalIcon = () => { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default ConnectModalIcon; diff --git a/modules/settings/assets/js/components/connect-modal/index.js b/modules/settings/assets/js/components/connect-modal/index.js new file mode 100644 index 00000000..8ea7f9c3 --- /dev/null +++ b/modules/settings/assets/js/components/connect-modal/index.js @@ -0,0 +1,51 @@ +import Box from '@elementor/ui/Box'; +import Button from '@elementor/ui/Button'; +import Grid from '@elementor/ui/Grid'; +import Modal from '@elementor/ui/Modal'; +import Typography from '@elementor/ui/Typography'; +import { __ } from '@wordpress/i18n'; +import { useAuth, useModal } from '../../hooks'; + +function ConnectModal() { + const { isOpen } = useModal(); + const { redirectToConnect } = useAuth(); + + return ( + + + + + { __( 'Connect plugin on your site!', 'pojo-accessibility' ) } + + + + + ); +} + +export default ConnectModal; diff --git a/modules/settings/assets/js/components/index.js b/modules/settings/assets/js/components/index.js new file mode 100644 index 00000000..a07d5cec --- /dev/null +++ b/modules/settings/assets/js/components/index.js @@ -0,0 +1 @@ +export { default as ConnectModal } from './connect-modal'; diff --git a/modules/settings/assets/js/hooks/index.js b/modules/settings/assets/js/hooks/index.js index e69de29b..0d9d628b 100644 --- a/modules/settings/assets/js/hooks/index.js +++ b/modules/settings/assets/js/hooks/index.js @@ -0,0 +1,2 @@ +export { useAuth } from './use-auth'; +export { useModal } from './use-modal'; diff --git a/modules/settings/assets/js/hooks/use-auth.js b/modules/settings/assets/js/hooks/use-auth.js index 4ce59147..791ec33c 100644 --- a/modules/settings/assets/js/hooks/use-auth.js +++ b/modules/settings/assets/js/hooks/use-auth.js @@ -1,7 +1,7 @@ import API from '../api'; import { UPGRADE_LINK } from '../constants'; -const useAuth = () => { +export const useAuth = () => { const { subscriptionId } = 123; const redirectToConnect = async () => { @@ -28,5 +28,3 @@ const useAuth = () => { getUpgradeLink, }; }; - -export default useAuth; diff --git a/modules/settings/assets/js/hooks/use-modal.js b/modules/settings/assets/js/hooks/use-modal.js index 6ae362b5..65c79c13 100644 --- a/modules/settings/assets/js/hooks/use-modal.js +++ b/modules/settings/assets/js/hooks/use-modal.js @@ -1,6 +1,6 @@ import { useState } from '@wordpress/element'; -const useModal = ( defaultIsOpen = true ) => { +export const useModal = ( defaultIsOpen = true ) => { const [ isOpen, setIsOpen ] = useState( defaultIsOpen ); const open = () => { @@ -19,4 +19,3 @@ const useModal = ( defaultIsOpen = true ) => { }; }; -export default useModal; From 9056e59ea8fd16d96f8ecb1d9420e86a085b060d Mon Sep 17 00:00:00 2001 From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com> Date: Wed, 13 Nov 2024 18:00:35 +0530 Subject: [PATCH 006/292] [APP 705] add connect module, settings and notification component (#112) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Initial refactor commit * ✅ Added build and tests CI/CD * update: add src for admin settings * update: incorrect constant names * update: namespace * add: accessibility settings * update: webpack to output files inside a folder * update: build output folders * update: removed commented code * update: npm scripts * add: webpack config * add: hooks * update: move admin setting to the module folder * update: assets loading logic * update: add rule to move jsx props to multiline imporving readability * add: connect modal * update: hooks import for better readability * update: replace functions with hooks * add: connect module * add: settings and get settings route * add: hooks and contexts to get settings * add: hooks * add: notification component * add: data api * add: settings provider and connect settings * add: husky * fix: formatting and text-domain * update: filter names * fix: hook import * add: set function for settings * add: prop-types package * update: refactor notification component and context * update: remove filter for authorize url * update: imports and exports of hooks * update: plugin settings context filename and relevant imports --------- Co-authored-by: Ohad --- includes/manager.php | 1 + modules/connect/classes/basic-enum.php | 35 ++ modules/connect/classes/config.php | 22 ++ modules/connect/classes/data.php | 357 ++++++++++++++++++ .../classes/exceptions/service-exception.php | 13 + modules/connect/classes/grant-types.php | 16 + modules/connect/classes/route-base.php | 43 +++ modules/connect/classes/service.php | 320 ++++++++++++++++ modules/connect/classes/utils.php | 125 ++++++ modules/connect/components/handler.php | 91 +++++ modules/connect/module.php | 62 +++ modules/connect/rest/authorize.php | 78 ++++ .../rest/deactivate-and-disconnect.php | 50 +++ modules/connect/rest/deactivate.php | 42 +++ modules/connect/rest/disconnect.php | 42 +++ modules/connect/rest/reconnect.php | 41 ++ modules/connect/rest/switch-domain.php | 59 +++ modules/settings/assets/js/admin.js | 10 +- modules/settings/assets/js/app.js | 15 +- .../settings/assets/js/components/index.js | 1 + .../js/components/notifications/index.js | 36 ++ .../assets/js/contexts/plugin-settings.js | 40 ++ modules/settings/assets/js/hooks/index.js | 6 + modules/settings/assets/js/hooks/use-auth.js | 1 + modules/settings/assets/js/hooks/use-modal.js | 1 - .../assets/js/hooks/use-notifications.js | 53 +++ .../settings/assets/js/hooks/use-settings.js | 24 ++ .../settings/assets/js/hooks/use-storage.js | 12 + modules/settings/classes/route-base.php | 39 ++ modules/settings/classes/settings.php | 28 ++ modules/settings/module.php | 21 +- modules/settings/rest/get-settings.php | 50 +++ package.json | 4 +- 33 files changed, 1730 insertions(+), 8 deletions(-) create mode 100644 modules/connect/classes/basic-enum.php create mode 100644 modules/connect/classes/config.php create mode 100644 modules/connect/classes/data.php create mode 100644 modules/connect/classes/exceptions/service-exception.php create mode 100644 modules/connect/classes/grant-types.php create mode 100644 modules/connect/classes/route-base.php create mode 100644 modules/connect/classes/service.php create mode 100644 modules/connect/classes/utils.php create mode 100644 modules/connect/components/handler.php create mode 100644 modules/connect/module.php create mode 100644 modules/connect/rest/authorize.php create mode 100644 modules/connect/rest/deactivate-and-disconnect.php create mode 100644 modules/connect/rest/deactivate.php create mode 100644 modules/connect/rest/disconnect.php create mode 100644 modules/connect/rest/reconnect.php create mode 100644 modules/connect/rest/switch-domain.php create mode 100644 modules/settings/assets/js/components/notifications/index.js create mode 100644 modules/settings/assets/js/contexts/plugin-settings.js create mode 100644 modules/settings/assets/js/hooks/use-notifications.js create mode 100644 modules/settings/assets/js/hooks/use-settings.js create mode 100644 modules/settings/assets/js/hooks/use-storage.js create mode 100644 modules/settings/classes/route-base.php create mode 100644 modules/settings/classes/settings.php create mode 100644 modules/settings/rest/get-settings.php diff --git a/includes/manager.php b/includes/manager.php index cc781854..247b9b20 100644 --- a/includes/manager.php +++ b/includes/manager.php @@ -17,6 +17,7 @@ final class Manager { public static function get_module_list(): array { return [ 'Legacy', + 'Connect', 'Settings', ]; } diff --git a/modules/connect/classes/basic-enum.php b/modules/connect/classes/basic-enum.php new file mode 100644 index 00000000..bf5c1aa9 --- /dev/null +++ b/modules/connect/classes/basic-enum.php @@ -0,0 +1,35 @@ +getConstants(); + } + + return self::$entries[ $caller ]; + } +} diff --git a/modules/connect/classes/config.php b/modules/connect/classes/config.php new file mode 100644 index 00000000..e1f565ba --- /dev/null +++ b/modules/connect/classes/config.php @@ -0,0 +1,22 @@ +get_col( + $wpdb->prepare( + "SELECT option_value + FROM $wpdb->options + WHERE option_name = %s + AND %s = %s + LIMIT 1", + $option_name, + $cache_buster, + $cache_buster + ) + ); + if ( ! empty( $option ) ) { + return $option[0]; + } + return $default; + } + + /** + * insert_option_uniquely + * + * used to insert option if not there already + * direct query to avoid cache and race condition issues + * + * @param $option_name + * @param $option_value + * + * @return bool + */ + public static function insert_option_uniquely( $option_name, $option_value ): bool { + global $wpdb; + if ( ! self::is_option_whitelisted_for_direct_access( $option_name ) ) { + return false; + } + $cache_buster = wp_generate_uuid4(); + $result = $wpdb->query( + $wpdb->prepare( + "INSERT INTO $wpdb->options (option_name, option_value, autoload) + SELECT * FROM (SELECT %s, %s, 'no') AS tmp + WHERE NOT EXISTS ( + SELECT option_name + FROM $wpdb->options + WHERE option_name = %s + AND option_value = %s + AND %s = %s + ) LIMIT 1", + $option_name, + $option_value, + $option_name, + $option_value, + $cache_buster, + $cache_buster + ) + ); + + if ( false === $result || 0 === $result ) { + // false means query failed, 0 means no row inserted because it exists + return false; + } + + return true; + } + + /** + * is_option_whitelisted_for_direct_access + * allowed only list of option names + * + * @param string $option_name + * + * @return boolean + */ + public static function is_option_whitelisted_for_direct_access( string $option_name ): bool { + $options_whitelist = [ + Config::APP_NAME . Service::REFRESH_TOKEN_LOCK, + ]; + return in_array( $option_name, $options_whitelist, true ); + } + + /** + * User is subscription owner. + * + * Check if current user is subscription owner. + * + * @return boolean + */ + public static function user_is_subscription_owner(): bool { + $owner_id = (int) self::get_connect_mode_data( self::OPTION_OWNER_USER_ID, false ); + + return get_current_user_id() === $owner_id; + } + + /** + * clear_session + */ + public static function clear_session( $with_client = false ) { + if ( Config::CONNECT_MODE === 'site' ) { + if ( $with_client ) { + self::delete_option( self::CLIENT_ID ); + self::delete_option( self::CLIENT_SECRET ); + } + self::delete_option( self::ACCESS_TOKEN ); + self::delete_option( self::REFRESH_TOKEN ); + self::delete_option( self::TOKEN_ID ); + self::delete_option( self::SUBSCRIPTION_ID ); + self::delete_option( self::OPTION_OWNER_USER_ID ); + self::delete_option( self::HOME_URL ); + } else { + $user_id = get_current_user_id(); + if ( $with_client ) { + self::delete_user_data( $user_id, self::CLIENT_ID ); + self::delete_user_data( $user_id, self::CLIENT_SECRET ); + } + self::delete_user_data( $user_id, self::ACCESS_TOKEN ); + self::delete_user_data( $user_id, self::REFRESH_TOKEN ); + self::delete_user_data( $user_id, self::TOKEN_ID ); + self::delete_user_data( $user_id, self::SUBSCRIPTION_ID ); + self::delete_user_data( $user_id, self::OPTION_OWNER_USER_ID ); + self::delete_user_data( $user_id, self::HOME_URL ); + } + } +} diff --git a/modules/connect/classes/exceptions/service-exception.php b/modules/connect/classes/exceptions/service-exception.php new file mode 100644 index 00000000..ad0af388 --- /dev/null +++ b/modules/connect/classes/exceptions/service-exception.php @@ -0,0 +1,13 @@ +get_path(); + } + + public function get_path(): string { + return $this->path; + } + + public function get_name(): string { + return ''; + } + + public function post_permission_callback( \WP_REST_Request $request ): bool { + return $this->get_permission_callback( $request ); + } + + public function get_permission_callback( \WP_REST_Request $request ): bool { + $valid = $this->permission_callback( $request ); + + return $valid && user_can( $this->current_user_id, 'manage_options' ); + } +} diff --git a/modules/connect/classes/service.php b/modules/connect/classes/service.php new file mode 100644 index 00000000..88180c45 --- /dev/null +++ b/modules/connect/classes/service.php @@ -0,0 +1,320 @@ + 'POST', + 'headers' => [ + 'Content-Type' => 'application/json', + ], + 'body' => wp_json_encode([ + 'redirect_uri' => Utils::get_redirect_uri(), + 'app_type' => Config::APP_TYPE, + ]), + ], 201 ); + + $client_id = $client_data['client_id'] ?? null; + $client_secret = $client_data['client_secret'] ?? null; + + Data::set_client_id( $client_id ); + Data::set_client_secret( $client_secret ); + Data::set_home_url(); + + return $client_id; + } + + /** + * Deactivate license + * + * @return void + * @throws Service_Exception + */ + public static function deactivate_license(): void { + $client_id = Data::get_client_id(); + + if ( ! $client_id ) { + throw new Service_Exception( 'Missing client ID' ); + } + + $deactivation_url = Utils::get_deactivation_url( $client_id ); + + if ( ! $deactivation_url ) { + throw new Service_Exception( 'Missing deactivation URL' ); + } + + $access_token = Data::get_access_token(); + + if ( ! $access_token ) { + throw new Service_Exception( 'Missing access token' ); + } + + $refresh_token = Data::get_refresh_token(); + + if ( ! $refresh_token ) { + throw new Service_Exception( 'Missing refresh token' ); + } + + self::request($deactivation_url, [ + 'method' => 'DELETE', + 'headers' => [ + 'Authorization' => "Bearer {$access_token}", + ], + ], 204); + + self::get_token( 'refresh_token', $refresh_token ); + } + + /** + * disconnect + * + * @return void + * @throws Service_Exception + */ + public static function disconnect(): void { + $sessions_url = Utils::get_sessions_url(); + + if ( ! $sessions_url ) { + throw new Service_Exception( 'Missing sessions URL' ); + } + + $access_token = Data::get_access_token(); + + if ( ! $access_token ) { + throw new Service_Exception( 'Missing access token' ); + } + + self::request( $sessions_url, [ + 'method' => 'DELETE', + 'headers' => [ + 'Content-Type' => 'application/json', + 'Authorization' => "Bearer {$access_token}", + ], + ], 204 ); + + Data::clear_session(); + } + + /** + * disconnect + * + * @return void + * @throws Service_Exception + */ + public static function reconnect(): void { + $sessions_url = Utils::get_sessions_url(); + + if ( ! $sessions_url ) { + throw new Service_Exception( 'Missing sessions URL' ); + } + + Data::clear_session(); + } + + /** + * Get token & optionally save to user + * + * @param string $grant_type + * + * @param string|null $credential + * @param bool|null $update + * + * @return array + * @throws Service_Exception + */ + public static function get_token( string $grant_type, ?string $credential = null, ?bool $update = true ): array { + $token_url = Utils::get_token_url(); + + if ( ! $token_url ) { + throw new Service_Exception( 'Missing token URL' ); + } + + $client_id = Data::get_client_id(); + $client_secret = Data::get_client_secret(); + + if ( empty( $client_id ) || empty( $client_secret ) ) { + throw new Service_Exception( 'Missing client ID or secret' ); + } + + $body = [ + 'grant_type' => $grant_type, + 'redirect_uri' => Utils::get_redirect_uri(), + ]; + + switch ( $grant_type ) { + case GrantTypes::AUTHORIZATION_CODE: + $body['code'] = $credential; + break; + case GrantTypes::REFRESH_TOKEN: + $body[ GrantTypes::REFRESH_TOKEN ] = $credential; + break; + case GrantTypes::CLIENT_CREDENTIALS: + $body['redirect_uri'] = Utils::get_redirect_uri( Data::get_home_url() ); + + break; + default: + throw new Service_Exception( 'Invalid grant type' ); + } + + $data = self::request( $token_url, [ + 'method' => 'POST', + 'headers' => [ + 'x-elementor-apps' => Config::APP_NAME, + 'Authorization' => 'Basic ' . base64_encode( "{$client_id}:{$client_secret}" ), // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode + ], + 'body' => $body, + ] ); + + if ( $update ) { + Data::set_connect_mode_data( Data::TOKEN_ID, $data['id_token'] ?? null ); + Data::set_connect_mode_data( Data::ACCESS_TOKEN, $data['access_token'] ?? null ); + Data::set_connect_mode_data( Data::REFRESH_TOKEN, $data['refresh_token'] ?? null ); + Data::set_connect_mode_data( Data::OPTION_OWNER_USER_ID, get_current_user_id() ?? null ); + } + + return $data; + } + + public static function jwt_decode( $payload ): string { + static $jwks = null; + + $jwks_url = Utils::get_jwks_url(); + if ( ! $jwks_url ) { + return __( 'Missing JWKS URL', 'pojo-accessibility' ); + } + + if ( ! $jwks ) { + $jwks = self::request($jwks_url, [ + 'method' => 'GET', + ]); + } + if ( ! class_exists( 'JWT' ) ) { + require_once EA11Y_PATH . 'vendor/autoload.php'; + if ( ! class_exists( 'JWT' ) ) { + return __( 'JWT class not found', 'pojo-accessibility' ); + } + } + + try { + $decoded = \Firebase\JWT\JWT::decode( $payload, \Firebase\JWT\JWK::parseKeySet( $jwks ) ); + return wp_json_encode( $decoded, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES ); + } catch ( \Throwable $th ) { + if ( $th instanceof \Firebase\JWT\ExpiredException ) { + self::get_token( GrantTypes::REFRESH_TOKEN, Data::get_refresh_token() ); + return self::jwt_decode( $payload ); + } + return $th->getMessage(); + } + } + + /** + * @param string $url + * @param array $args + * @param int $valid_response_code + * + * @return array|null + * @throws Service_Exception + */ + public static function request( string $url, array $args, int $valid_response_code = 200 ): ?array { + $args['timeout'] = 30; + + $response = wp_remote_request( $url, $args ); + + if ( is_wp_error( $response ) ) { + Logger::error( $response->get_error_message() ); + + throw new Service_Exception( esc_html( $response->get_error_message() ) ); + } + + if ( wp_remote_retrieve_response_code( $response ) !== $valid_response_code ) { + Logger::error( 'Invalid status code ' . wp_remote_retrieve_response_code( $response ) ); + + throw new Service_Exception( esc_html( wp_remote_retrieve_body( $response ) ) ); + } + + return json_decode( wp_remote_retrieve_body( $response ), true ); + } + + /** + * @throws Service_Exception + */ + public static function refresh_token() { + $lock_key = Config::APP_NAME . self::REFRESH_TOKEN_LOCK; + $last_token = Data::fetch_option( $lock_key, '' ); + + $current_refresh_token = Data::get_refresh_token(); + + if ( ! empty( $last_token ) && $last_token === $current_refresh_token ) { + sleep( 1 ); + return; + } + + delete_option( $lock_key ); + $locked = Data::insert_option_uniquely( $lock_key, $current_refresh_token ); + if ( ! $locked ) { + sleep( 1 ); + return; + } + + self::get_token( GrantTypes::REFRESH_TOKEN, $current_refresh_token ); + } + + /** + * @throws Service_Exception + */ + public static function update_redirect_uri(): void { + $client_id = Data::get_client_id(); + + if ( ! $client_id ) { + throw new Service_Exception( 'Missing client ID' ); + } + + $client_patch_url = Utils::get_clients_patch_url( $client_id ); + + [ 'access_token' => $access_token ] = self::get_token( + GrantTypes::CLIENT_CREDENTIALS, + null, + false + ); + + self::request( $client_patch_url, [ + 'method' => 'PATCH', + 'headers' => [ + 'Content-Type' => 'application/json', + 'Authorization' => "Bearer {$access_token}", + ], + 'body' => wp_json_encode( [ + 'redirect_uri' => Utils::get_redirect_uri(), + ] ), + ] ); + + self::refresh_token(); + + Data::set_home_url(); + } +} diff --git a/modules/connect/classes/utils.php b/modules/connect/classes/utils.php new file mode 100644 index 00000000..9edfc198 --- /dev/null +++ b/modules/connect/classes/utils.php @@ -0,0 +1,125 @@ + $client_id, + 'redirect_uri' => rawurlencode( self::get_redirect_uri() ), + 'response_type' => 'code', + 'scope' => Config::SCOPES, + 'state' => wp_create_nonce( Config::STATE_NONCE ), + ], self::get_auth_url() ); + } + + /** + * get_deactivation_url + * @param string $client_id + * + * @return string + */ + public static function get_deactivation_url( string $client_id ): string { + return self::get_base_url() . "/api/v1/clients/{$client_id}/activation"; + } + + public static function get_jwks_url(): string { + return self::get_base_url() . '/v1/.well-known/jwks.json'; + } + + /** + * get_sessions_url + * @return string + */ + public static function get_sessions_url(): string { + return self::get_base_url() . '/api/v1/session'; + } + + public static function get_token_url(): string { + return self::get_base_url() . '/api/v1/oauth2/token'; + } + + /** + * Get clients URL + * + * @param string $client_id + * + * @return string + */ + public static function get_clients_patch_url( string $client_id ): string { + return Utils::get_base_url() . "/api/v1/clients/{$client_id}"; + } + + /** + * get_base_url + * @return string + */ + public static function get_base_url(): string { + return apply_filters( 'ea11y_connect_get_base_url', Config::BASE_URL ); + } + + /** + * is_valid_home_url + * @return bool + */ + public static function is_valid_home_url(): bool { + static $valid = null; + + if ( null === $valid ) { + if ( empty( Data::get_home_url() ) ) { + $valid = true; + } else { + $valid = Data::get_home_url() === home_url(); + } + } + + return $valid; + } +} diff --git a/modules/connect/components/handler.php b/modules/connect/components/handler.php new file mode 100644 index 00000000..5eee71d2 --- /dev/null +++ b/modules/connect/components/handler.php @@ -0,0 +1,91 @@ +should_handle_auth_code() ) { + return; + } + + $code = sanitize_text_field( $_GET['code'] ); + $state = sanitize_text_field( $_GET['state'] ); + + // Check if the state is valid + $this->validate_nonce( $state ); + + try { + // Exchange the code for an access token and store it + Service::get_token( GrantTypes::AUTHORIZATION_CODE, $code ); // Makes sure we won't stick in the mismatch limbo + + Data::set_home_url(); + + do_action( 'on_connect_' . Config::APP_PREFIX . '_connected' ); // Redirect to the redirect URI + } catch ( Throwable $t ) { + Logger::error( 'Unable to handle auth code: ' . $t->getMessage() ); + } + + wp_redirect( Utils::get_redirect_uri() ); + + exit; + } + + /** + * Handler constructor. + */ + public function __construct() { + add_action( 'admin_init', [ $this, 'handle_auth_code' ] ); + } +} diff --git a/modules/connect/module.php b/modules/connect/module.php new file mode 100644 index 00000000..3c38df37 --- /dev/null +++ b/modules/connect/module.php @@ -0,0 +1,62 @@ +register_components(); + $this->register_routes(); + } +} + diff --git a/modules/connect/rest/authorize.php b/modules/connect/rest/authorize.php new file mode 100644 index 00000000..32b68998 --- /dev/null +++ b/modules/connect/rest/authorize.php @@ -0,0 +1,78 @@ +verify_nonce_and_capability( + $request->get_param( self::NONCE_NAME ), + self::NONCE_NAME + ); + + if ( Connect::is_connected() && Utils::is_valid_home_url() ) { + return $this->respond_error_json( [ + 'message' => esc_html__( 'You are already connected', 'pojo-accessibility' ), + 'code' => 'forbidden', + ] ); + } + + try { + $client_id = Data::get_client_id(); + + if ( ! $client_id ) { + $client_id = Service::register_client(); + } + + if ( ! Utils::is_valid_home_url() ) { + if ( $request->get_param( 'update_redirect_uri' ) ) { + Service::update_redirect_uri(); + } else { + return $this->respond_error_json( [ + 'message' => esc_html__( 'Connected domain mismatch', 'pojo-accessibility' ), + 'code' => 'forbidden', + ] ); + } + } + + $authorize_url = Utils::get_authorize_url( $client_id ); + + $authorize_url = apply_filters( 'ea11y_connect_authorize_url', $authorize_url ); + + return $this->respond_success_json( $authorize_url ); + } catch ( Throwable $t ) { + return $this->respond_error_json( [ + 'message' => $t->getMessage(), + 'code' => 'internal_server_error', + ] ); + } + } +} diff --git a/modules/connect/rest/deactivate-and-disconnect.php b/modules/connect/rest/deactivate-and-disconnect.php new file mode 100644 index 00000000..4b7dc87c --- /dev/null +++ b/modules/connect/rest/deactivate-and-disconnect.php @@ -0,0 +1,50 @@ +get_param( 'clear_session' ) ) { + Data::clear_session( true ); + return $this->respond_success_json(); + } + + Service::deactivate_license(); + Service::disconnect(); + + return $this->respond_success_json(); + } catch ( Throwable $t ) { + return $this->respond_error_json( [ + 'message' => $t->getMessage(), + 'code' => 'internal_server_error', + ] ); + } + } +} diff --git a/modules/connect/rest/deactivate.php b/modules/connect/rest/deactivate.php new file mode 100644 index 00000000..01c9aecc --- /dev/null +++ b/modules/connect/rest/deactivate.php @@ -0,0 +1,42 @@ +respond_success_json(); + } catch ( Throwable $t ) { + return $this->respond_error_json( [ + 'message' => $t->getMessage(), + 'code' => 'internal_server_error', + ] ); + } + } +} diff --git a/modules/connect/rest/disconnect.php b/modules/connect/rest/disconnect.php new file mode 100644 index 00000000..303c4779 --- /dev/null +++ b/modules/connect/rest/disconnect.php @@ -0,0 +1,42 @@ +respond_success_json(); + } catch ( Throwable $t ) { + return $this->respond_error_json( [ + 'message' => $t->getMessage(), + 'code' => 'internal_server_error', + ] ); + } + } +} diff --git a/modules/connect/rest/reconnect.php b/modules/connect/rest/reconnect.php new file mode 100644 index 00000000..0c43431b --- /dev/null +++ b/modules/connect/rest/reconnect.php @@ -0,0 +1,41 @@ +respond_success_json(); + } catch ( Throwable $t ) { + return $this->respond_error_json( [ + 'message' => $t->getMessage(), + 'code' => 'internal_server_error', + ] ); + } + } +} diff --git a/modules/connect/rest/switch-domain.php b/modules/connect/rest/switch-domain.php new file mode 100644 index 00000000..d4b54c0c --- /dev/null +++ b/modules/connect/rest/switch-domain.php @@ -0,0 +1,59 @@ +verify_nonce_and_capability( + $request->get_param( self::NONCE_NAME ), + self::NONCE_NAME + ); + + try { + $client_id = Data::get_client_id(); + + if ( ! $client_id ) { + return $this->respond_error_json( [ + 'message' => __( 'Client ID not found', 'pojo-accessibility' ), + 'code' => 'ignore_error', + ] ); + } + + Service::update_redirect_uri(); + + return $this->respond_success_json( [ 'message' => __( 'Domain updated!', 'pojo-accessibility' ) ] ); + } catch ( Throwable $t ) { + return $this->respond_error_json( [ + 'message' => $t->getMessage(), + 'code' => 'internal_server_error', + ] ); + } + } +} diff --git a/modules/settings/assets/js/admin.js b/modules/settings/assets/js/admin.js index 4e51e3ad..a40129e3 100644 --- a/modules/settings/assets/js/admin.js +++ b/modules/settings/assets/js/admin.js @@ -2,6 +2,8 @@ import { ThemeProvider } from '@elementor/ui/styles'; import { StrictMode, Fragment, createRoot } from '@wordpress/element'; import App from './app'; import AdminTopBar from './components/admin-top-bar'; +import { PluginSettingsProvider } from './contexts/plugin-settings'; +import { SettingsProvider, NotificationsProvider } from './hooks'; const rootNode = document.getElementById( 'ea11y-app' ); const topBarNode = document.getElementById( 'ea11y-app-top-bar' ); @@ -21,6 +23,12 @@ topBar.render( root.render( - + + + + + + + , ); diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js index 2ca43d10..83ba765d 100644 --- a/modules/settings/assets/js/app.js +++ b/modules/settings/assets/js/app.js @@ -1,13 +1,22 @@ import '../css/style.css'; import DirectionProvider from '@elementor/ui/DirectionProvider'; import { ThemeProvider } from '@elementor/ui/styles'; -import { ConnectModal } from './components'; +import { ConnectModal, Notifications } from './components'; +import { usePluginSettingsContext } from './contexts/plugin-settings'; +import { useNotificationSettings } from './hooks'; const App = () => { + const { isConnected } = usePluginSettingsContext(); + const { + notificationMessage, + notificationType, + } = useNotificationSettings(); + return ( - + - + { ! isConnected && } + ); diff --git a/modules/settings/assets/js/components/index.js b/modules/settings/assets/js/components/index.js index a07d5cec..ef0c0495 100644 --- a/modules/settings/assets/js/components/index.js +++ b/modules/settings/assets/js/components/index.js @@ -1 +1,2 @@ export { default as ConnectModal } from './connect-modal'; +export { default as Notifications } from './notifications'; diff --git a/modules/settings/assets/js/components/notifications/index.js b/modules/settings/assets/js/components/notifications/index.js new file mode 100644 index 00000000..367ee784 --- /dev/null +++ b/modules/settings/assets/js/components/notifications/index.js @@ -0,0 +1,36 @@ +import Alert from '@elementor/ui/Alert'; +import Snackbar from '@elementor/ui/Snackbar'; +import { useNotificationSettings } from '../../hooks'; + +const Notifications = ( { type, message } ) => { + const { + showNotification, + setShowNotification, + setNotificationMessage, + setNotificationType, + } = useNotificationSettings(); + + const closeNotification = () => { + setShowNotification( ! showNotification ); + setNotificationMessage( '' ); + setNotificationType( '' ); + }; + + return ( + + setShowNotification( ! showNotification ) } + severity={ type } + variant="filled" > + { message } + + + ); +}; + +export default Notifications; diff --git a/modules/settings/assets/js/contexts/plugin-settings.js b/modules/settings/assets/js/contexts/plugin-settings.js new file mode 100644 index 00000000..54d028f9 --- /dev/null +++ b/modules/settings/assets/js/contexts/plugin-settings.js @@ -0,0 +1,40 @@ +import { createContext, useCallback, useContext, useEffect, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import API from '../api'; +import { useToastNotification } from '../hooks'; + +const PluginSettingsContext = createContext( {} ); + +export const PluginSettingsProvider = ( { children } ) => { + const { error } = useToastNotification(); + const [ pluginSettings, setPluginSettings ] = useState(); + const [ loaded, setLoaded ] = useState( false ); + + const refreshPluginSettings = useCallback( () => { + API.getPluginSettings().then( ( settings ) => { + if ( 'isConnected' in settings ) { + settings.isConnected = Boolean( settings.isConnected ); + } + + setPluginSettings( settings ); + setLoaded( true ); + } ).catch( () => { + error( __( 'An error occurred.', 'pojo-accessibility' ) ); + setLoaded( true ); + } ); + }, [] ); + + useEffect( () => { + refreshPluginSettings(); + }, [ refreshPluginSettings ] ); + + return ( + + { children } + + ); +}; + +export const usePluginSettingsContext = () => { + return useContext( PluginSettingsContext ); +}; diff --git a/modules/settings/assets/js/hooks/index.js b/modules/settings/assets/js/hooks/index.js index 0d9d628b..1ae75e25 100644 --- a/modules/settings/assets/js/hooks/index.js +++ b/modules/settings/assets/js/hooks/index.js @@ -1,2 +1,8 @@ export { useAuth } from './use-auth'; export { useModal } from './use-modal'; +export { useSettings } from './use-settings'; +export { SettingsProvider } from './use-settings'; +export { useStorage } from './use-storage'; +export { useToastNotification } from './use-notifications'; +export { NotificationsProvider } from './use-notifications'; +export { useNotificationSettings } from './use-notifications'; diff --git a/modules/settings/assets/js/hooks/use-auth.js b/modules/settings/assets/js/hooks/use-auth.js index 791ec33c..65c0fc55 100644 --- a/modules/settings/assets/js/hooks/use-auth.js +++ b/modules/settings/assets/js/hooks/use-auth.js @@ -1,5 +1,6 @@ import API from '../api'; import { UPGRADE_LINK } from '../constants'; +import { usePluginSettingsContext } from '../contexts/plugin-settings'; export const useAuth = () => { const { subscriptionId } = 123; diff --git a/modules/settings/assets/js/hooks/use-modal.js b/modules/settings/assets/js/hooks/use-modal.js index 65c79c13..19aaaaf1 100644 --- a/modules/settings/assets/js/hooks/use-modal.js +++ b/modules/settings/assets/js/hooks/use-modal.js @@ -18,4 +18,3 @@ export const useModal = ( defaultIsOpen = true ) => { close, }; }; - diff --git a/modules/settings/assets/js/hooks/use-notifications.js b/modules/settings/assets/js/hooks/use-notifications.js new file mode 100644 index 00000000..0ea75585 --- /dev/null +++ b/modules/settings/assets/js/hooks/use-notifications.js @@ -0,0 +1,53 @@ +import { useState, createContext, useContext } from '@wordpress/element'; + +const NotificationsContext = createContext( undefined ); + +export function useNotificationSettings() { + return useContext( NotificationsContext ); +} + +export const NotificationsProvider = ( { children } ) => { + const [ showNotification, setShowNotification ] = useState( false ); + const [ notificationMessage, setNotificationMessage ] = useState( '' ); + const [ notificationType, setNotificationType ] = useState( '' ); + + return ( + + { children } + + ); +}; + +export const useToastNotification = () => { + const { + setNotificationMessage, + setNotificationType, + setShowNotification, + } = useContext( NotificationsContext ); + + const error = ( message ) => { + setNotificationMessage( message ); + setNotificationType( 'error' ); + setShowNotification( true ); + }; + + const success = ( message ) => { + setNotificationMessage( message ); + setNotificationType( 'success' ); + setShowNotification( true ); + }; + + return { + success, + error, + }; +}; diff --git a/modules/settings/assets/js/hooks/use-settings.js b/modules/settings/assets/js/hooks/use-settings.js new file mode 100644 index 00000000..69d5a774 --- /dev/null +++ b/modules/settings/assets/js/hooks/use-settings.js @@ -0,0 +1,24 @@ +import { useState, createContext, useContext } from '@wordpress/element'; + +/** + * Context Component. + */ +const SettingsContext = createContext( null ); + +export function useSettings() { + return useContext( SettingsContext ); +} + +export const SettingsProvider = ( { children } ) => { + const [ test, setTest ] = useState( 'Test' ); + return ( + + { children } + + ); +}; diff --git a/modules/settings/assets/js/hooks/use-storage.js b/modules/settings/assets/js/hooks/use-storage.js new file mode 100644 index 00000000..23775120 --- /dev/null +++ b/modules/settings/assets/js/hooks/use-storage.js @@ -0,0 +1,12 @@ +import { store as coreDataStore } from '@wordpress/core-data'; +import { dispatch } from '@wordpress/data'; + +export const useStorage = () => { + const save = async ( data ) => { + return await dispatch( coreDataStore ).saveEntityRecord( 'root', 'site', data ); + }; + + return { + save, + }; +}; diff --git a/modules/settings/classes/route-base.php b/modules/settings/classes/route-base.php new file mode 100644 index 00000000..907a3409 --- /dev/null +++ b/modules/settings/classes/route-base.php @@ -0,0 +1,39 @@ +get_path(); + } + + public function get_path(): string { + return $this->path; + } + + public function get_name(): string { + return ''; + } + + public function get_permission_callback( \WP_REST_Request $request ): bool { + $valid = $this->permission_callback( $request ); + + return $valid && user_can( $this->current_user_id, 'manage_options' ); + } +} diff --git a/modules/settings/classes/settings.php b/modules/settings/classes/settings.php new file mode 100644 index 00000000..1ef1d258 --- /dev/null +++ b/modules/settings/classes/settings.php @@ -0,0 +1,28 @@ + Connect::is_connected(), + ]; + } /** * Module constructor. */ public function __construct() { + $this->register_routes(); $this->register_components(); add_action( 'admin_menu', [ $this, 'register_page' ] ); add_action( 'in_admin_header', [ $this, 'render_top_bar' ] ); diff --git a/modules/settings/rest/get-settings.php b/modules/settings/rest/get-settings.php new file mode 100644 index 00000000..4cdd5815 --- /dev/null +++ b/modules/settings/rest/get-settings.php @@ -0,0 +1,50 @@ +verify_capability(); + + if ( $error ) { + return $error; + } + + $data = Settings::get_plugin_settings(); + + return $this->respond_success_json( $data ); + + } catch ( Throwable $t ) { + return $this->respond_error_json( [ + 'message' => $t->getMessage(), + 'code' => 'internal_server_error', + ] ); + } + } +} diff --git a/package.json b/package.json index e5a1f257..db245eec 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,8 @@ "@wordpress/date": "^5.10.0", "@wordpress/element": "^6.10.0", "@wordpress/i18n": "^5.10.0", - "@wordpress/url": "^4.10.0" + "@wordpress/url": "^4.10.0", + "husky": "^9.1.6", + "prop-types": "^15.8.1" } } From cf77dbeed3053222c7f4dc9fc8ed2f2aae6cb695 Mon Sep 17 00:00:00 2001 From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com> Date: Wed, 20 Nov 2024 14:41:10 +0530 Subject: [PATCH 007/292] [APP 707] general setting components (#113) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Initial refactor commit * ✅ Added build and tests CI/CD * update: add src for admin settings * update: incorrect constant names * update: namespace * add: accessibility settings * update: webpack to output files inside a folder * update: build output folders * update: removed commented code * update: npm scripts * add: webpack config * add: hooks * update: move admin setting to the module folder * update: assets loading logic * update: add rule to move jsx props to multiline imporving readability * add: connect modal * update: hooks import for better readability * update: replace functions with hooks * add: connect module * add: settings and get settings route * add: hooks and contexts to get settings * add: hooks * add: notification component * add: data api * add: settings provider and connect settings * add: husky * add: icon size control * fix: icon size control labels * add: icon select component * add: color picker component * add: accessibility icons * add: icon export * update: add icons to the component * fix: styling for the icon select control * update: color picker with react-colorful component * update: icon size component with live icon design * fix: styling of radio boxes * add: icon design settings layout * add: position settings layout * add: layout exports * add: alignment matrix and position control components * add: position settings & position settings for mobile layout * fix: formatting and text-domain * update: filter names * fix: hook import * add: set function for settings * add: prop-types package * update: refactor notification component and context * update: remove filter for authorize url * Update modules/settings/assets/js/components/color-picker/style.css Co-authored-by: Raz Ohad * update: color picker class name --------- Co-authored-by: Ohad Co-authored-by: Raz Ohad --- .../js/components/admin-top-bar/index.js | 12 +- .../alignment-matrix-control/index.js | 66 ++++++ .../js/components/color-picker/index.js | 51 +++++ .../js/components/color-picker/style.css | 29 +++ .../connect-modal/connect-modal-icon.js | 197 +++++++++++++++--- .../assets/js/components/icon-select/index.js | 70 +++++++ .../assets/js/components/icon-size/index.js | 69 ++++++ .../settings/assets/js/components/index.js | 5 + .../js/components/position-control/index.js | 128 ++++++++++++ .../js/contexts/plugin-settings-context.js | 40 ++++ modules/settings/assets/js/hooks/use-auth.js | 1 - .../assets/js/icons/accessibility-controls.js | 25 +++ .../assets/js/icons/accessibility-eye.js | 34 +++ .../assets/js/icons/accessibility-person.js | 25 +++ .../assets/js/icons/accessibility-text.js | 36 ++++ .../assets/js/icons/elementor-logo.js | 3 +- modules/settings/assets/js/icons/index.js | 5 + .../assets/js/layouts/icon-design-settings.js | 33 +++ modules/settings/assets/js/layouts/index.js | 3 + .../js/layouts/position-settings-desktop.js | 39 ++++ .../assets/js/layouts/position-settings.js | 70 +++++++ package.json | 1 + 22 files changed, 905 insertions(+), 37 deletions(-) create mode 100644 modules/settings/assets/js/components/alignment-matrix-control/index.js create mode 100644 modules/settings/assets/js/components/color-picker/index.js create mode 100644 modules/settings/assets/js/components/color-picker/style.css create mode 100644 modules/settings/assets/js/components/icon-select/index.js create mode 100644 modules/settings/assets/js/components/icon-size/index.js create mode 100644 modules/settings/assets/js/components/position-control/index.js create mode 100644 modules/settings/assets/js/contexts/plugin-settings-context.js create mode 100644 modules/settings/assets/js/icons/accessibility-controls.js create mode 100644 modules/settings/assets/js/icons/accessibility-eye.js create mode 100644 modules/settings/assets/js/icons/accessibility-person.js create mode 100644 modules/settings/assets/js/icons/accessibility-text.js create mode 100644 modules/settings/assets/js/icons/index.js create mode 100644 modules/settings/assets/js/layouts/icon-design-settings.js create mode 100644 modules/settings/assets/js/layouts/index.js create mode 100644 modules/settings/assets/js/layouts/position-settings-desktop.js create mode 100644 modules/settings/assets/js/layouts/position-settings.js diff --git a/modules/settings/assets/js/components/admin-top-bar/index.js b/modules/settings/assets/js/components/admin-top-bar/index.js index b789079b..6df38d63 100644 --- a/modules/settings/assets/js/components/admin-top-bar/index.js +++ b/modules/settings/assets/js/components/admin-top-bar/index.js @@ -10,9 +10,15 @@ import ElementorLogo from '../../icons/elementor-logo'; const AdminTopBar = () => { return ( - - - + + + { __( 'Accessibility', 'pojo-accessibility' ) } diff --git a/modules/settings/assets/js/components/alignment-matrix-control/index.js b/modules/settings/assets/js/components/alignment-matrix-control/index.js new file mode 100644 index 00000000..0040c618 --- /dev/null +++ b/modules/settings/assets/js/components/alignment-matrix-control/index.js @@ -0,0 +1,66 @@ +import Box from '@elementor/ui/Box'; +import FormControl from '@elementor/ui/FormControl'; +import FormControlLabel from '@elementor/ui/FormControlLabel'; +import FormLabel from '@elementor/ui/FormLabel'; +import Radio from '@elementor/ui/Radio'; +import RadioGroup from '@elementor/ui/RadioGroup'; +import Typography from '@elementor/ui/Typography'; +import { useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +const AlignmentMatrixControl = () => { + const [ selectedValue, setSelectedValue ] = useState( 'center-right' ); + + const handleChange = ( event ) => { + setSelectedValue( event.target.value ); + }; + + const options = [ + { value: 'top-left', label: __( 'Top Left', 'pojo-accessibility' ) }, + { value: 'top-right', label: __( 'Top Right', 'pojo-accessibility' ) }, + { value: 'center-left', label: __( 'Center Left', 'pojo-accessibility' ) }, + { value: 'center-right', label: __( 'Center Right', 'pojo-accessibility' ) }, + { value: 'bottom-left', label: __( 'Bottom Left', 'pojo-accessibility' ) }, + { value: 'bottom-right', label: __( 'Bottom Right', 'pojo-accessibility' ) }, + ]; + + return ( + + + + { __( 'Default Position', 'pojo-accessibility' ) } + + + + + { options.map( ( option, i ) => } /> ) } + + + + ); +}; + +export default AlignmentMatrixControl; diff --git a/modules/settings/assets/js/components/color-picker/index.js b/modules/settings/assets/js/components/color-picker/index.js new file mode 100644 index 00000000..5e3222cf --- /dev/null +++ b/modules/settings/assets/js/components/color-picker/index.js @@ -0,0 +1,51 @@ +import Box from '@elementor/ui/Box'; +import FormControl from '@elementor/ui/FormControl'; +import FormLabel from '@elementor/ui/FormLabel'; +import Grid from '@elementor/ui/Grid'; +import Typography from '@elementor/ui/Typography'; +import { HexColorPicker, HexColorInput } from 'react-colorful'; +import { useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import './style.css'; + +const ColorPicker = () => { + const [ color, setColor ] = useState( '#2563eb' ); + + return ( + + + + { __( 'Color', 'pojo-accessibility' ) } + + + + + + + + + + + ); +}; + +export default ColorPicker; diff --git a/modules/settings/assets/js/components/color-picker/style.css b/modules/settings/assets/js/components/color-picker/style.css new file mode 100644 index 00000000..3025ab64 --- /dev/null +++ b/modules/settings/assets/js/components/color-picker/style.css @@ -0,0 +1,29 @@ +.widget-settings-color-picker.react-colorful { + min-width: 460px; + } +.widget-settings-color-picker .react-colorful__saturation { +border-radius: 0; +border-bottom: none; +} + +.widget-settings-color-picker .react-colorful__hue { +order: 0; +} + +.widget-settings-color-picker .react-colorful__hue, +.widget-settings-color-picker .react-colorful__alpha { +height: 14px; +border-radius: 100px; +margin-top: 10px; +} + +.widget-settings-color-picker .react-colorful__pointer { +width: 18px; +height: 18px; +} + +.widget-settings-color-picker .react-colorful__hue-pointer, +.widget-settings-color-picker .react-colorful__alpha-pointer { +width: 18px; +height: 18px; +} diff --git a/modules/settings/assets/js/components/connect-modal/connect-modal-icon.js b/modules/settings/assets/js/components/connect-modal/connect-modal-icon.js index 98915a2a..ef488b89 100644 --- a/modules/settings/assets/js/components/connect-modal/connect-modal-icon.js +++ b/modules/settings/assets/js/components/connect-modal/connect-modal-icon.js @@ -10,56 +10,189 @@ const ConnectModalIcon = () => { > - + - + - - - - - + + + + + - - - + + + - - - - + + + + - - + + - - - - - - - - - - - + + + + + + + + + + + - + - + - + - + - + ); diff --git a/modules/settings/assets/js/components/icon-select/index.js b/modules/settings/assets/js/components/icon-select/index.js new file mode 100644 index 00000000..e5d1efd2 --- /dev/null +++ b/modules/settings/assets/js/components/icon-select/index.js @@ -0,0 +1,70 @@ +import FormControl from '@elementor/ui/FormControl'; +import FormLabel from '@elementor/ui/FormLabel'; +import Paper from '@elementor/ui/Paper'; +import Radio from '@elementor/ui/Radio'; +import RadioGroup from '@elementor/ui/RadioGroup'; +import Typography from '@elementor/ui/Typography'; +import { useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import { AccessibilityControlsIcon, AccessibilityEyeIcon, AccessibilityPersonIcon, AccessibilityTextIcon } from '../../icons'; + +const IconSelect = ( props ) => { + const [ selectedValue, setSelectedValue ] = useState( 'person' ); + const optionStyle = { color: 'info.main', fontSize: 44 }; + + const options = [ + { value: 'person', icon: , label: __( 'Accessibility Person Icon', 'pojo-accessibility' ) }, + { value: 'eye', icon: , label: __( 'Accessibility Eye Icon', 'pojo-accessibility' ) }, + { value: 'text', icon: , label: __( 'Accessibility Text Badge Icon', 'pojo-accessibility' ) }, + { value: 'controls', icon: , label: __( 'Accessibility Controls Slider Icon', 'pojo-accessibility' ) }, + ]; + + return ( + + + + { __( 'Icon', 'pojo-accessibility' ) } + + + + { options.map( ( option ) => ( + setSelectedValue( option.value ) } + sx={ { + borderRadius: 'md', + boxShadow: 'sm', + display: 'flex', + flexDirection: 'column', + flexGrow: 1, + alignItems: 'center', + justifyContent: 'center', + gap: 1.5, + p: 2, + minWidth: 100, + minHeight: 100, + borderColor: selectedValue === option.value ? 'info.main' : 'divider', + borderWidth: selectedValue === option.value ? 2 : 1, + cursor: 'pointer', + } } + >{ option.icon } + + + ) ) } + + + ); +}; + +export default IconSelect; diff --git a/modules/settings/assets/js/components/icon-size/index.js b/modules/settings/assets/js/components/icon-size/index.js new file mode 100644 index 00000000..f8114d59 --- /dev/null +++ b/modules/settings/assets/js/components/icon-size/index.js @@ -0,0 +1,69 @@ +import FormControl from '@elementor/ui/FormControl'; +import FormLabel from '@elementor/ui/FormLabel'; +import Paper from '@elementor/ui/Paper'; +import Radio from '@elementor/ui/Radio'; +import RadioGroup from '@elementor/ui/RadioGroup'; +import Typography from '@elementor/ui/Typography'; +import { useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import { AccessibilityEyeIcon, AccessibilityPersonIcon, AccessibilityTextIcon } from '../../icons'; + +const IconSize = ( props ) => { + const [ selectedValue, setSelectedValue ] = useState( 'medium' ); + const optionStyle = { color: 'info.main', fontSize: 44 }; + + const options = [ + { value: 'small', icon: , label: __( 'Accessibility Person Icon', 'pojo-accessibility' ) }, + { value: 'medium', icon: , label: __( 'Accessibility Eye Icon', 'pojo-accessibility' ) }, + { value: 'large', icon: , label: __( 'Accessibility Text Badge Icon', 'pojo-accessibility' ) }, + ]; + + return ( + + + + { __( 'Size', 'pojo-accessibility' ) } + + + + { options.map( ( option ) => ( + setSelectedValue( option.value ) } + sx={ { + borderRadius: 'md', + boxShadow: 'sm', + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'center', + flexGrow: 1, + gap: 1.5, + p: 2, + minWidth: 100, + minHeight: 100, + borderColor: selectedValue === option.value ? 'info.main' : 'divider', + borderWidth: selectedValue === option.value ? 2 : 1, + cursor: 'pointer', + } } + >{ option.icon } + + + ) ) } + + + ); +}; + +export default IconSize; diff --git a/modules/settings/assets/js/components/index.js b/modules/settings/assets/js/components/index.js index ef0c0495..b85ca7c8 100644 --- a/modules/settings/assets/js/components/index.js +++ b/modules/settings/assets/js/components/index.js @@ -1,2 +1,7 @@ export { default as ConnectModal } from './connect-modal'; export { default as Notifications } from './notifications'; +export { default as IconSize } from './icon-size'; +export { default as IconSelect } from './icon-select'; +export { default as ColorPicker } from './color-picker'; +export { default as AlignmentMatrixControl } from './alignment-matrix-control'; +export { default as PositionControl } from './position-control'; diff --git a/modules/settings/assets/js/components/position-control/index.js b/modules/settings/assets/js/components/position-control/index.js new file mode 100644 index 00000000..88c2372d --- /dev/null +++ b/modules/settings/assets/js/components/position-control/index.js @@ -0,0 +1,128 @@ +import Box from '@elementor/ui/Box'; +import Button from '@elementor/ui/Button'; +import InputAdornment from '@elementor/ui/InputAdornment'; +import Menu from '@elementor/ui/Menu'; +import MenuItem from '@elementor/ui/MenuItem'; +import Select from '@elementor/ui/Select'; +import TextField from '@elementor/ui/TextField'; +import { styled } from '@elementor/ui/styles'; +import { usePopupState, bindTrigger, bindMenu } from '@elementor/ui/usePopupState'; +import { useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +const units = [ 'PX', 'REM', 'EM' ]; + +const horizontalOptions = [ + { value: 'to-left', label: __( 'To the left', 'pojo-accessibility' ) }, + { value: 'to-right', label: __( 'To the right', 'pojo-accessibility' ) }, +]; + +const verticalOptions = [ + { value: 'higher', label: __( 'Higher', 'pojo-accessibility' ) }, + { value: 'lower', label: __( 'Lower', 'pojo-accessibility' ) }, +]; + +// Customization for the WP admin global CSS. +const StyledTextField = styled( TextField )( () => ( { + width: '200px', + '.wp-admin & .MuiInputBase-input, & .MuiInputBase-input:focus': { + backgroundColor: 'initial', + boxShadow: 'none', + border: 0, + color: 'inherit', + outline: 0, + padding: '16.5px 14px 16.5px 14px', + '&.MuiInputBase-inputSizeSmall': { + padding: '8.5px 14px 8.5px 14px', + }, + height: '56px', + }, +} ) ); + +const PositionControl = ( { type, disabled }, props ) => { + const [ unitsIndex, setUnitsIndex ] = useState( 0 ); + const popupState = usePopupState( { + variant: 'popover', + popupId: 'textfield-inner-selection', + } ); + + const handleMenuItemClick = ( index ) => { + setUnitsIndex( index ); + popupState.close(); + }; + + const [ position, setPosition ] = useState( 10 ); + const handlePositionChange = ( event ) => setPosition( event.target.value ); + + return ( + + + + + + { units.map( ( unit, index ) => ( + handleMenuItemClick( index ) }> + { unit } + + ) ) } + + + ), + } } + /> + + + ); +}; + +export default PositionControl; diff --git a/modules/settings/assets/js/contexts/plugin-settings-context.js b/modules/settings/assets/js/contexts/plugin-settings-context.js new file mode 100644 index 00000000..54d028f9 --- /dev/null +++ b/modules/settings/assets/js/contexts/plugin-settings-context.js @@ -0,0 +1,40 @@ +import { createContext, useCallback, useContext, useEffect, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import API from '../api'; +import { useToastNotification } from '../hooks'; + +const PluginSettingsContext = createContext( {} ); + +export const PluginSettingsProvider = ( { children } ) => { + const { error } = useToastNotification(); + const [ pluginSettings, setPluginSettings ] = useState(); + const [ loaded, setLoaded ] = useState( false ); + + const refreshPluginSettings = useCallback( () => { + API.getPluginSettings().then( ( settings ) => { + if ( 'isConnected' in settings ) { + settings.isConnected = Boolean( settings.isConnected ); + } + + setPluginSettings( settings ); + setLoaded( true ); + } ).catch( () => { + error( __( 'An error occurred.', 'pojo-accessibility' ) ); + setLoaded( true ); + } ); + }, [] ); + + useEffect( () => { + refreshPluginSettings(); + }, [ refreshPluginSettings ] ); + + return ( + + { children } + + ); +}; + +export const usePluginSettingsContext = () => { + return useContext( PluginSettingsContext ); +}; diff --git a/modules/settings/assets/js/hooks/use-auth.js b/modules/settings/assets/js/hooks/use-auth.js index 65c0fc55..791ec33c 100644 --- a/modules/settings/assets/js/hooks/use-auth.js +++ b/modules/settings/assets/js/hooks/use-auth.js @@ -1,6 +1,5 @@ import API from '../api'; import { UPGRADE_LINK } from '../constants'; -import { usePluginSettingsContext } from '../contexts/plugin-settings'; export const useAuth = () => { const { subscriptionId } = 123; diff --git a/modules/settings/assets/js/icons/accessibility-controls.js b/modules/settings/assets/js/icons/accessibility-controls.js new file mode 100644 index 00000000..7299b452 --- /dev/null +++ b/modules/settings/assets/js/icons/accessibility-controls.js @@ -0,0 +1,25 @@ +import SvgIcon from '@elementor/ui/SvgIcon'; + +function AccessibilityControlsIcon( props ) { + return ( + + + + + + ); +} + +export default AccessibilityControlsIcon; diff --git a/modules/settings/assets/js/icons/accessibility-eye.js b/modules/settings/assets/js/icons/accessibility-eye.js new file mode 100644 index 00000000..58a66d94 --- /dev/null +++ b/modules/settings/assets/js/icons/accessibility-eye.js @@ -0,0 +1,34 @@ +import SvgIcon from '@elementor/ui/SvgIcon'; + +function AccessibilityEyeIcon( props ) { + return ( + + + + + + + + + + + + ); +} + +export default AccessibilityEyeIcon; diff --git a/modules/settings/assets/js/icons/accessibility-person.js b/modules/settings/assets/js/icons/accessibility-person.js new file mode 100644 index 00000000..2aec5ccd --- /dev/null +++ b/modules/settings/assets/js/icons/accessibility-person.js @@ -0,0 +1,25 @@ +import SvgIcon from '@elementor/ui/SvgIcon'; + +function AccessibilityPersonIcon( props ) { + return ( + + + + + + ); +} + +export default AccessibilityPersonIcon; diff --git a/modules/settings/assets/js/icons/accessibility-text.js b/modules/settings/assets/js/icons/accessibility-text.js new file mode 100644 index 00000000..40c869d8 --- /dev/null +++ b/modules/settings/assets/js/icons/accessibility-text.js @@ -0,0 +1,36 @@ +import SvgIcon from '@elementor/ui/SvgIcon'; + +function AccessibilityTextIcon( props ) { + return ( + + + + + + + ); +} + +export default AccessibilityTextIcon; diff --git a/modules/settings/assets/js/icons/elementor-logo.js b/modules/settings/assets/js/icons/elementor-logo.js index cc62ff43..a9a65218 100644 --- a/modules/settings/assets/js/icons/elementor-logo.js +++ b/modules/settings/assets/js/icons/elementor-logo.js @@ -4,7 +4,8 @@ const ElementorLogo = ( { size } ) => { return ( - diff --git a/modules/settings/assets/js/icons/index.js b/modules/settings/assets/js/icons/index.js new file mode 100644 index 00000000..fead74c0 --- /dev/null +++ b/modules/settings/assets/js/icons/index.js @@ -0,0 +1,5 @@ +export { default as ElementorLogo } from './elementor-logo'; +export { default as AccessibilityPersonIcon } from './accessibility-person'; +export { default as AccessibilityEyeIcon } from './accessibility-eye'; +export { default as AccessibilityTextIcon } from './accessibility-text'; +export { default as AccessibilityControlsIcon } from './accessibility-controls'; diff --git a/modules/settings/assets/js/layouts/icon-design-settings.js b/modules/settings/assets/js/layouts/icon-design-settings.js new file mode 100644 index 00000000..d0be5427 --- /dev/null +++ b/modules/settings/assets/js/layouts/icon-design-settings.js @@ -0,0 +1,33 @@ +import Box from '@elementor/ui/Box'; +import Grid from '@elementor/ui/Grid'; +import Typography from '@elementor/ui/Typography'; +import { __ } from '@wordpress/i18n'; +import { ColorPicker, IconSelect, IconSize } from '../components'; + +const IconDesignSettings = () => { + return ( + + + { __( 'Design', 'pojo-accessibility' ) } + { __( 'Customize the design of the button that visitors use to open the widget.', 'pojo-accessibility' ) } + + + + + + + + + + + + ); +}; + +export default IconDesignSettings; diff --git a/modules/settings/assets/js/layouts/index.js b/modules/settings/assets/js/layouts/index.js new file mode 100644 index 00000000..94895503 --- /dev/null +++ b/modules/settings/assets/js/layouts/index.js @@ -0,0 +1,3 @@ +export { default as IconDesignSettings } from './icon-design-settings'; +export { default as PositionSettings } from './position-settings'; +export { default as PositionSettingsDesktop } from './position-settings-desktop'; diff --git a/modules/settings/assets/js/layouts/position-settings-desktop.js b/modules/settings/assets/js/layouts/position-settings-desktop.js new file mode 100644 index 00000000..ab129bae --- /dev/null +++ b/modules/settings/assets/js/layouts/position-settings-desktop.js @@ -0,0 +1,39 @@ +import Box from '@elementor/ui/Box'; +import FormControlLabel from '@elementor/ui/FormControlLabel'; +import Switch from '@elementor/ui/Switch'; +import Typography from '@elementor/ui/Typography'; +import { useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import { AlignmentMatrixControl, PositionControl } from '../components'; + +const PositionSettingsDesktop = () => { + const [ hiddenOnDesktop, setHiddenOnDesktop ] = useState( false ); + const [ disableExactPosition, setDisableExactPosition ] = useState( true ); + return ( + <> + { __( 'Hide on desktop', 'pojo-accessibility' ) } } + labelPlacement="start" + control={ } + sx={ { marginLeft: 0, marginBottom: 3 } } + onChange={ () => setHiddenOnDesktop( ! hiddenOnDesktop ) } /> + { ! hiddenOnDesktop && + + + + { __( 'Exact position', 'pojo-accessibility' ) } } + labelPlacement="start" + control={ } + sx={ { marginLeft: 0 } } + onChange={ () => setDisableExactPosition( ! disableExactPosition ) } /> + + + + + } + + ); +}; + +export default PositionSettingsDesktop; diff --git a/modules/settings/assets/js/layouts/position-settings.js b/modules/settings/assets/js/layouts/position-settings.js new file mode 100644 index 00000000..8574cbe1 --- /dev/null +++ b/modules/settings/assets/js/layouts/position-settings.js @@ -0,0 +1,70 @@ +import { DesktopIcon, MobileIcon } from '@elementor/icons'; +import Box from '@elementor/ui/Box'; +import Grid from '@elementor/ui/Grid'; +import Tab from '@elementor/ui/Tab'; +import TabPanel from '@elementor/ui/TabPanel'; +import Tabs from '@elementor/ui/Tabs'; +import Typography from '@elementor/ui/Typography'; +import useTabs from '@elementor/ui/useTabs'; +import { useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import { PositionSettingsDesktop } from '../layouts'; + +const TABS = { + one: 'one', + two: 'two', +}; + +const PositionSettings = () => { + const [ currentTab, setCurrentTab ] = useState( TABS.one ); + const { getTabProps } = useTabs( currentTab ); + + const changeTab = ( tab ) => () => { + setCurrentTab( tab ); + }; + + return ( + + + { __( 'Position', 'pojo-accessibility' ) } + { __( 'Set where the widget appears on your site. This applies to all pages.', 'pojo-accessibility' ) } + + + + } + iconPosition="start" + onClick={ changeTab( TABS.one ) } + /> + } + iconPosition="start" + onClick={ changeTab( TABS.two ) } + /> + + + + { currentTab === TABS.one ? ( + + + + ) : ( + + + ) } + + ); +}; + +export default PositionSettings; diff --git a/package.json b/package.json index db245eec..5d8b204e 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "@wordpress/i18n": "^5.10.0", "@wordpress/url": "^4.10.0", "husky": "^9.1.6", + "react-colorful": "^5.6.1", "prop-types": "^15.8.1" } } From 0c63bac47bcdf71ec77ba5669ae45bf071bd7c7b Mon Sep 17 00:00:00 2001 From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com> Date: Wed, 27 Nov 2024 15:01:52 +0530 Subject: [PATCH 008/292] [App 780] Navigation Sidebar (#115) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Initial refactor commit * ✅ Added build and tests CI/CD * update: add src for admin settings * update: incorrect constant names * update: namespace * add: accessibility settings * update: webpack to output files inside a folder * update: build output folders * update: removed commented code * update: npm scripts * add: webpack config * add: hooks * update: move admin setting to the module folder * update: assets loading logic * update: add rule to move jsx props to multiline imporving readability * add: connect modal * update: hooks import for better readability * update: replace functions with hooks * add: connect module * add: settings and get settings route * add: hooks and contexts to get settings * add: hooks * add: notification component * add: data api * add: settings provider and connect settings * add: husky * fix: formatting and text-domain * update: filter names * fix: hook import * add: set function for settings * add: prop-types package * update: refactor notification component and context * update: remove filter for authorize url * update: imports and exports of hooks * update: plugin settings context filename and relevant imports * update: icons and icon imports * add: sidebar(wip) * update: fix width of connect screen on mobile * update: sidebar layout * add: credit card and user arrow icons * update: hidden wpfooter and fixed sidebar height * update: sidebar layout * add: basic page layouts * update: sidebar layout * add: sidebar menu, sidebar app bar and my account menu components * update: add sidebar and menu settings * update: add page layouts * update: admin top bar * add: bottom bar * add: bottom bar and top bar * add: bottom bar and top bar * update: page content styling * fix: styling * fix: styling * update: text domain * update: added translations * fix: admin top bar layout * update: exports of icons * update: exports of components * add: aliases for imports and fix exports * fix: height and styling of the layout * fix: unhide wp footer * update: keep widget menu open on page load (default) * update: linter rules to move first prop to new line * update: linter rules to move first prop to new line --------- Co-authored-by: Ohad --- .eslintrc | 16 ++- modules/settings/assets/css/style.css | 15 +-- modules/settings/assets/js/admin.js | 12 +- modules/settings/assets/js/app.js | 29 ++++- .../js/components/admin-top-bar/index.js | 34 ++---- .../alignment-matrix-control/index.js | 6 +- .../assets/js/components/bottom-bar/index.js | 18 +++ .../js/components/color-picker/index.js | 9 +- .../connect-modal/connect-modal-icon.js | 96 ++++++++++----- .../js/components/connect-modal/index.js | 11 +- .../assets/js/components/icon-select/index.js | 28 +++-- .../assets/js/components/icon-size/index.js | 2 +- .../settings/assets/js/components/index.js | 6 + .../js/components/my-account-menu/index.js | 77 ++++++++++++ .../js/components/notifications/index.js | 5 +- .../js/components/position-control/index.js | 3 +- .../js/components/sidebar-app-bar/index.js | 35 ++++++ .../js/components/sidebar-menu/index.js | 70 +++++++++++ .../assets/js/components/sidebar-menu/menu.js | 30 +++++ .../settings/assets/js/hooks/use-settings.js | 9 +- .../assets/js/icons/accessibility-controls.js | 6 +- .../assets/js/icons/accessibility-eye.js | 9 +- .../assets/js/icons/accessibility-person.js | 6 +- .../assets/js/icons/accessibility-text.js | 9 +- .../settings/assets/js/icons/credit-card.js | 18 +++ .../assets/js/icons/elementor-logo.js | 3 +- modules/settings/assets/js/icons/index.js | 4 + .../js/icons/square-rounded-chevrons-left.js | 18 +++ .../settings/assets/js/icons/user-arrow.js | 23 ++++ modules/settings/assets/js/icons/widget.js | 35 ++++++ .../assets/js/layouts/icon-design-settings.js | 11 +- .../js/layouts/position-settings-desktop.js | 11 +- .../assets/js/layouts/position-settings.js | 5 +- modules/settings/assets/js/layouts/sidebar.js | 32 +++++ .../js/pages/accessibility-statement.js | 5 + .../settings/assets/js/pages/icon-settings.js | 5 + modules/settings/assets/js/pages/index.js | 3 + modules/settings/assets/js/pages/menu.js | 5 + package-lock.json | 111 +++++++++++++++++- package.json | 5 +- webpack.config.js | 10 ++ 41 files changed, 720 insertions(+), 125 deletions(-) create mode 100644 modules/settings/assets/js/components/bottom-bar/index.js create mode 100644 modules/settings/assets/js/components/my-account-menu/index.js create mode 100644 modules/settings/assets/js/components/sidebar-app-bar/index.js create mode 100644 modules/settings/assets/js/components/sidebar-menu/index.js create mode 100644 modules/settings/assets/js/components/sidebar-menu/menu.js create mode 100644 modules/settings/assets/js/icons/credit-card.js create mode 100644 modules/settings/assets/js/icons/square-rounded-chevrons-left.js create mode 100644 modules/settings/assets/js/icons/user-arrow.js create mode 100644 modules/settings/assets/js/icons/widget.js create mode 100644 modules/settings/assets/js/layouts/sidebar.js create mode 100644 modules/settings/assets/js/pages/accessibility-statement.js create mode 100644 modules/settings/assets/js/pages/icon-settings.js create mode 100644 modules/settings/assets/js/pages/index.js create mode 100644 modules/settings/assets/js/pages/menu.js diff --git a/.eslintrc b/.eslintrc index 0ad9518b..e17cfe0b 100644 --- a/.eslintrc +++ b/.eslintrc @@ -9,6 +9,16 @@ "babel", "react" ], + "settings": { + "import/resolver": { + "node": { + "paths": ["node_modules"] + }, + "webpack": { + "config": "webpack.config.js" + } + } + }, "env": { "browser": true, "node": true, @@ -27,6 +37,7 @@ "no-console": "off", "react-hooks/exhaustive-deps": "off", "react/jsx-max-props-per-line": [1, { "maximum": { "single": 2, "multi": 1 } }], + "react/jsx-first-prop-new-line": ["error", "multiline"], "strict": [ "error", "global" ], "curly": "warn", "import/order": [ @@ -47,7 +58,10 @@ "caseInsensitive": false } } - ] + ], + "import/newline-after-import": ["error", { + "count": 1 + }] }, "parser": "@babel/eslint-parser" } diff --git a/modules/settings/assets/css/style.css b/modules/settings/assets/css/style.css index 72965c8e..8fa3d9b6 100644 --- a/modules/settings/assets/css/style.css +++ b/modules/settings/assets/css/style.css @@ -1,6 +1,7 @@ body { background: #fff; } + .wrap { margin-top: 0; } @@ -8,21 +9,13 @@ body { html:not([dir='rtl']) #ea11y-app { margin-left: -20px; background: white; + height: calc(100vh - 32px); } html[dir='rtl'] #ea11y-app { margin-right: -20px; background: white; -} - -html:not([dir='rtl']) #ea11y-app-top-bar { - margin-left: -20px; - margin-bottom: 20px; -} - -html[dir='rtl'] #ea11y-app-top-bar { - margin-right: -20px; - margin-bottom: 20px; + height: calc(100vh - 32px); } #ea11y-app * { @@ -34,4 +27,4 @@ html[dir='rtl'] #ea11y-app-top-bar { padding: 8px 12px; box-shadow: none; border-color: rgba(12, 13, 14, 0.23); -} \ No newline at end of file +} diff --git a/modules/settings/assets/js/admin.js b/modules/settings/assets/js/admin.js index a40129e3..c3b25101 100644 --- a/modules/settings/assets/js/admin.js +++ b/modules/settings/assets/js/admin.js @@ -1,25 +1,15 @@ -import { ThemeProvider } from '@elementor/ui/styles'; +import { SettingsProvider, NotificationsProvider } from '@ea11y/hooks'; import { StrictMode, Fragment, createRoot } from '@wordpress/element'; import App from './app'; -import AdminTopBar from './components/admin-top-bar'; import { PluginSettingsProvider } from './contexts/plugin-settings'; -import { SettingsProvider, NotificationsProvider } from './hooks'; const rootNode = document.getElementById( 'ea11y-app' ); -const topBarNode = document.getElementById( 'ea11y-app-top-bar' ); // Can't use the settings hook in the global scope so accessing directly const isDevelopment = window?.ea11ySettingsData?.isDevelopment; const AppWrapper = Boolean( isDevelopment ) ? StrictMode : Fragment; const root = createRoot( rootNode ); -const topBar = createRoot( topBarNode ); - -topBar.render( - - - , -); root.render( diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js index 83ba765d..1a10f881 100644 --- a/modules/settings/assets/js/app.js +++ b/modules/settings/assets/js/app.js @@ -1,9 +1,12 @@ import '../css/style.css'; +import Box from '@elementor/ui/Box'; import DirectionProvider from '@elementor/ui/DirectionProvider'; +import Grid from '@elementor/ui/Grid'; import { ThemeProvider } from '@elementor/ui/styles'; -import { ConnectModal, Notifications } from './components'; +import { ConnectModal, Notifications, MenuItems, AdminTopBar, BottomBar } from '@ea11y/components'; +import { useNotificationSettings, useSettings } from '@ea11y/hooks'; import { usePluginSettingsContext } from './contexts/plugin-settings'; -import { useNotificationSettings } from './hooks'; +import { Sidebar } from './layouts/sidebar'; const App = () => { const { isConnected } = usePluginSettingsContext(); @@ -11,11 +14,33 @@ const App = () => { notificationMessage, notificationType, } = useNotificationSettings(); + const { selectedMenu } = useSettings(); + // Accessing the selected menu item + const selectedParent = MenuItems[ selectedMenu.parent ]; + const selectedChild = selectedMenu.child ? selectedParent.children[ selectedMenu.child ] : null; return ( { ! isConnected && } + + + + + + { selectedChild ? selectedChild.page : selectedParent?.page } + + + + diff --git a/modules/settings/assets/js/components/admin-top-bar/index.js b/modules/settings/assets/js/components/admin-top-bar/index.js index 6df38d63..ec97e36f 100644 --- a/modules/settings/assets/js/components/admin-top-bar/index.js +++ b/modules/settings/assets/js/components/admin-top-bar/index.js @@ -1,31 +1,25 @@ import HelpIcon from '@elementor/icons/HelpIcon'; import AppBar from '@elementor/ui/AppBar'; -import Grid from '@elementor/ui/Grid'; import Link from '@elementor/ui/Link'; import Toolbar from '@elementor/ui/Toolbar'; -import Typography from '@elementor/ui/Typography'; import { __ } from '@wordpress/i18n'; import { HELP_LINK } from '../../constants'; -import ElementorLogo from '../../icons/elementor-logo'; -const AdminTopBar = () => { +export const AdminTopBar = () => { + const toolBarStyle = { + justifyContent: 'end', + alignItems: 'center', + backgroundColor: 'background.default', + gap: '10px', + borderBottom: '1px solid rgba(0, 0, 0, 0.12)' }; return ( - - + - - - - { __( 'Accessibility', 'pojo-accessibility' ) } - - - - { ); }; - -export default AdminTopBar; diff --git a/modules/settings/assets/js/components/alignment-matrix-control/index.js b/modules/settings/assets/js/components/alignment-matrix-control/index.js index 0040c618..9153498d 100644 --- a/modules/settings/assets/js/components/alignment-matrix-control/index.js +++ b/modules/settings/assets/js/components/alignment-matrix-control/index.js @@ -31,7 +31,8 @@ const AlignmentMatrixControl = () => { { __( 'Default Position', 'pojo-accessibility' ) } - { width: '100px', } } > - { options.map( ( option, i ) => } /> ) } diff --git a/modules/settings/assets/js/components/bottom-bar/index.js b/modules/settings/assets/js/components/bottom-bar/index.js new file mode 100644 index 00000000..5ecc9ec6 --- /dev/null +++ b/modules/settings/assets/js/components/bottom-bar/index.js @@ -0,0 +1,18 @@ +import Box from '@elementor/ui/Box'; +import Button from '@elementor/ui/Button'; +import { __ } from '@wordpress/i18n'; + +export const BottomBar = () => { + return ( + + + + ); +}; diff --git a/modules/settings/assets/js/components/color-picker/index.js b/modules/settings/assets/js/components/color-picker/index.js index 5e3222cf..a3cf6cab 100644 --- a/modules/settings/assets/js/components/color-picker/index.js +++ b/modules/settings/assets/js/components/color-picker/index.js @@ -18,7 +18,8 @@ const ColorPicker = () => { { __( 'Color', 'pojo-accessibility' ) } - { className="widget-settings-color-picker" /> - - { > - { - - - - - - - - - - - - - { strokeLinejoin="round" /> - - - - - - - - - - - - - - - - - - diff --git a/modules/settings/assets/js/components/connect-modal/index.js b/modules/settings/assets/js/components/connect-modal/index.js index 8ea7f9c3..51ea0df4 100644 --- a/modules/settings/assets/js/components/connect-modal/index.js +++ b/modules/settings/assets/js/components/connect-modal/index.js @@ -3,8 +3,8 @@ import Button from '@elementor/ui/Button'; import Grid from '@elementor/ui/Grid'; import Modal from '@elementor/ui/Modal'; import Typography from '@elementor/ui/Typography'; +import { useAuth, useModal } from '@ea11y/hooks'; import { __ } from '@wordpress/i18n'; -import { useAuth, useModal } from '../../hooks'; function ConnectModal() { const { isOpen } = useModal(); @@ -12,7 +12,8 @@ function ConnectModal() { return ( - - { __( 'Connect plugin on your site!', 'pojo-accessibility' ) } - ); diff --git a/modules/settings/assets/js/components/color-picker/index.js b/modules/settings/assets/js/components/color-picker/index.js index a3cf6cab..beecd7a0 100644 --- a/modules/settings/assets/js/components/color-picker/index.js +++ b/modules/settings/assets/js/components/color-picker/index.js @@ -9,42 +9,39 @@ import { __ } from '@wordpress/i18n'; import './style.css'; const ColorPicker = () => { - const [ color, setColor ] = useState( '#2563eb' ); + const [color, setColor] = useState('#2563eb'); return ( - - { __( 'Color', 'pojo-accessibility' ) } + + {__('Color', 'pojo-accessibility')} - + - + + padding={2} + sx={{ backgroundColor: color }} + borderRadius={1} + marginRight={1} + > + }} + /> diff --git a/modules/settings/assets/js/components/connect-modal/connect-modal-icon.js b/modules/settings/assets/js/components/connect-modal/connect-modal-icon.js index 8bc13676..ce023c72 100644 --- a/modules/settings/assets/js/components/connect-modal/connect-modal-icon.js +++ b/modules/settings/assets/js/components/connect-modal/connect-modal-icon.js @@ -4,201 +4,265 @@ const ConnectModalIcon = () => { return ( - + - - - + strokeLinejoin="round" + /> + + + - - + fill="url(#pattern0_4586_17927)" + /> + + + strokeMiterlimit="10" + /> + strokeLinejoin="round" + /> + strokeLinejoin="round" + /> + strokeLinejoin="round" + /> - + strokeLinejoin="round" + /> + + strokeMiterlimit="10" + /> + strokeLinejoin="round" + /> - + strokeLinejoin="round" + /> + + strokeLinejoin="round" + /> + strokeLinejoin="round" + /> + strokeLinejoin="round" + /> - - + strokeLinejoin="round" + /> + + + strokeMiterlimit="10" + /> - + strokeMiterlimit="10" + /> + + strokeLinecap="round" + /> + strokeLinejoin="round" + /> + strokeLinejoin="round" + /> + strokeLinejoin="round" + /> + strokeLinejoin="round" + /> + strokeLinejoin="round" + /> + strokeLinejoin="round" + /> + strokeLinejoin="round" + /> + strokeLinejoin="round" + /> + strokeLinejoin="round" + /> + fill="white" + /> - + height="1" + > + { y1="62.9463" x2="288.705" y2="69.6428" - gradientUnits="userSpaceOnUse"> + gradientUnits="userSpaceOnUse" + > - + + transform="translate(0.0888672)" + /> + xlinkHref="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAX0AAADpCAYAAADI+eewAAAACXBIWXMAAC4jAAAuIwF4pT92AAAFUklEQVR4Xu3b0WrjVhRAUav0/39ZfSiCy0WyncROZO21oCSO5enAwPbx0c2yrusNgIZ/Hl0AwHWIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AO32+12W5ZlfXQNn29ZV//OABUmfYhalmWdp3vT/vWZ9IHb7fZ/8Nd1XR5dx2cz6UPYONkLfoPoQ5A1Tte/jy4Armee6k38HSZ9gBDRh7B1XRernhbRh4s7ivp4ZHNb6VjtXJ8jmxBw7zjm/KYg/NfmRi5c3Bh8gcd6BwKOYr+9IWz/7b+aKxF9uLAx6uP+fu/7+SvXZKcPF3K0u392p7+9CZj6r0v04SLmWO9N7M8e0RT967LegQuYb9aOj8evR1O8yHeIPnygLex7u/nt8d5XsN6BD7RN7Huhn6+bf/YMbxLXZdKHD3Q0yY+RHz8FHL2OHtGHDzQerxyDP8d8fuxYJn4jF07uXswfTfjizsxOH07s3pn5e0E/mvCfZf1zXSZ9OKmjUG9vBHtrnb0bvDAy6cMJ3Zvw966bw//odY888//mM7mRCydzL9rLcDZ/vm58TrQ5IvpwEmOwx2iPcd+ee/RJ4KfT/k9fz3mJPpzEM9P5fDJnfgN45s+gTfThpMZpe479/L0buDzLjVz4I0f793urmznur7x5O/Op4Zoc2YQ/8uxkPu/09z4BwLOsd+Bk5un96KYufIfowx/YW8+M+/nxOqHnlUQffsm8phmfm49i3rsWfkL04Y32pvR70/tR4IWfV3EjF95oL9ZHN2OPbuxa7/BKJn14o6OTN3uBF3d+g+jDG+3t7r9y5NJah1cTfXiDo739/LPtBu78/dH18FN+IxdeaDt9853nzxh4nzSuR/Thl8zHMY9u3P4lkb8+p3fgjb563v7dbwTP/B24NpM+vNjeRL/9/Og1r4q9qPOI6MMPjXv6MfhzyOf4fyf0os5PiT68yRz8vcd7nwjgnUQfXmxvehd0zkL04YtM5nwy0QcI8Ru5ACGiDxAi+gAhog8QIvoAIaIPECL6ACGiDxAi+gAhog8QIvoAIaIPECL6ACGiDxAi+gAhog8QIvoAIaIPECL6ACGiDxAi+gAhog8QIvoAIaIPECL6ACGiDxAi+gAhog8QIvoAIaIPECL6ACGiDxAi+gAhog8QIvoAIaIPECL6ACGiDxAi+gAhog8QIvoAIaIPECL6ACGiDxAi+gAhog8QIvoAIaIPECL6ACGiDxAi+gAhog8QIvoAIaIPECL6ACGiDxAi+gAhog8QIvoAIaIPECL6ACGiDxDyH3IoUtUNxiZ6AAAAAElFTkSuQmCC" + /> ); diff --git a/modules/settings/assets/js/components/connect-modal/index.js b/modules/settings/assets/js/components/connect-modal/index.js index 51ea0df4..eb9befde 100644 --- a/modules/settings/assets/js/components/connect-modal/index.js +++ b/modules/settings/assets/js/components/connect-modal/index.js @@ -11,14 +11,14 @@ function ConnectModal() { const { redirectToConnect } = useAuth(); return ( - + - - - { __( 'Connect plugin on your site!', 'pojo-accessibility' ) } + }} + > + + + {__('Connect plugin on your site!', 'pojo-accessibility')} diff --git a/modules/settings/assets/js/components/icon-select/index.js b/modules/settings/assets/js/components/icon-select/index.js index e85c88fd..bf8db607 100644 --- a/modules/settings/assets/js/components/icon-select/index.js +++ b/modules/settings/assets/js/components/icon-select/index.js @@ -4,55 +4,69 @@ import Paper from '@elementor/ui/Paper'; import Radio from '@elementor/ui/Radio'; import RadioGroup from '@elementor/ui/RadioGroup'; import Typography from '@elementor/ui/Typography'; -import { AccessibilityControlsIcon, AccessibilityEyeIcon, AccessibilityPersonIcon, AccessibilityTextIcon } from '@ea11y/icons'; +import { + AccessibilityControlsIcon, + AccessibilityEyeIcon, + AccessibilityPersonIcon, + AccessibilityTextIcon, +} from '@ea11y/icons'; import { useState } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; -const IconSelect = ( props ) => { - const [ selectedValue, setSelectedValue ] = useState( 'person' ); +const IconSelect = (props) => { + const [selectedValue, setSelectedValue] = useState('person'); const optionStyle = { - color: 'info.main', fontSize: 44, + color: 'info.main', + fontSize: 44, }; const options = [ { - value: 'person', icon: , label: __( 'Accessibility Person Icon', 'pojo-accessibility' ), + value: 'person', + icon: , + label: __('Accessibility Person Icon', 'pojo-accessibility'), }, { - value: 'eye', icon: , label: __( 'Accessibility Eye Icon', 'pojo-accessibility' ), + value: 'eye', + icon: , + label: __('Accessibility Eye Icon', 'pojo-accessibility'), }, { - value: 'text', icon: , label: __( 'Accessibility Text Badge Icon', 'pojo-accessibility' ), + value: 'text', + icon: , + label: __('Accessibility Text Badge Icon', 'pojo-accessibility'), }, { - value: 'controls', icon: , label: __( 'Accessibility Controls Slider Icon', 'pojo-accessibility' ), + value: 'controls', + icon: , + label: __('Accessibility Controls Slider Icon', 'pojo-accessibility'), }, ]; return ( - - { __( 'Icon', 'pojo-accessibility' ) } + + {__('Icon', 'pojo-accessibility')} - { options.map( ( option ) => ( + {options.map((option) => ( setSelectedValue( option.value ) } - sx={ { + onClick={() => setSelectedValue(option.value)} + sx={{ borderRadius: 'md', boxShadow: 'sm', display: 'flex', @@ -64,18 +78,22 @@ const IconSelect = ( props ) => { p: 2, minWidth: 100, minHeight: 100, - borderColor: selectedValue === option.value ? 'info.main' : 'divider', + borderColor: + selectedValue === option.value ? 'info.main' : 'divider', borderWidth: selectedValue === option.value ? 2 : 1, cursor: 'pointer', - } } - >{ option.icon } + }} + > + {option.icon} + value={option.value} + sx={{ + opacity: 0, + position: 'absolute', + }} + /> - ) ) } + ))} ); diff --git a/modules/settings/assets/js/components/icon-size/index.js b/modules/settings/assets/js/components/icon-size/index.js index 7f041a8f..b5096849 100644 --- a/modules/settings/assets/js/components/icon-size/index.js +++ b/modules/settings/assets/js/components/icon-size/index.js @@ -4,44 +4,60 @@ import Paper from '@elementor/ui/Paper'; import Radio from '@elementor/ui/Radio'; import RadioGroup from '@elementor/ui/RadioGroup'; import Typography from '@elementor/ui/Typography'; -import { AccessibilityEyeIcon, AccessibilityPersonIcon, AccessibilityTextIcon } from '@ea11y/icons'; +import { + AccessibilityEyeIcon, + AccessibilityPersonIcon, + AccessibilityTextIcon, +} from '@ea11y/icons'; import { useState } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; -const IconSize = ( props ) => { - const [ selectedValue, setSelectedValue ] = useState( 'medium' ); +const IconSize = (props) => { + const [selectedValue, setSelectedValue] = useState('medium'); const optionStyle = { color: 'info.main', fontSize: 44 }; const options = [ - { value: 'small', icon: , label: __( 'Accessibility Person Icon', 'pojo-accessibility' ) }, - { value: 'medium', icon: , label: __( 'Accessibility Eye Icon', 'pojo-accessibility' ) }, - { value: 'large', icon: , label: __( 'Accessibility Text Badge Icon', 'pojo-accessibility' ) }, + { + value: 'small', + icon: , + label: __('Accessibility Person Icon', 'pojo-accessibility'), + }, + { + value: 'medium', + icon: , + label: __('Accessibility Eye Icon', 'pojo-accessibility'), + }, + { + value: 'large', + icon: , + label: __('Accessibility Text Badge Icon', 'pojo-accessibility'), + }, ]; return ( - - { __( 'Size', 'pojo-accessibility' ) } + + {__('Size', 'pojo-accessibility')} - { options.map( ( option ) => ( + {options.map((option) => ( setSelectedValue( option.value ) } - sx={ { + onClick={() => setSelectedValue(option.value)} + sx={{ borderRadius: 'md', boxShadow: 'sm', display: 'flex', @@ -53,14 +69,19 @@ const IconSize = ( props ) => { p: 2, minWidth: 100, minHeight: 100, - borderColor: selectedValue === option.value ? 'info.main' : 'divider', + borderColor: + selectedValue === option.value ? 'info.main' : 'divider', borderWidth: selectedValue === option.value ? 2 : 1, cursor: 'pointer', - } } - >{ option.icon } - + }} + > + {option.icon} + - ) ) } + ))} ); diff --git a/modules/settings/assets/js/components/my-account-menu/index.js b/modules/settings/assets/js/components/my-account-menu/index.js index d35b0a14..0995398c 100644 --- a/modules/settings/assets/js/components/my-account-menu/index.js +++ b/modules/settings/assets/js/components/my-account-menu/index.js @@ -8,65 +8,80 @@ import ListItemText from '@elementor/ui/ListItemText'; import Menu from '@elementor/ui/Menu'; import MenuItem from '@elementor/ui/MenuItem'; import Typography from '@elementor/ui/Typography'; -import { bindMenu, bindTrigger, usePopupState } from '@elementor/ui/usePopupState'; -import { useSettings } from '@ea11y/hooks'; import { - CreditCardIcon, - UserArrowIcon, -} from '@ea11y/icons'; + bindMenu, + bindTrigger, + usePopupState, +} from '@elementor/ui/usePopupState'; +import { useSettings } from '@ea11y/hooks'; +import { CreditCardIcon, UserArrowIcon } from '@ea11y/icons'; import { __ } from '@wordpress/i18n'; const MyAccountMenu = () => { const { openSidebar } = useSettings(); - const accountMenuState = usePopupState( { variant: 'popover', popupId: 'myAccountMenu' } ); + const accountMenuState = usePopupState({ + variant: 'popover', + popupId: 'myAccountMenu', + }); return ( <> - + - + - - + JB - - Jack Baueuer - jack@bauer.com + + + Jack Baueuer + + + jack@bauer.com + - - - - { __( 'Switch account', 'pojo-accessibility' ) } + + + + {__('Switch account', 'pojo-accessibility')} - - - - { __( 'Billing', 'pojo-accessibility' ) } + + + + {__('Billing', 'pojo-accessibility')} diff --git a/modules/settings/assets/js/components/notifications/index.js b/modules/settings/assets/js/components/notifications/index.js index 28a60244..66cc545b 100644 --- a/modules/settings/assets/js/components/notifications/index.js +++ b/modules/settings/assets/js/components/notifications/index.js @@ -2,7 +2,7 @@ import Alert from '@elementor/ui/Alert'; import Snackbar from '@elementor/ui/Snackbar'; import { useNotificationSettings } from '@ea11y/hooks'; -const Notifications = ( { type, message } ) => { +const Notifications = ({ type, message }) => { const { showNotification, setShowNotification, @@ -11,24 +11,25 @@ const Notifications = ( { type, message } ) => { } = useNotificationSettings(); const closeNotification = () => { - setShowNotification( ! showNotification ); - setNotificationMessage( '' ); - setNotificationType( '' ); + setShowNotification(!showNotification); + setNotificationMessage(''); + setNotificationType(''); }; return ( setShowNotification( ! showNotification ) } - severity={ type } - variant="filled" > - { message } + onClose={() => setShowNotification(!showNotification)} + severity={type} + variant="filled" + > + {message} ); diff --git a/modules/settings/assets/js/components/position-control/index.js b/modules/settings/assets/js/components/position-control/index.js index fcba18bb..eab814af 100644 --- a/modules/settings/assets/js/components/position-control/index.js +++ b/modules/settings/assets/js/components/position-control/index.js @@ -6,24 +6,28 @@ import MenuItem from '@elementor/ui/MenuItem'; import Select from '@elementor/ui/Select'; import TextField from '@elementor/ui/TextField'; import { styled } from '@elementor/ui/styles'; -import { usePopupState, bindTrigger, bindMenu } from '@elementor/ui/usePopupState'; +import { + usePopupState, + bindTrigger, + bindMenu, +} from '@elementor/ui/usePopupState'; import { useState } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; -const units = [ 'PX', 'REM', 'EM' ]; +const units = ['PX', 'REM', 'EM']; const horizontalOptions = [ - { value: 'to-left', label: __( 'To the left', 'pojo-accessibility' ) }, - { value: 'to-right', label: __( 'To the right', 'pojo-accessibility' ) }, + { value: 'to-left', label: __('To the left', 'pojo-accessibility') }, + { value: 'to-right', label: __('To the right', 'pojo-accessibility') }, ]; const verticalOptions = [ - { value: 'higher', label: __( 'Higher', 'pojo-accessibility' ) }, - { value: 'lower', label: __( 'Lower', 'pojo-accessibility' ) }, + { value: 'higher', label: __('Higher', 'pojo-accessibility') }, + { value: 'lower', label: __('Lower', 'pojo-accessibility') }, ]; // Customization for the WP admin global CSS. -const StyledTextField = styled( TextField )( () => ( { +const StyledTextField = styled(TextField)(() => ({ width: '200px', '.wp-admin & .MuiInputBase-input, & .MuiInputBase-input:focus': { backgroundColor: 'initial', @@ -37,64 +41,68 @@ const StyledTextField = styled( TextField )( () => ( { }, height: '56px', }, -} ) ); +})); -const PositionControl = ( { type, disabled }, props ) => { - const [ unitsIndex, setUnitsIndex ] = useState( 0 ); - const popupState = usePopupState( { +const PositionControl = ({ type, disabled }, props) => { + const [unitsIndex, setUnitsIndex] = useState(0); + const popupState = usePopupState({ variant: 'popover', popupId: 'textfield-inner-selection', - } ); + }); - const handleMenuItemClick = ( index ) => { - setUnitsIndex( index ); + const handleMenuItemClick = (index) => { + setUnitsIndex(index); popupState.close(); }; - const [ position, setPosition ] = useState( 10 ); - const handlePositionChange = ( event ) => setPosition( event.target.value ); + const [position, setPosition] = useState(10); + const handlePositionChange = (event) => setPosition(event.target.value); return ( - + - - { units.map( ( unit, index ) => ( - handleMenuItemClick( index ) }> - { unit } + + {units.map((unit, index) => ( + handleMenuItemClick(index)} + > + {unit} - ) ) } + ))} ), - } } + }} /> ); diff --git a/modules/settings/assets/js/components/sidebar-app-bar/index.js b/modules/settings/assets/js/components/sidebar-app-bar/index.js index b8ce2542..fa44c5c0 100644 --- a/modules/settings/assets/js/components/sidebar-app-bar/index.js +++ b/modules/settings/assets/js/components/sidebar-app-bar/index.js @@ -10,26 +10,30 @@ import { __ } from '@wordpress/i18n'; const SidebarAppBar = () => { const { openSidebar, setOpenSidebar } = useSettings(); - return ( - - - - - { __( 'Accessibility', 'pojo-accessibility' ) } - - - setOpenSidebar( ! openSidebar ) }> - - - - ); + return ( + + + + + + {__('Accessibility', 'pojo-accessibility')} + + + setOpenSidebar(!openSidebar)} + > + + + + + ); }; export default SidebarAppBar; diff --git a/modules/settings/assets/js/components/sidebar-menu/index.js b/modules/settings/assets/js/components/sidebar-menu/index.js index a2d1129c..1e226d16 100644 --- a/modules/settings/assets/js/components/sidebar-menu/index.js +++ b/modules/settings/assets/js/components/sidebar-menu/index.js @@ -10,61 +10,70 @@ import { MenuItems } from './menu'; const SidebarMenu = () => { const { openSidebar, selectedMenu, setSelectedMenu } = useSettings(); - const [ expandedItems, setExpandedItems ] = useState( { widget: true } ); + const [expandedItems, setExpandedItems] = useState({ widget: true }); - const handleSelectedMenu = ( parentKey, childKey ) => { - if ( childKey ) { - setSelectedMenu( { parent: parentKey, child: childKey } ); + const handleSelectedMenu = (parentKey, childKey) => { + if (childKey) { + setSelectedMenu({ parent: parentKey, child: childKey }); } else { - setSelectedMenu( { parent: parentKey, child: null } ); + setSelectedMenu({ parent: parentKey, child: null }); } }; - const handleToggleItem = ( itemName ) => { - setExpandedItems( ( prev ) => ( { + const handleToggleItem = (itemName) => { + setExpandedItems((prev) => ({ ...prev, - [ itemName ]: ! prev[ itemName ], // Toggle the expanded state for the clicked item - } ) ); + [itemName]: !prev[itemName], // Toggle the expanded state for the clicked item + })); }; - return ( - { Object.entries( MenuItems ).map( ( [ key, item ] ) => ( - <> - - item.children ? handleToggleItem( key ) : handleSelectedMenu( key ) } - sx={ { justifyContent: 'center' } } - selected={ key === selectedMenu.parent && ( ! selectedMenu.child || ! openSidebar ) } - > - { item.icon } - - - { item.children && expandedItems[ key ] && ( - - { Object.entries( item.children ).map( ( [ childKey, child ] ) => ( - - ) ) } - - ) } - - ) ) } - ); + return ( + + {Object.entries(MenuItems).map(([key, item]) => ( + <> + + + item.children ? handleToggleItem(key) : handleSelectedMenu(key) + } + sx={{ justifyContent: 'center' }} + selected={ + key === selectedMenu.parent && + (!selectedMenu.child || !openSidebar) + } + > + {item.icon} + + + {item.children && expandedItems[key] && ( + + {Object.entries(item.children).map(([childKey, child]) => ( + + ))} + + )} + + ))} + + ); }; export default SidebarMenu; diff --git a/modules/settings/assets/js/components/sidebar-menu/menu.js b/modules/settings/assets/js/components/sidebar-menu/menu.js index 9f82b18f..9f46c05b 100644 --- a/modules/settings/assets/js/components/sidebar-menu/menu.js +++ b/modules/settings/assets/js/components/sidebar-menu/menu.js @@ -5,24 +5,24 @@ import { AccessibilityStatement, Menu, IconSettings } from '../../pages'; export const MenuItems = { widget: { - name: __( 'Widget', 'pojo-accessibility' ), + name: __('Widget', 'pojo-accessibility'), key: 'widget', icon: , children: { iconSettings: { - name: __( 'Icon Settings', 'pojo-accessibility' ), + name: __('Icon Settings', 'pojo-accessibility'), key: 'icon-settings', page: , }, menu: { - name: __( 'Menu', 'pojo-accessibility' ), + name: __('Menu', 'pojo-accessibility'), key: 'menu', page: , }, }, }, accessibilityStatement: { - name: __( 'Accessibility Statement', 'pojo-accessibility' ), + name: __('Accessibility Statement', 'pojo-accessibility'), key: 'accessibility-statement', page: , icon: , diff --git a/modules/settings/assets/js/contexts/plugin-settings-context.js b/modules/settings/assets/js/contexts/plugin-settings-context.js index 54d028f9..60cabe02 100644 --- a/modules/settings/assets/js/contexts/plugin-settings-context.js +++ b/modules/settings/assets/js/contexts/plugin-settings-context.js @@ -1,40 +1,50 @@ -import { createContext, useCallback, useContext, useEffect, useState } from '@wordpress/element'; +import { + createContext, + useCallback, + useContext, + useEffect, + useState, +} from '@wordpress/element'; import { __ } from '@wordpress/i18n'; import API from '../api'; import { useToastNotification } from '../hooks'; -const PluginSettingsContext = createContext( {} ); +const PluginSettingsContext = createContext({}); -export const PluginSettingsProvider = ( { children } ) => { +export const PluginSettingsProvider = ({ children }) => { const { error } = useToastNotification(); - const [ pluginSettings, setPluginSettings ] = useState(); - const [ loaded, setLoaded ] = useState( false ); + const [pluginSettings, setPluginSettings] = useState(); + const [loaded, setLoaded] = useState(false); - const refreshPluginSettings = useCallback( () => { - API.getPluginSettings().then( ( settings ) => { - if ( 'isConnected' in settings ) { - settings.isConnected = Boolean( settings.isConnected ); - } + const refreshPluginSettings = useCallback(() => { + API.getPluginSettings() + .then((settings) => { + if ('isConnected' in settings) { + settings.isConnected = Boolean(settings.isConnected); + } - setPluginSettings( settings ); - setLoaded( true ); - } ).catch( () => { - error( __( 'An error occurred.', 'pojo-accessibility' ) ); - setLoaded( true ); - } ); - }, [] ); + setPluginSettings(settings); + setLoaded(true); + }) + .catch(() => { + error(__('An error occurred.', 'pojo-accessibility')); + setLoaded(true); + }); + }, []); - useEffect( () => { + useEffect(() => { refreshPluginSettings(); - }, [ refreshPluginSettings ] ); + }, [refreshPluginSettings]); return ( - - { children } + + {children} ); }; export const usePluginSettingsContext = () => { - return useContext( PluginSettingsContext ); + return useContext(PluginSettingsContext); }; diff --git a/modules/settings/assets/js/contexts/plugin-settings.js b/modules/settings/assets/js/contexts/plugin-settings.js index 54d028f9..60cabe02 100644 --- a/modules/settings/assets/js/contexts/plugin-settings.js +++ b/modules/settings/assets/js/contexts/plugin-settings.js @@ -1,40 +1,50 @@ -import { createContext, useCallback, useContext, useEffect, useState } from '@wordpress/element'; +import { + createContext, + useCallback, + useContext, + useEffect, + useState, +} from '@wordpress/element'; import { __ } from '@wordpress/i18n'; import API from '../api'; import { useToastNotification } from '../hooks'; -const PluginSettingsContext = createContext( {} ); +const PluginSettingsContext = createContext({}); -export const PluginSettingsProvider = ( { children } ) => { +export const PluginSettingsProvider = ({ children }) => { const { error } = useToastNotification(); - const [ pluginSettings, setPluginSettings ] = useState(); - const [ loaded, setLoaded ] = useState( false ); + const [pluginSettings, setPluginSettings] = useState(); + const [loaded, setLoaded] = useState(false); - const refreshPluginSettings = useCallback( () => { - API.getPluginSettings().then( ( settings ) => { - if ( 'isConnected' in settings ) { - settings.isConnected = Boolean( settings.isConnected ); - } + const refreshPluginSettings = useCallback(() => { + API.getPluginSettings() + .then((settings) => { + if ('isConnected' in settings) { + settings.isConnected = Boolean(settings.isConnected); + } - setPluginSettings( settings ); - setLoaded( true ); - } ).catch( () => { - error( __( 'An error occurred.', 'pojo-accessibility' ) ); - setLoaded( true ); - } ); - }, [] ); + setPluginSettings(settings); + setLoaded(true); + }) + .catch(() => { + error(__('An error occurred.', 'pojo-accessibility')); + setLoaded(true); + }); + }, []); - useEffect( () => { + useEffect(() => { refreshPluginSettings(); - }, [ refreshPluginSettings ] ); + }, [refreshPluginSettings]); return ( - - { children } + + {children} ); }; export const usePluginSettingsContext = () => { - return useContext( PluginSettingsContext ); + return useContext(PluginSettingsContext); }; diff --git a/modules/settings/assets/js/hooks/use-auth.js b/modules/settings/assets/js/hooks/use-auth.js index 791ec33c..174568ec 100644 --- a/modules/settings/assets/js/hooks/use-auth.js +++ b/modules/settings/assets/js/hooks/use-auth.js @@ -7,7 +7,7 @@ export const useAuth = () => { const redirectToConnect = async () => { const link = await getConnectLink(); - window.open( link, '_self' ).focus(); + window.open(link, '_self').focus(); }; const getConnectLink = async () => { @@ -15,9 +15,9 @@ export const useAuth = () => { }; const getUpgradeLink = () => { - const url = new URL( UPGRADE_LINK ); + const url = new URL(UPGRADE_LINK); - url.searchParams.append( 'subscription_id', subscriptionId ); + url.searchParams.append('subscription_id', subscriptionId); return url.toString(); }; diff --git a/modules/settings/assets/js/hooks/use-modal.js b/modules/settings/assets/js/hooks/use-modal.js index 19aaaaf1..e43b966c 100644 --- a/modules/settings/assets/js/hooks/use-modal.js +++ b/modules/settings/assets/js/hooks/use-modal.js @@ -1,14 +1,14 @@ import { useState } from '@wordpress/element'; -export const useModal = ( defaultIsOpen = true ) => { - const [ isOpen, setIsOpen ] = useState( defaultIsOpen ); +export const useModal = (defaultIsOpen = true) => { + const [isOpen, setIsOpen] = useState(defaultIsOpen); const open = () => { - setIsOpen( true ); + setIsOpen(true); }; const close = () => { - setIsOpen( false ); + setIsOpen(false); }; return { diff --git a/modules/settings/assets/js/hooks/use-notifications.js b/modules/settings/assets/js/hooks/use-notifications.js index 0ea75585..97471ec2 100644 --- a/modules/settings/assets/js/hooks/use-notifications.js +++ b/modules/settings/assets/js/hooks/use-notifications.js @@ -1,49 +1,46 @@ import { useState, createContext, useContext } from '@wordpress/element'; -const NotificationsContext = createContext( undefined ); +const NotificationsContext = createContext(undefined); export function useNotificationSettings() { - return useContext( NotificationsContext ); + return useContext(NotificationsContext); } -export const NotificationsProvider = ( { children } ) => { - const [ showNotification, setShowNotification ] = useState( false ); - const [ notificationMessage, setNotificationMessage ] = useState( '' ); - const [ notificationType, setNotificationType ] = useState( '' ); +export const NotificationsProvider = ({ children }) => { + const [showNotification, setShowNotification] = useState(false); + const [notificationMessage, setNotificationMessage] = useState(''); + const [notificationType, setNotificationType] = useState(''); return ( - { children } + {children} ); }; export const useToastNotification = () => { - const { - setNotificationMessage, - setNotificationType, - setShowNotification, - } = useContext( NotificationsContext ); - - const error = ( message ) => { - setNotificationMessage( message ); - setNotificationType( 'error' ); - setShowNotification( true ); + const { setNotificationMessage, setNotificationType, setShowNotification } = + useContext(NotificationsContext); + + const error = (message) => { + setNotificationMessage(message); + setNotificationType('error'); + setShowNotification(true); }; - const success = ( message ) => { - setNotificationMessage( message ); - setNotificationType( 'success' ); - setShowNotification( true ); + const success = (message) => { + setNotificationMessage(message); + setNotificationType('success'); + setShowNotification(true); }; return { diff --git a/modules/settings/assets/js/hooks/use-settings.js b/modules/settings/assets/js/hooks/use-settings.js index 7c58be86..700ca921 100644 --- a/modules/settings/assets/js/hooks/use-settings.js +++ b/modules/settings/assets/js/hooks/use-settings.js @@ -3,25 +3,28 @@ import { useState, createContext, useContext } from '@wordpress/element'; /** * Context Component. */ -const SettingsContext = createContext( null ); +const SettingsContext = createContext(null); export function useSettings() { - return useContext( SettingsContext ); + return useContext(SettingsContext); } -export const SettingsProvider = ( { children } ) => { - const [ openSidebar, setOpenSidebar ] = useState( true ); - const [ selectedMenu, setSelectedMenu ] = useState( { parent: 'widget', child: 'iconSettings' } ); +export const SettingsProvider = ({ children }) => { + const [openSidebar, setOpenSidebar] = useState(true); + const [selectedMenu, setSelectedMenu] = useState({ + parent: 'widget', + child: 'iconSettings', + }); return ( - { children } + {children} ); }; diff --git a/modules/settings/assets/js/hooks/use-storage.js b/modules/settings/assets/js/hooks/use-storage.js index 23775120..814a0ba1 100644 --- a/modules/settings/assets/js/hooks/use-storage.js +++ b/modules/settings/assets/js/hooks/use-storage.js @@ -2,8 +2,8 @@ import { store as coreDataStore } from '@wordpress/core-data'; import { dispatch } from '@wordpress/data'; export const useStorage = () => { - const save = async ( data ) => { - return await dispatch( coreDataStore ).saveEntityRecord( 'root', 'site', data ); + const save = async (data) => { + return await dispatch(coreDataStore).saveEntityRecord('root', 'site', data); }; return { diff --git a/modules/settings/assets/js/icons/accessibility-controls.js b/modules/settings/assets/js/icons/accessibility-controls.js index 6aa3b140..fbcbefd8 100644 --- a/modules/settings/assets/js/icons/accessibility-controls.js +++ b/modules/settings/assets/js/icons/accessibility-controls.js @@ -1,25 +1,22 @@ import SvgIcon from '@elementor/ui/SvgIcon'; -function AccessibilityControlsIcon( props ) { +function AccessibilityControlsIcon(props) { return ( - + - + strokeLinejoin="round" + /> ); } diff --git a/modules/settings/assets/js/icons/accessibility-eye.js b/modules/settings/assets/js/icons/accessibility-eye.js index cdeda1f8..9c1d63b1 100644 --- a/modules/settings/assets/js/icons/accessibility-eye.js +++ b/modules/settings/assets/js/icons/accessibility-eye.js @@ -1,25 +1,23 @@ import SvgIcon from '@elementor/ui/SvgIcon'; -function AccessibilityEyeIcon( props ) { +function AccessibilityEyeIcon(props) { return ( - + + strokeLinejoin="round" + /> @@ -27,7 +25,8 @@ function AccessibilityEyeIcon( props ) { width="48" height="48" fill="white" - transform="translate(8 8)" /> + transform="translate(8 8)" + /> diff --git a/modules/settings/assets/js/icons/accessibility-person.js b/modules/settings/assets/js/icons/accessibility-person.js index 051c77e7..71f5ab12 100644 --- a/modules/settings/assets/js/icons/accessibility-person.js +++ b/modules/settings/assets/js/icons/accessibility-person.js @@ -1,25 +1,26 @@ import SvgIcon from '@elementor/ui/SvgIcon'; -function AccessibilityPersonIcon( props ) { +function AccessibilityPersonIcon(props) { return ( - - + + + strokeLinejoin="round" + /> ); } diff --git a/modules/settings/assets/js/icons/accessibility-text.js b/modules/settings/assets/js/icons/accessibility-text.js index 57f075ea..88c81a12 100644 --- a/modules/settings/assets/js/icons/accessibility-text.js +++ b/modules/settings/assets/js/icons/accessibility-text.js @@ -1,13 +1,13 @@ import SvgIcon from '@elementor/ui/SvgIcon'; -function AccessibilityTextIcon( props ) { +function AccessibilityTextIcon(props) { return ( - + strokeOpacity="0.12" + /> + - + strokeWidth="3" + /> + ); } diff --git a/modules/settings/assets/js/icons/credit-card.js b/modules/settings/assets/js/icons/credit-card.js index af62533f..bbb52b8b 100644 --- a/modules/settings/assets/js/icons/credit-card.js +++ b/modules/settings/assets/js/icons/credit-card.js @@ -1,16 +1,13 @@ import SvgIcon from '@elementor/ui/SvgIcon'; -const CreditCardIcon = ( props, { size } ) => { +const CreditCardIcon = (props, { size }) => { return ( - + - + d="M5 4.79163C3.96447 4.79163 3.125 5.63109 3.125 6.66663V7.70829H16.875V6.66663C16.875 5.63109 16.0355 4.79163 15 4.79163H5ZM18.125 6.66663C18.125 4.94074 16.7259 3.54163 15 3.54163H5C3.27411 3.54163 1.875 4.94074 1.875 6.66663V13.3333C1.875 15.0592 3.27411 16.4583 5 16.4583H15C16.7259 16.4583 18.125 15.0592 18.125 13.3333V6.66663ZM16.875 8.95829H3.125V13.3333C3.125 14.3688 3.96447 15.2083 5 15.2083H15C16.0355 15.2083 16.875 14.3688 16.875 13.3333V8.95829ZM5.20833 12.5C5.20833 12.1548 5.48816 11.875 5.83333 11.875H5.84167C6.18684 11.875 6.46667 12.1548 6.46667 12.5C6.46667 12.8451 6.18684 13.125 5.84167 13.125H5.83333C5.48816 13.125 5.20833 12.8451 5.20833 12.5ZM8.54167 12.5C8.54167 12.1548 8.82149 11.875 9.16667 11.875H10.8333C11.1785 11.875 11.4583 12.1548 11.4583 12.5C11.4583 12.8451 11.1785 13.125 10.8333 13.125H9.16667C8.82149 13.125 8.54167 12.8451 8.54167 12.5Z" + /> ); }; diff --git a/modules/settings/assets/js/icons/elementor-logo.js b/modules/settings/assets/js/icons/elementor-logo.js index 5f3ad308..4afefe69 100644 --- a/modules/settings/assets/js/icons/elementor-logo.js +++ b/modules/settings/assets/js/icons/elementor-logo.js @@ -1,14 +1,15 @@ import SvgIcon from '@elementor/ui/SvgIcon'; -const ElementorLogo = ( { size } ) => { +const ElementorLogo = ({ size }) => { return ( - + + clipRule="evenodd" + /> diff --git a/modules/settings/assets/js/icons/square-rounded-chevrons-left.js b/modules/settings/assets/js/icons/square-rounded-chevrons-left.js index a753c862..4757bac1 100644 --- a/modules/settings/assets/js/icons/square-rounded-chevrons-left.js +++ b/modules/settings/assets/js/icons/square-rounded-chevrons-left.js @@ -1,16 +1,18 @@ import SvgIcon from '@elementor/ui/SvgIcon'; -const SquareRoundedChevronsLeft = ( props, { size } ) => { +const SquareRoundedChevronsLeft = (props, { size }) => { return ( + fontSize={size} + sx={{ ...props.sx }} + {...props} + > + d="M5.33033 5.33033C4.21884 6.44182 3.75 8.39464 3.75 12C3.75 15.6054 4.21884 17.5582 5.33033 18.6697C6.44182 19.7812 8.39464 20.25 12 20.25C15.6054 20.25 17.5582 19.7812 18.6697 18.6697C19.7812 17.5582 20.25 15.6054 20.25 12C20.25 8.39464 19.7812 6.44182 18.6697 5.33033C17.5582 4.21884 15.6054 3.75 12 3.75C8.39464 3.75 6.44182 4.21884 5.33033 5.33033ZM4.26967 4.26967C5.85818 2.68116 8.40536 2.25 12 2.25C15.5946 2.25 18.1418 2.68116 19.7303 4.26967C21.3188 5.85818 21.75 8.40536 21.75 12C21.75 15.5946 21.3188 18.1418 19.7303 19.7303C18.1418 21.3188 15.5946 21.75 12 21.75C8.40536 21.75 5.85818 21.3188 4.26967 19.7303C2.68116 18.1418 2.25 15.5946 2.25 12C2.25 8.40536 2.68116 5.85818 4.26967 4.26967ZM11.5303 8.46967C11.8232 8.76256 11.8232 9.23744 11.5303 9.53033L9.06066 12L11.5303 14.4697C11.8232 14.7626 11.8232 15.2374 11.5303 15.5303C11.2374 15.8232 10.7626 15.8232 10.4697 15.5303L7.46967 12.5303C7.17678 12.2374 7.17678 11.7626 7.46967 11.4697L10.4697 8.46967C10.7626 8.17678 11.2374 8.17678 11.5303 8.46967ZM15.5303 8.46967C15.8232 8.76256 15.8232 9.23744 15.5303 9.53033L13.0607 12L15.5303 14.4697C15.8232 14.7626 15.8232 15.2374 15.5303 15.5303C15.2374 15.8232 14.7626 15.8232 14.4697 15.5303L11.4697 12.5303C11.1768 12.2374 11.1768 11.7626 11.4697 11.4697L14.4697 8.46967C14.7626 8.17678 15.2374 8.17678 15.5303 8.46967Z" + /> ); }; diff --git a/modules/settings/assets/js/icons/user-arrow.js b/modules/settings/assets/js/icons/user-arrow.js index 2adbdbe6..0262aeb6 100644 --- a/modules/settings/assets/js/icons/user-arrow.js +++ b/modules/settings/assets/js/icons/user-arrow.js @@ -1,21 +1,15 @@ import SvgIcon from '@elementor/ui/SvgIcon'; -const UserArrowIcon = ( props, { size } ) => { +const UserArrowIcon = (props, { size }) => { return ( - + - - + + ); }; diff --git a/modules/settings/assets/js/icons/widget.js b/modules/settings/assets/js/icons/widget.js index c7c84e4a..49f1a891 100644 --- a/modules/settings/assets/js/icons/widget.js +++ b/modules/settings/assets/js/icons/widget.js @@ -1,8 +1,8 @@ import SvgIcon from '@elementor/ui/SvgIcon'; -const WidgetIcon = ( { size } ) => { +const WidgetIcon = ({ size }) => { return ( - + { stroke="black" strokeWidth="1.5" strokeLinecap="round" - strokeLinejoin="round" /> + strokeLinejoin="round" + /> + strokeLinejoin="round" + /> { stroke="black" strokeWidth="1.5" strokeLinecap="round" - strokeLinejoin="round" /> + strokeLinejoin="round" + /> ); diff --git a/modules/settings/assets/js/layouts/icon-design-settings.js b/modules/settings/assets/js/layouts/icon-design-settings.js index 3327300e..437eede3 100644 --- a/modules/settings/assets/js/layouts/icon-design-settings.js +++ b/modules/settings/assets/js/layouts/icon-design-settings.js @@ -6,22 +6,20 @@ import { __ } from '@wordpress/i18n'; const IconDesignSettings = () => { return ( - - - { __( 'Design', 'pojo-accessibility' ) } - { __( 'Customize the design of the button that visitors use to open the widget.', 'pojo-accessibility' ) } + + + + {__('Design', 'pojo-accessibility')} + + + {__( + 'Customize the design of the button that visitors use to open the widget.', + 'pojo-accessibility', + )} + - - + + diff --git a/modules/settings/assets/js/layouts/position-settings-desktop.js b/modules/settings/assets/js/layouts/position-settings-desktop.js index 66e50126..b50ea5cd 100644 --- a/modules/settings/assets/js/layouts/position-settings-desktop.js +++ b/modules/settings/assets/js/layouts/position-settings-desktop.js @@ -7,34 +7,44 @@ import { useState } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; const PositionSettingsDesktop = () => { - const [ hiddenOnDesktop, setHiddenOnDesktop ] = useState( false ); - const [ disableExactPosition, setDisableExactPosition ] = useState( true ); + const [hiddenOnDesktop, setHiddenOnDesktop] = useState(false); + const [disableExactPosition, setDisableExactPosition] = useState(true); return ( <> { __( 'Hide on desktop', 'pojo-accessibility' ) } } + label={ + + {__('Hide on desktop', 'pojo-accessibility')} + + } labelPlacement="start" - control={ } - sx={ { marginLeft: 0, marginBottom: 3 } } - onChange={ () => setHiddenOnDesktop( ! hiddenOnDesktop ) } /> - { ! hiddenOnDesktop && - + control={} + sx={{ marginLeft: 0, marginBottom: 3 }} + onChange={() => setHiddenOnDesktop(!hiddenOnDesktop)} + /> + {!hiddenOnDesktop && ( + { __( 'Exact position', 'pojo-accessibility' ) } } + label={ + + {__('Exact position', 'pojo-accessibility')} + + } labelPlacement="start" - control={ } - sx={ { marginLeft: 0 } } - onChange={ () => setDisableExactPosition( ! disableExactPosition ) } /> - - + control={} + sx={{ marginLeft: 0 }} + onChange={() => setDisableExactPosition(!disableExactPosition)} + /> + + - } + )} ); }; diff --git a/modules/settings/assets/js/layouts/position-settings.js b/modules/settings/assets/js/layouts/position-settings.js index 36399753..c8f876e4 100644 --- a/modules/settings/assets/js/layouts/position-settings.js +++ b/modules/settings/assets/js/layouts/position-settings.js @@ -16,54 +16,57 @@ const TABS = { }; const PositionSettings = () => { - const [ currentTab, setCurrentTab ] = useState( TABS.one ); - const { getTabProps } = useTabs( currentTab ); + const [currentTab, setCurrentTab] = useState(TABS.one); + const { getTabProps } = useTabs(currentTab); - const changeTab = ( tab ) => () => { - setCurrentTab( tab ); + const changeTab = (tab) => () => { + setCurrentTab(tab); }; return ( - - - { __( 'Position', 'pojo-accessibility' ) } - { __( 'Set where the widget appears on your site. This applies to all pages.', 'pojo-accessibility' ) } + + + + {__('Position', 'pojo-accessibility')} + + + {__( + 'Set where the widget appears on your site. This applies to all pages.', + 'pojo-accessibility', + )} + } + icon={} iconPosition="start" - onClick={ changeTab( TABS.one ) } + onClick={changeTab(TABS.one)} /> } + icon={} iconPosition="start" - onClick={ changeTab( TABS.two ) } + onClick={changeTab(TABS.two)} /> - { currentTab === TABS.one ? ( + {currentTab === TABS.one ? ( ) : ( - - - ) } + + )} ); }; diff --git a/modules/settings/assets/js/layouts/sidebar.js b/modules/settings/assets/js/layouts/sidebar.js index 1ff31c39..a462cc84 100644 --- a/modules/settings/assets/js/layouts/sidebar.js +++ b/modules/settings/assets/js/layouts/sidebar.js @@ -9,8 +9,8 @@ export const Sidebar = () => { return ( { height: '100%', justifyContent: 'space-between', }, - } } + }} > - + ); }; diff --git a/modules/settings/assets/js/pages/accessibility-statement.js b/modules/settings/assets/js/pages/accessibility-statement.js index c4a0c857..34cbc5cb 100644 --- a/modules/settings/assets/js/pages/accessibility-statement.js +++ b/modules/settings/assets/js/pages/accessibility-statement.js @@ -1,5 +1,5 @@ const AccessibilityStatement = () => { - return (

AccessibilityStatement

); + return

AccessibilityStatement

; }; export default AccessibilityStatement; diff --git a/modules/settings/assets/js/pages/icon-settings.js b/modules/settings/assets/js/pages/icon-settings.js index bb8bb85f..e744134d 100644 --- a/modules/settings/assets/js/pages/icon-settings.js +++ b/modules/settings/assets/js/pages/icon-settings.js @@ -1,5 +1,5 @@ const IconSettings = () => { - return (

IconSettings

); + return

IconSettings

; }; export default IconSettings; diff --git a/modules/settings/assets/js/pages/menu.js b/modules/settings/assets/js/pages/menu.js index 2b618ce1..eff5dfbd 100644 --- a/modules/settings/assets/js/pages/menu.js +++ b/modules/settings/assets/js/pages/menu.js @@ -1,5 +1,5 @@ const Menu = () => { - return (

Menu

); + return

Menu

; }; export default Menu; diff --git a/package-lock.json b/package-lock.json index aee17755..d6fbf6c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,12 +28,15 @@ "@wordpress/eslint-plugin": "^21.3.0", "@wordpress/scripts": "^30.3.0", "eslint": "^8.57.1", + "eslint-config-prettier": "^9.1.0", "eslint-import-resolver-webpack": "^0.13.9", "eslint-plugin-babel": "^5.3.1", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.1", + "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-react": "^7.37.1", - "husky": "^9.1.6" + "husky": "^9.1.6", + "prettier": "^3.4.1" } }, "node_modules/@ampproject/remapping": { @@ -6536,6 +6539,18 @@ } } }, + "node_modules/@wordpress/eslint-plugin/node_modules/eslint-config-prettier": { + "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, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/@wordpress/eslint-plugin/node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -10755,9 +10770,9 @@ } }, "node_modules/eslint-config-prettier": { - "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==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -18191,11 +18206,10 @@ } }, "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.1.tgz", + "integrity": "sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==", "dev": true, - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, diff --git a/package.json b/package.json index e8767b27..23eb061d 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "start": "wp-scripts start", "format": "wp-scripts format", "lint:js": "wp-scripts lint-js", + "lint:js:fix": "wp-scripts lint-js --fix", "prepare": "husky install", "local:start": "wp-env start", "local:stop": "wp-env stop", @@ -26,11 +27,14 @@ "@wordpress/scripts": "^30.3.0", "eslint": "^8.57.1", "eslint-import-resolver-webpack": "^0.13.9", + "eslint-config-prettier": "^9.1.0", "eslint-plugin-babel": "^5.3.1", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.1", + "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-react": "^7.37.1", - "husky": "^9.1.6" + "husky": "^9.1.6", + "prettier": "^3.4.1" }, "dependencies": { "@elementor/icons": "^1.17.0", diff --git a/webpack.config.js b/webpack.config.js index ae6ffc06..415bf6cf 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,13 +1,9 @@ -const path = require( 'path' ); -const defaultConfig = require( '@wordpress/scripts/config/webpack.config' ); +const path = require('path'); +const defaultConfig = require('@wordpress/scripts/config/webpack.config'); // add your entry points here const entryPoints = { - admin: path.resolve( - process.cwd(), - 'modules/settings/assets/js', - 'admin.js', - ), + admin: path.resolve(process.cwd(), 'modules/settings/assets/js', 'admin.js'), }; module.exports = { @@ -15,16 +11,31 @@ module.exports = { entry: entryPoints, output: { ...defaultConfig.output, - path: path.resolve( process.cwd(), 'assets/build' ), + path: path.resolve(process.cwd(), 'assets/build'), }, resolve: { alias: { - '@ea11y/hooks': path.resolve( __dirname, 'modules/settings/assets/js/hooks/' ), - '@ea11y/components': path.resolve( __dirname, 'modules/settings/assets/js/components/' ), - '@ea11y/icons': path.resolve( __dirname, 'modules/settings/assets/js/icons/' ), - '@ea11y/layouts': path.resolve( __dirname, 'modules/settings/assets/js/layouts/' ), - '@ea11y/pages': path.resolve( __dirname, 'modules/settings/assets/js/pages/' ), + '@ea11y/hooks': path.resolve( + __dirname, + 'modules/settings/assets/js/hooks/', + ), + '@ea11y/components': path.resolve( + __dirname, + 'modules/settings/assets/js/components/', + ), + '@ea11y/icons': path.resolve( + __dirname, + 'modules/settings/assets/js/icons/', + ), + '@ea11y/layouts': path.resolve( + __dirname, + 'modules/settings/assets/js/layouts/', + ), + '@ea11y/pages': path.resolve( + __dirname, + 'modules/settings/assets/js/pages/', + ), }, - extensions: [ '.js', '.jsx' ], + extensions: ['.js', '.jsx'], }, }; From 7f62f9f01df155eb3e79c73136cd16be61bc40b3 Mon Sep 17 00:00:00 2001 From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com> Date: Wed, 4 Dec 2024 11:33:04 +0530 Subject: [PATCH 010/292] Feature/app 810 assemble icon settings page (#117) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Initial refactor commit * ✅ Added build and tests CI/CD * update: add src for admin settings * update: incorrect constant names * update: namespace * add: accessibility settings * update: webpack to output files inside a folder * update: build output folders * update: removed commented code * update: npm scripts * add: webpack config * add: hooks * update: move admin setting to the module folder * update: assets loading logic * update: add rule to move jsx props to multiline imporving readability * add: connect modal * update: hooks import for better readability * update: replace functions with hooks * add: connect module * add: settings and get settings route * add: hooks and contexts to get settings * add: hooks * add: notification component * add: data api * add: settings provider and connect settings * add: husky * add: icon size control * fix: icon size control labels * add: icon select component * add: color picker component * add: accessibility icons * add: icon export * update: add icons to the component * fix: styling for the icon select control * update: color picker with react-colorful component * update: icon size component with live icon design * fix: styling of radio boxes * add: icon design settings layout * add: position settings layout * add: layout exports * add: alignment matrix and position control components * add: position settings & position settings for mobile layout * fix: formatting and text-domain * update: filter names * fix: hook import * add: set function for settings * add: prop-types package * update: refactor notification component and context * update: remove filter for authorize url * update: imports and exports of hooks * update: plugin settings context filename and relevant imports * update: icons and icon imports * add: sidebar(wip) * update: fix width of connect screen on mobile * update: sidebar layout * Update modules/settings/assets/js/components/color-picker/style.css Co-authored-by: Raz Ohad * update: color picker class name * add: credit card and user arrow icons * update: hidden wpfooter and fixed sidebar height * update: sidebar layout * add: basic page layouts * update: sidebar layout * add: sidebar menu, sidebar app bar and my account menu components * update: add sidebar and menu settings * update: add page layouts * update: admin top bar * add: bottom bar * add: bottom bar and top bar * add: bottom bar and top bar * update: page content styling * fix: styling * fix: styling * update: text domain * add: props to wrapper * add: icon design and position setting layouts * add: in page scroll behaviour to the settings * add: widget icons and getter function * update: icon design settings getter and setter functions * update: imports * add: mobile layout for position settings * add: icon position settings * add: icon position settings hooks and handlers * fix: alignment of controls in AlignmentMatrixControl * update: useSettings and usePositionSetting hooks and relevant functions * fix: colors of AlignmentMatrixControl * fix: styling of components and layouts * add: aliases * add: container wrapper to page * update: accessibility options rendering logic * fix: order of the icons * add: aliases for components and hooks imports * fix: styling of settings panel * fix: container height for settings page * update: toggle control states * add: widget icon settings * add: load saved widget icon settings * update: move layout to page for different designs per page * update: add changes tracking and disable button logic * add: async/await to save settings * update: convert options to array of objects * Update modules/settings/assets/js/components/bottom-bar/index.js Co-authored-by: VasylD * Update modules/settings/assets/js/app.js Co-authored-by: VasylD * fix: remove duplicate entries --------- Co-authored-by: Ohad Co-authored-by: Raz Ohad Co-authored-by: VasylD --- .eslintrc | 20 ++-- modules/settings/assets/css/style.css | 2 +- modules/settings/assets/js/app.js | 13 +-- .../js/components/admin-top-bar/index.js | 4 +- .../alignment-matrix-control/index.js | 97 +++++++++++-------- .../assets/js/components/bottom-bar/index.js | 38 +++++++- .../js/components/color-picker/index.js | 19 ++-- .../js/components/color-picker/style.css | 2 +- .../assets/js/components/icon-select/index.js | 60 +++--------- .../assets/js/components/icon-size/index.js | 53 ++++------ .../settings/assets/js/components/index.js | 6 +- .../js/components/position-control/index.js | 49 +++++++--- .../js/components/sidebar-menu/index.js | 10 +- .../assets/js/components/sidebar-menu/menu.js | 2 +- .../js/contexts/plugin-settings-context.js | 50 ---------- .../assets/js/contexts/plugin-settings.js | 2 +- .../js/helpers/accessibility-options.js | 44 +++++++++ modules/settings/assets/js/hooks/index.js | 3 + .../assets/js/hooks/use-icon-design.js | 16 +++ .../assets/js/hooks/use-icon-positioon.js | 40 ++++++++ .../assets/js/hooks/use-saved-settings.js | 30 ++++++ .../settings/assets/js/hooks/use-settings.js | 62 ++++++++++++ .../assets/js/layouts/icon-design-settings.js | 4 +- modules/settings/assets/js/layouts/index.js | 1 + .../js/layouts/position-settings-desktop.js | 75 +++++++++----- .../js/layouts/position-settings-mobile.js | 80 +++++++++++++++ .../assets/js/layouts/position-settings.js | 17 ++-- .../settings/assets/js/pages/icon-settings.js | 19 +++- modules/settings/module.php | 49 +++++++--- package-lock.json | 1 + 30 files changed, 600 insertions(+), 268 deletions(-) create mode 100644 modules/settings/assets/js/helpers/accessibility-options.js create mode 100644 modules/settings/assets/js/hooks/use-icon-design.js create mode 100644 modules/settings/assets/js/hooks/use-icon-positioon.js create mode 100644 modules/settings/assets/js/hooks/use-saved-settings.js create mode 100644 modules/settings/assets/js/layouts/position-settings-mobile.js diff --git a/.eslintrc b/.eslintrc index 3f69276d..59bbe1a0 100644 --- a/.eslintrc +++ b/.eslintrc @@ -10,16 +10,6 @@ "babel", "react" ], - "settings": { - "import/resolver": { - "node": { - "paths": ["node_modules"] - }, - "webpack": { - "config": "webpack.config.js" - } - } - }, "env": { "browser": true, "node": true, @@ -62,5 +52,15 @@ "count": 1 }] }, + "settings": { + "import/resolver": { + "node": { + "paths": ["node_modules"] + }, + "webpack": { + "config": "webpack.config.js" + } + } + }, "parser": "@babel/eslint-parser" } diff --git a/modules/settings/assets/css/style.css b/modules/settings/assets/css/style.css index 8fa3d9b6..724999ce 100644 --- a/modules/settings/assets/css/style.css +++ b/modules/settings/assets/css/style.css @@ -15,7 +15,7 @@ html:not([dir='rtl']) #ea11y-app { html[dir='rtl'] #ea11y-app { margin-right: -20px; background: white; - height: calc(100vh - 32px); + height: calc( 100vh - 32px ); } #ea11y-app * { diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js index 9a6cad78..502d8024 100644 --- a/modules/settings/assets/js/app.js +++ b/modules/settings/assets/js/app.js @@ -8,13 +8,17 @@ import { Notifications, MenuItems, AdminTopBar, - BottomBar, } from '@ea11y/components'; -import { useNotificationSettings, useSettings } from '@ea11y/hooks'; +import { + useNotificationSettings, + useSettings, + useSavedSettings, +} from '@ea11y/hooks'; import { usePluginSettingsContext } from './contexts/plugin-settings'; import { Sidebar } from './layouts/sidebar'; const App = () => { + useSavedSettings(); const { isConnected } = usePluginSettingsContext(); const { notificationMessage, notificationType } = useNotificationSettings(); const { selectedMenu } = useSettings(); @@ -37,10 +41,7 @@ const App = () => { justifyContent="space-between" > - - {selectedChild ? selectedChild.page : selectedParent?.page} - - + {selectedChild ? selectedChild.page : selectedParent?.page}
diff --git a/modules/settings/assets/js/components/admin-top-bar/index.js b/modules/settings/assets/js/components/admin-top-bar/index.js index ff926716..b92cfd81 100644 --- a/modules/settings/assets/js/components/admin-top-bar/index.js +++ b/modules/settings/assets/js/components/admin-top-bar/index.js @@ -5,7 +5,7 @@ import Toolbar from '@elementor/ui/Toolbar'; import { __ } from '@wordpress/i18n'; import { HELP_LINK } from '../../constants'; -export const AdminTopBar = () => { +const AdminTopBar = () => { const toolBarStyle = { justifyContent: 'end', alignItems: 'center', @@ -30,3 +30,5 @@ export const AdminTopBar = () => { ); }; + +export default AdminTopBar; diff --git a/modules/settings/assets/js/components/alignment-matrix-control/index.js b/modules/settings/assets/js/components/alignment-matrix-control/index.js index feecb05a..7186ccf9 100644 --- a/modules/settings/assets/js/components/alignment-matrix-control/index.js +++ b/modules/settings/assets/js/components/alignment-matrix-control/index.js @@ -2,68 +2,89 @@ import Box from '@elementor/ui/Box'; import FormControl from '@elementor/ui/FormControl'; import FormControlLabel from '@elementor/ui/FormControlLabel'; import FormLabel from '@elementor/ui/FormLabel'; +import Paper from '@elementor/ui/Paper'; import Radio from '@elementor/ui/Radio'; import RadioGroup from '@elementor/ui/RadioGroup'; +import Tooltip from '@elementor/ui/Tooltip'; import Typography from '@elementor/ui/Typography'; -import { useState } from '@wordpress/element'; +import { useIconPosition } from '@ea11y/hooks'; import { __ } from '@wordpress/i18n'; -const AlignmentMatrixControl = () => { - const [selectedValue, setSelectedValue] = useState('center-right'); +const AlignmentMatrixControl = ({ mode }) => { + const { iconPosition, updateIconPosition } = useIconPosition(); const handleChange = (event) => { - setSelectedValue(event.target.value); + updateIconPosition(mode, 'position', event.target.value); }; + // Define options based on the mode const options = [ { value: 'top-left', label: __('Top Left', 'pojo-accessibility') }, + ...(mode === 'desktop' + ? [{ value: 'top-center', label: __('Top Center', 'pojo-accessibility') }] + : []), { value: 'top-right', label: __('Top Right', 'pojo-accessibility') }, { value: 'center-left', label: __('Center Left', 'pojo-accessibility') }, + ...(mode === 'desktop' ? [{ value: 'empty' }] : []), { value: 'center-right', label: __('Center Right', 'pojo-accessibility') }, { value: 'bottom-left', label: __('Bottom Left', 'pojo-accessibility') }, + ...(mode === 'desktop' + ? [ + { + value: 'bottom-center', + label: __('Bottom Center', 'pojo-accessibility'), + }, + ] + : []), { value: 'bottom-right', label: __('Bottom Right', 'pojo-accessibility') }, ]; return ( - + {__('Default Position', 'pojo-accessibility')} - - - {options.map((option, i) => ( - } - /> - ))} - - + + + + + {options.map((option) => + 'empty' === option.value ? ( + + ) : ( + + } + /> + + ), + )} + + + + ); }; diff --git a/modules/settings/assets/js/components/bottom-bar/index.js b/modules/settings/assets/js/components/bottom-bar/index.js index 95cca683..02ad0521 100644 --- a/modules/settings/assets/js/components/bottom-bar/index.js +++ b/modules/settings/assets/js/components/bottom-bar/index.js @@ -1,8 +1,35 @@ import Box from '@elementor/ui/Box'; import Button from '@elementor/ui/Button'; +import { useSettings, useStorage, useToastNotification } from '@ea11y/hooks'; import { __ } from '@wordpress/i18n'; -export const BottomBar = () => { +const BottomBar = () => { + const { selectedMenu, iconDesign, iconPosition, hasChanges, setHasChanges } = + useSettings(); + const { save } = useStorage(); + const { success, error } = useToastNotification(); + + const saveSettings = async () => { + if ( + selectedMenu.parent === 'widget' && + selectedMenu.child === 'iconSettings' + ) { + try { + await save({ + a11y_widget_icon_settings: { + style: iconDesign, + position: iconPosition, + }, + }); + + success('Settings saved!'); + setHasChanges(false); + } catch (e) { + error('Failed to save settings!'); + } + } + }; + return ( { width="100%" borderTop="1px solid rgba(0, 0, 0, 0.12)" > - ); }; + +export default BottomBar; diff --git a/modules/settings/assets/js/components/color-picker/index.js b/modules/settings/assets/js/components/color-picker/index.js index beecd7a0..dcb502dd 100644 --- a/modules/settings/assets/js/components/color-picker/index.js +++ b/modules/settings/assets/js/components/color-picker/index.js @@ -4,37 +4,36 @@ import FormLabel from '@elementor/ui/FormLabel'; import Grid from '@elementor/ui/Grid'; import Typography from '@elementor/ui/Typography'; import { HexColorPicker, HexColorInput } from 'react-colorful'; -import { useState } from '@wordpress/element'; +import { useIconDesign } from '@ea11y/hooks'; import { __ } from '@wordpress/i18n'; import './style.css'; const ColorPicker = () => { - const [color, setColor] = useState('#2563eb'); + const { iconDesign, updateIconDesign } = useIconDesign(); return ( - + - + {__('Color', 'pojo-accessibility')} updateIconDesign({ color: value })} className="widget-settings-color-picker" /> updateIconDesign({ color: value })} style={{ width: '100%', border: '1px solid rgba(0, 0, 0, 0.12)', diff --git a/modules/settings/assets/js/components/color-picker/style.css b/modules/settings/assets/js/components/color-picker/style.css index 3025ab64..05d57330 100644 --- a/modules/settings/assets/js/components/color-picker/style.css +++ b/modules/settings/assets/js/components/color-picker/style.css @@ -1,5 +1,5 @@ .widget-settings-color-picker.react-colorful { - min-width: 460px; + width: 100%; } .widget-settings-color-picker .react-colorful__saturation { border-radius: 0; diff --git a/modules/settings/assets/js/components/icon-select/index.js b/modules/settings/assets/js/components/icon-select/index.js index bf8db607..a025019d 100644 --- a/modules/settings/assets/js/components/icon-select/index.js +++ b/modules/settings/assets/js/components/icon-select/index.js @@ -4,44 +4,13 @@ import Paper from '@elementor/ui/Paper'; import Radio from '@elementor/ui/Radio'; import RadioGroup from '@elementor/ui/RadioGroup'; import Typography from '@elementor/ui/Typography'; -import { - AccessibilityControlsIcon, - AccessibilityEyeIcon, - AccessibilityPersonIcon, - AccessibilityTextIcon, -} from '@ea11y/icons'; -import { useState } from '@wordpress/element'; +import { useIconDesign } from '@ea11y/hooks'; +import { cloneElement } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; +import options from '../../helpers/accessibility-options'; const IconSelect = (props) => { - const [selectedValue, setSelectedValue] = useState('person'); - const optionStyle = { - color: 'info.main', - fontSize: 44, - }; - - const options = [ - { - value: 'person', - icon: , - label: __('Accessibility Person Icon', 'pojo-accessibility'), - }, - { - value: 'eye', - icon: , - label: __('Accessibility Eye Icon', 'pojo-accessibility'), - }, - { - value: 'text', - icon: , - label: __('Accessibility Text Badge Icon', 'pojo-accessibility'), - }, - { - value: 'controls', - icon: , - label: __('Accessibility Controls Slider Icon', 'pojo-accessibility'), - }, - ]; + const { iconDesign, updateIconDesign } = useIconDesign(); return ( @@ -54,10 +23,11 @@ const IconSelect = (props) => { {...props} aria-labelledby="icon-select-radio-buttons-group-label" name="icon-select-radio-buttons-group" - value={selectedValue} + value={iconDesign.icon} sx={{ display: 'flex', flexDirection: 'row', + flexWrap: 'nowrap', gap: 2, }} > @@ -65,7 +35,7 @@ const IconSelect = (props) => { setSelectedValue(option.value)} + onClick={() => updateIconDesign({ icon: option.value })} sx={{ borderRadius: 'md', boxShadow: 'sm', @@ -76,21 +46,21 @@ const IconSelect = (props) => { justifyContent: 'center', gap: 1.5, p: 2, - minWidth: 100, + minWidth: 10, minHeight: 100, borderColor: - selectedValue === option.value ? 'info.main' : 'divider', - borderWidth: selectedValue === option.value ? 2 : 1, + iconDesign.icon === option.value ? 'info.main' : 'divider', + borderWidth: iconDesign.icon === option.value ? 2 : 1, cursor: 'pointer', }} > - {option.icon} + {option.icon && + cloneElement(option.icon, { + sx: { color: iconDesign.color, fontSize: 44 }, + })} ))} diff --git a/modules/settings/assets/js/components/icon-size/index.js b/modules/settings/assets/js/components/icon-size/index.js index b5096849..b5b77092 100644 --- a/modules/settings/assets/js/components/icon-size/index.js +++ b/modules/settings/assets/js/components/icon-size/index.js @@ -4,48 +4,32 @@ import Paper from '@elementor/ui/Paper'; import Radio from '@elementor/ui/Radio'; import RadioGroup from '@elementor/ui/RadioGroup'; import Typography from '@elementor/ui/Typography'; -import { - AccessibilityEyeIcon, - AccessibilityPersonIcon, - AccessibilityTextIcon, -} from '@ea11y/icons'; -import { useState } from '@wordpress/element'; +import { useIconDesign } from '@ea11y/hooks'; +import { cloneElement } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; +import { getOptionByValue } from '../../helpers/accessibility-options'; const IconSize = (props) => { - const [selectedValue, setSelectedValue] = useState('medium'); - const optionStyle = { color: 'info.main', fontSize: 44 }; + const { iconDesign, updateIconDesign } = useIconDesign(); + const icon = getOptionByValue(iconDesign.icon); const options = [ - { - value: 'small', - icon: , - label: __('Accessibility Person Icon', 'pojo-accessibility'), - }, - { - value: 'medium', - icon: , - label: __('Accessibility Eye Icon', 'pojo-accessibility'), - }, - { - value: 'large', - icon: , - label: __('Accessibility Text Badge Icon', 'pojo-accessibility'), - }, + { value: 'large', fontSize: 64 }, + { value: 'medium', fontSize: 44 }, + { value: 'small', fontSize: 36 }, ]; - return ( - + {__('Size', 'pojo-accessibility')} { setSelectedValue(option.value)} + onClick={() => updateIconDesign({ size: option.value })} sx={{ borderRadius: 'md', boxShadow: 'sm', @@ -67,15 +51,18 @@ const IconSize = (props) => { flexGrow: 1, gap: 1.5, p: 2, - minWidth: 100, + minWidth: 10, minHeight: 100, borderColor: - selectedValue === option.value ? 'info.main' : 'divider', - borderWidth: selectedValue === option.value ? 2 : 1, + iconDesign.size === option.value ? 'info.main' : 'divider', + borderWidth: iconDesign.size === option.value ? 2 : 1, cursor: 'pointer', }} > - {option.icon} + {icon?.icon && + cloneElement(icon.icon, { + sx: { color: iconDesign.color, fontSize: option.fontSize }, + })} ({ }, })); -const PositionControl = ({ type, disabled }, props) => { +const PositionControl = ({ type, disabled, mode }) => { + const { iconPosition, updateExactPosition } = useIconPosition(); const [unitsIndex, setUnitsIndex] = useState(0); const popupState = usePopupState({ variant: 'popover', - popupId: 'textfield-inner-selection', + popupId: 'position-settings', }); const handleMenuItemClick = (index) => { setUnitsIndex(index); + updateExactPosition( + mode, + type, + iconPosition[mode].exactPosition[type].direction, + iconPosition[mode].exactPosition[type].value, + units[index], + ); popupState.close(); }; - - const [position, setPosition] = useState(10); - const handlePositionChange = (event) => setPosition(event.target.value); - + const handlePositionChange = (event) => { + updateExactPosition( + mode, + type, + iconPosition[mode].exactPosition[type].direction, + event.target.value, + iconPosition[mode].exactPosition[type].unit, + ); + }; + const handlePositionDirection = (event) => { + updateExactPosition( + mode, + type, + event.target.value, + iconPosition[mode].exactPosition[type].value, + iconPosition[mode].exactPosition[type].unit, + ); + }; return ( { color="inherit" sx={{ font: 'inherit', minWidth: 'initial' }} {...bindTrigger(popupState)} + disabled={disabled} > {units[unitsIndex]} - {units.map((unit, index) => ( { }} /> changePage(e.target.value)} + value={accessibilityStatementData?.pageId} + error={!isValidPage} + color="info" + fullWidth + > + {pages?.hasResolved && pages?.records.length > 0 ? ( + pages?.records.map((page) => ( + + {page.title.rendered} + + )) + ) : ( + + {__('No pages found', 'pojo-accessibility')} + + )} + + {accessibilityStatementData?.link && ( + + )} + + {!isValidPage && ( + + {__('Please select a page', 'pojo-accessibility')} + + )} + + + + + {__('Want to hide the link?', 'pojo-accessibility')} + + + + } + sx={{ marginBottom: 3, alignSelf: 'start', ml: 0 }} + onChange={() => { + setAccessibilityStatementData({ + ...accessibilityStatementData, + hideLink: !accessibilityStatementData.hideLink, + }); + }} + checked={accessibilityStatementData?.hideLink} + /> + + + + + + + + + + + + ); +}; + +export default StatementLink; diff --git a/modules/settings/assets/js/layouts/widget-preview.js b/modules/settings/assets/js/layouts/widget-preview.js index 039f2eb2..5f35967d 100644 --- a/modules/settings/assets/js/layouts/widget-preview.js +++ b/modules/settings/assets/js/layouts/widget-preview.js @@ -1,20 +1,10 @@ import Card from '@elementor/ui/Card'; import CardContent from '@elementor/ui/CardContent'; import CardHeader from '@elementor/ui/CardHeader'; -import { DynamicScriptLoader } from '@ea11y/components'; -import { useSettings } from '@ea11y/hooks'; +import { WidgetLoader } from '@ea11y/components'; import { __ } from '@wordpress/i18n'; -import { WIDGET_URL } from '../constants'; const WidgetPreview = () => { - const { planData } = useSettings(); - const handleScriptLoad = () => { - console.log('External script loaded!'); - }; - - const handleScriptError = () => { - console.error('Failed to load the external script.'); - }; return ( <> @@ -27,14 +17,16 @@ const WidgetPreview = () => { /> - + ); }; diff --git a/modules/settings/assets/js/pages/accessibility-statement.js b/modules/settings/assets/js/pages/accessibility-statement.js index 74e9447c..0c600a5f 100644 --- a/modules/settings/assets/js/pages/accessibility-statement.js +++ b/modules/settings/assets/js/pages/accessibility-statement.js @@ -1,62 +1,210 @@ +import Box from '@elementor/ui/Box'; +import Button from '@elementor/ui/Button'; import Container from '@elementor/ui/Container'; import FormControl from '@elementor/ui/FormControl'; -import FormControlLabel from '@elementor/ui/FormControlLabel'; +import FormLabel from '@elementor/ui/FormLabel'; +import Paper from '@elementor/ui/Paper'; import Radio from '@elementor/ui/Radio'; import RadioGroup from '@elementor/ui/RadioGroup'; import Typography from '@elementor/ui/Typography'; -import { BottomBar } from '@ea11y/components'; +import { styled } from '@elementor/ui/styles'; +import { StatementGenerator } from '@ea11y/components'; +import { useModal, useSettings } from '@ea11y/hooks'; +import { + AccessibilityStatementExistingIcon, + AccessibilityStatementCreateIcon, +} from '@ea11y/icons'; +import { StatementLink } from '@ea11y/layouts'; +import { useEffect, useState } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; +const StyledPaper = styled(Paper)` + display: flex; + flex-direction: column; + flex-grow: 8px; + align-items: center; + justify-content: center; + padding: 24px; + width: 500px; + min-height: 169px; + border-radius: ${({ theme }) => theme.shape.borderRadius}; + box-shadow: ${({ theme }) => theme.shadows[0]}; + cursor: pointer; + :hover { + box-shadow: 0px 0px 15px 0px rgba(37, 99, 235, 0.15); + border-color: ${({ theme }) => theme.palette.info.main}; + } +`; + const AccessibilityStatement = () => { + const { accessibilityStatementData } = useSettings(); + const { isOpen, open, close } = useModal(false); + const [continueDisabled, setContinueDisabled] = useState(true); + // Store statement option - generate or existing + const [statementOption, setStatementOption] = useState(''); + const [showStatementLink, setShowStatementLink] = useState(false); + + useEffect(() => { + setContinueDisabled(false); + }, [statementOption]); + + useEffect(() => { + setContinueDisabled(true); + }, []); + + const handleContinue = () => { + if (statementOption === 'generate') { + open(); + setContinueDisabled(true); + } else if (statementOption === 'existing') { + setShowStatementLink(true); + } + }; + return ( <> - - - {__('Accessibility statement', 'pojo-accessibility')} - - + - {__( - 'An accessibility statement showcases your efforts to create an inclusive online space, highlighting helpful features and a commitment to accessibility. Learn more', - 'pojo-accessibility', + + {__('Accessibility statement', 'pojo-accessibility')} + + + {__( + 'An accessibility statement showcases your efforts to create an inclusive online space, highlighting helpful features and a commitment to accessibility. Learn more', + 'pojo-accessibility', + )} + + {!accessibilityStatementData?.pageId && !showStatementLink && ( + <> + + + + {__( + 'Need an accessibility statement?', + 'pojo-accessibility', + )} + + + {__( + 'You can have a statement created for you or use what you already have.', + 'pojo-accessibility', + )} + + + + { + setStatementOption('generate'); + }} + sx={{ + borderColor: + statementOption === 'generate' + ? 'info.main' + : 'divider', + borderWidth: statementOption === 'generate' ? 2 : 1, + }} + > + + + {__('Yes, I need one', 'pojo-accessibility')} + + + + setStatementOption('existing')} + sx={{ + borderColor: + statementOption === 'existing' + ? 'info.main' + : 'divider', + borderWidth: statementOption === 'existing' ? 2 : 1, + }} + > + + + {__('No, I already have one', 'pojo-accessibility')} + + + + + + )} - - - {__( - 'Already have an accessibile statement page?', - 'pojo-accessibility', + {(accessibilityStatementData?.pageId || showStatementLink) && ( + )} - - - + {!accessibilityStatementData?.pageId && !showStatementLink && ( + - } - label={__('No, I do not have one', 'pojo-accessibility')} - value={false} - /> - } - label={__('Yes', 'pojo-accessibility')} - value={true} - /> - - - - + + + )} + + ); }; diff --git a/modules/settings/assets/js/pages/icon-settings.js b/modules/settings/assets/js/pages/icon-settings.js index fe2e143d..5601cd0c 100644 --- a/modules/settings/assets/js/pages/icon-settings.js +++ b/modules/settings/assets/js/pages/icon-settings.js @@ -9,7 +9,7 @@ const IconSettings = () => { <> - {__('Design & position', 'pojo-accessibility')} + {__('Button', 'pojo-accessibility')} diff --git a/modules/settings/assets/js/pages/menu.js b/modules/settings/assets/js/pages/menu.js index 9cf46006..6e869688 100644 --- a/modules/settings/assets/js/pages/menu.js +++ b/modules/settings/assets/js/pages/menu.js @@ -8,7 +8,7 @@ const Menu = () => { return ( - {__('Feature management', 'pojo-accessibility')} + {__('Capabilities', 'pojo-accessibility')} diff --git a/modules/settings/module.php b/modules/settings/module.php index 58b8960f..a67bcae5 100644 --- a/modules/settings/module.php +++ b/modules/settings/module.php @@ -19,7 +19,7 @@ class Module extends Module_Base { const SETTING_PREFIX = 'ea11y_'; const SETTING_GROUP = 'ea11y_settings'; - const SETTING_BASE_SLUG = 'accessibility-settings-2'; //TODO: Change this later + const SETTING_BASE_SLUG = 'accessibility-settings'; //TODO: Change this later const SETTING_CAPABILITY = 'manage_options'; const SETTING_PAGE_SLUG = 'toplevel_page_' . self::SETTING_BASE_SLUG; @@ -46,8 +46,8 @@ public function render_app() { public function register_page() : void { add_menu_page( - __( 'Accessibility New', 'pojo-accessibility' ), //TODO: Change this later - __( 'Accessibility New', 'pojo-accessibility' ), + __( 'Equally', 'pojo-accessibility' ), //TODO: Change this later + __( 'Equally', 'pojo-accessibility' ), self::SETTING_CAPABILITY, self::SETTING_BASE_SLUG, [ $this, 'render_app' ], @@ -287,6 +287,15 @@ public function register_settings(): void { ], ], ], + 'accessibility_statement_data' => [ + 'type' => 'object', + 'show_in_rest' => [ + 'schema' => [ + 'type' => 'object', + 'additionalProperties' => true, + ], + ], + ], 'close_post_connect_modal' => [ 'type' => 'boolean', ], diff --git a/modules/widget/module.php b/modules/widget/module.php index 8eda063c..84c74f59 100644 --- a/modules/widget/module.php +++ b/modules/widget/module.php @@ -50,6 +50,7 @@ public function enqueue_accessibility_widget () : void { [ 'iconSettings' => get_option( 'ea11y_widget_icon_settings' ), 'toolsSettings' => get_option( 'ea11y_widget_menu_settings' ), + 'accessibilityStatementURL' => $this->get_accessibility_statement_url(), 'widgetIconURL' => $this->get_widget_icon_url(), ] ); @@ -83,6 +84,18 @@ public function get_widget_icon_url() : string { return EA11Y_ASSETS_URL . 'images/widget-icon-' . $slug . '.svg'; } + /** + * Get accessibility statement URL + * @return string + */ + public function get_accessibility_statement_url() : string { + $option = get_option( 'ea11y_accessibility_statement_data' ); + if ( ! empty( $option ) && ! $option['hideLink'] ) { + return $option['link']; + } + return ''; + } + /** * Load scripts in admin * @param $hook @@ -122,6 +135,7 @@ public function enqueue_accessibility_widget_admin ( $hook ) : void { 'previewContainer' => '#ea11y-widget-preview--container', 'apiKey' => $plan_data->public_api_key, 'widgetIconURL' => $this->get_widget_icon_url(), + 'accessibilityStatementURL' => $this->get_accessibility_statement_url(), ] ); } diff --git a/package-lock.json b/package-lock.json index 285cff0c..8b0c985d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,8 @@ "@wordpress/element": "^6.10.0", "@wordpress/i18n": "^5.10.0", "@wordpress/url": "^4.10.0", + "clipboard-copy": "^4.0.1", + "html-react-parser": "^5.2.2", "husky": "^9.1.6", "prop-types": "^15.8.1", "react-colorful": "^5.6.1" @@ -8878,6 +8880,26 @@ "tiny-emitter": "^2.0.0" } }, + "node_modules/clipboard-copy": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clipboard-copy/-/clipboard-copy-4.0.1.tgz", + "integrity": "sha512-wOlqdqziE/NNTUJsfSgXmBMIrYmfd5V0HCGsR8uAKHcg+h9NENWINcfRjtWGU77wDHC8B8ijV4hMTGYbrKovng==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -10250,7 +10272,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -10264,7 +10285,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, "funding": [ { "type": "github", @@ -10289,7 +10309,6 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, "dependencies": { "domelementtype": "^2.3.0" }, @@ -10301,10 +10320,10 @@ } }, "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dev": true, + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.1.tgz", + "integrity": "sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==", + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -10436,7 +10455,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, "engines": { "node": ">=0.12" }, @@ -13064,6 +13082,16 @@ "resolved": "https://registry.npmjs.org/hpq/-/hpq-1.4.0.tgz", "integrity": "sha512-ycJQMRaRPBcfnoT1gS5I1XCvbbw9KO94Y0vkwksuOjcJMqNZtb03MF2tCItLI2mQbkZWSSeFinoRDPmjzv4tKg==" }, + "node_modules/html-dom-parser": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-5.0.13.tgz", + "integrity": "sha512-B7JonBuAfG32I7fDouUQEogBrz3jK9gAuN1r1AaXpED6dIhtg/JwiSRhjGL7aOJwRz3HU4efowCjQBaoXiREqg==", + "license": "MIT", + "dependencies": { + "domhandler": "5.0.3", + "htmlparser2": "10.0.0" + } + }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", @@ -13098,6 +13126,27 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "node_modules/html-react-parser": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-5.2.2.tgz", + "integrity": "sha512-yA5012CJGSFWYZsgYzfr6HXJgDap38/AEP4ra8Cw+WHIi2ZRDXRX/QVYdumRf1P8zKyScKd6YOrWYvVEiPfGKg==", + "license": "MIT", + "dependencies": { + "domhandler": "5.0.3", + "html-dom-parser": "5.0.13", + "react-property": "2.0.2", + "style-to-js": "1.1.16" + }, + "peerDependencies": { + "@types/react": "0.14 || 15 || 16 || 17 || 18 || 19", + "react": "0.14 || 15 || 16 || 17 || 18 || 19" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/html-tags": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", @@ -13110,6 +13159,37 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", + "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -13451,6 +13531,12 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, + "node_modules/inline-style-parser": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "license": "MIT" + }, "node_modules/inquirer": { "version": "7.3.3", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", @@ -18657,6 +18743,12 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, + "node_modules/react-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.2.tgz", + "integrity": "sha512-+PbtI3VuDV0l6CleQMsx2gtK0JZbZKbpdu5ynr+lbsuvtmgbNcS3VM0tuY2QjFNOcWxvXeHjDpy42RO+4U2rug==", + "license": "MIT" + }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", @@ -20742,6 +20834,24 @@ "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", "dev": true }, + "node_modules/style-to-js": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.16.tgz", + "integrity": "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.8" + } + }, + "node_modules/style-to-object": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", + "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.4" + } + }, "node_modules/stylehacks": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", diff --git a/package.json b/package.json index 76a143e7..924ed2b2 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "prepare": "husky install", "local:start": "wp-env start", "local:stop": "wp-env stop", - "local:quick-run": "npx @wp-now/wp-now start", + "local:quick-run": "npx @wp-now/wp-now start", "local:composer:dev": "wp-env run cli --env-cwd=wp-content/plugins/one-click-accessibility composer install", "local:composer:build": "wp-env run cli --env-cwd=wp-content/plugins/one-click-accessibility composer install --no-dev", "local:wp-cli": "wp-env run cli --env-cwd=wp-content/plugins/one-click-accessibility wp", @@ -27,8 +27,8 @@ "@wordpress/eslint-plugin": "^21.3.0", "@wordpress/scripts": "^30.3.0", "eslint": "^8.57.1", - "eslint-import-resolver-webpack": "^0.13.9", "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-webpack": "^0.13.9", "eslint-plugin-babel": "^5.3.1", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.1", @@ -47,6 +47,8 @@ "@wordpress/element": "^6.10.0", "@wordpress/i18n": "^5.10.0", "@wordpress/url": "^4.10.0", + "clipboard-copy": "^4.0.1", + "html-react-parser": "^5.2.2", "husky": "^9.1.6", "prop-types": "^15.8.1", "react-colorful": "^5.6.1" From 89c6e541333f9b2a2eef285389cf82435a322197 Mon Sep 17 00:00:00 2001 From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com> Date: Tue, 14 Jan 2025 05:05:44 +0530 Subject: [PATCH 025/292] [APP-908] Additional fixes (#133) * fix: text domains * updated: styled component syntax * update: use await instead of then * fix: prevent application crash in case widget fails to load * add: generated info tip card * update: refactor function --- .../assets/js/components/copy-link/index.js | 6 +- .../generated-page-infotip-card/index.js | 44 ++++++++++ .../settings/assets/js/components/index.js | 1 + .../components/statement-generator/index.js | 80 ++++++++++--------- .../assets/js/helpers/statement-generator.js | 4 +- .../assets/js/hooks/use-saved-settings.js | 6 ++ .../settings/assets/js/hooks/use-settings.js | 7 ++ .../assets/js/layouts/menu-settings.js | 4 +- .../assets/js/layouts/statement-link.js | 58 +++++++++----- modules/settings/module.php | 3 + 10 files changed, 150 insertions(+), 63 deletions(-) create mode 100644 modules/settings/assets/js/components/generated-page-infotip-card/index.js diff --git a/modules/settings/assets/js/components/copy-link/index.js b/modules/settings/assets/js/components/copy-link/index.js index c078436d..d0138955 100644 --- a/modules/settings/assets/js/components/copy-link/index.js +++ b/modules/settings/assets/js/components/copy-link/index.js @@ -28,7 +28,11 @@ const CopyLink = ({ content }) => { open={open} onClose={handleClose} onOpen={handleOpen} - title={copied ? __('Copied!', 'site-mailer') : __('Copy', 'site-mailer')} + title={ + copied + ? __('Copied!', 'pojo-accessibility') + : __('Copy', 'pojo-accessibility') + } arrow={false} PopperProps={{ modifiers: [ diff --git a/modules/settings/assets/js/components/generated-page-infotip-card/index.js b/modules/settings/assets/js/components/generated-page-infotip-card/index.js new file mode 100644 index 00000000..f4b8ee27 --- /dev/null +++ b/modules/settings/assets/js/components/generated-page-infotip-card/index.js @@ -0,0 +1,44 @@ +import Button from '@elementor/ui/Button'; +import Card from '@elementor/ui/Card'; +import CardActions from '@elementor/ui/CardActions'; +import CardContent from '@elementor/ui/CardContent'; +import CardHeader from '@elementor/ui/CardHeader'; +import Typography from '@elementor/ui/Typography'; +import { useSettings, useStorage } from '@ea11y/hooks'; +import { __ } from '@wordpress/i18n'; + +const GeneratedPageInfoTipCard = () => { + const { setShowAccessibilityGeneratedInfotip } = useSettings(); + const { save } = useStorage(); + const dismissNotice = async () => { + setShowAccessibilityGeneratedInfotip(false); + await save({ + ea11y_show_accessibility_generated_page_infotip: false, + }); + }; + return ( + + + + + {__( + 'The accessibility statement page you generated is already linked to the widget.', + 'pojo-accessibility', + )} + + + + + + + ); +}; + +export default GeneratedPageInfoTipCard; diff --git a/modules/settings/assets/js/components/index.js b/modules/settings/assets/js/components/index.js index d11a3b0c..d7134f21 100644 --- a/modules/settings/assets/js/components/index.js +++ b/modules/settings/assets/js/components/index.js @@ -17,3 +17,4 @@ export { default as AlertError } from './error'; export { default as HtmlToTypography } from './html-to-typography'; export { default as WidgetLoader } from './widget-loader'; export { default as CopyLink } from './copy-link'; +export { default as GeneratedPageInfoTipCard } from './generated-page-infotip-card'; diff --git a/modules/settings/assets/js/components/statement-generator/index.js b/modules/settings/assets/js/components/statement-generator/index.js index 457298c9..0e1cf2aa 100644 --- a/modules/settings/assets/js/components/statement-generator/index.js +++ b/modules/settings/assets/js/components/statement-generator/index.js @@ -26,22 +26,22 @@ import { } from '../../helpers/statement-generator'; // Customization for the WP admin global CSS. -const StyledTextField = styled(TextField)(() => ({ - width: '100%', - marginTop: 8, - '.wp-admin & .MuiInputBase-input, & .MuiInputBase-input:focus': { - backgroundColor: 'initial', - boxShadow: 'none', - border: 0, - color: 'inherit', - outline: 0, - padding: '16.5px 14px 16.5px 14px', - '&.MuiInputBase-inputSizeSmall': { - padding: '8.5px 14px 8.5px 14px', - }, - height: '40px', - }, -})); +const StyledTextField = styled(TextField)` + width: 100%; + .wp-admin & .MuiInputBase-input, + & .MuiInputBase-input:focus { + background-color: initial; + box-shadow: none; + border: 0; + color: inherit; + outline: 0; + padding: 16.5px 14px 16.5px 14px; + &.MuiInputBase-inputSizeSmall { + padding: 8.5px 14px 8.5px 14px; + } + height: 40px; + } +`; const StatementGenerator = ({ open, close }) => { const [isValidName, setValidName] = useState(null); @@ -50,8 +50,12 @@ const StatementGenerator = ({ open, close }) => { const [disableCreateButton, setDisabledCreateButton] = useState(true); const { success, error } = useToastNotification(); - const { companyData, setCompanyData, setAccessibilityStatementData } = - useSettings(); + const { + companyData, + setCompanyData, + setAccessibilityStatementData, + setShowAccessibilityGeneratedInfotip, + } = useSettings(); const { save } = useStorage(); useEffect(() => { @@ -96,36 +100,36 @@ const StatementGenerator = ({ open, close }) => { const createPage = async () => { const parsedContent = parseContent(Statement, companyData); try { - await API.addPage({ + const response = await API.addPage({ title: 'Accessibility statement', content: parsedContent, status: 'publish', - }).then((response) => { - setAccessibilityStatementData({ + }); + await setAccessibilityStatementData({ + statement: parsedContent, + pageId: response.id, + createdOn: response.date, + link: response.link, + }); + await setShowAccessibilityGeneratedInfotip(true); + await save({ + ea11y_accessibility_statement_data: { statement: parsedContent, pageId: response.id, createdOn: response.date, link: response.link, - }); - save({ - ea11y_accessibility_statement_data: { - statement: parsedContent, - pageId: response.id, - createdOn: response.date, - link: response.link, - }, - }); - - // Update accessibility statement URL in the global object. - if (window?.ea11yWidget) { - window.ea11yWidget.accessibilityStatementURL = response.link; - } - close(); - success('Page created'); + }, + ea11y_show_accessibility_generated_page_infotip: true, }); + // Update accessibility statement URL in the global object. + if (window?.ea11yWidget) { + window.ea11yWidget.accessibilityStatementURL = response.link; + } + await close(); + await success('Page created'); } catch (e) { error('Error while creating page'); - console.log(e); + console.error(e); } }; diff --git a/modules/settings/assets/js/helpers/statement-generator.js b/modules/settings/assets/js/helpers/statement-generator.js index 56f3540d..fd802bf7 100644 --- a/modules/settings/assets/js/helpers/statement-generator.js +++ b/modules/settings/assets/js/helpers/statement-generator.js @@ -8,7 +8,9 @@ export const checkEmail = (email) => { }; export const checkDomain = (domain) => { - const domainRegex = /^(https?:\/\/)?([a-zA-Z0-9-_]+\.)+[a-zA-Z]{2,}\/?$/; + // Support IDNs + const domainRegex = + /^(https?:\/\/)?([a-zA-Z0-9\u00A1-\uFFFF-]+\.)+[a-zA-Z\u00A1-\uFFFF]{2,}\/?$/; return domainRegex.test(domain); }; diff --git a/modules/settings/assets/js/hooks/use-saved-settings.js b/modules/settings/assets/js/hooks/use-saved-settings.js index 572aeb96..bdec61cb 100644 --- a/modules/settings/assets/js/hooks/use-saved-settings.js +++ b/modules/settings/assets/js/hooks/use-saved-settings.js @@ -11,6 +11,7 @@ export const useSavedSettings = () => { setIconPosition, setPlanData, setAccessibilityStatementData, + setShowAccessibilityGeneratedInfotip, } = useSettings(); const result = useSelect((select) => { @@ -52,6 +53,11 @@ export const useSavedSettings = () => { result.data.ea11y_accessibility_statement_data, ); } + if (result?.data?.ea11y_show_accessibility_generated_page_infotip) { + setShowAccessibilityGeneratedInfotip( + result.data.ea11y_show_accessibility_generated_page_infotip, + ); + } } }, [result.hasFinishedResolution]); }; diff --git a/modules/settings/assets/js/hooks/use-settings.js b/modules/settings/assets/js/hooks/use-settings.js index bb1fb060..3c75f072 100644 --- a/modules/settings/assets/js/hooks/use-settings.js +++ b/modules/settings/assets/js/hooks/use-settings.js @@ -116,6 +116,11 @@ export const SettingsProvider = ({ children }) => { hideLink: false, }); + const [ + showAccessibilityGeneratedInfotip, + setShowAccessibilityGeneratedInfotip, + ] = useState(false); + return ( { setCompanyData, accessibilityStatementData, setAccessibilityStatementData, + showAccessibilityGeneratedInfotip, + setShowAccessibilityGeneratedInfotip, }} > {children} diff --git a/modules/settings/assets/js/layouts/menu-settings.js b/modules/settings/assets/js/layouts/menu-settings.js index 4e9f853e..06f8091f 100644 --- a/modules/settings/assets/js/layouts/menu-settings.js +++ b/modules/settings/assets/js/layouts/menu-settings.js @@ -57,9 +57,9 @@ const MenuSettings = () => { }; setHasChanges(true); - if (window?.ea11yWidget?.toolsSettings) { + if (window?.ea11yWidget?.toolsSettings && window?.ea11yWidget?.widget) { window.ea11yWidget.toolsSettings = newSettings; - window.ea11yWidget.widget.updateState(); + window?.ea11yWidget?.widget.updateState(); } return newSettings; }); diff --git a/modules/settings/assets/js/layouts/statement-link.js b/modules/settings/assets/js/layouts/statement-link.js index 836996cb..a7d7ce32 100644 --- a/modules/settings/assets/js/layouts/statement-link.js +++ b/modules/settings/assets/js/layouts/statement-link.js @@ -8,11 +8,16 @@ import FormControl from '@elementor/ui/FormControl'; import FormControlLabel from '@elementor/ui/FormControlLabel'; import FormHelperText from '@elementor/ui/FormHelperText'; import FormLabel from '@elementor/ui/FormLabel'; +import Infotip from '@elementor/ui/Infotip'; import MenuItem from '@elementor/ui/MenuItem'; import Select from '@elementor/ui/Select'; import Switch from '@elementor/ui/Switch'; import Typography from '@elementor/ui/Typography'; -import { CopyLink, WidgetLoader } from '@ea11y/components'; +import { + CopyLink, + WidgetLoader, + GeneratedPageInfoTipCard, +} from '@ea11y/components'; import { useSettings, useStorage, useToastNotification } from '@ea11y/hooks'; import { useEntityRecords } from '@wordpress/core-data'; import { useEffect, useState } from '@wordpress/element'; @@ -21,8 +26,11 @@ import { __ } from '@wordpress/i18n'; const StatementLink = () => { const [disabled, setDisabled] = useState(true); const [isValidPage, setIsValidPage] = useState(false); - const { accessibilityStatementData, setAccessibilityStatementData } = - useSettings(); + const { + accessibilityStatementData, + setAccessibilityStatementData, + showAccessibilityGeneratedInfotip, + } = useSettings(); const { save } = useStorage(); const { success, error } = useToastNotification(); const pages = useEntityRecords('postType', 'page', { per_page: -1 }); @@ -104,26 +112,34 @@ const StatementLink = () => { fullWidth alignItems="center" > - changePage(e.target.value)} + value={accessibilityStatementData?.pageId} + error={!isValidPage} + color="info" + fullWidth + > + {pages?.hasResolved && pages?.records.length > 0 ? ( + pages?.records.map((page) => ( + + {page.title.rendered} + + )) + ) : ( + + {__('No pages found', 'pojo-accessibility')} - )) - ) : ( - - {__('No pages found', 'pojo-accessibility')} - - )} - + )} + + {accessibilityStatementData?.link && ( )} diff --git a/modules/settings/module.php b/modules/settings/module.php index a67bcae5..effed830 100644 --- a/modules/settings/module.php +++ b/modules/settings/module.php @@ -302,6 +302,9 @@ public function register_settings(): void { 'hide_minimum_active_options_alert' => [ 'type' => 'boolean', ], + 'show_accessibility_generated_page_infotip' => [ + 'type' => 'boolean', + ], ]; foreach ( $settings as $setting => $args ) { From fd517ffdcb1a527e1c87a33b7facc4431459fb42 Mon Sep 17 00:00:00 2001 From: Pavlo Kniazevych <139438463+pkniazevych@users.noreply.github.com> Date: Thu, 16 Jan 2025 11:32:20 +0200 Subject: [PATCH 026/292] Fix: Fix the QA bugs [n/a] (#135) --- assets/css/admin.css | 5 ++ assets/images/menu-icon.svg | 6 +++ modules/core/module.php | 12 ++++- .../notices/dismissible-deprecated-nag.php | 2 +- modules/settings/assets/css/style.css | 22 +++----- .../assets/js/components/copy-link/index.js | 3 +- .../generated-page-infotip-card/index.js | 9 +++- .../assets/js/components/icon-select/index.js | 6 ++- .../js/components/sidebar-app-bar/index.js | 2 +- .../assets/js/layouts/icon-design-settings.js | 3 ++ .../assets/js/layouts/statement-link.js | 45 ++++++++++++----- .../js/pages/accessibility-statement.js | 50 +++++++++++++++---- modules/settings/assets/js/utils/index.js | 21 ++++++++ modules/settings/module.php | 19 +++++-- 14 files changed, 156 insertions(+), 49 deletions(-) create mode 100644 assets/css/admin.css create mode 100644 assets/images/menu-icon.svg create mode 100644 modules/settings/assets/js/utils/index.js diff --git a/assets/css/admin.css b/assets/css/admin.css new file mode 100644 index 00000000..68566a17 --- /dev/null +++ b/assets/css/admin.css @@ -0,0 +1,5 @@ +#adminmenu .toplevel_page_accessibility-settings .wp-menu-image img { + padding: 5px 0 0; + opacity: 1; + filter: none; +} diff --git a/assets/images/menu-icon.svg b/assets/images/menu-icon.svg new file mode 100644 index 00000000..edd80d77 --- /dev/null +++ b/assets/images/menu-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/modules/core/module.php b/modules/core/module.php index 2d14f9c9..f811aefe 100644 --- a/modules/core/module.php +++ b/modules/core/module.php @@ -55,12 +55,22 @@ public static function is_active() : bool { return true; } + public function enqueue_scripts() : void { + wp_enqueue_style( + 'ea11y-global-style', + EA11Y_ASSETS_URL . 'css/admin.css', + [], + EA11Y_VERSION + ); + } + /** * Module constructor. */ public function __construct() { $this->register_components(); - add_filter( 'plugin_action_links', [ $this, 'add_plugin_links' ], 10, 2 ); + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] ); + add_filter( 'plugin_action_links', [ $this, 'add_plugin_links' ], 10, 2 ); } } diff --git a/modules/legacy/notices/dismissible-deprecated-nag.php b/modules/legacy/notices/dismissible-deprecated-nag.php index a6e55c72..0ed9cb84 100644 --- a/modules/legacy/notices/dismissible-deprecated-nag.php +++ b/modules/legacy/notices/dismissible-deprecated-nag.php @@ -31,7 +31,7 @@ public function content(): string { esc_attr( Upgrade::get_learn_more_link() ), esc_html__( 'Learn more', 'pojo-accessibility' ), esc_attr( Upgrade::get_switch_now_link() ), - esc_html__( 'Switch To Equally', 'pojo-accessibility' ) + esc_html__( 'Switch To Web Accessibility', 'pojo-accessibility' ) ); } diff --git a/modules/settings/assets/css/style.css b/modules/settings/assets/css/style.css index fb455c6d..98716854 100644 --- a/modules/settings/assets/css/style.css +++ b/modules/settings/assets/css/style.css @@ -55,25 +55,15 @@ html[dir='rtl'] #ea11y-app { position: absolute; } -.ea11y-statement--widget-preview .ea11y-widget-container * { - opacity: 0.5; -} - -.ea11y-statement--widget-preview .ea11y-widget-container:before { +.ea11y-statement--widget-preview .ea11y-widget-content::after { content: ''; + position: absolute; top: 0; + right: 0; left: 0; - height: 100%; - width: 100%; - background-color: #eaf4ff; - opacity: 0.1; - z-index: 0; - box-sizing: border-box; -} + bottom: 60px; -.ea11y-statement--widget-preview .ea11y-widget-statement-link, -.ea11y-statement--widget-preview .ea11y-widget-statement-link * { - z-index: 1; - opacity: 1; + background-color: #FCFDFF; + opacity: 0.6; } diff --git a/modules/settings/assets/js/components/copy-link/index.js b/modules/settings/assets/js/components/copy-link/index.js index d0138955..18f696db 100644 --- a/modules/settings/assets/js/components/copy-link/index.js +++ b/modules/settings/assets/js/components/copy-link/index.js @@ -28,12 +28,13 @@ const CopyLink = ({ content }) => { open={open} onClose={handleClose} onOpen={handleOpen} + placement="top" title={ copied ? __('Copied!', 'pojo-accessibility') : __('Copy', 'pojo-accessibility') } - arrow={false} + arrow={true} PopperProps={{ modifiers: [ { diff --git a/modules/settings/assets/js/components/generated-page-infotip-card/index.js b/modules/settings/assets/js/components/generated-page-infotip-card/index.js index f4b8ee27..9eee34b2 100644 --- a/modules/settings/assets/js/components/generated-page-infotip-card/index.js +++ b/modules/settings/assets/js/components/generated-page-infotip-card/index.js @@ -10,23 +10,28 @@ import { __ } from '@wordpress/i18n'; const GeneratedPageInfoTipCard = () => { const { setShowAccessibilityGeneratedInfotip } = useSettings(); const { save } = useStorage(); + const dismissNotice = async () => { setShowAccessibilityGeneratedInfotip(false); + await save({ ea11y_show_accessibility_generated_page_infotip: false, }); }; + return ( - + + {__( - 'The accessibility statement page you generated is already linked to the widget.', + 'We went ahead and linked the accessibility statement page you just created to your widget.', 'pojo-accessibility', )} + + {units.map((unit, index) => ( { ), }} /> + theme.shape.borderRadius}; box-shadow: ${({ theme }) => theme.shadows[0]}; cursor: pointer; @@ -118,6 +118,8 @@ const AccessibilityStatement = () => { href={'https://example.com/'} target="_blank" rel="noopener noreferrer" + color="secondary" + underline="hover" > {children} @@ -128,7 +130,13 @@ const AccessibilityStatement = () => { {!accessibilityStatementData?.pageId && !showStatementLink && ( <> - + { value={statementOption} sx={{ display: 'flex', + justifyContent: 'center', flexDirection: 'row', flexWrap: 'nowrap', gap: 5, + width: '100%', }} > { debug: ea11ySettingsData.pluginEnv === 'dev', track_pageview: false, persistence: 'localStorage', + record_sessions_percent: 50, }); mixpanel.register({ From c4292debbc7735df1fcbe9d5497f7b230ea4e8bf Mon Sep 17 00:00:00 2001 From: Pavlo Kniazevych <139438463+pkniazevych@users.noreply.github.com> Date: Wed, 22 Jan 2025 16:16:17 +0200 Subject: [PATCH 039/292] Fix: Enhance position values validation [APP-1009] (#146) --- .../assets/js/components/bottom-bar/index.js | 58 +++++++--------- .../js/components/position-control/index.js | 67 +++++++++++++------ .../js/contexts/plugin-settings-context.js | 0 .../js/layouts/position-settings-desktop.js | 12 ++++ 4 files changed, 85 insertions(+), 52 deletions(-) delete mode 100644 modules/settings/assets/js/contexts/plugin-settings-context.js diff --git a/modules/settings/assets/js/components/bottom-bar/index.js b/modules/settings/assets/js/components/bottom-bar/index.js index 5aeee26e..078a9e0d 100644 --- a/modules/settings/assets/js/components/bottom-bar/index.js +++ b/modules/settings/assets/js/components/bottom-bar/index.js @@ -17,47 +17,39 @@ const BottomBar = () => { const { success, error } = useToastNotification(); const saveSettings = async () => { + let savedData = {}; + if (selectedMenu.parent === 'widget' && selectedMenu.child === 'menu') { - try { - await save({ - ea11y_widget_menu_settings: widgetMenuSettings, - }); - success('Settings saved!'); - setHasChanges(false); - mixpanelService.sendEvent('save_button_clicked', { - savedData: { - ea11y_widget_menu_settings: widgetMenuSettings, - }, - }); - } catch (e) { - error('Failed to save settings!'); - } + savedData = { + ea11y_widget_menu_settings: widgetMenuSettings, + }; } else if ( selectedMenu.parent === 'widget' && selectedMenu.child === 'iconSettings' ) { - try { - await save({ - ea11y_widget_icon_settings: { - style: iconDesign, - position: iconPosition, - }, - }); + savedData = { + ea11y_widget_icon_settings: { + style: iconDesign, + position: iconPosition, + }, + }; + } + + try { + await save(savedData); - success('Settings saved!'); - setHasChanges(false); + success(__('Settings saved!', 'pojo-accessibility')); - mixpanelService.sendEvent('save_button_clicked', { - savedData: { - style: iconDesign, - position: iconPosition, - }, - }); - } catch (e) { - error('Failed to save settings!'); - } + setHasChanges(false); + + mixpanelService.sendEvent('save_button_clicked', { + savedData, + }); + } catch (e) { + error(__('Failed to save settings!', 'pojo-accessibility')); } }; + return ( { onClick={saveSettings} disabled={!hasChanges} > - {__('Save Changes', 'pojo-accessibility')} + {__('Save changes', 'pojo-accessibility')} ); diff --git a/modules/settings/assets/js/components/position-control/index.js b/modules/settings/assets/js/components/position-control/index.js index a9fe3f87..261d368a 100644 --- a/modules/settings/assets/js/components/position-control/index.js +++ b/modules/settings/assets/js/components/position-control/index.js @@ -28,13 +28,23 @@ const verticalOptions = [ { value: 'bottom', label: __('Lower', 'pojo-accessibility') }, ]; -// Customization for the WP admin global CSS. +const StyledContainer = styled(Box)` + display: flex; + gap: ${({ theme }) => theme.spacing(1)}; + margin-top: ${({ theme }) => theme.spacing(2)}; + margin-bottom: ${({ theme, isError }) => + isError ? theme.spacing(4) : 'initial'}; + + transition: all 100ms ease-in-out; +`; + const StyledTextField = styled(TextField)` width: 200px; height: 56px; .wp-admin & .MuiInputBase-input, & .MuiInputBase-input:focus { + height: 56px; background-color: initial; box-shadow: none; border: 0; @@ -45,13 +55,16 @@ const StyledTextField = styled(TextField)` &.MuiInputBase-inputSizeSmall { padding: 8.5px 14px 8.5px 14px; } - height: 56px; } `; const PositionControl = ({ type, disabled, mode }) => { const { iconPosition, updateExactPosition } = useIconPosition(); const [unitsIndex, setUnitsIndex] = useState(0); + const [inputValue, setInputValue] = useState( + iconPosition[mode]?.exactPosition[type]?.value, + ); + const [isValid, setIsValid] = useState(inputValue >= 5 && inputValue <= 550); const popupState = usePopupState({ variant: 'popover', popupId: 'position-settings', @@ -59,6 +72,7 @@ const PositionControl = ({ type, disabled, mode }) => { const handleMenuItemClick = (index) => { setUnitsIndex(index); + updateExactPosition( mode, type, @@ -66,7 +80,9 @@ const PositionControl = ({ type, disabled, mode }) => { iconPosition[mode]?.exactPosition[type]?.value, units[index], ); + popupState.close(); + mixpanelService.sendEvent('handle_unit_changed', { positionData: { mode, @@ -79,22 +95,31 @@ const PositionControl = ({ type, disabled, mode }) => { }; const handlePositionChange = (event) => { - updateExactPosition( - mode, - type, - iconPosition[mode]?.exactPosition[type]?.direction, - event.target.value, - iconPosition[mode]?.exactPosition[type]?.unit, - ); - mixpanelService.sendEvent('handle_value_changed', { - positionData: { + const value = parseInt(event.target.value, 10) || 0; + const valueIsValid = value >= 5 && value <= 550; + + setInputValue(event.target.value); + setIsValid(valueIsValid); + + if (valueIsValid) { + updateExactPosition( mode, type, - value: event.target.value, - unit: iconPosition[mode]?.exactPosition[type]?.unit, - direction: iconPosition[mode]?.exactPosition[type]?.value, - }, - }); + iconPosition[mode]?.exactPosition[type]?.direction, + value, + iconPosition[mode]?.exactPosition[type]?.unit, + ); + + mixpanelService.sendEvent('handle_value_changed', { + positionData: { + mode, + type, + value, + unit: iconPosition[mode]?.exactPosition[type]?.unit, + direction: iconPosition[mode]?.exactPosition[type]?.value, + }, + }); + } }; const handlePositionDirection = (event) => { @@ -105,6 +130,7 @@ const PositionControl = ({ type, disabled, mode }) => { iconPosition[mode]?.exactPosition[type]?.value, iconPosition[mode]?.exactPosition[type]?.unit, ); + mixpanelService.sendEvent('handle_direction_changed', { positionData: { mode, @@ -117,11 +143,13 @@ const PositionControl = ({ type, disabled, mode }) => { }; return ( - + { - + ); }; diff --git a/modules/settings/assets/js/contexts/plugin-settings-context.js b/modules/settings/assets/js/contexts/plugin-settings-context.js deleted file mode 100644 index e69de29b..00000000 diff --git a/modules/settings/assets/js/layouts/position-settings-desktop.js b/modules/settings/assets/js/layouts/position-settings-desktop.js index 6d2381b5..9b7c5045 100644 --- a/modules/settings/assets/js/layouts/position-settings-desktop.js +++ b/modules/settings/assets/js/layouts/position-settings-desktop.js @@ -12,6 +12,7 @@ const PositionSettingsDesktop = () => { const toggleVisibility = (device) => { updateIconPosition(device, 'hidden', !iconPosition[device].hidden); + mixpanelService.sendEvent('toggle_clicked', { toggleData: { state: !iconPosition[device].hidden, @@ -27,6 +28,7 @@ const PositionSettingsDesktop = () => { 'enableExactPosition', !iconPosition[device].enableExactPosition, ); + mixpanelService.sendEvent('toggle_clicked', { toggleData: { state: !iconPosition[device].enableExactPosition, @@ -67,6 +69,7 @@ const PositionSettingsDesktop = () => { gap={5} > + { onChange={() => toggleExactPosition('desktop')} checked={iconPosition.desktop?.enableExactPosition} /> + + + {__( + 'Exact positioning, 5 – 500 px are permitted values:', + 'pojo-accessibility', + )} + + + Date: Thu, 23 Jan 2025 16:12:40 +0200 Subject: [PATCH 040/292] Bug/app 1003 (#147) * Fix: Add a border to the preview [n/a] * Fix: Fix Capabilities screen UI [APP-1003] --- .../assets/js/components/bottom-bar/index.js | 20 +++-- .../assets/js/layouts/menu-settings.js | 84 ++++++++++++------- .../assets/js/layouts/statement-link.js | 20 +++-- .../assets/js/layouts/widget-preview.js | 45 ++++++---- modules/settings/assets/js/pages/menu.js | 12 ++- 5 files changed, 122 insertions(+), 59 deletions(-) diff --git a/modules/settings/assets/js/components/bottom-bar/index.js b/modules/settings/assets/js/components/bottom-bar/index.js index 078a9e0d..2f88f25b 100644 --- a/modules/settings/assets/js/components/bottom-bar/index.js +++ b/modules/settings/assets/js/components/bottom-bar/index.js @@ -1,9 +1,19 @@ import Box from '@elementor/ui/Box'; import Button from '@elementor/ui/Button'; +import { styled } from '@elementor/ui/styles'; import { useSettings, useStorage, useToastNotification } from '@ea11y/hooks'; import { mixpanelService } from '@ea11y/services'; import { __ } from '@wordpress/i18n'; +const StyledContainer = styled(Box)` + width: 100%; + display: flex; + justify-content: flex-end; + + padding: ${({ theme }) => theme.spacing(2)}; + border-top: 1px solid ${({ theme }) => theme.palette.divider}; +`; + const BottomBar = () => { const { selectedMenu, @@ -51,13 +61,7 @@ const BottomBar = () => { }; return ( - + - + ); }; diff --git a/modules/settings/assets/js/layouts/menu-settings.js b/modules/settings/assets/js/layouts/menu-settings.js index 06f8091f..f92724b6 100644 --- a/modules/settings/assets/js/layouts/menu-settings.js +++ b/modules/settings/assets/js/layouts/menu-settings.js @@ -1,5 +1,6 @@ import { CardActions } from '@elementor/ui'; import Alert from '@elementor/ui/Alert'; +import Box from '@elementor/ui/Box'; import Card from '@elementor/ui/Card'; import CardContent from '@elementor/ui/CardContent'; import CardHeader from '@elementor/ui/CardHeader'; @@ -17,12 +18,32 @@ import { useEffect, useState } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; import { MENU_SETTINGS } from '../constants/menu-settings'; -// Customization to override the WP admin global CSS. -const StyledSwitch = styled(Switch)(() => ({ - input: { - height: '56px', - }, -})); +const StyledSwitch = styled(Switch)` + input { + height: 56px; + } +`; + +const StyledCardContent = styled(CardContent)` + height: 50vh; + overflow: auto; + margin-bottom: 61.5px; + padding: 0 ${({ theme }) => theme.spacing(2)}; +`; + +const StyledCardActions = styled(CardActions)` + position: absolute; + width: 100%; + bottom: 0; + + padding: 0; + background: ${({ theme }) => theme.palette.background.paper}; + + & .MuiBox-root { + padding: ${({ theme }) => theme.spacing(1.5)} + ${({ theme }) => theme.spacing(2)}; + } +`; const MenuSettings = () => { const { @@ -40,13 +61,13 @@ const MenuSettings = () => { setDisableOptions(true); } else { setDisableOptions(false); + save({ a11y_hide_minimum_active_options_alert: false }).then(() => { setHideMinimumOptionAlert(false); }); } }, [widgetMenuSettings]); - // Toggle the value of a setting const toggleSetting = (category, option) => { setWidgetMenuSettings((prevSettings) => { const newSettings = { @@ -57,15 +78,16 @@ const MenuSettings = () => { }; setHasChanges(true); + if (window?.ea11yWidget?.toolsSettings && window?.ea11yWidget?.widget) { window.ea11yWidget.toolsSettings = newSettings; window?.ea11yWidget?.widget.updateState(); } + return newSettings; }); }; - // Check if at least two options are enabled const areAtLeastTwoOptionsEnabled = (settings) => { let enabledCount = 0; @@ -87,28 +109,34 @@ const MenuSettings = () => { setHideMinimumOptionAlert(true); }); }; + + const sectionsCount = Object.entries(MENU_SETTINGS).length; + return ( + {__( + 'Choose which accessibility features and capabilities you want to include.', + 'pojo-accessibility', + )} + + } /> + {disableOptions && !hideMinimumOptionAlert && ( {__('At least two option must remain active', 'pojo-accessibility')} )} - + + - {Object.entries(MENU_SETTINGS).map(([parentKey, parentItem]) => { + {Object.entries(MENU_SETTINGS).map(([parentKey, parentItem], i) => { return ( -
+ @@ -116,6 +144,7 @@ const MenuSettings = () => { + {parentItem.options && Object.entries(parentItem.options).map( ([childKey, childValue]) => { @@ -148,22 +177,17 @@ const MenuSettings = () => { ); }, )} - -
+ + {i + 1 < sectionsCount && } +
); })} - - + + + - + ); }; diff --git a/modules/settings/assets/js/layouts/statement-link.js b/modules/settings/assets/js/layouts/statement-link.js index 3ff4195e..21b2752e 100644 --- a/modules/settings/assets/js/layouts/statement-link.js +++ b/modules/settings/assets/js/layouts/statement-link.js @@ -13,6 +13,7 @@ import MenuItem from '@elementor/ui/MenuItem'; import Select from '@elementor/ui/Select'; import Switch from '@elementor/ui/Switch'; import Typography from '@elementor/ui/Typography'; +import { styled } from '@elementor/ui/styles'; import { CopyLink, WidgetLoader, @@ -24,6 +25,14 @@ import { useEntityRecords } from '@wordpress/core-data'; import { useEffect, useState } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; +const StyledPreviewContainer = styled(Box)` + padding: 0; + margin-top: ${({ theme }) => theme.spacing(2)}; + + border-radius: 4px; + border: 1px solid ${({ theme }) => theme.palette.divider}; +`; + const StatementLink = () => { const [disabled, setDisabled] = useState(true); const [isValidPage, setIsValidPage] = useState(false); @@ -97,10 +106,13 @@ const StatementLink = () => { await save({ ea11y_accessibility_statement_data: accessibilityStatementData, }); - await success('Settings saved'); + + await success('Changes saved'); + setDisabled(true); } catch (e) { error('Failed to save settings!'); + console.error(e); } }; @@ -208,14 +220,12 @@ const StatementLink = () => { {__('Preview link in widget', 'pojo-accessibility')} - - + diff --git a/modules/settings/assets/js/layouts/widget-preview.js b/modules/settings/assets/js/layouts/widget-preview.js index 5f35967d..ca4f21f2 100644 --- a/modules/settings/assets/js/layouts/widget-preview.js +++ b/modules/settings/assets/js/layouts/widget-preview.js @@ -1,30 +1,47 @@ import Card from '@elementor/ui/Card'; import CardContent from '@elementor/ui/CardContent'; import CardHeader from '@elementor/ui/CardHeader'; +import Typography from '@elementor/ui/Typography'; +import { styled } from '@elementor/ui/styles'; import { WidgetLoader } from '@ea11y/components'; import { __ } from '@wordpress/i18n'; +const StyledPreview = styled(CardContent)` + margin-right: auto; + margin-left: auto; + margin-top: ${({ theme }) => theme.spacing(4)}; + padding: 0 24px; + + overflow: auto; + + & #ea11y-root { + position: absolute; + top: 0; + left: 0; + right: 0; + + transform: scale(70%); + } +`; + const WidgetPreview = () => { return ( <> + {__( + 'This is what the widget will look like to your site viewers.', + 'pojo-accessibility', + )} + + } + sx={{ paddingBottom: 0 }} /> - + + diff --git a/modules/settings/assets/js/pages/menu.js b/modules/settings/assets/js/pages/menu.js index 1f24332a..77675753 100644 --- a/modules/settings/assets/js/pages/menu.js +++ b/modules/settings/assets/js/pages/menu.js @@ -1,11 +1,18 @@ import Box from '@elementor/ui/Box'; import Container from '@elementor/ui/Container'; import Typography from '@elementor/ui/Typography'; +import { styled } from '@elementor/ui/styles'; import { MenuSettings, WidgetPreview } from '@ea11y/layouts'; import { mixpanelService } from '@ea11y/services'; import { useEffect } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; +const StyledContainer = styled(Container)` + overflow: auto; + max-height: 100%; + padding: ${({ theme }) => theme.spacing(5)}; +`; + const Menu = () => { useEffect(() => { mixpanelService.sendEvent('page_view', { @@ -14,15 +21,16 @@ const Menu = () => { }, []); return ( - + {__('Capabilities', 'pojo-accessibility')} + - + ); }; From 59cfc8f5469514933edb11a3fc2d257bcaffe296 Mon Sep 17 00:00:00 2001 From: VasylD Date: Sun, 26 Jan 2025 12:09:38 +0200 Subject: [PATCH 041/292] [APP-1020] add missed events (#148) --- modules/settings/assets/js/layouts/menu-settings.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/settings/assets/js/layouts/menu-settings.js b/modules/settings/assets/js/layouts/menu-settings.js index f92724b6..d90441de 100644 --- a/modules/settings/assets/js/layouts/menu-settings.js +++ b/modules/settings/assets/js/layouts/menu-settings.js @@ -14,6 +14,7 @@ import Typography from '@elementor/ui/Typography'; import { styled } from '@elementor/ui/styles'; import { BottomBar } from '@ea11y/components'; import { useSettings, useStorage } from '@ea11y/hooks'; +import { mixpanelService } from '@ea11y/services'; import { useEffect, useState } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; import { MENU_SETTINGS } from '../constants/menu-settings'; @@ -84,6 +85,15 @@ const MenuSettings = () => { window?.ea11yWidget?.widget.updateState(); } + if (prevSettings[option]) { + mixpanelService.sendEvent('toggle_clicked', { + toggleData: { + state: !prevSettings[option]?.enabled, + type: option, + }, + }); + } + return newSettings; }); }; From 1165dd0ef82bb5d4b53ab60b739c74e25bea4db7 Mon Sep 17 00:00:00 2001 From: VasylD Date: Mon, 27 Jan 2025 14:48:46 +0200 Subject: [PATCH 042/292] [APP-1015] fix switch account (#149) --- modules/connect/rest/disconnect.php | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/connect/rest/disconnect.php b/modules/connect/rest/disconnect.php index 303c4779..9f7f8032 100644 --- a/modules/connect/rest/disconnect.php +++ b/modules/connect/rest/disconnect.php @@ -29,6 +29,7 @@ public function get_name(): string { public function POST() { try { + Service::refresh_token(); Service::disconnect(); return $this->respond_success_json(); From b7b67d23c686d2fbe3f953c58da6994c5f025cfb Mon Sep 17 00:00:00 2001 From: VasylD Date: Mon, 27 Jan 2025 14:53:34 +0200 Subject: [PATCH 043/292] [APP-1015] fix switch account (#150) --- modules/widget/module.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/widget/module.php b/modules/widget/module.php index 79aa37f4..51f6aaaf 100644 --- a/modules/widget/module.php +++ b/modules/widget/module.php @@ -24,7 +24,7 @@ public function get_name(): string { * @return void * @throws Exception */ - public function enqueue_accessibility_widget () : void { + public function enqueue_accessibility_widget() : void { if ( ! Connect::is_connected() ) { return; @@ -38,7 +38,7 @@ public function enqueue_accessibility_widget () : void { wp_enqueue_script( 'ea11y-widget', - self::get_widget_url() .'?api_key=' . $plan_data->public_api_key, + self::get_widget_url() . '?api_key=' . $plan_data->public_api_key, [], EA11Y_VERSION, true @@ -70,7 +70,7 @@ public static function get_widget_url() : string { public function get_accessibility_statement_url() : string { $option = get_option( 'ea11y_accessibility_statement_data' ); - if ( ! empty( $option ) && ! $option['hideLink'] ) { + if ( ! empty( $option ) && ! empty( $option['link'] ) && empty( $option['hideLink'] ) ) { return $option['link']; } @@ -83,7 +83,7 @@ public function get_accessibility_statement_url() : string { * * @return void */ - public function enqueue_accessibility_widget_admin ( $hook ) : void { + public function enqueue_accessibility_widget_admin( $hook ) : void { if ( SettingsModule::SETTING_PAGE_SLUG !== $hook ) { return; } @@ -116,7 +116,7 @@ public function enqueue_accessibility_widget_admin ( $hook ) : void { * Remove person object from the icon settings for frontend. * @return array */ - public function get_widget_icon_settings () : array { + public function get_widget_icon_settings() : array { $option = get_option( 'ea11y_widget_icon_settings' ); if ( ! $option ) { From a4750577ece9e7dc5d16a8aed2642f8903a27850 Mon Sep 17 00:00:00 2001 From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com> Date: Wed, 29 Jan 2025 18:06:19 +0530 Subject: [PATCH 044/292] [APP-1021] Fix switch modal ui (#151) * fix: ui issues * fix: translation strings --- modules/legacy/components/upgrade.php | 187 ++++++++++++++++---------- 1 file changed, 115 insertions(+), 72 deletions(-) diff --git a/modules/legacy/components/upgrade.php b/modules/legacy/components/upgrade.php index 6ff53cef..b0956845 100644 --- a/modules/legacy/components/upgrade.php +++ b/modules/legacy/components/upgrade.php @@ -123,7 +123,7 @@ public static function get_switch_now_link() : string { */ public function add_deprecated_notice_to_customizer_section_description(): string { $content = sprintf( - '

%s

%s

%s

', + '

%s

%s

%s

', esc_html__( 'New! Switch to our updated accessibility widget for better features and control.', 'pojo-accessibility' ), self::get_learn_more_link( 'acc-notice-switch-custom' ), esc_html__( 'Learn More', 'pojo-accessibility' ), @@ -166,12 +166,19 @@ public function maybe_add_introduction_modal() {
- - + + + + +
-

-

+

+

@@ -364,7 +392,7 @@ public function maybe_add_confirmation_modal() { onLoad( () => setTimeout( () => { const modal = document.querySelector( `[data-modal-slug="${ modalID }"]` ); - tb_show( '', `/?TB_inline&inlineId=${ modalID }&height=320&width=552&modal=true` ); + tb_show( '', `/?TB_inline&inlineId=${ modalID }&height=330&width=552&modal=true` ); const closeButton = modal.querySelector( 'a.close-button' ); const upgradeButton = modal.querySelector( 'a.upgrade-now' ); const close = () => { @@ -398,42 +426,34 @@ public function maybe_add_confirmation_modal() { ' . esc_html__( 'Accessibility', 'pojo-accessibility' ) . ''; - $pointer_content .= '

' . esc_html__( "Our new, improved accessibility plugin is now available! Web Accessibility is packed with advanced styling options, improved feature controls, and so much more.", 'pojo-accessibility' ) . '

'; + $pointer_content .= '

' . esc_html__( 'Our new, improved accessibility plugin is now available! Web Accessibility is packed with advanced styling options, improved feature controls, and so much more.', 'pojo-accessibility' ) . '

'; $pointer_content .= sprintf( '

%s

', From 1d067ca90db518a40f7d68f9b31b89fedbdbbb28 Mon Sep 17 00:00:00 2001 From: VasylD Date: Wed, 29 Jan 2025 14:50:52 +0200 Subject: [PATCH 045/292] [APP-912] add default settings for RTL (#152) * [APP-912] add default settings for RTL * [APP-912] add default settings for RTL * [APP-912] add default settings for RTL --- .../assets/js/components/alignment-matrix-control/index.js | 1 + modules/settings/module.php | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/settings/assets/js/components/alignment-matrix-control/index.js b/modules/settings/assets/js/components/alignment-matrix-control/index.js index f65b6b80..3448ea36 100644 --- a/modules/settings/assets/js/components/alignment-matrix-control/index.js +++ b/modules/settings/assets/js/components/alignment-matrix-control/index.js @@ -57,6 +57,7 @@ const AlignmentMatrixControl = ({ mode }) => { false, 'exactPosition' => [ 'horizontal' => [ - 'direction' => 'left', + 'direction' => 'right', 'value' => 10, 'unit' => 'px', ], @@ -217,7 +217,7 @@ private function set_default_settings() : void { 'unit' => 'px', ], ], - 'position' => 'top-left', + 'position' => is_rtl() ? 'bottom-left' : 'bottom-right', ], 'mobile' => [ 'hidden' => false, @@ -234,7 +234,7 @@ private function set_default_settings() : void { 'unit' => 'px', ], ], - 'position' => 'top-left', + 'position' => is_rtl() ? 'bottom-left' : 'bottom-right', ], ]; From 61a9a89435a571a714a7c7a48436c8bfb757519d Mon Sep 17 00:00:00 2001 From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com> Date: Thu, 30 Jan 2025 11:41:17 +0530 Subject: [PATCH 046/292] [APP-1026] Remove HTML breaking + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='50' height='50' viewBox='0 0 78 78' preserveAspectRatio='xMidYMid meet' fill='none'%3E%3Crect width='50' height='50' fill='%23FF7BE5' rx='25'/%3E%3Cpath fill='%23fff' d='M25.258 17.523a2.928 2.928 0 1 0 0-5.856 2.928 2.928 0 0 0 0 5.856Z'/%3E%3Cpath fill='%23fff' d='M29.556 18.338a43.34 43.34 0 0 1-8.77 0l-6.528-1.027a1.701 1.701 0 0 0-1.758 1.701c0 .921.58 1.58 1.652 1.701l7.417.978-.61 15.147a1.556 1.556 0 0 0 3.11.116l.49-6.498a.784.784 0 0 1 1.565 0l.49 6.498a1.556 1.556 0 0 0 3.11-.117l-.542-13.34c0-.974.775-1.776 1.75-1.808l5.426-.976c1.08-.192 1.652-.78 1.652-1.7 0-.965-.796-1.734-1.758-1.704l-6.704 1.026.008.003Z'/%3E%3Cpath fill='%23FF7BE5' d='m18.32 22.387-3.103-1.517c6.766.767 7.427 1.133 10.547 1.2-3.223.177-6.048.55-7.443.315v.002Z'/%3E%3C/svg%3E"); } Date: Thu, 30 Jan 2025 23:11:13 +0200 Subject: [PATCH 047/292] Bug/app 1003 (#157) * Fix: Add missed translations [n/a] * Fix: Refresh the plan data on page load [n/a] * New: Add loader to the settings [n/a] --- modules/settings/assets/js/app.js | 46 +++++++++++++------ .../components/statement-generator/index.js | 4 +- modules/settings/assets/js/constants/index.js | 6 ++- .../assets/js/hooks/use-saved-settings.js | 17 ++++++- .../assets/js/layouts/statement-link.js | 4 +- .../settings/assets/js/page-content-loader.js | 44 ++++++++++++++++++ modules/settings/assets/js/page-content.js | 11 +++++ .../settings/assets/js/pages/icon-settings.js | 15 +++++- modules/settings/module.php | 25 +++++++++- package-lock.json | 13 ++++++ package.json | 1 + 11 files changed, 164 insertions(+), 22 deletions(-) create mode 100644 modules/settings/assets/js/page-content-loader.js create mode 100644 modules/settings/assets/js/page-content.js diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js index c9cdeea9..5bc7663b 100644 --- a/modules/settings/assets/js/app.js +++ b/modules/settings/assets/js/app.js @@ -2,7 +2,7 @@ import '../css/style.css'; import Box from '@elementor/ui/Box'; import DirectionProvider from '@elementor/ui/DirectionProvider'; import Grid from '@elementor/ui/Grid'; -import { ThemeProvider } from '@elementor/ui/styles'; +import { styled, ThemeProvider } from '@elementor/ui/styles'; import { ConnectModal, Notifications, @@ -19,9 +19,26 @@ import { Sidebar } from '@ea11y/layouts'; import { mixpanelService } from '@ea11y/services'; import { useEffect } from '@wordpress/element'; import { usePluginSettingsContext } from './contexts/plugin-settings'; +import PageContent from './page-content'; + +const StyledContainer = styled(Box)` + width: 100%; + + display: flex; + flex-direction: column; + justify-content: start; +`; + +const StyledGrid = styled(Grid)` + height: 100%; + + display: flex; + flex-direction: row; +`; const App = () => { - useSavedSettings(); + const { hasFinishedResolution, loading } = useSavedSettings(); + const { isConnected, isRTL, closePostConnectModal } = usePluginSettingsContext(); const { notificationMessage, notificationType } = useNotificationSettings(); @@ -35,28 +52,31 @@ const App = () => { }); }, []); - // Accessing the selected menu item const selectedParent = MenuItems[selectedMenu.parent]; const selectedChild = selectedMenu.child ? selectedParent.children[selectedMenu.child] : null; + return ( {isConnected !== undefined && !isConnected && } {isConnected && !closePostConnectModal && } - + + - + + - {selectedChild ? selectedChild.page : selectedParent?.page} - - + + + + + diff --git a/modules/settings/assets/js/components/statement-generator/index.js b/modules/settings/assets/js/components/statement-generator/index.js index 9d8101a1..fa3d6e3b 100644 --- a/modules/settings/assets/js/components/statement-generator/index.js +++ b/modules/settings/assets/js/components/statement-generator/index.js @@ -124,11 +124,11 @@ const StatementGenerator = ({ open, close }) => { window.ea11yWidget.accessibilityStatementURL = response.link; } await close(); - await success('Page created'); + await success('Page created', 'pojo-accessibility'); mixpanelService.sendEvent('statement_page_created'); } catch (e) { - error('Error while creating page'); + error('Error while creating page', 'pojo-accessibility'); console.error(e); } }; diff --git a/modules/settings/assets/js/constants/index.js b/modules/settings/assets/js/constants/index.js index 3df31794..23e4a651 100644 --- a/modules/settings/assets/js/constants/index.js +++ b/modules/settings/assets/js/constants/index.js @@ -1,3 +1,7 @@ export const HELP_LINK = 'https://go.elementor.com/'; export const UPGRADE_LINK = 'https://go.elementor.com/'; -export const BILLING_LINK = 'https://my.elementor.com/'; + +export const SKELETON_OPTIONS = Object.freeze({ + SPEED: 2, + FOREGROUND_COLOR: '#D9D9D9', +}); diff --git a/modules/settings/assets/js/hooks/use-saved-settings.js b/modules/settings/assets/js/hooks/use-saved-settings.js index bdec61cb..322f359b 100644 --- a/modules/settings/assets/js/hooks/use-saved-settings.js +++ b/modules/settings/assets/js/hooks/use-saved-settings.js @@ -1,9 +1,11 @@ import { useSettings } from '@ea11y/hooks'; import { store as coreDataStore } from '@wordpress/core-data'; import { useSelect } from '@wordpress/data'; -import { useEffect } from '@wordpress/element'; +import { useEffect, useState } from '@wordpress/element'; export const useSavedSettings = () => { + const [isLoading, setIsLoading] = useState(true); + const { setWidgetMenuSettings, setHideMinimumOptionAlert, @@ -17,6 +19,10 @@ export const useSavedSettings = () => { const result = useSelect((select) => { return { data: select(coreDataStore).getEntityRecord('root', 'site'), + isResolving: select(coreDataStore).isResolving('getEntityRecord', [ + 'root', + 'site', + ]), hasFinishedResolution: select(coreDataStore).hasFinishedResolution( 'getEntityRecord', ['root', 'site'], @@ -24,6 +30,10 @@ export const useSavedSettings = () => { }; }, []); + useEffect(() => { + setIsLoading(result.isResolving); + }, [result]); + useEffect(() => { if (result.hasFinishedResolution) { if (result?.data?.ea11y_widget_menu_settings) { @@ -60,4 +70,9 @@ export const useSavedSettings = () => { } } }, [result.hasFinishedResolution]); + + return { + loading: isLoading, + hasFinishedResolution: result.hasFinishedResolution, + }; }; diff --git a/modules/settings/assets/js/layouts/statement-link.js b/modules/settings/assets/js/layouts/statement-link.js index 21b2752e..9bd8fe88 100644 --- a/modules/settings/assets/js/layouts/statement-link.js +++ b/modules/settings/assets/js/layouts/statement-link.js @@ -107,11 +107,11 @@ const StatementLink = () => { ea11y_accessibility_statement_data: accessibilityStatementData, }); - await success('Changes saved'); + await success('Changes saved', 'pojo-accessibility'); setDisabled(true); } catch (e) { - error('Failed to save settings!'); + error('Failed to save settings!', 'pojo-accessibility'); console.error(e); } diff --git a/modules/settings/assets/js/page-content-loader.js b/modules/settings/assets/js/page-content-loader.js new file mode 100644 index 00000000..e4996341 --- /dev/null +++ b/modules/settings/assets/js/page-content-loader.js @@ -0,0 +1,44 @@ +import Container from '@elementor/ui/Container'; +import { styled } from '@elementor/ui/styles'; +import PropTypes from 'prop-types'; +import ContentLoader from 'react-content-loader'; +import { memo } from '@wordpress/element'; +import { SKELETON_OPTIONS } from './constants'; + +const StyledContainer = styled(Container)` + overflow: auto; + max-height: 100%; + padding: ${({ theme }) => theme.spacing(4)}; +`; + +const Skeleton = memo(() => { + return ( + + + + ); +}); + +const SettingsLoader = memo(({ children }) => { + return ( + + + + {children} + + ); +}); + +SettingsLoader.propTypes = { + children: PropTypes.node, +}; + +export default SettingsLoader; diff --git a/modules/settings/assets/js/page-content.js b/modules/settings/assets/js/page-content.js new file mode 100644 index 00000000..12820ba6 --- /dev/null +++ b/modules/settings/assets/js/page-content.js @@ -0,0 +1,11 @@ +import SettingsLoader from './page-content-loader'; + +const PageContent = ({ isLoading, page }) => { + if (isLoading) { + return ; + } + + return page; +}; + +export default PageContent; diff --git a/modules/settings/assets/js/pages/icon-settings.js b/modules/settings/assets/js/pages/icon-settings.js index 9b3661c8..bc4fa1eb 100644 --- a/modules/settings/assets/js/pages/icon-settings.js +++ b/modules/settings/assets/js/pages/icon-settings.js @@ -1,26 +1,37 @@ import Container from '@elementor/ui/Container'; import Typography from '@elementor/ui/Typography'; +import { styled } from '@elementor/ui/styles'; import { BottomBar } from '@ea11y/components'; import { IconDesignSettings, PositionSettings } from '@ea11y/layouts'; import { mixpanelService } from '@ea11y/services'; import { useEffect } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; +const StyledContainer = styled(Container)` + overflow: auto; + max-height: 100%; + padding: ${({ theme }) => theme.spacing(4)}; +`; + const IconSettings = () => { useEffect(() => { mixpanelService.sendEvent('page_view', { page: 'Button', }); }, []); + return ( <> - + {__('Button', 'pojo-accessibility')} + + - + + ); diff --git a/modules/settings/module.php b/modules/settings/module.php index 76823b53..4edd6d76 100644 --- a/modules/settings/module.php +++ b/modules/settings/module.php @@ -76,6 +76,8 @@ public function enqueue_scripts( $hook ) : void { return; } + self::refresh_plan_data(); + wp_enqueue_style( 'ea11y-admin-fonts', 'https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap', @@ -98,6 +100,28 @@ public function enqueue_scripts( $hook ) : void { ); } + public static function refresh_plan_data() { + $plan_data = Settings::get( Settings::PLAN_DATA ); + + $response = Utils::get_api_client()->make_request( + 'GET', + 'site/info', + [ 'api_key' => $plan_data->public_api_key ] + ); + + if ( ! empty( $response->site_url ) && Data::get_home_url() !== $response->site_url ) { + Data::set_home_url( $response->site_url ); + } + + if ( ! is_wp_error( $response ) ) { + Settings::set( Settings::PLAN_DATA, $response ); + Settings::set( Settings::IS_VALID_PLAN_DATA, true ); + } else { + Logger::error( esc_html( $response->get_error_message() ) ); + Settings::set( Settings::IS_VALID_PLAN_DATA, false ); + } + } + /** * Get Mixpanel project Token * @return string @@ -117,7 +141,6 @@ public static function routes_list() : array { * @return array */ public static function get_plugin_settings(): array { - return [ 'isConnected' => Connect::is_connected(), 'closePostConnectModal' => Settings::get( Settings::CLOSE_POST_CONNECT_MODAL ), diff --git a/package-lock.json b/package-lock.json index f78897d3..b9242967 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "mixpanel-browser": "^2.58.0", "prop-types": "^15.8.1", "react-colorful": "^5.6.1", + "react-content-loader": "^7.0.2", "use-debounce": "^10.0.4" }, "devDependencies": { @@ -19000,6 +19001,18 @@ "react-dom": ">=16.8.0" } }, + "node_modules/react-content-loader": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/react-content-loader/-/react-content-loader-7.0.2.tgz", + "integrity": "sha512-773S98JTyC8VB2nu7LXUhpHx8tZMieGxMcx3qTe7IkohT6Br7d9AXnIXs/wQ6IhlUdKQcw6JLKk1QKigYCWDRA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", diff --git a/package.json b/package.json index e90a55fc..1890cc8b 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "mixpanel-browser": "^2.58.0", "prop-types": "^15.8.1", "react-colorful": "^5.6.1", + "react-content-loader": "^7.0.2", "use-debounce": "^10.0.4" } } From fe388d29df784eef823515ed01ab0b1af1fc3c86 Mon Sep 17 00:00:00 2001 From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com> Date: Sat, 1 Feb 2025 10:39:59 +0530 Subject: [PATCH 048/292] update: delete lock key after each check (#160) --- modules/connect/classes/service.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/connect/classes/service.php b/modules/connect/classes/service.php index 88180c45..576c19ed 100644 --- a/modules/connect/classes/service.php +++ b/modules/connect/classes/service.php @@ -271,6 +271,7 @@ public static function refresh_token() { if ( ! empty( $last_token ) && $last_token === $current_refresh_token ) { sleep( 1 ); + delete_option( $lock_key ); return; } @@ -278,10 +279,12 @@ public static function refresh_token() { $locked = Data::insert_option_uniquely( $lock_key, $current_refresh_token ); if ( ! $locked ) { sleep( 1 ); + delete_option( $lock_key ); return; } self::get_token( GrantTypes::REFRESH_TOKEN, $current_refresh_token ); + delete_option( $lock_key ); } /** From ebb2792ad39551214b628452bfde87570569e4d9 Mon Sep 17 00:00:00 2001 From: Pavlo Kniazevych <139438463+pkniazevych@users.noreply.github.com> Date: Sat, 1 Feb 2025 19:14:11 +0200 Subject: [PATCH 049/292] New: Update dashboard icon size [n/a] (#158) * New: Update dashboard icon size [n/a] * Fix: Fix widget previews [n/a] --- assets/css/admin.css | 5 ++++- modules/settings/classes/settings.php | 14 ++++++++++++- modules/settings/module.php | 2 +- modules/widget/module.php | 29 +++++++++++++++------------ 4 files changed, 34 insertions(+), 16 deletions(-) diff --git a/assets/css/admin.css b/assets/css/admin.css index 68566a17..71f955b3 100644 --- a/assets/css/admin.css +++ b/assets/css/admin.css @@ -1,5 +1,8 @@ #adminmenu .toplevel_page_accessibility-settings .wp-menu-image img { - padding: 5px 0 0; + width: 18px; + height: 18px; + padding: 8px 0 0 3px; + opacity: 1; filter: none; } diff --git a/modules/settings/classes/settings.php b/modules/settings/classes/settings.php index 535fc4c8..498055b2 100644 --- a/modules/settings/classes/settings.php +++ b/modules/settings/classes/settings.php @@ -22,7 +22,19 @@ class Settings { * @return mixed */ public static function get( string $option_name ) { - return get_option( $option_name ); + switch ( $option_name ) { + case self::PLAN_DATA: + $value = get_option( $option_name ); + + if ( is_string( $value ) ) { + return json_decode( $value ); + } + + return $value; + + default: + return get_option( $option_name ); + } } /** diff --git a/modules/settings/module.php b/modules/settings/module.php index 4edd6d76..4f40ac26 100644 --- a/modules/settings/module.php +++ b/modules/settings/module.php @@ -114,7 +114,7 @@ public static function refresh_plan_data() { } if ( ! is_wp_error( $response ) ) { - Settings::set( Settings::PLAN_DATA, $response ); + Settings::set( Settings::PLAN_DATA, json_decode( $response ) ); Settings::set( Settings::IS_VALID_PLAN_DATA, true ); } else { Logger::error( esc_html( $response->get_error_message() ) ); diff --git a/modules/widget/module.php b/modules/widget/module.php index 51f6aaaf..b3c365e9 100644 --- a/modules/widget/module.php +++ b/modules/widget/module.php @@ -25,7 +25,6 @@ public function get_name(): string { * @throws Exception */ public function enqueue_accessibility_widget() : void { - if ( ! Connect::is_connected() ) { return; } @@ -98,18 +97,22 @@ public function enqueue_accessibility_widget_admin( $hook ) : void { return; } - wp_localize_script( - 'admin', // use admin settings script - 'ea11yWidget', - [ - 'iconSettings' => $this->get_widget_icon_settings(), - 'toolsSettings' => get_option( 'ea11y_widget_menu_settings' ), - 'preview' => true, - 'previewContainer' => '#ea11y-widget-preview--container', - 'apiKey' => $plan_data->public_api_key, - 'accessibilityStatementURL' => $this->get_accessibility_statement_url(), - ] - ); + $widget_state = [ + 'iconSettings' => $this->get_widget_icon_settings(), + 'toolsSettings' => get_option( 'ea11y_widget_menu_settings' ), + 'preview' => true, + 'previewContainer' => '#ea11y-widget-preview--container', + 'apiKey' => $plan_data->public_api_key, + 'accessibilityStatementURL' => $this->get_accessibility_statement_url(), + ]; + + ?> + + + + Date: Wed, 5 Feb 2025 18:50:27 +0530 Subject: [PATCH 050/292] [APP-1018] Help menu change (#155) * update: remove accessibility word from menu items * update: remove top bar * update: add help button to the sidebar * update: re-add spacing in styled css code * update: create styled components --- modules/settings/assets/js/app.js | 3 -- .../js/components/my-account-menu/index.js | 45 +++++++++++++++---- .../assets/js/components/sidebar-menu/menu.js | 4 +- .../settings/assets/js/pages/icon-settings.js | 14 ++++-- 4 files changed, 50 insertions(+), 16 deletions(-) diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js index 5bc7663b..4ab78f37 100644 --- a/modules/settings/assets/js/app.js +++ b/modules/settings/assets/js/app.js @@ -7,7 +7,6 @@ import { ConnectModal, Notifications, MenuItems, - AdminTopBar, PostConnectModal, } from '@ea11y/components'; import { @@ -67,8 +66,6 @@ const App = () => { - - `${theme.spacing(1)} ${theme.spacing(3)}`}; +`; const MyAccountMenu = () => { const { openSidebar, planData } = useSettings(); @@ -63,6 +76,13 @@ const MyAccountMenu = () => { } }; + const handleHelpButtonClick = () => { + mixpanelService.sendEvent('help_button_clicked', { + source: 'Header', + }); + window.open(HELP_LINK, '_blank'); + }; + return ( <> { }); }} > - + + + + + + , children: { @@ -22,7 +22,7 @@ export const MenuItems = { }, }, accessibilityStatement: { - name: __('Accessibility statement', 'pojo-accessibility'), + name: __('Statement', 'pojo-accessibility'), key: 'accessibility-statement', page: , icon: , diff --git a/modules/settings/assets/js/pages/icon-settings.js b/modules/settings/assets/js/pages/icon-settings.js index bc4fa1eb..1af0d3ef 100644 --- a/modules/settings/assets/js/pages/icon-settings.js +++ b/modules/settings/assets/js/pages/icon-settings.js @@ -1,3 +1,4 @@ +import Box from '@elementor/ui/Box'; import Container from '@elementor/ui/Container'; import Typography from '@elementor/ui/Typography'; import { styled } from '@elementor/ui/styles'; @@ -7,6 +8,14 @@ import { mixpanelService } from '@ea11y/services'; import { useEffect } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; +const StyledBox = styled(Box)` + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + height: 100%; +`; + const StyledContainer = styled(Container)` overflow: auto; max-height: 100%; @@ -21,7 +30,7 @@ const IconSettings = () => { }, []); return ( - <> + {__('Button', 'pojo-accessibility')} @@ -31,9 +40,8 @@ const IconSettings = () => { - - + ); }; From f772be8da41a59370705870fd08c57db992b771d Mon Sep 17 00:00:00 2001 From: Raz Ohad Date: Wed, 5 Feb 2025 15:25:30 +0200 Subject: [PATCH 051/292] [APP-973] Add an UTM for users upgrading from one click to the new widget (#165) --- modules/connect/module.php | 22 ++++++++++++++++++++++ modules/legacy/components/upgrade.php | 10 ++++++++++ 2 files changed, 32 insertions(+) diff --git a/modules/connect/module.php b/modules/connect/module.php index 3c38df37..dfb41af5 100644 --- a/modules/connect/module.php +++ b/modules/connect/module.php @@ -54,9 +54,31 @@ public static function is_connected() : bool { return ! ! Data::get_access_token() && Utils::is_valid_home_url(); } + public function authorize_url( $authorize_url ) { + $utm_params = []; + + $a11y_campaign = get_transient( 'elementor_ea11y_campaign' ); + if ( false === $a11y_campaign ) { + return $authorize_url; + } + + foreach ( [ 'source', 'medium', 'campaign' ] as $key ) { + if ( ! empty( $a11y_campaign[ $key ] ) ) { + $utm_params[ 'utm_' . $key ] = $a11y_campaign[ $key ]; + } + } + + if ( ! empty( $utm_params ) ) { + $authorize_url = add_query_arg( $utm_params, $authorize_url ); + } + + return $authorize_url; + } + public function __construct() { $this->register_components(); $this->register_routes(); + add_filter( 'ea11y_connect_authorize_url', [ $this, 'authorize_url' ] ); } } diff --git a/modules/legacy/components/upgrade.php b/modules/legacy/components/upgrade.php index b0956845..47f07cb0 100644 --- a/modules/legacy/components/upgrade.php +++ b/modules/legacy/components/upgrade.php @@ -535,6 +535,16 @@ public function handle_ajax_upgrade() { } self::upgrade(); + + // store upgrade campaign data + $campaign_data = [ + 'source' => 'one-click-upgrade', + 'campaign' => 'a11y-upgrade', + 'medium' => 'wp-dash', + ]; + + set_transient( 'elementor_ea11y_campaign', $campaign_data, 30 * DAY_IN_SECONDS ); + wp_send_json_success( [] ); } From dccb071a671d33bc9bd040efcebd4444ebedde81 Mon Sep 17 00:00:00 2001 From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com> Date: Wed, 5 Feb 2025 19:04:30 +0530 Subject: [PATCH 052/292] update: ui of the statement preview (#166) --- .../assets/js/components/html-to-typography/index.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/settings/assets/js/components/html-to-typography/index.js b/modules/settings/assets/js/components/html-to-typography/index.js index ba6ccdd7..17f36be1 100644 --- a/modules/settings/assets/js/components/html-to-typography/index.js +++ b/modules/settings/assets/js/components/html-to-typography/index.js @@ -10,6 +10,15 @@ const HtmlToTypography = ({ htmlString, replacements }) => { Object.keys(replacements).forEach((key) => { const placeholder = `{${key}}`; // Create placeholder format (e.g., {company_name}) const value = replacements[key]; // Get the replacement value + + // Show placeholders in the preview until user fills in details. + if (replacements[key] === '') { + const preparedText = `[${key?.split('_').join(' ')}]`; + updatedText = updatedText.replace( + new RegExp(placeholder, 'g'), + preparedText, + ); + } updatedText = updatedText.replace(new RegExp(placeholder, 'g'), value); }); @@ -41,6 +50,7 @@ const HtmlToTypography = ({ htmlString, replacements }) => { component={tagName} marginBottom={1} sx={node.attribs.class ? { textAlign: 'center' } : {}} //for correct render on preview + color={tagName === 'p' ? 'text.secondary' : 'text.primary'} > {node.children && node.children.map((child) => transform(child))} From 5ad4b60364b3b61d6cf6fd10ba820cd32d5f66b8 Mon Sep 17 00:00:00 2001 From: VasylD Date: Wed, 5 Feb 2025 15:40:42 +0200 Subject: [PATCH 053/292] [APP-1011][APP-1013] focus outline and sitemap settings (#161) * [APP-1011][APP-1013] focus outline and sitemap settings * [APP-1011][APP-1013] focus outline and sitemap settings * [APP-1011][APP-1013] focus outline and sitemap settings * [APP-1011][APP-1013] focus outline and sitemap settings --- .../assets/js/components/bottom-bar/index.js | 5 +- .../js/components/sitemap-settings/index.js | 138 ++++++++++++++++++ .../assets/js/constants/menu-settings.js | 10 ++ .../settings/assets/js/hooks/use-settings.js | 11 ++ .../settings/assets/js/icons/focus-icon.js | 22 +++ .../settings/assets/js/icons/sitemap-icon.js | 16 ++ .../assets/js/layouts/menu-settings.js | 38 ++++- modules/settings/assets/js/utils/index.js | 6 + modules/settings/module.php | 7 + 9 files changed, 244 insertions(+), 9 deletions(-) create mode 100644 modules/settings/assets/js/components/sitemap-settings/index.js create mode 100644 modules/settings/assets/js/icons/focus-icon.js create mode 100644 modules/settings/assets/js/icons/sitemap-icon.js diff --git a/modules/settings/assets/js/components/bottom-bar/index.js b/modules/settings/assets/js/components/bottom-bar/index.js index 2f88f25b..f4de3130 100644 --- a/modules/settings/assets/js/components/bottom-bar/index.js +++ b/modules/settings/assets/js/components/bottom-bar/index.js @@ -21,6 +21,7 @@ const BottomBar = () => { iconDesign, iconPosition, hasChanges, + hasError, setHasChanges, } = useSettings(); const { save } = useStorage(); @@ -66,7 +67,9 @@ const BottomBar = () => { variant="contained" color="info" onClick={saveSettings} - disabled={!hasChanges} + disabled={ + !hasChanges || Object.keys(hasError).some((key) => hasError[key]) + } > {__('Save changes', 'pojo-accessibility')} diff --git a/modules/settings/assets/js/components/sitemap-settings/index.js b/modules/settings/assets/js/components/sitemap-settings/index.js new file mode 100644 index 00000000..2356d4b7 --- /dev/null +++ b/modules/settings/assets/js/components/sitemap-settings/index.js @@ -0,0 +1,138 @@ +import { InfoCircleIcon } from '@elementor/icons'; +import { + Accordion, + AccordionDetails, + AccordionSummary, + AccordionSummaryIcon, +} from '@elementor/ui'; +import Box from '@elementor/ui/Box'; +import FormLabel from '@elementor/ui/FormLabel'; +import Infotip from '@elementor/ui/Infotip'; +import ListItemText from '@elementor/ui/ListItemText'; +import TextField from '@elementor/ui/TextField'; +import Typography from '@elementor/ui/Typography'; +import { styled } from '@elementor/ui/styles'; +import { useSettings } from '@ea11y/hooks'; +import { __ } from '@wordpress/i18n'; +import { validateUrl } from '../../utils'; + +const SitemapSettings = ({ sitemap }) => { + const { + widgetMenuSettings, + setWidgetMenuSettings, + setHasChanges, + hasError, + setHasError, + } = useSettings(); + + const onEditSitemap = (event) => { + setWidgetMenuSettings({ + ...widgetMenuSettings, + sitemap: { + enabled: true, + url: event.target.value, + }, + }); + const isValid = validateUrl(event.target.value); + + setHasError({ + ...hasError, + sitemap: !isValid, + }); + setHasChanges(isValid); + }; + + return ( + + + + {sitemap?.icon} + + + + + + + {__('Sitemap URL')} + + + {__( + 'You need to add a link to activate this', + 'pojo-accessibility', + )} + + } + placement="right" + arrow={true} + > + + + + + + {hasError.sitemap && ( + + {__('Please enter valid URL!', 'pojo-accessibility')} + + )} + + + + + ); +}; + +const StyledAccordion = styled(Accordion)` + border: none; + width: 100%; +`; + +const StyledAccordionSummary = styled(AccordionSummary)` + padding: 0; + min-height: auto; + justify-content: left; + &.Mui-expanded { + min-height: auto; + } + + & .MuiAccordionSummary-content, + & .MuiAccordionSummary-content.Mui-expanded { + margin: 0 !important; + align-items: center; + flex-grow: 0; + } +`; + +const StyledBox = styled(Box)` + display: flex; + gap: 16px; + align-items: flex-start; +`; + +const StyledFormLabel = styled(FormLabel)` + display: flex; + align-items: center; + gap: 8px; + white-space: nowrap; + padding-top: 4px; +`; + +const StyledAccordionDetails = styled(AccordionDetails)` + padding: 5px 45px 5px 0; +`; + +export default SitemapSettings; diff --git a/modules/settings/assets/js/constants/menu-settings.js b/modules/settings/assets/js/constants/menu-settings.js index 86d01eed..5c4cb456 100644 --- a/modules/settings/assets/js/constants/menu-settings.js +++ b/modules/settings/assets/js/constants/menu-settings.js @@ -11,6 +11,8 @@ import { HideImagesIcon, PauseAnimationsIcon, } from '@ea11y/icons'; +import FocusIcon from '@ea11y/icons/focus-icon'; +import SitemapIcon from '@ea11y/icons/sitemap-icon'; import { __ } from '@wordpress/i18n'; const iconStyle = { color: 'black' }; @@ -57,6 +59,10 @@ export const MENU_SETTINGS = { title: __('Page structure', 'pojo-accessibility'), icon: , }, + sitemap: { + title: __('Sitemap', 'pojo-accessibility'), + icon: , + }, 'reading-mask': { title: __('Reading mask', 'pojo-accessibility'), icon: , @@ -73,6 +79,10 @@ export const MENU_SETTINGS = { title: __('Highlight links', 'pojo-accessibility'), icon: , }, + 'focus-outline': { + title: __('Orientation', 'pojo-accessibility'), + icon: , + }, }, }, }; diff --git a/modules/settings/assets/js/hooks/use-settings.js b/modules/settings/assets/js/hooks/use-settings.js index 7b8afa5d..af9a3132 100644 --- a/modules/settings/assets/js/hooks/use-settings.js +++ b/modules/settings/assets/js/hooks/use-settings.js @@ -38,6 +38,9 @@ export const SettingsProvider = ({ children }) => { 'page-structure': { enabled: true, }, + sitemap: { + enabled: true, + }, 'reading-mask': { enabled: true, }, @@ -50,12 +53,18 @@ export const SettingsProvider = ({ children }) => { 'highlight-links': { enabled: true, }, + 'focus-outline': { + enabled: true, + }, }); const [planData, setPlanData] = useState(null); // Track settings changes to enable/disable Save Changes button const [hasChanges, setHasChanges] = useState(false); + const [hasError, setHasError] = useState({ + sitemap: false, + }); const [hideMinimumOptionAlert, setHideMinimumOptionAlert] = useState(false); const [iconDesign, setIconDesign] = useState({ icon: 'person', @@ -138,6 +147,8 @@ export const SettingsProvider = ({ children }) => { setIconDesign, hasChanges, setHasChanges, + hasError, + setHasError, planData, setPlanData, companyData, diff --git a/modules/settings/assets/js/icons/focus-icon.js b/modules/settings/assets/js/icons/focus-icon.js new file mode 100644 index 00000000..e3ba0260 --- /dev/null +++ b/modules/settings/assets/js/icons/focus-icon.js @@ -0,0 +1,22 @@ +import SvgIcon from '@elementor/ui/SvgIcon'; + +const FocusIcon = (props, { size }) => { + return ( + + + + + + + ); +}; + +export default FocusIcon; diff --git a/modules/settings/assets/js/icons/sitemap-icon.js b/modules/settings/assets/js/icons/sitemap-icon.js new file mode 100644 index 00000000..f7b3ecee --- /dev/null +++ b/modules/settings/assets/js/icons/sitemap-icon.js @@ -0,0 +1,16 @@ +import SvgIcon from '@elementor/ui/SvgIcon'; + +const SitemapIcon = (props, { size }) => { + return ( + + + + ); +}; + +export default SitemapIcon; diff --git a/modules/settings/assets/js/layouts/menu-settings.js b/modules/settings/assets/js/layouts/menu-settings.js index d90441de..adb432b6 100644 --- a/modules/settings/assets/js/layouts/menu-settings.js +++ b/modules/settings/assets/js/layouts/menu-settings.js @@ -1,4 +1,4 @@ -import { CardActions } from '@elementor/ui'; +import { CardActions, ListItemSecondaryAction } from '@elementor/ui'; import Alert from '@elementor/ui/Alert'; import Box from '@elementor/ui/Box'; import Card from '@elementor/ui/Card'; @@ -13,11 +13,13 @@ import Switch from '@elementor/ui/Switch'; import Typography from '@elementor/ui/Typography'; import { styled } from '@elementor/ui/styles'; import { BottomBar } from '@ea11y/components'; +import SitemapSettings from '@ea11y/components/sitemap-settings'; import { useSettings, useStorage } from '@ea11y/hooks'; import { mixpanelService } from '@ea11y/services'; import { useEffect, useState } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; import { MENU_SETTINGS } from '../constants/menu-settings'; +import { validateUrl } from '../utils'; const StyledSwitch = styled(Switch)` input { @@ -51,6 +53,8 @@ const MenuSettings = () => { widgetMenuSettings, setWidgetMenuSettings, setHasChanges, + hasError, + setHasError, hideMinimumOptionAlert, setHideMinimumOptionAlert, } = useSettings(); @@ -74,10 +78,20 @@ const MenuSettings = () => { const newSettings = { ...prevSettings, [option]: { + ...prevSettings[option], enabled: !prevSettings[option]?.enabled, }, }; + if (option === 'sitemap') { + setHasError({ + ...hasError, + sitemap: !prevSettings[option]?.enabled + ? !validateUrl(prevSettings[option]?.url) + : false, + }); + } + setHasChanges(true); if (window?.ea11yWidget?.toolsSettings && window?.ea11yWidget?.widget) { @@ -143,11 +157,11 @@ const MenuSettings = () => { )} - + {Object.entries(MENU_SETTINGS).map(([parentKey, parentItem], i) => { return ( - + {parentItem.title} @@ -160,10 +174,21 @@ const MenuSettings = () => { ([childKey, childValue]) => { return ( + {childKey === 'sitemap' ? ( + + ) : ( + <> + {childValue.icon} + + + )} + + { : false } /> - } - > - {childValue.icon} - + ); }, diff --git a/modules/settings/assets/js/utils/index.js b/modules/settings/assets/js/utils/index.js index 3a67ddcc..4f3f256c 100644 --- a/modules/settings/assets/js/utils/index.js +++ b/modules/settings/assets/js/utils/index.js @@ -19,3 +19,9 @@ export const injectTemplateVars = (message, components) => { } }); }; + +export const validateUrl = (url) => { + const pattern = + /^(https?):\/\/([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}(:\d{1,5})?(\/.*)?$/i; + return pattern.test(url); +}; diff --git a/modules/settings/module.php b/modules/settings/module.php index 4f40ac26..8c129a52 100644 --- a/modules/settings/module.php +++ b/modules/settings/module.php @@ -210,6 +210,10 @@ private function set_default_settings() : void { 'page-structure' => [ 'enabled' => true, ], + 'sitemap' => [ + 'enabled' => false, + 'url' => home_url( '/wp-sitemap.xml' ), + ], 'reading-mask' => [ 'enabled' => true, ], @@ -222,6 +226,9 @@ private function set_default_settings() : void { 'highlight-links' => [ 'enabled' => true, ], + 'focus-outline' => [ + 'enabled' => true, + ], ]; $widget_icon_settings = [ From 6c765adfd2496714dcf9f9446f779ad68232bc03 Mon Sep 17 00:00:00 2001 From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com> Date: Wed, 5 Feb 2025 19:12:38 +0530 Subject: [PATCH 054/292] update: video link (#167) --- modules/legacy/components/upgrade.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/legacy/components/upgrade.php b/modules/legacy/components/upgrade.php index 47f07cb0..d445d6bb 100644 --- a/modules/legacy/components/upgrade.php +++ b/modules/legacy/components/upgrade.php @@ -169,11 +169,11 @@ public function maybe_add_introduction_modal() { + referrerpolicy="strict-origin-when-cross-origin" allowfullscreen + >

From c067ae8b4b2b40da223c0af422be5f5074b4c73d Mon Sep 17 00:00:00 2001 From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com> Date: Thu, 6 Feb 2025 14:50:07 +0530 Subject: [PATCH 055/292] [APP-1051] Fix layout on the small and medium devices (#156) * fix: layout on the small and medium devices * update: change components to styled components * refactor: position settings wrapper into a separate component --- .../settings/assets/js/components/index.js | 1 + .../position-settings-wrapper/index.js | 21 +++++++++++++++++++ .../assets/js/layouts/icon-design-settings.js | 16 ++++++++++++-- .../js/layouts/position-settings-desktop.js | 16 +++++++------- .../js/layouts/position-settings-mobile.js | 15 +++++++------ 5 files changed, 50 insertions(+), 19 deletions(-) create mode 100644 modules/settings/assets/js/components/position-settings-wrapper/index.js diff --git a/modules/settings/assets/js/components/index.js b/modules/settings/assets/js/components/index.js index d7134f21..8e1ba164 100644 --- a/modules/settings/assets/js/components/index.js +++ b/modules/settings/assets/js/components/index.js @@ -18,3 +18,4 @@ export { default as HtmlToTypography } from './html-to-typography'; export { default as WidgetLoader } from './widget-loader'; export { default as CopyLink } from './copy-link'; export { default as GeneratedPageInfoTipCard } from './generated-page-infotip-card'; +export { default as PositionSettingsWrapper } from './position-settings-wrapper'; diff --git a/modules/settings/assets/js/components/position-settings-wrapper/index.js b/modules/settings/assets/js/components/position-settings-wrapper/index.js new file mode 100644 index 00000000..cb27976e --- /dev/null +++ b/modules/settings/assets/js/components/position-settings-wrapper/index.js @@ -0,0 +1,21 @@ +import Box from '@elementor/ui/Box'; +import { styled } from '@elementor/ui/styles'; + +const StyledBox = styled(Box)` + display: grid; + justify-content: space-evenly; + + gap: ${({ theme }) => theme.spacing(5)}; + padding: ${({ theme }) => theme.spacing(2)}; + + grid-template-columns: repeat(2, 1fr); + ${({ theme }) => theme.breakpoints.down('lg')} { + grid-template-columns: repeat(1, 1fr); + } +`; + +const PositionSettingsWrapper = ({ children }) => { + return {children}; +}; + +export default PositionSettingsWrapper; diff --git a/modules/settings/assets/js/layouts/icon-design-settings.js b/modules/settings/assets/js/layouts/icon-design-settings.js index f5b9beec..7bf1bbb6 100644 --- a/modules/settings/assets/js/layouts/icon-design-settings.js +++ b/modules/settings/assets/js/layouts/icon-design-settings.js @@ -1,9 +1,21 @@ import Box from '@elementor/ui/Box'; import Grid from '@elementor/ui/Grid'; import Typography from '@elementor/ui/Typography'; +import { styled } from '@elementor/ui/styles'; import { ColorPicker, IconSelect, IconSize } from '@ea11y/components'; import { __ } from '@wordpress/i18n'; +const StyledGrid = styled(Grid)` + display: grid; + gap: ${({ theme }) => theme.spacing(5)}; + padding: ${({ theme }) => theme.spacing(2)}; + grid-template-columns: repeat(2, 1fr); + + ${({ theme }) => theme.breakpoints.down('lg')} { + grid-template-columns: repeat(1, 1fr); + } +`; + const IconDesignSettings = (props) => { return ( @@ -20,7 +32,7 @@ const IconDesignSettings = (props) => {
- + @@ -29,7 +41,7 @@ const IconDesignSettings = (props) => { - + ); }; diff --git a/modules/settings/assets/js/layouts/position-settings-desktop.js b/modules/settings/assets/js/layouts/position-settings-desktop.js index 9b7c5045..30104354 100644 --- a/modules/settings/assets/js/layouts/position-settings-desktop.js +++ b/modules/settings/assets/js/layouts/position-settings-desktop.js @@ -2,7 +2,11 @@ import Box from '@elementor/ui/Box'; import FormControlLabel from '@elementor/ui/FormControlLabel'; import Switch from '@elementor/ui/Switch'; import Typography from '@elementor/ui/Typography'; -import { AlignmentMatrixControl, PositionControl } from '@ea11y/components'; +import { + AlignmentMatrixControl, + PositionControl, + PositionSettingsWrapper, +} from '@ea11y/components'; import { useIconPosition } from '@ea11y/hooks'; import { mixpanelService } from '@ea11y/services'; import { __ } from '@wordpress/i18n'; @@ -61,13 +65,7 @@ const PositionSettingsDesktop = () => { checked={iconPosition.desktop.hidden} /> {!iconPosition.desktop.hidden && ( - + @@ -99,7 +97,7 @@ const PositionSettingsDesktop = () => { disabled={!iconPosition.desktop?.enableExactPosition} /> - + )} ); diff --git a/modules/settings/assets/js/layouts/position-settings-mobile.js b/modules/settings/assets/js/layouts/position-settings-mobile.js index d5774deb..a8238a1d 100644 --- a/modules/settings/assets/js/layouts/position-settings-mobile.js +++ b/modules/settings/assets/js/layouts/position-settings-mobile.js @@ -2,7 +2,11 @@ import Box from '@elementor/ui/Box'; import FormControlLabel from '@elementor/ui/FormControlLabel'; import Switch from '@elementor/ui/Switch'; import Typography from '@elementor/ui/Typography'; -import { AlignmentMatrixControl, PositionControl } from '@ea11y/components'; +import { + AlignmentMatrixControl, + PositionControl, + PositionSettingsWrapper, +} from '@ea11y/components'; import { useIconPosition } from '@ea11y/hooks'; import { mixpanelService } from '@ea11y/services'; import { __ } from '@wordpress/i18n'; @@ -59,12 +63,7 @@ const PositionSettingsMobile = () => { checked={iconPosition.mobile.hidden} /> {!iconPosition.mobile.hidden && ( - + { disabled={!iconPosition.mobile?.enableExactPosition} /> - + )} ); From 92ca3db6d6d5a4199fe8a613f4c658e3ef78cb6a Mon Sep 17 00:00:00 2001 From: VasylD Date: Fri, 7 Feb 2025 15:07:08 +0200 Subject: [PATCH 056/292] [APP-1012][APP-1085] Add skip to content settings and event for Mixpanel (#169) * [APP-1012][APP-1085] Add skip to content settings and event for Mixpanel * [APP-1012][APP-1085] Add skip to content settings and event for Mixpanel * [APP-1012][APP-1085] Add skip to content settings and event for Mixpanel * [APP-1012][APP-1085] Add skip to content settings and event for Mixpanel --- .../js/components/sitemap-settings/index.js | 24 ++- .../skip-to-content-settings/index.js | 203 ++++++++++++++++++ .../assets/js/constants/menu-settings.js | 2 +- .../assets/js/hooks/use-saved-settings.js | 5 + .../settings/assets/js/hooks/use-settings.js | 12 +- .../assets/js/layouts/menu-settings.js | 2 +- modules/settings/assets/js/pages/menu.js | 3 + modules/settings/assets/js/utils/index.js | 5 + modules/settings/classes/settings.php | 21 +- modules/settings/module.php | 56 +++-- modules/widget/module.php | 44 ++-- 11 files changed, 327 insertions(+), 50 deletions(-) create mode 100644 modules/settings/assets/js/components/skip-to-content-settings/index.js diff --git a/modules/settings/assets/js/components/sitemap-settings/index.js b/modules/settings/assets/js/components/sitemap-settings/index.js index 2356d4b7..7f0e7dc5 100644 --- a/modules/settings/assets/js/components/sitemap-settings/index.js +++ b/modules/settings/assets/js/components/sitemap-settings/index.js @@ -13,6 +13,7 @@ import TextField from '@elementor/ui/TextField'; import Typography from '@elementor/ui/Typography'; import { styled } from '@elementor/ui/styles'; import { useSettings } from '@ea11y/hooks'; +import { mixpanelService } from '@ea11y/services'; import { __ } from '@wordpress/i18n'; import { validateUrl } from '../../utils'; @@ -20,6 +21,7 @@ const SitemapSettings = ({ sitemap }) => { const { widgetMenuSettings, setWidgetMenuSettings, + hasChanges, setHasChanges, hasError, setHasError, @@ -42,6 +44,15 @@ const SitemapSettings = ({ sitemap }) => { setHasChanges(isValid); }; + const onBlur = () => { + if (hasChanges) { + mixpanelService.sendEvent('field_content_updated', { + fieldName: 'sitemap-url', + value: widgetMenuSettings.sitemap?.url, + }); + } + }; + return ( @@ -74,12 +85,12 @@ const SitemapSettings = ({ sitemap }) => { - { + const { save } = useStorage(); + const { success, error } = useToastNotification(); + + const { + skipToContentSettings, + setSkipToContentSettings, + skipToContentHasChanges, + setSkipToContentHasChanges, + hasError, + setHasError, + } = useSettings(); + + const toggleSetting = () => { + setSkipToContentSettings({ + ...skipToContentSettings, + enabled: !skipToContentSettings.enabled, + }); + setHasError({ + ...hasError, + sitemap: !skipToContentSettings?.enabled + ? !validateId(skipToContentSettings?.anchor) + : false, + }); + setSkipToContentHasChanges(true); + }; + + const onEditSkipToContent = (event) => { + setSkipToContentSettings({ + ...skipToContentSettings, + anchor: event.target.value, + }); + + const isValid = validateId(event.target.value); + + setHasError({ + ...hasError, + skipToContent: !isValid, + }); + setSkipToContentHasChanges(isValid); + }; + + const onBlur = () => { + if (skipToContentHasChanges) { + mixpanelService.sendEvent('field_content_updated', { + fieldName: 'skip-to-content-anchor', + value: skipToContentSettings.anchor, + }); + } + }; + + const saveSettings = async () => { + try { + const savedData = { + ea11y_skip_to_content_settings: skipToContentSettings, + }; + + await save(savedData); + + success(__('Settings saved!', 'pojo-accessibility')); + + setSkipToContentHasChanges(false); + + mixpanelService.sendEvent('save_button_clicked', { + savedData, + }); + } catch (e) { + error(__('Failed to save settings!', 'pojo-accessibility')); + } + }; + + const isSubmitDisabled = + !skipToContentSettings.anchor || + !skipToContentHasChanges || + hasError.skipToContent; + return ( + + + + {__('Skip to main content', 'pojo-accessibility')} + + + + + {__( + 'Add skip to content link when using keyboard', + 'pojo-accessibility', + )} + + + + {__('Content element ID', 'pojo-accessibility')} + + + + {__('Skip to main content', 'pojo-accessibility')} + + + {__( + 'This feature allows visitors with visual assistive tools to skip to the main content of each page they’re viewing.', + 'pojo-accessibility', + )} + + + } + placement="right" + arrow={true} + > + + + + + + {hasError.skipToContent && ( + + {__('Please enter valid ID!', 'pojo-accessibility')} + + )} + + + + + ); +}; + +const StyledBox = styled(Box)` + display: flex; + align-items: center; + justify-content: space-between; +`; +const StyledSwitch = styled(Switch)` + input { + height: 56px; + } +`; + +const StyledFormItem = styled(Box)` + display: flex; + gap: 16px; + align-items: flex-start; + justify-content: end; + padding-top: 16px; +`; + +const StyledFormLabel = styled(FormLabel)` + display: flex; + align-items: center; + gap: 8px; + white-space: nowrap; + padding-top: 7px; +`; + +const StyledTextField = styled(TextField)` + width: 200px; + input { + height: 36px; + } +`; + +export default SkipToContentSettings; diff --git a/modules/settings/assets/js/constants/menu-settings.js b/modules/settings/assets/js/constants/menu-settings.js index 5c4cb456..3474b218 100644 --- a/modules/settings/assets/js/constants/menu-settings.js +++ b/modules/settings/assets/js/constants/menu-settings.js @@ -80,7 +80,7 @@ export const MENU_SETTINGS = { icon: , }, 'focus-outline': { - title: __('Orientation', 'pojo-accessibility'), + title: __('Outline focus', 'pojo-accessibility'), icon: , }, }, diff --git a/modules/settings/assets/js/hooks/use-saved-settings.js b/modules/settings/assets/js/hooks/use-saved-settings.js index 322f359b..c39b6a2e 100644 --- a/modules/settings/assets/js/hooks/use-saved-settings.js +++ b/modules/settings/assets/js/hooks/use-saved-settings.js @@ -14,6 +14,7 @@ export const useSavedSettings = () => { setPlanData, setAccessibilityStatementData, setShowAccessibilityGeneratedInfotip, + setSkipToContentSettings, } = useSettings(); const result = useSelect((select) => { @@ -68,6 +69,10 @@ export const useSavedSettings = () => { result.data.ea11y_show_accessibility_generated_page_infotip, ); } + + if (result?.data?.ea11y_skip_to_content_settings) { + setSkipToContentSettings(result?.data?.ea11y_skip_to_content_settings); + } } }, [result.hasFinishedResolution]); diff --git a/modules/settings/assets/js/hooks/use-settings.js b/modules/settings/assets/js/hooks/use-settings.js index af9a3132..38c9210d 100644 --- a/modules/settings/assets/js/hooks/use-settings.js +++ b/modules/settings/assets/js/hooks/use-settings.js @@ -39,7 +39,7 @@ export const SettingsProvider = ({ children }) => { enabled: true, }, sitemap: { - enabled: true, + enabled: false, }, 'reading-mask': { enabled: true, @@ -58,12 +58,18 @@ export const SettingsProvider = ({ children }) => { }, }); + const [skipToContentSettings, setSkipToContentSettings] = useState({ + enabled: true, + }); + const [planData, setPlanData] = useState(null); // Track settings changes to enable/disable Save Changes button const [hasChanges, setHasChanges] = useState(false); + const [skipToContentHasChanges, setSkipToContentHasChanges] = useState(false); const [hasError, setHasError] = useState({ sitemap: false, + skipToContent: false, }); const [hideMinimumOptionAlert, setHideMinimumOptionAlert] = useState(false); const [iconDesign, setIconDesign] = useState({ @@ -139,6 +145,10 @@ export const SettingsProvider = ({ children }) => { setSelectedMenu, widgetMenuSettings, setWidgetMenuSettings, + skipToContentSettings, + setSkipToContentSettings, + skipToContentHasChanges, + setSkipToContentHasChanges, hideMinimumOptionAlert, setHideMinimumOptionAlert, iconPosition, diff --git a/modules/settings/assets/js/layouts/menu-settings.js b/modules/settings/assets/js/layouts/menu-settings.js index adb432b6..1e976aa4 100644 --- a/modules/settings/assets/js/layouts/menu-settings.js +++ b/modules/settings/assets/js/layouts/menu-settings.js @@ -28,7 +28,7 @@ const StyledSwitch = styled(Switch)` `; const StyledCardContent = styled(CardContent)` - height: 50vh; + height: 55vh; overflow: auto; margin-bottom: 61.5px; padding: 0 ${({ theme }) => theme.spacing(2)}; diff --git a/modules/settings/assets/js/pages/menu.js b/modules/settings/assets/js/pages/menu.js index 77675753..3e54689b 100644 --- a/modules/settings/assets/js/pages/menu.js +++ b/modules/settings/assets/js/pages/menu.js @@ -2,6 +2,7 @@ import Box from '@elementor/ui/Box'; import Container from '@elementor/ui/Container'; import Typography from '@elementor/ui/Typography'; import { styled } from '@elementor/ui/styles'; +import SkipToContentSettings from '@ea11y/components/skip-to-content-settings'; import { MenuSettings, WidgetPreview } from '@ea11y/layouts'; import { mixpanelService } from '@ea11y/services'; import { useEffect } from '@wordpress/element'; @@ -30,6 +31,8 @@ const Menu = () => { + + ); }; diff --git a/modules/settings/assets/js/utils/index.js b/modules/settings/assets/js/utils/index.js index 4f3f256c..27450689 100644 --- a/modules/settings/assets/js/utils/index.js +++ b/modules/settings/assets/js/utils/index.js @@ -25,3 +25,8 @@ export const validateUrl = (url) => { /^(https?):\/\/([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}(:\d{1,5})?(\/.*)?$/i; return pattern.test(url); }; + +export const validateId = (id) => { + const pattern = /^#[A-Za-z0-9_.-]+$/; + return pattern.test(id); +}; diff --git a/modules/settings/classes/settings.php b/modules/settings/classes/settings.php index 498055b2..f79d186f 100644 --- a/modules/settings/classes/settings.php +++ b/modules/settings/classes/settings.php @@ -13,6 +13,7 @@ class Settings { public const PLAN_DATA = 'ea11y_plan_data'; public const WIDGET_ICON_SETTINGS = 'ea11y_widget_icon_settings'; public const WIDGET_MENU_SETTINGS = 'ea11y_widget_menu_settings'; + public const SKIP_TO_CONTENT = 'ea11y_skip_to_content_settings'; /** * Returns plugin settings data by option name @@ -22,19 +23,19 @@ class Settings { * @return mixed */ public static function get( string $option_name ) { - switch ( $option_name ) { - case self::PLAN_DATA: - $value = get_option( $option_name ); + switch ( $option_name ) { + case self::PLAN_DATA: + $value = get_option( $option_name ); - if ( is_string( $value ) ) { - return json_decode( $value ); - } + if ( is_string( $value ) ) { + return json_decode( $value ); + } - return $value; + return $value; - default: - return get_option( $option_name ); - } + default: + return get_option( $option_name ); + } } /** diff --git a/modules/settings/module.php b/modules/settings/module.php index 8c129a52..64ca95e0 100644 --- a/modules/settings/module.php +++ b/modules/settings/module.php @@ -76,7 +76,7 @@ public function enqueue_scripts( $hook ) : void { return; } - self::refresh_plan_data(); + self::refresh_plan_data(); wp_enqueue_style( 'ea11y-admin-fonts', @@ -100,27 +100,27 @@ public function enqueue_scripts( $hook ) : void { ); } - public static function refresh_plan_data() { - $plan_data = Settings::get( Settings::PLAN_DATA ); + public static function refresh_plan_data() { + $plan_data = Settings::get( Settings::PLAN_DATA ); - $response = Utils::get_api_client()->make_request( - 'GET', - 'site/info', - [ 'api_key' => $plan_data->public_api_key ] - ); + $response = Utils::get_api_client()->make_request( + 'GET', + 'site/info', + [ 'api_key' => $plan_data->public_api_key ] + ); - if ( ! empty( $response->site_url ) && Data::get_home_url() !== $response->site_url ) { - Data::set_home_url( $response->site_url ); - } + if ( ! empty( $response->site_url ) && Data::get_home_url() !== $response->site_url ) { + Data::set_home_url( $response->site_url ); + } - if ( ! is_wp_error( $response ) ) { - Settings::set( Settings::PLAN_DATA, json_decode( $response ) ); - Settings::set( Settings::IS_VALID_PLAN_DATA, true ); - } else { - Logger::error( esc_html( $response->get_error_message() ) ); - Settings::set( Settings::IS_VALID_PLAN_DATA, false ); - } - } + if ( ! is_wp_error( $response ) ) { + Settings::set( Settings::PLAN_DATA, json_decode( $response ) ); + Settings::set( Settings::IS_VALID_PLAN_DATA, true ); + } else { + Logger::error( esc_html( $response->get_error_message() ) ); + Settings::set( Settings::IS_VALID_PLAN_DATA, false ); + } + } /** * Get Mixpanel project Token @@ -268,6 +268,11 @@ private function set_default_settings() : void { ], ]; + $skip_to_content_setting = [ + 'enabled' => true, + 'anchor' => '#content', + ]; + if ( ! get_option( Settings::WIDGET_MENU_SETTINGS ) ) { update_option( Settings::WIDGET_MENU_SETTINGS, $widget_menu_settings ); } @@ -275,6 +280,10 @@ private function set_default_settings() : void { if ( ! get_option( Settings::WIDGET_ICON_SETTINGS ) ) { update_option( Settings::WIDGET_ICON_SETTINGS, $widget_icon_settings ); } + + if ( ! get_option( Settings::SKIP_TO_CONTENT ) ) { + update_option( Settings::SKIP_TO_CONTENT, $skip_to_content_setting ); + } } /** @@ -337,6 +346,15 @@ public function register_settings(): void { ], ], ], + 'skip_to_content_settings' => [ + 'type' => 'object', + 'show_in_rest' => [ + 'schema' => [ + 'type' => 'object', + 'additionalProperties' => true, + ], + ], + ], 'plan_data' => [ 'type' => 'object', 'show_in_rest' => [ diff --git a/modules/widget/module.php b/modules/widget/module.php index b3c365e9..587eb30f 100644 --- a/modules/widget/module.php +++ b/modules/widget/module.php @@ -47,8 +47,9 @@ public function enqueue_accessibility_widget() : void { 'ea11y-widget', 'ea11yWidget', [ - 'iconSettings' => get_option( 'ea11y_widget_icon_settings' ), - 'toolsSettings' => get_option( 'ea11y_widget_menu_settings' ), + 'iconSettings' => get_option( Settings::WIDGET_ICON_SETTINGS ), + 'toolsSettings' => get_option( Settings::WIDGET_MENU_SETTINGS ), + 'skipToContent' => get_option( Settings::SKIP_TO_CONTENT ), 'accessibilityStatementURL' => $this->get_accessibility_statement_url(), ] ); @@ -97,22 +98,22 @@ public function enqueue_accessibility_widget_admin( $hook ) : void { return; } - $widget_state = [ - 'iconSettings' => $this->get_widget_icon_settings(), - 'toolsSettings' => get_option( 'ea11y_widget_menu_settings' ), - 'preview' => true, - 'previewContainer' => '#ea11y-widget-preview--container', - 'apiKey' => $plan_data->public_api_key, - 'accessibilityStatementURL' => $this->get_accessibility_statement_url(), - ]; + $widget_state = [ + 'iconSettings' => $this->get_widget_icon_settings(), + 'toolsSettings' => get_option( 'ea11y_widget_menu_settings' ), + 'preview' => true, + 'previewContainer' => '#ea11y-widget-preview--container', + 'apiKey' => $plan_data->public_api_key, + 'accessibilityStatementURL' => $this->get_accessibility_statement_url(), + ]; - ?> + ?> - + - remove_skip_link(); add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_accessibility_widget' ] ); add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_accessibility_widget_admin' ] ); } From 6f1b66ba31c73d5805572302d856498455c438fd Mon Sep 17 00:00:00 2001 From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com> Date: Sun, 9 Feb 2025 14:42:54 +0530 Subject: [PATCH 057/292] [APP-1048] Add tooltip to accessibility statement (#159) * add: tooltip to accessibility statement * update: hide infotip when statement link is set * update: infotip's text * fix: infotip naming and logic --- .../js/components/sidebar-menu/index.js | 3 + .../assets/js/components/sidebar-menu/menu.js | 2 + .../tooltips/accessibility-statement.js | 56 +++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 modules/settings/assets/js/components/sidebar-menu/tooltips/accessibility-statement.js diff --git a/modules/settings/assets/js/components/sidebar-menu/index.js b/modules/settings/assets/js/components/sidebar-menu/index.js index 58f5e9f7..2a04e76a 100644 --- a/modules/settings/assets/js/components/sidebar-menu/index.js +++ b/modules/settings/assets/js/components/sidebar-menu/index.js @@ -55,6 +55,9 @@ const SidebarMenu = () => { {item.icon}
); }; diff --git a/modules/settings/assets/js/components/post-connect-modal/index.js b/modules/settings/assets/js/components/post-connect-modal/index.js index bf2e2ffd..5d26af6d 100644 --- a/modules/settings/assets/js/components/post-connect-modal/index.js +++ b/modules/settings/assets/js/components/post-connect-modal/index.js @@ -1,8 +1,8 @@ -import Button from '@elementor/ui/Button'; import Grid from '@elementor/ui/Grid'; import Modal from '@elementor/ui/Modal'; import Typography from '@elementor/ui/Typography'; import { styled } from '@elementor/ui/styles'; +import Button from '@ea11y/components/button'; import { useModal, useStorage } from '@ea11y/hooks'; import { PostConnectModalIcon } from '@ea11y/icons'; import { eventNames, mixpanelService } from '@ea11y/services'; @@ -48,13 +48,15 @@ const PostConnectModal = () => { }; return ( - - + + , icon: ( - + ), }, capabilities: { @@ -27,6 +31,7 @@ export const MenuItems = { @@ -40,6 +45,7 @@ export const MenuItems = { @@ -55,6 +61,7 @@ export const MenuItems = { diff --git a/modules/settings/assets/js/components/sidebar-menu/tooltips/accessibility-statement.js b/modules/settings/assets/js/components/sidebar-menu/tooltips/accessibility-statement.js index b5d734b0..e954ce47 100644 --- a/modules/settings/assets/js/components/sidebar-menu/tooltips/accessibility-statement.js +++ b/modules/settings/assets/js/components/sidebar-menu/tooltips/accessibility-statement.js @@ -22,6 +22,7 @@ const AccessibilityStatementTooltip = () => { + {__( @@ -30,11 +31,13 @@ const AccessibilityStatementTooltip = () => { )} + + + + ), + }} + /> + + + + + +
+ ); +}; + +const StyledColorSet = styled(Box)` + display: flex; + align-items: center; + gap: ${({ theme }) => theme.spacing(1)}; +`; + +ColorSetDisabled.propTypes = { + title: PropTypes.string.isRequired, + description: PropTypes.string.isRequired, +}; diff --git a/modules/scanner/assets/js/components/color-contrast-form/index.js b/modules/scanner/assets/js/components/color-contrast-form/index.js index f5702513..6176623e 100644 --- a/modules/scanner/assets/js/components/color-contrast-form/index.js +++ b/modules/scanner/assets/js/components/color-contrast-form/index.js @@ -6,6 +6,7 @@ import Typography from '@elementor/ui/Typography'; import PropTypes from 'prop-types'; import { mixpanelEvents, mixpanelService } from '@ea11y-apps/global/services'; import { ColorSet } from '@ea11y-apps/scanner/components/color-contrast-form/color-set'; +import { ColorSetDisabled } from '@ea11y-apps/scanner/components/color-contrast-form/color-set-disabled'; import { ParentSelector } from '@ea11y-apps/scanner/components/color-contrast-form/parent-selector'; import { BLOCKS } from '@ea11y-apps/scanner/constants'; import { useColorContrastForm } from '@ea11y-apps/scanner/hooks/use-color-contrast-form'; @@ -46,7 +47,7 @@ export const ColorContrastForm = ({ items, current, setCurrent }) => { } }, [item]); - const isBackground = item.messageArgs[3] && item.messageArgs[4]; + const isBackgroundEnabled = item.messageArgs[3] && item.messageArgs[4]; const colorData = checkContrastAA(item.node); @@ -80,7 +81,7 @@ export const ColorContrastForm = ({ items, current, setCurrent }) => { area="color" /> - {isBackground && ( + {isBackgroundEnabled ? ( { setColor={changeBackground} area="background" /> + ) : ( + )} {backgroundChanged && ( diff --git a/modules/scanner/assets/js/components/header/index.js b/modules/scanner/assets/js/components/header/index.js index cf51ec6c..11e43893 100644 --- a/modules/scanner/assets/js/components/header/index.js +++ b/modules/scanner/assets/js/components/header/index.js @@ -37,8 +37,9 @@ export const Header = () => { isChanged, setOpenedBlock, setIsManage, + violation, } = useScannerWizardContext(); - const violation = results?.summary?.counts?.violation; + const onClose = () => { if (isManage) { setIsManage(false); diff --git a/modules/scanner/assets/js/context/scanner-wizard-context.js b/modules/scanner/assets/js/context/scanner-wizard-context.js index 3ffe7d6b..ea418df8 100644 --- a/modules/scanner/assets/js/context/scanner-wizard-context.js +++ b/modules/scanner/assets/js/context/scanner-wizard-context.js @@ -81,6 +81,7 @@ export const ScannerWizardContextProvider = ({ children }) => { structuredClone(MANUAL_GROUPS), ); const [openIndex, setOpenIndex] = useState(null); + const [violation, setViolation] = useState(null); useEffect(() => { const items = isManage @@ -113,6 +114,16 @@ export const ScannerWizardContextProvider = ({ children }) => { } }, [sortedRemediation]); + useEffect(() => { + if (results?.summary?.counts) { + const total = Object.values(sortedViolations).reduce( + (sum, arr) => sum + arr.length, + 0, + ); + setViolation(total); + } + }, [sortedViolations, results]); + const updateRemediationList = async () => { try { const items = await APIScanner.getRemediations( @@ -145,11 +156,6 @@ export const ScannerWizardContextProvider = ({ children }) => { setOpenIndex(null); }; - const violation = - results?.summary?.counts?.violation >= 0 - ? results?.summary?.counts?.violation - : null; - const registerPage = async (data, sorted) => { try { if (window?.ea11yScannerData?.pageData?.unregistered) { diff --git a/modules/scanner/assets/js/index.js b/modules/scanner/assets/js/index.js index 8cd25711..b4b85d62 100644 --- a/modules/scanner/assets/js/index.js +++ b/modules/scanner/assets/js/index.js @@ -91,6 +91,7 @@ const initApp = () => { // Can't use the settings hook in the global scope so accessing directly const isDevelopment = window?.ea11ySettingsData?.isDevelopment; const AppWrapper = Boolean(isDevelopment) ? StrictMode : Fragment; + const cache = createCache({ key: 'css', prepend: true, diff --git a/modules/scanner/module.php b/modules/scanner/module.php index 1f07d485..f3059e6b 100644 --- a/modules/scanner/module.php +++ b/modules/scanner/module.php @@ -106,6 +106,7 @@ public function enqueue_assets() : void { 'pluginVersion' => EA11Y_VERSION, 'isConnected' => Connect::is_connected(), 'isRTL' => is_rtl(), + 'isDevelopment' => defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG, ] ); } From b48551dc935d21731a9d1f71ed41df69e8aa996c Mon Sep 17 00:00:00 2001 From: Aviran Levi Date: Tue, 2 Sep 2025 16:33:26 +0300 Subject: [PATCH 191/292] pkg json lock update --- package-lock.json | 240 ---------------------------------------------- 1 file changed, 240 deletions(-) diff --git a/package-lock.json b/package-lock.json index ac10397f..c6a2c847 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4952,26 +4952,6 @@ "@parcel/watcher-win32-x64": "2.5.1" } }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/@parcel/watcher-darwin-arm64": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", @@ -4992,226 +4972,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/@paulirish/trace_engine": { "version": "0.0.57", "resolved": "https://registry.npmjs.org/@paulirish/trace_engine/-/trace_engine-0.0.57.tgz", From 40817395a14553c895428ca73d140c371e1d2165 Mon Sep 17 00:00:00 2001 From: VasylD Date: Thu, 4 Sep 2025 09:30:56 +0200 Subject: [PATCH 192/292] [APP-0000] add context to AI request (#399) --- .../assets/js/hooks/use-manual-fix-form.js | 3 ++ .../assets/js/utils/get-element-context.js | 52 +++++++++++++++++++ modules/scanner/rest/resolve-with-ai.php | 2 + 3 files changed, 57 insertions(+) create mode 100644 modules/scanner/assets/js/utils/get-element-context.js diff --git a/modules/scanner/assets/js/hooks/use-manual-fix-form.js b/modules/scanner/assets/js/hooks/use-manual-fix-form.js index 19baa802..2e5f2ca9 100644 --- a/modules/scanner/assets/js/hooks/use-manual-fix-form.js +++ b/modules/scanner/assets/js/hooks/use-manual-fix-form.js @@ -6,6 +6,7 @@ import { BLOCKS } from '@ea11y-apps/scanner/constants'; import { useScannerWizardContext } from '@ea11y-apps/scanner/context/scanner-wizard-context'; import { scannerItem } from '@ea11y-apps/scanner/types/scanner-item'; import { removeExistingFocus } from '@ea11y-apps/scanner/utils/focus-on-element'; +import { getElementContext } from '@ea11y-apps/scanner/utils/get-element-context'; import { useEffect, useState } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; @@ -51,9 +52,11 @@ export const useManualFixForm = ({ item, current }) => { const getAISuggestion = async () => { try { setAiResponseLoading(true); + const context = getElementContext(item.node); const result = await APIScanner.resolveWithAI({ snippet: item.snippet, violation: item.ruleId, + context, }); updateData({ aiSuggestion: result.data.response, diff --git a/modules/scanner/assets/js/utils/get-element-context.js b/modules/scanner/assets/js/utils/get-element-context.js new file mode 100644 index 00000000..7d29ce06 --- /dev/null +++ b/modules/scanner/assets/js/utils/get-element-context.js @@ -0,0 +1,52 @@ +export const getElementContext = (currentEl) => { + const headingSelector = 'h1, h2, h3, h4, h5, h6'; + const context = { + previousSiblings: [], + parentElements: [], + sectionHeadings: [], + }; + + // Find headings among previous sibling elements + let sibling = currentEl.previousElementSibling; + while (sibling) { + if (sibling.matches(headingSelector)) { + context.previousSiblings.push({ + outerHTML: sibling.outerHTML, + outerText: sibling.outerText, + }); + } + sibling = sibling.previousElementSibling; + } + + // Traverse up the DOM tree to find headings in ancestor elements + let ancestor = currentEl; + while (ancestor) { + // Check if this ancestor element itself is a heading + if (ancestor.matches(headingSelector)) { + context.parentElements.push({ + outerHTML: ancestor.outerHTML, + outerText: ancestor.outerText, + }); + } + + // Find section headers that are direct children of this ancestor + const scopedHeadingSelector = headingSelector + .split(',') + .map((sel) => `:scope > ${sel.trim()}`) + .join(', '); + const sectionHeaders = ancestor.querySelectorAll(scopedHeadingSelector); + + sectionHeaders?.forEach((sectionHeader) => { + if (sectionHeader) { + context.sectionHeadings.push({ + outerHTML: sectionHeader.outerHTML, + outerText: sectionHeader.outerText, + }); + } + }); + + ancestor = ancestor.parentElement; + } + + return context; +}; diff --git a/modules/scanner/rest/resolve-with-ai.php b/modules/scanner/rest/resolve-with-ai.php index 6d986208..55f71a12 100644 --- a/modules/scanner/rest/resolve-with-ai.php +++ b/modules/scanner/rest/resolve-with-ai.php @@ -38,6 +38,7 @@ public function POST( $request ) { $snippet = $request->get_param( 'snippet' ); $violation = $request->get_param( 'violation' ); + $context = $request->get_param( 'context' ); $result = Global_Utils::get_api_client()->make_request( 'POST', @@ -45,6 +46,7 @@ public function POST( $request ) { [ 'snippet' => $snippet, 'violation' => $violation, + 'htmlContext' => $context, ], [], true, From 21503176570e878aee96c2428fbeeda206b29812 Mon Sep 17 00:00:00 2001 From: VasylD Date: Mon, 8 Sep 2025 10:25:28 +0200 Subject: [PATCH 193/292] [APP-1956] apply only active remediations (#400) --- .../components/remediation-runner.php | 2 +- .../database/remediation-entry.php | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/modules/remediation/components/remediation-runner.php b/modules/remediation/components/remediation-runner.php index 9fa99f42..c858f656 100644 --- a/modules/remediation/components/remediation-runner.php +++ b/modules/remediation/components/remediation-runner.php @@ -148,7 +148,7 @@ private function should_run_remediation(): bool { ]); $this->page_html = $this->page->get_page_html(); - $this->page_remediations = Remediation_Entry::get_page_remediations( $current_url ); + $this->page_remediations = Remediation_Entry::get_page_active_remediations( $current_url ); $status = $this->page->__get( Page_Table::STATUS ); if ( empty( $this->page_remediations ) || Page_Table::STATUSES['ACTIVE'] !== $status ) { diff --git a/modules/remediation/database/remediation-entry.php b/modules/remediation/database/remediation-entry.php index 37c927fc..7102c998 100644 --- a/modules/remediation/database/remediation-entry.php +++ b/modules/remediation/database/remediation-entry.php @@ -79,6 +79,30 @@ public static function get_page_remediations( string $url, bool $total = false ) return Remediation_Table::select( $select, $where ); } + /** + * get_page_active_remediations + * + * @param string $url + * @return array + */ + public static function get_page_active_remediations( string $url ) : array { + $where = [ + [ + 'column' => Remediation_Table::URL, + 'value' => $url, + 'operator' => '=', + 'relation_after' => 'AND', + ], + [ + 'column' => Remediation_Table::ACTIVE, + 'value' => 1, + 'operator' => '=', + ], + ]; + + return Remediation_Table::select( '*', $where ); + } + public static function get_all_remediations( int $period ) : array { $date_threshold = gmdate( 'Y-m-d', strtotime( "-{$period} days" ) ) . ' 00:00:00'; From 74dee587c706ecee2afb143e3a900b2b2393c8a7 Mon Sep 17 00:00:00 2001 From: VasylD Date: Mon, 8 Sep 2025 13:59:26 +0200 Subject: [PATCH 194/292] [APP-0000] fix woocommerce archive type (#402) * [APP-0000] fix woocommerce archive type * [APP-0000] fix woocommerce archive type --- modules/remediation/classes/utils.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/remediation/classes/utils.php b/modules/remediation/classes/utils.php index ecf5053e..bcd27edb 100644 --- a/modules/remediation/classes/utils.php +++ b/modules/remediation/classes/utils.php @@ -122,7 +122,11 @@ public static function get_current_object_type_name() : string { } if ( $wp_query->is_post_type_archive() ) { - return $wp_query->query_vars['post_type'] ?? 'unknown'; + $post_type = $wp_query->query_vars['post_type']; + if ( is_array( $post_type ) ) { + $post_type = implode( '_', $post_type ); + } + return $post_type ?? 'unknown'; } if ( $wp_query->is_singular() ) { From 472bbe9f5aa4db0de605cf7cd021e0a40fe555bc Mon Sep 17 00:00:00 2001 From: VasylD Date: Mon, 8 Sep 2025 15:46:47 +0200 Subject: [PATCH 195/292] [APP-1919] exclude hidden elements from color contrast issue (#401) * [APP-1919] exclude hidden elements from color contrast issue * [APP-0000] fix woocommerce archive type * [APP-0000] fix woocommerce archive type * resolve comment * resolve comment --- modules/scanner/assets/js/constants/index.js | 5 +++++ .../assets/js/context/scanner-wizard-context.js | 17 +++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/modules/scanner/assets/js/constants/index.js b/modules/scanner/assets/js/constants/index.js index e3980de2..d2279f34 100644 --- a/modules/scanner/assets/js/constants/index.js +++ b/modules/scanner/assets/js/constants/index.js @@ -15,6 +15,11 @@ export const COLOR_CONTRAST_SELECTORS_COUNT = 5; export const DATA_INITIAL_BG = 'data-initial-bg'; export const DATA_INITIAL_COLOR = 'data-initial-color'; +export const LEVEL_VIOLATION = 'violation'; +export const LEVEL_POTENTIAL = 'potentialViolation'; +export const RULE_TEXT_CONTRAST = 'text_contrast_sufficient'; +export const RATIO_EXCLUDED = 1; + export const UPGRADE_URL = 'https://go.elementor.com/acc-free-no-AI-scanner'; export const COMPARE_PLAN_URL = 'https://go.elementor.com/acc-AI-limit-scanner'; export const PAGE_LIMIT_URL = 'https://go.elementor.com/acc-URL-limit-scanner'; diff --git a/modules/scanner/assets/js/context/scanner-wizard-context.js b/modules/scanner/assets/js/context/scanner-wizard-context.js index ea5b68c2..0714ea48 100644 --- a/modules/scanner/assets/js/context/scanner-wizard-context.js +++ b/modules/scanner/assets/js/context/scanner-wizard-context.js @@ -3,8 +3,12 @@ import { APIScanner } from '@ea11y-apps/scanner/api/APIScanner'; import { BLOCKS, INITIAL_SORTED_VIOLATIONS, + LEVEL_POTENTIAL, + LEVEL_VIOLATION, MANAGE_URL_PARAM, MANUAL_GROUPS, + RATIO_EXCLUDED, + RULE_TEXT_CONTRAST, } from '@ea11y-apps/scanner/constants'; import { scannerWizard } from '@ea11y-apps/scanner/services/scanner-wizard'; import { @@ -196,18 +200,23 @@ export const ScannerWizardContextProvider = ({ children }) => { } }; + const isViolation = (item) => item.level === LEVEL_VIOLATION; + const isContrastViolation = (item) => + item.ruleId === RULE_TEXT_CONTRAST && + item.level === LEVEL_POTENTIAL && + Number(item.messageArgs[0]) !== RATIO_EXCLUDED; + const getResults = async () => { setLoading(true); try { const url = new URL(window.location.href); const data = await window.ace.check(document); + const filtered = data.results.filter( - (item) => - item.level === 'violation' || - (item.ruleId === 'text_contrast_sufficient' && - item.level === 'potentialViolation'), + (item) => isViolation(item) || isContrastViolation(item), ); + const sorted = sortViolations(filtered); if (data?.summary?.counts) { From f1b8d52404e9843a4e4673849e2def9187f4ae45 Mon Sep 17 00:00:00 2001 From: VasylD Date: Tue, 9 Sep 2025 07:32:49 +0200 Subject: [PATCH 196/292] [APP-1938] replace name with key for mixpanel (#403) --- .../assets/js/components/block-button/manage-button.js | 2 +- .../settings/assets/js/components/sidebar-menu/menu-item.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/scanner/assets/js/components/block-button/manage-button.js b/modules/scanner/assets/js/components/block-button/manage-button.js index 0fa5d259..a36de740 100644 --- a/modules/scanner/assets/js/components/block-button/manage-button.js +++ b/modules/scanner/assets/js/components/block-button/manage-button.js @@ -22,7 +22,7 @@ export const ManageButton = ({ title, count, block }) => { mixpanelService.sendEvent(mixpanelEvents.categoryClicked, { page_url: window.ea11yScannerData?.pageData?.url, issue_count: count, - category_name: title, + category_name: block, source: 'remediation', }); }; diff --git a/modules/settings/assets/js/components/sidebar-menu/menu-item.js b/modules/settings/assets/js/components/sidebar-menu/menu-item.js index 44a7761d..204d0a26 100644 --- a/modules/settings/assets/js/components/sidebar-menu/menu-item.js +++ b/modules/settings/assets/js/components/sidebar-menu/menu-item.js @@ -37,7 +37,7 @@ const MenuItem = ({ keyName, item }) => { window.location.hash = parentKey; mixpanelService.sendEvent(mixpanelEvents.menuButtonClicked, { - buttonName: itemName, + buttonName: childKey || parentKey, }); }; @@ -47,7 +47,7 @@ const MenuItem = ({ keyName, item }) => { [itemKey]: !prev[itemKey], // Toggle the expanded state for the clicked item })); mixpanelService.sendEvent(mixpanelEvents.menuButtonClicked, { - buttonName: itemName, + buttonName: itemKey, }); }; From ad2174ffe396a004ba9afc5bd7993c54c53ce1ba Mon Sep 17 00:00:00 2001 From: VasylD Date: Wed, 24 Sep 2025 09:47:57 +0200 Subject: [PATCH 197/292] [APP-1792] Add headings structure (#406) * New: Add the heading structure components [APP-1792] (#391) * New: Add the new rules [APP-1792] * New: Add the BE integration [APP-1792] * Fix: Fix QA issues [APP-1792] * merge latest dev * merge latest dev * merge latest dev * merge latest dev * merge latest dev * merge latest dev * add reset to initial --------- Co-authored-by: Pavlo Kniazevych <139438463+pkniazevych@users.noreply.github.com> Co-authored-by: Kniazevych --- .../js/services/mixpanel/mixpanel-events.js | 4 + assets/dev/js/utils/inject-template-vars.js | 21 + modules/remediation/module.php | 2 + .../rest/dismiss-heading-issue.php | 69 + modules/remediation/rest/heading-level.php | 123 ++ modules/scanner/assets/js/api/APIScanner.js | 16 + modules/scanner/assets/js/app.js | 31 +- .../js/components/block-button/index.js | 2 +- .../components/block-button/resolve-chip.js | 2 +- .../js/components/header/dropdown-menu.js | 39 +- .../js/components/header/header-container.js | 103 ++ .../assets/js/components/header/index.js | 224 +-- .../js/components/header/stats/index.js | 19 + .../header/{ => stats}/management-stats.js | 0 .../header/{ => stats}/scan-stats.js | 23 +- .../header/{ => subheader}/breadcrumbs.js | 16 +- .../subheader/heading-structure/index.js | 105 ++ .../subheader/heading-structure/loader.js | 20 + .../heading-structure/title-row-item.js | 25 + .../subheader/heading-structure/title-row.js | 65 + .../js/components/header/subheader/index.js | 17 + .../js/components/header/title/index.js | 21 + .../js/components/header/title/main-title.js | 26 + .../header/title/manage-fixes-title.js | 17 + .../header/title/manage-headings-title.js | 27 + .../heading-structure/constants/index.js | 71 + .../heading-structure/heading-tree-empty.js | 28 + .../heading-tree-list-item/actions.js | 146 ++ .../heading-tree-list-item/alert.js | 26 + .../heading-tree-list-item/index.js | 179 ++ .../heading-tree-list-item/top-wrapper.js | 77 + .../heading-structure/heading-tree-list.js | 12 + .../heading-structure/heading-tree-loader.js | 28 + .../heading-structure/heading-tree.js | 72 + .../components/heading-structure/help-text.js | 31 + .../assets/js/components/main-list/index.js | 9 +- modules/scanner/assets/js/constants/index.js | 13 + .../js/context/heading-structure-context.js | 161 ++ .../js/context/scanner-wizard-context.js | 66 +- .../js/hooks/use-heading-node-manipulation.js | 108 ++ .../assets/js/hooks/use-scanner-settings.js | 58 + .../assets/js/images/theme-builder-icon.js | 13 + modules/scanner/assets/js/index.js | 5 +- .../js/layouts/heading-structure-layout.js | 20 + .../scanner/assets/js/layouts/main-layout.js | 2 +- .../js/rules/heading-hierarchy-check.js | 149 ++ modules/scanner/assets/js/rules/index.js | 45 + .../assets/js/rules/missing-h1-check.js | 102 ++ .../assets/js/rules/single-h1-check.js | 103 ++ .../scanner/assets/js/styles/app.styles.js | 30 +- .../js/styles/heading-structure.styles.js | 212 +++ modules/scanner/assets/js/types/heading.js | 35 + .../scanner/assets/js/types/scanner-item.js | 16 +- .../scanner/assets/js/utils/page-headings.js | 158 ++ .../assets/js/utils/validate-headings.js | 102 ++ modules/scanner/module.php | 7 + modules/scanner/rest/resolve-issue.php | 84 +- .../js/pages/accessibility-statement.js | 4 +- .../settings/assets/js/pages/pages.styles.js | 13 +- modules/settings/assets/js/utils/index.js | 22 - package-lock.json | 1618 ++++++++--------- package.json | 4 +- 62 files changed, 3726 insertions(+), 1120 deletions(-) create mode 100644 assets/dev/js/utils/inject-template-vars.js create mode 100644 modules/remediation/rest/dismiss-heading-issue.php create mode 100644 modules/remediation/rest/heading-level.php create mode 100644 modules/scanner/assets/js/components/header/header-container.js create mode 100644 modules/scanner/assets/js/components/header/stats/index.js rename modules/scanner/assets/js/components/header/{ => stats}/management-stats.js (100%) rename modules/scanner/assets/js/components/header/{ => stats}/scan-stats.js (78%) rename modules/scanner/assets/js/components/header/{ => subheader}/breadcrumbs.js (87%) create mode 100644 modules/scanner/assets/js/components/header/subheader/heading-structure/index.js create mode 100644 modules/scanner/assets/js/components/header/subheader/heading-structure/loader.js create mode 100644 modules/scanner/assets/js/components/header/subheader/heading-structure/title-row-item.js create mode 100644 modules/scanner/assets/js/components/header/subheader/heading-structure/title-row.js create mode 100644 modules/scanner/assets/js/components/header/subheader/index.js create mode 100644 modules/scanner/assets/js/components/header/title/index.js create mode 100644 modules/scanner/assets/js/components/header/title/main-title.js create mode 100644 modules/scanner/assets/js/components/header/title/manage-fixes-title.js create mode 100644 modules/scanner/assets/js/components/header/title/manage-headings-title.js create mode 100644 modules/scanner/assets/js/components/heading-structure/constants/index.js create mode 100644 modules/scanner/assets/js/components/heading-structure/heading-tree-empty.js create mode 100644 modules/scanner/assets/js/components/heading-structure/heading-tree-list-item/actions.js create mode 100644 modules/scanner/assets/js/components/heading-structure/heading-tree-list-item/alert.js create mode 100644 modules/scanner/assets/js/components/heading-structure/heading-tree-list-item/index.js create mode 100644 modules/scanner/assets/js/components/heading-structure/heading-tree-list-item/top-wrapper.js create mode 100644 modules/scanner/assets/js/components/heading-structure/heading-tree-list.js create mode 100644 modules/scanner/assets/js/components/heading-structure/heading-tree-loader.js create mode 100644 modules/scanner/assets/js/components/heading-structure/heading-tree.js create mode 100644 modules/scanner/assets/js/components/heading-structure/help-text.js create mode 100644 modules/scanner/assets/js/context/heading-structure-context.js create mode 100644 modules/scanner/assets/js/hooks/use-heading-node-manipulation.js create mode 100644 modules/scanner/assets/js/hooks/use-scanner-settings.js create mode 100644 modules/scanner/assets/js/images/theme-builder-icon.js create mode 100644 modules/scanner/assets/js/layouts/heading-structure-layout.js create mode 100644 modules/scanner/assets/js/rules/heading-hierarchy-check.js create mode 100644 modules/scanner/assets/js/rules/index.js create mode 100644 modules/scanner/assets/js/rules/missing-h1-check.js create mode 100644 modules/scanner/assets/js/rules/single-h1-check.js create mode 100644 modules/scanner/assets/js/styles/heading-structure.styles.js create mode 100644 modules/scanner/assets/js/types/heading.js create mode 100644 modules/scanner/assets/js/utils/page-headings.js create mode 100644 modules/scanner/assets/js/utils/validate-headings.js diff --git a/assets/dev/js/services/mixpanel/mixpanel-events.js b/assets/dev/js/services/mixpanel/mixpanel-events.js index 689ee84b..de113e44 100644 --- a/assets/dev/js/services/mixpanel/mixpanel-events.js +++ b/assets/dev/js/services/mixpanel/mixpanel-events.js @@ -69,4 +69,8 @@ export const mixpanelEvents = { feedbackSubmitted: 'review_feedback_submitted', publicRedirectClicked: 'review_public_redirect_clicked', }, + + // Heading Structure + headingClicked: 'heading_clicked', + headingSelected: 'heading_selected', }; diff --git a/assets/dev/js/utils/inject-template-vars.js b/assets/dev/js/utils/inject-template-vars.js new file mode 100644 index 00000000..3a67ddcc --- /dev/null +++ b/assets/dev/js/utils/inject-template-vars.js @@ -0,0 +1,21 @@ +import { createElement } from '@wordpress/element'; + +export const injectTemplateVars = (message, components) => { + const regex = /\{\{(\w+)\}\}([^]*?)\{\{\/\1\}\}/g; + const splitMessage = message.split(regex); + + // eslint-disable-next-line array-callback-return + return splitMessage.map((part, index) => { + if (index % 3 === 0) { + return part; + } + + if (index % 3 === 1) { + return createElement( + components[part], + { key: index }, + splitMessage[index + 1], + ); + } + }); +}; diff --git a/modules/remediation/module.php b/modules/remediation/module.php index 4de0999a..1c03c97a 100644 --- a/modules/remediation/module.php +++ b/modules/remediation/module.php @@ -28,6 +28,8 @@ public static function routes_list(): array { 'Items', 'Item', 'Trigger_Save', + 'Heading_Level', + 'Dismiss_Heading_Issue', 'Clear_Cache', ]; } diff --git a/modules/remediation/rest/dismiss-heading-issue.php b/modules/remediation/rest/dismiss-heading-issue.php new file mode 100644 index 00000000..d161a210 --- /dev/null +++ b/modules/remediation/rest/dismiss-heading-issue.php @@ -0,0 +1,69 @@ +verify_capability(); + + if ( $error ) { + return $error; + } + + $post_id = (int) sanitize_text_field( $request->get_param( 'pageId' ) ); + $xpath = sanitize_text_field( $request->get_param( 'xpath' ) ); + + if ( ! $post_id || ! $xpath ) { + return $this->respond_error_json( [ + 'message' => 'Missing required parameters', + 'code' => 'missing_parameters', + ] ); + } + + $data = get_post_meta( $post_id, self::META_KEY, true ) ?? []; + + if ( ! $data ) { + $data = []; + } + + $data[] = $xpath; + + update_post_meta( $post_id, self::META_KEY, array_unique( $data ) ); + + return $this->respond_success_json( [ + 'message' => 'Heading issue dismissed', + ] ); + } catch ( Throwable $t ) { + return $this->respond_error_json( [ + 'message' => $t->getMessage(), + 'code' => 'internal_server_error', + ] ); + } + } +} diff --git a/modules/remediation/rest/heading-level.php b/modules/remediation/rest/heading-level.php new file mode 100644 index 00000000..a1d0e13e --- /dev/null +++ b/modules/remediation/rest/heading-level.php @@ -0,0 +1,123 @@ +verify_capability(); + + if ( $error ) { + return $error; + } + + $url = esc_url( $request->get_param( 'url' ) ); + $level = sanitize_text_field( $request->get_param( 'level' ) ); + $xpath = sanitize_text_field( $request->get_param( 'xpath' ) ); + $rule = sanitize_text_field( $request->get_param( 'rule' ) ) ?? ''; + + // Remove existing remediations for this xpath before creating new ones + $this->remove_existing_remediations( $url, $xpath ); + + if ( 'p' === $level ) { + $this + ->create_remediation_entry( $url, $rule, [ + 'xpath' => $xpath, + 'attribute_name' => 'role', + 'attribute_value' => 'presentation', + ] ) + ->save(); + } else { + $this + ->create_remediation_entry( $url, $rule, [ + 'xpath' => $xpath, + 'attribute_name' => 'role', + 'attribute_value' => 'heading', + ] ) + ->save(); + + $this + ->create_remediation_entry( $url, $rule, [ + 'xpath' => $xpath, + 'attribute_name' => 'aria-level', + 'attribute_value' => trim( $level, 'h' ), + ] ) + ->save(); + } + + Page_Entry::clear_cache( $url ); + + return $this->respond_success_json( [ + 'message' => 'Remediation added', + ] ); + } catch ( Throwable $t ) { + return $this->respond_error_json( [ + 'message' => $t->getMessage(), + 'code' => 'internal_server_error', + ] ); + } + } + + private function remove_existing_remediations( string $url, string $xpath ): void { + $existing_entries = Remediation_Entry::get_page_remediations( $url ); + + foreach ( $existing_entries as $entry ) { + if ( isset( $entry->group ) && 'headingStructure' === $entry->group ) { + $content = json_decode( $entry->content, true ); + + if ( isset( $content['xpath'] ) && + $content['xpath'] === $xpath && + isset( $content['type'] ) && + 'ATTRIBUTE' === $content['type'] && + isset( $content['attribute_name'] ) && + in_array( $content['attribute_name'], [ 'role', 'aria-level' ], true ) + ) { + Remediation_Table::delete( [ 'id' => $entry->id ] ); + } + } + } + } + + private function create_remediation_entry( string $url, string $rule, array $data ): Remediation_Entry { + return new Remediation_Entry( [ + 'data' => [ + Remediation_Table::URL => $url, + Remediation_Table::CATEGORY => 'A', + Remediation_Table::RULE => $rule, + Remediation_Table::GROUP => 'headingStructure', + Remediation_Table::CONTENT => wp_json_encode( array_merge( [ + 'category' => 'A', + 'type' => 'ATTRIBUTE', + 'action' => 'update', + ], $data ) ), + Remediation_Table::ACTIVE => true, + ], + ] ); + } +} diff --git a/modules/scanner/assets/js/api/APIScanner.js b/modules/scanner/assets/js/api/APIScanner.js index 294b43fb..2b0130b0 100644 --- a/modules/scanner/assets/js/api/APIScanner.js +++ b/modules/scanner/assets/js/api/APIScanner.js @@ -120,6 +120,22 @@ export class APIScanner extends API { }); } + static async setHeadingLevel(data) { + return APIScanner.request({ + method: 'POST', + path: `${v1Prefix}/remediation/heading-level`, + data, + }); + } + + static async dismissHeadingIssue(data) { + return APIScanner.request({ + method: 'POST', + path: `${v1Prefix}/remediation/dismiss-heading-issue`, + data, + }); + } + static async clearCache(data) { return APIScanner.request({ method: 'DELETE', diff --git a/modules/scanner/assets/js/app.js b/modules/scanner/assets/js/app.js index 9e6c3eda..758eef4f 100644 --- a/modules/scanner/assets/js/app.js +++ b/modules/scanner/assets/js/app.js @@ -1,9 +1,10 @@ import ErrorBoundary from '@elementor/ui/ErrorBoundary'; +import { FocusTrap } from 'focus-trap-react'; import { Notifications } from '@ea11y/components'; import { useNotificationSettings } from '@ea11y-apps/global/hooks/use-notifications'; import { mixpanelEvents, mixpanelService } from '@ea11y-apps/global/services'; import { ErrorMessage } from '@ea11y-apps/scanner/components/error-message'; -import { Header } from '@ea11y-apps/scanner/components/header'; +import Header from '@ea11y-apps/scanner/components/header'; import { Loader } from '@ea11y-apps/scanner/components/list-loader'; import { NotConnectedMessage } from '@ea11y-apps/scanner/components/not-connected-message'; import { QuotaMessage } from '@ea11y-apps/scanner/components/quota-message'; @@ -18,9 +19,10 @@ import { RemediationLayout, } from '@ea11y-apps/scanner/layouts'; import { ColorContrastLayout } from '@ea11y-apps/scanner/layouts/color-contrast-layout'; +import { HeadingStructureLayout } from '@ea11y-apps/scanner/layouts/heading-structure-layout'; import { AppContainer } from '@ea11y-apps/scanner/styles/app.styles'; import { removeExistingFocus } from '@ea11y-apps/scanner/utils/focus-on-element'; -import { useEffect } from '@wordpress/element'; +import { useEffect, useRef } from '@wordpress/element'; const App = () => { const { notificationMessage, notificationType } = useNotificationSettings(); @@ -34,6 +36,7 @@ const App = () => { quotaExceeded, loading, } = useScannerWizardContext(); + const containerRef = useRef(null); const showResolvedMessage = Boolean( (resolved > 0 && violation === resolved) || violation === 0, @@ -85,21 +88,31 @@ const App = () => { return ; case BLOCKS.colorContrast: return ; + case BLOCKS.headingStructure: + return ; default: return isManage ? : ; } }; return ( - - }> -
+ + + }> +
- {showResolvedMessage && !isManage ? : getBlock()} + {showResolvedMessage && !isManage ? : getBlock()} - - - + + + + ); }; diff --git a/modules/scanner/assets/js/components/block-button/index.js b/modules/scanner/assets/js/components/block-button/index.js index 2b24ce66..f6725056 100644 --- a/modules/scanner/assets/js/components/block-button/index.js +++ b/modules/scanner/assets/js/components/block-button/index.js @@ -1,6 +1,6 @@ import CircleCheckFilledIcon from '@elementor/icons/CircleCheckFilledIcon'; -import { Chip } from '@elementor/ui'; import Box from '@elementor/ui/Box'; +import Chip from '@elementor/ui/Chip'; import Typography from '@elementor/ui/Typography'; import PropTypes from 'prop-types'; import { mixpanelEvents, mixpanelService } from '@ea11y-apps/global/services'; diff --git a/modules/scanner/assets/js/components/block-button/resolve-chip.js b/modules/scanner/assets/js/components/block-button/resolve-chip.js index 99dc3e2c..22769804 100644 --- a/modules/scanner/assets/js/components/block-button/resolve-chip.js +++ b/modules/scanner/assets/js/components/block-button/resolve-chip.js @@ -1,4 +1,4 @@ -import { Chip } from '@elementor/ui'; +import Chip from '@elementor/ui/Chip'; import PropTypes from 'prop-types'; import { BLOCKS } from '@ea11y-apps/scanner/constants'; import { __ } from '@wordpress/i18n'; diff --git a/modules/scanner/assets/js/components/header/dropdown-menu.js b/modules/scanner/assets/js/components/header/dropdown-menu.js index 117505f9..8c972abd 100644 --- a/modules/scanner/assets/js/components/header/dropdown-menu.js +++ b/modules/scanner/assets/js/components/header/dropdown-menu.js @@ -1,3 +1,4 @@ +import { ThemeBuilderIcon } from '@elementor/icons'; import CalendarDollarIcon from '@elementor/icons/CalendarDollarIcon'; import ClearIcon from '@elementor/icons/ClearIcon'; import DotsHorizontalIcon from '@elementor/icons/DotsHorizontalIcon'; @@ -18,12 +19,19 @@ import { APIScanner } from '@ea11y-apps/scanner/api/APIScanner'; import { BLOCKS } from '@ea11y-apps/scanner/constants'; import { useScannerWizardContext } from '@ea11y-apps/scanner/context/scanner-wizard-context'; import { DisabledMenuItemText } from '@ea11y-apps/scanner/styles/app.styles'; +import { areNoHeadingsDefined } from '@ea11y-apps/scanner/utils/page-headings'; import { useRef, useState } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; export const DropdownMenu = () => { - const { remediations, isManage, setOpenedBlock, setIsManage, runNewScan } = - useScannerWizardContext(); + const { + remediations, + isManage, + openedBlock, + setOpenedBlock, + setIsManage, + runNewScan, + } = useScannerWizardContext(); const { error } = useToastNotification(); const [isOpened, setIsOpened] = useState(false); const [loading, setLoading] = useState(false); @@ -68,6 +76,12 @@ export const DropdownMenu = () => { sendOnClickEvent('Manage fixes'); }; + const goToHeadingManager = () => { + handleClose(); + setIsManage(true); + setOpenedBlock(BLOCKS.headingStructure); + }; + return ( { ) : ( @@ -177,6 +191,23 @@ export const DropdownMenu = () => { )} + {!areNoHeadingsDefined() && ( + + + + + + + {__('Manage headings', 'pojo-accessibility')} + + + )} + { + const { isChanged, setOpenedBlock, isManage, setIsManage } = + useScannerWizardContext(); + + const goBack = () => { + setIsManage(false); + setOpenedBlock(BLOCKS.main); + }; + + const onClose = () => { + const widget = document.getElementById(ROOT_ID); + + closeWidget(widget); + + if (isChanged) { + void APIScanner.triggerSave({ + object_id: window?.ea11yScannerData?.pageData?.object_id, + object_type: window?.ea11yScannerData?.pageData?.object_type, + }); + } + }; + + return ( + + + + + + {isManage && ( + + + + )} + + + + + + + + + + + + + + + + + + {children} + + ); +}; + +const StyledHeaderContainer = styled(Box)` + position: sticky; + top: 0; + z-index: 2; + + overflow: visible; +`; + +const StyledTitleWrapper = styled(Box)` + display: flex; + align-items: center; + + .MuiButtonBase-root { + margin-inline-end: 8px; + } +`; + +HeaderContainer.propTypes = { + children: PropTypes.node, +}; + +export default HeaderContainer; diff --git a/modules/scanner/assets/js/components/header/index.js b/modules/scanner/assets/js/components/header/index.js index 11e43893..b0499f75 100644 --- a/modules/scanner/assets/js/components/header/index.js +++ b/modules/scanner/assets/js/components/header/index.js @@ -1,194 +1,76 @@ -import SettingsIcon from '@elementor/icons/SettingsIcon'; -import XIcon from '@elementor/icons/XIcon'; -import Box from '@elementor/ui/Box'; -import Card from '@elementor/ui/Card'; import Chip from '@elementor/ui/Chip'; -import IconButton from '@elementor/ui/IconButton'; -import Paper from '@elementor/ui/Paper'; import Typography from '@elementor/ui/Typography'; -import { styled } from '@elementor/ui/styles'; -import { APIScanner } from '@ea11y-apps/scanner/api/APIScanner'; -import { Breadcrumbs } from '@ea11y-apps/scanner/components/header/breadcrumbs'; -import { DropdownMenu } from '@ea11y-apps/scanner/components/header/dropdown-menu'; -import { ManagementStats } from '@ea11y-apps/scanner/components/header/management-stats'; -import { ScanStats } from '@ea11y-apps/scanner/components/header/scan-stats'; -import { - BLOCKS, - PAGE_QUOTA_LIMIT, - ROOT_ID, -} from '@ea11y-apps/scanner/constants'; +import HeaderContainer from '@ea11y-apps/scanner/components/header/header-container'; +import Stats from '@ea11y-apps/scanner/components/header/stats'; +import Subheader from '@ea11y-apps/scanner/components/header/subheader'; +import { BLOCKS, PAGE_QUOTA_LIMIT } from '@ea11y-apps/scanner/constants'; import { useScannerWizardContext } from '@ea11y-apps/scanner/context/scanner-wizard-context'; -import { Logo } from '@ea11y-apps/scanner/images'; +import useScannerSettings from '@ea11y-apps/scanner/hooks/use-scanner-settings'; import { - HeaderCard, - HeaderContent, TitleBox, + StyledStatsBlock, } from '@ea11y-apps/scanner/styles/app.styles'; -import { closeWidget } from '@ea11y-apps/scanner/utils/close-widget'; import { __ } from '@wordpress/i18n'; -export const Header = () => { - const { - openedBlock, - results, - loading, - isError, - isManage, - isChanged, - setOpenedBlock, - setIsManage, - violation, - } = useScannerWizardContext(); - - const onClose = () => { - if (isManage) { - setIsManage(false); - setOpenedBlock(BLOCKS.main); - } else { - const widget = document.getElementById(ROOT_ID); - closeWidget(widget); - if (isChanged) { - void APIScanner.triggerSave({ - object_id: window?.ea11yScannerData?.pageData?.object_id, - object_type: window?.ea11yScannerData?.pageData?.object_type, - }); - } - } - }; +const Header = () => { + const { openedBlock, results, loading, isError } = useScannerWizardContext(); + const { pageData, isConnected } = useScannerSettings(); + const violationsCount = results?.summary?.counts?.violation; - const showChip = + const showViolationsChip = PAGE_QUOTA_LIMIT && !isError && !loading && openedBlock === BLOCKS.main && - violation > 0; + violationsCount > 0; - const showMainBlock = - window.ea11yScannerData?.isConnected && - !isError && - PAGE_QUOTA_LIMIT && - (violation > 0 || loading); + const showShortHeader = + !isConnected || + isError || + !PAGE_QUOTA_LIMIT || + (!violationsCount && !loading); - const isMainHeader = + const showStatsBlock = openedBlock === BLOCKS.main || openedBlock === BLOCKS.management; - const headerData = () => { - switch (openedBlock) { - case BLOCKS.main: - return ; - case BLOCKS.management: - return ; - default: - return ; - } - }; - - const content = ( - <> - {isMainHeader && ( - - - {window?.ea11yScannerData?.pageData?.title} - - - {showChip && ( - - )} - - )} - - {headerData()} - - ); + if (showShortHeader) { + return ; + } - return ( - - - - + + - - {isManage ? ( - <> - - - - {__('Manage fixes', 'pojo-accessibility')} - - - ) : ( - <> - - - - {__('Accessibility Assistant', 'pojo-accessibility')} - - - - - )} - - - - - - - - - - - + + {pageData.title} + + + {showViolationsChip && ( + + )} + + + + + + ); + } - {showMainBlock && ( - - {isMainHeader ? ( - - {content} - - ) : ( - content - )} - - )} - + return ( + + + ); }; -const StyledCard = styled(Card)` - position: sticky; - top: 0; - z-index: 2; - overflow: visible; -`; - -const StyledTitle = styled(Typography)` - font-size: 16px; - font-weight: 500; - line-height: 130%; - letter-spacing: 0.15px; - margin: 0; - - .MuiChip-root { - margin-inline-start: ${({ theme }) => theme.spacing(1)}; - - font-weight: 400; - } -`; +export default Header; diff --git a/modules/scanner/assets/js/components/header/stats/index.js b/modules/scanner/assets/js/components/header/stats/index.js new file mode 100644 index 00000000..908b1460 --- /dev/null +++ b/modules/scanner/assets/js/components/header/stats/index.js @@ -0,0 +1,19 @@ +import { ManagementStats } from '@ea11y-apps/scanner/components/header/stats/management-stats'; +import { ScanStats } from '@ea11y-apps/scanner/components/header/stats/scan-stats'; +import { BLOCKS } from '@ea11y-apps/scanner/constants'; +import { useScannerWizardContext } from '@ea11y-apps/scanner/context/scanner-wizard-context'; + +const Stats = () => { + const { openedBlock } = useScannerWizardContext(); + + switch (openedBlock) { + case BLOCKS.main: + return ; + case BLOCKS.management: + return ; + default: + return false; + } +}; + +export default Stats; diff --git a/modules/scanner/assets/js/components/header/management-stats.js b/modules/scanner/assets/js/components/header/stats/management-stats.js similarity index 100% rename from modules/scanner/assets/js/components/header/management-stats.js rename to modules/scanner/assets/js/components/header/stats/management-stats.js diff --git a/modules/scanner/assets/js/components/header/scan-stats.js b/modules/scanner/assets/js/components/header/stats/scan-stats.js similarity index 78% rename from modules/scanner/assets/js/components/header/scan-stats.js rename to modules/scanner/assets/js/components/header/stats/scan-stats.js index 536bcdf9..25436af9 100644 --- a/modules/scanner/assets/js/components/header/scan-stats.js +++ b/modules/scanner/assets/js/components/header/stats/scan-stats.js @@ -4,6 +4,7 @@ import Button from '@elementor/ui/Button'; import LinearProgress from '@elementor/ui/LinearProgress'; import Typography from '@elementor/ui/Typography'; import { styled } from '@elementor/ui/styles'; +import { injectTemplateVars } from '@ea11y-apps/global/utils/inject-template-vars'; import { useScannerWizardContext } from '@ea11y-apps/scanner/context/scanner-wizard-context'; import { StyledSkeleton } from '@ea11y-apps/scanner/styles/app.styles'; import { __, sprintf } from '@wordpress/i18n'; @@ -14,6 +15,12 @@ export const ScanStats = () => { const percent = violation !== 0 ? Math.min((resolved / violation) * 100, 100) : 100; const displayPercent = results ? Math.round(percent) : 0; + const statsText = sprintf( + // Translators: %1$s - resolved, %2$s - percent + __('%1$s Fixed {{lightGrey}}(%2$s%%){{/lightGrey}}', 'pojo-accessibility'), + resolved, + displayPercent, + ); return ( @@ -25,20 +32,22 @@ export const ScanStats = () => { ) : ( <> - {sprintf( - // Translators: %1$s - resolved, %2$s - percent, %3$s - % - __('%1$s Fixed (%2$s%3$s)', 'pojo-accessibility'), - resolved, - displayPercent, - '%', - )} + {injectTemplateVars(statsText, { + lightGrey: ({ children }) => ( + + {children} + + ), + })} + + + + + + ); +}; + +HeadingTreeListItemActions.propTypes = { + status: PropTypes.oneOf(Object.values(HEADING_STATUS)).isRequired, + node: PropTypes.object.isRequired, + isDisabled: PropTypes.bool.isRequired, + isDismiss: PropTypes.bool.isRequired, + setIsDismiss: PropTypes.func.isRequired, + setIsSubmitted: PropTypes.func.isRequired, + displayLevel: PropTypes.string.isRequired, + violation: PropTypes.oneOf(Object.values(EA11Y_RULES)), + isExpanded: PropTypes.bool.isRequired, +}; + +export default HeadingTreeListItemActions; diff --git a/modules/scanner/assets/js/components/heading-structure/heading-tree-list-item/alert.js b/modules/scanner/assets/js/components/heading-structure/heading-tree-list-item/alert.js new file mode 100644 index 00000000..cb477300 --- /dev/null +++ b/modules/scanner/assets/js/components/heading-structure/heading-tree-list-item/alert.js @@ -0,0 +1,26 @@ +import AlertTitle from '@elementor/ui/AlertTitle'; +import Typography from '@elementor/ui/Typography'; +import PropTypes from 'prop-types'; +import { EA11Y_RULES } from '@ea11y-apps/scanner/rules'; +import { StyledListItemAlert } from '@ea11y-apps/scanner/styles/heading-structure.styles'; +import { HEADING_STATUS } from '@ea11y-apps/scanner/types/heading'; +import { VIOLATION_PARAMS } from '../constants'; + +const HeadingTreeListItemAlert = ({ status, violation }) => { + return ( + + {VIOLATION_PARAMS[violation]?.title} + + + {VIOLATION_PARAMS[violation]?.description} + + + ); +}; + +HeadingTreeListItemAlert.propTypes = { + status: PropTypes.oneOf(Object.values(HEADING_STATUS)).isRequired, + violation: PropTypes.oneOf(Object.values(EA11Y_RULES)).isRequired, +}; + +export default HeadingTreeListItemAlert; diff --git a/modules/scanner/assets/js/components/heading-structure/heading-tree-list-item/index.js b/modules/scanner/assets/js/components/heading-structure/heading-tree-list-item/index.js new file mode 100644 index 00000000..34ae2c67 --- /dev/null +++ b/modules/scanner/assets/js/components/heading-structure/heading-tree-list-item/index.js @@ -0,0 +1,179 @@ +import Collapse from '@elementor/ui/Collapse'; +import PropTypes from 'prop-types'; +import { mixpanelEvents, mixpanelService } from '@ea11y-apps/global/services'; +import HeadingTreeListItemActions from '@ea11y-apps/scanner/components/heading-structure/heading-tree-list-item/actions'; +import HeadingTreeListItemAlert from '@ea11y-apps/scanner/components/heading-structure/heading-tree-list-item/alert'; +import HeadingTreeListItemTopWrapper from '@ea11y-apps/scanner/components/heading-structure/heading-tree-list-item/top-wrapper'; +import { useHeadingStructureContext } from '@ea11y-apps/scanner/context/heading-structure-context'; +import { useHeadingNodeManipulation } from '@ea11y-apps/scanner/hooks/use-heading-node-manipulation'; +import { EA11Y_RULES } from '@ea11y-apps/scanner/rules'; +import { + StyledListItemBottomWrapper, + StyledListItemDetails, + StyledListItemSelect, + StyledTreeListItem, +} from '@ea11y-apps/scanner/styles/heading-structure.styles'; +import { HEADING_STATUS } from '@ea11y-apps/scanner/types/heading'; +import { memo, useEffect, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import { HEADING_OPTIONS } from '../constants'; + +const HeadingStructureHeadingTreeListItemBase = ({ + id, + level, + content, + node, + status, + violation = null, + isExpanded, + toggleHeading, +}) => { + const { isLoading, updateHeadingsTree } = useHeadingStructureContext(); + + const { + applyNewLevel, + hasDraft, + getDraftLevelForDisplay, + restoreOriginalAttributes, + } = useHeadingNodeManipulation({ node }); + + const isDraft = hasDraft(node); + const displayLevel = isDraft ? getDraftLevelForDisplay() : `h${level}`; + const [isDismiss, setIsDismiss] = useState(false); + const [isSubmitted, setIsSubmitted] = useState(false); + + const isApplyControlDisabled = + (HEADING_STATUS.WARNING === status && !isDismiss) || + (!isDraft && !isDismiss) || + isLoading; + + const onLevelChange = (e) => { + mixpanelService.sendEvent(mixpanelEvents.headingSelected, { + previous_heading: displayLevel, + new_heading: e.target.value.toUpperCase(), + }); + + applyNewLevel(e.target.value); + setIsSubmitted(false); + + updateHeadingsTree(); + }; + + const applyExpandedStyles = () => { + node.style.boxShadow = '0 0 0 8px #2563EB'; + node.style.borderRadius = '4px'; + node.style.transition = '300ms ease-in-out'; + + node.scrollIntoView({ + behavior: 'smooth', + }); + }; + + const removeExpandedStyles = () => { + node.style.boxShadow = ''; + node.style.borderRadius = ''; + node.style.transition = ''; + }; + + useEffect(() => { + if (isExpanded) { + applyExpandedStyles(); + } else { + removeExpandedStyles(); + if (!isSubmitted) { + restoreOriginalAttributes(); + setTimeout(() => updateHeadingsTree(), 0); + setIsSubmitted(false); + } + } + }, [isExpanded]); + + return ( + + + + + + + + {HEADING_OPTIONS} + + + {(HEADING_STATUS.ERROR === status || + (HEADING_STATUS.WARNING === status && !isDismiss)) && + violation && ( + + )} + + + + + + + ); +}; + +const HeadingStructureHeadingTreeListItem = memo( + HeadingStructureHeadingTreeListItemBase, + (prev, next) => + prev.id === next.id && + prev.level === next.level && + prev.content === next.content && + prev.node === next.node && + prev.status === next.status && + prev.violation === next.violation && + prev.isExpanded === next.isExpanded, +); + +HeadingStructureHeadingTreeListItem.propTypes = { + id: PropTypes.string.isRequired, + level: PropTypes.number.isRequired, + content: PropTypes.string.isRequired, + node: PropTypes.object.isRequired, + status: PropTypes.oneOf(Object.values(HEADING_STATUS)).isRequired, + violation: PropTypes.oneOf(Object.values(EA11Y_RULES)), + isExpanded: PropTypes.bool.isRequired, + toggleHeading: PropTypes.func.isRequired, +}; + +export default HeadingStructureHeadingTreeListItem; diff --git a/modules/scanner/assets/js/components/heading-structure/heading-tree-list-item/top-wrapper.js b/modules/scanner/assets/js/components/heading-structure/heading-tree-list-item/top-wrapper.js new file mode 100644 index 00000000..0455e675 --- /dev/null +++ b/modules/scanner/assets/js/components/heading-structure/heading-tree-list-item/top-wrapper.js @@ -0,0 +1,77 @@ +import Typography from '@elementor/ui/Typography'; +import PropTypes from 'prop-types'; +import { mixpanelEvents, mixpanelService } from '@ea11y-apps/global/services'; +import { + StyledListItemContent, + StyledListItemLevelBox, + StyledListItemTopWrapper, +} from '@ea11y-apps/scanner/styles/heading-structure.styles'; +import { + HEADING_STATUS, + HEADING_STATUS_DESCRIPTION, +} from '@ea11y-apps/scanner/types/heading'; +import { keyForNode } from '@ea11y-apps/scanner/utils/page-headings'; +import { STATUS_CONFIG } from '../constants'; + +const HeadingTreeListItemTopWrapper = ({ + id, + status, + isDismiss, + level, + node, + displayLevel, + content, + isExpanded, + toggleHeading, +}) => { + const visualStatus = isDismiss ? HEADING_STATUS.SUCCESS : status; + const config = STATUS_CONFIG[visualStatus]; + const IconComponent = config.icon; + + const onHeadingClick = () => { + if (!isExpanded) { + mixpanelService.sendEvent(mixpanelEvents.headingClicked, { + level: displayLevel, + location: keyForNode(node).replace('heading-tree-', ''), + }); + } + + toggleHeading(); + }; + + return ( + + + + {displayLevel.toUpperCase()} + + + + + {content} + + + + + ); +}; + +HeadingTreeListItemTopWrapper.propTypes = { + status: PropTypes.oneOf(Object.values(HEADING_STATUS)).isRequired, + isDismiss: PropTypes.bool.isRequired, + level: PropTypes.number.isRequired, + displayLevel: PropTypes.string.isRequired, + content: PropTypes.string.isRequired, + isExpanded: PropTypes.bool.isRequired, + toggleHeading: PropTypes.func.isRequired, +}; + +export default HeadingTreeListItemTopWrapper; diff --git a/modules/scanner/assets/js/components/heading-structure/heading-tree-list.js b/modules/scanner/assets/js/components/heading-structure/heading-tree-list.js new file mode 100644 index 00000000..7e9bb7a3 --- /dev/null +++ b/modules/scanner/assets/js/components/heading-structure/heading-tree-list.js @@ -0,0 +1,12 @@ +import PropTypes from 'prop-types'; +import { StyledTreeList } from '@ea11y-apps/scanner/styles/heading-structure.styles'; + +const HeadingStructureHeadingTreeList = ({ children }) => { + return {children}; +}; + +HeadingStructureHeadingTreeList.propTypes = { + children: PropTypes.node.isRequired, +}; + +export default HeadingStructureHeadingTreeList; diff --git a/modules/scanner/assets/js/components/heading-structure/heading-tree-loader.js b/modules/scanner/assets/js/components/heading-structure/heading-tree-loader.js new file mode 100644 index 00000000..b440fc33 --- /dev/null +++ b/modules/scanner/assets/js/components/heading-structure/heading-tree-loader.js @@ -0,0 +1,28 @@ +import Box from '@elementor/ui/Box'; +import { styled } from '@elementor/ui/styles'; +import { StyledSkeleton } from '@ea11y-apps/scanner/styles/app.styles'; +import { memo } from '@wordpress/element'; + +const HeadingStructureHeadingTreeLoader = memo(() => { + return ( + + + + + + + + + + ); +}); + +const StyledLoaderContainer = styled(Box)` + display: flex; + flex-direction: column; + + margin-top: ${({ theme }) => theme.spacing(2)}; + gap: ${({ theme }) => theme.spacing(1.5)}; +`; + +export default HeadingStructureHeadingTreeLoader; diff --git a/modules/scanner/assets/js/components/heading-structure/heading-tree.js b/modules/scanner/assets/js/components/heading-structure/heading-tree.js new file mode 100644 index 00000000..07612a4c --- /dev/null +++ b/modules/scanner/assets/js/components/heading-structure/heading-tree.js @@ -0,0 +1,72 @@ +import HeadingStructureHeadingTreeList from '@ea11y-apps/scanner/components/heading-structure/heading-tree-list'; +import HeadingStructureHeadingTreeListItem from '@ea11y-apps/scanner/components/heading-structure/heading-tree-list-item'; +import HeadingStructureHeadingTreeLoader from '@ea11y-apps/scanner/components/heading-structure/heading-tree-loader'; +import { useHeadingStructureContext } from '@ea11y-apps/scanner/context/heading-structure-context'; +import { keyForNode } from '@ea11y-apps/scanner/utils/page-headings'; +import { useEffect, useCallback } from '@wordpress/element'; + +const HeadingStructureHeadingTree = () => { + const { + isLoading, + expandedKey, + pageHeadings, + updateHeadingsTree, + toggleHeading, + } = useHeadingStructureContext(); + + useEffect(() => { + updateHeadingsTree(); + }, []); + + /** + * @param {import('../../types/heading').Ea11yHeading[]} headings + * @param {number | false} nestedId + * @return {JSX.Element} React element to render. + */ + const renderPageHeadings = useCallback( + (headings, nestedId) => { + const children = headings.flatMap((heading, i) => { + const key = keyForNode(heading.node); + + const item = ( + toggleHeading(heading.node)} + /> + ); + + if (heading.children.length) { + const subHeaders = renderPageHeadings(heading.children, i); + + return [item, subHeaders]; + } + + return [item]; + }); + + const list = ; + + if (false !== nestedId) { + return
  • {list}
  • ; + } + + return list; + }, + [expandedKey, toggleHeading, keyForNode], + ); + + if (!pageHeadings.length && isLoading) { + return ; + } + + return renderPageHeadings(pageHeadings, false); +}; + +export default HeadingStructureHeadingTree; diff --git a/modules/scanner/assets/js/components/heading-structure/help-text.js b/modules/scanner/assets/js/components/heading-structure/help-text.js new file mode 100644 index 00000000..f6e3f05f --- /dev/null +++ b/modules/scanner/assets/js/components/heading-structure/help-text.js @@ -0,0 +1,31 @@ +import { injectTemplateVars } from '@ea11y-apps/global/utils/inject-template-vars'; +import { StyledDescription } from '@ea11y-apps/scanner/styles/heading-structure.styles'; +import { memo } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +const HeadingStructureHelpText = memo(() => { + return ( + <> + + {__( + 'Make sure the order of your headings makes sense, so content is read in the right order.', + 'pojo-accessibility', + )} + + + + {injectTemplateVars( + __( + '{{bold}}Note:{{/bold}} Changing a heading’s level won’t affect how it looks.', + 'pojo-accessibility', + ), + { + bold: ({ children }) => {children}, + }, + )} + + + ); +}); + +export default HeadingStructureHelpText; diff --git a/modules/scanner/assets/js/components/main-list/index.js b/modules/scanner/assets/js/components/main-list/index.js index 9c1ceb81..2368677c 100644 --- a/modules/scanner/assets/js/components/main-list/index.js +++ b/modules/scanner/assets/js/components/main-list/index.js @@ -4,7 +4,7 @@ import { useScannerWizardContext } from '@ea11y-apps/scanner/context/scanner-wiz import { StyledBlockButtonsBox } from '@ea11y-apps/scanner/styles/app.styles'; export const MainList = () => { - const { sortedViolations, altTextData, manualData } = + const { sortedViolations, altTextData, manualData, getHeadingsStats } = useScannerWizardContext(); const scannerFixExist = sortedViolations.altText.length > 0; @@ -24,11 +24,16 @@ export const MainList = () => { const resolved = itemsData?.filter((item) => item?.resolved === true).length || 0; + const count = + key === BLOCKS.headingStructure + ? getHeadingsStats().error + : sortedViolations[key].length - resolved; + return ( ); diff --git a/modules/scanner/assets/js/constants/index.js b/modules/scanner/assets/js/constants/index.js index d2279f34..0c1168f0 100644 --- a/modules/scanner/assets/js/constants/index.js +++ b/modules/scanner/assets/js/constants/index.js @@ -50,6 +50,7 @@ export const BLOCKS = { formsInputsError: 'formsInputsError', keyboardAssistiveTech: 'keyboardAssistiveTech', pageStructureNav: 'pageStructureNav', + headingStructure: 'headingStructure', tables: 'tables', colorContrast: 'colorContrast', other: 'other', @@ -60,6 +61,7 @@ export const MANUAL_GROUPS = { formsInputsError: [], keyboardAssistiveTech: [], pageStructureNav: [], + headingStructure: [], tables: [], colorContrast: [], other: [], @@ -74,6 +76,7 @@ export const BLOCK_TITLES = { 'pojo-accessibility', ), pageStructureNav: __('Page Structure & Navigation', 'pojo-accessibility'), + headingStructure: __('Heading Structure', 'pojo-accessibility'), tables: __('Tables', 'pojo-accessibility'), colorContrast: __('Color contrast', 'pojo-accessibility'), other: __('Other Accessibility Issues', 'pojo-accessibility'), @@ -100,6 +103,10 @@ export const BLOCK_INFO = { 'Use headings and clear structure to help people easily navigate your content.', 'pojo-accessibility', ), + headingStructure: __( + 'Headings help screen reader users and search engines read pages in the right order. The structure should be organized and each heading given a level.', + 'pojo-accessibility', + ), tables: __( 'Give tables clear headers and captions so everyone can easily understand the data.', 'pojo-accessibility', @@ -120,6 +127,7 @@ export const INITIAL_SORTED_VIOLATIONS = { formsInputsError: [], keyboardAssistiveTech: [], pageStructureNav: [], + headingStructure: [], tables: [], colorContrast: [], other: [], @@ -189,6 +197,11 @@ export const VIOLATION_TYPES = { 'input_haspopup_conflict', 'element_tabbable_role_valid', ], + headingStructure: [ + 'single_h1_check', + 'missing_h1_check', + 'heading_hierarchy_check', + ], pageStructureNav: [ 'table_headers_ref_valid', 'table_scope_valid', diff --git a/modules/scanner/assets/js/context/heading-structure-context.js b/modules/scanner/assets/js/context/heading-structure-context.js new file mode 100644 index 00000000..a12e1c37 --- /dev/null +++ b/modules/scanner/assets/js/context/heading-structure-context.js @@ -0,0 +1,161 @@ +import PropTypes from 'prop-types'; +import { APIScanner } from '@ea11y-apps/scanner/api/APIScanner'; +import useScannerSettings from '@ea11y-apps/scanner/hooks/use-scanner-settings'; +import { + getHeadingXpath, + getPageHeadingsTree, + keyForNode, +} from '@ea11y-apps/scanner/utils/page-headings'; +import { + calculateStats, + validateHeadings, +} from '@ea11y-apps/scanner/utils/validate-headings'; +import { createContext, useContext, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import { useScannerWizardContext } from './scanner-wizard-context'; + +export const HeadingStructureContext = createContext({}); + +export const HeadingStructureContextProvider = ({ children }) => { + /** Important to keep it true by default. */ + const loadingState = useState(true); + const errorState = useState(''); + const pageHeadingsState = useState([]); + const pageHeadingValidationStatsState = useState({}); + const expandedKeyState = useState(null); + + return ( + + {children} + + ); +}; + +HeadingStructureContextProvider.propTypes = { + children: PropTypes.node, +}; + +export const useHeadingStructureContext = () => { + const { + loadingState, + errorState, + pageHeadingsState, + pageHeadingValidationStatsState, + expandedKeyState, + } = useContext(HeadingStructureContext); + const { currentScanId } = useScannerWizardContext(); + const { dismissedHeadingIssues, pageData } = useScannerSettings(); + const [isLoading, setIsLoading] = loadingState; + const [error, setError] = errorState; + const [pageHeadings, setPageHeadings] = pageHeadingsState; + const [validationStats, setValidationStats] = pageHeadingValidationStatsState; + const [expandedKey, setExpandedKey] = expandedKeyState; + + const updateHeadingsTree = () => { + const updatedHeadings = validateHeadings( + getPageHeadingsTree(), + dismissedHeadingIssues, + ); + + setPageHeadings(updatedHeadings); + setValidationStats(calculateStats(updatedHeadings)); + + setIsLoading(false); + }; + + const onHeadingWarningDismiss = async ({ node }) => { + setIsLoading(true); + setError(''); + + try { + const xpath = getHeadingXpath(node); + + if (!node) { + throw new TypeError(); + } + + await APIScanner.dismissHeadingIssue({ + pageId: pageData.object_id, + xpath, + }); + + window.ea11yScannerData.dismissedHeadingIssues.push(xpath); + + await APIScanner.resolveIssue(currentScanId); + + return true; + } catch (e) { + console.error('onHeadingWarningDismiss(): ', e); + setError(__('An error occurred.', 'pojo-accessibility')); + + return false; + } + }; + + const onHeadingLevelUpdate = async ({ node, newLevel, violation }) => { + setIsLoading(true); + setError(''); + + try { + const xpath = getHeadingXpath(node); + + if (!node || !pageData.url || !newLevel) { + throw new TypeError(); + } + + await APIScanner.setHeadingLevel({ + url: pageData.url, + level: newLevel, + xpath, + rule: violation, + }); + + await APIScanner.resolveIssue(currentScanId); + setIsLoading(false); + + return true; + } catch (e) { + console.error('onHeadingLevelUpdate(): ', e); + setError(__('An error occurred.', 'pojo-accessibility')); + setIsLoading(false); + + return false; + } + }; + + const isHeadingExpanded = (node) => { + return keyForNode(node) === expandedKey; + }; + + const toggleHeading = (node) => { + const key = keyForNode(node); + setExpandedKey((prev) => (prev === key ? null : key)); + }; + + const collapseHeading = () => { + setExpandedKey(null); + }; + + return { + isLoading, + error, + pageHeadings, + validationStats, + setPageHeadings, + expandedKey, + updateHeadingsTree, + onHeadingWarningDismiss, + onHeadingLevelUpdate, + isHeadingExpanded, + toggleHeading, + collapseHeading, + }; +}; diff --git a/modules/scanner/assets/js/context/scanner-wizard-context.js b/modules/scanner/assets/js/context/scanner-wizard-context.js index 0714ea48..9497b3e8 100644 --- a/modules/scanner/assets/js/context/scanner-wizard-context.js +++ b/modules/scanner/assets/js/context/scanner-wizard-context.js @@ -10,16 +10,23 @@ import { RATIO_EXCLUDED, RULE_TEXT_CONTRAST, } from '@ea11y-apps/scanner/constants'; +import useScannerSettings from '@ea11y-apps/scanner/hooks/use-scanner-settings'; +import { runAllEa11yRules } from '@ea11y-apps/scanner/rules'; import { scannerWizard } from '@ea11y-apps/scanner/services/scanner-wizard'; import { focusOnElement, removeExistingFocus, } from '@ea11y-apps/scanner/utils/focus-on-element'; import { getElementByXPath } from '@ea11y-apps/scanner/utils/get-element-by-xpath'; +import { getPageHeadingsTree } from '@ea11y-apps/scanner/utils/page-headings'; import { sortRemediation, sortViolations, } from '@ea11y-apps/scanner/utils/sort-violations'; +import { + calculateStats, + validateHeadings, +} from '@ea11y-apps/scanner/utils/validate-headings'; import { createContext, useContext, @@ -63,6 +70,8 @@ export const ScannerWizardContext = createContext({ }); export const ScannerWizardContextProvider = ({ children }) => { + const { dismissedHeadingIssues } = useScannerSettings(); + const [results, setResults] = useState(); const [remediations, setRemediations] = useState([]); const [sortedViolations, setSortedViolations] = useState( @@ -217,12 +226,32 @@ export const ScannerWizardContextProvider = ({ children }) => { (item) => isViolation(item) || isContrastViolation(item), ); - const sorted = sortViolations(filtered); + const customResults = runAllEa11yRules(document); + + const filteredCustomResults = customResults.filter( + (item) => + item.level === 'violation' && + !dismissedHeadingIssues.includes(item.path.dom), + ); + + const allResults = [...filtered, ...filteredCustomResults]; + + data.results = allResults; if (data?.summary?.counts) { data.summary.counts.issuesResolved = 0; + data.summary.counts.violation += filteredCustomResults.filter( + (item) => item.level === 'violation', + ).length; + data.summary.counts.recommendation = + (data.summary.counts.recommendation || 0) + + filteredCustomResults.filter( + (item) => item.level === 'recommendation', + ).length; } + const sorted = sortViolations(allResults); + await registerPage(data, sorted); await addScanResults(data); @@ -275,15 +304,25 @@ export const ScannerWizardContextProvider = ({ children }) => { }, (_, i) => i, ); - return block === BLOCKS.altText - ? (altTextData?.length === sortedViolations[block]?.length && - indexes.every((index) => index in altTextData) && - altTextData.every((data) => data?.resolved)) || + switch (block) { + case BLOCKS.altText: + return ( + (altTextData?.length === sortedViolations[block]?.length && + indexes.every((index) => index in altTextData) && + altTextData.every((data) => data?.resolved)) || sortedViolations[block]?.length === 0 - : (manualData[block]?.length === sortedViolations[block]?.length && - indexes.every((index) => index in manualData[block]) && - manualData[block].every((data) => data?.resolved)) || - sortedViolations[block]?.length === 0; + ); + case BLOCKS.headingStructure: + const stats = getHeadingsStats(); + return stats.error === 0; + default: + return ( + (manualData[block]?.length === sortedViolations[block]?.length && + indexes.every((index) => index in manualData[block]) && + manualData[block].every((data) => data?.resolved)) || + sortedViolations[block]?.length === 0 + ); + } }; const isChanged = @@ -303,6 +342,14 @@ export const ScannerWizardContextProvider = ({ children }) => { window.location.assign(url); }; + const getHeadingsStats = () => { + const updatedHeadings = validateHeadings( + getPageHeadingsTree(), + dismissedHeadingIssues, + ); + return calculateStats(updatedHeadings); + }; + return ( { isResolved, handleOpen, runNewScan, + getHeadingsStats, }} > {children} diff --git a/modules/scanner/assets/js/hooks/use-heading-node-manipulation.js b/modules/scanner/assets/js/hooks/use-heading-node-manipulation.js new file mode 100644 index 00000000..68c885cb --- /dev/null +++ b/modules/scanner/assets/js/hooks/use-heading-node-manipulation.js @@ -0,0 +1,108 @@ +export const useHeadingNodeManipulation = ({ node }) => { + const hasDraft = () => { + return node.getAttribute('data-ea11y-scanner-heading-draft'); + }; + + const getOriginalHeadingLevel = () => { + const originalLevel = node.getAttribute( + 'data-ea11y-scanner-original-level', + ); + + if (originalLevel) { + return parseInt(originalLevel, 10); + } + + return null; + }; + + const getDraftLevelForDisplay = () => { + if (!hasDraft()) { + return ''; + } + + const role = node.getAttribute('role'); + + if ('none' === role) { + return 'p'; + } + + const ariaLevel = node.getAttribute('aria-level'); + + return `h${ariaLevel}`; + }; + + const backupOriginalAttributes = () => { + if (hasDraft()) { + return; + } + + const role = node.getAttribute('role'); + const ariaLevel = node.getAttribute('aria-level'); + + node.setAttribute('data-ea11y-scanner-heading-draft', 'true'); + node.setAttribute('data-ea11y-scanner-original-role', role || ''); + node.setAttribute('data-ea11y-scanner-original-level', ariaLevel || ''); + }; + + const restoreOriginalAttributes = () => { + if (!hasDraft()) { + return; + } + + const originalRole = node.getAttribute('data-ea11y-scanner-original-role'); + const originalAriaLevel = node.getAttribute( + 'data-ea11y-scanner-original-level', + ); + + if (originalRole) { + node.setAttribute('role', originalRole); + } else { + node.removeAttribute('role'); + } + + if (originalAriaLevel) { + node.setAttribute('aria-level', originalAriaLevel); + } else { + node.removeAttribute('aria-level'); + } + + node.removeAttribute('data-ea11y-scanner-original-role'); + node.removeAttribute('data-ea11y-scanner-original-level'); + node.removeAttribute('data-ea11y-scanner-heading-draft'); + }; + + const clearOriginalAttributes = () => { + node.removeAttribute('data-ea11y-scanner-original-role'); + node.removeAttribute('data-ea11y-scanner-original-level'); + node.removeAttribute('data-ea11y-scanner-heading-draft'); + }; + + const applyNewLevel = (value) => { + backupOriginalAttributes(); + + if (value === 'p') { + /** + * Don't change this one to 'presentation'! + * + * Here it must be 'none' to allow preview validation to happen without the element + * to be removed from the tree. We also don't want to stop applying the attribute, so the user can + * see if the layout changes in case of selectors like [role="banner"]. + */ + node.setAttribute('role', 'none'); + node.removeAttribute('aria-level'); + } else { + node.setAttribute('role', 'heading'); + node.setAttribute('aria-level', value[1]); + } + }; + + return { + hasDraft, + getOriginalHeadingLevel, + getDraftLevelForDisplay, + backupOriginalAttributes, + restoreOriginalAttributes, + clearOriginalAttributes, + applyNewLevel, + }; +}; diff --git a/modules/scanner/assets/js/hooks/use-scanner-settings.js b/modules/scanner/assets/js/hooks/use-scanner-settings.js new file mode 100644 index 00000000..4f7064bd --- /dev/null +++ b/modules/scanner/assets/js/hooks/use-scanner-settings.js @@ -0,0 +1,58 @@ +import * as z from 'zod'; + +const ScannerSettings = z.object({ + wpRestNonce: z.string(), + dashboardUrl: z.url(), + scannerUrl: z.url(), + initialScanResult: z.object({ + url: z.url(), + counts: z.object({ + issuesResolved: z.int(), + manual: z.int(), + pass: z.int(), + potentialRecommendation: z.int(), + potentialViolation: z.int(), + recommendation: z.int(), + violation: z.int(), + }), + }), + pageData: z.object({ + entry_id: z.string(), + object_id: z.int(), + object_type: z.string(), + object_type_name: z.string(), + title: z.string(), + unregistered: z.boolean(), + url: z.url(), + }), + dismissedHeadingIssues: z.array(z.string()), + isConnected: z.string(), + isRTL: z.string(), +}); + +const useScannerSettings = () => { + const validationResult = ScannerSettings.safeParse(window.ea11yScannerData); + + if (!validationResult.success) { + console.error( + 'Ea11y scanner: Validation error of `window.ea11yScannerData`', + validationResult.error.issues, + ); + } + + if (!window.ea11yScannerData) { + window.ea11yScannerData = {}; + } + + if (!window.ea11yScannerData.dismissedHeadingIssues) { + window.ea11yScannerData.dismissedHeadingIssues = []; + } + + if (!window.ea11yScannerData.pageData) { + window.ea11yScannerData.pageData = {}; + } + + return window.ea11yScannerData; +}; + +export default useScannerSettings; diff --git a/modules/scanner/assets/js/images/theme-builder-icon.js b/modules/scanner/assets/js/images/theme-builder-icon.js new file mode 100644 index 00000000..b946176c --- /dev/null +++ b/modules/scanner/assets/js/images/theme-builder-icon.js @@ -0,0 +1,13 @@ +export const ThemeBuilderIcon = () => { + return ( + + + + ); +}; diff --git a/modules/scanner/assets/js/index.js b/modules/scanner/assets/js/index.js index b4b85d62..795352f1 100644 --- a/modules/scanner/assets/js/index.js +++ b/modules/scanner/assets/js/index.js @@ -16,6 +16,7 @@ import { SCANNER_URL_PARAM, TOP_BAR_LINK, } from '@ea11y-apps/scanner/constants'; +import { HeadingStructureContextProvider } from '@ea11y-apps/scanner/context/heading-structure-context'; import { ScannerWizardContextProvider } from '@ea11y-apps/scanner/context/scanner-wizard-context'; import { closeWidget } from '@ea11y-apps/scanner/utils/close-widget'; import { createRoot, Fragment, StrictMode } from '@wordpress/element'; @@ -110,7 +111,9 @@ const initApp = () => { - + + + diff --git a/modules/scanner/assets/js/layouts/heading-structure-layout.js b/modules/scanner/assets/js/layouts/heading-structure-layout.js new file mode 100644 index 00000000..634bfd91 --- /dev/null +++ b/modules/scanner/assets/js/layouts/heading-structure-layout.js @@ -0,0 +1,20 @@ +import HeadingStructureHeadingTree from '@ea11y-apps/scanner/components/heading-structure/heading-tree'; +import HeadingStructureHeadingTreeEmpty from '@ea11y-apps/scanner/components/heading-structure/heading-tree-empty'; +import HeadingStructureHelpText from '@ea11y-apps/scanner/components/heading-structure/help-text'; +import { useHeadingStructureContext } from '@ea11y-apps/scanner/context/heading-structure-context'; +import { StyledContent } from '@ea11y-apps/scanner/styles/app.styles'; + +export const HeadingStructureLayout = () => { + const { isLoading, pageHeadings } = useHeadingStructureContext(); + + if (!pageHeadings.length && !isLoading) { + return ; + } + + return ( + + + + + ); +}; diff --git a/modules/scanner/assets/js/layouts/main-layout.js b/modules/scanner/assets/js/layouts/main-layout.js index 1c1b9f72..58342ebb 100644 --- a/modules/scanner/assets/js/layouts/main-layout.js +++ b/modules/scanner/assets/js/layouts/main-layout.js @@ -7,7 +7,7 @@ import { __ } from '@wordpress/i18n'; export const MainLayout = () => { return ( - + {__('All issues', 'pojo-accessibility')} diff --git a/modules/scanner/assets/js/rules/heading-hierarchy-check.js b/modules/scanner/assets/js/rules/heading-hierarchy-check.js new file mode 100644 index 00000000..21693ffa --- /dev/null +++ b/modules/scanner/assets/js/rules/heading-hierarchy-check.js @@ -0,0 +1,149 @@ +/** + * Heading Hierarchy Check Rule + * + * This rule checks for proper heading hierarchy. + * Skipping heading levels can confuse screen readers and break document outline. + * + * Compatible with ACE (accessibility-checker-engine) + */ +import { + getHeadingLevel, + getHeadingXpath, + getPageHeadings, +} from '../utils/page-headings'; + +const headingHierarchyCheck = { + id: 'heading_hierarchy_check', + context: 'dom:html', + dependencies: [], + help: { + 'en-US': { + group: 'Heading Structure', + pass: 'Heading hierarchy follows proper sequence', + fail_skipped_level: + 'Heading levels are skipped in the document. Maintain proper heading hierarchy to help screen readers understand the content structure.', + }, + }, + messages: { + 'en-US': { + group: 'Heading Structure', + pass: 'Heading hierarchy follows proper sequence', + fail_skipped_level: + 'Heading levels are skipped. Ensure headings follow proper hierarchy (h1 -> h2 -> h3).', + }, + }, + rulesets: [ + { + id: ['IBM_Accessibility'], + num: '1.3.1', + level: 'recommendation', + toolkitLevel: 'LEVEL_ONE', + }, + ], + run: (context) => { + const document = context.dom.node; + const headings = getPageHeadings(document); + + if (headings.length === 0) { + return { + ruleId: 'heading_hierarchy_check', + reasonId: 'pass', + value: ['RECOMMENDATION', 'PASS'], + path: { + dom: '/html[1]', + aria: '/document[1]', + }, + ruleTime: 0, + message: 'No headings found', + messageArgs: [], + apiArgs: [], + bounds: { + left: 0, + top: 0, + height: 0, + width: 0, + }, + snippet: '', + category: 'Accessibility', + ignored: false, + level: 'pass', + }; + } + + // Extract heading levels and check for skips + let previousLevel = 0; + let violatingElement = null; + const skippedLevels = []; + + for (const heading of headings) { + const currentLevel = getHeadingLevel(heading); + + if (previousLevel > 0 && currentLevel > previousLevel + 1) { + violatingElement = heading; + + for (let i = previousLevel + 1; i < currentLevel; i++) { + skippedLevels.push(`h${i}`); + } + + break; + } + + previousLevel = currentLevel; + } + + if (violatingElement) { + const rect = violatingElement.getBoundingClientRect(); + + return { + ruleId: 'heading_hierarchy_check', + reasonId: 'fail_skipped_level', + value: ['RECOMMENDATION', 'FAIL'], + path: { + dom: getHeadingXpath(violatingElement), + aria: '/document[1]', + }, + node: violatingElement, + ruleTime: 0, + message: `Heading levels are skipped. Ensure headings follow proper hierarchy. Missing: ${skippedLevels.join(', ')}.`, + messageArgs: [skippedLevels.join(', ')], + apiArgs: [], + bounds: { + left: Math.round(rect.left), + top: Math.round(rect.top), + height: Math.round(rect.height), + width: Math.round(rect.width), + }, + snippet: violatingElement.outerHTML, + category: 'Accessibility', + ignored: false, + level: 'recommendation', + }; + } + + return { + ruleId: 'heading_hierarchy_check', + reasonId: 'pass', + value: ['RECOMMENDATION', 'PASS'], + path: { + dom: '/html[1]', + aria: '/document[1]', + }, + ruleTime: 0, + message: 'Heading hierarchy follows proper sequence', + messageArgs: [], + apiArgs: [], + bounds: { + left: 0, + top: 0, + height: 0, + width: 0, + }, + snippet: headings[0]?.outerHTML || '', + category: 'Accessibility', + ignored: false, + level: 'pass', + }; + }, +}; + +export default headingHierarchyCheck; diff --git a/modules/scanner/assets/js/rules/index.js b/modules/scanner/assets/js/rules/index.js new file mode 100644 index 00000000..d90f454a --- /dev/null +++ b/modules/scanner/assets/js/rules/index.js @@ -0,0 +1,45 @@ +import headingHierarchyCheck from './heading-hierarchy-check'; +import missingH1Check from './missing-h1-check'; +import singleH1Check from './single-h1-check'; + +export const EA11Y_RULES = Object.freeze({ + MISSING_H1_TAG: 'missing_h1_check', + REDUNDANT_H1_TAGS: 'single_h1_check', + INCORRECT_HEADING_HIERARCHY: 'heading_hierarchy_check', +}); + +export const ea11yRuleSet = Object.freeze([ + singleH1Check, + missingH1Check, + headingHierarchyCheck, +]); + +/** + * Run all registered custom rules against the document. + * + * @param {Document} document - The document to scan + * @return {Array} Array of rule results (violations, recommendations, passes) + */ +export const runAllEa11yRules = (document) => { + const results = []; + + const context = { + dom: { + node: document, + }, + }; + + Object.values(ea11yRuleSet).forEach((rule) => { + try { + const result = rule.run(context); + + if (result) { + results.push(result); + } + } catch (error) { + console.error(`Error running custom rule ${rule.id}:`, error); + } + }); + + return results; +}; diff --git a/modules/scanner/assets/js/rules/missing-h1-check.js b/modules/scanner/assets/js/rules/missing-h1-check.js new file mode 100644 index 00000000..1147056c --- /dev/null +++ b/modules/scanner/assets/js/rules/missing-h1-check.js @@ -0,0 +1,102 @@ +/** + * Missing H1 Check Rule + * + * This rule ensures that a page contains at least one h1 tag. + * Missing h1 tags can make it difficult for screen readers to understand the page structure. + * + * Compatible with ACE (accessibility-checker-engine) + */ +import { + getPageHeadings, + getH1Headings, +} from '@ea11y-apps/scanner/utils/page-headings'; + +const missingH1Check = { + id: 'missing_h1_check', + context: 'dom:html', + dependencies: [], + help: { + 'en-US': { + group: 'Heading Structure', + pass: 'Page contains an h1 tag', + fail_no_h1: + 'No h1 tag found on the page. Each page should have a main heading (h1) to establish proper document structure and help users understand the page content.', + }, + }, + messages: { + 'en-US': { + group: 'Heading Structure', + pass: 'Page contains an h1 tag', + fail_no_h1: + 'No h1 tag found. Add a main heading (h1) to establish the page structure.', + }, + }, + rulesets: [ + { + id: ['IBM_Accessibility'], + num: '1.3.1', + level: 'violation', + toolkitLevel: 'LEVEL_ONE', + }, + ], + run: (context) => { + const document = context.dom.node; + const firstLevelHeadings = getH1Headings(document); + + if (firstLevelHeadings.length === 0) { + const headings = getPageHeadings(document); + + return { + ruleId: 'missing_h1_check', + reasonId: 'fail_no_h1', + value: ['VIOLATION', 'FAIL'], + path: { + dom: '/html[1]', + aria: '/document[1]', + }, + node: headings[0], + ruleTime: 0, + message: + 'No h1 tag found. Add a main heading (h1) to establish the page structure.', + messageArgs: [], + apiArgs: [], + bounds: { + left: 0, + top: 0, + height: 0, + width: 0, + }, + snippet: '', + category: 'Accessibility', + ignored: false, + level: 'violation', + }; + } + + return { + ruleId: 'missing_h1_check', + reasonId: 'pass', + value: ['VIOLATION', 'PASS'], + path: { + dom: '/html[1]', + aria: '/document[1]', + }, + ruleTime: 0, + message: 'Page contains an h1 tag', + messageArgs: [], + apiArgs: [], + bounds: { + left: 0, + top: 0, + height: 0, + width: 0, + }, + snippet: firstLevelHeadings[0].outerHTML, + category: 'Accessibility', + ignored: false, + level: 'pass', + }; + }, +}; + +export default missingH1Check; diff --git a/modules/scanner/assets/js/rules/single-h1-check.js b/modules/scanner/assets/js/rules/single-h1-check.js new file mode 100644 index 00000000..e5428529 --- /dev/null +++ b/modules/scanner/assets/js/rules/single-h1-check.js @@ -0,0 +1,103 @@ +/** + * Single H1 Check Rule + * + * This rule ensures that a page contains only a single h1 tag. + * Multiple h1 tags can confuse screen readers and break the document outline. + * + * Compatible with ACE (accessibility-checker-engine) + */ +import { getH1Headings } from '@ea11y-apps/scanner/utils/page-headings'; + +const singleH1Check = { + id: 'single_h1_check', + context: 'dom:html', + dependencies: [], + help: { + 'en-US': { + group: 'Heading Structure', + pass: 'Page contains exactly one h1 tag', + fail_multiple: + 'Multiple h1 tags found on the page. Each page should have only one main heading (h1) to establish proper document structure.', + pass_no_h1: + 'No h1 tag found - this may be acceptable for some page types', + }, + }, + messages: { + 'en-US': { + group: 'Heading Structure', + pass: 'Page contains exactly one h1 tag', + fail_multiple: + 'Multiple h1 tags found. Ensure the page contains only one h1 tag to maintain proper heading hierarchy.', + pass_no_h1: 'No h1 tag found', + }, + }, + rulesets: [ + { + id: ['IBM_Accessibility'], + num: '1.3.1', + level: 'violation', + toolkitLevel: 'LEVEL_ONE', + }, + ], + run: (context) => { + const document = context.dom.node; + const headings = getH1Headings(document); + + if (headings.length > 1) { + return { + ruleId: 'single_h1_check', + reasonId: 'fail_multiple', + value: ['VIOLATION', 'FAIL'], + path: { + dom: '/html[1]', + aria: '/document[1]', + }, + node: headings[1], + ruleTime: 0, + message: + 'Multiple h1 tags found. Ensure the page contains only one h1 tag to maintain proper heading hierarchy.', + messageArgs: [headings.length.toString()], + apiArgs: [], + bounds: { + left: 0, + top: 0, + height: 0, + width: 0, + }, + snippet: `Found ${headings.length} h1 tags`, + category: 'Accessibility', + ignored: false, + level: 'violation', + }; + } + + return { + ruleId: 'single_h1_check', + reasonId: 'pass', + value: ['VIOLATION', 'PASS'], + path: { + dom: '/html[1]', + aria: '/document[1]', + }, + ruleTime: 0, + message: + headings.length === 1 + ? 'Page contains exactly one h1 tag' + : 'Page contains no duplicate h1 tags', + messageArgs: [], + apiArgs: [], + bounds: { + left: 0, + top: 0, + height: 0, + width: 0, + }, + snippet: headings.length > 0 ? headings[0].outerHTML : '', + category: 'Accessibility', + ignored: false, + level: 'pass', + }; + }, +}; + +export default singleH1Check; diff --git a/modules/scanner/assets/js/styles/app.styles.js b/modules/scanner/assets/js/styles/app.styles.js index ee09445e..42d8e8d1 100644 --- a/modules/scanner/assets/js/styles/app.styles.js +++ b/modules/scanner/assets/js/styles/app.styles.js @@ -21,9 +21,11 @@ export const AppContainer = styled(Paper)` ${ColorPickerStyles} `; -export const HeaderCard = styled(Card)` - border-radius: 8px; - margin-bottom: ${({ theme }) => theme.spacing(2)}; +export const StyledStatsBlock = styled(Card)` + margin: ${({ theme }) => `${theme.spacing(3)} ${theme.spacing(2)}`}; + padding: ${({ theme }) => theme.spacing(2)}; + + border-radius: ${({ theme }) => theme.shape.borderRadius}px; box-shadow: 0 3px 14px 2px rgba(0, 0, 0, 0.12); `; @@ -33,12 +35,28 @@ export const TitleBox = styled(Box)` align-items: center; `; -export const HeaderContent = styled(CardContent)` - &:last-child { - padding-bottom: ${({ theme }) => theme.spacing(2)}; +export const StyledTitle = styled(Typography)` + font-size: 16px; + font-weight: 500; + line-height: 130%; + letter-spacing: 0.15px; + margin: 0; + + .MuiChip-root { + margin-inline-start: ${({ theme }) => theme.spacing(1)}; + + font-weight: 400; } `; +export const StyledHeaderTitleWrapper = styled(Box)` + padding: ${({ theme }) => `${theme.spacing(1)} ${theme.spacing(1.5)}`}; +`; + +export const StyledHeaderContent = styled(Box)` + padding: ${({ theme }) => `${theme.spacing(1)} ${theme.spacing(1.5)}`}; +`; + export const StyledContent = styled(CardContent)` padding: 0 ${({ theme }) => theme.spacing(2)}; `; diff --git a/modules/scanner/assets/js/styles/heading-structure.styles.js b/modules/scanner/assets/js/styles/heading-structure.styles.js new file mode 100644 index 00000000..afba5f1f --- /dev/null +++ b/modules/scanner/assets/js/styles/heading-structure.styles.js @@ -0,0 +1,212 @@ +import Alert from '@elementor/ui/Alert'; +import Box from '@elementor/ui/Box'; +import Button from '@elementor/ui/Button'; +import FormControlLabel from '@elementor/ui/FormControlLabel'; +import Select from '@elementor/ui/Select'; +import Stack from '@elementor/ui/Stack'; +import Typography from '@elementor/ui/Typography'; +import { styled } from '@elementor/ui/styles'; +import { STATUS_CONFIG } from '@ea11y-apps/scanner/components/heading-structure/constants'; + +export const StyledDescription = styled(Typography)` + color: ${({ theme }) => theme.palette.text.secondary}; + font-size: 14px; + line-height: 143%; + letter-spacing: 0.15px; + + &:first-of-type { + margin-top: ${({ theme }) => theme.spacing(2)}; + margin-bottom: ${({ theme }) => theme.spacing(1)}; + } + + &:last-of-type { + margin: 0; + + font-size: 13px; + } + + span { + font-weight: 600; + } +`; + +export const StyledTitleRowContainer = styled(Stack)` + display: flex; + align-items: center; + + padding: ${({ theme }) => theme.spacing(1.5)}; + + box-shadow: 0 1px 5px 0 ${({ theme }) => theme.palette.divider}; + background-color: ${({ theme }) => theme.palette.background.default}; +`; + +export const StyledTitleRowItem = styled(Box)` + display: flex; + align-items: center; +`; + +export const StyledTitleRowItemTypography = styled(Typography)` + margin-inline-start: ${({ theme }) => theme.spacing(0.5)}; + + color: ${({ theme }) => theme.palette.text.secondary}; + font-size: 14px; + font-weight: 400; + line-height: 18px; + letter-spacing: 0.15px; + + b { + font-weight: 600; + } +`; + +export const StyledTreeList = styled('ul')` + padding: 0; + + li { + list-style-type: none; + } +`; + +export const StyledTreeListItem = styled('li', { + shouldForwardProp: (prop) => prop !== 'isExpanded', +})` + box-sizing: border-box; + + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + + margin-bottom: ${({ theme }) => theme.spacing(1.25)}; + box-shadow: ${({ isExpanded, theme }) => + isExpanded + ? `0 0 0 2px ${theme.palette.action.active}` + : `0 0 0 1px ${theme.palette.divider}`}; + + border-radius: ${({ theme }) => theme.shape.borderRadius}px; + user-select: none; + transition: 300ms ease-in-out; + + &:hover { + box-shadow: ${({ isExpanded, theme }) => + isExpanded + ? `0 0 0 2px ${theme.palette.action.active}` + : `0 0 0 1px ${theme.palette.text.primary}`}; + + transition: 300ms ease-in-out; + } + + & * { + box-sizing: border-box; + } +`; + +export const StyledListItemTopWrapper = styled(Button, { + shouldForwardProp: (prop) => !['isExpanded', 'level'].includes(prop), +})` + width: 100%; + + display: flex; + justify-content: flex-start; + align-items: center; + + padding: ${({ theme }) => theme.spacing(1)}; + padding-inline-start: calc( + (12px * ${({ level }) => level - 1}) + ${({ theme }) => theme.spacing(1)} + ); + transition: 300ms ease-in-out; + cursor: pointer; + + &:hover { + background-color: ${({ isExpanded, theme }) => + isExpanded ? 'initial' : theme.palette.action.hover}; + transition: 300ms ease-in-out; + } + + .MuiSvgIcon-root { + margin-inline-start: auto; + } +`; + +export const StyledListItemDetails = styled(Box)` + width: 100%; + max-height: 500px; + + padding: ${({ theme }) => theme.spacing(1)}; + padding-top: 0; +`; + +export const StyledListItemLevelBox = styled(Box, { + shouldForwardProp: (prop) => prop !== 'status', +})` + width: 32px; + height: 32px; + + padding: ${({ theme }) => `${theme.spacing(0.5)} ${theme.spacing(0.75)}`}; + margin-inline-end: ${({ theme }) => theme.spacing(1)}; + + border: 1px solid ${({ status }) => STATUS_CONFIG[status].borderColor}; + background: #f3f3f4; + border-radius: ${({ theme }) => theme.shape.borderRadius}px; + + span { + color: ${({ status }) => STATUS_CONFIG[status].textColor}; + } +`; + +export const StyledListItemContent = styled(Typography, { + shouldForwardProp: (prop) => prop !== 'level', +})` + max-width: calc(268px - (12px * ${({ level }) => level - 1})); + + color: ${({ theme }) => theme.palette.text.primary}; + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 20px; + letter-spacing: 0.15px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +`; + +export const StyledListItemAlert = styled(Alert)` + margin-top: ${({ theme }) => theme.spacing(1.5)}; + padding: ${({ theme }) => `${theme.spacing(1)} ${theme.spacing(1.5)}`}; +`; + +export const StyledListItemBottomWrapper = styled(Box)` + width: 100%; + + margin-top: ${({ theme }) => theme.spacing(2)}; +`; + +export const StyledListItemSelect = styled(Select)` + .MuiSelect-select { + .MuiTypography-root b { + font-weight: 400; + } + } +`; + +export const StyledListItemActionsWrapper = styled(Box)` + width: 100%; + + display: flex; + align-items: center; + + margin-top: ${({ theme }) => theme.spacing(2)}; + + .MuiButton-text { + margin-inline-start: auto; + margin-inline-end: ${({ theme }) => theme.spacing(1)}; + } +`; + +export const StyledListItemDismissLabel = styled(FormControlLabel)` + margin-left: -7px; + + .MuiTypography-root { + font-size: 14px; + } +`; diff --git a/modules/scanner/assets/js/types/heading.js b/modules/scanner/assets/js/types/heading.js new file mode 100644 index 00000000..bfa20824 --- /dev/null +++ b/modules/scanner/assets/js/types/heading.js @@ -0,0 +1,35 @@ +import { __ } from '@wordpress/i18n'; + +/** + * Heading structure definition. + * + * @typedef {Object} Ea11yHeading + * @property {1 | 2 | 3 | 4 | 5 | 6 | null} level - Heading level. + * @property {string} content - The innerText of the heading. + * @property {HTMLElement} node - Heading node. Could be not an instance of HTMLHeadingElement. + * @property {Ea11yHeading[]} children - Child nodes of the heading. + * @property {'success' | 'error' | 'warning'} status - Validation status. + * @property {string | null} violationCode - Validation violation code. + */ + +/** + * Heading validation stats definition. + * + * @typedef {Object} Ea11yHeadingStats + * @property {number} total - Total number of headings. + * @property {number} success - Headings passed validation. + * @property {number} error - Number of headings with violations. + * @property {number} warning - Number of headings with warnings. + */ + +export const HEADING_STATUS = Object.freeze({ + SUCCESS: 'success', + ERROR: 'error', + WARNING: 'warning', +}); + +export const HEADING_STATUS_DESCRIPTION = Object.freeze({ + [HEADING_STATUS.SUCCESS]: __('Validation passed', 'pojo-accessibility'), + [HEADING_STATUS.ERROR]: __('Validation error', 'pojo-accessibility'), + [HEADING_STATUS.WARNING]: __('Has a warning', 'pojo-accessibility'), +}); diff --git a/modules/scanner/assets/js/types/scanner-item.js b/modules/scanner/assets/js/types/scanner-item.js index 3f178aa8..323893b8 100644 --- a/modules/scanner/assets/js/types/scanner-item.js +++ b/modules/scanner/assets/js/types/scanner-item.js @@ -2,15 +2,25 @@ import PropTypes from 'prop-types'; export const scannerItem = PropTypes.shape({ ruleId: PropTypes.string.isRequired, - value: PropTypes.arrayOf(PropTypes.number).isRequired, + value: PropTypes.arrayOf( + PropTypes.oneOf([ + 'PASS', + 'FAIL', + 'POTENTIAL', + 'MANUAL', + 'VIOLATION', + 'RECOMMENDATION', + 'INFORMATION', + ]), + ).isRequired, path: PropTypes.shape({ dom: PropTypes.string.isRequired, aria: PropTypes.string.isRequired, - selector: PropTypes.string.isRequired, + selector: PropTypes.string, }).isRequired, messageArgs: PropTypes.arrayOf(PropTypes.string), reasonCategory: PropTypes.string.isRequired, category: PropTypes.string.isRequired, level: PropTypes.string.isRequired, - node: PropTypes.node, + node: PropTypes.object, }); diff --git a/modules/scanner/assets/js/utils/page-headings.js b/modules/scanner/assets/js/utils/page-headings.js new file mode 100644 index 00000000..4811af2b --- /dev/null +++ b/modules/scanner/assets/js/utils/page-headings.js @@ -0,0 +1,158 @@ +import getXPath from 'get-xpath'; +import { HEADING_STATUS } from '../types/heading'; + +/** + * Convert DOM node to a simplified structure. + * + * @param {HTMLHeadingElement} node DOM node. + * @return {import('../types/heading').Ea11yHeading} Heading object. + */ +const createHeadingObject = (node) => ({ + level: getHeadingLevel(node), + content: node.textContent.trim(), + node, + children: [], + status: HEADING_STATUS.SUCCESS, + violationCode: null, +}); + +/** + * Retrieves heading level based on the Hx number or aria-level attribute. + * + * @param {HTMLElement} element DOM node. + * @return {number | null} Heading level if it can be parsed, null otherwise. + */ +export const getHeadingLevel = (element) => { + const ariaLevel = element.getAttribute('aria-level'); + + if (ariaLevel) { + return parseInt(ariaLevel, 10); + } + + if ( + 'H' === element.tagName[0] && + 2 === element.tagName.length && + element.tagName[1] <= 6 + ) { + return parseInt(element.tagName[1], 10); + } + + return null; +}; + +export const getPageHeadings = (parent = document) => { + return Array.from( + parent.querySelectorAll('h1, h2, h3, h4, h5, h6, [role="heading"]'), + ).filter((heading) => { + return 'presentation' !== heading.getAttribute('role'); + }); +}; + +export const getH1Headings = (parent = document) => + Array.from( + parent.querySelectorAll('h1, [role="heading"][aria-level="1"]'), + ).filter((heading) => { + const ariaLevel = parseInt(heading.getAttribute('aria-level'), 10); + + return ( + !['none', 'presentation'].includes(heading.getAttribute('role')) && + !(heading.tagName.toLowerCase() === 'h1' && ariaLevel > 1) + ); + }); + +export const areNoHeadingsDefined = () => { + return getPageHeadings().length === 0; +}; + +/** + * Builds an n-nary tree of page headings. + * + * @return {import('../types/heading').Ea11yHeading[]} Headings tree. + */ +export const getPageHeadingsTree = () => { + const headings = getPageHeadings(); + + const root = []; + const stack = []; + + headings.forEach((headingHTMLElement) => { + const heading = createHeadingObject(headingHTMLElement); + const level = heading.level; + + // Pop stack until we find the correct parent level + while (stack.length > 0 && stack[stack.length - 1].level >= level) { + stack.pop(); + } + + if (stack.length === 0) { + root.push(heading); + } else { + stack[stack.length - 1].node.children.push(heading); + } + + // Push the current heading onto the stack + stack.push({ node: heading, level }); + }); + + return root; +}; + +/** + * Converts an n-nary tree to a flat tree. + * + * @param {import('../types/heading').Ea11yHeading[]} headings N-nary tree [a->b->c, d]. + * @return {import('../types/heading').Ea11yHeading[]} Headings flat tree [a, b, c, d]. + */ +export const toFlatTree = (headings) => { + const output = []; + + const walk = (h) => { + h.forEach((heading) => { + output.push(heading); + + if (heading.children && heading.children.length > 0) { + walk(heading.children); + } + }); + }; + + walk(headings); + + return output; +}; + +/** + * Returns the XPath of the element. + * + * @param {HTMLElement} node DOM node. + * @return {string} Heading XPath. + */ +export const getHeadingXpath = (node) => { + return getXPath(node, { ignoreId: true }); +}; + +const nodeKeyMap = new WeakMap(); +let nodeIdCounter = 0; + +/** + * Returns a stable, serializable key for a DOM Node across renders. + * Falls back to a deterministic prefix when input is invalid. + * + * @param {Object} node + * @param {string} [prefix='heading-tree'] + * @return {string} Unique key + */ +export const keyForNode = (node, prefix = 'heading-tree') => { + if (!node || 'object' !== typeof node) { + return `${prefix}-invalid`; + } + + let key = nodeKeyMap.get(node); + + if (!key) { + key = `${prefix}-${++nodeIdCounter}`; + nodeKeyMap.set(node, key); + } + + return key; +}; diff --git a/modules/scanner/assets/js/utils/validate-headings.js b/modules/scanner/assets/js/utils/validate-headings.js new file mode 100644 index 00000000..253aed22 --- /dev/null +++ b/modules/scanner/assets/js/utils/validate-headings.js @@ -0,0 +1,102 @@ +import { + toFlatTree, + getHeadingXpath, +} from '@ea11y-apps/scanner/utils/page-headings'; +import { EA11Y_RULES } from '../rules'; +import { HEADING_STATUS } from '../types/heading'; + +/** + * Validates the heading tree and mutates it to show notices in the UI. + * + * @param {import('../types/heading').Ea11yHeading[]} headingTree + * @param {string[]} dismissedHeadingIssues + * @return {import('../types/heading').Ea11yHeading[]} Validated heading tree. + */ +export const validateHeadings = (headingTree, dismissedHeadingIssues) => { + if (!headingTree.length) { + return headingTree; + } + + const clone = [...headingTree]; + const flatHeadings = toFlatTree(clone).filter( + (heading) => + !['none', 'presentation'].includes(heading.node.getAttribute('role')), + ); + const h1Titles = flatHeadings.filter((heading) => 1 === heading.level); + + if (h1Titles.length > 1) { + h1Titles.forEach((heading) => { + heading.status = HEADING_STATUS.ERROR; + heading.violationCode = EA11Y_RULES.REDUNDANT_H1_TAGS; + }); + } + + if (!h1Titles.length) { + clone[0].status = HEADING_STATUS.ERROR; + clone[0].violationCode = EA11Y_RULES.MISSING_H1_TAG; + } + + validateHierarchy(clone, dismissedHeadingIssues); + + return clone; +}; + +/** + * @param {import('../types/heading').Ea11yHeading[]} headings + * @param {string[]} dismissedHeadingIssues + * @param {number} parentLevel + */ +const validateHierarchy = ( + headings, + dismissedHeadingIssues, + parentLevel = 0, +) => { + let previousLevel = parentLevel; + + headings.forEach((heading) => { + const currentLevel = heading.level; + + if (previousLevel > 0 && currentLevel > previousLevel + 1) { + const xpath = getHeadingXpath(heading.node); + + if ( + // Important to not overwrite HEADING_STATUS.ERROR + heading.status === HEADING_STATUS.SUCCESS && + !dismissedHeadingIssues.includes(xpath) + ) { + heading.status = HEADING_STATUS.WARNING; + heading.violationCode = EA11Y_RULES.INCORRECT_HEADING_HIERARCHY; + } + } + + previousLevel = currentLevel; + + if (heading.children && heading.children.length > 0) { + validateHierarchy(heading.children, dismissedHeadingIssues, currentLevel); + } + }); +}; + +/** + * Returns heading validation stats. + * + * @param {import('../types/heading').Ea11yHeading[]} headings Validated heading tree. + * @return {import('../types/heading').Ea11yHeadingStats} Validation stats. + */ +export const calculateStats = (headings) => { + const flatHeadings = toFlatTree(headings); + const output = { + total: flatHeadings.length, + [HEADING_STATUS.SUCCESS]: 0, + [HEADING_STATUS.WARNING]: 0, + [HEADING_STATUS.ERROR]: 0, + }; + + flatHeadings.forEach((heading) => { + const status = heading.status; + + output[status]++; + }); + + return output; +}; diff --git a/modules/scanner/module.php b/modules/scanner/module.php index f3059e6b..02cc49c1 100644 --- a/modules/scanner/module.php +++ b/modules/scanner/module.php @@ -83,6 +83,12 @@ public function enqueue_assets() : void { 'value' => $url, ]); + $dismissed_heading_issues = get_post_meta( get_the_ID(), 'ea11y-scanner-heading-issues-dismissed', true ); + + if ( ! $dismissed_heading_issues ) { + $dismissed_heading_issues = []; + } + wp_localize_script( 'scanner', 'ea11yScannerData', @@ -107,6 +113,7 @@ public function enqueue_assets() : void { 'isConnected' => Connect::is_connected(), 'isRTL' => is_rtl(), 'isDevelopment' => defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG, + 'dismissedHeadingIssues' => $dismissed_heading_issues, ] ); } diff --git a/modules/scanner/rest/resolve-issue.php b/modules/scanner/rest/resolve-issue.php index c654c9d8..12c92dee 100644 --- a/modules/scanner/rest/resolve-issue.php +++ b/modules/scanner/rest/resolve-issue.php @@ -10,58 +10,58 @@ use WP_REST_Response; if ( ! defined( 'ABSPATH' ) ) { - exit; // Exit if accessed directly + exit; // Exit if accessed directly } class Resolve_Issue extends Route_Base { - public string $path = 'resolve-issue'; + public string $path = 'resolve-issue'; - public function get_methods(): array { - return [ 'POST' ]; - } + public function get_methods(): array { + return [ 'POST' ]; + } - public function get_name(): string { - return 'resolve-issue'; - } + public function get_name(): string { + return 'resolve-issue'; + } - /** - * - * @return WP_Error|WP_REST_Response - * - */ - public function POST( $request ) { - try { - $error = $this->verify_capability(); + /** + * + * @return WP_Error|WP_REST_Response + * + */ + public function POST( $request ) { + try { + $error = $this->verify_capability(); - if ( $error ) { - return $error; - } + if ( $error ) { + return $error; + } - $scan_id = $request->get_param( 'scanId' ); - $scan = Scan_Entry::get_by_id( $scan_id ); + $scan_id = $request->get_param( 'scanId' ); + $scan = Scan_Entry::get_by_id( $scan_id ); - if ( empty( $scan ) ) { - return $this->respond_error_json( [ - 'message' => 'Scan not found', - 'code' => 'not_found', - ] ); - } + if ( empty( $scan ) ) { + return $this->respond_error_json( [ + 'message' => 'Scan not found', + 'code' => 'not_found', + ] ); + } - $summary = $scan->summary; + $summary = $scan->summary; - if ($summary['counts']['issuesResolved'] + 1 <= $summary['counts']['violation']) { - $summary['counts']['issuesResolved']++; - Scan_Entry::update_scan_summary( Scans_Table::ID, $scan_id, json_encode( $summary ) ); - } + if ( $summary['counts']['issuesResolved'] + 1 <= $summary['counts']['violation'] ) { + $summary['counts']['issuesResolved']++; + Scan_Entry::update_scan_summary( Scans_Table::ID, $scan_id, json_encode( $summary ) ); + } - return $this->respond_success_json( [ - 'message' => 'Resolved', - ] ); - } catch ( Throwable $t ) { - return $this->respond_error_json( [ - 'message' => $t->getMessage(), - 'code' => 'internal_server_error', - ] ); - } - } + return $this->respond_success_json( [ + 'message' => 'Resolved', + ] ); + } catch ( Throwable $t ) { + return $this->respond_error_json( [ + 'message' => $t->getMessage(), + 'code' => 'internal_server_error', + ] ); + } + } } diff --git a/modules/settings/assets/js/pages/accessibility-statement.js b/modules/settings/assets/js/pages/accessibility-statement.js index 6e411c52..a97091b8 100644 --- a/modules/settings/assets/js/pages/accessibility-statement.js +++ b/modules/settings/assets/js/pages/accessibility-statement.js @@ -15,16 +15,16 @@ import { } from '@ea11y/icons'; import { StatementLink } from '@ea11y/layouts'; import { + StyledBox, StyledStatementPaper, StyledTitle, StyledWideBox, - StyledBox, } from '@ea11y/pages/pages.styles'; import { GOLINKS } from '@ea11y-apps/global/constants'; import { mixpanelEvents, mixpanelService } from '@ea11y-apps/global/services'; +import { injectTemplateVars } from '@ea11y-apps/global/utils/inject-template-vars'; import { useEffect, useState } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; -import { injectTemplateVars } from '../utils'; const AccessibilityStatement = () => { const { accessibilityStatementData } = useSettings(); diff --git a/modules/settings/assets/js/pages/pages.styles.js b/modules/settings/assets/js/pages/pages.styles.js index 456683b1..12fc3cc0 100644 --- a/modules/settings/assets/js/pages/pages.styles.js +++ b/modules/settings/assets/js/pages/pages.styles.js @@ -30,9 +30,16 @@ export const StyledWideBox = styled(Box)` `; export const StyledTitle = styled(Typography)` - font-weight: 400; - letter-spacing: 0.25px; - margin-bottom: 16px; + display: flex; + align-items: center; + + margin: 0; + + color: #0c0d0e; + font-size: 16px; + font-weight: 500; + line-height: 130%; + letter-spacing: 0.15px; `; export const StyledStatementPaper = styled(Paper)` diff --git a/modules/settings/assets/js/utils/index.js b/modules/settings/assets/js/utils/index.js index 6aad0043..e2cc57a1 100644 --- a/modules/settings/assets/js/utils/index.js +++ b/modules/settings/assets/js/utils/index.js @@ -1,25 +1,3 @@ -import { createElement } from '@wordpress/element'; - -export const injectTemplateVars = (message, components) => { - const regex = /\{\{(\w+)\}\}([^]*?)\{\{\/\1\}\}/g; - const splitMessage = message.split(regex); - - // eslint-disable-next-line array-callback-return - return splitMessage.map((part, index) => { - if (index % 3 === 0) { - return part; - } - - if (index % 3 === 1) { - return createElement( - components[part], - { key: index }, - splitMessage[index + 1], - ); - } - }); -}; - export const validateUrl = (url) => { const pattern = /^(https?):\/\/([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}(:\d{1,5})?(\/.*)?$/i; diff --git a/package-lock.json b/package-lock.json index c6a2c847..87a98a94 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "@wordpress/media-utils": "^5.22.0", "@wordpress/url": "^4.10.0", "clipboard-copy": "^4.0.1", + "focus-trap-react": "^11.0.4", "get-xpath": "^3.3.0", "html-react-parser": "^5.2.2", "husky": "^9.1.6", @@ -36,7 +37,8 @@ "react-content-loader": "^7.0.2", "stylis": "^4.3.6", "stylis-plugin-rtl": "^2.1.1", - "use-debounce": "^10.0.4" + "use-debounce": "^10.0.4", + "zod": "^4.1.5" }, "devDependencies": { "@eslint/js": "^9.13.0", @@ -1960,6 +1962,43 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@cacheable/memoize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@cacheable/memoize/-/memoize-2.0.1.tgz", + "integrity": "sha512-WBLH37SynkCa39S6IrTSMQF3Wdv4/51WxuU5TuCNEqZcLgLGHme8NUxRTcDIO8ZZFXlslWbh9BD3DllixgPg6Q==", + "dev": true, + "dependencies": { + "@cacheable/utils": "^2.0.1" + } + }, + "node_modules/@cacheable/memory": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.1.tgz", + "integrity": "sha512-Ufc7iQnRKFC8gjZVGOTOsMwM/vZtmsw3LafvctVXPm835ElgK3DpMe1U5i9sd6OieSkyJhXbAT2Q2FosXBBbAQ==", + "dev": true, + "dependencies": { + "@cacheable/memoize": "^2.0.1", + "@cacheable/utils": "^2.0.1", + "@keyv/bigmap": "^1.0.0", + "hookified": "^1.12.0", + "keyv": "^5.5.1" + } + }, + "node_modules/@cacheable/memory/node_modules/keyv": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.1.tgz", + "integrity": "sha512-eF3cHZ40bVsjdlRi/RvKAuB0+B61Q1xWvohnrJrnaQslM3h1n79IV+mc9EGag4nrA9ZOlNyr3TUzW5c8uy8vNA==", + "dev": true, + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, + "node_modules/@cacheable/utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.0.1.tgz", + "integrity": "sha512-sxHjO6wKn4/0wHCFYbh6tljj+ciP9BKgyBi09NLsor3sN+nu/Rt3FwLw6bYp7bp8usHpmcwUozrB/u4RuSw/eg==", + "dev": true + }, "node_modules/@csstools/css-parser-algorithms": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", @@ -2025,9 +2064,9 @@ } }, "node_modules/@date-fns/tz": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@date-fns/tz/-/tz-1.2.0.tgz", - "integrity": "sha512-LBrd7MiJZ9McsOgxqWX7AaxrDjcFVjWH/tIKJd7pnR7McaslGYOP1QmmiBXdJH/H/yLCT+rcQ7FaPBUxRGUtrg==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@date-fns/tz/-/tz-1.4.1.tgz", + "integrity": "sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA==" }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", @@ -2101,13 +2140,13 @@ } }, "node_modules/@dual-bundle/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.2.1.tgz", + "integrity": "sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==", "dev": true, "funding": { "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/JounQin" } }, "node_modules/@elementor/design-tokens": { @@ -2940,6 +2979,15 @@ "deprecated": "Use @eslint/object-schema instead", "dev": true }, + "node_modules/@inquirer/ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.0.tgz", + "integrity": "sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA==", + "dev": true, + "engines": { + "node": ">=18" + } + }, "node_modules/@inquirer/checkbox": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.0.tgz", @@ -2986,14 +3034,14 @@ } }, "node_modules/@inquirer/core": { - "version": "10.1.15", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.15.tgz", - "integrity": "sha512-8xrp836RZvKkpNbVvgWUlxjT4CraKk2q+I3Ksy+seI2zkcE+y6wNs1BVhgcv8VyImFecUhdQrYLdW32pAjwBdA==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.2.2.tgz", + "integrity": "sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA==", "dev": true, "dependencies": { + "@inquirer/ansi": "^1.0.0", "@inquirer/figures": "^1.0.13", "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", @@ -3013,14 +3061,14 @@ } }, "node_modules/@inquirer/editor": { - "version": "4.2.15", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.15.tgz", - "integrity": "sha512-wst31XT8DnGOSS4nNJDIklGKnf+8shuauVrWzgKegWUe28zfCftcWZ2vktGdzJgcylWSS2SrDnYUb6alZcwnCQ==", + "version": "4.2.20", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.20.tgz", + "integrity": "sha512-7omh5y5bK672Q+Brk4HBbnHNowOZwrb/78IFXdrEB9PfdxL3GudQyDk8O9vQ188wj3xrEebS2M9n18BjJoI83g==", "dev": true, "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "external-editor": "^3.1.0" + "@inquirer/core": "^10.2.2", + "@inquirer/external-editor": "^1.0.2", + "@inquirer/type": "^3.0.8" }, "engines": { "node": ">=18" @@ -3056,6 +3104,43 @@ } } }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", + "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", + "dev": true, + "dependencies": { + "chardet": "^2.1.0", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor/node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/@inquirer/figures": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", @@ -3715,10 +3800,22 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@keyv/bigmap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.0.0.tgz", + "integrity": "sha512-N2UsRSXlWwbvYKdFVS7sKqj6oXGegELh+zr9VripWDc8grsq8KBNp8JHI+9AQuUEFiM1S7+tm6lLp/lmbBCqCw==", + "dev": true, + "dependencies": { + "hookified": "^1.10.0" + }, + "engines": { + "node": ">= 20" + } + }, "node_modules/@keyv/serialize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.0.tgz", - "integrity": "sha512-RlDgexML7Z63Q8BSaqhXdCYNBy/JQnqYIwxofUrNLGCblOMHp+xux2Q8nLMLlPpgHQPoU0Do8Z6btCpRBEqZ8g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", "dev": true }, "node_modules/@kwsites/file-exists": { @@ -4893,9 +4990,9 @@ } }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.36.0.tgz", - "integrity": "sha512-TtxJSRD8Ohxp6bKkhrm27JRHAxPczQA7idtcTOMYI+wQRRrfgqxHv1cFbCApcSnNjtXkmzFozn6jQtFrOmbjPQ==", + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.37.0.tgz", + "integrity": "sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA==", "dev": true, "engines": { "node": ">=14" @@ -4973,9 +5070,9 @@ } }, "node_modules/@paulirish/trace_engine": { - "version": "0.0.57", - "resolved": "https://registry.npmjs.org/@paulirish/trace_engine/-/trace_engine-0.0.57.tgz", - "integrity": "sha512-s+JNJ53B1MiEqCOD2hnK96wFTRRStxFmtm6QaIe2jiNI+lkS9mYEgnHOH2caQ/dEPn6wY+f2u5dW6aFYjmbaiw==", + "version": "0.0.59", + "resolved": "https://registry.npmjs.org/@paulirish/trace_engine/-/trace_engine-0.0.59.tgz", + "integrity": "sha512-439NUzQGmH+9Y017/xCchBP9571J4bzhpcNhrxorf7r37wcyJZkgUfrUsRL3xl+JDcZ6ORhoFCzCw98c6S3YHw==", "dev": true, "dependencies": { "legacy-javascript": "latest", @@ -5005,13 +5102,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.54.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.1.tgz", - "integrity": "sha512-FS8hQ12acieG2dYSksmLOF7BNxnVf2afRJdCuM1eMSxj6QTSE6G4InGF7oApGgDb65MX7AwMVlIkpru0yZA4Xw==", + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.55.0.tgz", + "integrity": "sha512-04IXzPwHrW69XusN/SIdDdKZBzMfOT9UNT/YiJit/xpy2VuAoB8NHc8Aplb96zsWDddLnbkPL3TsmrS04ZU2xQ==", "dev": true, "peer": true, "dependencies": { - "playwright": "1.54.1" + "playwright": "1.55.0" }, "bin": { "playwright": "cli.js" @@ -5555,18 +5652,18 @@ "dev": true }, "node_modules/@sentry/core": { - "version": "9.40.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-9.40.0.tgz", - "integrity": "sha512-cZkuz6BDna6VXSqvlWnrRsaDx4QBKq1PcfQrqhVz8ljs0M7Gcl+Mtj8dCzUxx12fkYM62hQXG72DEGNlAQpH/Q==", + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-9.46.0.tgz", + "integrity": "sha512-it7JMFqxVproAgEtbLgCVBYtQ9fIb+Bu0JD+cEplTN/Ukpe6GaolyYib5geZqslVxhp2sQgT+58aGvfd/k0N8Q==", "dev": true, "engines": { "node": ">=18" } }, "node_modules/@sentry/node": { - "version": "9.40.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-9.40.0.tgz", - "integrity": "sha512-8bVWChXzGH4QmbVw+H/yiJ6zxqPDhnx11fEAP+vpL1UBm1cAV67CoB4eS7OqQdPC8gF/BQb2sqF0TvY/12NPpA==", + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-9.46.0.tgz", + "integrity": "sha512-pRLqAcd7GTGvN8gex5FtkQR5Mcol8gOy1WlyZZFq4rBbVtMbqKOQRhohwqnb+YrnmtFpj7IZ7KNDo077MvNeOQ==", "dev": true, "dependencies": { "@opentelemetry/api": "^1.9.0", @@ -5599,9 +5696,9 @@ "@opentelemetry/sdk-trace-base": "^1.30.1", "@opentelemetry/semantic-conventions": "^1.34.0", "@prisma/instrumentation": "6.11.1", - "@sentry/core": "9.40.0", - "@sentry/node-core": "9.40.0", - "@sentry/opentelemetry": "9.40.0", + "@sentry/core": "9.46.0", + "@sentry/node-core": "9.46.0", + "@sentry/opentelemetry": "9.46.0", "import-in-the-middle": "^1.14.2", "minimatch": "^9.0.0" }, @@ -5610,13 +5707,13 @@ } }, "node_modules/@sentry/node-core": { - "version": "9.40.0", - "resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-9.40.0.tgz", - "integrity": "sha512-97JONDa8NxItX0Cz5WQPMd1gQjzodt38qQ0OzZNFvYg2Cpvxob8rxwsNA08Liu7B97rlvsvqMt+Wbgw8SAMfgQ==", + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-9.46.0.tgz", + "integrity": "sha512-XRVu5pqoklZeh4wqhxCLZkz/ipoKhitctgEFXX9Yh1e1BoHM2pIxT52wf+W6hHM676TFmFXW3uKBjsmRM3AjgA==", "dev": true, "dependencies": { - "@sentry/core": "9.40.0", - "@sentry/opentelemetry": "9.40.0", + "@sentry/core": "9.46.0", + "@sentry/opentelemetry": "9.46.0", "import-in-the-middle": "^1.14.2" }, "engines": { @@ -5633,12 +5730,12 @@ } }, "node_modules/@sentry/opentelemetry": { - "version": "9.40.0", - "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-9.40.0.tgz", - "integrity": "sha512-POQ/ZFmBbi15z3EO9gmTExpxCfW0Ug+WooA8QZPJaizo24gcF5AMOgwuGFwT2YLw/2HdPWjPUPujNNGdCWM6hw==", + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-9.46.0.tgz", + "integrity": "sha512-w2zTxqrdmwRok0cXBoh+ksXdGRUHUZhlpfL/H2kfTodOL+Mk8rW72qUmfqQceXoqgbz8UyK8YgJbyt+XS5H4Qg==", "dev": true, "dependencies": { - "@sentry/core": "9.40.0" + "@sentry/core": "9.46.0" }, "engines": { "node": ">=18" @@ -6115,9 +6212,9 @@ "integrity": "sha512-oocsqY7g0cR+Gur5jRQLSrX2OtpMLMse1I10JQBm8CdGMrDkh1Mg2gjsiquMHRtBs4Qwu5wgEp5GgIYHk4SNPw==" }, "node_modules/@tannin/sprintf": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@tannin/sprintf/-/sprintf-1.3.1.tgz", - "integrity": "sha512-3auu6Wqm4TR6gvOh1Dgh1d2k9+arNmu3T0JLiUJoJMgayeHr450OuWeZIMTE4CUuq51rwn/NI9S5InT0JuTxQw==" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@tannin/sprintf/-/sprintf-1.3.3.tgz", + "integrity": "sha512-RwARl+hFwhzy0tg9atWcchLFvoQiOh4rrP7uG2N5E4W80BPCUX0ElcUR9St43fxB9EfjsW2df9Qp+UsTbvQDjA==" }, "node_modules/@tootallnate/once": { "version": "2.0.0", @@ -6345,16 +6442,6 @@ "@types/send": "*" } }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -6457,16 +6544,6 @@ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true }, - "node_modules/@types/minimatch": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-6.0.0.tgz", - "integrity": "sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==", - "deprecated": "This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed.", - "dev": true, - "dependencies": { - "minimatch": "*" - } - }, "node_modules/@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", @@ -6655,7 +6732,9 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.6.tgz", "integrity": "sha512-5JcVt1u5HDmlXkwOD2nslZVllBBc7HDuOICfiZah2Z0is8M8g+ddAEawbmd3VjedfDHBzxCaXLs07QEmb7y54g==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/@types/stack-utils": { "version": "2.0.3", @@ -6667,7 +6746,9 @@ "version": "1.0.12", "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.12.tgz", "integrity": "sha512-bTHG8fcxEqv1M9+TD14P8ok8hjxoOCkfKc8XXLaaD05kI7ohpeI956jtDOD3XHKBQrlyPughUtzm1jtVhHpA5Q==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/@types/tedious": { "version": "4.0.14", @@ -6689,6 +6770,8 @@ "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.5.tgz", "integrity": "sha512-TU+fZFBTBcXj/GpDpDaBmgWk/gn96kMZ+uocaFUlV2f8a6WdMzzI44QBCmGcCiYR0Y6ZlNRiyUyKKt5nl/lbzQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "source-map": "^0.6.1" } @@ -6698,6 +6781,8 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -6707,6 +6792,8 @@ "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.40.tgz", "integrity": "sha512-u6kMFSBM9HcoTpUXnL6mt2HSzftqb3JgYV6oxIgL2dl6sX6aCa5k6SOkzv5DuZjBTPUE/dJltKtwwuqrkZHpfw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@types/node": "*", "@types/tapable": "^1", @@ -6721,6 +6808,8 @@ "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-4nZOdMwSPHZ4pTEZzSp0AsTM4K7Qmu40UKW4tJDiOVs20UzYF9l+qUe4s0ftfN0pin06n+5cWWDJXH+sbhAiDw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@types/node": "*", "@types/source-list-map": "*", @@ -6732,6 +6821,8 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 8" } @@ -6741,6 +6832,8 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -7230,13 +7323,13 @@ } }, "node_modules/@wordpress/a11y": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/a11y/-/a11y-4.27.0.tgz", - "integrity": "sha512-wbZ7F4mA2VZKGkA30fivJwHT6OA+CXzhGokaaIVGWqjAygioFkaqb49u+eMWKTQoYEL6BdeUgDmViMUxva73Uw==", + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/a11y/-/a11y-4.30.0.tgz", + "integrity": "sha512-FpKsURiJmlQXyNCYJXiPxdJLsfcVhDSvH4/+kjEsVLOYyqD+vcb9P/oYDmor4XNIIkMT0/Lna9OnwvwCZB8owQ==", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/dom-ready": "^4.27.0", - "@wordpress/i18n": "^6.0.0" + "@wordpress/dom-ready": "^4.30.0", + "@wordpress/i18n": "^6.3.0" }, "engines": { "node": ">=18.12.0", @@ -7255,13 +7348,13 @@ } }, "node_modules/@wordpress/a11y/node_modules/@wordpress/i18n": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-6.0.0.tgz", - "integrity": "sha512-ItvO/E3v39VX+5nZacyzwulhzRukiB2+1zqndWgOSNnERYnK/0hLHIWWthRFxYEPF13H54orXg68n17MZQ8whA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-6.3.0.tgz", + "integrity": "sha512-5Dw5JOWlF8JM0hOZnli7MbVshHi9wFPrBkB4CeeJm//arGGYYxw5IYaPJN5jnlMxFAVtCOaXgrxGJoC9mxQBng==", "dependencies": { "@babel/runtime": "7.25.7", - "@tannin/sprintf": "^1.3.1", - "@wordpress/hooks": "^4.27.0", + "@tannin/sprintf": "^1.3.2", + "@wordpress/hooks": "^4.30.0", "gettext-parser": "^1.3.1", "memize": "^2.1.0", "tannin": "^1.2.0" @@ -7275,13 +7368,13 @@ } }, "node_modules/@wordpress/api-fetch": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-7.27.0.tgz", - "integrity": "sha512-YoYWIJg087pXSWaiiNAKixUB70l1gbvZi0VEj6SrqdAItuTfYelG6hJtYxF2xPhBWVGbTXaq8nJMVRB8EcutAg==", + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-7.30.0.tgz", + "integrity": "sha512-KwI+ENWAd350Y5qd/Ok1bbSplDP4HFf9E/yh8QnRkhtsx4xAmFP5prNkPXktqK00NGPU8rRcTKzMdtrgQ2M/pA==", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/i18n": "^6.0.0", - "@wordpress/url": "^4.27.0" + "@wordpress/i18n": "^6.3.0", + "@wordpress/url": "^4.30.0" }, "engines": { "node": ">=18.12.0", @@ -7300,13 +7393,13 @@ } }, "node_modules/@wordpress/api-fetch/node_modules/@wordpress/i18n": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-6.0.0.tgz", - "integrity": "sha512-ItvO/E3v39VX+5nZacyzwulhzRukiB2+1zqndWgOSNnERYnK/0hLHIWWthRFxYEPF13H54orXg68n17MZQ8whA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-6.3.0.tgz", + "integrity": "sha512-5Dw5JOWlF8JM0hOZnli7MbVshHi9wFPrBkB4CeeJm//arGGYYxw5IYaPJN5jnlMxFAVtCOaXgrxGJoC9mxQBng==", "dependencies": { "@babel/runtime": "7.25.7", - "@tannin/sprintf": "^1.3.1", - "@wordpress/hooks": "^4.27.0", + "@tannin/sprintf": "^1.3.2", + "@wordpress/hooks": "^4.30.0", "gettext-parser": "^1.3.1", "memize": "^2.1.0", "tannin": "^1.2.0" @@ -7320,9 +7413,9 @@ } }, "node_modules/@wordpress/autop": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/autop/-/autop-4.27.0.tgz", - "integrity": "sha512-UY1bxt8aJcZfG0U7y28QiHJAt6ZEv5gk7by9IZQ8VJ4bUEdNAafyWr9ysJlERDsca+CK2xNIR/JwQb7CAaXNjw==", + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/autop/-/autop-4.30.0.tgz", + "integrity": "sha512-0VGvgPdmbJDdVUgSYfwgM6aiBI/3G5bAtksQfue3HvNMMmZvsudopPgeOXH2S8jjkbbPLr3AIbx6lFSk4Autqw==", "dependencies": { "@babel/runtime": "7.25.7" }, @@ -7343,9 +7436,9 @@ } }, "node_modules/@wordpress/babel-preset-default": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-8.27.0.tgz", - "integrity": "sha512-FzfXQL/DAlNrOeiz88p0ReV1TLofo0vWZfQOdd7OswwzfYsMlXue7ms7Qo23z8tag+nNYnqQp71atUD5vox+fg==", + "version": "8.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-8.30.0.tgz", + "integrity": "sha512-DUEAseIg3Xqa4MroaFQEob4TYTGJv0zKRLsDrLHAgQCTtC4PcvUqU0gM7JZjG3zo20G9R5YCBNzx1353qd1t7Q==", "dev": true, "dependencies": { "@babel/core": "7.25.7", @@ -7354,8 +7447,8 @@ "@babel/preset-env": "7.25.7", "@babel/preset-typescript": "7.25.7", "@babel/runtime": "7.25.7", - "@wordpress/browserslist-config": "^6.27.0", - "@wordpress/warning": "^3.27.0", + "@wordpress/browserslist-config": "^6.30.0", + "@wordpress/warning": "^3.30.0", "browserslist": "^4.21.10", "core-js": "^3.31.0", "react": "^18.3.0" @@ -7408,9 +7501,9 @@ } }, "node_modules/@wordpress/base-styles": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-6.3.0.tgz", - "integrity": "sha512-Xu7hDd95c96zOk/gAvANlSWFRl6YEduyjc2sN4pSwCM7zHIgwBELdLg9CyzgwuR7Y3XDNdBgptsS9OUHBiC22Q==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-6.6.0.tgz", + "integrity": "sha512-72OqyskL5E8V7trJYt4xlNbOfgAtAFfpwa+8TR+wLwqIYxhFjsWmkZsT3aknE6cyfRAmKZgSUfEZr8zH6Skwyw==", "dev": true, "engines": { "node": ">=18.12.0", @@ -7418,9 +7511,9 @@ } }, "node_modules/@wordpress/blob": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/blob/-/blob-4.27.0.tgz", - "integrity": "sha512-dOXMP3xR6nJMGsDQbQ+IbJBjyVZq9RK0e7jA6elbkuspEQmRkbyiyfWTuscSEusJydW6NDRaQl9rzQsbLy7UeA==", + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/blob/-/blob-4.30.0.tgz", + "integrity": "sha512-kiGJFVNM8snw8r45s5cAv+qDaxOdeMWpNRB0scBFiV09yTLJtjtk7tJxVz0FfUHCX5cBA7NhwaOf+m8O4T2xZQ==", "dependencies": { "@babel/runtime": "7.25.7" }, @@ -7525,9 +7618,9 @@ } }, "node_modules/@wordpress/block-serialization-default-parser": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-5.27.0.tgz", - "integrity": "sha512-OTGiQMjailRi4KEM/9WNdUcZqUK2YRXf4Zd1VfsOPGI6RaZbYwW/5p0KuWOKYAVNF2ALAhssOoqxjKCvBs0kwg==", + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-5.30.0.tgz", + "integrity": "sha512-7bCeSqlkzkisn4MsVpkpNM8OsM8Orkulkg2lL6TKH0bYnDGZLYFmz2Jv5PC2MfUf7g0F1lkXu078Rg11s8aQjQ==", "dependencies": { "@babel/runtime": "7.25.7" }, @@ -7600,9 +7693,9 @@ } }, "node_modules/@wordpress/browserslist-config": { - "version": "6.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.27.0.tgz", - "integrity": "sha512-lBl7ggE05IF3jp3USh2xaz/OnaO1dj4HaySGXXD56Z9ikRcmneyjiux3UmzeHYPPp00XXOcjZ7xGIMXQJOq2BQ==", + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.30.0.tgz", + "integrity": "sha512-CjirkPIkMf72VQcKmhmQZUJGHHFEt80ITZVgnxEtyswWA6QPRXIwFhQOAElmfhWg2wS6pCncyg6k7DfgYX3bOg==", "dev": true, "engines": { "node": ">=18.12.0", @@ -7610,18 +7703,18 @@ } }, "node_modules/@wordpress/commands": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/commands/-/commands-1.27.0.tgz", - "integrity": "sha512-W3cXIh/9SyEPGUgjIDit+xu0pLXXfcoD47afTgCyx48MNWxUx9ml+vpk5W5eFmQBTbzTVrMq7krlgHrbOhifZw==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/commands/-/commands-1.30.0.tgz", + "integrity": "sha512-1ErowcNAfn0sC6/KkFQje/F+pR1PGsoSbtxk8fxg2ZbDiINZnEMy/sc5yin+7nVLiC4QncAKnwdysbqnBAHb5Q==", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/components": "^30.0.0", - "@wordpress/data": "^10.27.0", - "@wordpress/element": "^6.27.0", - "@wordpress/i18n": "^6.0.0", - "@wordpress/icons": "^10.27.0", - "@wordpress/keyboard-shortcuts": "^5.27.0", - "@wordpress/private-apis": "^1.27.0", + "@wordpress/components": "^30.3.0", + "@wordpress/data": "^10.30.0", + "@wordpress/element": "^6.30.0", + "@wordpress/i18n": "^6.3.0", + "@wordpress/icons": "^10.30.0", + "@wordpress/keyboard-shortcuts": "^5.30.0", + "@wordpress/private-apis": "^1.30.0", "clsx": "^2.1.1", "cmdk": "^1.0.0" }, @@ -7657,10 +7750,15 @@ "react-dom": ">=16.8.0" } }, + "node_modules/@wordpress/commands/node_modules/@types/gradient-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@types/gradient-parser/-/gradient-parser-1.1.0.tgz", + "integrity": "sha512-SaEcbgQscHtGJ1QL+ajgDTmmqU2f6T+00jZRcFlVHUW2Asivc84LNUev/UQFyu117AsdyrtI+qpwLvgjJXJxmw==" + }, "node_modules/@wordpress/commands/node_modules/@wordpress/components": { - "version": "30.0.0", - "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-30.0.0.tgz", - "integrity": "sha512-+9A36VLY6jz6TYmfDHzOWCYVz/wJQFBWZwfZmET8ce9yUKjeIQ+Zhhihj/EbTmmqSvZIgEgqinXTnnqCJr1OTA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-30.3.0.tgz", + "integrity": "sha512-tXe6ucxRThjMPYCk1ZZHAnL0MQqFpCq/PwME/ypBf5dOE3GHKMKXVTvgsJv5bHH6dbJoElkDWRm3ZwqwwQ5CVg==", "dependencies": { "@ariakit/react": "^0.4.15", "@babel/runtime": "7.25.7", @@ -7671,34 +7769,34 @@ "@emotion/styled": "^11.6.0", "@emotion/utils": "^1.0.0", "@floating-ui/react-dom": "2.0.8", - "@types/gradient-parser": "0.1.3", + "@types/gradient-parser": "1.1.0", "@types/highlight-words-core": "1.2.1", "@use-gesture/react": "^10.3.1", - "@wordpress/a11y": "^4.27.0", - "@wordpress/compose": "^7.27.0", - "@wordpress/date": "^5.27.0", - "@wordpress/deprecated": "^4.27.0", - "@wordpress/dom": "^4.27.0", - "@wordpress/element": "^6.27.0", - "@wordpress/escape-html": "^3.27.0", - "@wordpress/hooks": "^4.27.0", - "@wordpress/html-entities": "^4.27.0", - "@wordpress/i18n": "^6.0.0", - "@wordpress/icons": "^10.27.0", - "@wordpress/is-shallow-equal": "^5.27.0", - "@wordpress/keycodes": "^4.27.0", - "@wordpress/primitives": "^4.27.0", - "@wordpress/private-apis": "^1.27.0", - "@wordpress/rich-text": "^7.27.0", - "@wordpress/warning": "^3.27.0", + "@wordpress/a11y": "^4.30.0", + "@wordpress/compose": "^7.30.0", + "@wordpress/date": "^5.30.0", + "@wordpress/deprecated": "^4.30.0", + "@wordpress/dom": "^4.30.0", + "@wordpress/element": "^6.30.0", + "@wordpress/escape-html": "^3.30.0", + "@wordpress/hooks": "^4.30.0", + "@wordpress/html-entities": "^4.30.0", + "@wordpress/i18n": "^6.3.0", + "@wordpress/icons": "^10.30.0", + "@wordpress/is-shallow-equal": "^5.30.0", + "@wordpress/keycodes": "^4.30.0", + "@wordpress/primitives": "^4.30.0", + "@wordpress/private-apis": "^1.30.0", + "@wordpress/rich-text": "^7.30.0", + "@wordpress/warning": "^3.30.0", "change-case": "^4.1.2", "clsx": "^2.1.1", "colord": "^2.7.0", "date-fns": "^3.6.0", "deepmerge": "^4.3.0", "fast-deep-equal": "^3.1.3", - "framer-motion": "^11.1.9", - "gradient-parser": "1.0.2", + "framer-motion": "^11.15.0", + "gradient-parser": "1.1.1", "highlight-words-core": "^1.2.2", "is-plain-object": "^5.0.0", "memize": "^2.1.0", @@ -7719,13 +7817,13 @@ } }, "node_modules/@wordpress/commands/node_modules/@wordpress/i18n": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-6.0.0.tgz", - "integrity": "sha512-ItvO/E3v39VX+5nZacyzwulhzRukiB2+1zqndWgOSNnERYnK/0hLHIWWthRFxYEPF13H54orXg68n17MZQ8whA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-6.3.0.tgz", + "integrity": "sha512-5Dw5JOWlF8JM0hOZnli7MbVshHi9wFPrBkB4CeeJm//arGGYYxw5IYaPJN5jnlMxFAVtCOaXgrxGJoC9mxQBng==", "dependencies": { "@babel/runtime": "7.25.7", - "@tannin/sprintf": "^1.3.1", - "@wordpress/hooks": "^4.27.0", + "@tannin/sprintf": "^1.3.2", + "@wordpress/hooks": "^4.30.0", "gettext-parser": "^1.3.1", "memize": "^2.1.0", "tannin": "^1.2.0" @@ -7746,6 +7844,14 @@ "node": ">=6" } }, + "node_modules/@wordpress/commands/node_modules/gradient-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/gradient-parser/-/gradient-parser-1.1.1.tgz", + "integrity": "sha512-Hu0YfNU+38EsTmnUfLXUKFMXq9yz7htGYpF4x+dlbBhUCvIvzLt0yVLT/gJRmvLKFJdqNFrz4eKkIUjIXSr7Tw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@wordpress/components": { "version": "29.12.0", "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-29.12.0.tgz", @@ -7826,19 +7932,19 @@ } }, "node_modules/@wordpress/compose": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-7.27.0.tgz", - "integrity": "sha512-87/V/hyyg2Fojfk0hDVR4U3vdDdbNWoVdf17QnAORYt35lWWTxwMBKlZqIhFEuoLrPTvMQvu6ecjhxFNYB+ALg==", + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-7.30.0.tgz", + "integrity": "sha512-2OkdbhGiNWI4A8VXrawZcnqU8dSty3B3KvSLV1YK/TktW4qCGDNvp4W++NO5BY0d/zaSMgDUJryxyk3ejKTfzA==", "dependencies": { "@babel/runtime": "7.25.7", "@types/mousetrap": "^1.6.8", - "@wordpress/deprecated": "^4.27.0", - "@wordpress/dom": "^4.27.0", - "@wordpress/element": "^6.27.0", - "@wordpress/is-shallow-equal": "^5.27.0", - "@wordpress/keycodes": "^4.27.0", - "@wordpress/priority-queue": "^3.27.0", - "@wordpress/undo-manager": "^1.27.0", + "@wordpress/deprecated": "^4.30.0", + "@wordpress/dom": "^4.30.0", + "@wordpress/element": "^6.30.0", + "@wordpress/is-shallow-equal": "^5.30.0", + "@wordpress/keycodes": "^4.30.0", + "@wordpress/priority-queue": "^3.30.0", + "@wordpress/undo-manager": "^1.30.0", "change-case": "^4.1.2", "clipboard": "^2.0.11", "mousetrap": "^1.6.5", @@ -7864,27 +7970,27 @@ } }, "node_modules/@wordpress/core-data": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/core-data/-/core-data-7.27.0.tgz", - "integrity": "sha512-NK8Bqpa0xDMQKnLHXsjKvo1ij3HUbxDvhVRBuu+1fE8VtNU0yLEWgOziur6l6P9BI1oFA16s8JEGN/XULIAPiA==", + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/core-data/-/core-data-7.30.0.tgz", + "integrity": "sha512-mElhJ3Oj/W65bmZhpZP8d4T9pIKrdXwiVqsUQGbfdVyQxgFIarjB7AL8SyvMkqX0MzBghZL5rAoNfvMg8CTRvQ==", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/api-fetch": "^7.27.0", - "@wordpress/block-editor": "^15.0.0", - "@wordpress/blocks": "^15.0.0", - "@wordpress/compose": "^7.27.0", - "@wordpress/data": "^10.27.0", - "@wordpress/deprecated": "^4.27.0", - "@wordpress/element": "^6.27.0", - "@wordpress/html-entities": "^4.27.0", - "@wordpress/i18n": "^6.0.0", - "@wordpress/is-shallow-equal": "^5.27.0", - "@wordpress/private-apis": "^1.27.0", - "@wordpress/rich-text": "^7.27.0", - "@wordpress/sync": "^1.27.0", - "@wordpress/undo-manager": "^1.27.0", - "@wordpress/url": "^4.27.0", - "@wordpress/warning": "^3.27.0", + "@wordpress/api-fetch": "^7.30.0", + "@wordpress/block-editor": "^15.3.0", + "@wordpress/blocks": "^15.3.0", + "@wordpress/compose": "^7.30.0", + "@wordpress/data": "^10.30.0", + "@wordpress/deprecated": "^4.30.0", + "@wordpress/element": "^6.30.0", + "@wordpress/html-entities": "^4.30.0", + "@wordpress/i18n": "^6.3.0", + "@wordpress/is-shallow-equal": "^5.30.0", + "@wordpress/private-apis": "^1.30.0", + "@wordpress/rich-text": "^7.30.0", + "@wordpress/sync": "^1.30.0", + "@wordpress/undo-manager": "^1.30.0", + "@wordpress/url": "^4.30.0", + "@wordpress/warning": "^3.30.0", "change-case": "^4.1.2", "equivalent-key-map": "^0.2.2", "fast-deep-equal": "^3.1.3", @@ -7923,47 +8029,52 @@ "react-dom": ">=16.8.0" } }, + "node_modules/@wordpress/core-data/node_modules/@types/gradient-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@types/gradient-parser/-/gradient-parser-1.1.0.tgz", + "integrity": "sha512-SaEcbgQscHtGJ1QL+ajgDTmmqU2f6T+00jZRcFlVHUW2Asivc84LNUev/UQFyu117AsdyrtI+qpwLvgjJXJxmw==" + }, "node_modules/@wordpress/core-data/node_modules/@wordpress/block-editor": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@wordpress/block-editor/-/block-editor-15.0.0.tgz", - "integrity": "sha512-hOJc0aNmx9i/Ndm2f1VTJ6D7txirLOiOPa21dmN6dKJEbtXkVp1POjtor1XwBv3Ups8K8Mo2NxtwIcc7LNcQtQ==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/block-editor/-/block-editor-15.3.0.tgz", + "integrity": "sha512-10ZtT4QupAMQCAVEP6uA5nB+vI19WJzZuqGTpQtIDygcD/L8xQ+k5/yHVnhM3Q1W++lfQJ3wTsIS5XdAZYceIw==", "dependencies": { "@babel/runtime": "7.25.7", "@emotion/react": "^11.7.1", "@emotion/styled": "^11.6.0", "@react-spring/web": "^9.4.5", - "@wordpress/a11y": "^4.27.0", - "@wordpress/api-fetch": "^7.27.0", - "@wordpress/blob": "^4.27.0", - "@wordpress/block-serialization-default-parser": "^5.27.0", - "@wordpress/blocks": "^15.0.0", - "@wordpress/commands": "^1.27.0", - "@wordpress/components": "^30.0.0", - "@wordpress/compose": "^7.27.0", - "@wordpress/data": "^10.27.0", - "@wordpress/date": "^5.27.0", - "@wordpress/deprecated": "^4.27.0", - "@wordpress/dom": "^4.27.0", - "@wordpress/element": "^6.27.0", - "@wordpress/escape-html": "^3.27.0", - "@wordpress/hooks": "^4.27.0", - "@wordpress/html-entities": "^4.27.0", - "@wordpress/i18n": "^6.0.0", - "@wordpress/icons": "^10.27.0", - "@wordpress/is-shallow-equal": "^5.27.0", - "@wordpress/keyboard-shortcuts": "^5.27.0", - "@wordpress/keycodes": "^4.27.0", - "@wordpress/notices": "^5.27.0", - "@wordpress/preferences": "^4.27.0", - "@wordpress/priority-queue": "^3.27.0", - "@wordpress/private-apis": "^1.27.0", - "@wordpress/rich-text": "^7.27.0", - "@wordpress/style-engine": "^2.27.0", - "@wordpress/token-list": "^3.27.0", - "@wordpress/upload-media": "^0.12.0", - "@wordpress/url": "^4.27.0", - "@wordpress/warning": "^3.27.0", - "@wordpress/wordcount": "^4.27.0", + "@wordpress/a11y": "^4.30.0", + "@wordpress/api-fetch": "^7.30.0", + "@wordpress/blob": "^4.30.0", + "@wordpress/block-serialization-default-parser": "^5.30.0", + "@wordpress/blocks": "^15.3.0", + "@wordpress/commands": "^1.30.0", + "@wordpress/components": "^30.3.0", + "@wordpress/compose": "^7.30.0", + "@wordpress/data": "^10.30.0", + "@wordpress/date": "^5.30.0", + "@wordpress/deprecated": "^4.30.0", + "@wordpress/dom": "^4.30.0", + "@wordpress/element": "^6.30.0", + "@wordpress/escape-html": "^3.30.0", + "@wordpress/hooks": "^4.30.0", + "@wordpress/html-entities": "^4.30.0", + "@wordpress/i18n": "^6.3.0", + "@wordpress/icons": "^10.30.0", + "@wordpress/is-shallow-equal": "^5.30.0", + "@wordpress/keyboard-shortcuts": "^5.30.0", + "@wordpress/keycodes": "^4.30.0", + "@wordpress/notices": "^5.30.0", + "@wordpress/preferences": "^4.30.0", + "@wordpress/priority-queue": "^3.30.0", + "@wordpress/private-apis": "^1.30.0", + "@wordpress/rich-text": "^7.30.0", + "@wordpress/style-engine": "^2.30.0", + "@wordpress/token-list": "^3.30.0", + "@wordpress/upload-media": "^0.15.0", + "@wordpress/url": "^4.30.0", + "@wordpress/warning": "^3.30.0", + "@wordpress/wordcount": "^4.30.0", "change-case": "^4.1.2", "clsx": "^2.1.1", "colord": "^2.7.0", @@ -7989,26 +8100,26 @@ } }, "node_modules/@wordpress/core-data/node_modules/@wordpress/blocks": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@wordpress/blocks/-/blocks-15.0.0.tgz", - "integrity": "sha512-Gx1v2TfZ6RIejR4TQiqsG824HENE3sIxvTNuVtK68HDje4fdM8rAXRwA2IIMbKJ441xH4Yh8rlU7mmROWiyXBA==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/blocks/-/blocks-15.3.0.tgz", + "integrity": "sha512-/ojVeDNhWzfA6fAKcF/CO1JFF1SiXcvcLemRrVq4oScC2EJh78Ft7PDbI+dnll+4u0wJnJ9+VUTuAKEBnmjioA==", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/autop": "^4.27.0", - "@wordpress/blob": "^4.27.0", - "@wordpress/block-serialization-default-parser": "^5.27.0", - "@wordpress/data": "^10.27.0", - "@wordpress/deprecated": "^4.27.0", - "@wordpress/dom": "^4.27.0", - "@wordpress/element": "^6.27.0", - "@wordpress/hooks": "^4.27.0", - "@wordpress/html-entities": "^4.27.0", - "@wordpress/i18n": "^6.0.0", - "@wordpress/is-shallow-equal": "^5.27.0", - "@wordpress/private-apis": "^1.27.0", - "@wordpress/rich-text": "^7.27.0", - "@wordpress/shortcode": "^4.27.0", - "@wordpress/warning": "^3.27.0", + "@wordpress/autop": "^4.30.0", + "@wordpress/blob": "^4.30.0", + "@wordpress/block-serialization-default-parser": "^5.30.0", + "@wordpress/data": "^10.30.0", + "@wordpress/deprecated": "^4.30.0", + "@wordpress/dom": "^4.30.0", + "@wordpress/element": "^6.30.0", + "@wordpress/hooks": "^4.30.0", + "@wordpress/html-entities": "^4.30.0", + "@wordpress/i18n": "^6.3.0", + "@wordpress/is-shallow-equal": "^5.30.0", + "@wordpress/private-apis": "^1.30.0", + "@wordpress/rich-text": "^7.30.0", + "@wordpress/shortcode": "^4.30.0", + "@wordpress/warning": "^3.30.0", "change-case": "^4.1.2", "colord": "^2.7.0", "fast-deep-equal": "^3.1.3", @@ -8030,9 +8141,9 @@ } }, "node_modules/@wordpress/core-data/node_modules/@wordpress/components": { - "version": "30.0.0", - "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-30.0.0.tgz", - "integrity": "sha512-+9A36VLY6jz6TYmfDHzOWCYVz/wJQFBWZwfZmET8ce9yUKjeIQ+Zhhihj/EbTmmqSvZIgEgqinXTnnqCJr1OTA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-30.3.0.tgz", + "integrity": "sha512-tXe6ucxRThjMPYCk1ZZHAnL0MQqFpCq/PwME/ypBf5dOE3GHKMKXVTvgsJv5bHH6dbJoElkDWRm3ZwqwwQ5CVg==", "dependencies": { "@ariakit/react": "^0.4.15", "@babel/runtime": "7.25.7", @@ -8043,34 +8154,34 @@ "@emotion/styled": "^11.6.0", "@emotion/utils": "^1.0.0", "@floating-ui/react-dom": "2.0.8", - "@types/gradient-parser": "0.1.3", + "@types/gradient-parser": "1.1.0", "@types/highlight-words-core": "1.2.1", "@use-gesture/react": "^10.3.1", - "@wordpress/a11y": "^4.27.0", - "@wordpress/compose": "^7.27.0", - "@wordpress/date": "^5.27.0", - "@wordpress/deprecated": "^4.27.0", - "@wordpress/dom": "^4.27.0", - "@wordpress/element": "^6.27.0", - "@wordpress/escape-html": "^3.27.0", - "@wordpress/hooks": "^4.27.0", - "@wordpress/html-entities": "^4.27.0", - "@wordpress/i18n": "^6.0.0", - "@wordpress/icons": "^10.27.0", - "@wordpress/is-shallow-equal": "^5.27.0", - "@wordpress/keycodes": "^4.27.0", - "@wordpress/primitives": "^4.27.0", - "@wordpress/private-apis": "^1.27.0", - "@wordpress/rich-text": "^7.27.0", - "@wordpress/warning": "^3.27.0", + "@wordpress/a11y": "^4.30.0", + "@wordpress/compose": "^7.30.0", + "@wordpress/date": "^5.30.0", + "@wordpress/deprecated": "^4.30.0", + "@wordpress/dom": "^4.30.0", + "@wordpress/element": "^6.30.0", + "@wordpress/escape-html": "^3.30.0", + "@wordpress/hooks": "^4.30.0", + "@wordpress/html-entities": "^4.30.0", + "@wordpress/i18n": "^6.3.0", + "@wordpress/icons": "^10.30.0", + "@wordpress/is-shallow-equal": "^5.30.0", + "@wordpress/keycodes": "^4.30.0", + "@wordpress/primitives": "^4.30.0", + "@wordpress/private-apis": "^1.30.0", + "@wordpress/rich-text": "^7.30.0", + "@wordpress/warning": "^3.30.0", "change-case": "^4.1.2", "clsx": "^2.1.1", "colord": "^2.7.0", "date-fns": "^3.6.0", "deepmerge": "^4.3.0", "fast-deep-equal": "^3.1.3", - "framer-motion": "^11.1.9", - "gradient-parser": "1.0.2", + "framer-motion": "^11.15.0", + "gradient-parser": "1.1.1", "highlight-words-core": "^1.2.2", "is-plain-object": "^5.0.0", "memize": "^2.1.0", @@ -8091,13 +8202,13 @@ } }, "node_modules/@wordpress/core-data/node_modules/@wordpress/i18n": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-6.0.0.tgz", - "integrity": "sha512-ItvO/E3v39VX+5nZacyzwulhzRukiB2+1zqndWgOSNnERYnK/0hLHIWWthRFxYEPF13H54orXg68n17MZQ8whA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-6.3.0.tgz", + "integrity": "sha512-5Dw5JOWlF8JM0hOZnli7MbVshHi9wFPrBkB4CeeJm//arGGYYxw5IYaPJN5jnlMxFAVtCOaXgrxGJoC9mxQBng==", "dependencies": { "@babel/runtime": "7.25.7", - "@tannin/sprintf": "^1.3.1", - "@wordpress/hooks": "^4.27.0", + "@tannin/sprintf": "^1.3.2", + "@wordpress/hooks": "^4.30.0", "gettext-parser": "^1.3.1", "memize": "^2.1.0", "tannin": "^1.2.0" @@ -8111,20 +8222,20 @@ } }, "node_modules/@wordpress/core-data/node_modules/@wordpress/upload-media": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@wordpress/upload-media/-/upload-media-0.12.0.tgz", - "integrity": "sha512-oKRzFuJhFdV2iOtmDhtmjxzmHjNKJ73StEV47Y7GZVAk5wWSjuqx5gdbBIbC3ECKPTRYNSBueloltl1h69PXHA==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@wordpress/upload-media/-/upload-media-0.15.0.tgz", + "integrity": "sha512-bIQKxGczbI3DMam1+lLuQiQdP+quen1OATIoVJzW1v/pYfcumZUueOQTmkhFPB/8RpxnGVyFJonTyqMWg49vjw==", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/api-fetch": "^7.27.0", - "@wordpress/blob": "^4.27.0", - "@wordpress/compose": "^7.27.0", - "@wordpress/data": "^10.27.0", - "@wordpress/element": "^6.27.0", - "@wordpress/i18n": "^6.0.0", - "@wordpress/preferences": "^4.27.0", - "@wordpress/private-apis": "^1.27.0", - "@wordpress/url": "^4.27.0", + "@wordpress/api-fetch": "^7.30.0", + "@wordpress/blob": "^4.30.0", + "@wordpress/compose": "^7.30.0", + "@wordpress/data": "^10.30.0", + "@wordpress/element": "^6.30.0", + "@wordpress/i18n": "^6.3.0", + "@wordpress/preferences": "^4.30.0", + "@wordpress/private-apis": "^1.30.0", + "@wordpress/url": "^4.30.0", "uuid": "^9.0.1" }, "engines": { @@ -8144,19 +8255,27 @@ "node": ">=6" } }, + "node_modules/@wordpress/core-data/node_modules/gradient-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/gradient-parser/-/gradient-parser-1.1.1.tgz", + "integrity": "sha512-Hu0YfNU+38EsTmnUfLXUKFMXq9yz7htGYpF4x+dlbBhUCvIvzLt0yVLT/gJRmvLKFJdqNFrz4eKkIUjIXSr7Tw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@wordpress/data": { - "version": "10.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-10.27.0.tgz", - "integrity": "sha512-+7S4GgAEBi87qNPN/Jl3sr3xuBnjHIaA7Vzfn3UqoCQ469JkyB65kbgfJOOGDz94sMhYZ4OoeQT3lpGsPBxnVA==", + "version": "10.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-10.30.0.tgz", + "integrity": "sha512-lHvL78H6JI56sFVyLRuk+fJTIQ7XKiy14d0/kH2rWStmqKDQnniUXM4kVT3MUUOKtL0Mh59CVoiA9J4dlxJ6Ww==", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/compose": "^7.27.0", - "@wordpress/deprecated": "^4.27.0", - "@wordpress/element": "^6.27.0", - "@wordpress/is-shallow-equal": "^5.27.0", - "@wordpress/priority-queue": "^3.27.0", - "@wordpress/private-apis": "^1.27.0", - "@wordpress/redux-routine": "^5.27.0", + "@wordpress/compose": "^7.30.0", + "@wordpress/deprecated": "^4.30.0", + "@wordpress/element": "^6.30.0", + "@wordpress/is-shallow-equal": "^5.30.0", + "@wordpress/priority-queue": "^3.30.0", + "@wordpress/private-apis": "^1.30.0", + "@wordpress/redux-routine": "^5.30.0", "deepmerge": "^4.3.0", "equivalent-key-map": "^0.2.2", "is-plain-object": "^5.0.0", @@ -8185,12 +8304,12 @@ } }, "node_modules/@wordpress/date": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/date/-/date-5.27.0.tgz", - "integrity": "sha512-DZ5OJlU8OliLpDaGi0KHhlphCujbppzAfb3y34CpWydSnSRSfVgzjzc2R4p17RIa9Vj9C6Q8FsnNBAiywaz39g==", + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/date/-/date-5.30.0.tgz", + "integrity": "sha512-btCp3y33ykgZbOkbbbjK+PXXFNo2k3QJhh45e3NQpdSAQV4sFpsqhzRRu58ou/AeBdZRXMIzbhTpT2KcKUcIgw==", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/deprecated": "^4.27.0", + "@wordpress/deprecated": "^4.30.0", "moment": "^2.29.4", "moment-timezone": "^0.5.40" }, @@ -8211,9 +8330,9 @@ } }, "node_modules/@wordpress/dependency-extraction-webpack-plugin": { - "version": "6.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-6.27.0.tgz", - "integrity": "sha512-bCj39UT+jIJOm8lCQEXjz4SdADl1jVfccWs3nlZHbW5fxc+1Mh+lApnXKgmge9Ap+cuxvg9ewg+Hr3k8HC6dQg==", + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-6.30.0.tgz", + "integrity": "sha512-sms4yRJriS8vzlwbYHII/xqI64oSY5ALbfQy6HJBSCfLJCNxVOzC/2fCrhdV9ghd8nK3NMAJKhTCe09oMPCnIw==", "dev": true, "dependencies": { "json2php": "^0.0.7" @@ -8233,12 +8352,12 @@ "dev": true }, "node_modules/@wordpress/deprecated": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-4.27.0.tgz", - "integrity": "sha512-1rJTK7iy0oSE6eFUCBqCGG/wYuF62WoNDLF1G1Do+TdFGB4WxckHwTr5TuwtIG4CdoMjsPYIh2EnI3ziFOsHkA==", + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-4.30.0.tgz", + "integrity": "sha512-QfzUOCANmcrdsViEpdqh4eD4OTkG2ZGpWDuA7lSJvnVB4rcupzHpDsukmKtz6gr/AZnBDXYBoHLUwZ44G4bx0g==", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/hooks": "^4.27.0" + "@wordpress/hooks": "^4.30.0" }, "engines": { "node": ">=18.12.0", @@ -8257,12 +8376,12 @@ } }, "node_modules/@wordpress/dom": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/dom/-/dom-4.27.0.tgz", - "integrity": "sha512-uXcJslbSpxXX7EyMF4wtj+cydDyalapvu8HQ4QZleAAwJavhdNT+xpr/ai0XeApcxgIGHq1W05sYVN38lwVioQ==", + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/dom/-/dom-4.30.0.tgz", + "integrity": "sha512-t+Q4ahm0joocIle1Wb9BpwykXjItk3xsAfIj8yNiCehBRC8z0b9uJHZLzcvs5iP4iDfRooDejAHDeNY26yPP2Q==", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/deprecated": "^4.27.0" + "@wordpress/deprecated": "^4.30.0" }, "engines": { "node": ">=18.12.0", @@ -8270,9 +8389,9 @@ } }, "node_modules/@wordpress/dom-ready": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-4.27.0.tgz", - "integrity": "sha512-L1hZ1g1mMyt06tuMWt72uAJjlkjGOpR2Vxbo72ZZgO28PqQc1WLrvWN/W3LVViar9OQrR0yn/REYRd258iaNQw==", + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-4.30.0.tgz", + "integrity": "sha512-hD5mU0KkgNN4DzBDbBLfRKfZyja4CePK+nRlVTFn8Yo3dGdMAlOjJGaJS1szz7XflDv/ekngj72KoqvJGrrPmg==", "dependencies": { "@babel/runtime": "7.25.7" }, @@ -8304,9 +8423,9 @@ } }, "node_modules/@wordpress/e2e-test-utils-playwright": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.27.0.tgz", - "integrity": "sha512-UYjpPeI6vMZKWuZxegUoYu1zU+KumhUTm4EgRbo2TVxwkxeMrOX6XX7DP+NzaPj/DjkfVzfeRz9Ygby7lr6/LA==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.30.0.tgz", + "integrity": "sha512-KN/q6359nlb+zh/eamQD0gBgi1616Px7v+03+Hz8HqKUPKozUab1ogxr6Ew751LCYGuh204eG7ImYVM6Aqta0Q==", "dev": true, "dependencies": { "change-case": "^4.1.2", @@ -8325,14 +8444,14 @@ } }, "node_modules/@wordpress/element": { - "version": "6.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-6.27.0.tgz", - "integrity": "sha512-gHk4B0J0f7bEsDoUBdTm22vPQwmEWLZxyaojgRyx1ncE2IyktfmubD/q2NIcMEKh7p+Jq3ZUwzPcpchpvkH2mA==", + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-6.30.0.tgz", + "integrity": "sha512-hPbnaPcnD1pbLqCmrjNnuFuAIAmyB8JPmD2GpywOXnWaHbtEVX0GaC6iPQSIHShnPqoUBESXXwS3Z8KFz8MBHA==", "dependencies": { "@babel/runtime": "7.25.7", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.25", - "@wordpress/escape-html": "^3.27.0", + "@wordpress/escape-html": "^3.30.0", "change-case": "^4.1.2", "is-plain-object": "^5.0.0", "react": "^18.3.0", @@ -8382,9 +8501,9 @@ } }, "node_modules/@wordpress/escape-html": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-3.27.0.tgz", - "integrity": "sha512-1LBB/xOFBUySSmVpd2nFwIZ8fVnP8dLNFl0wLprHVLtW6ZcdykO2ITY9bkaHu2lZ9HLRgHL7A/3R7MsJ1azYkg==", + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-3.30.0.tgz", + "integrity": "sha512-qlyyPKiize/uEyqL1nRMce9GuReZyOum81tOTR14YAngvyRIGz3K3hGwWWf9VrITZrjwuZgqMJc2udSC1uKmKg==", "dependencies": { "@babel/runtime": "7.25.7" }, @@ -8460,9 +8579,9 @@ } }, "node_modules/@wordpress/hooks": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-4.27.0.tgz", - "integrity": "sha512-sGaNVZKMxwnhGSge0tZZsGfImLPimiulUkM7hivQ2CSCgibTpgxFRBJ1r7gbNLDF+qHQK9a26K8fGfKnAal6Cg==", + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-4.30.0.tgz", + "integrity": "sha512-uo3H4KneQSVxFU98jvbw1jN3aYQ/1fPTGqDXZh4NyZx5qras1hE3QhtQU0cO2A8o5/ZNbk/Oek06TnhwsXQPBQ==", "dependencies": { "@babel/runtime": "7.25.7" }, @@ -8483,9 +8602,9 @@ } }, "node_modules/@wordpress/html-entities": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/html-entities/-/html-entities-4.27.0.tgz", - "integrity": "sha512-4MfLS3k6+dlPSPbccnCloIFdbWjT6x0sRLNcVNWAI7I+nov7A34/cI/xjXFPcQaeewBE+24Q2TWsyFhcX2r89Q==", + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/html-entities/-/html-entities-4.30.0.tgz", + "integrity": "sha512-SlJ9HM3LYO5cDzLHAP5UytbnI3u2N770JwJkLK1mfCoEIjxa+3cl9faI2ClJp1DvIzGCE4f5LliHdit/D+pARg==", "dependencies": { "@babel/runtime": "7.25.7" }, @@ -8537,13 +8656,13 @@ } }, "node_modules/@wordpress/icons": { - "version": "10.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-10.27.0.tgz", - "integrity": "sha512-KeOz3aLtd7p+cA287gmGzpC9kIO1lxPBn/lDPkXfc8oz482XqNJKohdW/7ZMlEWx1uEcZUI+g3vfSA+gKDgjUQ==", + "version": "10.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-10.30.0.tgz", + "integrity": "sha512-PT3VGWafx/+XnlftBK8uyrm8XSsFyOJPOnl6v87Om2/I5ihv5+UeCwMLyZP2j2axdSzhcRtkEyBnN7yiOcgBvA==", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/element": "^6.27.0", - "@wordpress/primitives": "^4.27.0" + "@wordpress/element": "^6.30.0", + "@wordpress/primitives": "^4.30.0" }, "engines": { "node": ">=18.12.0", @@ -8562,9 +8681,9 @@ } }, "node_modules/@wordpress/is-shallow-equal": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-5.27.0.tgz", - "integrity": "sha512-sYlAuNgEwQHioKSx3jyV6ZJlBR19sEvIdkBVoGF82OAxbXFzRvoD6V4zy+kZzY6V99FE12L93I0t5jh4qOn2lg==", + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-5.30.0.tgz", + "integrity": "sha512-Q9xoIrxxsNuiaftBciAsHmUU3IVa7V1Es0pzKmwDa3ZFBFeBn3dgrY6iWzeQ4Fe4pBaiG3NagH0qE5Iz3PuG2g==", "dependencies": { "@babel/runtime": "7.25.7" }, @@ -8585,9 +8704,9 @@ } }, "node_modules/@wordpress/jest-console": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-8.27.0.tgz", - "integrity": "sha512-MTKc5oWkmzVqSP0SxH5XCxZEpFUgd+uBn2byEjtbSPqTi3n6uou+LybtRWHSKeCAHVBcq3Bsng1V14oJRyl7Pg==", + "version": "8.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-8.30.0.tgz", + "integrity": "sha512-Vw7iBqsueb9jCy6RnnjixjLosm+fMi+3iMQDiBB5Pw/yUpr0PUBCR11oQCE/nO3wDl7OOA5Nq3v2qo/wxLBLMg==", "dev": true, "dependencies": { "@babel/runtime": "7.25.7", @@ -8614,12 +8733,12 @@ } }, "node_modules/@wordpress/jest-preset-default": { - "version": "12.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/jest-preset-default/-/jest-preset-default-12.27.0.tgz", - "integrity": "sha512-J2sYHUB5fdmJ9IVnb5AJkFUMusVAQCZdFvphYSZZ+wq9qvyEp8SrTcIT1uj5zE/S/HdpkTQKRaJ56x0RZI9lFQ==", + "version": "12.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/jest-preset-default/-/jest-preset-default-12.30.0.tgz", + "integrity": "sha512-nxldSo9luQBfjIFF08hcVT1pEVABe213qBxYWCXMCx3+SPsENRF6pU/yoRb0i7nz6yrd/j5oD92EXXnbQoN8eA==", "dev": true, "dependencies": { - "@wordpress/jest-console": "^8.27.0", + "@wordpress/jest-console": "^8.30.0", "babel-jest": "29.7.0" }, "engines": { @@ -8632,14 +8751,14 @@ } }, "node_modules/@wordpress/keyboard-shortcuts": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/keyboard-shortcuts/-/keyboard-shortcuts-5.27.0.tgz", - "integrity": "sha512-cXllgxPZP8JDcg2nC66FWk3cHBnmCo8iqZW6j078x/TCnixYE+p14Y60/Y9bdtJKhJ77TrGswuhZGvEHho1Nbw==", + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/keyboard-shortcuts/-/keyboard-shortcuts-5.30.0.tgz", + "integrity": "sha512-X1LGeoqyWFH1lGXUjJ+QUXEBnf5+ty3iO9a5MQecCpSF94ZajPAcN/17LnaftftqF81PantfG2TkXNQ7HydnTg==", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/data": "^10.27.0", - "@wordpress/element": "^6.27.0", - "@wordpress/keycodes": "^4.27.0" + "@wordpress/data": "^10.30.0", + "@wordpress/element": "^6.30.0", + "@wordpress/keycodes": "^4.30.0" }, "engines": { "node": ">=18.12.0", @@ -8661,12 +8780,12 @@ } }, "node_modules/@wordpress/keycodes": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-4.27.0.tgz", - "integrity": "sha512-fWyEcLI2rAZn6FwVBITGFxo8aS7EQrt8icOdxS5Es3Ii8DneQUl2gtXs3tq9viX4cWCno7cEt+dpuuv2gPxwoQ==", + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-4.30.0.tgz", + "integrity": "sha512-IoC7FPADDc5UfjasKRT8YtaLr9WUBDqb8GJpYtiuYjHpDBDgJJPnJwKUMBweCjMl93Zzf7JAHpF7LAkICHDE1A==", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/i18n": "^6.0.0" + "@wordpress/i18n": "^6.3.0" }, "engines": { "node": ">=18.12.0", @@ -8685,13 +8804,13 @@ } }, "node_modules/@wordpress/keycodes/node_modules/@wordpress/i18n": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-6.0.0.tgz", - "integrity": "sha512-ItvO/E3v39VX+5nZacyzwulhzRukiB2+1zqndWgOSNnERYnK/0hLHIWWthRFxYEPF13H54orXg68n17MZQ8whA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-6.3.0.tgz", + "integrity": "sha512-5Dw5JOWlF8JM0hOZnli7MbVshHi9wFPrBkB4CeeJm//arGGYYxw5IYaPJN5jnlMxFAVtCOaXgrxGJoC9mxQBng==", "dependencies": { "@babel/runtime": "7.25.7", - "@tannin/sprintf": "^1.3.1", - "@wordpress/hooks": "^4.27.0", + "@tannin/sprintf": "^1.3.2", + "@wordpress/hooks": "^4.30.0", "gettext-parser": "^1.3.1", "memize": "^2.1.0", "tannin": "^1.2.0" @@ -8705,16 +8824,16 @@ } }, "node_modules/@wordpress/media-utils": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/media-utils/-/media-utils-5.27.0.tgz", - "integrity": "sha512-E8Xvg/Kbgacopq+LRkcxVCxOPGqyg2sV+KLa567VA5rAaUnnD2g9gsTEiZAbmz97wypqii+5g4MypXC6rxn0Ew==", + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/media-utils/-/media-utils-5.30.0.tgz", + "integrity": "sha512-2wehODR/rrtr9gnBxpcAwrV0aulYlckOV0lGwnASaZZn0vcxMFiy6GADfqQp/UI0hsOk8c/EOwQmnum5GTqVmA==", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/api-fetch": "^7.27.0", - "@wordpress/blob": "^4.27.0", - "@wordpress/element": "^6.27.0", - "@wordpress/i18n": "^6.0.0", - "@wordpress/private-apis": "^1.27.0" + "@wordpress/api-fetch": "^7.30.0", + "@wordpress/blob": "^4.30.0", + "@wordpress/element": "^6.30.0", + "@wordpress/i18n": "^6.3.0", + "@wordpress/private-apis": "^1.30.0" }, "engines": { "node": ">=18.12.0", @@ -8733,13 +8852,13 @@ } }, "node_modules/@wordpress/media-utils/node_modules/@wordpress/i18n": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-6.0.0.tgz", - "integrity": "sha512-ItvO/E3v39VX+5nZacyzwulhzRukiB2+1zqndWgOSNnERYnK/0hLHIWWthRFxYEPF13H54orXg68n17MZQ8whA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-6.3.0.tgz", + "integrity": "sha512-5Dw5JOWlF8JM0hOZnli7MbVshHi9wFPrBkB4CeeJm//arGGYYxw5IYaPJN5jnlMxFAVtCOaXgrxGJoC9mxQBng==", "dependencies": { "@babel/runtime": "7.25.7", - "@tannin/sprintf": "^1.3.1", - "@wordpress/hooks": "^4.27.0", + "@tannin/sprintf": "^1.3.2", + "@wordpress/hooks": "^4.30.0", "gettext-parser": "^1.3.1", "memize": "^2.1.0", "tannin": "^1.2.0" @@ -8753,13 +8872,13 @@ } }, "node_modules/@wordpress/notices": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/notices/-/notices-5.27.0.tgz", - "integrity": "sha512-WF//lHwg5gANVZctc8xRIOoHVHzn+En3Mj4y2cij/qlw3Xm24oaOSvBhEFKkn7oP092YAzG20zMNMaSngcbtGA==", + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/notices/-/notices-5.30.0.tgz", + "integrity": "sha512-iEIBi7r+3dFPPOXE76WKP6f1Y9gVRr+jqca6LK3erGABvETVOYhrtFVoq0aAyDcpONc1c80TvFdO5OudCepafQ==", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/a11y": "^4.27.0", - "@wordpress/data": "^10.27.0" + "@wordpress/a11y": "^4.30.0", + "@wordpress/data": "^10.30.0" }, "engines": { "node": ">=18.12.0", @@ -8781,9 +8900,9 @@ } }, "node_modules/@wordpress/npm-package-json-lint-config": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-5.27.0.tgz", - "integrity": "sha512-BEumv8etwMVgz1xvO1TOuSbOVB4dBwhtM6dSHchd4m5RPfmt/FpX+NWToSbF06+l+Ha6PVry72TiQpdFok9c8w==", + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-5.30.0.tgz", + "integrity": "sha512-pJ5XMmj2Osk05/TFrCpf6l6VuxWDU837ISKW1bXAmBfpnLTlUuVUl6pTWbIE4gNZqb2faSBQSN3OPeQqt4RNJg==", "dev": true, "engines": { "node": ">=18.12.0", @@ -8794,12 +8913,12 @@ } }, "node_modules/@wordpress/postcss-plugins-preset": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/postcss-plugins-preset/-/postcss-plugins-preset-5.27.0.tgz", - "integrity": "sha512-iIhl8fc4zeN1rehf/bvC2+oIFSTiFfnZf2aTDCzErQTgvGZ33cUlfx7CrpJPcVYCQcbvp4IdaYgaVaw/lnpmuQ==", + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/postcss-plugins-preset/-/postcss-plugins-preset-5.30.0.tgz", + "integrity": "sha512-3mB+tqN9uIQ6h1SXtQUFowNeCv/Cy6vWsUBhPkgU3hj7LQrGbCAmMWefDAQeYHyG0lQfSrAD6jctZ2wZmNXwsQ==", "dev": true, "dependencies": { - "@wordpress/base-styles": "^6.3.0", + "@wordpress/base-styles": "^6.6.0", "autoprefixer": "^10.4.20" }, "engines": { @@ -8811,20 +8930,20 @@ } }, "node_modules/@wordpress/preferences": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/preferences/-/preferences-4.27.0.tgz", - "integrity": "sha512-+b8E0iTQD0KObihwYYrKdPsQa6ltGmMn2hLDXZqP3RPKfIDoleDvGK/zbwoKsKe+y4HN+qL7gQqKjsXuxdoeDA==", + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/preferences/-/preferences-4.30.0.tgz", + "integrity": "sha512-QzBm0pjBbDH6GufTAPYsi5c4CfJnefS7u7AsRFRVCy0hQScXu+q/hTPrGWg5nsV1xuwLR0KGwlF2p/bX1JUnYg==", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/a11y": "^4.27.0", - "@wordpress/components": "^30.0.0", - "@wordpress/compose": "^7.27.0", - "@wordpress/data": "^10.27.0", - "@wordpress/deprecated": "^4.27.0", - "@wordpress/element": "^6.27.0", - "@wordpress/i18n": "^6.0.0", - "@wordpress/icons": "^10.27.0", - "@wordpress/private-apis": "^1.27.0", + "@wordpress/a11y": "^4.30.0", + "@wordpress/components": "^30.3.0", + "@wordpress/compose": "^7.30.0", + "@wordpress/data": "^10.30.0", + "@wordpress/deprecated": "^4.30.0", + "@wordpress/element": "^6.30.0", + "@wordpress/i18n": "^6.3.0", + "@wordpress/icons": "^10.30.0", + "@wordpress/private-apis": "^1.30.0", "clsx": "^2.1.1" }, "engines": { @@ -8859,10 +8978,15 @@ "react-dom": ">=16.8.0" } }, + "node_modules/@wordpress/preferences/node_modules/@types/gradient-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@types/gradient-parser/-/gradient-parser-1.1.0.tgz", + "integrity": "sha512-SaEcbgQscHtGJ1QL+ajgDTmmqU2f6T+00jZRcFlVHUW2Asivc84LNUev/UQFyu117AsdyrtI+qpwLvgjJXJxmw==" + }, "node_modules/@wordpress/preferences/node_modules/@wordpress/components": { - "version": "30.0.0", - "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-30.0.0.tgz", - "integrity": "sha512-+9A36VLY6jz6TYmfDHzOWCYVz/wJQFBWZwfZmET8ce9yUKjeIQ+Zhhihj/EbTmmqSvZIgEgqinXTnnqCJr1OTA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-30.3.0.tgz", + "integrity": "sha512-tXe6ucxRThjMPYCk1ZZHAnL0MQqFpCq/PwME/ypBf5dOE3GHKMKXVTvgsJv5bHH6dbJoElkDWRm3ZwqwwQ5CVg==", "dependencies": { "@ariakit/react": "^0.4.15", "@babel/runtime": "7.25.7", @@ -8873,34 +8997,34 @@ "@emotion/styled": "^11.6.0", "@emotion/utils": "^1.0.0", "@floating-ui/react-dom": "2.0.8", - "@types/gradient-parser": "0.1.3", + "@types/gradient-parser": "1.1.0", "@types/highlight-words-core": "1.2.1", "@use-gesture/react": "^10.3.1", - "@wordpress/a11y": "^4.27.0", - "@wordpress/compose": "^7.27.0", - "@wordpress/date": "^5.27.0", - "@wordpress/deprecated": "^4.27.0", - "@wordpress/dom": "^4.27.0", - "@wordpress/element": "^6.27.0", - "@wordpress/escape-html": "^3.27.0", - "@wordpress/hooks": "^4.27.0", - "@wordpress/html-entities": "^4.27.0", - "@wordpress/i18n": "^6.0.0", - "@wordpress/icons": "^10.27.0", - "@wordpress/is-shallow-equal": "^5.27.0", - "@wordpress/keycodes": "^4.27.0", - "@wordpress/primitives": "^4.27.0", - "@wordpress/private-apis": "^1.27.0", - "@wordpress/rich-text": "^7.27.0", - "@wordpress/warning": "^3.27.0", + "@wordpress/a11y": "^4.30.0", + "@wordpress/compose": "^7.30.0", + "@wordpress/date": "^5.30.0", + "@wordpress/deprecated": "^4.30.0", + "@wordpress/dom": "^4.30.0", + "@wordpress/element": "^6.30.0", + "@wordpress/escape-html": "^3.30.0", + "@wordpress/hooks": "^4.30.0", + "@wordpress/html-entities": "^4.30.0", + "@wordpress/i18n": "^6.3.0", + "@wordpress/icons": "^10.30.0", + "@wordpress/is-shallow-equal": "^5.30.0", + "@wordpress/keycodes": "^4.30.0", + "@wordpress/primitives": "^4.30.0", + "@wordpress/private-apis": "^1.30.0", + "@wordpress/rich-text": "^7.30.0", + "@wordpress/warning": "^3.30.0", "change-case": "^4.1.2", "clsx": "^2.1.1", "colord": "^2.7.0", "date-fns": "^3.6.0", "deepmerge": "^4.3.0", "fast-deep-equal": "^3.1.3", - "framer-motion": "^11.1.9", - "gradient-parser": "1.0.2", + "framer-motion": "^11.15.0", + "gradient-parser": "1.1.1", "highlight-words-core": "^1.2.2", "is-plain-object": "^5.0.0", "memize": "^2.1.0", @@ -8921,13 +9045,13 @@ } }, "node_modules/@wordpress/preferences/node_modules/@wordpress/i18n": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-6.0.0.tgz", - "integrity": "sha512-ItvO/E3v39VX+5nZacyzwulhzRukiB2+1zqndWgOSNnERYnK/0hLHIWWthRFxYEPF13H54orXg68n17MZQ8whA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-6.3.0.tgz", + "integrity": "sha512-5Dw5JOWlF8JM0hOZnli7MbVshHi9wFPrBkB4CeeJm//arGGYYxw5IYaPJN5jnlMxFAVtCOaXgrxGJoC9mxQBng==", "dependencies": { "@babel/runtime": "7.25.7", - "@tannin/sprintf": "^1.3.1", - "@wordpress/hooks": "^4.27.0", + "@tannin/sprintf": "^1.3.2", + "@wordpress/hooks": "^4.30.0", "gettext-parser": "^1.3.1", "memize": "^2.1.0", "tannin": "^1.2.0" @@ -8948,10 +9072,18 @@ "node": ">=6" } }, + "node_modules/@wordpress/preferences/node_modules/gradient-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/gradient-parser/-/gradient-parser-1.1.1.tgz", + "integrity": "sha512-Hu0YfNU+38EsTmnUfLXUKFMXq9yz7htGYpF4x+dlbBhUCvIvzLt0yVLT/gJRmvLKFJdqNFrz4eKkIUjIXSr7Tw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@wordpress/prettier-config": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-4.27.0.tgz", - "integrity": "sha512-G9sNZ13tgoCwYxZ49jvWMROcRw4JuQjlcct275CAz5wc+blTyob8YPlWAyAJY1h1Q0Nr8cuclS+kdzwD8HCUkg==", + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-4.30.0.tgz", + "integrity": "sha512-b0tOy/H0A1ilsjAGUKqMJ3idMQbe1XS7K2ViqG62ZMJRUYBEZ1x3t+ne3Z2fVbyNVhrMqq3eZK9BSEuxr67cSg==", "dev": true, "engines": { "node": ">=18.12.0", @@ -8962,12 +9094,12 @@ } }, "node_modules/@wordpress/primitives": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-4.27.0.tgz", - "integrity": "sha512-ZIhpB4ZmZwMSsrELx4mzhRvxAoqgk8sSE3PaRt/ue4GXFoRRQgI3RVCwEdiNPcsQXId9lOQIhAJNDt5Wa0Fbgg==", + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-4.30.0.tgz", + "integrity": "sha512-xKstIDGv0dG35X9kX65ZPCtAe4s06gUqJVbOf3oFD9b5PXoL2vjC3/kc5GG2jO56pLahKPLoqitH9maCJcGQEQ==", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/element": "^6.27.0", + "@wordpress/element": "^6.30.0", "clsx": "^2.1.1" }, "engines": { @@ -8998,9 +9130,9 @@ } }, "node_modules/@wordpress/priority-queue": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/priority-queue/-/priority-queue-3.27.0.tgz", - "integrity": "sha512-RpIaX59sji45x9oUYrkbTHbagJuHC05oZOjJDzLj2Qv12bGeq0QWI2+e59yl3wONLpVla7f3TfNsFapkgOhOAw==", + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/priority-queue/-/priority-queue-3.30.0.tgz", + "integrity": "sha512-XScxqCjlLnijcZdoon9tUpBqw7BDBqNZQT1pgLcy0Pe661hDDvhsQ7fSapZ/KjrNnecE1uuxKQXQBXDNoJA0Eg==", "dependencies": { "@babel/runtime": "7.25.7", "requestidlecallback": "^0.3.0" @@ -9022,9 +9154,9 @@ } }, "node_modules/@wordpress/private-apis": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/private-apis/-/private-apis-1.27.0.tgz", - "integrity": "sha512-u5EqKxkE4BHKOSlLPW+o632t2YnzJkZTjwnNFolswWI9+g5SiXRpM8Q7+1CNquqcgDcSNKId7S9UCE1fw1FhAw==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/private-apis/-/private-apis-1.30.0.tgz", + "integrity": "sha512-0EaWB+JxJ4t3Bylzk3xXu7Khqi0TOXYX9qDOm9W0Wy+J6xGzlkz8rSF73MvT+6JQTNNwietWHqkkHcn6dFGIXQ==", "dependencies": { "@babel/runtime": "7.25.7" }, @@ -9045,9 +9177,9 @@ } }, "node_modules/@wordpress/redux-routine": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/redux-routine/-/redux-routine-5.27.0.tgz", - "integrity": "sha512-6eulRxrF40yKtGjzHKsY2pzD5/sbWaNjXRrFQZY+wMNsYV6AWYacgn3r+2r51Uhlut6zZl6x8YJtCcqGOHnKEQ==", + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/redux-routine/-/redux-routine-5.30.0.tgz", + "integrity": "sha512-1cabT7u4pryjnsAe5uG6hV1Rwhh1HC+VIMz41wuMQCZ3Te1xYIjj4uWAf+u1H2Vrcz6an0pijh4OLXq/S/AB5A==", "dependencies": { "@babel/runtime": "7.25.7", "is-plain-object": "^5.0.0", @@ -9074,19 +9206,20 @@ } }, "node_modules/@wordpress/rich-text": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/rich-text/-/rich-text-7.27.0.tgz", - "integrity": "sha512-khZm3EqCcI0abZZhNWn9EhwFbLEyCy8X4+7IcJNzyKSZiDsP7HS1ch7Zo3lVPJAMWFeeqwDQJ3zSZwCL24Eg8w==", + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/rich-text/-/rich-text-7.30.0.tgz", + "integrity": "sha512-2aQRtxWslGd7FUqKbBHFHuVefwi3jnFp5WWJD/gxSVGEWJ3i48XuLtXLGK6V9XiutuoUbG+8C1Bx2lq3WaPMXg==", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/a11y": "^4.27.0", - "@wordpress/compose": "^7.27.0", - "@wordpress/data": "^10.27.0", - "@wordpress/deprecated": "^4.27.0", - "@wordpress/element": "^6.27.0", - "@wordpress/escape-html": "^3.27.0", - "@wordpress/i18n": "^6.0.0", - "@wordpress/keycodes": "^4.27.0", + "@wordpress/a11y": "^4.30.0", + "@wordpress/compose": "^7.30.0", + "@wordpress/data": "^10.30.0", + "@wordpress/deprecated": "^4.30.0", + "@wordpress/element": "^6.30.0", + "@wordpress/escape-html": "^3.30.0", + "@wordpress/i18n": "^6.3.0", + "@wordpress/keycodes": "^4.30.0", + "colord": "2.9.3", "memize": "^2.1.0" }, "engines": { @@ -9109,13 +9242,13 @@ } }, "node_modules/@wordpress/rich-text/node_modules/@wordpress/i18n": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-6.0.0.tgz", - "integrity": "sha512-ItvO/E3v39VX+5nZacyzwulhzRukiB2+1zqndWgOSNnERYnK/0hLHIWWthRFxYEPF13H54orXg68n17MZQ8whA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-6.3.0.tgz", + "integrity": "sha512-5Dw5JOWlF8JM0hOZnli7MbVshHi9wFPrBkB4CeeJm//arGGYYxw5IYaPJN5jnlMxFAVtCOaXgrxGJoC9mxQBng==", "dependencies": { "@babel/runtime": "7.25.7", - "@tannin/sprintf": "^1.3.1", - "@wordpress/hooks": "^4.27.0", + "@tannin/sprintf": "^1.3.2", + "@wordpress/hooks": "^4.30.0", "gettext-parser": "^1.3.1", "memize": "^2.1.0", "tannin": "^1.2.0" @@ -9129,31 +9262,30 @@ } }, "node_modules/@wordpress/scripts": { - "version": "30.20.0", - "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-30.20.0.tgz", - "integrity": "sha512-LV3WG1UR7QeE4zE6nkWi6r3bmPn+MyjWOA0Ycpy23kOoabeurSob/hurfPUjzg4/i4wipJZ9MQyV4uWSEGHt4w==", + "version": "30.23.0", + "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-30.23.0.tgz", + "integrity": "sha512-IVMv4GvSxZQuj/JybHMHA0BbScv2//tELUQSHMe7IHRxvaqzd8WDJgMfnwaqQWOmtw8d4739w7kAEo26kh6zWA==", "dev": true, "dependencies": { "@babel/core": "7.25.7", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", "@svgr/webpack": "^8.0.1", - "@wordpress/babel-preset-default": "^8.27.0", - "@wordpress/browserslist-config": "^6.27.0", - "@wordpress/dependency-extraction-webpack-plugin": "^6.27.0", - "@wordpress/e2e-test-utils-playwright": "^1.27.0", - "@wordpress/eslint-plugin": "^22.13.0", - "@wordpress/jest-preset-default": "^12.27.0", - "@wordpress/npm-package-json-lint-config": "^5.27.0", - "@wordpress/postcss-plugins-preset": "^5.27.0", - "@wordpress/prettier-config": "^4.27.0", - "@wordpress/stylelint-config": "^23.19.0", + "@wordpress/babel-preset-default": "^8.30.0", + "@wordpress/browserslist-config": "^6.30.0", + "@wordpress/dependency-extraction-webpack-plugin": "^6.30.0", + "@wordpress/e2e-test-utils-playwright": "^1.30.0", + "@wordpress/eslint-plugin": "^22.16.0", + "@wordpress/jest-preset-default": "^12.30.0", + "@wordpress/npm-package-json-lint-config": "^5.30.0", + "@wordpress/postcss-plugins-preset": "^5.30.0", + "@wordpress/prettier-config": "^4.30.0", + "@wordpress/stylelint-config": "^23.22.0", "adm-zip": "^0.5.9", "babel-jest": "29.7.0", "babel-loader": "9.2.1", "browserslist": "^4.21.10", "chalk": "^4.0.0", "check-node-version": "^4.1.0", - "clean-webpack-plugin": "^3.0.0", "copy-webpack-plugin": "^10.2.0", "cross-spawn": "^7.0.6", "css-loader": "^6.2.0", @@ -9203,9 +9335,15 @@ "npm": ">=8.19.2" }, "peerDependencies": { - "@playwright/test": "^1.51.1", + "@playwright/test": "^1.55.0", + "@wordpress/env": "^10.0.0", "react": "^18.0.0", "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@wordpress/env": { + "optional": true + } } }, "node_modules/@wordpress/scripts/node_modules/@babel/core": { @@ -9239,16 +9377,16 @@ } }, "node_modules/@wordpress/scripts/node_modules/@wordpress/eslint-plugin": { - "version": "22.13.0", - "resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-22.13.0.tgz", - "integrity": "sha512-cD7NpkCwH3bPhNcS16P0SEvlXrlx5XN5yCT7CZo3DReRTFlOMKswIg/csqFgvypIW8L2Qla5Rzva1qVsWnQEvg==", + "version": "22.16.0", + "resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-22.16.0.tgz", + "integrity": "sha512-1z3rXq2uanCY0m2D1BgimeNGxZOZy87VPwzKRjaf2aPLw/ezoQckiaVGAKYKhbHLt6HFP2EkdKfuD3pmbTJ57g==", "dev": true, "dependencies": { "@babel/eslint-parser": "7.25.7", "@typescript-eslint/eslint-plugin": "^6.4.1", "@typescript-eslint/parser": "^6.4.1", - "@wordpress/babel-preset-default": "^8.27.0", - "@wordpress/prettier-config": "^4.27.0", + "@wordpress/babel-preset-default": "^8.30.0", + "@wordpress/prettier-config": "^4.30.0", "cosmiconfig": "^7.0.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-import": "^2.25.2", @@ -9310,9 +9448,9 @@ } }, "node_modules/@wordpress/shortcode": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/shortcode/-/shortcode-4.27.0.tgz", - "integrity": "sha512-7UyI2Exqt789MrWO4LQWtvfdBisAVDUfHgTj8Rqq3QJ6dE5zlxM1UJwaxIQArFv39gS1hOibfNUxigKFQ+IW9A==", + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/shortcode/-/shortcode-4.30.0.tgz", + "integrity": "sha512-x7bw8NX+4tw3XauuvkM4s8SvgYVF81FiaS31YmFQ3J+g8oKokx6x+7WnrO4HHELTUNbUw6RSI/cfFSw+Xua/pg==", "dependencies": { "@babel/runtime": "7.25.7", "memize": "^2.0.1" @@ -9334,9 +9472,9 @@ } }, "node_modules/@wordpress/style-engine": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/style-engine/-/style-engine-2.27.0.tgz", - "integrity": "sha512-boTPFzKuVxEiXpaKu7qFIa5MyPVp5f5BHCiEqcsppcjGOtwdhLv1sSHGJdtUzsbe43yZ0pyY7q8a5dCmk5rjIw==", + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/style-engine/-/style-engine-2.30.0.tgz", + "integrity": "sha512-YpMuMx76x2IhYjOZbljVgxJEgX/FduBJleMsMMvciPGCBsvcjfPxqliwGaauofnk7/kN4E7LFyT1o9cErqiw3g==", "dependencies": { "@babel/runtime": "7.25.7", "change-case": "^4.1.2" @@ -9358,9 +9496,9 @@ } }, "node_modules/@wordpress/stylelint-config": { - "version": "23.19.0", - "resolved": "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-23.19.0.tgz", - "integrity": "sha512-qriyn7AVc+h18yCh7oK/XY776THnENL7kuZi9IEM08k2dVmBt4hOeJlEKqumkBCBqtA/+JFPT38GlJpaV1+cHg==", + "version": "23.22.0", + "resolved": "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-23.22.0.tgz", + "integrity": "sha512-d1aEVn6jbMFFJh3SqpGKoNsnm0DcYD6TwgzLLlIL11kslyFEn6mfiKJVeVNIgWQe7sBDEtUkE7h4qEOSDbxO8A==", "dev": true, "dependencies": { "@stylistic/stylelint-plugin": "^3.0.1", @@ -9377,13 +9515,13 @@ } }, "node_modules/@wordpress/sync": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/sync/-/sync-1.27.0.tgz", - "integrity": "sha512-HrlVEmV9aR1Y6JtJ2iWELeWQ8dJcDlc/YSpEl4VPPSeh1z+++VL9ISZqBE73qxbXbIkLGpfnCevL28jaPwppMQ==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/sync/-/sync-1.30.0.tgz", + "integrity": "sha512-gbCnWHsrgGA4G2rdCTldrkauFBeB1kZCj6Rvzpf97FVX2xiagt3/LP5u8tW96qBB5qsJhx/uJ1Wv0uhuiBX/tg==", "dependencies": { "@babel/runtime": "7.25.7", "@types/simple-peer": "^9.11.5", - "@wordpress/url": "^4.27.0", + "@wordpress/url": "^4.30.0", "import-locals": "^2.0.0", "lib0": "^0.2.42", "simple-peer": "^9.11.0", @@ -9409,9 +9547,9 @@ } }, "node_modules/@wordpress/token-list": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/token-list/-/token-list-3.27.0.tgz", - "integrity": "sha512-yUjWvRTtI/7wwTzEk1UZV98c2XN2LZ4/IepJdBHzhBznrE294gX/A6y7mrL1la5TKQeUPN4TSvh11dpQMMpZAQ==", + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/token-list/-/token-list-3.30.0.tgz", + "integrity": "sha512-zK4MJd2y7bvzuyMhGPeiErbwZDvXjQwodkTwUM/KiJVgfXjR98O2YBc70ZGOrhpzPeIb81PZljwiNTIx7NI6dA==", "dependencies": { "@babel/runtime": "7.25.7" }, @@ -9432,12 +9570,12 @@ } }, "node_modules/@wordpress/undo-manager": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/undo-manager/-/undo-manager-1.27.0.tgz", - "integrity": "sha512-ndGz3mW0fu7YM7vTuNKqxXBPrpWvrefScD8dmdqeIVs+yDZo8PNpEvrTVfb7FM/gujD6Dh95OSuW5TNpNN6EIw==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/undo-manager/-/undo-manager-1.30.0.tgz", + "integrity": "sha512-pbvkzMLJrozAoaB+KOVSiRFvKvfxDrSt0jWmWCDnobbDRsmrSJRQaANw4RcoNShHuMOzd1wJ1KruK4Dtypf5MQ==", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/is-shallow-equal": "^5.27.0" + "@wordpress/is-shallow-equal": "^5.30.0" }, "engines": { "node": ">=18.12.0", @@ -9493,9 +9631,9 @@ } }, "node_modules/@wordpress/url": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-4.27.0.tgz", - "integrity": "sha512-7+WJ2g5xvfRjsnLRixXDVZzEg7jQUYRNPOBbjO95D9kJ3Sm63Lu4xc3FOikeojOUJv5/Z9c2zKOsaotNkWHexg==", + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-4.30.0.tgz", + "integrity": "sha512-oFiQQBy/2G9fct1Df52ypu3d2nYiq2k2GkOdfMHRFYI1N3k0JP7rinwyePU+37mHPCzYuJK6TuMDxoKh8oMpKg==", "dependencies": { "@babel/runtime": "7.25.7", "remove-accents": "^0.5.0" @@ -9517,18 +9655,18 @@ } }, "node_modules/@wordpress/warning": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.27.0.tgz", - "integrity": "sha512-AGcCLU2urtV7C4i4Oji8tL9froFPDie+99A2N3tqjZU1v7Csw4UgDrptYRyENjhXLBe9ZzVlf1mZmgH/MQPAHA==", + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.30.0.tgz", + "integrity": "sha512-ZtkpSe3DhtUzIrwf+5slGkJJCxy1xn56fZ6atUaJWRbjsKnIZlTcPgahPUJZ2bugsGS5BlmDEuVI8C4NUdbwvQ==", "engines": { "node": ">=18.12.0", "npm": ">=8.19.2" } }, "node_modules/@wordpress/wordcount": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/wordcount/-/wordcount-4.27.0.tgz", - "integrity": "sha512-XIDqA9YnYC5yH6Lyk25m+q8wYH2sp+2p5ROrOp2gQ0Due+wUycAIgvzJsbnQoMn0PZrqgaETxFymtkQhGWj6Ug==", + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/@wordpress/wordcount/-/wordcount-4.30.0.tgz", + "integrity": "sha512-WGALjfdw0/Cl8BiJiTCM9hlGRmSErubqM9IWSKkcHNwxFV5FoOdZOzWB6xxMhxR4u9TL0QXCDkR9p6DoJEzBYw==", "dependencies": { "@babel/runtime": "7.25.7" }, @@ -9943,15 +10081,6 @@ "node": ">=8" } }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array.prototype.findlast": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", @@ -10194,9 +10323,9 @@ } }, "node_modules/axios": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", - "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", "dev": true, "dependencies": { "follow-redirects": "^1.15.6", @@ -10701,13 +10830,16 @@ } }, "node_modules/cacheable": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.2.tgz", - "integrity": "sha512-hMkETCRV4hwBAvjQY1/xGw15tlPj+7cM4d5HOlYJJFftLQVRCboVX+mT6AJ6eL0fsqUhSUwDiF+pgfTR2r2Hxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.0.1.tgz", + "integrity": "sha512-MSKxcybpxB5kcWKpj+1tPBm2os4qKKGxDovsZmLhZmWIDYp8EgtC45C5zk1fLe1IC9PpI4ZE4eyryQH0N10PKA==", "dev": true, "dependencies": { - "hookified": "^1.10.0", - "keyv": "^5.3.4" + "@cacheable/memoize": "^2.0.1", + "@cacheable/memory": "^2.0.1", + "@cacheable/utils": "^2.0.1", + "hookified": "^1.12.0", + "keyv": "^5.5.1" } }, "node_modules/cacheable-lookup": { @@ -10738,12 +10870,12 @@ } }, "node_modules/cacheable/node_modules/keyv": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.4.0.tgz", - "integrity": "sha512-TMckyVjEoacG5IteUpUrOBsFORtheqziVyyY2dLUwg1jwTb8u48LX4TgmtogkNl9Y9unaEJ1luj10fGyjMGFOQ==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.1.tgz", + "integrity": "sha512-eF3cHZ40bVsjdlRi/RvKAuB0+B61Q1xWvohnrJrnaQslM3h1n79IV+mc9EGag4nrA9ZOlNyr3TUzW5c8uy8vNA==", "dev": true, "dependencies": { - "@keyv/serialize": "^1.1.0" + "@keyv/serialize": "^1.1.1" } }, "node_modules/call-bind": { @@ -10944,9 +11076,9 @@ } }, "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", + "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", "dev": true }, "node_modules/check-node-version": { @@ -11037,6 +11169,16 @@ "devtools-protocol": "*" } }, + "node_modules/chromium-bidi/node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -11063,22 +11205,6 @@ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" }, - "node_modules/clean-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==", - "dev": true, - "dependencies": { - "@types/webpack": "^4.4.31", - "del": "^4.1.1" - }, - "engines": { - "node": ">=8.9.0" - }, - "peerDependencies": { - "webpack": "*" - } - }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -11397,9 +11523,9 @@ } }, "node_modules/configstore": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-7.0.0.tgz", - "integrity": "sha512-yk7/5PN5im4qwz0WFZW3PXnzHgPu9mX29Y8uZ3aefe2lBPC1FYttWZRcaW9fKkT0pBCJyuQ2HfbmPVaODi9jcQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-7.1.0.tgz", + "integrity": "sha512-N4oog6YJWbR9kGyXvS7jEykLDXIE2C0ILYqNBZBp9iwiJpoCBWYsuAdW6PPFn6w06jjnC+3JstVvWHO4cZqvRg==", "dev": true, "dependencies": { "atomically": "^2.0.3", @@ -11411,7 +11537,7 @@ "node": ">=18" }, "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/connect-history-api-fallback": { @@ -12731,9 +12857,9 @@ "dev": true }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { "ms": "^2.1.3" }, @@ -12939,74 +13065,6 @@ "node": ">= 14" } }, - "node_modules/del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "dependencies": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/del/node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "dev": true, - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", - "dev": true, - "dependencies": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/globby/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/delaunator": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", @@ -13082,9 +13140,9 @@ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" }, "node_modules/devtools-protocol": { - "version": "0.0.1478340", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1478340.tgz", - "integrity": "sha512-EqhRVWo+j3O1a5LEvZi5fFlBRhvciqYoCHpsEfPcIpA/Abh0W1LF+V3AIvQD9Z4Apj0+p3U07vb7uXfn2hm3HQ==", + "version": "0.0.1507524", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1507524.tgz", + "integrity": "sha512-OjaNE7qpk6GRTXtqQjAE5bGx6+c4F1zZH0YXtpZQLM92HNXx4zMAaqlKhP4T52DosG6hDW8gPMNhGOF8xbwk/w==", "dev": true }, "node_modules/diff": { @@ -14755,20 +14813,6 @@ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "dev": true }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/extract-zip": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", @@ -15127,6 +15171,31 @@ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true }, + "node_modules/focus-trap": { + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.5.tgz", + "integrity": "sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==", + "license": "MIT", + "dependencies": { + "tabbable": "^6.2.0" + } + }, + "node_modules/focus-trap-react": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/focus-trap-react/-/focus-trap-react-11.0.4.tgz", + "integrity": "sha512-tC7jC/yqeAqhe4irNIzdyDf9XCtGSeECHiBSYJBO/vIN0asizbKZCt8TarB6/XqIceu42ajQ/U4lQJ9pZlWjrg==", + "license": "MIT", + "dependencies": { + "focus-trap": "^7.6.5", + "tabbable": "^6.2.0" + }, + "peerDependencies": { + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, "node_modules/follow-redirects": { "version": "1.15.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", @@ -15901,9 +15970,9 @@ } }, "node_modules/hookified": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.10.0.tgz", - "integrity": "sha512-dJw0492Iddsj56U1JsSTm9E/0B/29a1AuoSLRAte8vQg/kaTGF3IgjEWT8c8yG4cC10+HisE1x5QAwR0Xwc+DA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.12.0.tgz", + "integrity": "sha512-hMr1Y9TCLshScrBbV2QxJ9BROddxZ12MX9KsCtuGGy/3SmmN5H1PllKerrVlSotur9dlE8hmUKAOSa3WDzsZmQ==", "dev": true }, "node_modules/hosted-git-info": { @@ -16808,39 +16877,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "dependencies": { - "is-path-inside": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-in-cwd/node_modules/is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "dependencies": { - "path-is-inside": "^1.0.2" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -18109,36 +18145,35 @@ } }, "node_modules/lighthouse": { - "version": "12.8.0", - "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-12.8.0.tgz", - "integrity": "sha512-MNmHLGRsaApxrigFl6M4FSvat8opl6K4MnBRWdU3yEaTH5pzrDSWjdIL2cBdCoV7OgAD1Cy/cdBiXR+ZzdsBNw==", + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-12.8.2.tgz", + "integrity": "sha512-+5SKYzVaTFj22MgoYDPNrP9tlD2/Ay7j3SxPSFD9FpPyVxGr4UtOQGKyrdZ7wCmcnBaFk0mCkPfARU3CsE0nvA==", "dev": true, "dependencies": { - "@paulirish/trace_engine": "0.0.57", + "@paulirish/trace_engine": "0.0.59", "@sentry/node": "^9.28.1", "axe-core": "^4.10.3", "chrome-launcher": "^1.2.0", "configstore": "^7.0.0", "csp_evaluator": "1.1.5", - "devtools-protocol": "0.0.1478340", + "devtools-protocol": "0.0.1507524", "enquirer": "^2.3.6", "http-link-header": "^1.1.1", "intl-messageformat": "^10.5.3", "jpeg-js": "^0.4.4", "js-library-detector": "^6.7.0", - "lighthouse-logger": "^2.0.1", + "lighthouse-logger": "^2.0.2", "lighthouse-stack-packs": "1.12.2", "lodash-es": "^4.17.21", "lookup-closest-locale": "6.2.0", "metaviewport-parser": "0.3.0", "open": "^8.4.0", "parse-cache-control": "1.0.1", - "puppeteer-core": "^24.10.2", + "puppeteer-core": "^24.17.1", "robots-parser": "^3.0.1", - "semver": "^5.3.0", "speedline-core": "^1.4.3", "third-party-web": "^0.27.0", - "tldts-icann": "^6.1.16", + "tldts-icann": "^7.0.12", "ws": "^7.0.0", "yargs": "^17.3.1", "yargs-parser": "^21.0.0" @@ -18149,34 +18184,19 @@ "smokehouse": "cli/test/smokehouse/frontends/smokehouse-bin.js" }, "engines": { - "node": ">=18.20" + "node": ">=18.16" } }, "node_modules/lighthouse-logger": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-2.0.1.tgz", - "integrity": "sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-2.0.2.tgz", + "integrity": "sha512-vWl2+u5jgOQuZR55Z1WM0XDdrJT6mzMP8zHUct7xTlWhuQs+eV0g+QL0RQdFjT54zVmbhLCP8vIVpy1wGn/gCg==", "dev": true, "dependencies": { - "debug": "^2.6.9", + "debug": "^4.4.1", "marky": "^1.2.2" } }, - "node_modules/lighthouse-logger/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/lighthouse-logger/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, "node_modules/lighthouse-stack-packs": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.12.2.tgz", @@ -18184,12 +18204,12 @@ "dev": true }, "node_modules/lighthouse/node_modules/@puppeteer/browsers": { - "version": "2.10.6", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.6.tgz", - "integrity": "sha512-pHUn6ZRt39bP3698HFQlu2ZHCkS/lPcpv7fVQcGBSzNNygw171UXAKrCUhy+TEMw4lEttOKDgNpb04hwUAJeiQ==", + "version": "2.10.10", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.10.tgz", + "integrity": "sha512-3ZG500+ZeLql8rE0hjfhkycJjDj0pI/btEh3L9IkWUYcOrgP0xCNRq3HbtbqOPbvDhFaAWD88pDFtlLv8ns8gA==", "dev": true, "dependencies": { - "debug": "^4.4.1", + "debug": "^4.4.3", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", @@ -18204,18 +18224,6 @@ "node": ">=18" } }, - "node_modules/lighthouse/node_modules/@puppeteer/browsers/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/lighthouse/node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -18237,16 +18245,17 @@ } }, "node_modules/lighthouse/node_modules/puppeteer-core": { - "version": "24.15.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.15.0.tgz", - "integrity": "sha512-2iy0iBeWbNyhgiCGd/wvGrDSo73emNFjSxYOcyAqYiagkYt5q4cPfVXaVDKBsukgc2fIIfLAalBZlaxldxdDYg==", + "version": "24.21.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.21.0.tgz", + "integrity": "sha512-WR4FehOs4XJ8OSp7MkGyVB4mfMs9Q6t8Y48TxiTCRxc8G2lJ5OKYPJvgU80dtKl+aIqIbdcNTgIooY49S5SsmA==", "dev": true, "dependencies": { - "@puppeteer/browsers": "2.10.6", - "chromium-bidi": "7.2.0", - "debug": "^4.4.1", - "devtools-protocol": "0.0.1464554", + "@puppeteer/browsers": "2.10.10", + "chromium-bidi": "8.0.0", + "debug": "^4.4.3", + "devtools-protocol": "0.0.1495869", "typed-query-selector": "^2.12.0", + "webdriver-bidi-protocol": "0.2.11", "ws": "^8.18.3" }, "engines": { @@ -18254,9 +18263,9 @@ } }, "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/chromium-bidi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-7.2.0.tgz", - "integrity": "sha512-gREyhyBstermK+0RbcJLbFhcQctg92AGgDe/h/taMJEOLRdtSswBAO9KmvltFSQWgM2LrwWu5SIuEUbdm3JsyQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-8.0.0.tgz", + "integrity": "sha512-d1VmE0FD7lxZQHzcDUCKZSNRtRwISXDsdg4HjdTR5+Ll5nQ/vzU12JeNmupD6VWffrPSlrnGhEWlLESKH3VO+g==", "dev": true, "dependencies": { "mitt": "^3.0.1", @@ -18267,9 +18276,9 @@ } }, "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.1464554", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1464554.tgz", - "integrity": "sha512-CAoP3lYfwAGQTaAXYvA6JZR0fjGUb7qec1qf4mToyoH2TZgUFeIqYcjh6f9jNuhHfuZiEdH+PONHYrLhRQX6aw==", + "version": "0.0.1495869", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1495869.tgz", + "integrity": "sha512-i+bkd9UYFis40RcnkW7XrOprCujXRAHg62IVh/Ah3G8MmNXpCGt1m0dTFhSdx/AVs8XEMbdOGRwdkR1Bcta8AA==", "dev": true }, "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/ws": { @@ -18294,12 +18303,15 @@ } }, "node_modules/lighthouse/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/lighthouse/node_modules/ws": { @@ -19852,15 +19864,6 @@ "node": ">=0.10.0" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/own-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", @@ -19929,15 +19932,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/p-retry": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", @@ -20168,12 +20162,6 @@ "node": ">=0.10.0" } }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "dev": true - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -20277,36 +20265,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/pirates": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", @@ -20414,13 +20372,13 @@ } }, "node_modules/playwright": { - "version": "1.54.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.1.tgz", - "integrity": "sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g==", + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.0.tgz", + "integrity": "sha512-sdCWStblvV1YU909Xqx0DhOjPZE4/5lJsIS84IfN9dAZfcl/CIZ5O8l3o0j7hPMjDvqoTF8ZUcc+i/GL5erstA==", "dev": true, "peer": true, "dependencies": { - "playwright-core": "1.54.1" + "playwright-core": "1.55.0" }, "bin": { "playwright": "cli.js" @@ -20433,9 +20391,9 @@ } }, "node_modules/playwright-core": { - "version": "1.54.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.1.tgz", - "integrity": "sha512-Nbjs2zjj0htNhzgiy5wu+3w09YetDx5pkrpI/kZotDlDUaYk0HVA5xrBVPdow4SAUIlhgKcJeJg4GRKW6xHusA==", + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.0.tgz", + "integrity": "sha512-GvZs4vU3U5ro2nZpeiwyb0zuFaqb9sUiAJuyrWpcGouD8y9/HLgGbNRjIph7zU9D3hnPaisMl9zG9CgFi/biIg==", "dev": true, "peer": true, "bin": { @@ -21582,13 +21540,13 @@ } }, "node_modules/react-day-picker": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-9.8.0.tgz", - "integrity": "sha512-E0yhhg7R+pdgbl/2toTb0xBhsEAtmAx1l7qjIWYfcxOy8w4rTSVfbtBoSzVVhPwKP/5E9iL38LivzoE3AQDhCQ==", + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-9.10.0.tgz", + "integrity": "sha512-tedecLSd+fpSN+J08601MaMsf122nxtqZXxB6lwX37qFoLtuPNuRJN8ylxFjLhyJS1kaLfAqL1GUkSLd2BMrpQ==", "dependencies": { - "@date-fns/tz": "1.2.0", - "date-fns": "4.1.0", - "date-fns-jalali": "4.1.0-0" + "@date-fns/tz": "^1.4.1", + "date-fns": "^4.1.0", + "date-fns-jalali": "^4.1.0-0" }, "engines": { "node": ">=18" @@ -23940,9 +23898,9 @@ } }, "node_modules/stylelint": { - "version": "16.22.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.22.0.tgz", - "integrity": "sha512-SVEMTdjKNV4ollUrIY9ordZ36zHv2/PHzPjfPMau370MlL2VYXeLgSNMMiEbLGRO8RmD2R8/BVUeF2DfnfkC0w==", + "version": "16.24.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.24.0.tgz", + "integrity": "sha512-7ksgz3zJaSbTUGr/ujMXvLVKdDhLbGl3R/3arNudH7z88+XZZGNLMTepsY28WlnvEFcuOmUe7fg40Q3lfhOfSQ==", "dev": true, "funding": [ { @@ -23968,7 +23926,7 @@ "debug": "^4.4.1", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^10.1.1", + "file-entry-cache": "^10.1.4", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", @@ -24075,9 +24033,9 @@ "dev": true }, "node_modules/stylelint-scss/node_modules/mdn-data": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.23.0.tgz", - "integrity": "sha512-786vq1+4079JSeu2XdcDjrhi/Ry7BWtjDl9WtGPWLiIHb2T66GvIVflZTBoSNZ5JqTtJGYEVMuFA/lbQlMOyDQ==", + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.24.0.tgz", + "integrity": "sha512-i97fklrJl03tL1tdRVw0ZfLLvuDsdb6wxL+TrJ+PKkCbLrp2PCu2+OYdCKychIUm19nSM/35S6qz7pJpnXttoA==", "dev": true }, "node_modules/stylelint-scss/node_modules/postcss-selector-parser": { @@ -24177,23 +24135,23 @@ } }, "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.1.tgz", - "integrity": "sha512-zcmsHjg2B2zjuBgjdnB+9q0+cWcgWfykIcsDkWDB4GTPtl1eXUA+gTI6sO0u01AqK3cliHryTU55/b2Ow1hfZg==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.4.tgz", + "integrity": "sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA==", "dev": true, "dependencies": { - "flat-cache": "^6.1.10" + "flat-cache": "^6.1.13" } }, "node_modules/stylelint/node_modules/flat-cache": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.11.tgz", - "integrity": "sha512-zfOAns94mp7bHG/vCn9Ru2eDCmIxVQ5dELUHKjHfDEOJmHNzE+uGa6208kfkgmtym4a0FFjEuFksCXFacbVhSg==", + "version": "6.1.14", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.14.tgz", + "integrity": "sha512-ExZSCSV9e7v/Zt7RzCbX57lY2dnPdxzU/h3UE6WJ6NtEMfwBd8jmi1n4otDEUfz+T/R+zxrFDpICFdjhD3H/zw==", "dev": true, "dependencies": { - "cacheable": "^1.10.1", + "cacheable": "^2.0.1", "flatted": "^3.3.3", - "hookified": "^1.10.0" + "hookified": "^1.12.0" } }, "node_modules/stylelint/node_modules/global-modules": { @@ -24443,6 +24401,12 @@ "url": "https://opencollective.com/synckit" } }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "license": "MIT" + }, "node_modules/table": { "version": "6.9.0", "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", @@ -24733,30 +24697,18 @@ "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" }, "node_modules/tldts-core": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", - "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.14.tgz", + "integrity": "sha512-viZGNK6+NdluOJWwTO9olaugx0bkKhscIdriQQ+lNNhwitIKvb+SvhbYgnCz6j9p7dX3cJntt4agQAKMXLjJ5g==", "dev": true }, "node_modules/tldts-icann": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts-icann/-/tldts-icann-6.1.86.tgz", - "integrity": "sha512-NFxmRT2lAEMcCOBgeZ0NuM0zsK/xgmNajnY6n4S1mwAKocft2s2ise1O3nQxrH3c+uY6hgHUV9GGNVp7tUE4Sg==", + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/tldts-icann/-/tldts-icann-7.0.14.tgz", + "integrity": "sha512-UZPOb6KYSFBH8QD6QkK1FH2WGM7opD0s0KGafoHA4UnOQirBHtNs45kOfgy0E5a/a9fx8ukPS4E+nl7Dp3oYAw==", "dev": true, "dependencies": { - "tldts-core": "^6.1.86" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" + "tldts-core": "^7.0.14" } }, "node_modules/tmpl": { @@ -25532,6 +25484,12 @@ "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", "dev": true }, + "node_modules/webdriver-bidi-protocol": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.2.11.tgz", + "integrity": "sha512-Y9E1/oi4XMxcR8AT0ZC4OvYntl34SPgwjmELH+owjBr0korAX4jKgZULBWILGCVGdVCQ0dodTToIETozhG8zvA==", + "dev": true + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -26426,10 +26384,10 @@ } }, "node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", - "dev": true, + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.5.tgz", + "integrity": "sha512-rcUUZqlLJgBC33IT3PNMgsCq6TzLQEG/Ei/KTCU0PedSWRMAXoOUN+4t/0H+Q8bdnLPdqUYnvboJT0bn/229qg==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index d9cf9902..bfa67dc0 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ "@wordpress/media-utils": "^5.22.0", "@wordpress/url": "^4.10.0", "clipboard-copy": "^4.0.1", + "focus-trap-react": "^11.0.4", "get-xpath": "^3.3.0", "html-react-parser": "^5.2.2", "husky": "^9.1.6", @@ -67,6 +68,7 @@ "react-content-loader": "^7.0.2", "stylis": "^4.3.6", "stylis-plugin-rtl": "^2.1.1", - "use-debounce": "^10.0.4" + "use-debounce": "^10.0.4", + "zod": "^4.1.5" } } From f8f408871cda9f7525d27c96faf89656600d3240 Mon Sep 17 00:00:00 2001 From: VasylD Date: Thu, 25 Sep 2025 08:50:16 +0200 Subject: [PATCH 198/292] [APP-1903] hide skip link for "Hello elementor" theme (#408) --- modules/core/components/skip-link.php | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/core/components/skip-link.php b/modules/core/components/skip-link.php index 783c755a..2babb0f3 100644 --- a/modules/core/components/skip-link.php +++ b/modules/core/components/skip-link.php @@ -71,6 +71,7 @@ public function __construct() { if ( $this->settings && ! empty( $this->settings['enabled'] ) ) { remove_action( 'wp_footer', 'the_block_template_skip_link' ); + add_filter( 'hello_elementor_enable_skip_link', '__return_false' ); add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_skip_link_styles' ] ); add_action( 'wp_body_open', [ $this, 'render_skip_link' ] ); From aa137cc9fc88fdbb5c44d3e78001e81652499189 Mon Sep 17 00:00:00 2001 From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com> Date: Mon, 3 Nov 2025 12:10:26 +0530 Subject: [PATCH 199/292] fix: review notification overlapping review modal in some cases (#417) --- modules/reviews/assets/src/layouts/user-feedback-form.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/reviews/assets/src/layouts/user-feedback-form.js b/modules/reviews/assets/src/layouts/user-feedback-form.js index c624e973..585665f9 100644 --- a/modules/reviews/assets/src/layouts/user-feedback-form.js +++ b/modules/reviews/assets/src/layouts/user-feedback-form.js @@ -99,12 +99,12 @@ const UserFeedbackForm = () => { }); } - if (!response?.success) { + if (!response?.success && parseInt(rating) < 4) { /** * Show success message if the feedback was already submitted. */ await success(__('Feedback already submitted', 'pojo-accessibility')); - } else { + } else if (response?.success && parseInt(rating) < 4) { await success(__('Thank you for your feedback!', 'pojo-accessibility')); } From 6578aa36df1a85a1f6c5372c2837ab5d8601e1f9 Mon Sep 17 00:00:00 2001 From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com> Date: Mon, 3 Nov 2025 13:38:16 +0530 Subject: [PATCH 200/292] [APP-2069] Added bf 2025 sale banner (#419) * add: bf 2025 sale banner * update: banner style and time calculation * update: remove test code * update: bf banner link --- .../settings/banners/bf-sale-2025-banner.php | 172 ++++++++++++++++++ .../banners/images/bf-2025-banner.png | Bin 0 -> 55061 bytes modules/settings/module.php | 2 + 3 files changed, 174 insertions(+) create mode 100644 modules/settings/banners/bf-sale-2025-banner.php create mode 100644 modules/settings/banners/images/bf-2025-banner.png diff --git a/modules/settings/banners/bf-sale-2025-banner.php b/modules/settings/banners/bf-sale-2025-banner.php new file mode 100644 index 00000000..1d6edda9 --- /dev/null +++ b/modules/settings/banners/bf-sale-2025-banner.php @@ -0,0 +1,172 @@ += $sale_start_time && $now_time <= $sale_end_time; + } + + public static function user_viewed_banner(): bool { + return Pointers::is_dismissed( self::BANNER_POINTER_NAME ); + } + + /** + * Get banner markup + * @throws Throwable + */ + public static function get_banner( string $link ) { + if ( ! self::is_sale_time() || self::user_viewed_banner() ) { + return; + } + + $img = plugins_url( '/images/bf-2025-banner.png', __FILE__ ); + $url = admin_url( 'admin-ajax.php' ); + $nonce = wp_create_nonce( self::POINTER_NONCE_KEY ); + ?> + +
    +
    + Elementor black friday sale banner + + + Get discount + + + +
    +
    + + + + + U5MVIM;W4xPPEa9GI|}O4kAX08oe`72ctwUqZ2)P?}X8VL>WOO zB1nkjb=}XW_xWG-o|r$BRVvl ze_q&Lh$$>MpFVfJM?w_I{{J4yk)Bo^r+#K1qrQeoh0H}k%*UH)Zf*#^Y5YB&YjnS2 zdv{atwZEb7Z_hlCbwF_umz4#c4%0+1MO5U^+eT-t@#fL}yY}-=YL+K6k;M^_coaLvU~K&kZrCvP4g8nX zm~6EkeUreTy3u21S4pl_iW#4h(cCi`dlXtD7In^N^d-lf<=H6y$Wjzm{|)2Lf}2%p zF#bt1al>NFe(vF+K+ShaSsf?EN{=b!2l%dddJ-5Ju~*aPnV8LXimFf7u#DgM6t!UH`o63|M4ta7i<%-?D0pk;i-s`}5t) zqSo)vFYL~TuYZ7GX5e90g8ZC?Qn?k~dv+BBPT_8|fq<06g}$l+5yYIkmov>c!jb_U z!$Q1yw~~OqW^rdLjd=w(Zxv}27+$p9&ZNQlzr1~W^qHcr1BX# zX%RW2B_przb&csOJ$Nhv?g6Di&bypeJN)t6yewlr$Vr|B*fc~>7`yD&jy&qm@m>^t z`G=FvvfM2~V#1urR3K2uFl&L@WDUK|UAW#-NwM9EDWheOt04OjpQ={7^J(|!g6LK8 z0ceJtxDhNmENbxiTUzxsImU$=mUcLE0bnDXsr;G;dm2z1i;laLgOQ815+K*rOX|7B zmdu5ukqPbZK0XAjcAdNY4S)IJ_tOWlGNi3cxT2ehs8R{juRg89O_mzewod3Tkt5!? zH_Uu5H(>P}DnoHx>8Ax%q%UXwYL9BQZG2vVRih1{= zH**>zzBVnT?a0Tt(u2g&XAUwNGX>CY^cOs>baqoeqcBZ?WRA8OW14KXW}{Qp1z<_b z@Kk_<++-W0W?7%`8R`sQOSxID`GWRB7wGD_GS$S@U$f93zUX>!orxa+TcqB4{7+|S zklMw8=TKXSi7A24KI$-Jw|aU;4keMmW(OW;?c=dCx2p>**=!n@_zKsdoCZw ztC(bGaLqt}eAW3Fw9`2O2Wr52o8>`k;#3mU;L&w-NVK$o`LL6;JqKf_8~#PABWyg0 z2I10_BW$vvusD$Qi)>nJlttdF4NUM2JST~%zrSG!HFZBivL3=%VlmYDY35U=SW+3A zG-l?6HqEN6a~Y~fa5hB2>WnbNBE3bQr(%hJ}wtzO*_}3ivNL6s`?2b@|)zGebdKpg*VxJ{l-vF6@>>X2!1^>=(S z8&zsT!1Q{HlR{f<@cr&K&rg38Zx5e{1YUbsd+!E|`VW%nzVRaf`|$k|PI@ap_NhvZ zW{*3o*yxgK!6!z|nu?_LgOL-T-s^SpQtOK$CA+YA3Cuj1m;{rItU&z{Y0sR=Ez=lN zR{?kbC!8D%ODwVgfs(FsT?IJne)^0<9YEClhshqV zoVOFBj9oQFS`y8O0Wah1(_{6J{qC?x+T%yVn{M=t9m)C4y5cV0dBugKLQ&4uF7Tp~ z0F7s=bq&SKmQccG>kDzyV^0D;z zHPI10K)eg0HrebT<{tC!tEJ}Mp|qwRA^HVA0*xj8ukJ?~NjUwzWUiBrC0JY{IqDQ{AaSyT2DMozrq# z7yi0AVvMcqN}1fSH^h2U1}0y%a#V2`;i8G(SuULW7a|PP2mP#2!3Bk$z$?OYuqMAc)U7?GxdIOwzTIzAg);D`OQQRkQS9Y?fdnbeGA)rk&)* z|M^G7u2;m+(P#TBNy1$OD?Jxn0KTN%Ho-nv`McM(tZ9@_CG?!MKl%ZkSWdFV+k{ zz(&MP-O&$EG_#bYfC03mNZA9uGkGuxb|kXtvQI>}}w&uL$OOA-=Lj<&` zV^(3O9yBkLUdEra<2qaYjKIQ?d_?%$w-!qK#pR2D>lmKZ#r8a@D__Le@oXTj^D|W3 z-|G>x#>z0Mwyz%$;uU^FfNB{MBWW87qeQqa{KwDTj~i?RsM~*g)59wI0IV$H`-P+x|K_u2D3Gg(VAR@v@YnJ}x2F%cm> zEN?=|r4bhP6e(!NPF^KPu0EYR+t4vK$3AOQGa0Qqn9@JS>~slFVPZC3FL;5ZJE zW7A+cU2kQ68PY-<^YiTKuh1XB;}@RvGa~lwHPQZ#{3O&|%Bm{-p-c%O9ugUutgV_% zVBzeAc!x4j1e1))g7;Al!iZRTDRJ~%A>FY?N?Vr-_M3MpuT$rYa9G`CUHy!&@V!GPI(;rk!(tGx^V63LwD5D;BV*G!eYV zhFO4kmz5k>$(G_!SeA%VzfKcp9N}F@#8eT31tgP3k4(tRo6C=i#9;bEIJe3r>*E%U zPE9p*2_KB;9NpAogMql04&#|kWFU5I(=z7S+uAu}nN|&5CJ=8YGxW@zX zD%9saVvkx!W}R)gxrc;apD_qO?nvRB6(mt{Bj<&0l%BZzAZg`_9Wt-QsvL|~yOdu|;+N3BG?mqUK&q7X)%xb;pYeOqdo z)ncH5v)G%PBLL1Fr-M|xP+w<;P%39~O?*er1KdFm((}x?l8b4(1Zuo}-{`BLGu52g zIQ__on_(Edf`=gzQORSQLrf$BuXTN6gr9qjt_{&pehI|%lTf?Fs!~Ayzr5T#0ylPwTnSN zHoh2vy|W*yZ8_K~TL0-&yZ+-IuYO1+Q*ea3P2GJEr%`kXvIfgg0L@35*RTyXyu~w< zAZT|iMjy_aoYy)N)~8_Ec(cii_fM<0sOS+cFq}i{%D##JbKZ054w$oP05u-kP^iBa4r2l7gh_grW z9th_oSyax%?spXR55Za=J$rh|T^RbE(KqGGD6oAq+?l$RErum)6+Gvyz7WA$6?4Bt z-lgebC+tg&so~jF<5F;9uV5e>S~##HpH)Kc1n zC?e`FIp{~-mnInRy7;GwQqypDA|pDNw8O^;F@#gH*6(t+5cz~=Z63nVP^zSMKHhmB za)dUSNuX-G^p=R;gvHd(xJpWXyF()Utz}ar_qx#>NI8;^wd=^M+yUKof2ycTmGpU~ zY@0zSk=ArMn=(aTX4(v`hS)M8wJ$T;flC=l>$>Fd(ac>l8cXWK_#L6NvUf5y1++Th5e>bj*m#UJalZb&4m1l)5oPko9?rVHzDM6 z3Rm*4ehxiqj-nHFIs$M0IFN##tzma+W0FJzKXC(OUk-3!D~gYF_$5Uriig6jjIdkb zvR5T|2ulsrP`#*)H4@LtP$;?(-D-U9kV)qFJeGSppukrr?jNvt#}sd`^ZzKxJ8q%M zJ}||I%_m-bnaaFJkQZE8c~S!m{|Je0*E(A4jBl zhkPdXox&DY#rlC^^NkIL8u`v5-&yiZ>jn?7NXYi(m(?!xevwlr+o)b10)NFiNy|rn zY;*CTG&iyoR}d|nDB&x_+n9a-jipE zG$V%_dq1+E&%B~aae}+1SiBevw>ZW)jJlwLys0IW6M8kJpP+*Qgfq^u+&mmsI2Z{s z6xYU1Tvn^~Xu7%akmM?GsyK9Sr~LCcHMye9v%tM2(5a=Y{Dq}z4T4)#+1cRE50Mhu zm;nD31NO31s6Kb9hDjOw(YwaNx^vOqwCI`48<4;CD=ioL2AEwq{`uS(<=0y?iPHN& z>l+RPKjx@TE$sZ1owKOxi-=_DT3Tg&*4nVFkeH5iH$z_+jfQH;h=NC+y!E-$f3=BKFE>%87y@0=>{^+qz>PFYILs)PRB z<|V}EjDDS&1f965)-SIiewO1)fy(aO|FIPa{@qsi$R6uvf690+;xsD}@G6Fjth6k_ zCF~c?<<}2!r``(ESagyMn`oksnj6{TTZ1I1V_Y{vygYLt0PQeEsB&8I*6ze*O9%nMY@l{6xYXSHdnxpgbX5t`v4b5mVgnZ zvH#~If$ozklbR8RMH5r#jDc`2yO5ceSA6={)MV1~<_Z00G;W8|yko5C;@NKK>-Ui# z`o<@cu0gL2fL~U52Mx?Zy+B-?X16+44o_@WQui3U9rur95+*tYu?&5UxmBG-ntjpu z)|ua{V#g82hB@Aw5Zf|z0n2SqwXCAk0A{aHJm4g+?a4@|i=DDD(PWCRja7=Ea`8Gx zM3$2q+K%Q?byFTatNXev%gjj1#ad1dlCpk3Wc``HekGPTgR<}+HyRCpW>FEum3G%Sy0 zXyBS$_mNDzgO_ceS3itSwi}79OzTuO$vO(P&JRA;uJll3%u3@LyUay=35w6i zJWiaT;-6WKso^7$C}jXNHVYwmPfqwCMa$9kZN?{@2_@7fl5-M%?<%f!N(5PFq$8Yi zt755w1Zba28Tkd*>jiQDSiwO&IpOQ90)j16cfa>SYoI=v3WNm(yq7;>s(wm#o5vK( zZoM?Ql3?f}u)|=s-wgWbw$AMAYSCow%L-&6HIp3ZNt@rk*UOxWm7TS}s$-v*p;++8 zl-~RPR*5BJJTbpyN%dk|g1^MTQyl)&>6_$-=^`w87gceP$oWWXC#!TJeqq54QuGGT z4Hj-$yguW7{my48XUe?KkAGI?Sgg#u;u_VQgshkZ5hrYb-?*-0l`%_He)^P1<`Q}neV7S77b8gR>8KeXmj z5F@qyn|C@-j=p}k$;u*q1VC4M>H1-UQPAjE>-b=uf@y{~sXbPODg!A?30H{wV!^j0 zyYNm1#=4o9BtH!??@R2PPGo7av~o#~s>)Ro$K;}1h?*;8HH`mh34=8eL~Z}uX8eaw z*h}aQP5){U4LtQFizYWm#PKCGg-nQ@Z1hmFLc2x3e)6$rpkwkT+JGB;*Oi#K<<~NJ z%~=MCJgQe%edi$~sc^$`eRaCqH3c2pNuCl0&AoLyL`l(SX%qU^(Xt-O2@moq3z0Or z6eXS&*u*bp?&2zJsF#pfbj_Yc%UxgZpy*_$cwFa2=ZP%tNsK<>njzuV8g&q*_Dd5) zI^{Hif4#bsg(>L;t&t+22jz`=5Al6Xar~;GnyFcP_$($B>zd$4{Ppvuey~kDRg4KG zT=#^(cwAx_y$&DQ*Hp8)&2}QNj(a|IBqEeC)u_bJt09IPs+i+KH!w|;rcEaG#ii+N&Gz{Pe)9v}t! z$C|T{Jrd;G(M)=o#CJQt++**5@7VGC9(o1B@)h8|&Ax_hP%OPYza|Jxg9+}+Y+G#% zIgP#4-SJ*SjC@JuV*J4IxY*KfI~?}(KbgaS;|X}97dF!hF88O?;|4`U9snT>yoIm6 z5pRX9)k(3dM+CKysJ5q;9oZlq#!%#|-v^mI?0V?Bm)r->LczRx{hemEiEb_h3H9E) ztD*@G6rPI?-sW7%tGVu8t%(#3(W3h#2FnjdMP;X)hP8A=oQ$kFWIU_C{3uj=I&fdA zeztjx!t@4BzV*E3RmO{?{I^vpnbxSK%Vs7kjjI5>3)^9f*+_sv2qy@jPAuT`rj*Rs zBtO60!x*|!VW|Kz8yWrchv5S&#dpBa>htVUN*|L#PO7{aWIw5^j7yqeuG?GNZ0(Ap zmWe^0sU^(2T)+;eGBt6_pfvQQ$lU$wYwDkD4?x68s6*%Hs0tPnA_e2nCCp7UNC#my z-zY7%AVETBGXfdhATv>%fg@5ROuF|9{VpSQ&Z2_CF5DIi(p+>xs{n_L_v1w zbIwT_6+^RzUG_UnYFMtZZrk@oay{p5lm)1z(8Rij5BuUm`cOCj^nl23|4mEgcpLMU z1YhHob&WazK1e(O=dE@HDX?r0{akb|&TYk0JuVC+U^c5ATy_#nix#RZNvNC|8FX(L zemmj<8T|2?C>0u_A?1H{)eQ65K$@^L%22FuhefzEDZ#aL~Rh|9%ax)S_y?<@9V7~qHTWzFQaV<-NPfi zK=Cx`L^ZX&_l}NA$OxhONIq3@_LqXV2v`y)760=E)7K&x1K~i1Di?;u{U*NJ_9vin z$ClEJ{VL`L$t>W)-l4iNrl!>TdFM;onEO+bsglk;%UFL|%_5pLJ40r=u+4!k3c5v+ExPJ}bDo>IF<)Zp*L*=u) zG55Exb_D?Pw=8seh8~;=tpF>pgf_k{qm<8^f4rqBGbjq_^9b5L)@}b1Stj!s3`}}5 z&}#OMINL4=IGXb2o+|4x((|y5V63HsGS;opd`fb{bNVA;!jh)rNT|u}Bt?9iD+^wo z0!hj)(~vrz>aE!+U(X>6>#CV*(dFXK9bBaknb*$>sTP=3Th2+3{0W+Z)NC9>7Er|p zscKeBluV@%+A0Fvcq8xsq)oQ0YK=Vq*%1GKlL;rugLmdl#A(9r14mK7)W@8mH@~r0 z0bv?*4D!L-L#uCn@nJXD0eQyXMQ?tCa$c-^=*k?E`D03QRN#i3hFOK~<0dlH&S|8k zIm6$C=mQOlO4`Vmm;v!{vc@PR)GGcH-VFilodOXQA+UGv=|vc8?-&jXwO5*zS!#vI z52Umv7e`LTP#d{KY37vc$uxd)b>_U4`=C%3l>{?@1x-ji?lvI;EYpgBuYr1UIi8X3 zp`X?tzbI(aSqPzcoy18p!I~UxRc<8sX|7Q>`Rq=}8SIL!Eod(ab{0Sh)6x z!1v9g*~R78?Wmaz+y2up z%x8bQcQT}Fz6&-jzvAle1D*~9|J`^j3K`@EIwvwnbiS$zMEl-oCerkxC}-w(%-byG zqF6^gHk^y;5{}1hl0c?`I$-r#2>0@x*0?8O>)DeXdOWlZUx#XQ`TKHkt_YXzH)G6dh9vdq9Pll0y2lrixjK+hh0o)rqP5VI!1?lP=QUn} zBMuD)-oOEb?p`>)4pvro!{DOQ)#zO@)|-YC#H@e%*DIj$H(a8{FnC(V&i>I|jU;?a3v+b#(E zdCRk>?pzSduhwY<>vTz*%64v)_FSy@v-UsuDZ@gZ`{+T_=R#RIJwMxWja1X_xQfRq)`W=W__xIr4#a{nxelLjz;J= zM9;#Bm1$ab5;+O^&t5x_%Z1Q~w%+S?Z^=n?v{nOADaCQxR;_lI z_xCi9Py;SiZ;iRl&RSFlJ>ta&qy|hXaS4O_01QEb?+uKh#Xsb!VRy?tPeu~ZmLjoW zDBP-MX@Rcs*9|D_!ml|h^6v5<#i`-uRYsz<<_v3ik8<<7;QrO(!Z7U9HBTUM3O+Jx0&mueHAE z5Xj#BW%BytufCAvl}$5uX`e})kRR!kJ7I-q9KJGr)S3z_O@z<7NtuaH;^JSBzxt9;sc%u@3bRj_ktRbHov|xW+hQ=+CsP75Q_fGz0CQM zHH&hQX!kK9bU{X2*xGgkWI+D0%5RREx}==&vK;+d_IfbXHJaRyEfd3(1>V?8cW$$8 z^EIi@h0}bR-STve(I)vv00_SRR{`*mCJqmn_4(lgS*9bcc4TB zYwDx&&dX%gj0C{9#CoV5Fxl`4Rc&ECw5`!u>J4?mu;yDQSAwT6v$f*Oql_3mfltfR zC%$^-IoT9#s`WWG6(!+o;djP-20SSFsgn4(R?5l&Fg9uEwFl@wI=VN=7v+SutVN1j z(4c#Bh3Ff4w;tFO5WrfASZN=6=a;Tc8&q|27t<^75i~9&FRXcTneLWItHD=G;#KV~ ze6R?G)s8P(9v|B1+$90Zc7IP*mv6diwqjc5I*1;Q>JOEVfM2~$cuV#=s|}LXMhL6;BIY|g{ zn4(hN%^Nn6`%jd(J{^0W@ETRTUUpd?GjZ!{lVQ`EKCQL}G!Jk*(yZp)7OXs;r5gPUvBtM2+`_&R3<@<^Y?`D6*C!jq_a za`Lvx%S$iI*e74=+iGcFfA1}GllN4{>UMk5N(#$cXIpC{?yGD7n?x<%%d8c9Gm-Fgl$FhlIPnOd<@<5JOj&D3mQeG?QqzH^ z+zM2b+D!LsS}He^%P#kV{-VNhGnmUBNK)eXn?c0)b z->c&bq><7zShh>SoKlRAcyu7$74<4OE<$#kTeO1+q` znR>#d|C1^=Q2(nR7;VhbP!qX0Cyg89Ry6MGXc=+vhw13%dM8s}_vwvqru-w2ZNE<_ z-3A$+AKl;&U`@^{5HVswoDlr|rxM^zgfolxZNWYX6J%U8BAD>n5UvotH}BZya4w;$ zkv@D9urDWh2L~24>ts9Y6zv&?;RX6QoGEYk3tz8u3xSPjR=3P{U3=1XsFGy5L({_J zhwW0h%`UKqhaL$T=$_!6lqXF!S=C1`tXaE)3if4LFv6W4Y4%B5cbtmRect5$c8ht3 z0Svmf)pAnf# z74F`n(=F(@=i~f_05%V1<$PRk85%xSj@y0K8^9s(tHHX~e~o<8slj;we3c`nA!ek` zp%-(!4*NrW*tV`d5s55j+qr8g>&+OHAv4m_$EHrtstQC2H%!WCq>akiKY0(rQufXI z_>XcvZH?b-OOM1ZfPFTquSGI@HiFh5HR~G&=jAPeW@D>jB|&875{oizCmZ8V^fPjm zw7FFWOw|=#b$^Vp4JMMEy1>K#p?jA99tr4s%ko~mU~xc3m%WVyr9~dMeeX>mJt!&# zD+{?6?fr~Tk1xfJ`=O}_zOlTvDQV^$Q(6tbUjU`n+HuUY$CgDn7mQf!`Ga5;K{Q1z zO9T2A+@~aW)(+*=ou>0lGQrJV|0pZTz9z0&i&Qf}qL9)W)=jHFRay4(+wvC46e%j^nu=43yN0Xv&Z@ z8i`pVEMbb1JSq52-0@sjXc29ToV`67!KzV(`PUeCHs^@t@APacVPR9sQ-0bxlKZ;( zK9_ptB7d!uzvdPny*8|0J<(UEN>&z+{A%U8r0TzUT}P@I-iNx{h>LG6Y8>SU_5IrC>HS;o`I6Sk4jpRG+#|n2r?MLd zZ#tQ#1+HXH1XtOYAG&vT!|ze=NcFIX1+28bzCGrRt?pB{7{XSh9(95ROCBQ-`m^AO z1?;{p*GMlYDZJa9Ay+ZDM=n_7vT2G8ID$v1$*-sz7?aW?kT4OmYqu1R&fX&G-3G zl0}JFr?qc@IDD%>Z5&4OUThjIwVVuQ=t04&+}ED5q7sYt#ncInAsfzy=F$dGQTl}7 zQD4(lg__zUb{7EkbHhQlglM#~3Z_}r%r3=&&ePn{1ixUAXu+f@&BEB~_Um>WpWv$U zRJ-ml+MT9Y)Am`Hvy$PxS`W_z?gRj&5f zy%-?_^qxMUs1GeG@7P|ACbxY`0{<;`flC<$gzZIxc8`990>7fY3L6Mk;2$`tveh}I zRtU-&(}S5vvOsGIjB38D3=jY%bXIvzt zDJi>j(m#8$aU7*xIxk<;zEH+C)CM?2O$;{H!--QwM*oNm{!Z96@KnE>A0+M73;{j2 zZ)G++!L_tkT$RT8z*UC&&NXkj!FO zHEGUGwg}FpL9D^g#4x?mf)B>5|3jwqFyNwyqUu71@$~x!JL96H5F*@73K7@EKy0hRx_wyJDb-_uMY^YIQ;dT!vhO;_i=jo6QRR zgx;IaG+>J~fjKaR49i${okrL(>FQd0!JONF#9r&a&k*Ggrt(cN8mrgSoF+)yb!K{ zi;H^~fj3bpM6w&*E*gFpQZpo3d0Y%0m^ITvagaQmZjwE#aFCRRV|P%0?PnCKY$a(^ zlJQ*VNUJrgK%Ry@Cob@^Qj>SQ3ES7(1rrMuIshj@~tb7=V ztdORJSV^L8YT}vh=ciNll|~h$YnJWH6bfj-*jN#6T-pvD$Ruek^8k#^XU8UeaiX2> zLRsNBw+)f+I2gWrzZ}z|s1wj3E0D@M>z>C=2G3li#>ht9VwpMvs@t@Nv*@{hEQnNq zov}}-cYf9_gFOm5>qKrw%Jm zHkvv@a$FCqs;**38iY)qB+P53n)v&vNl>VIO8NK~!iC5&A~EjAfdC zX_$C?=byXOSg_H&#-+A$UDG_=(Og!3TLpa?XE-dHj1=&);BJJ0m92A=C9D}+Sra6YVcqKMZ@^_pUw~VW zl1ub{i?NhN%zP3oh_T|;aQxoYtSN{UHDqy^{3HZtnCk4~-sFsvT-QiTbW4Z)9u|Ef zt8t9sJ%asCfrZNp{gf|JOnsQ+){1BGq}FcK>525MQSz6Z@E|+mlnD^{nE^US-Y&1* zYalUY&gaoT@!m&_+P?krv-o#~vMS^EKs zivqjb#rzb}1jRa>=KD~kf13g>dDls+=&;(=#GR~`cS_1VGb}5@R?84M3`0r|bfJb> zW^I8&@^k7mJg$-|bg(QkW+^Eb2Lf4&`txwQk1kuh@?TH)uauYi9m5i3g-t#07)8#A zNqKWzZ2euYnDotAUvGs@a`Bq+ko$Breg!+*{B^v$tcd{p!X`ihXHRBOG)Jmq6B zpTq5rqeRf(jVBf{yw$K|8?*WuCp!PVX*c==#cWJ=?J zXeKp=r} z(Oc=PN1?kt@(y299~x4`(HMvk9f%eEGT{Q1-Q_JvK-;S0)>zrhXsumCQy_ z8u?lca(ltTx>pa16neY)=2KO;`)8sgvZX3dTB0EaOvHVUjc?qNwU&`KR)qtII>Aoz zxv%{{iO;>KHvSNOfF3wpZl0&{2t}CM+4VzT+L*l7TbD2~ORXl10UW&Gk2UZ-K7r4> z8mMv1uYE4Ebx+uV!xcz5_dpcln7}*;EGHfLqD7LKwUM&^OtLigk(;|=08>a`H}KEV zEC2oybJayt_tJwLJOdUfO@t+ZMNV~~uMk7#m#Q>|I-W)!)|;Yk6P+qdqMC#rb!r5@ z<*)lvLP2^ImM694*DM;u?a$72^)2#wtFQGDR<;u(9SI-qs=mE$W8_>f)HjrwIAK#; zvbzhoB>()>CN31Cz+lDrn$+2L04qTJz;o`Cw0gHkv1Q$-+>2*be$Q3@4(0vOsV_2UUdhuw{3=UU&b%L*kwiPPx2BlhIB^y~BOUoQ%c60SY~ss!gqsBb zF`3qqDxf-LD5wdQj;*`QJM@w;Xtr6cm~kq;<5$!PaV(3`*N@U`m6V0`=`IBKiAGpt zjaqv)uGXrPN+{$^@-TcK@3bzq+4rF^nLk!+$z89fLK>8KJmtgM>t5=jEy(%e{QKjk zo%hUZ{7L!c<2Y!l1HOy^em!$`6VKsB3Gx{IrUZV{ZZYa)&~3oSUt>+7w~MQdLByA* zt}?D^O74SuzdAm9hDB>*Jpl6OoD$6Z0z40Iu3}cVH^Pq@SZ=G_WV*UN=r~Mj?#nr* zbtLaT$je0`aW2${ON8LF-#=8omad*1oGzddla40NA5hT0t- zjy##3X%wOkcjNoTvsLI!)yy4bZ0ZilJ26+MisN4XE=U1bQ8RV?t*h@^xG137pfwG8 zZu$0=keSeJ(Tk+bK1N80QKJqTPL1&wrSc=b;Sb zSK$C>jkK0b*Sw=4cvhuexDPjl+sJQC^E+AZF^9gm#Kgdq7^GYHas}N;PKpdVJPH_l zVQ94BcVSmHnO^H0){>w}#1Tu?rV*WQ0#_zJyp!7wA6_-b2sIZrp6fv6Vp~j6P9`0O6 zd0ZIAVrBL;=HdxppcfZMXrs=4F!NWyZQftGidjYaMd$pfS;Gnx7d5?iZ85Ug)=b>m z(ZFg=OK=7bp5*-`4f?C}@I!%cr1SmlcJq9YgV4IhLL7Hy>969>@&L6lNty4@Rt9!G zB)NX%um)r+QW`J5AMi^7cfSlgZdxHWf0yYJ%VhS-pt03$QQbP=)I_L>Ndu2Ai0SEIpgR%?F0OS0P|5aGv8(ZsV=B2#%D!N!!(xMca3^TEbI6pW0S;@K2BKphW(Pt$C@--WGdoS|x#D-DU=A?C{#z%KpAA1Jn z{gk|xWNxoXmGo-u)K!V*UUZt)O_^A`~UjQ$RL06M~fo7VN38(4xF-^ z(x%57L6O>YH%s6Y9kLt#M>~r~x08qBbkZqVUZhE}dOSN4Vq)RSID!7`fBJr+h5a z0?LwL!;IR(BOJ~lfP}$&HWwH}PkNSJ`f83WJzPjS&sFB4_KZDi)|6(lnEoXXM$J9bO6rH7utrM_y|U zN>FDTPV=O^<|Nj7r><|N^ey<|b^p*f4{RRJe@T{4?V# z4f${CuJOg>86MaW>nV5%A6u?A7PRc{mp|irhcH=lMZWO zLt~?%ud^3UizOyoRH4Qm`7I~vOiPr(>?X`SndtaBM6`{;rT18Ei7Pyd*?9P>6_<9+ zF>8ss-1l=lEr`-ts?mLpx$)v+?(YqX83x|c%e-;I0jbi8dkijGe&Lbe5VL}_%*R^y^T#=uw zJ#1D=!gGdI!Sn%3u=}K?vT~jX`m$BkL{;u4y3Xe#5Hi)7&SO+Ss2FY1C(*cCtdYx; z)An{a4a8-{C5?JSZWN|Z-uhmmZc`-^HmGCTaJ{G^wJ$2c0292d=n0m8crh@GE$SST?aD)=or^mDOE_n2of~tHt z43lzdLMz_@Z$Q|C?>xs3@atTMoPm37y1;B-5A;FU%mHnHKjz`#XNK4APr8W{ED2{! zLoWaUtP~~ciM@Xme}DQMEHeK;=59XUe^YvzA(-U6d0pJLQzfq4hy1?x5WQ20EEPdh zhGE<}i7IrqZk>1bXrkTdpX+-pixGv#MCS~w{)~|HM$HLhCsMzV{K^+B^u5ntY(mgX z{#ry8B#h{S!TEV+Ns|rdDJq@T;|yG5R7tD0U>_XzNf(n=!o(fF6s*@O_v*l!Z5!9_){4%?GvF0*-($kMyKjniyI%g0 z400AyS&8mska8wFO2OmVP-3X2a-qSkZV5;{>CwzoE2-nwX$*Z?b#2sdBVC|#;4+$he zz6&Q^VJ?5DNRgY;8gANT;sM?_0SGIcxMsx40w+(+esrlt0#>lHu1|@}eTS4#yeGpZ zNmgeG%5DL8>Dk+1|$WfVPNQxjuDXV?r><4u6Mlm{q$eIyViVS&02go zbI#uT*-sR=1711Wkrdi@F(P34Qj*G=$R-uLU*N|Xc?27o1|`lK0pycaHdD^F-s=*7 z9CU)u26fRY3@9~?f7UiNt{=3AS{3DlV{>nJSH0Vp2AiAKnFq-bmY_h*b8f4MhxQ^cgtw)(Sf3Mbaig1cbv?#uQHi>-M7we>R zTR=;wqUvirGE0m$#TQx5oF3of@aMkEmdbv>qLU>i*rrjwY#p)f9r7`@dacxZib@a= z#A)&v5SfvVoOPaCJHWJ{M61u=9-Lge1XSkl>42tDngJw^5?WJ00^N|wOkGf~Zv7Oo zeS*rcz$z>SPQLe9fOXI-^N-OETfCkgD+QP4X$Mf4_*cP;=+^CQz60>imP=gawyEM& zyA0dglKq#~J=Sf=*(xtKO}md#cT=t86S>g9hXialf|y9Z ze+xYJe-(HrAfkpe#rgR-&CZnW znQ7yr=mv;ML&K_f;1htzAm*>5qe{}Hhf!L2&^Z*HW;0Lx=@l<_tv*7=fxLK$0eyUI zt*JPvqu)upRzrm$yAb}Cso(js)bNXS?Lr+FA%mkv!1YaOvAuq93c*SowT+g^!s+`H z&&&@POA|Y5K@EQB5b8bnT2s;S@WUO)F&ha>WSQJ2SGsw4J55PFn4tKby=9*` zr3B8KZtYvjk!_07%_tM6S7sulVH$<7mjm3f!VGI9*l};79x=$mIn7W?923SU?@4%j zL!fiNW+h8Hrv-n72*38Fw3%EnZ*G2wO_#g?f*O%m#V6iSziQ>fKO)=fLWs#FGP2Fw z%Vqi+D^#63e zmJO>~RAdv8^g8aOizP!(u(CTe{0Bku>y+@%T45m6t%8OhqIfYeS8c zW`)q_g29~5<{?(N>5As}D)+fg=S}_~Hx=pR^(uAk7XtDTT zYNjLb<^PoV353dblLK%=be{f}a;AR1bgCOGd#2<=SV#mKGhNv zIZ|oW2*w$3 z?y?GHf_1~7+Rc=Y7QcqL%M`6bYdvTDw_{YhaObDp>dHGU{`=86Ob>D}BI@VpJ24_g z5WRfM{!`@WSxkl##lY6H7|HGd#32F)3HLeUPUG|-8c#;o!>F!ZWtJRdRp%*+ta61KgCU_ zU+!!aDrFpBwcij!L0-5ve6Wt}yB05>epch_WWmPsM1JFg?dMfiH{SZ*=X;Llwb26X z2~;zGs)t?d=P}RE4*H%b1Vjazi~swqOZ^9GM}o(r@=XvoNm`sGPefwd@;k?(7Fhq= zKIYVx2mMcC24rjDfR%2TH}ThnBS~(Yxv3x1cIx^B62vZ`yfP$%M~U*nhLGH?)Ucke zaW!XjkFt*HS7`5#{)9pIw~4v0oX3ezPGZf0nhQV3qt>xn^s)R}HTIWkA7|uvQCzV5 zVYX;i$}AQ;mh_pVS#WkTydE<5cpJfG)l+hOkZDe*5l& z2Fr3E%&yk|6-xF)7(yqwoat3lWj^#;cK0%&Zk$3(U<(c@5s!MBhGtL@(Qd&(J)X+qr z=}dv#!39s1sb<zDfWo)aeM zCC#s>9|)*ME!j+)tW@t*U45~r3OLa1IfK5nnO}E-uU= z)33>60E;Rb!3&a+Ho8@W{jQ>lI#uL)nqu8~G~qz%DFI-VqdEtrL=Q{2kSrDQSf844 zM14UjZC(bgsATKe@{8fV%f-7XT`Ly>wF2$VQ?Ipa3uq(6zr87x z2x8y++M+3pmXKLzNjXFbR!CG~Q!y?4ea0zm_cf}nOv|)?BW~kr2Wm11gYd3}Onkh^o z)?~^^fjjuwrit@SROg`f*e1M8vj<=K3>1<}c}z_(#ksmG^}#-c`ngXqrnf%ro$3!F z_rlk*_p)t5A17S3oBP)@Wm;oVr*1qlz60NwGn;L9r_P&yj8)+>++|r)moQZ!K)ewQi!&h+9Uz(PkSvWdt$JH7$IY`rB|%;zJpBipx(0W+r$4t{L8}>m zqEL4*k170Vt`L8Pk4q(5n{Y}CXSLWawxsW97i5hDCC!3l6F03XoRj@XATqcs+*4Fv zEHSzA1UfI_jOrSqq;KS4df7H#b@3Y6fZzD~FK@)<|j zHVQ5<1%;6@bz})3@)-PYS70_!}Hd9YQ ziwR~-{2GgH#E_OZgW2NpqSPRGW?E&hM>P&hzwYU@)yWN-JhXaZy5lX`2!~-TQ;v2J zQ!2<9u6fWQ#QyO+IqhW!R+Z%#aM63OVi$?*;yCgH=uID>YsjPVMLGVQ^wqIuSF3Y3 zY&|`ta`T)MtVC$+Ecfi#%*Hg8+kf)4KR-X}?H)YphAmV7+v}12N3W*{=#_JyG0HNf zXLX)T6tZ3Fn)RB{sp73N7Vgs*p>4uX{!T16rlyc?iLqkkh!<}9OHuoF8BPV*lir** zOGg@ajDbEOJxAQ%z6P$i5q(1akxqjQZ?cTD{;+eN@xAdy&4}s4{FxjQ&))b}Fq-qG zkCOADw2ae!Sfp|58PE9B622c2(beZa=1RXI8J&p1cPVVBwVhk3dzkck@bZVQDic4c&x zqU40%zxG?9vWqO$Fzj?hd@uggaRYfU zTkpgn>yr2=8c5DNr3tOyzK|vGr7YuTm-Q&X;x{~1){f1c)~X0nJ*G(bQ=U8gg|UpL z$7L^Pv+W!HnoYx}mgtynLcf zq<4FKG^CbF!VgrS=B=SL$E)5n=Xo@NlxMcPvkSOJmO|q^fw}W_ll79Uqm<~yX{GN~ zqv+(d%To$jZ1Jd$W{P6VitXgn;Q~LW-8A?4hJZD=p)%R|O+Yoqv(xXd?z7R!XE)`kw$Z3;(E0MQ9w zAxOpxHs@*N;h!}fYvnxjlG0!*7`rlJE!`0)a-h}V=&|?seo#L+ov2&g)SZeXB`O;E zHn>-N(;5s9V=DrU!^lcwdhHFuB)06_=l>GJe4_U(`6!EB)wOHQ^e}N2KrM`2Kz>&D z=?{L}0&>n%ANFL~9I5i=yp_5d+uA;g-0atQ?&gMH!F{isry8Jd_qw7vx-uM^Fj5WO z$jpbcv1U$mEM;SDqMvgJY*N`4dwJiNxTy>do=S9yEAcAl2_XkLQbm3Sv8^{OpUKD2 z3S(O(JKeq%^@wGmw++#5vST?6K+;G%J^j156G-^4#T}_v;PrItk92JBEV1M){Mq#A z?Jkz@?GIN&qw8q)y%<;Iyc>kDgZlNmS~Rkj5bJSULHd%5Cd_YO%p{XDTpXoupr_Vi z?KC#o29Xu-MZ@piG6<(oQ~BYQ3+Kf)zY)@F$LO{x`fDodaV=DjjFG+1s%tFrm9TCB z(holoH=#@|lB!vK=`7C(4$a?-n5-#l=#i0!b~fOKIOW9-j^;&2NDUrYw)mwb{viJlwWBr{_wLCZY`*LU#BN_+%gd|9)UGm`>~^Oy{w471m( z1~3}PxdsVp+C7NY&;zu{Sp68&ahim)0H+AStmCu(6=|UpHOjH{wx?-rI2Sj z)EWA`O9L{osDeu`7@^8QpG6ftECK-=248KBK=bCF&hbJP+kc#ui4i)|qFVdTfZJo* zrbV{O0RC-d!yjmk(5kYxO@pQ<^Y_>Gi+8)!vlASu|Lkuf|BIAgRBy+TxGb~}7kyeo zNcw6A^6TwIp3bgbJ&{k2HpWAk@@{%ywN_Z6RfL?JnRZ0fld*7UU^z3Pg&>aKxme4y zwXm$&^HH^3y_T!5Z_9RS1=FtkY&ehdPPtBQ!A}ja+J04i9nd;sM0yfiCHN%cWMSx% zn$DIWV>Cvnc0oPJDkXrO&bR#!M=bGN5vCfcDDz+jm20EAb41ys&~(2i1Y_dWLYOhXRTfpk=53r)Q4^6~ z7Umm`!r)M63|WG4xO`q;>2`Degar|)ph-fK*2wIe==$;6w>s2PC!wUBa`<}GSv1Vi zaCK)Dhgx(^hS_TEsscFYz=yj+Q@KnTqKL3%Vq4Mc-F(lr(3Hj-S@Ay9D;{@$?=N=0 zUo+C@vwZVW-x;--)fN?5F+HK}75yMC*C+$zbszljFjokX-|!io(-GTT^fCU0seVKG zgGF;(>rQiIs5xC0(N%x2aC~8S&CSz|Y2S!sYdmZApjUOFmBqGA575eLX;o6s@N2xu zJu+E1gjn0*{MF%gMaKTe+s{;jSqxi={Dosd_e4;Ftjd)#2__Pap(lLkhw0+b^kGS# zN9BDwXfcnxho%gN;RkjN`IyTBJmAdS)_+wVw|wc%4+)!B=51Hjib6-WKbv>;NzG`7 zK%p??Z)(~UNvX`|ay(zZymBOX>bnk-3N|6d!!e#Ge$a02gej3S&Kkgs=%U8tOk4%o z5zl29rd3B^R&?)iV(Is7q)S(Xc0GTxX%B!W+9%GpC$h_j8`tZAWWe{H+-V zt?yv{h@|7!L)>neVGPPdU}SFgAZ+Mn*RSxLfJdqa>E_YD<=G{`uI(zb&auD%PsCRf z#gf1^Xb|W+p&t4ophxTSLrBExsJHdXyyx3)lykCgc&NeVH}LwKdTKS5@|V3B-ZX+X zTU3T}`1+(avr7i%V;|lD`A|%8lLQiqDX`yCy92=tm&sYetZ4PfiK3Anp!L=Lbz&26RTs{c+X6N_&li|m(6o=*37zW;Dw z&5$tY*}5w#=r#03^dSBOrUSq zhEnY7beRzor*6LDR0b0Uk8n2!%`H*3{uw9E!9U&qr?>xm_K!-E#da5Or!mkPLCiWO zp&%b-HOKo3t@Y4{3#mU9b5UP4gH_K3@W)1#a6v0ELwnhXX{?;SWev*sX(?FQn*a*H zqBmP+jfL?#hDBG2>sMQ^h*R8j<8B~7OSg*MH_LBaK|H~wMCQ4<{P?Q%3i^DXPN2hG z-?USd@Sg_D)vCS0+jrnoEld-O?$N0D(Vb{krKUz`R_fc?RZf8uHpxXAE=LqudT@7! z+W*q1FIknY{j^yQ@p(AofSXOdaeXhU1R0Yoy)O$Fq>56HF#)`4ij6#sisn@0RKZa> z2LaMk3`ih(Mvv8$$HH|x(F(i?O}b{^tP4n0yyzNt%M7*uUcf~SyD!tLYklfuID=mv zd(*_Gq#0T^^e1)5+{i0KR3(jEOvLR5+|75lvulluK^*)hE+xlZ^`G2dv z&VOw3)>V?1I*`;qF2Z;B_QUOF_gzD(BjG#4o%a^g8(&8Jak5T}j34M($J)&)6Lpi~ z4${S`YwX*esd0$lY>XI2lxB5vQ@bO6@4tDbBsJ$APm0l^Yo$A!5W1O3#=z325@MX* zJ%y+4O5&#~CE9{)9R{+uJVNTA88(c@n7R)F*Ah(Aio+h`T0X^ZG)%}(DY!PU3ro{x z&u@S6wY$!!Sd3IB)_z4oG=i&s)9D4G`mzyTqa41KQnen~a@F7LWREmjYXJSo}RZ=Lm> zdbf6ey(o+27IYp{KOMOLSc>OeDEK29y73&lL0w^glPtlJbwndT>6=ccY3^CJxW%gx zi3}Oho|^aNAHvJrRBhhFbj|`_wIoeVdYw%P-xHPbmv_vM=7{jyQc9h1+jv3#0o#hw7zex4~)X@kBy;rVL#;%hT<}8|(-uS{E_I;=!Eyitc`s+sr?AllFvtwoqP{^xuKV#$N zdbIXevtn=DC@1whKE2PKb$2 zzmVTR7|(A;Vj-4nWjz1nniXI0$A<~d$ezmE8ziKcarkZ=oeVMsJYHd2tABt0q|ZGz zctcmND;ale)-PJx@;#d$uE+8N-u_}k3O(IFF0Y>?ss5(}%iH;ws++kw@|!U31Xm$P zw{X+Ph-~raqB|pqwxa3Pa&cd*!uB2O*>p%?vdOP^qddW2oqGGuDSd#Ql5;bh!>YRb z19zOD|LBi?E(MD~WnOIK=a@KEiq00VKkJevvXJ7`h%6bcsm1p&XS_mDHos-(XQJ!8 zdPdySadQ#23hHc>5iza)!O#UA-ThwW9Z#^~3|{rQw;-G&=H13@=dr|mWT@X~$egNhdGK z1xFB%+Mfvd+7xp->giH>B^O~R|#`8+rJ=di6Z=z3B6ZEQpxs-%Y`0sbeL6V!oQJ{#4CG}vuI zkxaq{@pYh9Cc}C#qt5AOhg+%||2tjRd9uq;0_UM;r=)jYpRwzMy(v2DsL*wTwxxIHLyRVRN8rt{88lxdHW+r+q0IGc0dyJ*}ekwV$)#CCB{2h&F_sUV5jpsziCGhay1l zsvg^C{L`PGLe#7@*Vq7qQ}g6OGL=V$&>hfhHEtH|!DXj;+KG+x^0O{&I|U*cE~>$h zqxr_J%n%!7(i*<=6a}ZrZBadDt9^*TfQ~IV?!#PX$J-|m85EkB4Y&4Jz;CZ7XtYs9 z&)v`-Z4`oRkoPZHA1$+Kw_XdD>o+Nia!A$8t=9L&2^(sb;eMej$rcsNu+FpQ>@*!EIVrbU zfP5zxq4}B`IQ=Z>>4-?{voq_Y5fK|-bnx7AaEKLM{lgqUd zdbQ&HQmD8SNuxK5RWM5**FFW^sN z@>1KhZ&ZF-V|IVQc&_B^vXtkuVnGbX4It+QBm^y4F+3kXpT`&;58ZK8$^aW0z=G+b z=1xj-k^3wu2}}%KQ97=ltSc_tqU_+uWs>;n*iF`g`~GH$+9f~chN6JPEV1$WHOlSV z<|4n30;0*{?s0bveYkOhGn;T@ANKHo$r>$GN5#mv{22O2K0*rC?ZaJ_FnofI)%7fh zU|JRxvh*yihEkln0XWS)#lg#@`V7UeyVW>y=+f{Ts-`MTmvTM?!qbj~L8CwfXB5k~ z{SG`zly_UH*=(&Bqh^JE;q@}WQmHFN%OLLRR2k8msvir3;R8Ik!0vB%3*bJ}=~HEY zk2xnFe}P?BNYJXpo#i}nv4I&sVLEFd$taqt?RW67E=G%Uf_6-g?j%34enJ(5s_G3d zLA{;n;m;RX2pTXEji2p{AekO^eZi)P625%SJ`|K2aQ{WTtFU5E_4nZAM%*25;rsN^ zz~!*?=$H*Mt2=|4zC%A@$BW>VzA&~jaQR=4l+4Nh&9Xt?zHzt%WT#URoxB=O*D z`>9riw(+aYuh?XIl<-kQeP3JzES4frh#AfbWvV}u~O@tBrwz5k2teUHb;j; zvu%F7AGPms>utT(z6MXv!bu$a3uaK<`>V#)AXe1OEJ20XJ!E%@p~tTLFm(}&pM$U~ zb*j{B4~r9h2s+Ij`&8ydKL%AMfQ0Dvb;?O+W!3WlWKN`}xKIpEZx&rWZ;3A6p!%`Q zp&V|?!ntO$C0t37yPvO@(Uhcc)^i6TIcTP2;TkQK%JbW<3@lnJm z(d^*W?|H5$GtygRy0TGLwHep;S)u({{?ghfnbC2|PWIgl&csuBsA+&Mc+OFPBF+RK zuUncPTW~lYh`qrBPTitcW(IPZqgbm}Px~NpZ7Vk0m z+o;8_irPDxi)i~YdsE>mC3G|F)Sz=Dr6q8LV)xgvm&j%WuT@8cT;b&(Y&SIuq{}wcS9Als)bg8 z!_f?wC>rU!+A)OnSvjhk6mHL4h#rO)>VceDQFir0+)9vMca)^5Vlvilp%G>^Q3%g~ z+Uc;#vgI?5R!<6jK}vM7p$rz_o27>8OoFyVq;YbwdOQKOanDo@u$wYo2q|Z9htm^8 z23k`OLMy?o%j$bY0}L-}^(|DF=kaWgzl^MeiQc#y+s=62R>s}2y;907NA`P)fq41B zx^(J$4MojlD_3J$RsMt4?!qMhlx6DwS(dw4hKpdAe!jO|aa6wTzQ5FVa~7jZX0oEa zi8}d}(wahD?hm^?cMBJ)ww4*wd{%1G&cmXOx{Zth*j92>pGYZMtPb#RR`>96D&%IR zfQ$+gI@-N?lr^X?*p(H%jE1}`#6T%dszCzjC9(ZPuefM!_Fjn)Yf4CQ$EbV~d|f|; zuT9FRjf3WCrZ!ddQf*6K8^z8d{*0l+`n#&~Md`iuv8_g|$s?;OFI1>Ywa)XVPeb~S zfLFshpNj&#vCP?<)AI4lBqF#N35-c|%l4}VHKAlErslE$C!Ur}68@KwsombV)}dK5 zo;g8~UEyczq#o7g0{W*vj1^=nvU44d0Jh6jXnWIQad>-B+86+!-p`f+VfhNL`h3LbOLX zmk(uDaB*4ZH3@l37WR7wlQg+BquR!0TPLr1^aPf*| z@LcuCEWHEi@Co}^^t(6xz)+yd*`HqQzGlX6USZa=pDk*s8iE8QznxzdR?H9Ts`{5| zL^0VG61{R)k1suc2ZNXsc52x1$;}qrM^BJDp(q?fA5}%+Qxn$&&)v_gTE*9ILCQYIxtF+?mm0UmHFAzj(`&{)SR=t- zC>?E|jOx3Ok58W5Tqb$mXlm`WAg!xy6o1X&GJ1{FhcyqRZ?kc$ro0YK{telwE{YeLhPNhc=Ex4Nuo*RIE znsTL4U_{o9Gb8xh@63E}S`0Uw`9I!hem|n7)!0!gJ8Hctbrh8qwVf<=0~y}&9Nzaf zz)ddz|Mp*%EdO!L%-k)7YlHkN{>OLYORUEyH})GdD6||>A?{Dy7yc2e+hdK4r7xXq zmbUG&@R1iq3$4%Ni-124PIm+kL8ezCLm0nFzu~_AVa&QKm8t`zXT$Ari{%Gpu**G5 z{_xW%H+SKLu!jqQ|6zaze2}6<3E`AZJ*c?>G|4590I=Jco8vRxU%sR8r`3wIC)0cv*YEG1ADSA1Q;JN&u0m;77*E$4*dtAUm;Qnjb}< zVn#F~;F31Y`x>~L-W|kb05MCSiS+n0(s^5c6W^qtf3YV1Gi5gJQMM^OzWm3tKNknR z^JMQ$cIqM8r(H=A1W#+55iy8cj2+Xyatwik7#B|eMFtuhy)@}{5V79ajV7*fpS|`U zA;#Q{gX$Up1Y%ps{4wDib!2u$jZ#VuQ?hv_tv(k7Z0lSTK65Lwe5Hs?tbIMldW zCHi9qRrstByD(w+kIf4I(Rxi8-|_=PO;YOM3q{UEjC= z0~8B#ZK7^`@LQ2co#;H`$FuF#JG?yZyt5MRs28RI@91!IZT+rMl_fbVf19e>S@7_i zYw@N}T*7pUPvqkHN{3g#t^cl9tbJKbU{$BRcANRjA>ulNjUOU|oU4|Y=NKA|NWKD; zC&D-Enc9TXyCDXd-rs~FFQa|0rKU_sJKdSza0L|&=%iymTc>X*=V}{q3O0sHPAL81 zM^d#%d?$;W{pHQ67>x1JDm@<-%k_3xmtvhqg8r$_=#*MX$25-s6!p|^GEA*q3GB^h zoUEok(7eC9m2E_BUwl>baFq8$gO!bZHoQgh*;Ep(|~>nts91zp7i&EawR}VUA+p!Njh3+C8a*3zp;= zaUv|9DWQ-m*{l*!P$QARH~N!ZO|3LxbOBoU;4*xu|03HPDGx*KHrYR0>99#Wm!(Zd zxnri51B4JXh1MVYTg#Yrhpnz2!vSX!THIiJbJ&jY?d%DPAuBPR4#`lVwscHp+-NLA(#Gw*BcritiDzHoP6Y108>zeLLXT5^Z5aRJ zJMZ-y6~Rk=m_VG=T-*yz`<;CxXT;jMJr^e2&TW2Na?-hJ2}UbpR=DJC(jD{3kXCDc z9POY1psKL=B}7%nCU0`4Yl>hl?d8%_^(XC|`3bc2>Vf;l8pFAvCGOtPUYH^o!gy@# zK9J&FeXz>ZRvLhcSelFlgES8iQtBVx@TD}1VOWP5e5h_rS|S_u`*GmJi|FBAXw7hU zSP@N!!_qO4FWtuw*rebm{G*2YbsN7plRc=}Y>OZFG|cna+T%b?SuFzdVe#iK%ECBm z7TK6Hdwt(d44!s{fIsobAl}S^qcdx~eQb_JDN_;)`aF#uThcT=eBMbv)>x5?-@XCh zN(HCC0em#$K@|3>CS)IV@Suo~3Jw(*U}~}Z%Z)T4x7UEI)(C@Ixu;-uQz{)x^8NbW zga``lWU!qx6|g18Oa!r*|72K?G(f<3QQCcLeq|vVPp{s&UH-dSahnQ=5qtaoz)&pw z$nPRUgvo+k1dH~@;Xw@or)<_0j%ut`_tI4}nJ65(yz2H?KPjSBw;_7_m)r8O>^}~d zOU$kJXd~F-VZQSs$A6bQJgN>KMRs(*_htF%WR`j5)6lVhC@t?2ZzEWKmE^en;L8NP z>(_!`=Ntx!8-unNy~)OTLi4{oop^dy+Ye+jXwdmXVu2l9PJCu-`BoHnbr+C&f=9{q zAr|f1rF0^N>L258%W)^ZfA}eGn~T&Xs4R}{qBs5^RUf^lR!GlTwkBg-0CUHVt~E0Y z6(XZMyI#I~px-HOt$SS<^Q&u!KLEYK_ONpbfO`(|Dk?mXg9^Hqy}9gqm3c?$$ zv-XP*=@kN34yCSTo{BX+|4k~7&)|eR^x7yXU+p8EirZD;la(sM(mPVO-34|8y?1?Y z-m96~&*fV`z$d;=i6<^aJ1?UqpscBwfZ!C{jJUalmC9I;$@{dyvT5yN@DbaR^m_}8 zGxHzAA7e|Icqcz=1QdF>ZXoYV8YMEYJ+3S5OA<-uifFHWd=L9My3XFEwH%{zPqH8r z!vd)6CFS+zk^o~AVd}xB2=IO?IDP}8;>k%k%;IJ22TvHngeg_pvNVS-xJ*R0 zWWDV73)JA2UAW%?Zi<7McJT1J&jG{PqqrEfSff7F9%%Nw6to!gjThUyzd4ev)9qbY zx#vSslTiL(RpSs%+`QL<%*3iTk@eN;O5j1I=;c$i(rcmDS+~2CyNK*oAFuE7iB+@F zNYLbEn+JmbBqiVhjRHc^2g!(7xygEn?6t@Vmxk~{-njqHd)+U}7Apnvy5?H+J8G!% zn*rFr|L3mm)rxTbMXUes$8(6g#)jfBV8sJp<|X@5E833l30}Ck%8~|XggnlRHh|k) z--qT+D`V+6PVmOQTvgq+;n8+p^!>#R=T={|%D4f5Cc!9z{(drev8vC@z%q;|Izy;} zxYRh9x~^1$B-^Tcip_R!A>64z*;7Wr)@<)pi!g6DVY7L$J1=ac@P~A1!wbjTmsU}} z8sQZmXDIMCt?*Y)MxRQ$UWrBLj`NsyejsIB3|F_ykC36DKWOjBjPW=S$J)6SnOPf-TAea<`CsE7^l{NSP4u0D?ipzlQSdmCAXao)^=^J?|agF z+hC%l_5AwgX6pzSg>TQ$<+L77G`R z$wKhy#?yNHD#yr0ruA=(C|%?De9w9mQhXAd9TiN37plY(COF*ZFET2WU}MrDevCzqU;m z8ll9VMnEzIAMi-%1cL$#BQi1V`^r*mT2~_}%f!DgQX?pDF`(DXQ;U zuB2~&W1dw&e493R$!|SYM%|XbdvO~^ru=;4OOUM=p3Ap$u5 zlH!@fX4(~{#>toaMIywgIw9hI%OpU{%4=2puPVi`_2YOF-BopXQ zIWJsy#T|D&5BLGhzoKm<8WQ+i*;1N`KVvUwt;&<<&^(GuDM0~LHf@CVOXl92LpF%m zP|0KNDhk}+bOzY9_Z7)_R@3>KMRLF&Tc^^6rX{4u`~(Gr#yo7@*WS3{sV1UAA4=xm zYdmJNH2HE(-4L*Wxv$^yOf!B}P0N>=++#H`?rdU~mJ^{lyqByB$CLn%(yZ|vT*pNw`K&;NJI=h#3M!|B!wW(eh^1VX* z)(y%*v6?|vo?4b5N+|>xfC?f4?Z44p-STF~eF8F~*Q$_Y6~IiO(LtebFZMGFtk@b# znX)~DavqKe9=?+KS*C$FC*~hi+1CP%UIA>!MDotc%lvc_oXpj-8>kw1h>I8_b(1pp z{Eh>$PQJ9?QSQ&egIC(msE@i@R&FS*zmuW-rS0N9A&Yg1bl{b@9NC_~jc?a;X-yHs z6`<>XU^O+oe_^#s@;{F`BNacs{`1o1rtl%*8He1eB&{w1S<`o@AQ3{*?{eQlJX$NL z(*LZiGJ+7YSh0&Kdn5DXq%Gm(BrYJ+p?;JCzs-p;1~<#1_7#r@eb$Am{ixvY4>L$d z{>I(R%T5CS&+h}SCpdnY)8B~%pt7{c&t&EmUQ85;ot2o1wOi`*w5@&h54ajM+}`Qj zTKNrapsI1)Q`7P%<`ynm)4oKytn@v}pzT)JLcU1-9o{$@cW?PfT-%R8?C#j&SohPe zc6;?c{@-f9s=hWoVc(%K!C{^|y&j1(w&l9&DdFb7-$k&IvMJ$q9{|3i!rf9ADl#k^ zZLdQNFo~T+5>*!c654_4*$e8EHJ%O&UtMH5nn=wg)n?bi4pwel58llv%Ay&Z;@)TZ z*ZS^C(NefQ$jt~J?6DyC6o~u@4j&XM_M}6$A=`1&SB|4++BZ0~QZqTQz4@65yZISc z*CEd#-kFF9Wt7biLs%Z6gIa)AL+;)^ZFv)xEDp9eX7)mmlHsM`{z@AW$6A+YO z>y`7FVSlYWZBO1;-LX}acA5frBi^7^zuV-5AhO{HThz6>1D}esevc|zMu;LZP*TmV z50w*#(+@M4z3+OruU$ht<#*!=g6^#c7#uGkk80w+?>e;6TH83j_o9EJmokXQpc90% z?1`Z7x7g$0UaU~j`tK-mB!^R6u>(!?wi(9Id;{@k{yp^lJZ`Buk(GPcjYim~8 zEH7Pj@6jQl(0$MlfS+pM&Vo{Ibsf1a!%qD-I`%qMBfbsi&1_bs)Nc^70J*SQ9O_1b zi?V%*a~{GU!kMPHorarsHtuLIImMGYDn$8^I1qkY>Dg-2Cx_Q#9>+gj-WPN6GoY!W zx+VcLEBS(dw*6$ErP2R9{(Z77C;hBp$(=Hw(N~~2wtGoVKu2JlYvOh+{IC+;)zosM z58}!A)y=o5{ju_?!l_8|h8qp_knd1BuY!H%S2z0D=}kF|C>{%h^F$=F=#17oxQq>G zCp?Q6HXNN#W)GPhwxk+N`#6AQ>Y9{oe~TYFyke2#=Pvz{^6W(0KH2|)+OVtQ)S&}@ z3>6kD7mK)O`S=V4hkiU;TQRK73Nf0wMJ$}?2DQ2Q-MBThS_)(Pi@DA)Ilits@yPD@ zIb0IXCX27vAnNLh#zZW?^w1`J{LXm?>EpQP;lB}YS2Qkor@LKnD=aq8+mrC|ed6xk z`GP~ZqE=XjP&v6EiO{*|<4M$!H|IWEJ3^oK9%M! zoq5j9*%V5j1c({Tt#K#~6#`C)c*J??b0yhy4X*KR#v#&crR{|US_CYO1XmW3OI*%lhr7fi&2f6tiUp`!;Q3zk; zij-ib-Y*?>QO<-a7X|UWB#Orr#aidF>P6qK*p*uO(}<4~=B+%smW)a&d0ijJ9Hl-N zlvQ92!4&#VERtk`_r!f7k1_{BCtcM}aHgb(5<0*BQ#vwJ>Z8YXZeJ48k2BJB`HTDb z+N-kr=*5hY{vquf7_U1=+a^aZ4NC2(R!4HOG0rc*T(T-+#SoC zsrNJ00yGH&f|{()#yn64)={h|dy>m+2(zNVYm|oGN*qkbXPILf{Ij;0=6Cb6^p`Dx zZpos6ZwYdPZc2c@I#ijxGsA9Hfd4?0uQ29Ya;$cCmD{L2!Q@cN|RX zOOR^l|LbuA)Qc{5Y<&i0PgQ(v3iyxY%um=T6J=pj)WwfQ@b?#y+`>O^wftJxJ&G)5DuN0=UZspS#SzHQ~kouL;bq zNuR|YiDhQsEb#z|rdK!S*`@NSxzptWV+-76%QouH*F+&H=%DUMmih0AK^1(m-rb+u z-af$a657xfJklC!mQL=fml`5kI_?;K}l^ z?A}BTn!lb*X%Eom8hWBf(~X+;emXf#17%2#sR$%yBYP}O8DEZ^q)(81p%~EhuzdPli^xPoYYwEWT*$SZ3NGt={(X)-wm0kpJ z5{U0{;3FVI>`5Y3`6BG29xfUF7%!#44wcn|75lDk5jE4Du5(0Qjt|9xqai8zq0pYA zVIBpjjq2ARJ&(tqhQEe@j=#D7C6q4 z=Vx%Gl5Mp_Wl^CXZCl4;&a2Lr4{z~Wa`Xa4Dfvtg)mxVPD`jYzj($YJDoO=AL3-}@n<`RHjQIw;gDCNxh z!ov{~Foq&5{9xW?qI%po&w_8uuBG-u8SK(@8PY~llHV6z5m~I`Mdao0M%M&$7wJOc1-y8DM|nGqnS?WCb7Hi}{{J8+K{6 z-IA%7X#lKSZ(5JKTbA!WHo_`nUyd1s$Xm3o9U zgXPaZUo%*l#?!2*cMBCQEOv@b-ZaBq1jfiJgtJ&V!hIGjsg$LqfN2{qXDM!L92xMR z7rpLodPc?ar$*wzJzlM2&3?IV5T7g)|BkyHhfo0 z#5L~a&mc~Zco(2;mdbQ(baj8>XEEvQ(6qsSdFA<5GHpy+xFOU1&PHZY^6-5=B;`Ek zSy07!lgxUFg}5_EER%u#PISGWegAXEh3mN;|+J!*){hTO~%!@g(Jl47W-DFZ_FI!g(dZA!%2sy~Ax z1vcxxqn6uY6|}2ENcrWqW5=mqie3&%a_|;jOXsm2(jFd(5O3jO4Q**?8St+2Zm)81 z)|ysgJ>W?`(2VlJ{=EFt^||II|ir_iEfP zY*O%Hyc$h1V@m!Rld0Um&?s$gl(t)Sc@*o4zt!SAcx%H82bmD>WJ z?^)RceirG+|3}kzhqK{+Z)>%*W@~S4DQdPgVpF?SirQNhvG-n8dylrX_GnQ-YQ!E@ zBSn$ejS++f5o(i2yy@rrd-Dg^CAlt1p65BwIrn{^`v5iXZ`W`oLo6papu9Qusl1`O z&owcyFdO?zqHV+~wcU@rp0oQbZns;jCju`QqAxw4f0WI(nfNK4Hu5fM{IS^dw%*a+ zLTbsynf}E=-l^l>^3r0)f7pcB|ERn!VJ=YC7qPdc1)BX!Np8_VB_j>;$nVd2)q0uA zz7OBHSz_z@WGY*A*P`NPOU5;M!A${rrQV#kmHo-~8Ld+T4I0oQVOR&fQs!m^5Shj) zUhE@;-R$dMI;$v%?O$3cFR)NAJK1vn4LfWk>`ep5Z}mg`n;pwhTa}AGYjb_DbVA+_ z9rPcOy9`Uyy`IyAb)$f;0ZWZ&sfXLd7}WeMXl!*TOzQ9%fTF%QYPb)juXW|t&6b~i zZnASVj`53~6zYKIUg4X2zFl|9*ps(+qc4Lqgl2tZfxmtXLu2WcWw#;XSQVB{Tv3!a zym!y@_T2C<`)ruIW{6BaO33CNSGs|>kc7!M>BVC;d@5^fS+7-s8k)0Rf<7p-;<&;y z5#O0J0-4L7J%{i=<{F0N*RyJOC|9(9mg5}09=Hj4P)9$bjd?M#RxS81<{x|&Q4amP z$Ijr!J<+RlgTZq~W_Kt7e8J^xT#C;*|2CowJu3TYVJx**0VsDLXJYZd+ICPxmYi|@ zL59)(xkNx<(%k9QSFBns-_|K=zaM~Eyf^+X!!=!TYxSgizCA)ZNRgmO(c+~&4fMmm z9GB&;>fH}}Zq-J{E$Q+toR!34E6!KOJA0G24!Nuh{jol457a^KiGurLKZwn<&SVSP zJFq2pZa+zCMEmjT;596(Vzjs&N1Wn(f2h^!*7siT4i7>#gh#*eWfZtq(#z&3FTCTy zOoD-GJ`B{!KJi;9Pf?tEbt=s8HG9;QYv|$d?a_wNVvjkknwF`;{F+)%`JKXzHi}N` zPnC2N!Lp6tRL2_5W!t)2+p4rB zybc?rUwQKe^!?9R!9MsBcl}~6I`WX@&_|-k2KI={P@mm)w4Vk)ZCW|UaEwUVnL4Dn z^K_RaK~_o8=DCnFt&b?K5d9BDm1X*09wd05KZ9*ci-a&fU!zT#V$|o}biNvCb@71# z1=qXP;reJ%kD(*kw`)SB{n2AZb?>8erv2%R4_spnDa55aty$TB!v50smZb$WWwp=? z@_Rtv(g{{_ERF*kG_@aBw)77HyWVqtlbYZgV{wj#}rQ;8^_IrEB02j{jDPv1#Wf+&05e%#DCAJa;!S<)+- z1#}K957my2tKZW0384NoYeXkaQ8V8fAbnDAo``*+6l_pxvb{BQG%Egm+JAhgjeTnM z!^qCShwSio@=_$!_)K|m;5#iIy@H6b_c!VOp61p-o+C_IRmX{AaT!u7dY?4XWFT{o zc-OSfGR9ebjsD*bb>RPB1TK6}Lrl2zF?da~q0m>-Vm#>P%2J<%aXJRr=4_%N3=qHa zsh*p287}NwmE23f^2mxon#o?l0AkvaH&lnt%X5F($Dn}kCVsOL<)c>H2Vl`o)%VDB z1@5fD9%bKgmr87Du}}T82lW1)X&Pm}^3cmT@pp9jL0PBrqgqF};4XgJH}##YA)8n2 zdRu^$^hel{H)4DSai5owMdJH=NmhH@dFslCQ7#d- zxVv0aT6`Xj_9AJH8T?!>raq`1xwfy$^j<-mbug0?<;8`j+Y=6~ld`dOxY;zdpj@i8 z_uTE)3$GKuN{y|sQFKN~{~$xjE5H;C)JwKe^W#)|f`Ix~!XLqXyAnJ#i2%B!>WBH@ z)^u;V%RldCmImgpdwk)`cx7Ir423v+5>SM`TFtE&$XJB@j2|^{dJqIZwG_8JS~hfS z@<_$NObD-MHLr^JK_81TULO>#@s*|He%EKPu-k^BTih?&TcIbey!-gb5!c5yFsrVz zSwBM>xv@AwYLO0FCqSbw(CTrPdl7TsRYu-RSpoh0IN6LWXSoU1G3w+_;F9~Xd~rB2 z^x{lgWq>hLWn?aJTKhkGN$Y>y;g6@f3Z(VY@(;Xi+nE&-&jWrB1c_Cboop7mL&=jl zXGQw$U9MOr_Ae=ZJ}xf^3sCpx-$cG&y=FB%u5($>C2pB=LLV%;B+9wns0lz;@2n13 zdTOQEaQy<3GSdkvtjh8|vl{(>LbiO`22|hxSbZsQ_>Y33<;$qJ_b?h~(qQu(OuL1hhSD(DynwvyYRU|_;gYl#^ z5^{azTJl&Xt2W;}$8J7QY8CD-N0nVFA(TD=_Rl5_Zx(HDId>J4X+Kd>fGYng}K-pFu@ zA@qhiuKD*ibncmM17ew8jQp+8lPWY{%1o1;8sCj<{s)~lhRybaf#zA7fzF}2AE)g= z6+4}qFF1j5ccJ$?isOv|`x!`L$=T2)o_g^d621Df-(RAW;|bTHyRgewP-<%W#I=!<^SlM4^H!*h$JYm&K z_=4+nM2laPT;f?}4}ZmwLe78U%mUs z(?P51F9@;V2PuRP7q2MV)umhapd(-+Q@4c2z^?*vEk*aM@)!Ccxv9?c>*)Bs9-c#R zC(XnqI%6k9ool3tO;n?=_TM{gilOTs zzGAIyM3|YO?q;*Bem&*yx|eNMy3MaG4sH3{_kzeyJme)ZsNg1|)fa2ma@@VOw13Bb zaeZ%H-C^Yu=fD8n6vbcI@;xvu_C=1|rx%xV|B7AD{{kX@G94{SD}w0wTxalv3|OqU zky^}PefK0^;ZLw3r{T+~o=_LT6DM>)=V6)?ze$bg zd4l$o3MP>Y=j?SC*=_de8Ve2OVqW+5XW$*pkjpXlEs8~8pqOQIQi&a1E2w{Lba?yQ z@iX=P!1W}Jdj)#rRv9BpDT_IqZ6v~>0B2{>%Fp1wL{dlW`#lV?Caiup92GxWS#y24%$ELgT-*2D3Q_K?;`q!cfLwD zpvusO3vHY)!Io)9YmyJ0w_me3FbkO9aSHh0v+RAz!O}&Lue~G^%>9uS=7&wQj=x-+ z9&StyevE*>dT(7a`ff#dn4v8`R%GgT$lj198)Ijp)Y3HLA{IO}p#Zoy{qoKO1LwKg z_clFlzVA@yo~LU+9k7<8EB?om=~%~Iq?pY>v#HYDcO$b zUFG0gvMvuw@J}xfdwQe_c%9LD=Fohjt&A(P`UC3v*s#u_-r>{3kQo!R{SJ6+Ati#& z0(c8dVK3|_VAc6IN<~E&vR#8%ELxq(2Mhkb}trXx@HZN#cbtCU--sRav z;C1Rd6G8r;F=sN(wtRKbR<$Y&>#Bew#J&!A^k1gQn5n)9nU+2Uv4gm8_v#y!9hrmd+*e%(O5HgK5~YQt4Y}ovjEy){3g_#awwV zxA**46v4?y@cDO>f;+CDmMO!jgC|mr^oO>H#KOIJ4Qs(tz`c{ULaa9??T<Lb!GR2UF{gX;4Ml^NBDNt{TBA=SWihpq7PTgIv-3AGy+n*v z8>XI@`=GP9p3|%6TrcFb6PZ3fP6g%3aWvB{HMyh5!1B(}E(nXLtEc20P^VXp+ZfFw zK}X%9Q7E9s|04ST8Ker{$I{m%R*1a{lVjUTppSf`hkRB}z-~63&+IPxb4eSWa1EQtoHO7N!hYD18K%ENb;EGq<{dZa$j@BK{e)lK`fmc;aCTJKXn>`tNPEVH*V+dvGTW# zM?p?&?K_1d{s(T_s~6g7_$l=?(=-`uG>xKmpJ`PBoz2kUQl zPd{=h;d5wX`D1Y++n)+y2r=j}tDV zNc+!czE09n_7d7|%t_lfpJh-}$~P)%-_jC=<;(X_lFx96POVq>$?97C(j@Th8&~Z$ zsOrAli(Gi6Et+CagZju_`RkYJFdy7hw^{?9)=~qS1-^RT9`}%DX3UJzJ7j9%p~K>} z#ls4PzvyV3@8U&n@M<79xH##c!RgSsYi~}abjW0o#ClVBcWep#2i0aqAG~BS%N8*$0D*g` z%xpvNUoL}pYqeqMW6W!Kk-L@`Q^8QPvCH}90O7MQg z&1B`%_K9xM2G;(YVK>|``R?^{Ax&?K6Qf{y0GUnoLlVo2{sxfVBtP4WzQiX+{M0Yc z??VPvM$r&%^(;{wZ-k^>ig|}pBiYJ&Xo4k^5T)%=(!CIUn051<{pJZ@x8W0ioYNc))D=!Xm;xsT8dfdct?g-5@yyAGne8EiUf) zKknQjAm9?;<3E7SGH~+0lvz|xtGGQwqGe`$U}J9_o9et$8y7>Qu%wcq-SD{!m}`PZmyH-;jx2 z=TR)b^?|Vxzcp1wTD*-h$&ByUhR!^*rmL>h7fu*0x1;cvT!jx|AuTs;jzLBTKC55M zR-30-)`~lKzXL8&scm~zDg)jZLwjq#;$8eT?#Y>FKm2vq!JITHx$DsmBqE+4 ze(7O(oyCS(bKHMgX1M%RDr0%smec{y5R4=^vbcLLv~Z_up>93;|EG_e6x`nWVZxu3DDFa4XAxJ zFaOb9INca2IrUcH(DL^#mE%C1X0t{3yYM3bt(z3{*|Q1^&ExzT@(c|uPXM1OkRhbk z`F$%5

    eGXn?mXa*=L`a^a5b0NLt^07kFR{&5Ii`Mdze!wn{P+8zhF_t~?@K7bFI z>n<8$;&91eGO4#dk%S{8c%h&p$UW*pNr@ki<<4%*fI z`(H;@hShFoyn4B@)!=HsPz}v`xHWqY;9_bqI6rAf^vvYST+DF5hl@IPlOXMf7+#4# zP;_pZXntA2HLPDOFOw(WqZQh2qP)ECm9U=y2UovNVE0A_eQz}_11d{$3Yc}r1xUCy z#+@8Yk=k8d%{+BBi1eckTh<#5Ki4_-E9tNe z*LR1eu0~bSQ`!hl?d6<6Xp_xJSV5U%#=vo)kTJjpJQ-UL)~c}a`s-NDmW0!r^X^an zo{;iw6XDwC-U=sH%5rF>ihEOgRF_Q84yALpBab==#XQ=$aDvYqwJ{}$zX_H)ZebVJ zcT@OATgiPp^NAx@Si1i`jk_&#!JCDK(OX z5QViXwq3v^2LEY)1?gLhgZlgCN~{j<7bY?BCvDfgLOY85ys>9tWn|w7r#ezWws|u{lgb?Y9}LUEEImSLUsLF5_l@f;8pD zU6Dz?x~Y!O)7^ZOU+S_s#)Z36tgOmguXxj?x`Zzo0Q68-S>e_9d9>IHUx3MUxcVuU zivY(dqYH|>h%~3^duHU@3&6GJ6E3)8Gs&*-p%MRtJp!Y8_>4Y3wQu~UHhIyD{-ulZ zQ0}KbIw)C$(2tgaejge%$Di&=N)j1&kwT`^5v_Qp*nWqg}+Uj^Mp(0A{?SRKdc!?^Zy^T^aw(}8xq%(X7 zt_p?4-a{&r3Oa4kV9XX^MLjt3?I@jd^}>WfPsE|i?_)ISFBiA6hkbTm#@@X`75PTR zoJ_MB`YbT=d`z3@&2_U7aj%M4E#vmPUvo5D=ueaPnTiC0_`xZ-tF1n!ZgH+`*H&zG z;`ppDKioEe#*=sWcuQS{i>M_7QAcr#;r3pykwh{J21gq(@3m-LSubzPPSJK3dzii< z!ISdg>R>ateKVLoSx@U#wWQc1|G1y~eK5!(@ZR55Hm*+uqos$*+14)FxJcbziLKxx z81mB7a6;D?QNDSQT`K<-Trr0J^`v1t5#JrvtY50lIj8SV`j+MgbL$np+Tb4d!Q2Do z>3@E8^XV2;V_E~gQtWW%@!|nm_uD`r7>@1nh|g$U{2n~}Bz*`j|Ls2~5P|hKi^PR^ zVy;C;xSalLoi^svxo?LJ=!WPGis!P9;(rRG#g!G$ofj?buBkN9JwQ$~UU)2qEt*)y zY=7n{lsVPfv2I}LEVfG~)+wAd1P)7D2mP9Uz^33rYVR&dZ9oZrFLGv#ul;B!AU@^^~r6~2> z|4;uh*Gy~Lb-NCSA1z`#3%#runOf)x_rm`4)C&h}2W0y=!)^?D1wQj7&-Sf|crOh} zRLNf7wN1sA(6^u`EfA*X>CBPUWf)!Z5%c-9|K>z=K7p}wv1B&>wQFDmv=&I(-hRLOu~b;b8LK{Mhvm%X^W_JeAPJ*98exjy@hu7u@dyJrAyZSDYj`&(!!|he=!^sD{0$%DZ$WkYyHH3 z=E!i3Vg_BiPLz7zf}b8jhH~*Wgk1c%eQIczq4h10^jXZO{9HI}H>C^P63*u1c_Xv! z-T5EQuOdR~4*ZIz{%LJ&*Nrv1IM7Fw6GZ7K8mBhmZM)E2E0QC{KZ)jX=zg5!i!)AJ zumD!4D?17d-+NOwH|&Yl_lx1!3ZC*=+c(R}9yl4$8Gj|Ej{sQj_$)A=nlGhlrG{~B zYXr8rr=1jL1T3k-<)A;{1CZAEhyWTJs}__fWoG=iSpLLnJ?o1&p#gZ$isYoUco838 z#3MBxsSo;njeFIYtB#2CE8>3uUQ4Xg4RIh8~kX)T0PNF1SRjP{G!oKrK!sD z$G-Q5^zyHPIyqgq)^m`@TdSPZZLLq7=i$@^{`-@IEN&<32lb^ zJ0lyGER(YLX<6lUdDH^aT!BEDs{tk>Kc|>lJpH=Xq|Izo0mw7wiyido3Xw7@A^H;0 z>x&fLp!zfZDKXUlPov}PZg;0ep^5jjos`*!XV9ohhRbyco|^C!4hy#@C>I9M3`UxynCE_>e9o^xa-(q{%^jZyjV6FR&g&kGa*1CkOisD5ihgn{_Hs3jr(&s;JvnIJF4zW`WBv4ABBgpd8ob@^xqT zSsGz-YHFa>dnOsCK-tC6g?g9I1qo7#0n2Ho-uQXGWR0+|X-vFFZcFnDJh0vvsC=a( zv&U^dITadcqtmFZB*~|E#>c|4#bq#QEf;=o<*Z;jJlApmOfqo^xm6tEWq73bcQsC$ z-it?$!JB`dW{mx2GlfDJtssR$j*RVSAr<qS0+2OI?mj2e*bM9 zT#g}|1VlV^k_xUr2^^~0NQbtVG2k*o`zLcK(n1<8S-mIq+D#&#H4i#=1XIM zo=Sdc(vWs9IFa$FmuVjd??{GJ&@9-&N>K~tmD%+GebOckN;~r58Yjslin+Ed^EFbM zFJJct{nyeI%0i2~*H11ujFel?#WzqZKi)y!r1yyALL$Reii;)R&_yeD9N$c0^lNx* zZol5ib3%9I_`LmXNPX(aCu-l50x#A4&usI}%vN*t{l$Tt21^apGu`-ao-=N$N~UzK zE*D2z54l;D7zKaq?Yu?dznK)h6L|i8R;hFKy+SGT^$TA{dklr!vHVbQP|hSxXl?~) zjgQLln!}q6qniq?-mzs{Np9V2Y;3A9k2^H^^G)FZj&%7Peys`%?O}-qA&@C}^|#Z+ zUq_*r0xyQ%PQ8F?vf9K^kE^_h8lhE~;|90iLBdPh?zXaz0#smMj`4q3!Z;#M_tbSeS=!%@uCOMWb zeOcCWQ-ESdZ-Qy`34lh($m{c2M}-sr-C>dtMq4Rk@dj|QXuJOkuKzNmEge!pL2}$m z;R==Zis&+e>1CAx-q_X`DDl-v!h`O~7sDp{{#D{sFvLQ}hRf^EoUz7pKz(mMxslre zi}sYQc?GKje%KPsyX>GsxIuCtJvr?8RXOO*-N;=Z_!o zhJZOLE)hcC&;7V1eL;OGWuFs;ge7GJm&Z0zW=$FQ?NWq9)biipOwM~e@dLi^N5Zb2 zTm`MhnXQY;xGCJW;p{qVgBNaTt(jkw5CmnNeSxuTqy>yUIXpAE7nk`V?_P__;>YUU zitZql#dD2bB;{!;q6%{rL6SCR;~pFB@Y_^Cz^t2lcib+0${R@dQj!)!DDMN$?Ah#T z0;v*a;7dM8>MsH(a-xB|UH{U?hYUx9A7qX+;~1H7jTG%CQ5WTzH2C`reou)1iXJ$- zoVJ`3@0a37YzpBV^3M8N(DzS;vek1dD_$#*uv!NOzTwB8UFo3B56_Q6{|dYqhzBga zQIs$M&wO*4GTm9|V(wE_!L?#l_fD`nZ^^=2JXV8(Yi(l9Vv|vVuXcCZKR$MPT&Y)* zkjzLLCOO4wpR(PH=~Sd-`T&$;`6;DqhLWZs&81FoPy^5ekvW=ub54rHhc`qK!n*$c zc&2y+>%RyCqz-c2oBVg6;ux>}pO}fCFH+~l+s{EQye_vc7AUIW+< zpPK`0`%YJ(&aWshg_Lp1c>)Si8?%A6&3qD+Q!H1~Sq6j4A5Y3NN}$J}c~hQmqV(y} zjnYO7Sn1CMiPN#URqOi+j0wfhX#fJaP&tMxmiRwdADHE2Z(u+V&#tp5L6m2l`}L-> zZ?dfK=8?W)q8QHf*at?N2p=%zBY6cNN;|;3aGO-wZ12}MpyOhPi7HjN*zHZUaT#rA zD11QDr&8!W_Lwg(cv?@f(!v?Wd^8;B{bVw?5h{fCR}Q~F46xd z*H%{VjITSl1`n!m6dq=nFdKU#lVGhlTG#ACJ{sMBU2~7M7d{ zcP{>g&by4R65HKt&Diud6R1Z79Qhw3c<29~UUu3Pd~Ci?Am5*GB5$4Nt(e;w2F-cA z+Id@~5m zp$Ba>vyD#bGF`6*ypnTQi^H{=b7z;9oVp{GWF!?lBO@c7xmgmMrboVkK$7+OGfPX{ zt(iMJ)~~tYA0++#eFy9JQ}cGFUZ^y^6O4A@B`j#eLx18=pej*bc9F*)^t2Y#Pp^=X z)y02jA+xugOeEk86fg_FoUFW?-##|+JOGff^vmQ0~a*jS3Y2=!zo;y|&ox&AQ3;mi-n z#^}rSV}&ISSv~Yqi@FSJS=8Ghf#+#0MezkgZ^o)Ert!6F< zUCUS0o{>u??vB5(iFdw!=B~s_e|>YC_PG5d>)P@avO}Bd{M@&e5?tZ%VwDr4#qvd$ zAmamYq60nkK@!mn*#$6$Ap zcL6Tysd@9$N6kx<3yzUXOEQv5j^yyYmY+M}!QiAQ(Z+gBZr@E%xM7t|SHN(t#?)pS zQ5iPnUPPs%c?$QGS13nTIoGy=M2dTe%S*o**}iZNb6aIwvK6Cd zmDtT(xPNkTjDUc_TCG?q3~Uj-_Quq#SznTb!6G|RH5N)r@Pmo5p)yb^3MF$}@ATsQ z@Z@*&#a*w!>a5w`=!=F(-(70_+Ngx5n_G&oB^lW-@@p+*WQV!Rf6YpT-0iN$0?xlQ3eUV0=a_^I8mRdy;9% zzJW#Fn|ZRR${(Bl*P>Oicc!q%MoH$8ms5Ha(GDqK#|d;|k7J4?5@+FIRtgGWC)*E$&Qrl_EipFTO0$v=?RC9-XL1*P6OW_4KP}+| zqhFC4+dB1rm$&)NSVPnF^e4=tgERH?^%e%EUvs_P{#exH)GFGNoa{ck0I+Wrx8R~| zz=d^SF(PIjzt`@=J*u#Xfw-lXfaEcuHfFu1s-}MV4h0lauwr8?*-Hf=>E5kmGyBNJ zHy%v4)KbNVvkK|D%TxMovC;`FQ`pt<__Jd$PZlUjfD`0w5l zoGhK|)}>t(d)?{AsIRK7gZR~d%P;YN%YShK(fj&kP{$%a5%H$Y+jXwoq~9{5C$t{B zm}26)*m{nRwWRz`GGG1hyfyLb2Oh^B7KN}hH@o}1sk^=fJoX^V4o~~v-%P9Z(t)_L zt@sw-Pgi~%p&+*%>iCsTq$x9K8d#zf_P$T++E)LCBCaw}k9S27Sb7yZ*gC;H zABM|2Y!%y8n{i{-R*$K>H_F+e*My`#`|)I#ngX&z8JrP#akjr0I2i#7d9msq|M7TP ztMzGd>}J<=ccTBPp==}pcWi2^#5_@xPf14RT2WHcbvtWvVlJO;eiGkN2a;KMd8*`q z*|kR1RR*r~tM7+~nlPE>7kp|M7BNGOZXBZPP)OyLjB$O;HU<)NU$?fi7l})tz|QVP zPT=x1(aNn$UgYHDLAn7pX2F?(fq?~jFMf-`C&ZmFhfI$_Mkc6nqo6fhbUT>UPxz%_xv1ESM$gh> z2_{8hE2X}<%1R-mYJoeuc^u-60B;i_$}M(&6Ixk}3@BW`&aXbf=app~JD|#AXD>px zJk36@hG*aA{?+aE3EfdM!=PV0QI~^(yJ5JgMwo6+#?89=d|PZV-;)t$xC090k#{+W zKbxz!aX+Sls69_ShKO%1B=O`8`@br}JosrsGBlOUxP8@%>`h}v)WLH4_t}@1sGH%~ z0nDt9rkbUZnRK1yFB|WY>d~Y1&o-SQ4~U258JZ`q+Esx;L6*qxZ;p>nEX@Mg+csFN zIJ$R(G?lN8< zWPLXf0P2VCq<5I^g>=vB?ct)V8|n?ks$6d51)YyLarVmcm<@MuEbWfWhy-nnFc%aS zrdZwCKB+0ZPDaKe@b9gMiZOLnzcTm^Pdua2{Tyq~@m|M_z9xl&lf&lzbEZmzta}m{ zvmxlShFH#}DF~W_%n_M|)UVR{D|JqaF3U)qA?3 zj_TF$6@b}&VJQ`EOo!e?#BIqc5DCrOvu8?C(D@yw}Qmzu(Fm{&nSR!eB@ zl^N5Pz+-`M%)Xh&9=N1Q37$B7wp&NtEP1W*3;|Rojn4jZdxS!Dd*+!~G|2Qwx=EPi zH`4gtrV2)+?cN38BICzT1A1UdS=p8BZt)+L0h6KDEWtea*7{<>zoG7uKTN65AJLKl z)6khDsD@{rhq8)k5kY`8!SM@j$OSJpVzyG_L0<@tQxQE&<;s2WH>>-EsM7pAe82s7 z`{rZMrl~0z=|{d(fo@-`PvTR1TrH|gifn9VkH@}LRn4(j1YB;~U2hMt+Gt!Wm>3(p zEGZ@(wRbpgt~H}-T|j<*Vafuj0l=Ax>Q%c;g7N58vQnkn^H<4!xsTykdaepsIFLue zN@xtGf3(u!-l$Bw)!NoaCRa=UjPOX8<&DdjSzUDilv@C70$-bgl*9yuq z^Hxyf?$6f}ft-507X!&aRbFHQz@FEB;a9tRzIGojEzRoGtObUpMfPN+*^H@F8edl> z*VV%ZMN@wjR9)L$s3v;~Pe~tRu$;ITgNL1ncj~9p?HL>Pjn1|7@bs7_YG#I0 zD|f(xmS`;X*ZY)*DW=bS?t+hc{KTjaDW=r$;!-zQ!)o1dZcW?OlQwWua6Of#3Hf5p zKprHzK+9tn7u1ccwH`1H(;>55+q5%bX@L0d)%x&U;FE zLJz@JYWd5kHi?mSlU-3x;R$*01I~G>r52rP3FEJxcZ*!EkmaM#9VG^@fU0^zqd})H zp{=})@Fqdj;crHlXx1W$XcoJwLuUx%9A3QJg=3qud9|;z9BDQ*#l~)VyRZcGIdG+- zHPnt24GattuaG^=G?{Vx1vPsDO1VO-*AJ-9;VQfVSIt*55&vwMOYvrU4Gth!RxRzS zk=x7Xf@nNl!$M8IaIm)>#{QoHm)I8 z$|yM1u}n5(dZT6AcBB`0S*>HeZK?={gT8rytW8T+n>L@j;-r&rS+CXnv}PpX!w}knud-2_zpLVs(YjBs7~7}l~QK= zttnIm5FUUfMUje*smQ=OHeYOd&5AiqJz{j}C(9byn|SX9iQq^ObNN+s1>O*WDDY>0 zD;s^nWpqZrHO?j)+3NcuqM!~0*hqjdorGcS>{_cTLPha|r&xGzxT4pfjyW|MS*h&* zg07U0!JvJPch;AhCou*gnjfOo%EZj#wN)@T`-N84sI!1_Qn17WHRj(b%~+9<(|O>! zeeMs9(Aa0J($9aZ!xj%cVfF7%<~6D!GM|%ema{MVnVrWl=KUKG_h(}!sG?N#MIaXkjIwVb-cs^c{R(qIl`NObB zqKoO=C}EGyZ90#Oj122I0WNL|C;mxnxg^Y?wwoX@g4RS)GiydS8)ftEImt?A>Z0W2 zNM*NiPHM>=qQ^>FfTjOM+@3pe%0I!c9uA+D5l9lRS}ILa%dfFeS2j@`Q~pdX*Faj>b>IyMAtnHFeb7~X$7oq|rugV( zt1dZ0s%U$$JI-s?Pb|v7vG{8|W5OU0V9X^5BQJ zUE}$kBTLZS*kfjvOt9^c5lwk zjbQ~l*yTIV{KMDrLnF;0FD4|Xso=x%;*nP%wFKMI2J8awnu1n@34-JJJ|&qd9v;qT zvS4{KhiuipB>FDkG3XuDqh(z?tu|tO+{Bt{ZqyvoM9zJ#Gu$h#DWLaQf;bc+AE>i%UvY}bJ?Gu1xCG*WT_ZvW}61+KD_+I2Jdy4WHm!6bru zfmJ{IwG{(X6?U8RFQ{tcb=Y4qsrl)jv$u_%8-7rs` zgfLE%t&zFPIWv>5RAnriJra^UnO0tqW{9vot6zEq7TW;t9q-3i+^J_m>ZUOHIGLhQe1s_ZYY2hX0N{;M3a?4jWkav8mpJ`gu zGXqT`Mk_sW^NyKLwpG{?$ix(W5bm1=kf?h(i)u3+K98f2kA$k4{sb4t3<&dts}qR! zV;u^!*ZKh+QOKe0lZzoG06_`7@yR<(T*w$w*3IQtYXk~c6>V_=(Oigl4b+TyYV=LO!e;cQiPdD-S42*YupEw1SJLD6@)#l|7F})P zsFXlS?s*4uBW)(^c_L4A4~8@FIT{;#@5y)0!*RLFfJNYno3i0gAtt7YnqNY@7wYJR zVVRIJD(&N+)XFnqwk1qdsTgT-b|XK}cS~UyVko$*e#twxt2Cq1#C`CAw!?AP@yJ4M zDEdBbO~;QD6O6>aS6LMq8rr`io(ZpwK56|#7ubvYMl;v_6_^o73l@CO}VOpUc$ z!^dK;Y^v*)rY0Se_nEqkRJBIIec;zCPswShR7j(Id{1AD)}*|%Ev_X^9)uK8xVzDM zx~jwp@4WY%dk5e}mc~;wyM5BGZd6_FaP<*4)*CZ1dYP)g{ZihPjz@8mTXrhU4F-9B zJ#9TgiXM41NQ>B3z8iX2Uw*alWu?51VHvcfn7XmXB=-!6G}nP21E@kFT4z)Goj0l=|Hm)^x7e__&uDiP$*J&qQ20`CY|vH40d=s{^=w`DSDLO=~9iDBYJgzQx$&>1btY zlpQOUT+EE8?%gaZ%&J@3^h;HFz^hjlkAlcIvj^(JQiiJF?4^GbCq z(*8k+Zylb)dd5L5pwQ0~e5Ac|-|DU#`@0$A$Y#%}1%6DoOV~N2@VEsxeej2y&q8eD za2d17HQL&W`lmmx=o7Bq{oaElg%F*vNr;-)@kNfPou25pW*Js~;Zbu3EmiUm0ldUE}b;MA2u8_IiuPXe~;I zTzu={d!lK8s>T%TB4v>@@X0h~s?;R=BoT2bpCBd6jsS2diZM)2*?apfxQCN8vP!1R zVj%F0fmkzbigA~Z$;4zPJ$H$`{_*J%3JNhk(6e)pwfo-45?1__-Ut)&%(PBtDr~cD zifGjtgw-P-MPyoL!oIgw)*TOrUu>CI-!HA1jpsB~26Afgc$jO77{&`+SA31x*7H4k zy?{`m9e){WjH?y(HzD*ZTLw#GQfmcfR3NzuD_Bxh4fvOJ*~l>9h`& z{=&;-zcr$WC7Ppz-q;U$iw8VPhqe)RVqi6SD>HBL=6XCb8WlEEW6Y^>-HYxL382RE znTR7e>kbdUwge(}@iIiGuiJ+I07*yh3sJUOc(chC=;wi}WhU|ewRP6ybERAX65I!Y4OIU{XHE*T?jbKj&3AXd;Zwoz3=LYL0orf(WD|eo$8YP@7tBHDt&nWi2 zmYdaeSThqAUuCE}ap+g^_{6c|)z-y_?s=DM{CZ%Y^?@t?ciJM|?(K@j))$hlYWkKtI&3EDjOB_m6J~{A?NmU zsM#M2PjERMyW>>S43odTzw;B*(A8cFI&$oAI`g(GGY6uuRSME)ORESgZzj$ zmFPA1dKc9_>Z_N_C@EMKgw*CqdkSBLyz(ILF^@74s+B6U#75dk=R>h)$9mE}6vff2 z2bQj#xJ2-(QuVHYn-8nQJj>5~+&5jgsx9Pr5Z0+EZcsP)@g1+tHwKVn9ft(v7!@`T zeNwM%ML{Oc3w_X0`g+Ao#U)ekyCxTEmPY#WnwJO~o442*j3Aevj=%bb>f3th`NZ~o zF)~oc5K)_t?Bg`P%Ub)nC)1i!e}+JqwB7UBsP@h-Vd>-MKSe2NyLhP0<%8L^hf_+N zYSc8s5n2Ay7aS|<(dX@ROyia3^DldMN8zu_Mi|q11vcsZj;CQA`EAFvaKw;qPO@xv z;E&EcwZw7O8c)^JbHBxwfDA{bPRY^Q(@=zMoc8VV0SaHG-k)j5CA1_)w6_S#a1_|> z3VURPbeOQ@sauT9VdBfV@v%xz8ksn}`N`D_gH7ATH=77IKW?S;jV9b%!AQt`Xlb20 zhzcySwT^XOhHz};Ot};dp^r9&xN6bN4q~zx+JPyJ0kmK7mM;%7QU~CxHM^$*ztZ`g zOD;MV_y_~kh1G9;SJQ}|P2+xPbd1-1O0l%meb}~wTu+XU)t2n=$U-ijl5^4E25Ymso-kyxdx(#I8PR-IR#{K#zudxI8Xt>jciRVIOIjc4Kkd(r3}o;kJ6a;FJi#y}+{^vO?4*jD=TMkOVNXdBdNkuP|jyGrYOC3u6f@Jc)bo2b98 z?L!shI?zGX^c~(-nnDLb@HTUEwS-b%L3V4ahkzR!yS{}m@*po1JV7=te82$Ngzqq; z3FT;%@?Z2nNeE-wsx2w={iTUk2{`*5&hA8R1SC?Ky;bLgYW&7OsT!Ru;D(wN)GE(+ zsSWdp{9`95Q?DG$bL(zsxc1c|*>380U8}RTU~SRvze}gb2P(Rflajh6lcEQlc{~!^ zDc%HNr5(K=@f=(?x`N=FWbqLE3nBRPb+bZ4>ja+IpE%iBp1xy#9v-7|IVc%9bZ!S< zukaACu^HIz(hmni_RkU{BRjx%oz&-k03oMCzcHe3D{{9>+1~JXS9EtrJe|iUMeTRl zKVSU*idiFH+d`dvs+=DS6{Mdwlq_r(RPXAD21x=1pj?6UKmp8^fjg%Nm^Jb}UZ~=2 zmUD2vLgQ8ntqO7k?L`|G<|?r_D#TB}u*5$36t@&KQg=Z?@ptes@Soi)4GlOOFTOZ@ z9O5^R@?$8tl%0pIO0Y8(jYx@eIz-1mFfk+=Cx^dPFdAJqWjpgFLw4~0^?`0bP|4i3 zPjC4Ryk7QLeKdFST!DOoqTd!)YrohQFI)>Hgl#ypcda}-e}u*9Ui|E;GxBm}ytsT$ zOHLV5film-i%h(Gg9AR{Y-Zl;tWd^^1?83$S>hX!`nnKLABes7SjGOKPZ~2&tKm%i zOwibCJ|d$KUZqdqvwOep{}g32Cd4H%Pfk0HOQ5A2T~(m$8M{yxwarDWB9weI4(Ap4 z!<@wzribEjbp8#>xlVIe#B`;XP%G!vFp%;Xj+Oz8i(;O;8hQ;43` zu45hdW-TbAQ#wsR&XlO@6xgcXQ%Oi&F)1-d{>;qbAxzSX`v^0EI$B%3TZ8Lo1;!6b za}0X=w+NX-mZQpyO#qz~svrb#W?<)_W0@dIxHf$H!C^d{W#C&Dla!7KOD_tLK3VZ( zl{SRZqaXzNw~BTDO{w#SIjAdRAFQB-IQU#g(nE6u`lq$D?i+3d{oU0TB$1S8RES{v z(dyh_*l+NlpLsbJiIYaC!0S^9pr`#Q1;Nj6;CE&eYQV6%LfK7m^_<`mJf5YNS+LPO z2aejnV(#6{gLFd8X+aaH8&O_ZHsLSnxSjxH>n-Q71AT3Xs?SC@SYpnWh+?xg*|sLM zzMLGYk>b9&8y3PZBZ7(fx5!4-EIa}Wu>NZJ@l>l!70iLjlAAM70yOrr`N#c?oz)o~ z{vJhZ=xp3KN_l60%FeN8>Sby$W0VJ^nD$~t`9ZrpOE1x0&5uxPLsreW`@WGjKdl96aAWO_MT_AzPrrjcElj8)V?H`nNGRiS>mu@dXa5Ls})?Ga* zvm>&skiph{7qhctem{+ZQ=SP8|5j$qDoxqU*T;$Oz=3>@C|h}P!mUI?t~;ceHCw~l zxuky-{HB9kHnze4wg4pdjwtcJx0SHK4o#PSxfFzBy4gUyuI56MKM zK5OUJ>s1@~u#Lq}yHnXiU0mqMLvK(Zij?cT^by~b+r>BG%A&o}OEqO54nU?wLwiAx zs70B2bIm-TeMFZ5*l`hAsFP62m}8*%iFNJnRWCLL^+6{Tnx-%=SS;)M)e*7uL^M}9 zxYrNW$2ij{LJ5GYPdB9#FUn@$Ex&}V^G$`_Y zhlN9Yk(U#cQdUyYT2Mru*K>xyIg<@iprN3t*73lC8Zp)3p)Bw~|9U&=C1{IP)c=X+ zagv@6-FeB|6vvEmOO8E_aebv9{Q{to;^n>>C_#X%8}3dGmmhuT4VxB@n4Xr8+Z`Q> zFmuwdb)Z`bPr}YgM?9ib|JkZLtm*fM+UOOUn3#mq4_a PGs*dY+kS>4`tpAOqrMXz literal 0 HcmV?d00001 diff --git a/modules/settings/module.php b/modules/settings/module.php index 7a5b4deb..4c1ab0da 100644 --- a/modules/settings/module.php +++ b/modules/settings/module.php @@ -19,6 +19,7 @@ }; use EA11y\Modules\Settings\Banners\Elementor_Birthday_Banner; use EA11y\Modules\Settings\Banners\Onboarding_Banner; +use EA11y\Modules\Settings\Banners\BF_Sale_2025_Banner; use EA11y\Modules\Settings\Classes\Settings; use EA11y\Modules\Widget\Module as WidgetModule; use EA11y\Modules\WhatsNew\Module as WhatsNewModule; @@ -49,6 +50,7 @@ public static function component_list(): array { public function render_app() { ?> +

    From 8d7a011f2b44dc174378c966e554fb534f8b74a0 Mon Sep 17 00:00:00 2001 From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com> Date: Mon, 3 Nov 2025 13:39:02 +0530 Subject: [PATCH 201/292] add: review stars to plugins page (#420) --- modules/core/module.php | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/modules/core/module.php b/modules/core/module.php index b1fa0636..c4da0ab5 100644 --- a/modules/core/module.php +++ b/modules/core/module.php @@ -61,6 +61,38 @@ public function enqueue_scripts() : void { ); } + /** + * Add review link to plugin row meta + * + * @param array $links + * @param string $file + * @return array + * + */ + public function add_plugin_row_meta( $links, $file ) { + + if ( ! defined( 'EA11Y_BASE' ) || EA11Y_BASE !== $file ) { + return $links; + } + + $links[] = ' + + '; + + echo ''; + + return $links; + } + /** * Module constructor. */ @@ -68,5 +100,6 @@ public function __construct() { $this->register_components(); add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] ); add_filter( 'plugin_action_links', [ $this, 'add_plugin_links' ], 10, 2 ); + add_filter( 'plugin_row_meta', array( $this, 'add_plugin_row_meta' ), 10, 2 ); } } From f7ff9ef0b467e85601613f55993a6262c2005565 Mon Sep 17 00:00:00 2001 From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com> Date: Mon, 3 Nov 2025 14:57:57 +0530 Subject: [PATCH 202/292] [APP-2070] Improve reviews component UI (#421) * update: review component UI * update: fix lint error * fix: review notification logic * update: remove log --- .../assets/src/components/dismiss-button.js | 47 ++++++- .../assets/src/components/feedback-form.js | 16 +-- .../assets/src/components/rating-form.js | 33 ++--- .../assets/src/components/review-form.js | 59 +++++---- .../reviews/assets/src/hooks/use-settings.js | 98 ++++++++++++++- .../assets/src/layouts/user-feedback-form.js | 116 +++++------------- 6 files changed, 216 insertions(+), 153 deletions(-) diff --git a/modules/reviews/assets/src/components/dismiss-button.js b/modules/reviews/assets/src/components/dismiss-button.js index 0a337591..1546c5e9 100644 --- a/modules/reviews/assets/src/components/dismiss-button.js +++ b/modules/reviews/assets/src/components/dismiss-button.js @@ -1,11 +1,14 @@ +import Box from '@elementor/ui/Box'; +import Button from '@elementor/ui/Button'; import CloseButton from '@elementor/ui/CloseButton'; import { useStorage } from '@ea11y-apps/global/hooks'; import { date } from '@wordpress/date'; +import { __ } from '@wordpress/i18n'; import { useSettings } from '../hooks/use-settings'; -const DismissButton = () => { +const DismissButton = ({ variant = 'icon' }) => { const { save, get } = useStorage(); - const { setIsOpened } = useSettings(); + const { currentPage, setIsOpened, handleClose, handleSubmit } = useSettings(); const handleDismiss = async () => { if (get.hasFinishedResolution) { await save({ @@ -20,7 +23,45 @@ const DismissButton = () => { setIsOpened(false); }; - return ; + + if ('icon' === variant) { + return ; + } + + if ('button' === variant) { + return ( + + + {currentPage === 'feedback' && ( + + )} + + ); + } }; export default DismissButton; diff --git a/modules/reviews/assets/src/components/feedback-form.js b/modules/reviews/assets/src/components/feedback-form.js index 8241fc8c..18579693 100644 --- a/modules/reviews/assets/src/components/feedback-form.js +++ b/modules/reviews/assets/src/components/feedback-form.js @@ -1,11 +1,10 @@ -import Button from '@elementor/ui/Button'; import FormControl from '@elementor/ui/FormControl'; import TextField from '@elementor/ui/TextField'; import { styled } from '@elementor/ui/styles'; import { __ } from '@wordpress/i18n'; import { useSettings } from '../hooks/use-settings'; -const FeedbackForm = ({ close, handleSubmitForm }) => { +const FeedbackForm = () => { const { feedback, setFeedback } = useSettings(); return ( @@ -18,28 +17,15 @@ const FeedbackForm = ({ close, handleSubmitForm }) => { 'Share your thoughts on how we can improve Ally …', 'pojo-accessibility', )} - sx={{ marginBottom: 2 }} value={feedback} color="secondary" /> - handleSubmitForm(close)} - > - {__('Submit', 'pojo-accessibility')} - ); }; export default FeedbackForm; -const StyledButton = styled(Button)` - min-width: 80px; - align-self: flex-end; -`; - const StyledTextField = styled(TextField)` textarea:focus, textarea:active { diff --git a/modules/reviews/assets/src/components/rating-form.js b/modules/reviews/assets/src/components/rating-form.js index 8a767014..a5ecdb1d 100644 --- a/modules/reviews/assets/src/components/rating-form.js +++ b/modules/reviews/assets/src/components/rating-form.js @@ -1,4 +1,3 @@ -import Button from '@elementor/ui/Button'; import FormControl from '@elementor/ui/FormControl'; import FormControlLabel from '@elementor/ui/FormControlLabel'; import ListItem from '@elementor/ui/ListItem'; @@ -16,14 +15,9 @@ import { MoodSmile, } from '../icons'; -const RatingForm = ({ close, handleSubmitForm }) => { - const { - rating, - setRating, - setCurrentPage, - nextButtonDisabled, - setNextButtonDisabled, - } = useSettings(); +const RatingForm = () => { + const { setRating, setCurrentPage, handleClose, handleSubmit } = + useSettings(); const ratingsMap = [ { @@ -55,14 +49,14 @@ const RatingForm = ({ close, handleSubmitForm }) => { const handleRatingChange = (event, value) => { setRating(value); - setNextButtonDisabled(false); + handleNextButton(value); }; - const handleNextButton = async () => { - if (rating < 4) { + const handleNextButton = async (ratingValue) => { + if (ratingValue < 4) { setCurrentPage('feedback'); } else { - const submitted = await handleSubmitForm(close, true); + const submitted = await handleSubmit(handleClose, true, ratingValue); if (submitted) { setCurrentPage('review'); @@ -91,14 +85,6 @@ const RatingForm = ({ close, handleSubmitForm }) => { ); })} - - {__('Next', 'pojo-accessibility')} - ); }; @@ -110,8 +96,3 @@ const StyledFormControlLabel = styled(FormControlLabel)` margin-left: 0; width: 100%; `; - -const StyledButton = styled(Button)` - min-width: 80px; - align-self: flex-end; -`; diff --git a/modules/reviews/assets/src/components/review-form.js b/modules/reviews/assets/src/components/review-form.js index fade6fda..0cda4c1e 100644 --- a/modules/reviews/assets/src/components/review-form.js +++ b/modules/reviews/assets/src/components/review-form.js @@ -1,15 +1,16 @@ -import Button from '@elementor/ui/Button'; +import StarFilledIcon from '@elementor/icons/StarFilledIcon'; import FormControl from '@elementor/ui/FormControl'; +import Rating from '@elementor/ui/Rating'; import Typography from '@elementor/ui/Typography'; -import { styled } from '@elementor/ui/styles'; import { useStorage } from '@ea11y-apps/global/hooks'; import { mixpanelEvents, mixpanelService } from '@ea11y-apps/global/services'; import { __ } from '@wordpress/i18n'; import { WORDPRESS_REVIEW_LINK } from '../constants'; import { useSettings } from '../hooks/use-settings'; +import { MoodHappy } from '../icons'; -const ReviewForm = ({ close }) => { - const { rating } = useSettings(); +const ReviewForm = () => { + const { rating, handleClose } = useSettings(); const { save, get } = useStorage(); const handleSubmit = async () => { @@ -25,32 +26,48 @@ const ReviewForm = ({ close }) => { }, }); - close(); + handleClose(); window.open(WORDPRESS_REVIEW_LINK, '_blank'); }; return ( - - - {__( - 'It would mean a lot if you left us a quick review, so others can discover it too.', - 'pojo-accessibility', - )} + + + + {__('Awesome!', 'pojo-accessibility')} - - {__('Leave a review', 'pojo-accessibility')} - + {__('Help others discover Ally on WordPress', 'pojo-accessibility')} + + } + icon={} + onChange={handleSubmit} + sx={{ marginBottom: 3 }} + highlightSelectedOnly={false} + /> ); }; export default ReviewForm; - -const StyledButton = styled(Button)` - min-width: 90px; - align-self: flex-end; -`; diff --git a/modules/reviews/assets/src/hooks/use-settings.js b/modules/reviews/assets/src/hooks/use-settings.js index 0ec99893..930754d4 100644 --- a/modules/reviews/assets/src/hooks/use-settings.js +++ b/modules/reviews/assets/src/hooks/use-settings.js @@ -1,4 +1,9 @@ +import { useStorage } from '@ea11y-apps/global/hooks'; +import { mixpanelEvents, mixpanelService } from '@ea11y-apps/global/services'; import { useState, createContext, useContext } from '@wordpress/element'; +import { escapeHTML } from '@wordpress/escape-html'; +import { __ } from '@wordpress/i18n'; +import APIReview from '../api'; /** * Context Component. @@ -13,14 +18,99 @@ const SettingsProvider = ({ children }) => { const [rating, setRating] = useState(0); const [feedback, setFeedback] = useState(''); const [currentPage, setCurrentPage] = useState('ratings'); - const [nextButtonDisabled, setNextButtonDisabled] = useState(true); const [isOpened, setIsOpened] = useState(true); + const { save, get } = useStorage(); // Notification const [showNotification, setShowNotification] = useState(false); const [notificationMessage, setNotificationMessage] = useState(''); const [notificationType, setNotificationType] = useState(''); + const errorNotification = (message) => { + setNotificationMessage(message); + setNotificationType('error'); + setShowNotification(true); + }; + + const successNotification = (message) => { + setNotificationMessage(message); + setNotificationType('success'); + setShowNotification(true); + }; + + /** + * Close the popover. + * @param {Object} event + * @param {string} reason + */ + const handleClose = (event, reason) => { + if ('backdropClick' !== reason) { + setIsOpened(false); + } + + mixpanelService.sendEvent(mixpanelEvents.review.dismissClicked); + }; + + const handleSubmit = async ( + close, + avoidClosing = false, + submittedRating = null, + ) => { + const ratingToSubmit = submittedRating !== null ? submittedRating : rating; + try { + const response = await APIReview.sendFeedback({ + rating: ratingToSubmit, + feedback, + }).then(async (res) => { + await save({ + ea11y_review_data: { + ...get.data.ea11y_review_data, + rating: parseInt(ratingToSubmit), + feedback: escapeHTML(feedback), + submitted: true, + }, + }); + + return res; + }); + + if (ratingToSubmit && !feedback) { + mixpanelService.sendEvent(mixpanelEvents.review.starSelected, { + rating: parseInt(ratingToSubmit), + }); + } + + if (feedback) { + mixpanelService.sendEvent(mixpanelEvents.review.feedbackSubmitted, { + feedback_text: escapeHTML(feedback), + rating: parseInt(ratingToSubmit), + }); + } + + if (!response?.success && parseInt(rating) < 4) { + /** + * Show success message if the feedback was already submitted. + */ + await successNotification( + __('Feedback already submitted', 'pojo-accessibility'), + ); + } else if (response?.success && parseInt(rating) < 4) { + await successNotification( + __('Thank you for your feedback!', 'pojo-accessibility'), + ); + } + + if (!avoidClosing) { + await close(); + } + + return true; + } catch (e) { + errorNotification(__('Failed to submit!', 'pojo-accessibility')); + return false; + } + }; + return ( { setFeedback, currentPage, setCurrentPage, - nextButtonDisabled, - setNextButtonDisabled, showNotification, setShowNotification, notificationMessage, @@ -40,6 +128,10 @@ const SettingsProvider = ({ children }) => { setNotificationType, isOpened, setIsOpened, + handleClose, + handleSubmit, + errorNotification, + successNotification, }} > {children} diff --git a/modules/reviews/assets/src/layouts/user-feedback-form.js b/modules/reviews/assets/src/layouts/user-feedback-form.js index 585665f9..7fda5e8c 100644 --- a/modules/reviews/assets/src/layouts/user-feedback-form.js +++ b/modules/reviews/assets/src/layouts/user-feedback-form.js @@ -2,25 +2,25 @@ import Box from '@elementor/ui/Box'; import Popover from '@elementor/ui/Popover'; import Typography from '@elementor/ui/Typography'; import { styled } from '@elementor/ui/styles'; -import { useStorage } from '@ea11y-apps/global/hooks'; import { mixpanelEvents, mixpanelService } from '@ea11y-apps/global/services'; import { useEffect, useRef } from '@wordpress/element'; -import { escapeHTML } from '@wordpress/escape-html'; import { __ } from '@wordpress/i18n'; -import APIReview from '../api'; import DismissButton from '../components/dismiss-button'; import FeedbackForm from '../components/feedback-form'; import RatingForm from '../components/rating-form'; import ReviewForm from '../components/review-form'; -import { useNotifications, useSettings } from '../hooks/use-settings'; +import { useSettings } from '../hooks/use-settings'; const UserFeedbackForm = () => { const anchorEl = useRef(null); - - const { success, error } = useNotifications(); - const { save, get } = useStorage(); - const { rating, setRating, feedback, isOpened, setIsOpened, setCurrentPage } = - useSettings(); + const { + setRating, + isOpened, + currentPage, + setCurrentPage, + handleClose, + handleSubmit, + } = useSettings(); useEffect(() => { /** @@ -43,81 +43,15 @@ const UserFeedbackForm = () => { } }, [isOpened]); - /** - * Close the popover. - * @param {Object} event - * @param {string} reason - */ - const handleClose = (event, reason) => { - if ('backdropClick' !== reason) { - setIsOpened(false); - } - - mixpanelService.sendEvent(mixpanelEvents.review.dismissClicked); - }; - const id = isOpened ? 'reviews-popover' : undefined; - const { currentPage } = useSettings(); - const headerMessage = { ratings: __('How would you rate Ally so far?', 'pojo-accessibility'), feedback: __( 'We’re thrilled to hear that! What would make it even better?', 'pojo-accessibility', ), - review: __("We're thrilled you're enjoying Ally", 'pojo-accessibility'), - }; - - const handleSubmit = async (close, avoidClosing = false) => { - try { - const response = await APIReview.sendFeedback({ rating, feedback }).then( - async (res) => { - await save({ - ea11y_review_data: { - ...get.data.ea11y_review_data, - rating: parseInt(rating), - feedback: escapeHTML(feedback), - submitted: true, - }, - }); - - return res; - }, - ); - - if (rating && !feedback) { - mixpanelService.sendEvent(mixpanelEvents.review.starSelected, { - rating: parseInt(rating), - }); - } - - if (feedback) { - mixpanelService.sendEvent(mixpanelEvents.review.feedbackSubmitted, { - feedback_text: escapeHTML(feedback), - rating: parseInt(rating), - }); - } - - if (!response?.success && parseInt(rating) < 4) { - /** - * Show success message if the feedback was already submitted. - */ - await success(__('Feedback already submitted', 'pojo-accessibility')); - } else if (response?.success && parseInt(rating) < 4) { - await success(__('Thank you for your feedback!', 'pojo-accessibility')); - } - - if (!avoidClosing) { - await close(); - } - - return true; - } catch (e) { - error(__('Failed to submit!', 'pojo-accessibility')); - console.log(e); - return false; - } + review: null, }; return ( @@ -148,19 +82,21 @@ const UserFeedbackForm = () => { >
    - + {headerMessage?.[currentPage]} -
    - {'ratings' === currentPage && ( - - )} - {'feedback' === currentPage && ( - - )} - {'review' === currentPage && } + {'ratings' === currentPage && } + {'feedback' === currentPage && } + {'review' === currentPage && }
    +
    + +
    ); }; @@ -179,3 +115,13 @@ const Header = styled(Box)` align-items: center; margin-bottom: ${({ theme }) => theme.spacing(2)}; `; + +const Footer = styled(Box)` + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + ${({ currentPage, theme }) => + currentPage !== 'feedback' && + `border-top: 1px solid ${theme.palette.divider};`} +`; From 0ed0311f7dc881eeb1ac36f448768629fcc6b728 Mon Sep 17 00:00:00 2001 From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com> Date: Mon, 3 Nov 2025 17:03:59 +0530 Subject: [PATCH 203/292] [APP-2070] UI bug fixes (#423) * fix: button padding * fix: notifications logic was not working properly * update: removed unused async call * update: moved review stars to review module --- modules/core/module.php | 33 ------------------- .../assets/src/components/dismiss-button.js | 1 - .../reviews/assets/src/hooks/use-settings.js | 30 +++-------------- modules/reviews/module.php | 33 +++++++++++++++++++ 4 files changed, 37 insertions(+), 60 deletions(-) diff --git a/modules/core/module.php b/modules/core/module.php index c4da0ab5..b1fa0636 100644 --- a/modules/core/module.php +++ b/modules/core/module.php @@ -61,38 +61,6 @@ public function enqueue_scripts() : void { ); } - /** - * Add review link to plugin row meta - * - * @param array $links - * @param string $file - * @return array - * - */ - public function add_plugin_row_meta( $links, $file ) { - - if ( ! defined( 'EA11Y_BASE' ) || EA11Y_BASE !== $file ) { - return $links; - } - - $links[] = ' - - '; - - echo ''; - - return $links; - } - /** * Module constructor. */ @@ -100,6 +68,5 @@ public function __construct() { $this->register_components(); add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] ); add_filter( 'plugin_action_links', [ $this, 'add_plugin_links' ], 10, 2 ); - add_filter( 'plugin_row_meta', array( $this, 'add_plugin_row_meta' ), 10, 2 ); } } diff --git a/modules/reviews/assets/src/components/dismiss-button.js b/modules/reviews/assets/src/components/dismiss-button.js index 1546c5e9..e50ae63c 100644 --- a/modules/reviews/assets/src/components/dismiss-button.js +++ b/modules/reviews/assets/src/components/dismiss-button.js @@ -35,7 +35,6 @@ const DismissButton = ({ variant = 'icon' }) => { flexDirection="row" gap={1} p={currentPage === 'feedback' ? 2 : 0} - pt={currentPage === 'feedback' ? 0 : 2} width="100%" justifyContent="end" > diff --git a/modules/reviews/assets/src/hooks/use-settings.js b/modules/reviews/assets/src/hooks/use-settings.js index 930754d4..3684c1fd 100644 --- a/modules/reviews/assets/src/hooks/use-settings.js +++ b/modules/reviews/assets/src/hooks/use-settings.js @@ -87,15 +87,15 @@ const SettingsProvider = ({ children }) => { }); } - if (!response?.success && parseInt(rating) < 4) { + if (!response?.success && parseInt(ratingToSubmit) < 4) { /** * Show success message if the feedback was already submitted. */ - await successNotification( + successNotification( __('Feedback already submitted', 'pojo-accessibility'), ); - } else if (response?.success && parseInt(rating) < 4) { - await successNotification( + } else if (response?.success && parseInt(ratingToSubmit) < 4) { + successNotification( __('Thank you for your feedback!', 'pojo-accessibility'), ); } @@ -139,26 +139,4 @@ const SettingsProvider = ({ children }) => { ); }; -export const useNotifications = () => { - const { setNotificationMessage, setNotificationType, setShowNotification } = - useContext(SettingsContext); - - const error = (message) => { - setNotificationMessage(message); - setNotificationType('error'); - setShowNotification(true); - }; - - const success = (message) => { - setNotificationMessage(message); - setNotificationType('success'); - setShowNotification(true); - }; - - return { - success, - error, - }; -}; - export default SettingsProvider; diff --git a/modules/reviews/module.php b/modules/reviews/module.php index 19cb58f6..f6ff7c76 100644 --- a/modules/reviews/module.php +++ b/modules/reviews/module.php @@ -208,10 +208,43 @@ public function maybe_show_review_popup() { return false; } + /** + * Add review link to plugin row meta + * + * @param array $links + * @param string $file + * @return array + * + */ + public function add_plugin_row_meta( $links, $file ) { + + if ( ! defined( 'EA11Y_BASE' ) || EA11Y_BASE !== $file ) { + return $links; + } + + $links[] = ' + + '; + + echo ''; + + return $links; + } + public function __construct() { add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] ); add_action( 'admin_init', [ $this, 'register_base_data' ] ); add_action( 'rest_api_init', [ $this, 'register_settings' ] ); + add_filter( 'plugin_row_meta', array( $this, 'add_plugin_row_meta' ), 10, 2 ); $this->register_routes(); } From f0dce2793eba1d0821d1db4914710610ea1cab15 Mon Sep 17 00:00:00 2001 From: VasylD Date: Mon, 10 Nov 2025 10:25:45 +0100 Subject: [PATCH 204/292] [APP-1923][APP-1924] manage remediations, global remediations (#424) * [APP-1923] change remediation management (#411) * [APP-1988] Add tabs * [APP-1988][APP-1989] add tabs, remove menu item * [APP-1988][APP-1989] add tabs, remove menu item * [APP-1992] add empty state and tab navigation * [APP-1993][APP-1994] Change view for manage AI fixes, change delete confirmation modal * [APP-1996] add view for alt text fixes * [APP-1996] add edit for alt text fixes * [APP-1996] add edit for alt text fixes * [APP-1996] add edit for alt text fixes * [APP-1996] add edit for alt text fixes * [APP-1996] add edit for alt text fixes * [APP-1995] Color contrast form * [APP-2001] add global remediation logic (#415) * [APP-2001] add global remediation logic * [APP-2001] add global remediation logic * [APP-2001] add global remediation logic * [APP-2001] add global remediation logic * [APP-2001] add global remediation logic * [APP-2001] add global remediation logic * [APP-2001] add global remediation logic * [APP-2001] add global remediation logic * [APP-2001] add global remediation logic * [APP-2001] add global remediation logic * [APP-2001] add global remediation logic * [APP-2001] add global remediation logic * [APP-2001] add global remediation logic * [APP-2001] add global remediation logic * [APP-2001] add global remediation logic * [APP-2001] add global remediation logic * [APP-2003] add disable across scans (#418) * [APP-2003] add disable across scans * [APP-2003] add disable across scans * [APP-2003] add disable across scans * [APP-2003] add disable across scans * [APP-2003] add disable across scans * [APP-2003] add disable across scans * [APP-2003] add disable across scans * [APP-2003] add disable across scans * [APP-2003] add disable across scans * [APP-2003] add disable across scans * [APP-2003] add disable across scans * [APP-2003] add disable across scans * [APP-2003] add disable across scans * [APP-2003] add disable across scans * [APP-2003] add disable across scans * [APP-2003] add disable across scans * [APP-2003] add disable across scans * [APP-2003] add disable across scans * add logs * add logs * add logs * remove logs * remove logs * remove logs * remove logs * remove logs * remove logs * remove logs * remove logs * remove logs * remove logs * change to theme value * change to theme value * change to theme value * change to theme value * add edit mode * add edit mode * add edit mode --- .../dev/js/components/confirm-dialog/index.js | 2 +- .../dev/js/components/notifications/index.js | 2 +- .../dev}/js/icons/crown-filled.js | 0 .../js/services/mixpanel/mixpanel-events.js | 5 +- assets/dev/js/utils/color-contrast-helpers.js | 94 ++ composer.json | 3 +- modules/remediation/actions/attribute.php | 7 +- modules/remediation/actions/replace.php | 11 +- modules/remediation/actions/styles.php | 138 ++- .../assets/js/actions/attribute.js | 6 +- modules/remediation/assets/js/actions/base.js | 64 +- .../remediation/assets/js/actions/replace.js | 8 +- .../remediation/assets/js/actions/styles.js | 127 ++- modules/remediation/assets/js/module.js | 5 +- .../remediation/classes/remediation-base.php | 90 +- .../components/remediation-runner.php | 20 +- .../global-remediation-relationship-entry.php | 108 ++ .../global-remediation-relationship-table.php | 74 ++ .../database/remediation-entry.php | 162 ++- .../database/remediation-table.php | 11 +- modules/remediation/module.php | 11 +- modules/remediation/rest/global-item.php | 150 +++ .../remediation/rest/global-items-group.php | 100 ++ modules/remediation/rest/global-items.php | 126 +++ modules/remediation/rest/heading-level.php | 3 +- modules/remediation/rest/item.php | 7 +- modules/scanner/assets/js/api/APIScanner.js | 72 ++ modules/scanner/assets/js/app.js | 84 +- .../js/components/alt-text-form/index.js | 79 +- .../js/components/block-button/button-menu.js | 126 +++ .../block-button/global-button-menu.js | 217 ++++ .../js/components/block-button/index.js | 6 +- .../components/block-button/manage-button.js | 47 +- .../components/color-contrast-form/index.js | 87 +- .../components/empty-manage-message/index.js | 41 + .../js/components/form-navigation/index.js | 69 +- .../{header-container.js => app-header.js} | 35 +- .../js/components/header/dropdown-menu.js | 83 +- .../assets/js/components/header/index.js | 68 +- .../js/components/header/stats/index.js | 19 - .../header/stats/management-stats.js | 41 +- .../header/subheader/breadcrumbs.js | 28 +- .../subheader/heading-structure/index.js | 17 +- .../js/components/header/subheader/index.js | 11 +- .../title/{main-title.js => app-title.js} | 6 +- .../js/components/header/title/index.js | 21 - .../header/title/manage-fixes-title.js | 17 - .../header/title/manage-headings-title.js | 27 - .../assets/js/components/main-list/index.js | 2 +- .../js/components/manage-alt-text/index.js | 84 ++ .../manage-color-contrast/color-data.js | 42 + .../components/manage-color-contrast/index.js | 86 ++ .../global/delete-global-item.js | 55 + .../global/manage-global-actions.js | 97 ++ .../components/manage-footer-actions/index.js | 12 + .../page/manage-page-actions.js | 97 ++ .../page/set-global-remediation-modal.js | 45 + .../manage-footer-actions/page/set-global.js | 170 +++ .../js/components/manage-item-header/index.js | 73 ++ .../assets/js/components/manage-list/index.js | 31 - .../disable-button.js | 29 - .../manage-remediation-list/index.js | 43 + .../global/delete-global-button.js | 59 ++ .../global/global-remediation-control-menu.js | 126 +++ .../manage-global-remediation-control.js | 38 + .../manage-remediation-main-controls/index.js | 2 + .../page}/delete-button.js | 41 +- .../page/disable-button.js | 22 + .../page}/enable-button.js | 14 +- .../page/manage-remediation-control.js} | 22 +- .../js/components/manual-fix-form/index.js | 60 +- .../manual-fix-form/resolve-with-ai.js | 223 ++-- .../js/components/quota-message/index.js | 2 +- .../delete-global-remediation-modal.js | 64 ++ .../delete-page-remediation-modal.js} | 28 +- .../disable-global-remediation-modal.js | 54 + .../enable-global-remediation-modal.js | 54 + .../remediation-confirmation-modal/index.js | 4 + .../js/components/remediation-form/index.js | 65 +- .../remediation-form/remediation-snippet.js | 190 ++-- .../js/components/resolved-message/index.js | 16 +- .../upgrade-info-tip/upgrade-content.js | 14 +- modules/scanner/assets/js/constants/index.js | 4 +- .../js/context/scanner-wizard-context.js | 401 +------ .../scanner/assets/js/context/tabs-context.js | 49 + .../useScannerWizardActions.js | 254 +++++ .../useScannerWizardEffects.js | 95 ++ .../scanner-context/useScannerWizardState.js | 90 ++ .../assets/js/hooks/use-alt-text-form.js | 159 ++- .../js/hooks/use-color-contrast-form.js | 267 ++--- .../js/hooks/use-global-manage-actions.js | 234 +++++ .../assets/js/hooks/use-manage-actions.js | 23 +- .../assets/js/hooks/use-manual-fix-form.js | 99 +- .../assets/js/hooks/use-scanner-settings.js | 29 +- .../scanner/assets/js/images/empty-image.js | 67 ++ modules/scanner/assets/js/images/index.js | 1 + modules/scanner/assets/js/index.js | 29 +- modules/scanner/assets/js/layouts/index.js | 14 +- .../assets/js/layouts/manage-main-layout.js | 47 - .../management/manage-alt-text-layout.js | 75 ++ .../manage-color-contrast-layout.js | 98 ++ .../layouts/management/manage-main-layout.js | 120 +++ .../manage-manual-layout.js} | 37 +- .../layouts/{ => scanner}/alt-text-layout.js | 4 +- .../{ => scanner}/color-contrast-layout.js | 2 +- .../{ => scanner}/heading-structure-layout.js | 0 .../js/layouts/{ => scanner}/main-layout.js | 0 .../js/layouts/{ => scanner}/manual-layout.js | 15 +- .../assets/js/services/scanner-wizard.js | 4 +- .../scanner/assets/js/styles/app.styles.js | 69 +- .../assets/js/styles/manual-fixes.styles.js | 15 +- .../scanner/assets/js/types/scanner-item.js | 4 + .../assets/js/utils/build-path-to-parent.js | 26 + .../assets/js/utils/calc-color-ratio.js | 2 + .../scanner/assets/js/utils/convert-colors.js | 30 - .../assets/js/utils/focus-on-element.js | 17 - .../js/utils/get-element-css-selector.js | 4 +- .../assets/js/utils/get-initial-tab.js | 7 + .../js/utils/get-outer-html-by-xpath.js | 44 + .../assets/js/utils/validate-headings.js | 4 +- modules/scanner/rest/scanner-results.php | 4 +- modules/settings/assets/js/app.js | 4 +- .../js/components/analytics/charts-list.js | 3 +- .../components/analytics/charts/line-chart.js | 2 +- .../capabilities-item/pro-item-infotip.js | 2 +- .../js/components/connect-modal/check-icon.js | 2 +- .../assets/js/components/copy-link/index.js | 2 +- .../assets/js/components/edit-link/index.js | 2 +- .../settings/assets/js/components/index.js | 1 - .../media-uploader/media-uploader.js | 2 +- .../js/components/my-account-menu/index.js | 12 +- .../components/my-account-menu/popup-menu.js | 8 +- .../assets/js/components/quota-bar/index.js | 5 +- .../components/quota-bar/quota-bar-group.js | 3 +- .../components/quota-bar/quota-indicator.js | 6 +- .../js/components/sidebar-menu/menu-item.js | 2 +- .../assets/js/components/sidebar-menu/menu.js | 12 +- .../tooltips/accessibility-statement.js | 2 +- .../sidebar-menu/tooltips/analytics.js | 2 +- .../js/components/sitemap-settings/index.js | 2 +- .../skip-to-content-settings/index.js | 2 +- .../js/components/upgrade-modal/index.js | 2 +- .../assets/js/layouts/position-settings.js | 3 +- .../settings/assets/js/layouts/quota-bar.js | 2 +- modules/settings/assets/js/layouts/sidebar.js | 2 +- .../assets/js/layouts/top-bar-menu.js | 4 +- .../js/pages/accessibility-statement.js | 2 +- .../assets/js/pages/assistant/stats/index.js | 2 +- package-lock.json | 993 +++++++++--------- package.json | 3 +- 150 files changed, 5926 insertions(+), 2105 deletions(-) rename {modules/settings/assets => assets/dev}/js/icons/crown-filled.js (100%) create mode 100644 assets/dev/js/utils/color-contrast-helpers.js create mode 100644 modules/remediation/database/global-remediation-relationship-entry.php create mode 100644 modules/remediation/database/global-remediation-relationship-table.php create mode 100644 modules/remediation/rest/global-item.php create mode 100644 modules/remediation/rest/global-items-group.php create mode 100644 modules/remediation/rest/global-items.php create mode 100644 modules/scanner/assets/js/components/block-button/button-menu.js create mode 100644 modules/scanner/assets/js/components/block-button/global-button-menu.js create mode 100644 modules/scanner/assets/js/components/empty-manage-message/index.js rename modules/scanner/assets/js/components/header/{header-container.js => app-header.js} (70%) delete mode 100644 modules/scanner/assets/js/components/header/stats/index.js rename modules/scanner/assets/js/components/header/title/{main-title.js => app-title.js} (78%) delete mode 100644 modules/scanner/assets/js/components/header/title/index.js delete mode 100644 modules/scanner/assets/js/components/header/title/manage-fixes-title.js delete mode 100644 modules/scanner/assets/js/components/header/title/manage-headings-title.js create mode 100644 modules/scanner/assets/js/components/manage-alt-text/index.js create mode 100644 modules/scanner/assets/js/components/manage-color-contrast/color-data.js create mode 100644 modules/scanner/assets/js/components/manage-color-contrast/index.js create mode 100644 modules/scanner/assets/js/components/manage-footer-actions/global/delete-global-item.js create mode 100644 modules/scanner/assets/js/components/manage-footer-actions/global/manage-global-actions.js create mode 100644 modules/scanner/assets/js/components/manage-footer-actions/index.js create mode 100644 modules/scanner/assets/js/components/manage-footer-actions/page/manage-page-actions.js create mode 100644 modules/scanner/assets/js/components/manage-footer-actions/page/set-global-remediation-modal.js create mode 100644 modules/scanner/assets/js/components/manage-footer-actions/page/set-global.js create mode 100644 modules/scanner/assets/js/components/manage-item-header/index.js delete mode 100644 modules/scanner/assets/js/components/manage-list/index.js delete mode 100644 modules/scanner/assets/js/components/manage-remediation-buttons/disable-button.js create mode 100644 modules/scanner/assets/js/components/manage-remediation-list/index.js create mode 100644 modules/scanner/assets/js/components/manage-remediation-main-controls/global/delete-global-button.js create mode 100644 modules/scanner/assets/js/components/manage-remediation-main-controls/global/global-remediation-control-menu.js create mode 100644 modules/scanner/assets/js/components/manage-remediation-main-controls/global/manage-global-remediation-control.js create mode 100644 modules/scanner/assets/js/components/manage-remediation-main-controls/index.js rename modules/scanner/assets/js/components/{manage-remediation-buttons => manage-remediation-main-controls/page}/delete-button.js (52%) create mode 100644 modules/scanner/assets/js/components/manage-remediation-main-controls/page/disable-button.js rename modules/scanner/assets/js/components/{manage-remediation-buttons => manage-remediation-main-controls/page}/enable-button.js (58%) rename modules/scanner/assets/js/components/{manage-remediation-buttons/index.js => manage-remediation-main-controls/page/manage-remediation-control.js} (54%) create mode 100644 modules/scanner/assets/js/components/remediation-confirmation-modal/delete-global-remediation-modal.js rename modules/scanner/assets/js/components/{delete-remediation-modal/index.js => remediation-confirmation-modal/delete-page-remediation-modal.js} (61%) create mode 100644 modules/scanner/assets/js/components/remediation-confirmation-modal/disable-global-remediation-modal.js create mode 100644 modules/scanner/assets/js/components/remediation-confirmation-modal/enable-global-remediation-modal.js create mode 100644 modules/scanner/assets/js/components/remediation-confirmation-modal/index.js create mode 100644 modules/scanner/assets/js/context/tabs-context.js create mode 100644 modules/scanner/assets/js/hooks/scanner-context/useScannerWizardActions.js create mode 100644 modules/scanner/assets/js/hooks/scanner-context/useScannerWizardEffects.js create mode 100644 modules/scanner/assets/js/hooks/scanner-context/useScannerWizardState.js create mode 100644 modules/scanner/assets/js/hooks/use-global-manage-actions.js create mode 100644 modules/scanner/assets/js/images/empty-image.js delete mode 100644 modules/scanner/assets/js/layouts/manage-main-layout.js create mode 100644 modules/scanner/assets/js/layouts/management/manage-alt-text-layout.js create mode 100644 modules/scanner/assets/js/layouts/management/manage-color-contrast-layout.js create mode 100644 modules/scanner/assets/js/layouts/management/manage-main-layout.js rename modules/scanner/assets/js/layouts/{remediation-layout.js => management/manage-manual-layout.js} (60%) rename modules/scanner/assets/js/layouts/{ => scanner}/alt-text-layout.js (94%) rename modules/scanner/assets/js/layouts/{ => scanner}/color-contrast-layout.js (97%) rename modules/scanner/assets/js/layouts/{ => scanner}/heading-structure-layout.js (100%) rename modules/scanner/assets/js/layouts/{ => scanner}/main-layout.js (100%) rename modules/scanner/assets/js/layouts/{ => scanner}/manual-layout.js (78%) create mode 100644 modules/scanner/assets/js/utils/build-path-to-parent.js create mode 100644 modules/scanner/assets/js/utils/get-initial-tab.js create mode 100644 modules/scanner/assets/js/utils/get-outer-html-by-xpath.js diff --git a/assets/dev/js/components/confirm-dialog/index.js b/assets/dev/js/components/confirm-dialog/index.js index fd294ad0..d0cadc9d 100644 --- a/assets/dev/js/components/confirm-dialog/index.js +++ b/assets/dev/js/components/confirm-dialog/index.js @@ -1,4 +1,4 @@ -import { AlertTriangleFilledIcon } from '@elementor/icons'; +import AlertTriangleFilledIcon from '@elementor/icons/AlertTriangleFilledIcon'; import Button from '@elementor/ui/Button'; import Dialog from '@elementor/ui/Dialog'; import DialogActions from '@elementor/ui/DialogActions'; diff --git a/assets/dev/js/components/notifications/index.js b/assets/dev/js/components/notifications/index.js index 66cc545b..2237dfb4 100644 --- a/assets/dev/js/components/notifications/index.js +++ b/assets/dev/js/components/notifications/index.js @@ -1,6 +1,6 @@ import Alert from '@elementor/ui/Alert'; import Snackbar from '@elementor/ui/Snackbar'; -import { useNotificationSettings } from '@ea11y/hooks'; +import { useNotificationSettings } from '@ea11y-apps/global/hooks/use-notifications'; const Notifications = ({ type, message }) => { const { diff --git a/modules/settings/assets/js/icons/crown-filled.js b/assets/dev/js/icons/crown-filled.js similarity index 100% rename from modules/settings/assets/js/icons/crown-filled.js rename to assets/dev/js/icons/crown-filled.js diff --git a/assets/dev/js/services/mixpanel/mixpanel-events.js b/assets/dev/js/services/mixpanel/mixpanel-events.js index de113e44..9e5b25fa 100644 --- a/assets/dev/js/services/mixpanel/mixpanel-events.js +++ b/assets/dev/js/services/mixpanel/mixpanel-events.js @@ -38,7 +38,7 @@ export const mixpanelEvents = { fixWithAiButtonClicked: 'fix_with_ai_button_clicked', markAsDecorativeSelected: 'mark_as_decorative_selected', resolveButtonClicked: 'resolve_button_clicked', - navigationImageClicked: 'navigation_image_clicked', + navigationChanged: 'navigation_changed', aiSuggestionAccepted: 'ai_suggestion_accepted', markAsResolveClicked: 'mark_as_resolve_clicked', issueSkipped: 'issue_skipped', @@ -50,6 +50,9 @@ export const mixpanelEvents = { contrastResetClicked: 'contrast_reset_clicked', backgroundAdaptorTriggered: 'background_adaptor_triggered', backgroundAdaptorChanged: 'background_adaptor_changed', + tabSelected: 'tab_selected', + markAsGlobalToggled: 'mark_as_global_toggled', + applyGlobalFixConfirmationClicked: 'apply_global_fix_confirmation_clicked', // Accessibility assistant dashboard assistantDashboardHistoryLogsButtonClicked: 'history_logs_button_clicked', diff --git a/assets/dev/js/utils/color-contrast-helpers.js b/assets/dev/js/utils/color-contrast-helpers.js new file mode 100644 index 00000000..1edbaefb --- /dev/null +++ b/assets/dev/js/utils/color-contrast-helpers.js @@ -0,0 +1,94 @@ +import postcss from 'postcss'; + +export const isValidCSS = (cssText) => { + try { + // Basic checks for common malicious patterns + if (!cssText || typeof cssText !== 'string') { + return false; + } + postcss.parse(cssText); + return true; + } catch (e) { + return false; + } +}; + +export const rgbOrRgbaToHex = (color) => { + const match = color.match( + /rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)/i, + ); + if (!match) { + return null; + } // Not an RGB or RGBA string + + const r = parseInt(match[1]).toString(16).padStart(2, '0'); + const g = parseInt(match[2]).toString(16).padStart(2, '0'); + const b = parseInt(match[3]).toString(16).padStart(2, '0'); + + // If alpha present and less than 1, include it + if (match[4] !== undefined && parseFloat(match[4]) < 1) { + const a = Math.round(parseFloat(match[4]) * 255) + .toString(16) + .padStart(2, '0'); + return `#${r}${g}${b}${a}`.toUpperCase(); // 8-digit hex with alpha + } + + return `#${r}${g}${b}`.toUpperCase(); // 6-digit hex +}; + +export const getDataFromCss = (cssRules) => { + const result = { color: null, background: null }; + + const ruleMatches = cssRules.matchAll(/([^{]+)\s*\{([^}]+)\}/g); + + for (const [, selector, declarations] of ruleMatches) { + let element; + try { + element = document.querySelector(selector.trim()); + } catch { + continue; // Skip invalid selectors + } + + const colorMatch = declarations.match( + /(?get_element_by_xpath( $this->data['xpath'] ); + $element_node = $this->data['global'] + ? $this->get_element_by_xpath_with_snippet_fallback( $this->data['xpath'], $this->data['find'] ) + : $this->get_element_by_xpath( $this->data['xpath'] ); + if ( ! $element_node ) { + $this->use_frontend = true; return null; } + switch ( $this->data['action'] ) { case 'update': case 'add': diff --git a/modules/remediation/actions/replace.php b/modules/remediation/actions/replace.php index d785e313..28e4df69 100644 --- a/modules/remediation/actions/replace.php +++ b/modules/remediation/actions/replace.php @@ -17,15 +17,20 @@ class Replace extends Remediation_Base { public static string $type = 'replace'; public function run() : ?DOMDocument { - $element_node = $this->get_element_by_xpath( $this->data['xpath'] ); + $element_node = $this->data['global'] + ? $this->get_element_by_xpath_with_snippet_fallback( $this->data['xpath'], $this->data['find'] ) + : $this->get_element_by_xpath( $this->data['xpath'] ); + if ( ! $element_node instanceof \DOMElement ) { + $this->use_frontend = true; return null; // nothing to do } $outer_html = $this->dom->saveHTML( $element_node ); if ( stripos( $outer_html, $this->data['find'] ) === false ) { - return $this->dom; + $this->use_frontend = true; + return null; } $updated_html = str_ireplace( $this->data['find'], $this->data['replace'], $outer_html ); @@ -36,7 +41,7 @@ public function run() : ?DOMDocument { $tmp_dom = new DOMDocument( '1.0', 'UTF-8' ); $tmp_dom->loadHTML( - mb_convert_encoding( $updated_html, 'HTML-ENTITIES', 'UTF-8' ), + mb_encode_numericentity( $updated_html, [ 0x80, 0x10FFFF, 0, 0x1FFFFF ], 'UTF-8' ), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD | LIBXML_NOERROR | LIBXML_NOWARNING ); diff --git a/modules/remediation/actions/styles.php b/modules/remediation/actions/styles.php index c709f0e8..fdba7c61 100644 --- a/modules/remediation/actions/styles.php +++ b/modules/remediation/actions/styles.php @@ -3,6 +3,7 @@ namespace EA11y\Modules\Remediation\Actions; use DOMDocument; +use DOMElement; use EA11y\Modules\Remediation\Classes\Remediation_Base; if ( ! defined( 'ABSPATH' ) ) { @@ -14,14 +15,145 @@ */ class Styles extends Remediation_Base { public static string $type = 'styles'; + public static string $style_id = 'ea11y-remediation-styles'; - public function __construct( DOMDocument $dom, $data ) { - parent::__construct( $dom, $data ); - $this->use_frontend = true; + /** + * Build a CSS selector string for a given DOMElement. + * + * @param DOMElement|null $element + * @return string|null + */ + public function get_element_css_selector( ?DOMElement $element ): ?string { + if ( ! $element ) { + return null; + } + + $parts = []; + + while ( $element && XML_ELEMENT_NODE === $element->nodeType ) { + $selector = strtolower( $element->tagName ); + + // If element has ID, stop here + if ( $element->hasAttribute( 'id' ) ) { + $selector .= '#' . $element->getAttribute( 'id' ); + array_unshift( $parts, $selector ); + break; + } + + // Add classes unless body + if ( $element->hasAttribute( 'class' ) && strtolower( $element->tagName ) !== 'body' ) { + $classes = preg_split( '/\s+/', trim( $element->getAttribute( 'class' ) ) ); + if ( ! empty( $classes ) ) { + $selector .= '.' . implode( '.', $classes ); + } + } + + // Add nth-of-type if needed + $parent = $element->parentNode; + if ( $parent instanceof DOMElement ) { + $tag_name = $element->tagName; + $siblings = []; + foreach ( $parent->childNodes as $child ) { + if ( $child instanceof DOMElement && $child->tagName === $tag_name ) { + $siblings[] = $child; + } + } + + if ( count( $siblings ) > 1 ) { + foreach ( $siblings as $i => $sibling ) { + if ( $sibling->isSameNode( $element ) ) { + $selector .= ':nth-of-type(' . ( $i + 1 ) . ')'; + break; + } + } + } + } + + array_unshift( $parts, $selector ); + $element = $element->parentNode instanceof DOMElement ? $element->parentNode : null; + } + + return implode( ' > ', $parts ); + } + + /** + * Replace CSS selectors for color and background-color rules. + * + * @param string $css The original CSS string + * @param string|null $color_selector New selector for color rule + * @param string|null $bg_selector New selector for background-color rule + * @return string The modified CSS + */ + public function replace_css_selectors( + string $css, + ?string $color_selector = null, + ?string $bg_selector = null + ): string { + // Match full CSS blocks like "selector { ... }" + preg_match_all( '/([^{]+)\{([^}]+)\}/', $css, $matches, PREG_SET_ORDER ); + + $result = ''; + + foreach ( $matches as $match ) { + $rules = trim( $match[2] ); + + // Find color value + if ( $color_selector && preg_match( '/(?data['rule']; + if ( $this->data['global'] ) { + $el_color = $this->get_element_by_xpath_with_snippet_fallback( $this->data['xpath'], $this->data['find'] ); + $el_bg = $this->get_element_by_xpath_with_snippet_fallback( $this->data['parentXPath'], $this->data['parentFind'] ); + $color_css_selector = $this->get_element_css_selector( $el_color ); + $bg_css_selector = $this->get_element_css_selector( $el_bg ); + + if ( ! $color_css_selector && ! $bg_css_selector ) { + $this->use_frontend = true; + return null; + } + + $rule = $this->replace_css_selectors( $rule, $color_css_selector, $bg_css_selector ); + } + + // Find or create element + $head = $this->dom->getElementsByTagName( 'head' )->item( 0 ); + if ( ! $head ) { + $head = $this->dom->createElement( 'head' ); + $html_element = $this->dom->getElementsByTagName( 'html' )->item( 0 ); + if ( $html_element ) { + $html_element->insertBefore( $head, $this->dom->getElementsByTagName( 'body' )->item( 0 ) ); + } else { + $this->dom->appendChild( $head ); + } + } + + // Create Date: Thu, 15 Jan 2026 11:00:19 +0100 Subject: [PATCH 250/292] [APP-0000] remove upgrade link on one (#483) --- modules/core/module.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/core/module.php b/modules/core/module.php index f9860c11..7ceab654 100644 --- a/modules/core/module.php +++ b/modules/core/module.php @@ -37,13 +37,14 @@ public function add_plugin_links( $links, $plugin_file_name ) : array { ), ]; - if ( Connect::is_connected() ) { + if ( Connect::is_connected() && ! Settings::is_elementor_one() ) { $custom_links['upgrade'] = sprintf( '%s', 'https://go.elementor.com/ally-plugins-upgrade/', esc_html__( 'Upgrade', 'pojo-accessibility' ) ); - } else { + } + if ( ! Connect::is_connected() ) { $custom_links['connect'] = sprintf( '%s', admin_url( 'admin.php?page=' . Settings::SETTING_BASE_SLUG ), From 7d2365d2e79a52a6f5e30d721be59a4e5ec830b5 Mon Sep 17 00:00:00 2001 From: VasylD Date: Fri, 16 Jan 2026 11:18:30 +0100 Subject: [PATCH 251/292] [APP-0000] remove upgrade link on one (#484) * [APP-0000] remove upgrade link on one * [APP-0000] remove upgrade link on one * [APP-0000] remove upgrade link on one * [APP-0000] remove upgrade link on one --- classes/services/client.php | 2 +- modules/settings/module.php | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/classes/services/client.php b/classes/services/client.php index 06591ed5..8b9970ec 100644 --- a/classes/services/client.php +++ b/classes/services/client.php @@ -198,7 +198,7 @@ protected function request( $method, $endpoint, $args = [] ) { // If there is mismatch then trigger the mismatch flow explicitly. if ( ! $this->refreshed && ! empty( $body->message ) && ( false !== strpos( $body->message, 'site url mismatch' ) ) ) { - // Connect::get_connect()->data()->set_home_url( 'https://wrongurl' ); + Connect::get_connect()->data()->set_home_url( 'https://wrongurl' ); return new WP_Error( 401, 'site url mismatch' ); } diff --git a/modules/settings/module.php b/modules/settings/module.php index cfaece5e..3ebc3628 100644 --- a/modules/settings/module.php +++ b/modules/settings/module.php @@ -569,7 +569,7 @@ public static function delete_plan_data_refresh_transient(): bool { * @return string */ public static function get_upgrade_link( $campaign ) : string { - $subscription_id = get_option('ea11y_subscription_id'); + $subscription_id = get_option( 'ea11y_subscription_id' ); if ( $subscription_id ) { return add_query_arg([ @@ -678,5 +678,10 @@ public function __construct() { // Register notices add_action( 'ea11y_register_notices', [ $this, 'register_notices' ] ); add_action( 'admin_notices', [ $this, 'admin_banners' ] ); + + // Add action on switch domain for update access token + add_action( 'elementor_one/' . Config::APP_PREFIX . '_switched_domain', function( $facade ) { + $facade->service()->renew_access_token(); + } ); } } From a9ae36ac0637350172ef22205e7efc0264d48499 Mon Sep 17 00:00:00 2001 From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com> Date: Fri, 16 Jan 2026 16:23:59 +0530 Subject: [PATCH 252/292] Update mismatch flow [APP-2355] (#485) * chore: update elementor assets package * fix: mismatch URL flow * update: move URL to constant --- assets/dev/js/constants/index.js | 3 +++ .../js/components/url-mismatch-modal/index.js | 13 +++++++++++++ package-lock.json | 8 ++++---- package.json | 2 +- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/assets/dev/js/constants/index.js b/assets/dev/js/constants/index.js index 7878748d..b841e31e 100644 --- a/assets/dev/js/constants/index.js +++ b/assets/dev/js/constants/index.js @@ -19,6 +19,9 @@ export const GOLINKS = { }; export const ELEMENTOR_URL = 'https://my.elementor.com'; +export const ONE_MISMATCH_URL = + '/wp-admin/admin.php?page=elementor-home#/home/url-mismatch'; + export const BLOCK_TITLES = { altText: __('Alternative text', 'pojo-accessibility'), dynamicContent: __('Dynamic Content & ARIA', 'pojo-accessibility'), diff --git a/modules/settings/assets/js/components/url-mismatch-modal/index.js b/modules/settings/assets/js/components/url-mismatch-modal/index.js index 65b9dd8c..b70cc76d 100644 --- a/modules/settings/assets/js/components/url-mismatch-modal/index.js +++ b/modules/settings/assets/js/components/url-mismatch-modal/index.js @@ -5,19 +5,27 @@ import Typography from '@elementor/ui/Typography'; import { styled } from '@elementor/ui/styles'; import { ConfirmDialog } from '@ea11y/components'; import { useModal } from '@ea11y/hooks'; +import { ONE_MISMATCH_URL } from '@ea11y-apps/global/constants'; import { useToastNotification } from '@ea11y-apps/global/hooks'; import { useState } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; import { addQueryArgs } from '@wordpress/url'; import APISettings from '../../api'; +import { usePluginSettingsContext } from '../../contexts/plugin-settings'; const UrlMismatchModal = () => { const { open, close } = useModal(true); const { error } = useToastNotification(); const [showNewConnectionConfirmation, setShowNewConnectionConfirmation] = useState(false); + const { isElementorOne } = usePluginSettingsContext(); const onUpdateConnectUrl = async () => { + if (isElementorOne) { + window.location.href = ONE_MISMATCH_URL; + return; + } + try { await APISettings.initConnect('update'); @@ -31,6 +39,11 @@ const UrlMismatchModal = () => { }; const onConnectAsNewSite = async () => { + if (isElementorOne) { + window.location.href = ONE_MISMATCH_URL; + return; + } + try { setShowNewConnectionConfirmation(false); await APISettings.clearSession(); diff --git a/package-lock.json b/package-lock.json index f185b2df..23358006 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "3.9.1", "dependencies": { "@elementor/design-tokens": "^1.1.4", - "@elementor/elementor-one-assets": "^0.4.18", + "@elementor/elementor-one-assets": "^0.4.21", "@elementor/icons": "^1.65.0", "@elementor/ui": "^1.37.3", "@emotion/cache": "^11.14.0", @@ -2207,9 +2207,9 @@ "license": "GPL-3.0-or-later" }, "node_modules/@elementor/elementor-one-assets": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/@elementor/elementor-one-assets/-/elementor-one-assets-0.4.18.tgz", - "integrity": "sha512-OS0ozMfIRiGqYXvPcwaoTSXmizix9skM8jAda2PId+Lx/rZmm0ThuK1+XYJOV+ttIynYxbrQ6PpJKTKNfI8uYw==", + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/@elementor/elementor-one-assets/-/elementor-one-assets-0.4.21.tgz", + "integrity": "sha512-VadsUmLFVDDiAck4V8qyukc1a06Z6OFnHDKTWRsyXOl6V7Mr2yo8c6ugorduHzvkWQA+xxwFBgZzAQN3UICg5g==", "license": "GPL-3.0-or-later", "dependencies": { "@elementor/icons": "^1.60.0", diff --git a/package.json b/package.json index 85c1224f..c27ea918 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ }, "dependencies": { "@elementor/design-tokens": "^1.1.4", - "@elementor/elementor-one-assets": "^0.4.18", + "@elementor/elementor-one-assets": "^0.4.21", "@elementor/icons": "^1.65.0", "@elementor/ui": "^1.37.3", "@emotion/cache": "^11.14.0", From 1d1ab127e0d57bf80a163f12976a0a4ce93c969b Mon Sep 17 00:00:00 2001 From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com> Date: Fri, 16 Jan 2026 20:25:10 +0530 Subject: [PATCH 253/292] update: mismatch modal logic (#486) --- modules/settings/assets/js/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js index 3810c9a6..ae7502c3 100644 --- a/modules/settings/assets/js/app.js +++ b/modules/settings/assets/js/app.js @@ -78,7 +78,7 @@ const App = () => { )} {isConnected && !closePostConnectModal && } - {isUrlMismatch && !isConnected && } + {isUrlMismatch && isConnected && } From 2f03974002fe978890744d901f84a1fdb13e4364 Mon Sep 17 00:00:00 2001 From: Rami Yushuvaev <92088692+rami-elementor@users.noreply.github.com> Date: Sat, 17 Jan 2026 23:09:38 -0800 Subject: [PATCH 254/292] [APP-2361] Hide Elementor's rating request (#487) --- modules/settings/assets/css/style.css | 12 ++++-------- modules/settings/assets/js/app.js | 2 +- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/modules/settings/assets/css/style.css b/modules/settings/assets/css/style.css index cbbfb68b..113a5611 100644 --- a/modules/settings/assets/css/style.css +++ b/modules/settings/assets/css/style.css @@ -16,14 +16,10 @@ body { margin-top: 0; } -html:not([dir="rtl"]) #ea11y-app { - margin-left: -20px; - background: #fff; - height: calc(100vh - 32px); -} - -html[dir="rtl"] #ea11y-app { - margin-right: -20px; +#ea11y-app { + position: relative; + z-index: 1; + margin-inline-start: -20px; background: #fff; height: calc(100vh - 32px); } diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js index ae7502c3..c8324208 100644 --- a/modules/settings/assets/js/app.js +++ b/modules/settings/assets/js/app.js @@ -121,7 +121,7 @@ const StyledContainer = styled(Box)` `; const StyledGrid = styled(Grid)` - height: calc(100% - 54.5px); + height: calc(100% - 48px); display: flex; flex-direction: row; From 21f32188a60ffc255f15e757752d8604648333ed Mon Sep 17 00:00:00 2001 From: VasylD Date: Sun, 18 Jan 2026 10:20:16 +0100 Subject: [PATCH 255/292] [APP-0000] show mismatch modal independent on connection state (#488) --- modules/settings/assets/js/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js index c8324208..cbc564ba 100644 --- a/modules/settings/assets/js/app.js +++ b/modules/settings/assets/js/app.js @@ -78,7 +78,7 @@ const App = () => { )} {isConnected && !closePostConnectModal && } - {isUrlMismatch && isConnected && } + {isUrlMismatch && } From e9c4dcaf7672ea1f09a5b46a5a41fe973219e6b3 Mon Sep 17 00:00:00 2001 From: Raz Ohad Date: Sun, 18 Jan 2026 20:25:58 +0700 Subject: [PATCH 256/292] Fix condition and variable interpolation in build.yml --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 89b47d5a..a235c01c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -78,7 +78,7 @@ jobs: retention-days: 14 - name: Push to Slack on PR merge - if: ${{ github.event.pull_request.merged == true }} + if: ${{ github.event.pull_request.merged == 'true' }} uses: slackapi/slack-github-action@v2.1.1 with: method: files.uploadV2 @@ -98,7 +98,7 @@ jobs: token: ${{ secrets.CLOUD_SLACK_BOT_TOKEN }} payload: | channel_id: "C07LFCFNGDB" - title: "Manuall ${{ github.event.pull_request.title }}" + title: "{{ github.event.pull_request.title }}" initial_comment: "Ally - A new build was triggered by ${{ github.actor }}." file: "pojo-accessibility.zip" filename: "pojo-accessibility.zip" From 16d0004b91446a7e36a8a9d2c028a39a21c820a4 Mon Sep 17 00:00:00 2001 From: Rami Yushuvaev <92088692+rami-elementor@users.noreply.github.com> Date: Mon, 19 Jan 2026 01:05:56 -0800 Subject: [PATCH 257/292] [App-0000] Remove unused icons (#491) --- assets/images/check-passed.svg | 3 -- assets/images/info.svg | 5 ---- assets/images/menu-icon-wp.svg | 3 -- assets/images/menu-icon.svg | 6 ---- assets/images/refresh-scan.svg | 4 --- .../js/components/sidebar-heading/index.js | 4 +-- .../assets/js/icons/analytics-icon.js | 16 ---------- modules/settings/assets/js/icons/app-logo.js | 29 ------------------ modules/settings/assets/js/icons/bulb.js | 15 ---------- .../settings/assets/js/icons/credit-card.js | 15 ---------- .../assets/js/icons/dashboard-icon.js | 16 ---------- modules/settings/assets/js/icons/index.js | 8 ----- modules/settings/assets/js/icons/logo-icon.js | 30 ------------------- modules/settings/assets/js/icons/site-map.js | 15 ---------- modules/settings/assets/js/icons/volume.js | 28 ----------------- 15 files changed, 2 insertions(+), 195 deletions(-) delete mode 100644 assets/images/check-passed.svg delete mode 100644 assets/images/info.svg delete mode 100644 assets/images/menu-icon-wp.svg delete mode 100644 assets/images/menu-icon.svg delete mode 100644 assets/images/refresh-scan.svg delete mode 100644 modules/settings/assets/js/icons/analytics-icon.js delete mode 100644 modules/settings/assets/js/icons/app-logo.js delete mode 100644 modules/settings/assets/js/icons/bulb.js delete mode 100644 modules/settings/assets/js/icons/credit-card.js delete mode 100644 modules/settings/assets/js/icons/dashboard-icon.js delete mode 100644 modules/settings/assets/js/icons/logo-icon.js delete mode 100644 modules/settings/assets/js/icons/site-map.js delete mode 100644 modules/settings/assets/js/icons/volume.js diff --git a/assets/images/check-passed.svg b/assets/images/check-passed.svg deleted file mode 100644 index 1b2f4705..00000000 --- a/assets/images/check-passed.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/info.svg b/assets/images/info.svg deleted file mode 100644 index 23857050..00000000 --- a/assets/images/info.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/assets/images/menu-icon-wp.svg b/assets/images/menu-icon-wp.svg deleted file mode 100644 index a65e43f7..00000000 --- a/assets/images/menu-icon-wp.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/menu-icon.svg b/assets/images/menu-icon.svg deleted file mode 100644 index edd80d77..00000000 --- a/assets/images/menu-icon.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/images/refresh-scan.svg b/assets/images/refresh-scan.svg deleted file mode 100644 index 6d52289e..00000000 --- a/assets/images/refresh-scan.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/modules/settings/assets/js/components/sidebar-heading/index.js b/modules/settings/assets/js/components/sidebar-heading/index.js index 79bd18c4..92bff70e 100644 --- a/modules/settings/assets/js/components/sidebar-heading/index.js +++ b/modules/settings/assets/js/components/sidebar-heading/index.js @@ -1,7 +1,7 @@ +import ElementorAccessibilityIcon from '@elementor/icons/ElementorAccessibilityIcon'; import Typography from '@elementor/ui/Typography'; import { styled } from '@elementor/ui/styles'; import { useSettings } from '@ea11y/hooks'; -import { LogoIcon } from '@ea11y/icons'; import { __ } from '@wordpress/i18n'; const SidebarHeading = () => { @@ -33,7 +33,7 @@ const StyledHeader = styled('div')` `; /* TODO: Replace the icon when marketing decide which icon to use */ -const StyledHeaderIcon = styled(LogoIcon)` +const StyledHeaderIcon = styled(ElementorAccessibilityIcon)` font-size: 2.5rem; padding: ${({ theme }) => theme.spacing(0.75)}; border: 1px solid ${({ theme }) => theme.palette.divider}; diff --git a/modules/settings/assets/js/icons/analytics-icon.js b/modules/settings/assets/js/icons/analytics-icon.js deleted file mode 100644 index da5c9632..00000000 --- a/modules/settings/assets/js/icons/analytics-icon.js +++ /dev/null @@ -1,16 +0,0 @@ -import SvgIcon from '@elementor/ui/SvgIcon'; - -const AnalyticsIcon = (props, { size }) => { - return ( - - - - ); -}; - -export default AnalyticsIcon; diff --git a/modules/settings/assets/js/icons/app-logo.js b/modules/settings/assets/js/icons/app-logo.js deleted file mode 100644 index d6616ffc..00000000 --- a/modules/settings/assets/js/icons/app-logo.js +++ /dev/null @@ -1,29 +0,0 @@ -import SvgIcon from '@elementor/ui/SvgIcon'; - -const AppLogo = () => { - return ( - - - - - - ); -}; - -export default AppLogo; diff --git a/modules/settings/assets/js/icons/bulb.js b/modules/settings/assets/js/icons/bulb.js deleted file mode 100644 index e9ac8cd9..00000000 --- a/modules/settings/assets/js/icons/bulb.js +++ /dev/null @@ -1,15 +0,0 @@ -import SvgIcon from '@elementor/ui/SvgIcon'; - -const BulbIcon = (props, { size }) => { - return ( - - - - ); -}; - -export default BulbIcon; diff --git a/modules/settings/assets/js/icons/credit-card.js b/modules/settings/assets/js/icons/credit-card.js deleted file mode 100644 index bbb52b8b..00000000 --- a/modules/settings/assets/js/icons/credit-card.js +++ /dev/null @@ -1,15 +0,0 @@ -import SvgIcon from '@elementor/ui/SvgIcon'; - -const CreditCardIcon = (props, { size }) => { - return ( - - - - ); -}; - -export default CreditCardIcon; diff --git a/modules/settings/assets/js/icons/dashboard-icon.js b/modules/settings/assets/js/icons/dashboard-icon.js deleted file mode 100644 index 3eb9c06b..00000000 --- a/modules/settings/assets/js/icons/dashboard-icon.js +++ /dev/null @@ -1,16 +0,0 @@ -import SvgIcon from '@elementor/ui/SvgIcon'; - -const DashboardIcon = ({ size }, props) => { - return ( - - - - ); -}; - -export default DashboardIcon; diff --git a/modules/settings/assets/js/icons/index.js b/modules/settings/assets/js/icons/index.js index 89470f59..ae74e364 100644 --- a/modules/settings/assets/js/icons/index.js +++ b/modules/settings/assets/js/icons/index.js @@ -1,16 +1,11 @@ -export { default as AppLogo } from './app-logo'; export { default as SquareRoundedChevronsLeft } from './square-rounded-chevrons-left'; export { default as WidgetIcon } from './widget'; export { default as UserArrowIcon } from './user-arrow'; -export { default as CreditCardIcon } from './credit-card'; export { default as TextSizeIcon } from './text-size'; export { default as LineHeightIcon } from './line-height'; -export { default as LogoIcon } from './logo-icon'; export { default as GrayscaleIcon } from './graysacale'; export { default as ContrastIcon } from './contrast'; -export { default as VolumeIcon } from './volume'; export { default as PageStructureIcon } from './page-structure'; -export { default as SiteMapIcon } from './site-map'; export { default as ReadingPanelIcon } from './reading-panel'; export { default as HideImagesIcon } from './hide-images'; export { default as PauseAnimationsIcon } from './pause-animations'; @@ -22,6 +17,3 @@ export { default as AccessibilityStatementExistingIcon } from './accessibility-s export { default as ProCrownIcon } from './pro-crown'; export { default as AccessibilityAssistantDashboardIcon } from './accessibility-assistant-dashboard-icon'; export { default as AccessibilityAssistantNoResultsIcon } from './accessibility-assistant-no-results-icon'; -export { default as AnalyticsIcon } from './analytics-icon'; -export { default as DashboardIcon } from './dashboard-icon'; -export { default as BulbIcon } from './bulb'; diff --git a/modules/settings/assets/js/icons/logo-icon.js b/modules/settings/assets/js/icons/logo-icon.js deleted file mode 100644 index 34e1d588..00000000 --- a/modules/settings/assets/js/icons/logo-icon.js +++ /dev/null @@ -1,30 +0,0 @@ -import SvgIcon from '@elementor/ui/SvgIcon'; - -const LogoIcon = (props, { size }) => { - return ( - - - - - ); -}; - -export default LogoIcon; diff --git a/modules/settings/assets/js/icons/site-map.js b/modules/settings/assets/js/icons/site-map.js deleted file mode 100644 index 1925dd7b..00000000 --- a/modules/settings/assets/js/icons/site-map.js +++ /dev/null @@ -1,15 +0,0 @@ -import SvgIcon from '@elementor/ui/SvgIcon'; - -const SiteMapIcon = (props, { size }) => { - return ( - - - - ); -}; - -export default SiteMapIcon; diff --git a/modules/settings/assets/js/icons/volume.js b/modules/settings/assets/js/icons/volume.js deleted file mode 100644 index f40f3e48..00000000 --- a/modules/settings/assets/js/icons/volume.js +++ /dev/null @@ -1,28 +0,0 @@ -import SvgIcon from '@elementor/ui/SvgIcon'; - -const VolumeIcon = (props, { size }) => { - return ( - - - - - ); -}; - -export default VolumeIcon; From 702f381bbb418cc1d2ee2897c1bf6c67e5a2b597 Mon Sep 17 00:00:00 2001 From: VasylD Date: Mon, 19 Jan 2026 13:09:19 +0100 Subject: [PATCH 258/292] [APP-0000] fix migration client id (#489) * [APP-0000] show mismatch modal independent on connection state * [APP-0000] show mismatch modal independent on connection state * [APP-0000] fix tab index * [APP-0000] fix tab index * [APP-0000] fix tab index --- modules/core/components/skip-link.php | 2 +- modules/settings/classes/settings.php | 1 + modules/settings/module.php | 22 +++++++++++++++++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/modules/core/components/skip-link.php b/modules/core/components/skip-link.php index 2babb0f3..286f3962 100644 --- a/modules/core/components/skip-link.php +++ b/modules/core/components/skip-link.php @@ -43,7 +43,7 @@ public function render_skip_link() {