diff --git a/.changeset/chilly-elephants-roll.md b/.changeset/chilly-elephants-roll.md new file mode 100644 index 0000000000..6a1ec8e146 --- /dev/null +++ b/.changeset/chilly-elephants-roll.md @@ -0,0 +1,7 @@ +--- +'@openproject/primer-view-components': patch +--- + +fix SegmentedControl alignment issues + + diff --git a/.changeset/clever-rockets-tan.md b/.changeset/clever-rockets-tan.md new file mode 100644 index 0000000000..fbf526b83b --- /dev/null +++ b/.changeset/clever-rockets-tan.md @@ -0,0 +1,11 @@ +--- +'@openproject/primer-view-components': minor +--- + +Update tooltip design +- Removes caret +- Decrease offset +- Remove animation delay +- Use v8 color tokens + + diff --git a/.changeset/eleven-steaks-press.md b/.changeset/eleven-steaks-press.md new file mode 100644 index 0000000000..379993c2ab --- /dev/null +++ b/.changeset/eleven-steaks-press.md @@ -0,0 +1,7 @@ +--- +'@openproject/primer-view-components': patch +--- + +Fixes issue where sometimes a dialog cannot be closed if another is open + + diff --git a/.changeset/large-actors-reply.md b/.changeset/large-actors-reply.md new file mode 100644 index 0000000000..84deffe7f7 --- /dev/null +++ b/.changeset/large-actors-reply.md @@ -0,0 +1,7 @@ +--- +'@openproject/primer-view-components': minor +--- + +Fix multi-select behavior when ActionMenus are embedded in dialogs + + diff --git a/.changeset/pink-wolves-fix.md b/.changeset/pink-wolves-fix.md new file mode 100644 index 0000000000..811ee3d1bc --- /dev/null +++ b/.changeset/pink-wolves-fix.md @@ -0,0 +1,7 @@ +--- +'@openproject/primer-view-components': minor +--- + +Allow ActionMenu items to submit multiple values on form submission; fix keyboard handling for submit items + + diff --git a/.changeset/poor-rats-jam.md b/.changeset/poor-rats-jam.md new file mode 100644 index 0000000000..1c9f1abd60 --- /dev/null +++ b/.changeset/poor-rats-jam.md @@ -0,0 +1,5 @@ +--- +"@openproject/primer-view-components": patch +--- + +Fix ActionBar issue where left and end key don't loop around to end of the action bar items. diff --git a/.changeset/purple-fans-pump.md b/.changeset/purple-fans-pump.md new file mode 100644 index 0000000000..301495b703 --- /dev/null +++ b/.changeset/purple-fans-pump.md @@ -0,0 +1,5 @@ +--- +"@openproject/primer-view-components": patch +--- + +Bug fix: Respect autofocus attributes inside of a Dialog when opening a modal-dialog. When the dialog was opening before it was always focusing the first focusable element which was always the close button. diff --git a/.github/dependabot.yml b/.github/dependabot.yml index b68e819dbe..0e93c0d1f2 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -21,8 +21,6 @@ updates: - "dependencies" - "skip changeset" - "npm" - allow: - - dependency-type: "production" - package-ecosystem: "npm" directory: "/demo" schedule: @@ -31,8 +29,6 @@ updates: - "dependencies" - "skip changeset" - "npm" - allow: - - dependency-type: "production" # Bundler - package-ecosystem: "bundler" @@ -43,8 +39,6 @@ updates: - "dependencies" - "skip changeset" - "bundler" - allow: - - dependency-type: "production" - package-ecosystem: "bundler" directory: "/demo" schedule: @@ -53,5 +47,3 @@ updates: - "dependencies" - "skip changeset" - "bundler" - allow: - - dependency-type: "production" diff --git a/.github/workflows/accessibility-alt-text-bot.yml b/.github/workflows/accessibility-alt-text-bot.yml index 81aacb65c3..6ce31ea6af 100644 --- a/.github/workflows/accessibility-alt-text-bot.yml +++ b/.github/workflows/accessibility-alt-text-bot.yml @@ -21,4 +21,4 @@ jobs: if: ${{ github.event.issue || github.event.pull_request || github.event.discussion }} steps: - name: Get action 'github/accessibility-alt-text-bot' - uses: github/accessibility-alt-text-bot@v1.3.0 + uses: github/accessibility-alt-text-bot@v1.4.0 diff --git a/.github/workflows/changesets.yml b/.github/workflows/changesets.yml deleted file mode 100644 index b57bbf40f3..0000000000 --- a/.github/workflows/changesets.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: Changesets -'on': - pull_request: - branches: - - DO_NOT_EXECUTE_THIS_WORKFLOW - -jobs: - validate: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - uses: gr2m/primer-release-changesets-validator-action@v1 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index ca38deeca4..8ca5510222 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -13,7 +13,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/demo-preview-destroy.yml b/.github/workflows/demo-preview-destroy.yml index a6da98cd22..07201438b7 100644 --- a/.github/workflows/demo-preview-destroy.yml +++ b/.github/workflows/demo-preview-destroy.yml @@ -35,7 +35,7 @@ jobs: subscription-id: "550eb99d-d0c7-4651-a337-f53fa6520c4f" - name: Check out repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Get preview app info run: ./.github/workflows/demo-preview-app-info.sh diff --git a/.github/workflows/demo-production-deploy.yml b/.github/workflows/demo-production-deploy.yml index bf67fa4711..049cee715d 100644 --- a/.github/workflows/demo-production-deploy.yml +++ b/.github/workflows/demo-production-deploy.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest environment: production steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Ruby uses: ruby/setup-ruby@v1 with: @@ -66,13 +66,13 @@ jobs: environment: production needs: build steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Ruby uses: ruby/setup-ruby@v1 with: ruby-version: '3.2' bundler-cache: true - - uses: actions/cache@v3.3.1 + - uses: actions/cache@v3.3.2 with: path: demo/gemfiles/vendor/bundle key: gems-build-kuby-main-ruby-3.2.x-${{ hashFiles('demo/gemfiles/kuby.gemfile.lock') }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 58c8f9e53a..e5e278b5f5 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -9,10 +9,10 @@ jobs: markdown: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Get specific changed files id: changed-files - uses: tj-actions/changed-files@v38.2.0 + uses: tj-actions/changed-files@v39.2.3 with: files: | **/*.md @@ -35,10 +35,10 @@ jobs: rubocop: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Get specific changed files id: changed-files - uses: tj-actions/changed-files@v38.2.0 + uses: tj-actions/changed-files@v39.2.3 with: files: | app/**/*.rb @@ -58,10 +58,10 @@ jobs: erblint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Get changed files id: changed-files - uses: tj-actions/changed-files@v38.2.0 + uses: tj-actions/changed-files@v39.2.3 with: files: | app/components/**/*.erb @@ -78,10 +78,10 @@ jobs: eslint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Get changed files id: changed-files - uses: tj-actions/changed-files@v38.2.0 + uses: tj-actions/changed-files@v39.2.3 with: files: | app/components/**/*.ts @@ -99,10 +99,10 @@ jobs: stylelint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Get changed files id: changed-files - uses: tj-actions/changed-files@v38.2.0 + uses: tj-actions/changed-files@v39.2.3 with: files: | app/components/**/*.pcss diff --git a/.github/workflows/preview-deploy.yml b/.github/workflows/preview-deploy.yml index fd23af683d..888d340a5c 100644 --- a/.github/workflows/preview-deploy.yml +++ b/.github/workflows/preview-deploy.yml @@ -34,7 +34,7 @@ jobs: # to link a PR to a list of environments later. url: ${{ env.APP_URL }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install lib deps uses: ruby/setup-ruby@v1 with: diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f06013a328..db8c5bdcbf 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -6,7 +6,7 @@ jobs: publish: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Ruby uses: ruby/setup-ruby@v1 with: diff --git a/.github/workflows/release-checklist.yml b/.github/workflows/release-checklist.yml index b2b2d34654..3cb959b076 100644 --- a/.github/workflows/release-checklist.yml +++ b/.github/workflows/release-checklist.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - uses: jwalton/gh-find-current-pr@v1 id: findPr diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c6877c0032..bfc9d553ae 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: # This makes Actions fetch all Git history so that Changesets can generate changelogs with the correct commits fetch-depth: 0 @@ -33,10 +33,6 @@ jobs: npm ci bundle install - # `changesets/action` depends on @changesets/cli being installed - # and we cannot add it as dependency because it conflicts with `primer-changesets-cli` - - run: npm install @changesets/cli@2.26.1 - - name: Create release pull request or publish to npm id: changesets uses: changesets/action@v1 diff --git a/.github/workflows/release_notification.yml b/.github/workflows/release_notification.yml deleted file mode 100644 index eee6379657..0000000000 --- a/.github/workflows/release_notification.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: Release notification -on: - pull_request: - branches: - - DO_NOT_EXECUTE_THIS_WORKFLOW - -jobs: - notify: - runs-on: ubuntu-latest - steps: - - uses: gr2m/release-notifier-action@v1 - with: - app_id: ${{ secrets.RELEASE_NOTIFIER_APP_ID }} - private_key: ${{ secrets.RELEASE_NOTIFIER_APP_PRIVATE_KEY }} - dispatch_event_type: 'release:primer/view_components' diff --git a/.github/workflows/static-files.yml b/.github/workflows/static-files.yml index 3bb9ef2964..a7f6817976 100644 --- a/.github/workflows/static-files.yml +++ b/.github/workflows/static-files.yml @@ -11,7 +11,7 @@ jobs: steps: # Unfortunately we can't use the primer GitHub App and camertron/github-app-installation-auth-action # because branch protection rules cannot be bypassed by Apps. - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: token: ${{ secrets.GPR_AUTH_TOKEN_SHARED }} - uses: ruby/setup-ruby@v1 @@ -29,7 +29,7 @@ jobs: bundle exec rake utilities:build bundle exec rake docs:build bundle exec rake static:dump - - uses: stefanzweifel/git-auto-commit-action@v4 + - uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: Generating static files commit_user_name: OpenProject CI diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1a85c8a2d3..7051bc60c3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -22,7 +22,7 @@ jobs: name: Accessibility runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 with: ruby-version: '3.2' @@ -56,7 +56,7 @@ jobs: - rails_version: "main" ruby_version: "3.2" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 with: ruby-version: ${{ matrix.ruby_version }} @@ -98,7 +98,7 @@ jobs: - rails_version: "main" ruby_version: "3.2" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 with: ruby-version: ${{ matrix.ruby_version }} @@ -140,7 +140,7 @@ jobs: - rails_version: "main" ruby_version: "3.2" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 with: ruby-version: ${{ matrix.ruby_version }} @@ -163,7 +163,7 @@ jobs: name: System runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 with: ruby-version: '3.2' @@ -188,7 +188,7 @@ jobs: timeout-minutes: 20 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 with: ruby-version: '3.2' @@ -215,7 +215,7 @@ jobs: continue-on-error: true run: npx playwright test --workers 6 - id: auto-commit - uses: stefanzweifel/git-auto-commit-action@v4 + uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: Generating component snapshots file_pattern: .playwright/screenshots/**/*.png @@ -244,7 +244,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Ruby uses: ruby/setup-ruby@v1 with: diff --git a/.github/workflows/triage.yml b/.github/workflows/triage.yml index 0344b0b07f..20c492bb5e 100644 --- a/.github/workflows/triage.yml +++ b/.github/workflows/triage.yml @@ -36,7 +36,7 @@ jobs: - if: "contains(github.event.pull_request.labels.*.name, 'skip changeset')" run: echo "passed"; exit 0; - if: "!contains(github.event.pull_request.labels.*.name, 'skip changeset')" - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.sha }} - if: "!contains(github.event.pull_request.labels.*.name, 'skip changeset')" diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/action_bar/default/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/action_bar/default/focused.png index c62b390ac5..edf6089fc0 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/action_bar/default/focused.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/action_bar/default/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/banner/with_action_content/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/banner/with_action_content/focused.png index 8692698f8a..28d8359e4a 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/banner/with_action_content/focused.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/banner/with_action_content/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/default/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/default/focused.png index 30b0b054df..4a6ff83e42 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/default/focused.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/default/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/full_width_large/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/full_width_large/focused.png index 9b38c7e326..9fd799b1de 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/full_width_large/focused.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/full_width_large/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/full_width_medium/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/full_width_medium/focused.png index 7263d5529a..a739eea1af 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/full_width_medium/focused.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/full_width_medium/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/full_width_small/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/full_width_small/focused.png index 06991b78b2..32b352e4c9 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/full_width_small/focused.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/full_width_small/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icon_only_large/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icon_only_large/focused.png index a2323c1863..85ee0506c2 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icon_only_large/focused.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icon_only_large/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icon_only_medium/default.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icon_only_medium/default.png index 31b79f4e6a..7d0c8db7b2 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icon_only_medium/default.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icon_only_medium/default.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icon_only_medium/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icon_only_medium/focused.png index 23a26cafb0..b6f288ecc9 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icon_only_medium/focused.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icon_only_medium/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icon_only_small/default.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icon_only_small/default.png index c969a73a45..60bab1671a 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icon_only_small/default.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icon_only_small/default.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icon_only_small/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icon_only_small/focused.png index 60523496f3..ec50fb8888 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icon_only_small/focused.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icon_only_small/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icons_and_text_large/default.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icons_and_text_large/default.png index 07fc961bd3..4f89d93ea1 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icons_and_text_large/default.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icons_and_text_large/default.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icons_and_text_large/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icons_and_text_large/focused.png index f4b33fe71a..32cc978bfe 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icons_and_text_large/focused.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icons_and_text_large/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icons_and_text_medium/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icons_and_text_medium/focused.png index 08172c896f..f11a3b7724 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icons_and_text_medium/focused.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icons_and_text_medium/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icons_and_text_small/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icons_and_text_small/focused.png index 5ed081054a..35bcf3d1a2 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icons_and_text_small/focused.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/icons_and_text_small/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/trailing_label_width_large/default.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/trailing_label_width_large/default.png new file mode 100644 index 0000000000..1c0bdee5a7 Binary files /dev/null and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/trailing_label_width_large/default.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/trailing_label_width_large/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/trailing_label_width_large/focused.png new file mode 100644 index 0000000000..740ab6568a Binary files /dev/null and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/trailing_label_width_large/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/trailing_label_width_medium/default.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/trailing_label_width_medium/default.png new file mode 100644 index 0000000000..dc45aac275 Binary files /dev/null and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/trailing_label_width_medium/default.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/trailing_label_width_medium/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/trailing_label_width_medium/focused.png new file mode 100644 index 0000000000..312893baa5 Binary files /dev/null and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/trailing_label_width_medium/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/trailing_label_width_small/default.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/trailing_label_width_small/default.png new file mode 100644 index 0000000000..46a99ab44c Binary files /dev/null and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/trailing_label_width_small/default.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/trailing_label_width_small/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/trailing_label_width_small/focused.png new file mode 100644 index 0000000000..48f4b83c7c Binary files /dev/null and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/trailing_label_width_small/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/with_label_and_caption/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/with_label_and_caption/focused.png index 4dc4352ba0..784ebbeb9b 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/with_label_and_caption/focused.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/with_label_and_caption/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/with_link_as_tag/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/with_link_as_tag/focused.png index 08172c896f..f11a3b7724 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/with_link_as_tag/focused.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/with_link_as_tag/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/with_subhead_actions/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/with_subhead_actions/focused.png index a001ca1b8c..473a165cc5 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/with_subhead_actions/focused.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/segmented_control/with_subhead_actions/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/text_field/input_group_leading_button/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/text_field/input_group_leading_button/focused.png index f8997a0f0b..c720cba29c 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/text_field/input_group_leading_button/focused.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/alpha/text_field/input_group_leading_button/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/button/inactive/default.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/button/inactive/default.png new file mode 100644 index 0000000000..8ec5abab5d Binary files /dev/null and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/button/inactive/default.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/button/inactive/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/button/inactive/focused.png new file mode 100644 index 0000000000..b88af23e36 Binary files /dev/null and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/button/inactive/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/button_group/all_tags/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/button_group/all_tags/focused.png index 5bfaffdc47..2bc76a4fcb 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/button_group/all_tags/focused.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/button_group/all_tags/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/button_group/icon_buttons/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/button_group/icon_buttons/focused.png index 416ededf80..5bba84ce38 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/button_group/icon_buttons/focused.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/button_group/icon_buttons/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/flash/options_dismissible/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/flash/options_dismissible/focused.png index fc4931bf3d..2c8950a48c 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/flash/options_dismissible/focused.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/flash/options_dismissible/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/icon_button/danger/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/icon_button/danger/focused.png index ff0b9ff0c7..6a587a5d03 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/icon_button/danger/focused.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/icon_button/danger/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/icon_button/default/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/icon_button/default/focused.png index 16dec7b9f2..e6afd75617 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/icon_button/default/focused.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/icon_button/default/focused.png differ diff --git a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/icon_button/invisible/focused.png b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/icon_button/invisible/focused.png index 9cd5228050..6991127d5d 100644 Binary files a/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/icon_button/invisible/focused.png and b/.playwright/screenshots/snapshots.test.ts-snapshots/primer/beta/icon_button/invisible/focused.png differ diff --git a/.rubocop.yml b/.rubocop.yml index 2639bba850..8d899ec677 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -3,6 +3,7 @@ inherit_gem: - config/default_edge.yml - config/rails_edge.yml require: + - rubocop-rails-accessibility - rubocop/cop/primer AllCops: diff --git a/Gemfile b/Gemfile index cd266f4782..3912bf91fd 100644 --- a/Gemfile +++ b/Gemfile @@ -31,7 +31,7 @@ end # rubocop:enable Bundler/DuplicatedGem # Use Puma as the app server -gem "puma", "~> 6.3.1" +gem "puma", "~> 6.4.0" # Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker gem "webpacker", "~> 5.0" @@ -41,7 +41,8 @@ gem "bootsnap", ">= 1.4.2", require: false gem "lookbook", "~> 2.1.1" unless rails_version.to_f < 7 gem "view_component", path: ENV["VIEW_COMPONENT_PATH"] if ENV["VIEW_COMPONENT_PATH"] -gem "sourcemap" +gem "sourcemap", "~> 0.1" +gem "kramdown", "~> 2.4" group :test do gem "webmock" @@ -51,3 +52,30 @@ group :test do # Remove this line when mocha has fixed the issue gem "minitest", "< 5.19" end + +# development dependencies +group :development do + gem "allocation_stats", "~> 0.1" + gem "allocation_tracer", "~> 0.6.3" + gem "benchmark-ips", "~> 2.8.4" + gem "capybara", "~> 3.39.2" + gem "cuprite", "~> 0.14.3" + gem "erb_lint", "~> 0.4.0" + gem "erblint-github", "~> 0.4.1" + gem "listen", "~> 3.0" + gem "matrix", "~> 0.4.2" + gem "mocha" + gem "pry" + gem "rubocop", "= 1.13.0" + gem "rubocop-github", "~> 0.16.0" + gem "rubocop-performance", "~> 1.7" + gem "rubocop-rails" + gem "rubocop-rails-accessibility", "~> 0.2.0" + gem "simplecov", "~> 0.22.0" + gem "simplecov-console", "~> 0.9.1" + gem "sprockets" + gem "sprockets-rails" + gem "thor" + gem "timecop" + gem "yard", "~> 0.9.25" +end diff --git a/Gemfile.lock b/Gemfile.lock index 09ae5e1949..b6a9249101 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -57,7 +57,7 @@ GEM regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) coderay (1.1.3) - concurrent-ruby (1.2.0) + concurrent-ruby (1.2.2) crack (0.4.5) rexml crass (1.0.6) @@ -74,7 +74,7 @@ GEM rainbow rubocop smart_properties - erblint-github (0.4.0) + erblint-github (0.4.1) erubi (1.12.0) ferrum (0.13) addressable (~> 2.5) @@ -87,6 +87,8 @@ GEM htmlentities (4.3.4) i18n (1.12.0) concurrent-ruby (~> 1.0) + kramdown (2.4.0) + rexml listen (3.8.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) @@ -111,7 +113,7 @@ GEM mini_mime (1.1.2) mini_portile2 (2.8.1) minitest (5.18.1) - mocha (2.0.4) + mocha (2.1.0) ruby2_keywords (>= 0.0.5) msgpack (1.7.0) nio4r (2.5.9) @@ -128,7 +130,7 @@ GEM coderay (~> 1.1) method_source (~> 1.0) public_suffix (5.0.1) - puma (6.3.1) + puma (6.4.0) nio4r (~> 2.0) racc (1.6.2) rack (2.2.8) @@ -181,10 +183,12 @@ GEM activesupport (>= 4.2.0) rack (>= 1.1) rubocop (>= 0.87.0) + rubocop-rails-accessibility (0.2.0) + rubocop (>= 1.0.0) ruby-progressbar (1.11.0) ruby2_keywords (0.0.5) semantic_range (3.0.0) - simplecov (0.21.2) + simplecov (0.22.0) docile (~> 1.1) simplecov-html (~> 0.11) simplecov_json_formatter (~> 0.1) @@ -196,7 +200,7 @@ GEM simplecov_json_formatter (0.1.4) smart_properties (1.17.0) sourcemap (0.1.1) - sprockets (4.2.0) + sprockets (4.2.1) concurrent-ruby (~> 1.0) rack (>= 2.2.4, < 4) sprockets-rails (3.4.2) @@ -205,7 +209,7 @@ GEM sprockets (>= 3.0.0) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) - thor (1.2.1) + thor (1.3.0) timecop (0.9.6) tzinfo (2.0.6) concurrent-ruby (~> 1.0) @@ -248,7 +252,8 @@ DEPENDENCIES capybara (~> 3.39.2) cuprite (~> 0.14.3) erb_lint (~> 0.4.0) - erblint-github (= 0.4.0) + erblint-github (~> 0.4.1) + kramdown (~> 2.4) listen (~> 3.0) lookbook (~> 2.1.1) matrix (~> 0.4.2) @@ -256,7 +261,7 @@ DEPENDENCIES mocha openproject-primer_view_components! pry - puma (~> 6.3.1) + puma (~> 6.4.0) rack (~> 2.2) rack-cors railties (= 7.0.3) @@ -264,9 +269,11 @@ DEPENDENCIES rubocop (= 1.13.0) rubocop-github (~> 0.16.0) rubocop-performance (~> 1.7) - simplecov (~> 0.21.2) + rubocop-rails + rubocop-rails-accessibility (~> 0.2.0) + simplecov (~> 0.22.0) simplecov-console (~> 0.9.1) - sourcemap + sourcemap (~> 0.1) sprockets sprockets-rails thor diff --git a/app/components/primer/alpha/action_bar.rb b/app/components/primer/alpha/action_bar.rb index 79c3b65432..a8473e6bc2 100644 --- a/app/components/primer/alpha/action_bar.rb +++ b/app/components/primer/alpha/action_bar.rb @@ -16,14 +16,14 @@ class ActionBar < Primer::Component SIZE_OPTIONS = SIZE_MAPPINGS.keys.freeze renders_many :items, types: { - icon_button: lambda { |icon:, label:, **system_arguments| + icon_button: lambda { |icon:, label:, item_arguments: {}, **system_arguments| item_id = self.class.generate_id with_menu_item(id: item_id, label: label) do |c| c.with_leading_visual_icon(icon: icon) end - Item.new(Primer::Beta::IconButton.new(id: item_id, icon: icon, "aria-label": label, size: @size, scheme: :invisible, **system_arguments)) + Item.new(Primer::Beta::IconButton.new(id: item_id, icon: icon, "aria-label": label, size: @size, scheme: :invisible, **system_arguments), **item_arguments) }, divider: lambda { @action_menu.with_divider(hidden: true) if @overflow_menu diff --git a/app/components/primer/alpha/action_bar/item.rb b/app/components/primer/alpha/action_bar/item.rb index 28e571d03f..6a507c99e7 100644 --- a/app/components/primer/alpha/action_bar/item.rb +++ b/app/components/primer/alpha/action_bar/item.rb @@ -7,14 +7,17 @@ module Alpha class ActionBar # ActionBar::Item is an internal component that wraps the items in a div with the `ActionBar-item` class. class Item < Primer::Component - def initialize(item_content) + # @param item_content [String] The content to render inside the item. + # @param item_arguments [Hash] <%= link_to_system_arguments_docs %> + def initialize(item_content, **item_arguments) @system_arguments = { - tag: :div, + tag: item_arguments[:tag] || :div, data: { targets: "action-bar.items" - }, - classes: "ActionBar-item" + }.merge(item_arguments[:data] || {}), + classes: class_names("ActionBar-item", item_arguments[:classes]) } + @item_content = item_content end diff --git a/app/components/primer/alpha/action_bar_element.ts b/app/components/primer/alpha/action_bar_element.ts index 87c857f9a5..97d2fa0d7b 100644 --- a/app/components/primer/alpha/action_bar_element.ts +++ b/app/components/primer/alpha/action_bar_element.ts @@ -82,15 +82,22 @@ class ActionBarElement extends HTMLElement { if (this.#focusZoneAbortController) { this.#focusZoneAbortController.abort() } - this.#focusZoneAbortController = focusZone(this.itemContainer, { + this.#focusZoneAbortController = focusZone(this, { bindKeys: FocusKeys.ArrowHorizontal | FocusKeys.HomeAndEnd, focusOutBehavior: 'wrap', focusableElementFilter: element => { - return !element.closest('.ActionBar-item[hidden]') + return this.#isVisible(element) } }) } + #isVisible(element: HTMLElement): boolean { + // Safari doesn't support `checkVisibility` yet. + if (typeof element.checkVisibility === 'function') return element.checkVisibility() + + return Boolean(element.offsetParent || element.offsetWidth || element.offsetHeight) + } + #itemGap(): number { return parseInt(window.getComputedStyle(this.itemContainer)?.columnGap, 10) || 0 } diff --git a/app/components/primer/alpha/action_list/form_wrapper.html.erb b/app/components/primer/alpha/action_list/form_wrapper.html.erb index 71443377ae..eef78ef634 100644 --- a/app/components/primer/alpha/action_list/form_wrapper.html.erb +++ b/app/components/primer/alpha/action_list/form_wrapper.html.erb @@ -1,7 +1,9 @@ <% if form_required? %> <%= form_with(url: @action, method: @http_method, **@form_arguments) do %> - <% if render_input? %> - <%= render(Primer::BaseComponent.new(tag: :input, **@input_arguments)) %> + <% if render_inputs? %> + <% @inputs.each do |input_arguments| %> + <%= render(Primer::BaseComponent.new(tag: :input, **input_arguments)) %> + <% end %> <% end %> <%= content %> <% end %> diff --git a/app/components/primer/alpha/action_list/form_wrapper.rb b/app/components/primer/alpha/action_list/form_wrapper.rb index 7ce1fc68d6..b44e98f5c8 100644 --- a/app/components/primer/alpha/action_list/form_wrapper.rb +++ b/app/components/primer/alpha/action_list/form_wrapper.rb @@ -24,14 +24,25 @@ def initialize(list:, action: nil, **form_arguments) name = @form_arguments.delete(:name) value = @form_arguments.delete(:value) || name + inputs = @form_arguments.delete(:inputs) || [] - @input_arguments = { - type: :hidden, - name: name, - value: value, - data: { list_item_input: true }, - **(@form_arguments.delete(:input_arguments) || {}) - } + # For the older version of this component that only allowed you to + # specify a single input + if inputs.empty? + inputs << { + name: name, + value: value, + **(@form_arguments.delete(:input_arguments) || {}) + } + end + + @inputs = inputs.map do |input_data| + input_data = input_data.dup + input_data[:type] ||= :hidden + input_data[:data] ||= {} + input_data[:data][:list_item_input] = true + input_data + end end def get? @@ -42,8 +53,8 @@ def form_required? @action && !get? end - def render_input? - @input_arguments[:name].present? + def render_inputs? + @inputs.present? end private diff --git a/app/components/primer/alpha/action_menu.rb b/app/components/primer/alpha/action_menu.rb index be7c767708..a87eb0f1ea 100644 --- a/app/components/primer/alpha/action_menu.rb +++ b/app/components/primer/alpha/action_menu.rb @@ -3,14 +3,131 @@ module Primer module Alpha - # ActionMenu is used for actions, navigation, to display secondary options, or single/multi select lists. They appear when users interact with buttons, actions, or other controls. + # ActionMenu is used for actions, navigation, to display secondary options, or single/multi select lists. They appear when + # users interact with buttons, actions, or other controls. # # The only allowed elements for the `Item` components are: `:a`, `:button`, and `:clipboard-copy`. The default is `:button`. # + # ### Select variants + # + # While `ActionMenu`s default to a list of buttons that can link to other pages, copy text to the clipboard, etc, they also support + # `single` and `multiple` select variants. The single select variant allows a single item to be "selected" (i.e. marked "active") + # when clicked, which will cause a check mark to appear to the left of the item text. When the `multiple` select variant is chosen, + # multiple items may be selected and check marks will appear next to each selected item. + # + # Use the `select_variant:` option to control which variant the `ActionMenu` uses. For more information, see the documentation on + # supported arguments below. + # + # ### Dynamic labels + # + # When using the `single` select variant, an optional label indicating the selected item can be displayed inside the menu button. + # Dynamic labels can also be prefixed with custom text. + # + # Pass `dynamic_label: true` to enable dynamic label behavior, and pass `dynamic_label_prefix: ""` to set a custom prefix. + # For more information, see the documentation on supported arguments below. + # + # ### `ActionMenu`s as form inputs + # + # When using either the `single` or `multiple` select variants, `ActionMenu`s can be used as form inputs. They behave very + # similarly to how HTML `` element.| + # |`inputs` |`Array` |`[]` |An array of hashes representing HTML `` elements. Must contain at least `name:` and `value:` keys. If additional key/value pairs are provided, they are emitted as HTML attributes on the `` element. This argument supercedes the `name:`, `value:`, and `:input_arguments` arguments listed above.| + # + # The elements of the `inputs:` array will be emitted as HTML `` elements. + # # @accessibility - # The action for the menu item needs to be on the element with `role="menuitem"`. Semantics are removed for everything nested inside of it. When a menu item is selected, the menu will close immediately. + # The action for the menu item needs to be on the element with `role="menuitem"`. Semantics are removed for everything + # nested inside of it. When a menu item is selected, the menu will close immediately. # - # Additional information around the keyboard functionality and implementation can be found on the [WAI-ARIA Authoring Practices](https://www.w3.org/TR/wai-aria-practices-1.2/#menu). + # Additional information around the keyboard functionality and implementation can be found on the + # [WAI-ARIA Authoring Practices](https://www.w3.org/TR/wai-aria-practices-1.2/#menu). class ActionMenu < Primer::Component status :alpha diff --git a/app/components/primer/alpha/action_menu/action_menu_element.ts b/app/components/primer/alpha/action_menu/action_menu_element.ts index 5be41bd09c..66815487b0 100644 --- a/app/components/primer/alpha/action_menu/action_menu_element.ts +++ b/app/components/primer/alpha/action_menu/action_menu_element.ts @@ -20,6 +20,7 @@ export class ActionMenuElement extends HTMLElement { #abortController: AbortController #originalLabel = '' #inputName = '' + #invokerBeingClicked = false get selectVariant(): SelectVariant { return this.getAttribute('data-select-variant') as SelectVariant @@ -52,7 +53,7 @@ export class ActionMenuElement extends HTMLElement { } get popoverElement(): HTMLElement | null { - return this.invokerElement?.popoverTargetElement || null + return (this.invokerElement?.popoverTargetElement as HTMLElement) || null } get invokerElement(): HTMLButtonElement | null { @@ -94,8 +95,10 @@ export class ActionMenuElement extends HTMLElement { this.addEventListener('click', this, {signal}) this.addEventListener('mouseover', this, {signal}) this.addEventListener('focusout', this, {signal}) + this.addEventListener('mousedown', this, {signal}) this.#setDynamicLabel() this.#updateInput() + this.#softDisableItems() if (this.includeFragment) { this.includeFragment.addEventListener('include-fragment-replaced', this, { @@ -104,102 +107,218 @@ export class ActionMenuElement extends HTMLElement { } } + #softDisableItems() { + const {signal} = this.#abortController + + for (const item of this.#items) { + item.addEventListener('click', this.#potentiallyDisallowActivation.bind(this), {signal}) + item.addEventListener('keydown', this.#potentiallyDisallowActivation.bind(this), {signal}) + } + } + + #potentiallyDisallowActivation(event: Event) { + if (!this.#isActivation(event)) return + + const item = (event.target as HTMLElement).closest(menuItemSelectors.join(',')) + if (!item) return + + if (item.getAttribute('aria-disabled')) { + event.preventDefault() + event.stopPropagation() + event.stopImmediatePropagation() + } + } + disconnectedCallback() { this.#abortController.abort() } + #isKeyboardActivation(event: Event): boolean { + return ( + event instanceof KeyboardEvent && + event.type === 'keydown' && + !(event.ctrlKey || event.altKey || event.metaKey || event.shiftKey) && + (event.key === 'Enter' || event.key === ' ') + ) + } + + #isMouseActivation(event: Event): boolean { + return event instanceof MouseEvent && event.type === 'click' + } + + #isActivation(event: Event): boolean { + return this.#isMouseActivation(event) || this.#isKeyboardActivation(event) + } + handleEvent(event: Event) { - const activation = this.#isActivationKeydown(event) - if (event.target === this.invokerElement && activation) { - if (this.#firstItem) { - event.preventDefault() - this.popoverElement?.showPopover() - this.#firstItem.focus() - return - } + const targetIsInvoker = this.invokerElement?.contains(event.target as HTMLElement) + const eventIsActivation = this.#isActivation(event) + + if (targetIsInvoker && event.type === 'mousedown') { + this.#invokerBeingClicked = true + return + } + + // Prevent safari bug that dismisses menu on mousedown instead of allowing + // the click event to propagate to the button + if (event.type === 'mousedown') { + event.preventDefault() + return } - // Ignore events within dialogs within menus - if ((event.target as Element)?.closest('dialog') || (event.target as Element)?.closest('modal-dialog')) { + if (targetIsInvoker && eventIsActivation) { + this.#handleInvokerActivated(event) + this.#invokerBeingClicked = false return } - // If a dialog has been rendered within the menu, we do not want to hide - // the entire menu, as that will also hide the Dialog. Instead we want to - // show the Dialog while hiding just the visible part of the menu. - if ((activation || event.type === 'click') && (event.target as HTMLElement)?.closest('[data-show-dialog-id]')) { - const dialogInvoker = (event.target as HTMLElement)!.closest('[data-show-dialog-id]') - const dialog = this.ownerDocument.getElementById(dialogInvoker?.getAttribute('data-show-dialog-id') || '') - if (dialogInvoker && dialog && this.contains(dialogInvoker) && this.contains(dialog)) { - this.querySelector('.ActionListWrap')!.style.display = 'none' - const dialog_controller = new AbortController() - const {signal} = dialog_controller - const handleDialogClose = () => { - dialog_controller.abort() - this.querySelector('.ActionListWrap')!.style.display = '' - if (this.popoverElement?.matches(':popover-open')) { - this.popoverElement?.hidePopover() - } + if (event.type === 'focusout') { + if (this.#invokerBeingClicked) return + + // Give the browser time to focus the next element + requestAnimationFrame(() => { + if (!this.contains(document.activeElement) || document.activeElement === this.invokerElement) { + this.#handleFocusOut() } - dialog.addEventListener('close', handleDialogClose, {signal}) - dialog.addEventListener('cancel', handleDialogClose, {signal}) - return - } + }) + + return } - if (!this.popoverElement?.matches(':popover-open')) return + const item = (event.target as Element).closest(menuItemSelectors.join(',')) + const targetIsItem = item !== null - if (event.type === 'include-fragment-replaced') { - if (this.#firstItem) this.#firstItem.focus() - } else if (activation || (event instanceof MouseEvent && event.type === 'click')) { - // Hide popover after current event loop to prevent changes in focus from - // altering the target of the event. Not doing this specifically affects - // tags. It causes the event to be sent to the currently focused element - // instead of the anchor, which effectively prevents navigation, i.e. it - // appears as if hitting enter does nothing. Curiously, clicking instead - // works fine. - if (this.selectVariant !== 'multiple') { - setTimeout(() => { - if (this.popoverElement?.matches(':popover-open')) { - this.popoverElement?.hidePopover() - } - }) + if (targetIsItem && eventIsActivation) { + const dialogInvoker = item.closest('[data-show-dialog-id]') + + if (dialogInvoker) { + const dialog = this.ownerDocument.getElementById(dialogInvoker.getAttribute('data-show-dialog-id') || '') + + if (dialog && this.contains(dialogInvoker) && this.contains(dialog)) { + this.#handleDialogItemActivated(event, dialog) + return + } } - // The rest of the code below deals with single/multiple selection behavior, and should not - // interfere with events fired by menu items whose behavior is specified outside the library. - if (this.selectVariant !== 'multiple' && this.selectVariant !== 'single') return + this.#activateItem(event, item) + this.#handleItemActivated(event, item) + return + } - const item = (event.target as Element).closest(menuItemSelectors.join(',')) - if (!item) return - const ariaChecked = item.getAttribute('aria-checked') - const checked = ariaChecked !== 'true' + if (event.type === 'include-fragment-replaced') { + this.#handleIncludeFragmentReplaced() + } + } - if (this.selectVariant === 'single') { - // Only check, never uncheck here. Single-select mode does not allow unchecking a checked item. - if (checked) { - item.setAttribute('aria-checked', 'true') - } + #handleInvokerActivated(event: Event) { + event.preventDefault() + event.stopPropagation() - for (const checkedItem of this.querySelectorAll('[aria-checked]')) { - if (checkedItem !== item) { - checkedItem.setAttribute('aria-checked', 'false') - } - } + if (this.#isOpen()) { + this.#hide() + } else { + this.#show() + this.#firstItem?.focus() + } + } - this.#setDynamicLabel() - } else { - // multi-select mode allows unchecking a checked item - item.setAttribute('aria-checked', `${checked}`) + #handleDialogItemActivated(event: Event, dialog: HTMLElement) { + this.querySelector('.ActionListWrap')!.style.display = 'none' + const dialog_controller = new AbortController() + const {signal} = dialog_controller + const handleDialogClose = () => { + dialog_controller.abort() + this.querySelector('.ActionListWrap')!.style.display = '' + if (this.#isOpen()) { + this.#hide() } + } + dialog.addEventListener('close', handleDialogClose, {signal}) + dialog.addEventListener('cancel', handleDialogClose, {signal}) + } + + #handleItemActivated(event: Event, item: Element) { + // Hide popover after current event loop to prevent changes in focus from + // altering the target of the event. Not doing this specifically affects + // tags. It causes the event to be sent to the currently focused element + // instead of the anchor, which effectively prevents navigation, i.e. it + // appears as if hitting enter does nothing. Curiously, clicking instead + // works fine. + if (this.selectVariant !== 'multiple') { + setTimeout(() => { + if (this.#isOpen()) { + this.#hide() + } + }) + } - this.#updateInput() + // The rest of the code below deals with single/multiple selection behavior, and should not + // interfere with events fired by menu items whose behavior is specified outside the library. + if (this.selectVariant !== 'multiple' && this.selectVariant !== 'single') return - if (event instanceof KeyboardEvent && event.target instanceof HTMLButtonElement) { - // prevent buttons from being clicked twice - event.preventDefault() + const ariaChecked = item.getAttribute('aria-checked') + const checked = ariaChecked !== 'true' + + if (this.selectVariant === 'single') { + // Only check, never uncheck here. Single-select mode does not allow unchecking a checked item. + if (checked) { + item.setAttribute('aria-checked', 'true') + } + + for (const checkedItem of this.querySelectorAll('[aria-checked]')) { + if (checkedItem !== item) { + checkedItem.setAttribute('aria-checked', 'false') + } } + + this.#setDynamicLabel() + } else { + // multi-select mode allows unchecking a checked item + item.setAttribute('aria-checked', `${checked}`) } + + this.#updateInput() + } + + #activateItem(event: Event, item: Element) { + const eventWillActivateByDefault = + (event instanceof MouseEvent && event.type === 'click') || + (event instanceof KeyboardEvent && + event.type === 'keydown' && + !(event.ctrlKey || event.altKey || event.metaKey || event.shiftKey) && + event.key === 'Enter') + + // if the event will result in activating the current item by default, i.e. is a + // mouse click or keyboard enter, bail out + if (eventWillActivateByDefault) return + + // otherwise, event will not result in activation by default, so we stop it and + // simulate a click + event.stopPropagation() + const elem = item as HTMLElement + elem.click() + } + + #handleIncludeFragmentReplaced() { + if (this.#firstItem) this.#firstItem.focus() + this.#softDisableItems() + } + + // Close when focus leaves menu + #handleFocusOut() { + this.#hide() + } + + #show() { + this.popoverElement?.showPopover() + } + + #hide() { + this.popoverElement?.hidePopover() + } + + #isOpen() { + return this.popoverElement?.matches(':popover-open') } #setDynamicLabel() { @@ -261,18 +380,13 @@ export class ActionMenuElement extends HTMLElement { } } - #isActivationKeydown(event: Event): boolean { - return ( - event instanceof KeyboardEvent && - event.type === 'keydown' && - !(event.ctrlKey || event.altKey || event.metaKey || event.shiftKey) && - (event.key === 'Enter' || event.key === ' ') - ) - } - get #firstItem(): HTMLElement | null { return this.querySelector(menuItemSelectors.join(',')) } + + get #items(): HTMLElement[] { + return Array.from(this.querySelectorAll(menuItemSelectors.join(','))) + } } if (!window.customElements.get('action-menu')) { diff --git a/app/components/primer/alpha/action_menu/list.rb b/app/components/primer/alpha/action_menu/list.rb index 6dca1cee8f..3fcef80ea2 100644 --- a/app/components/primer/alpha/action_menu/list.rb +++ b/app/components/primer/alpha/action_menu/list.rb @@ -111,8 +111,6 @@ def organize_arguments(data: {}, **system_arguments) system_arguments, { aria: { disabled: true } } ) - - content_arguments[:disabled] = "" if content_arguments[:tag] == :button end { data: data, **system_arguments, content_arguments: content_arguments } diff --git a/app/components/primer/alpha/modal_dialog.ts b/app/components/primer/alpha/modal_dialog.ts index aad3b0f510..840becf0ec 100644 --- a/app/components/primer/alpha/modal_dialog.ts +++ b/app/components/primer/alpha/modal_dialog.ts @@ -30,20 +30,17 @@ function clickHandler(event: Event) { return } } - // Find the top level dialog that is open. - const topLevelDialog = overlayStack[overlayStack.length - 1] - if (!topLevelDialog) return - dialogId = button.getAttribute('data-close-dialog-id') - if (dialogId === topLevelDialog.id) { - overlayStack.pop() - topLevelDialog.close() - } + if (!overlayStack.length) return - dialogId = button.getAttribute('data-submit-dialog-id') - if (dialogId === topLevelDialog.id) { - overlayStack.pop() - topLevelDialog.close(true) + dialogId = button.getAttribute('data-close-dialog-id') || button.getAttribute('data-submit-dialog-id') + if (dialogId) { + const dialog = document.getElementById(dialogId) + if (dialog instanceof ModalDialogElement) { + const dialogIndex = overlayStack.findIndex(ele => ele.id === dialogId) + overlayStack.splice(dialogIndex, 1) + dialog.close(button.hasAttribute('data-submit-dialog-id')) + } } } @@ -107,7 +104,7 @@ export class ModalDialogElement extends HTMLElement { if (this.#focusAbortController.signal.aborted) { this.#focusAbortController = new AbortController() } - focusTrap(this, undefined, this.#focusAbortController.signal) + focusTrap(this, this.querySelector('[autofocus]') as HTMLElement, this.#focusAbortController.signal) overlayStack.push(this) } else { if (!this.open) return diff --git a/app/components/primer/alpha/segmented_control.pcss b/app/components/primer/alpha/segmented_control.pcss index cdb832667b..8aa6679c84 100644 --- a/app/components/primer/alpha/segmented_control.pcss +++ b/app/components/primer/alpha/segmented_control.pcss @@ -1,19 +1,87 @@ /* SegmentedControl */ .SegmentedControl { + --segmentedControl-item-padding: var(--control-small-paddingBlock); + display: inline-flex; list-style: none; background-color: var(--controlTrack-bgColor-rest, var(--color-segmented-control-bg)); border-radius: var(--borderRadius-medium); } +.SegmentedControl--iconOnly { + & .Button--iconOnly.Button--small, + & .Button--iconOnly.Button--medium, + & .Button--iconOnly.Button--large { + width: 100%; + padding-inline: 0 !important; + } +} + +/* sizes */ + +.SegmentedControl--small { + --segmentedControl-item-padding: var(--control-xsmall-paddingBlock); + + & .SegmentedControl-item { + height: var(--control-small-size); + + & .Button { + padding-inline: calc(var(--control-xsmall-paddingInline-normal) - var(--segmentedControl-item-padding)); + } + } + + &.SegmentedControl--iconOnly { + & .SegmentedControl-item { + width: var(--control-small-size); + } + } +} + +.SegmentedControl--medium { + & .SegmentedControl-item { + height: var(--control-medium-size); + } + + &.SegmentedControl--iconOnly { + & .SegmentedControl-item { + width: var(--control-medium-size); + } + } +} + +.SegmentedControl--large { + & .SegmentedControl-item { + height: var(--control-large-size); + + & .Button { + padding-inline: calc(var(--control-large-paddingInline-normal) - var(--segmentedControl-item-padding)); + } + } + + &.SegmentedControl--iconOnly { + & .SegmentedControl-item { + width: var(--control-large-size); + } + } +} + +/* item */ + .SegmentedControl-item { position: relative; display: inline-flex; + justify-content: center; border: var(--borderWidth-thin) solid transparent; border-radius: var(--borderRadius-medium); - padding: var(--control-xsmall-paddingInline-condensed); + height: var(--control-medium-size); + padding: var(--segmentedControl-item-padding); + + & .Button-withTooltip { + width: 100%; + } + /* button color overrides */ & .Button--invisible { &:hover:not(:disabled) { background-color: var(--controlTrack-bgColor-hover, var(--color-action-list-item-default-hover-bg)); @@ -69,72 +137,19 @@ /* Button ----------------------------------------- */ & .Button { + height: 100%; + width: 100%; border: 0; font-weight: var(--base-text-weight-normal); - transition: none; - color: var(--button-default-fgColor-rest); + border-radius: calc(var(--borderRadius-medium) - var(--segmentedControl-item-padding) / 2); + padding-inline: calc(var(--control-medium-paddingInline-normal) - var(--segmentedControl-item-padding)); &:focus-visible { - outline-offset: calc(var(--control-xsmall-paddingInline-condensed) - var(--borderWidth-thin)); - border-radius: calc(var(--borderRadius-medium) - 5px); - } - } - - & .Button--small { - height: calc( - var(--control-small-size) - var(--control-xsmall-paddingInline-condensed) * 2 - var(--borderWidth-thin) * 2 - ); - padding: 0 calc(var(--control-small-paddingInline-condensed) - var(--control-xsmall-paddingInline-condensed)); - - &.Button--iconOnly { - width: calc( - var(--control-medium-size) - var(--control-xsmall-paddingInline-condensed) * 2 - var(--borderWidth-thin) * 2 - ); - - &::before { - @mixin minTouchTarget var(--control-medium-size), var(--control-medium-size); - } - } - } - - & .Button--medium { - height: calc( - var(--control-medium-size) - var(--control-xsmall-paddingInline-condensed) * 2 - var(--borderWidth-thin) * 2 - ); - padding: 0 calc(var(--control-medium-paddingInline-normal) - var(--control-xsmall-paddingInline-condensed)); - - &.Button--iconOnly { - width: calc( - var(--control-medium-size) - var(--control-xsmall-paddingInline-condensed) * 2 - var(--borderWidth-thin) * 2 - ); - - &::before { - @mixin minTouchTarget var(--control-medium-size), var(--control-medium-size); - } - } - } - - & .Button--large { - height: calc( - var(--control-large-size) - var(--control-xsmall-paddingInline-condensed) * 2 - var(--borderWidth-thin) * 2 - ); - padding: 0 calc(var(--control-large-paddingInline-spacious) - var(--control-xsmall-paddingInline-condensed)); - - &.Button--iconOnly { - width: calc( - var(--control-large-size) - var(--control-xsmall-paddingInline-condensed) * 2 - var(--borderWidth-thin) * 2 - ); - - &::before { - @mixin minTouchTarget var(--control-large-size), var(--control-large-size); - } + outline-offset: calc(var(--segmentedControl-item-padding) - var(--borderWidth-thin)); + border-radius: calc(var(--borderRadius-medium) - var(--segmentedControl-item-padding) / 1); } } - & .Button--iconOnly { - padding: initial; - } - & .Button--invisible.Button--invisible-noVisuals .Button-label { color: var(--button-default-fgColor-rest); } @@ -148,10 +163,4 @@ flex: 1; justify-content: center; } - - /* is .Button-withTooltip used anywhere? can't find use of it */ - & .Button--iconOnly, - & .Button-withTooltip { - width: 100%; - } } diff --git a/app/components/primer/alpha/segmented_control.rb b/app/components/primer/alpha/segmented_control.rb index 2aeeb601d4..d6a48eba6c 100644 --- a/app/components/primer/alpha/segmented_control.rb +++ b/app/components/primer/alpha/segmented_control.rb @@ -13,6 +13,15 @@ class SegmentedControl < Primer::Component FULL_WIDTH_DEFAULT = false HIDE_LABELS_DEFAULT = false + DEFAULT_SIZE = :medium + SIZE_MAPPINGS = { + :small => "SegmentedControl--small", + :medium => "SegmentedControl--medium", + :large => "SegmentedControl--large", + DEFAULT_SIZE => "SegmentedControl--medium" + }.freeze + SIZE_OPTIONS = SIZE_MAPPINGS.keys + # Use to render an item in the segmented control # # @param system_arguments [Hash] <%= link_to_system_arguments_docs %> @@ -42,6 +51,7 @@ def initialize(hide_labels: HIDE_LABELS_DEFAULT, full_width: FULL_WIDTH_DEFAULT, @system_arguments[:role] = "list" @system_arguments[:classes] = class_names( system_arguments[:classes], + SIZE_MAPPINGS[fetch_or_fallback(SIZE_OPTIONS, size, DEFAULT_SIZE)], "SegmentedControl", "SegmentedControl--iconOnly": hide_labels, "SegmentedControl--fullWidth": full_width diff --git a/app/components/primer/alpha/segmented_control/item.html.erb b/app/components/primer/alpha/segmented_control/item.html.erb index 555c93bd20..047cb474d7 100644 --- a/app/components/primer/alpha/segmented_control/item.html.erb +++ b/app/components/primer/alpha/segmented_control/item.html.erb @@ -2,12 +2,5 @@ "SegmentedControl-item", "SegmentedControl-item--selected": @selected ) %>" role="listitem" data-targets="segmented-control.items"> - <% if @hide_labels %> - <%= render Primer::Beta::IconButton.new(icon: @icon, "aria-label": @label, **@system_arguments) %> - <% else %> - <%= render Primer::Beta::Button.new(**@system_arguments) do |button| %> - <% button.with_leading_visual_icon(icon: @icon) unless @icon.nil? %> - <%= @label %> - <% end %> - <% end %> + <%= render @button %> diff --git a/app/components/primer/alpha/segmented_control/item.rb b/app/components/primer/alpha/segmented_control/item.rb index 1fe81b4eb6..063a84495d 100644 --- a/app/components/primer/alpha/segmented_control/item.rb +++ b/app/components/primer/alpha/segmented_control/item.rb @@ -13,16 +13,50 @@ class Item < Primer::BaseComponent # @param selected [Boolean] Whether the item is selected # @param icon [Symbol] The icon to use # @param hide_labels [Symbol] Whether to only show the icon - def initialize(label:, selected: false, icon: nil, hide_labels: false, **system_arguments) - @icon = icon - @hide_labels = hide_labels - @label = label + def initialize( + label:, + selected: false, + icon: nil, + hide_labels: false, + **system_arguments + ) @selected = selected @system_arguments = system_arguments @system_arguments[:"data-action"] = "click:segmented-control#select" if system_arguments[:href].nil? @system_arguments[:"aria-current"] = selected @system_arguments[:scheme] = :invisible + + if hide_labels + @button = Primer::Beta::IconButton.new( + icon: icon, + "aria-label": label, + **@system_arguments + ) + else + @button = Primer::Beta::Button.new(**@system_arguments) + @button.with_leading_visual_icon(icon: icon) if icon + @button.with_content(label) + end + end + + # @!parse + # # Optional trailing Label + # # + # # @param system_arguments [Hash] The arguments accepted by <%= link_to_component(Primer::Beta::Button) %>'s `with_trailing_visual_label` slot. + # renders_one(:trailing_visual_label) + + # Optional trailing label. + # + # @param system_arguments [Hash] The arguments accepted by <%= link_to_component(Primer::Beta::Button) %>'s `with_trailing_visual_label` slot. + def with_trailing_visual_label(**system_arguments, &block) + @button.with_trailing_visual_label(**system_arguments, &block) + end + + private + + def before_render + content end end end diff --git a/app/components/primer/alpha/tool_tip.ts b/app/components/primer/alpha/tool_tip.ts index 4bd5b9f779..440608f30e 100644 --- a/app/components/primer/alpha/tool_tip.ts +++ b/app/components/primer/alpha/tool_tip.ts @@ -21,9 +21,8 @@ const isPopoverOpen = (() => { return (el: Element) => (selector ? el.matches(selector) : setSelector(el)) })() -const TOOLTIP_ARROW_EDGE_OFFSET = 6 const TOOLTIP_SR_ONLY_CLASS = 'sr-only' -const TOOLTIP_OFFSET = 10 +const TOOLTIP_OFFSET = 4 type Direction = 'n' | 's' | 'e' | 'w' | 'ne' | 'se' | 'nw' | 'sw' @@ -53,16 +52,25 @@ function focusOutListener() { closeOpenTooltips() } +function focusInListener(event: Event) { + setTimeout(() => { + for (const tooltip of openTooltips) { + if (isPopoverOpen(tooltip) && tooltip.showReason === 'focus' && tooltip.control !== event.target) { + tooltip.hidePopover() + } + } + }, 0) +} + const tooltips = new Set() const openTooltips = new Set() class ToolTipElement extends HTMLElement { styles() { return ` :host { - padding: .5em .75em !important; - font: normal normal 11px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; - -webkit-font-smoothing: subpixel-antialiased; - color: var(--color-fg-on-emphasis) !important; + padding: var(--overlay-paddingBlock-condensed) var(--overlay-padding-condensed) !important; + font: var(--text-body-shorthand-small); + color: var(--fgColor-onEmphasis, var(--color-fg-on-emphasis)) !important; text-align: center; text-decoration: none; text-shadow: none; @@ -70,25 +78,17 @@ class ToolTipElement extends HTMLElement { letter-spacing: normal; word-wrap: break-word; white-space: pre; - background: var(--color-neutral-emphasis-plus) !important; - border-radius: 6px; + background: var(--bgColor-emphasis, var(--color-neutral-emphasis-plus)) !important; + border-radius: var(--borderRadius-medium); border: 0 !important; opacity: 0; - max-width: 250px; + max-width: var(--overlay-width-small); word-wrap: break-word; white-space: normal; width: max-content !important; inset: var(--tool-tip-position-top, 0) auto auto var(--tool-tip-position-left, 0) !important; overflow: visible !important; - } - - :host:before{ - position: absolute; - z-index: 1000001; - color: var(--color-neutral-emphasis-plus); - content: ""; - border: 6px solid transparent; - opacity: 0 + text-wrap: balance; } @keyframes tooltip-appear { @@ -100,91 +100,19 @@ class ToolTipElement extends HTMLElement { } } - :host:after{ - position: absolute; - display: block; - right: 0; - left: 0; - height: 12px; - content: "" - } - :host(:popover-open), :host(:popover-open):before { animation-name: tooltip-appear; animation-duration: .1s; animation-fill-mode: forwards; animation-timing-function: ease-in; - animation-delay: .4s } - :host(.\\:popover-open), - :host(.\\:popover-open):before { + :host(.\\:popover-open) { animation-name: tooltip-appear; animation-duration: .1s; animation-fill-mode: forwards; animation-timing-function: ease-in; - animation-delay: .4s - } - - :host(.tooltip-s):before, - :host(.tooltip-n):before { - right: 50%; - margin-right: -${TOOLTIP_ARROW_EDGE_OFFSET}px; - } - - :host(.tooltip-s):before, - :host(.tooltip-se):before, - :host(.tooltip-sw):before { - bottom: 100%; - border-bottom-color: var(--color-neutral-emphasis-plus) - } - - :host(.tooltip-s):after, - :host(.tooltip-se):after, - :host(.tooltip-sw):after { - bottom: 100% - } - - :host(.tooltip-n):before, - :host(.tooltip-ne):before, - :host(.tooltip-nw):before { - top: 100%; - border-top-color: var(--color-neutral-emphasis-plus) - } - - :host(.tooltip-n):after, - :host(.tooltip-ne):after, - :host(.tooltip-nw):after { - top: 100% - } - - :host(.tooltip-se):before, - :host(.tooltip-ne):before { - left: 0; - margin-left: ${TOOLTIP_ARROW_EDGE_OFFSET}px; - } - - :host(.tooltip-sw):before, - :host(.tooltip-nw):before { - right: 0; - margin-right: ${TOOLTIP_ARROW_EDGE_OFFSET}px; - } - - :host(.tooltip-w):before { - top: 50%; - bottom: 50%; - left: 100%; - margin-top: -6px; - border-left-color: var(--color-neutral-emphasis-plus) - } - - :host(.tooltip-e):before { - top: 50%; - right: 100%; - bottom: 50%; - margin-top: -6px; - border-right-color: var(--color-neutral-emphasis-plus) } ` } @@ -193,6 +121,10 @@ class ToolTipElement extends HTMLElement { #align: AnchorAlignment = 'center' #side: AnchorSide = 'outside-bottom' #allowUpdatePosition = false + #showReason: 'focus' | 'mouse' = 'mouse' + get showReason() { + return this.#showReason + } get htmlFor(): string { return this.getAttribute('for') || '' @@ -270,6 +202,7 @@ class ToolTipElement extends HTMLElement { signal }) this.ownerDocument.addEventListener('focusout', focusOutListener) + this.ownerDocument.addEventListener('focusin', focusInListener) this.ownerDocument.addEventListener('keydown', this, {signal}) } @@ -297,6 +230,7 @@ class ToolTipElement extends HTMLElement { await Promise.resolve() if (!showing && shouldShow && !isPopoverOpen(this)) { + this.#showReason = event.type === 'mouseenter' ? 'mouse' : 'focus' this.showPopover() } else if (showing && shouldHide && isPopoverOpen(this)) { this.hidePopover() diff --git a/app/components/primer/beta/base_button.rb b/app/components/primer/beta/base_button.rb index 834a8ef52a..f1a9cf705b 100644 --- a/app/components/primer/beta/base_button.rb +++ b/app/components/primer/beta/base_button.rb @@ -19,12 +19,14 @@ class BaseButton < Primer::Component # @param type [Symbol] <%= one_of(Primer::Beta::BaseButton::TYPE_OPTIONS) %> # @param block [Boolean] Whether button is full-width with `display: block`. # @param disabled [Boolean] Whether or not the button is disabled. If true, this option forces `tag:` to `:button`. + # @param inactive [Boolean] Whether the button looks visually disabled, but can still accept all the same interactions as an enabled button. # @param system_arguments [Hash] <%= link_to_system_arguments_docs %> def initialize( tag: DEFAULT_TAG, type: DEFAULT_TYPE, block: false, disabled: false, + inactive: false, **system_arguments ) @system_arguments = system_arguments @@ -37,6 +39,8 @@ def initialize( "btn-block" => block ) + @system_arguments[:"aria-disabled"] = true if inactive + @disabled = disabled return unless @disabled diff --git a/app/components/primer/beta/button.pcss b/app/components/primer/beta/button.pcss index 13b42df5a4..2cb0f7dbe6 100644 --- a/app/components/primer/beta/button.pcss +++ b/app/components/primer/beta/button.pcss @@ -47,11 +47,15 @@ transition: none; } - &:disabled, - &[aria-disabled='true'] { + &:disabled { cursor: not-allowed; box-shadow: none; } + + &[aria-disabled='true'] { + cursor: default; + box-shadow: none; + } } .Button-withTooltip { diff --git a/app/components/primer/focus_group.ts b/app/components/primer/focus_group.ts index 2d7b7b00fc..8c12fa9c96 100644 --- a/app/components/primer/focus_group.ts +++ b/app/components/primer/focus_group.ts @@ -8,6 +8,8 @@ const getMnemonicFor = (item: Element) => item.textContent?.trim()[0].toLowerCas const printable = /^\S$/ export default class FocusGroupElement extends HTMLElement { + #retainSignal: AbortController | null = null + get nowrap(): boolean { return this.hasAttribute('nowrap') } @@ -60,8 +62,32 @@ export default class FocusGroupElement extends HTMLElement { const {direction, nowrap} = this if (event.type === 'focusin') { if (this.retain && event.target instanceof Element && event.target.matches(menuItemSelector)) { + this.#retainSignal?.abort() + const {signal} = (this.#retainSignal = new AbortController()) for (const item of this.#items) { item.setAttribute('tabindex', item === event.target ? '0' : '-1') + const popover = event.target.closest('[popover]') + if (item === event.target && popover?.popover === 'auto' && popover.closest('focus-group') === this) { + popover.addEventListener( + 'toggle', + (toggleEvent: Event) => { + if (!(toggleEvent.target instanceof Element)) return + if ((toggleEvent as ToggleEvent).newState === 'closed') { + this.#retainSignal?.abort() + item.setAttribute('tabindex', '-1') + if (popover.id) { + const invoker = this.querySelector(`[popovertarget="${popover.id}"]`) + if (invoker) { + invoker.setAttribute('tabindex', '0') + } else { + this.#items[0]?.setAttribute('tabindex', '0') + } + } + } + }, + {signal} + ) + } } } } else if (event instanceof KeyboardEvent) { @@ -111,7 +137,7 @@ export default class FocusGroupElement extends HTMLElement { let el: HTMLElement | null = focusEl do { el = el.closest(`[popover]:not(:popover-open)`) - if (el?.popover === 'auto') { + if (el?.popover === 'auto' && !['ArrowRight', 'ArrowLeft'].includes(event.key)) { el.showPopover() } el = el?.parentElement || null diff --git a/demo/Gemfile b/demo/Gemfile index ad44c1b8d8..84232ee43e 100644 --- a/demo/Gemfile +++ b/demo/Gemfile @@ -31,7 +31,7 @@ end eval_gemfile "gemfiles/kuby.gemfile" # Use Puma as the app server -gem "puma", "~> 6.3.1" +gem "puma", "~> 6.4.0" # Reduces boot times through caching; required in config/boot.rb gem "bootsnap", ">= 1.4.2", require: false @@ -42,9 +42,9 @@ gem "lookbook", "~> 2.1.1" unless rails_version.to_f < 7 group :development do # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring - gem "spring", "~> 4.0" + gem "spring", "~> 4.1" gem "spring-watcher-listen", "~> 2.1" - gem "hotwire-livereload", "~> 1.1" + gem "hotwire-livereload", "~> 1.3" # Use JavaScript with ESM import maps [https://github.com/rails/importmap-rails] gem "importmap-rails" diff --git a/demo/Gemfile.lock b/demo/Gemfile.lock index 5d4abaf1ac..496ea16ef6 100644 --- a/demo/Gemfile.lock +++ b/demo/Gemfile.lock @@ -15,26 +15,6 @@ GEM activesupport (= 7.0.3) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (7.0.3) - actionpack (= 7.0.3) - activejob (= 7.0.3) - activerecord (= 7.0.3) - activestorage (= 7.0.3) - activesupport (= 7.0.3) - mail (>= 2.7.1) - net-imap - net-pop - net-smtp - actionmailer (7.0.3) - actionpack (= 7.0.3) - actionview (= 7.0.3) - activejob (= 7.0.3) - activesupport (= 7.0.3) - mail (~> 2.5, >= 2.5.4) - net-imap - net-pop - net-smtp - rails-dom-testing (~> 2.0) actionpack (7.0.3) actionview (= 7.0.3) activesupport (= 7.0.3) @@ -42,13 +22,6 @@ GEM rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (7.0.3) - actionpack (= 7.0.3) - activerecord (= 7.0.3) - activestorage (= 7.0.3) - activesupport (= 7.0.3) - globalid (>= 0.6.0) - nokogiri (>= 1.8.5) actionview (7.0.3) activesupport (= 7.0.3) builder (~> 3.1) @@ -60,16 +33,6 @@ GEM globalid (>= 0.3.6) activemodel (7.0.3) activesupport (= 7.0.3) - activerecord (7.0.3) - activemodel (= 7.0.3) - activesupport (= 7.0.3) - activestorage (7.0.3) - actionpack (= 7.0.3) - activejob (= 7.0.3) - activerecord (= 7.0.3) - activesupport (= 7.0.3) - marcel (~> 1.0) - mini_mime (>= 1.1.0) activesupport (7.0.3) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) @@ -121,18 +84,17 @@ GEM faraday-patron (1.0.0) faraday-rack (1.0.0) faraday-retry (1.0.3) - ffi (1.15.5) + ffi (1.16.3) ffi-compiler (1.0.1) ffi (>= 1.0.0) rake foreman (0.87.2) gli (2.21.1) - globalid (1.0.0) - activesupport (>= 5.0) - googleauth (1.7.0) + globalid (1.2.1) + activesupport (>= 6.1) + googleauth (1.8.1) faraday (>= 0.17.3, < 3.a) jwt (>= 1.4, < 3.0) - memoist (~> 0.16) multi_json (~> 1.11) os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) @@ -141,9 +103,10 @@ GEM helm-rb (0.2.1-arm64-darwin) helm-rb (0.2.1-x86_64-darwin) helm-rb (0.2.1-x86_64-linux) - hotwire-livereload (1.2.2) + hotwire-livereload (1.3.0) + actioncable (>= 6.0.0) listen (>= 3.0.0) - rails (>= 6.0.0) + railties (>= 6.0.0) htmlbeautifier (1.4.2) htmlentities (4.3.4) http (5.1.1) @@ -157,10 +120,10 @@ GEM http-form_data (2.3.0) i18n (1.14.1) concurrent-ruby (~> 1.0) - importmap-rails (1.1.5) + importmap-rails (1.2.1) actionpack (>= 6.0.0) railties (>= 6.0.0) - jsonpath (1.1.3) + jsonpath (1.1.4) multi_json jwt (2.7.1) kind-rb (0.1.0-arm64-darwin) @@ -209,7 +172,7 @@ GEM rouge (~> 3.0) kuby-crdb (0.3.0) kube-dsl (~> 0.7) - kuby-kind (0.2.1) + kuby-kind (0.2.3) kind-rb (~> 0.1) kuby-core (>= 0.16.0, < 1.0) listen (3.8.0) @@ -218,7 +181,7 @@ GEM llhttp-ffi (0.4.0) ffi-compiler (~> 1.0) rake (~> 13.0) - loofah (2.21.3) + loofah (2.21.4) crass (~> 1.0.2) nokogiri (>= 1.12.0) lookbook (2.1.1) @@ -233,16 +196,12 @@ GEM view_component (>= 2.0) yard (~> 0.9.25) zeitwerk (~> 2.5) - mail (2.7.1) - mini_mime (>= 0.1.1) marcel (1.0.2) - memoist (0.16.2) method_source (1.0.0) - mime-types (3.5.0) + mime-types (3.5.1) mime-types-data (~> 3.2015) - mime-types-data (3.2023.0808) - mini_mime (1.1.2) - minitest (5.19.0) + mime-types-data (3.2023.1003) + minitest (5.20.0) ms_rest (0.7.6) concurrent-ruby (~> 1.0) faraday (>= 0.9, < 2.0.0) @@ -255,14 +214,6 @@ GEM msgpack (1.6.0) multi_json (1.15.0) multipart-post (2.3.0) - net-imap (0.3.1) - net-protocol - net-pop (0.1.2) - net-protocol - net-protocol (0.1.3) - timeout - net-smtp (0.3.3) - net-protocol netrc (0.11.0) nio4r (2.5.9) nokogiri (1.15.4-arm64-darwin) @@ -271,7 +222,7 @@ GEM racc (~> 1.4) nokogiri (1.15.4-x86_64-linux) racc (~> 1.4) - oj (3.14.0) + oj (3.16.1) openproject-octicons (19.7.0) os (1.1.4) pry (0.14.1) @@ -281,7 +232,7 @@ GEM byebug (~> 11.0) pry (>= 0.13, < 0.15) public_suffix (5.0.3) - puma (6.3.1) + puma (6.4.0) nio4r (~> 2.0) racc (1.7.1) rack (2.2.8) @@ -289,20 +240,6 @@ GEM rack (>= 2.0.0) rack-test (2.1.0) rack (>= 1.3) - rails (7.0.3) - actioncable (= 7.0.3) - actionmailbox (= 7.0.3) - actionmailer (= 7.0.3) - actionpack (= 7.0.3) - actiontext (= 7.0.3) - actionview (= 7.0.3) - activejob (= 7.0.3) - activemodel (= 7.0.3) - activerecord (= 7.0.3) - activestorage (= 7.0.3) - activesupport (= 7.0.3) - bundler (>= 1.15.0) - railties (= 7.0.3) rails-dom-testing (2.2.0) activesupport (>= 5.0.0) minitest @@ -330,29 +267,28 @@ GEM netrc (~> 0.8) rouge (3.30.0) ruby2_keywords (0.0.5) - signet (0.17.0) + signet (0.18.0) addressable (~> 2.8) faraday (>= 0.17.5, < 3.a) jwt (>= 1.5, < 3.0) multi_json (~> 1.10) - spring (4.1.0) + spring (4.1.1) spring-watcher-listen (2.1.0) listen (>= 2.7, < 4.0) spring (>= 4) - sprockets (4.2.0) + sprockets (4.2.1) concurrent-ruby (~> 1.0) rack (>= 2.2.4, < 4) sprockets-rails (3.4.2) actionpack (>= 5.2) activesupport (>= 5.2) sprockets (>= 3.0.0) - statsd-instrument (3.5.11) - stimulus-rails (1.1.1) + statsd-instrument (3.5.12) + stimulus-rails (1.3.0) railties (>= 6.0.0) - thor (1.2.2) + thor (1.3.0) timeliness (0.3.10) - timeout (0.3.0) - turbo-rails (1.3.2) + turbo-rails (1.5.0) actionpack (>= 6.0.0) activejob (>= 6.0.0) railties (>= 6.0.0) @@ -361,15 +297,15 @@ GEM unf (0.1.4) unf_ext unf_ext (0.0.8.2) - view_component (3.5.0) + view_component (3.6.0) activesupport (>= 5.2.0, < 8.0) concurrent-ruby (~> 1.0) method_source (~> 1.0) - websocket-driver (0.7.5) + websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) yard (0.9.34) - zeitwerk (2.6.11) + zeitwerk (2.6.12) PLATFORMS arm64-darwin-21 @@ -387,21 +323,21 @@ DEPENDENCIES activesupport (= 7.0.3) bootsnap (>= 1.4.2) foreman - hotwire-livereload (~> 1.1) + hotwire-livereload (~> 1.3) importmap-rails kind-rb (~> 0.1) kuby-azure (~> 0.4.0) kuby-core (~> 0.20) - kuby-kind (~> 0.1) + kuby-kind (~> 0.2) listen lookbook (~> 2.1.1) openproject-primer_view_components! pry-byebug - puma (~> 6.3.1) + puma (~> 6.4.0) rack-cors railties (= 7.0.3) rake (~> 13.0) - spring (~> 4.0) + spring (~> 4.1) spring-watcher-listen (~> 2.1) sprockets sprockets-rails diff --git a/demo/app/controllers/action_menu_controller.rb b/demo/app/controllers/action_menu_controller.rb index b2c208c602..34ddd9a62f 100644 --- a/demo/app/controllers/action_menu_controller.rb +++ b/demo/app/controllers/action_menu_controller.rb @@ -18,10 +18,11 @@ def form_action respond_to do |format| format.html do @value = form_action_selected_value + @other_params = form_action_other_params end format.json do - render json: { value: form_action_selected_value } + render json: { value: form_action_selected_value, other_params: form_action_other_params } end end end @@ -31,4 +32,16 @@ def form_action def form_action_selected_value params.permit(:foo)[:foo] || params.permit(foo: [])[:foo] end + + def form_action_other_params + params.permit!.to_hash.tap do |all| + case all + when Hash + all.delete("foo") + all.delete("authenticity_token") + when Array + all.delete(form_action_selected_value) + end + end + end end diff --git a/demo/app/views/action_menu/form_action.html.erb b/demo/app/views/action_menu/form_action.html.erb index f80e7fc2c2..4004815c8b 100644 --- a/demo/app/views/action_menu/form_action.html.erb +++ b/demo/app/views/action_menu/form_action.html.erb @@ -1 +1,2 @@ -You selected <%= @value.inspect %> +You selected <%= @value.inspect %>
+Other params sent to server: <%= @other_params.inspect %> diff --git a/demo/gemfiles/kuby.gemfile b/demo/gemfiles/kuby.gemfile index 75f272aa80..4762677b98 100644 --- a/demo/gemfiles/kuby.gemfile +++ b/demo/gemfiles/kuby.gemfile @@ -2,7 +2,7 @@ source "https://rubygems.org" gem "kuby-core", "~> 0.20" gem "kuby-azure", "~> 0.4.0" -gem "kuby-kind", "~> 0.1" +gem "kuby-kind", "~> 0.2" gem "kind-rb", "~> 0.1" gem "pry-byebug" diff --git a/demo/gemfiles/kuby.gemfile.lock b/demo/gemfiles/kuby.gemfile.lock index 564e209bf4..d6856a9398 100644 --- a/demo/gemfiles/kuby.gemfile.lock +++ b/demo/gemfiles/kuby.gemfile.lock @@ -245,7 +245,7 @@ DEPENDENCIES kind-rb (~> 0.1) kuby-azure (~> 0.4.0) kuby-core (~> 0.20) - kuby-kind (~> 0.1) + kuby-kind (~> 0.2) pry-byebug BUNDLED WITH diff --git a/demo/package-lock.json b/demo/package-lock.json index 7191727436..51bf1a3b5e 100644 --- a/demo/package-lock.json +++ b/demo/package-lock.json @@ -8,10 +8,10 @@ "name": "demo", "version": "0.1.0", "dependencies": { - "@primer/css": "^21.0.8", - "@primer/primitives": "^7.14.0", - "@rails/actioncable": "^7.0.7", - "@rails/ujs": "^7.0.7", + "@primer/css": "^21.0.9", + "@primer/primitives": "^7.15.0", + "@rails/actioncable": "^7.1.1", + "@rails/ujs": "^7.1.1", "turbolinks": "^5.2.0", "webpack-dev-server": "^4.15.1" } @@ -151,9 +151,9 @@ "integrity": "sha512-HWwz+6MrfK5NTWcg9GdKFpMBW/yrAV937oXiw2eDtsd88P3SRwoCt6ZO6QmKp9RP3nDU9cbqmuGZ0xBh0eIFeg==" }, "node_modules/@primer/css": { - "version": "21.0.8", - "resolved": "https://registry.npmjs.org/@primer/css/-/css-21.0.8.tgz", - "integrity": "sha512-nyJnLwNvqZKN9t2ho0ccTKV5Z9QOQayZT+lycWCwkPmNOyMfGlod8mLFHLYd80Ea7H5784QeOl2+3gh710Yt/g==", + "version": "21.0.9", + "resolved": "https://registry.npmjs.org/@primer/css/-/css-21.0.9.tgz", + "integrity": "sha512-kk0TfLqtGwGYJ/qXGLMXDIL4d3qWPjlEB12Hvk08krulbsQRWEsnXjejBIvJG69GyOOuYxXNoHvP2NGenxQ8Jw==", "dependencies": { "@primer/primitives": "^7.12.0", "@primer/view-components": "^0.5.1" @@ -163,9 +163,9 @@ } }, "node_modules/@primer/primitives": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-7.14.0.tgz", - "integrity": "sha512-M5to3Csxr+t1EXfRjQOe5MuMjCTiziMC+O3gCp+K8apbL07ZvqcIDHdYvcNvFCP4NX1Uj6caPE8VdguqBTSgSg==" + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-7.15.0.tgz", + "integrity": "sha512-ut010QMQT2YcQcn6gLHBC97YVN0ToR+7phxl+351hC94a7EgVR9GtwLOqopqU7el2w6iOrUndHBxDuUg1TBWhg==" }, "node_modules/@primer/view-components": { "version": "0.5.1", @@ -186,14 +186,14 @@ } }, "node_modules/@rails/actioncable": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@rails/actioncable/-/actioncable-7.0.7.tgz", - "integrity": "sha512-NqHf4XDkeVaNk/r+TBo2aAMkjPyRPEfZkSqCTijfWukW1zTZ2XLDfvFzbpRCuWZ6gxItgoa/FkILZm27HRh2yg==" + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@rails/actioncable/-/actioncable-7.1.1.tgz", + "integrity": "sha512-ZRJ9rdwFQQjRbtgJnweY0/4UQyxN6ojEGRdib0JkjnuIciv+4ok/aAeZmBJqNreTMaBqS0eHyA9hCArwN58opg==" }, "node_modules/@rails/ujs": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@rails/ujs/-/ujs-7.0.7.tgz", - "integrity": "sha512-J2v5Ca7HgejO7diGKiDylaVDQKmbQ5FJih6Oo3hXuBKEuXlcaccJu64lj8MNVLaPVyZx0g4gaOQZQz95QEb/hg==" + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@rails/ujs/-/ujs-7.1.1.tgz", + "integrity": "sha512-ywGwWNiqXN3Bb1BifVQTrkWEWcAGLHW3D0JNQMQeu57LsoluRzvnenNLPsmdoDPkrmSIASDXNsJiCIpUzFj8CA==" }, "node_modules/@types/body-parser": { "version": "1.19.2", @@ -3191,18 +3191,18 @@ "integrity": "sha512-HWwz+6MrfK5NTWcg9GdKFpMBW/yrAV937oXiw2eDtsd88P3SRwoCt6ZO6QmKp9RP3nDU9cbqmuGZ0xBh0eIFeg==" }, "@primer/css": { - "version": "21.0.8", - "resolved": "https://registry.npmjs.org/@primer/css/-/css-21.0.8.tgz", - "integrity": "sha512-nyJnLwNvqZKN9t2ho0ccTKV5Z9QOQayZT+lycWCwkPmNOyMfGlod8mLFHLYd80Ea7H5784QeOl2+3gh710Yt/g==", + "version": "21.0.9", + "resolved": "https://registry.npmjs.org/@primer/css/-/css-21.0.9.tgz", + "integrity": "sha512-kk0TfLqtGwGYJ/qXGLMXDIL4d3qWPjlEB12Hvk08krulbsQRWEsnXjejBIvJG69GyOOuYxXNoHvP2NGenxQ8Jw==", "requires": { "@primer/primitives": "^7.12.0", "@primer/view-components": "^0.5.1" } }, "@primer/primitives": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-7.14.0.tgz", - "integrity": "sha512-M5to3Csxr+t1EXfRjQOe5MuMjCTiziMC+O3gCp+K8apbL07ZvqcIDHdYvcNvFCP4NX1Uj6caPE8VdguqBTSgSg==" + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-7.15.0.tgz", + "integrity": "sha512-ut010QMQT2YcQcn6gLHBC97YVN0ToR+7phxl+351hC94a7EgVR9GtwLOqopqU7el2w6iOrUndHBxDuUg1TBWhg==" }, "@primer/view-components": { "version": "0.5.1", @@ -3223,14 +3223,14 @@ } }, "@rails/actioncable": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@rails/actioncable/-/actioncable-7.0.7.tgz", - "integrity": "sha512-NqHf4XDkeVaNk/r+TBo2aAMkjPyRPEfZkSqCTijfWukW1zTZ2XLDfvFzbpRCuWZ6gxItgoa/FkILZm27HRh2yg==" + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@rails/actioncable/-/actioncable-7.1.1.tgz", + "integrity": "sha512-ZRJ9rdwFQQjRbtgJnweY0/4UQyxN6ojEGRdib0JkjnuIciv+4ok/aAeZmBJqNreTMaBqS0eHyA9hCArwN58opg==" }, "@rails/ujs": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@rails/ujs/-/ujs-7.0.7.tgz", - "integrity": "sha512-J2v5Ca7HgejO7diGKiDylaVDQKmbQ5FJih6Oo3hXuBKEuXlcaccJu64lj8MNVLaPVyZx0g4gaOQZQz95QEb/hg==" + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@rails/ujs/-/ujs-7.1.1.tgz", + "integrity": "sha512-ywGwWNiqXN3Bb1BifVQTrkWEWcAGLHW3D0JNQMQeu57LsoluRzvnenNLPsmdoDPkrmSIASDXNsJiCIpUzFj8CA==" }, "@types/body-parser": { "version": "1.19.2", diff --git a/demo/package.json b/demo/package.json index 8822d00dca..c3e8431781 100644 --- a/demo/package.json +++ b/demo/package.json @@ -3,10 +3,10 @@ "private": true, "version": "0.1.0", "dependencies": { - "@primer/css": "^21.0.8", - "@primer/primitives": "^7.14.0", - "@rails/actioncable": "^7.0.7", - "@rails/ujs": "^7.0.7", + "@primer/css": "^21.0.9", + "@primer/primitives": "^7.15.0", + "@rails/actioncable": "^7.1.1", + "@rails/ujs": "^7.1.1", "turbolinks": "^5.2.0", "webpack-dev-server": "^4.15.1" } diff --git a/lib/primer/accessibility.rb b/lib/primer/accessibility.rb index 96d35b2b9d..64f50e73ab 100644 --- a/lib/primer/accessibility.rb +++ b/lib/primer/accessibility.rb @@ -8,7 +8,9 @@ module Accessibility # Do not add to this list for any other reason! IGNORED_PREVIEWS = [ Primer::Beta::MarkdownPreview, - Primer::Beta::AutoCompleteItemPreview + Primer::Beta::AutoCompleteItemPreview, + Primer::Alpha::RadioButtonPreview, + Primer::Alpha::CheckBoxPreview ].freeze # Skip `:region` which relates to preview page structure rather than individual component. diff --git a/lib/primer/static/generate_info_arch.rb b/lib/primer/static/generate_info_arch.rb index d3c5356408..9d5e71e59e 100644 --- a/lib/primer/static/generate_info_arch.rb +++ b/lib/primer/static/generate_info_arch.rb @@ -3,6 +3,7 @@ # :nocov: require "json" +require "kramdown" module Primer module Static @@ -35,7 +36,7 @@ def call # rubocop:disable Style/IfUnlessModifier "description" => if slot_method.base_docstring.to_s.present? - view_context.render(inline: slot_method.base_docstring) + render_erb_ignoring_markdown_code_fences(slot_method.base_docstring) end, # rubocop:enable Style/IfUnlessModifier "parameters" => serialize_params(param_tags, component) @@ -57,7 +58,7 @@ def call { "name" => mtd.name, - "description" => view_context.render(inline: mtd.base_docstring), + "description" => render_erb_ignoring_markdown_code_fences(mtd.base_docstring), "parameters" => serialize_params(param_tags, component) } end @@ -66,7 +67,7 @@ def call if component == Primer::BaseComponent docs.base_docstring else - view_context.render(inline: docs.base_docstring) + render_erb_ignoring_markdown_code_fences(docs.base_docstring) end memo[component] = { @@ -119,7 +120,7 @@ def system_args_docs component: "BaseComponent", fully_qualified_name: "Primer::BaseComponent", description_md: docs.base_docstring, - args_md: view_context.render(inline: docs.constructor.base_docstring) + args_md: render_erb_ignoring_markdown_code_fences(docs.constructor.base_docstring) } end @@ -131,7 +132,7 @@ def serialize_params(param_tags, component) "name" => tag.name, "type" => tag.types&.join(", ") || "", "default" => default_value, - "description" => view_context.render(inline: tag.text.squish) + "description" => render_erb_ignoring_markdown_code_fences(tag.text.squish) } end end @@ -151,6 +152,86 @@ def view_context end end + # Renders ERB code to a string, ignoring markdown code fences. For example, consider the + # following ERB code inside a markdown document: + # + # ### Heading + # ```erb + # <%= render(SomeComponent.new) %> + # ``` + # + # <%= some_func(a, b) %> + # + # The ERB renderer does not understand that the fenced code, i.e. the part inside the triple + # backticks, should not be rendered. It sees the ERB tags both inside and outside the fence + # and renders them both. + # + # This method renders ERB tags in a markdown string, ignoring any fenced code blocks, so as + # to prevent rendering fenced ERB code. + # + def render_erb_ignoring_markdown_code_fences(markdown_str) + return view_context.render(inline: markdown_str) unless markdown_str.include?("```") + + # identify all fenced code blocks in markdown string + code_ranges = find_fenced_code_ranges_in(markdown_str) + + # replace code fences with placeholders + de_fenced_markdown_str = markdown_str.dup.tap do |memo| + code_ranges.reverse_each.with_index do |code_range, idx| + memo[code_range] = "" + end + end + + # Render ERB tags. The only ones left will explicitly exist _outside_ markdown code fences. + rendered_str = view_context.render(inline: de_fenced_markdown_str) + + # replace placeholders with original code fences + code_ranges.reverse_each.with_index do |code_range, idx| + rendered_str.sub!("", markdown_str[code_range]) + end + + rendered_str + end + + def find_fenced_code_ranges_in(str) + doc = Kramdown::Document.new(str) + line_starts = find_line_starts_in(str) + + [].tap do |code_ranges| + each_codespan_in(doc.root) do |node| + options = node.options + delimiter = options[:codespan_delimiter] + next unless delimiter.start_with?("```") + + start_pos = line_starts[options[:location]] + end_pos = start_pos + node.value.size + delimiter.size + end_pos = str.index("```", end_pos) + 3 + + code_ranges << (start_pos...end_pos) + end + end + end + + def find_line_starts_in(str) + line_counter = 2 + + { 1 => 0 }.tap do |memo| + str.scan(/\r?\n/) do + memo[line_counter] = Regexp.last_match.end(0) + line_counter += 1 + end + end + end + + def each_codespan_in(node, &block) + return unless node.respond_to?(:children) + + node.children.each do |child| + yield child if child.type == :codespan + each_codespan_in(child, &block) + end + end + def registry @registry ||= Primer::Yard::Registry.make end diff --git a/package-lock.json b/package-lock.json index b7e781fd06..c95b39dc12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@github/auto-check-element": "^5.2.0", "@github/auto-complete-element": "^3.3.4", "@github/catalyst": "^1.6.0", - "@github/clipboard-copy-element": "^1.1.2", + "@github/clipboard-copy-element": "^1.3.0", "@github/details-menu-element": "^1.0.12", "@github/image-crop-element": "^5.0.0", "@github/include-fragment-element": "^6.1.1", @@ -23,6 +23,7 @@ }, "devDependencies": { "@changesets/changelog-github": "^0.4.6", + "@changesets/cli": "^2.24.1", "@github/axe-github": "^0.5.0", "@github/browserslist-config": "^1.0.0", "@github/markdownlint-github": "^0.2.2", @@ -37,12 +38,12 @@ "@typescript-eslint/parser": "^5.31.0", "axe-core": "^4.7.1", "chokidar-cli": "^3.0.0", - "cssnano": "^5.1.13", + "cssnano": "^6.0.1", "eslint": "^8.23.1", "eslint-plugin-custom-elements": "^0.0.6", - "eslint-plugin-github": "^4.4.0", + "eslint-plugin-github": "^4.9.2", "eslint-plugin-prettier": "^4.2.1", - "markdownlint-cli2": "^0.5.1", + "markdownlint-cli2": "^0.10.0", "mocha": "^10.0.0", "playwright": "^1.35.1", "postcss": "^8.4.16", @@ -52,7 +53,6 @@ "postcss-mixins": "^9.0.3", "postcss-preset-env": "^7.8.0", "prettier": "2.7.1", - "primer-changesets-cli": "2.2.0", "rollup": "^2.77.1", "rollup-plugin-terser": "^7.0.2", "stylelint": "^14.13.0", @@ -181,13 +181,13 @@ } }, "node_modules/@changesets/apply-release-plan": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-6.1.3.tgz", - "integrity": "sha512-ECDNeoc3nfeAe1jqJb5aFQX7CqzQhD2klXRez2JDb/aVpGUbX673HgKrnrgJRuQR/9f2TtLoYIzrGB9qwD77mg==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-6.1.4.tgz", + "integrity": "sha512-FMpKF1fRlJyCZVYHr3CbinpZZ+6MwvOtWUuO8uo+svcATEoc1zRDcj23pAurJ2TZ/uVz1wFHH6K3NlACy0PLew==", "dev": true, "dependencies": { "@babel/runtime": "^7.20.1", - "@changesets/config": "^2.3.0", + "@changesets/config": "^2.3.1", "@changesets/get-version-range-type": "^0.3.2", "@changesets/git": "^2.0.0", "@changesets/types": "^5.2.1", @@ -198,7 +198,7 @@ "outdent": "^0.5.0", "prettier": "^2.7.1", "resolve-from": "^5.0.0", - "semver": "^5.4.1" + "semver": "^7.5.3" } }, "node_modules/@changesets/apply-release-plan/node_modules/fs-extra": { @@ -233,15 +233,6 @@ "node": ">=8" } }, - "node_modules/@changesets/apply-release-plan/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/@changesets/apply-release-plan/node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -252,26 +243,17 @@ } }, "node_modules/@changesets/assemble-release-plan": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-5.2.3.tgz", - "integrity": "sha512-g7EVZCmnWz3zMBAdrcKhid4hkHT+Ft1n0mLussFMcB1dE2zCuwcvGoy9ec3yOgPGF4hoMtgHaMIk3T3TBdvU9g==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-5.2.4.tgz", + "integrity": "sha512-xJkWX+1/CUaOUWTguXEbCDTyWJFECEhmdtbkjhn5GVBGxdP/JwaHBIU9sW3FR6gD07UwZ7ovpiPclQZs+j+mvg==", "dev": true, "dependencies": { "@babel/runtime": "^7.20.1", "@changesets/errors": "^0.1.4", - "@changesets/get-dependents-graph": "^1.3.5", + "@changesets/get-dependents-graph": "^1.3.6", "@changesets/types": "^5.2.1", "@manypkg/get-packages": "^1.1.3", - "semver": "^5.4.1" - } - }, - "node_modules/@changesets/assemble-release-plan/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" + "semver": "^7.5.3" } }, "node_modules/@changesets/changelog-git": { @@ -294,14 +276,194 @@ "dotenv": "^8.1.0" } }, - "node_modules/@changesets/config": { + "node_modules/@changesets/cli": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.26.2.tgz", + "integrity": "sha512-dnWrJTmRR8bCHikJHl9b9HW3gXACCehz4OasrXpMp7sx97ECuBGGNjJhjPhdZNCvMy9mn4BWdplI323IbqsRig==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/apply-release-plan": "^6.1.4", + "@changesets/assemble-release-plan": "^5.2.4", + "@changesets/changelog-git": "^0.1.14", + "@changesets/config": "^2.3.1", + "@changesets/errors": "^0.1.4", + "@changesets/get-dependents-graph": "^1.3.6", + "@changesets/get-release-plan": "^3.0.17", + "@changesets/git": "^2.0.0", + "@changesets/logger": "^0.0.5", + "@changesets/pre": "^1.0.14", + "@changesets/read": "^0.5.9", + "@changesets/types": "^5.2.1", + "@changesets/write": "^0.2.3", + "@manypkg/get-packages": "^1.1.3", + "@types/is-ci": "^3.0.0", + "@types/semver": "^7.5.0", + "ansi-colors": "^4.1.3", + "chalk": "^2.1.0", + "enquirer": "^2.3.0", + "external-editor": "^3.1.0", + "fs-extra": "^7.0.1", + "human-id": "^1.0.2", + "is-ci": "^3.0.1", + "meow": "^6.0.0", + "outdent": "^0.5.0", + "p-limit": "^2.2.0", + "preferred-pm": "^3.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.5.3", + "spawndamnit": "^2.0.0", + "term-size": "^2.1.0", + "tty-table": "^4.1.5" + }, + "bin": { + "changeset": "bin.js" + } + }, + "node_modules/@changesets/cli/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/@changesets/cli/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/@changesets/cli/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/@changesets/cli/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/@changesets/cli/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/@changesets/cli/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/@changesets/cli/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@changesets/cli/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/@changesets/cli/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@changesets/cli/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@changesets/config/-/config-2.3.0.tgz", - "integrity": "sha512-EgP/px6mhCx8QeaMAvWtRrgyxW08k/Bx2tpGT+M84jEdX37v3VKfh4Cz1BkwrYKuMV2HZKeHOh8sHvja/HcXfQ==", + "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/@changesets/cli/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/@changesets/cli/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/@changesets/cli/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@changesets/config": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@changesets/config/-/config-2.3.1.tgz", + "integrity": "sha512-PQXaJl82CfIXddUOppj4zWu+987GCw2M+eQcOepxN5s+kvnsZOwjEJO3DH9eVy+OP6Pg/KFEWdsECFEYTtbg6w==", "dev": true, "dependencies": { "@changesets/errors": "^0.1.4", - "@changesets/get-dependents-graph": "^1.3.5", + "@changesets/get-dependents-graph": "^1.3.6", "@changesets/logger": "^0.0.5", "@changesets/types": "^5.2.1", "@manypkg/get-packages": "^1.1.3", @@ -351,16 +513,16 @@ } }, "node_modules/@changesets/get-dependents-graph": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-1.3.5.tgz", - "integrity": "sha512-w1eEvnWlbVDIY8mWXqWuYE9oKhvIaBhzqzo4ITSJY9hgoqQ3RoBqwlcAzg11qHxv/b8ReDWnMrpjpKrW6m1ZTA==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-1.3.6.tgz", + "integrity": "sha512-Q/sLgBANmkvUm09GgRsAvEtY3p1/5OCzgBE5vX3vgb5CvW0j7CEljocx5oPXeQSNph6FXulJlXV3Re/v3K3P3Q==", "dev": true, "dependencies": { "@changesets/types": "^5.2.1", "@manypkg/get-packages": "^1.1.3", "chalk": "^2.1.0", "fs-extra": "^7.0.1", - "semver": "^5.4.1" + "semver": "^7.5.3" } }, "node_modules/@changesets/get-dependents-graph/node_modules/ansi-styles": { @@ -445,15 +607,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/@changesets/get-dependents-graph/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/@changesets/get-dependents-graph/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -486,14 +639,14 @@ } }, "node_modules/@changesets/get-release-plan": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-3.0.16.tgz", - "integrity": "sha512-OpP9QILpBp1bY2YNIKFzwigKh7Qe9KizRsZomzLe6pK8IUo8onkAAVUD8+JRKSr8R7d4+JRuQrfSSNlEwKyPYg==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-3.0.17.tgz", + "integrity": "sha512-6IwKTubNEgoOZwDontYc2x2cWXfr6IKxP3IhKeK+WjyD6y3M4Gl/jdQvBw+m/5zWILSOCAaGLu2ZF6Q+WiPniw==", "dev": true, "dependencies": { "@babel/runtime": "^7.20.1", - "@changesets/assemble-release-plan": "^5.2.3", - "@changesets/config": "^2.3.0", + "@changesets/assemble-release-plan": "^5.2.4", + "@changesets/config": "^2.3.1", "@changesets/pre": "^1.0.14", "@changesets/read": "^0.5.9", "@changesets/types": "^5.2.1", @@ -1218,9 +1371,9 @@ "integrity": "sha512-u8A+DameixqpeyHzvnJWTGj+wfiskQOYHzSiJscCWVfMkIT3rxnbHMtGh3lMthaRY21nbUOK71WcsCnCrXhBJQ==" }, "node_modules/@github/clipboard-copy-element": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@github/clipboard-copy-element/-/clipboard-copy-element-1.2.1.tgz", - "integrity": "sha512-PLccyUCnzmOQ6zrRsH66rr67iumJyP5r7ij17ezprFQAK/oA8CXhlC8LTG+xpW3cYAvnp2zCgRNTfXS8wk09Lg==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@github/clipboard-copy-element/-/clipboard-copy-element-1.3.0.tgz", + "integrity": "sha512-wyntkQkwoLbLo+Hqg2LIVMXDIzcvUb9bSDz+clX6nVJItwzh103rHxdXFRZD+DmxVbuEW5xSznYQXkz1jZT+xg==" }, "node_modules/@github/combobox-nav": { "version": "2.1.7", @@ -1563,6 +1716,26 @@ "resolved": "https://registry.npmjs.org/@oddbird/popover-polyfill/-/popover-polyfill-0.2.3.tgz", "integrity": "sha512-XDK+V/gUeE4NEsWp79eVzhlK3wuVcRDJuaas63qo0IJLJpyOLHqycJLFYvuq8kebgT1nl87P3sbSb5ZN6Vyf5g==" }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/@playwright/test": { "version": "1.35.1", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.35.1.tgz", @@ -1583,9 +1756,9 @@ } }, "node_modules/@primer/behaviors": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@primer/behaviors/-/behaviors-1.3.5.tgz", - "integrity": "sha512-HWwz+6MrfK5NTWcg9GdKFpMBW/yrAV937oXiw2eDtsd88P3SRwoCt6ZO6QmKp9RP3nDU9cbqmuGZ0xBh0eIFeg==" + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@primer/behaviors/-/behaviors-1.3.6.tgz", + "integrity": "sha512-gzryOl22EOzJSPT8pYbHZYHgcKEOw9KxG0L5XRL+cMaS767YGqZGoeF/YEaeJ3dEWMzqz93FPGSem3eo5PmPBA==" }, "node_modules/@primer/css": { "version": "21.0.2", @@ -2091,9 +2264,9 @@ "dev": true }, "node_modules/aria-query": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.2.1.tgz", - "integrity": "sha512-7uFg4b+lETFgdaJyETnILsXgnnzVnkHcgRbwbPwevm5x/LmUlt3MjczMRe1zg824iBgXZNRPTBftNYyRSKLp2g==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "dependencies": { "dequal": "^2.0.3" @@ -2290,6 +2463,15 @@ "node": ">=4" } }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -2305,6 +2487,18 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2392,6 +2586,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -2727,9 +2936,9 @@ } }, "node_modules/css-declaration-sorter": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz", - "integrity": "sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", "dev": true, "engines": { "node": "^10 || ^12 || >=14" @@ -2818,15 +3027,15 @@ } }, "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "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.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", "nth-check": "^2.0.1" }, "funding": { @@ -2844,25 +3053,16 @@ } }, "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "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.14", - "source-map": "^0.6.1" + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" }, "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-tree/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": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, "node_modules/css-what": { @@ -2906,17 +3106,16 @@ } }, "node_modules/cssnano": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", - "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.1.tgz", + "integrity": "sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg==", "dev": true, "dependencies": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" + "cssnano-preset-default": "^6.0.1", + "lilconfig": "^2.1.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "funding": { "type": "opencollective", @@ -2927,72 +3126,93 @@ } }, "node_modules/cssnano-preset-default": { - "version": "5.2.14", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", - "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.1.tgz", + "integrity": "sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ==", "dev": true, "dependencies": { "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.1", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.4", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.2", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" + "cssnano-utils": "^4.0.0", + "postcss-calc": "^9.0.0", + "postcss-colormin": "^6.0.0", + "postcss-convert-values": "^6.0.0", + "postcss-discard-comments": "^6.0.0", + "postcss-discard-duplicates": "^6.0.0", + "postcss-discard-empty": "^6.0.0", + "postcss-discard-overridden": "^6.0.0", + "postcss-merge-longhand": "^6.0.0", + "postcss-merge-rules": "^6.0.1", + "postcss-minify-font-values": "^6.0.0", + "postcss-minify-gradients": "^6.0.0", + "postcss-minify-params": "^6.0.0", + "postcss-minify-selectors": "^6.0.0", + "postcss-normalize-charset": "^6.0.0", + "postcss-normalize-display-values": "^6.0.0", + "postcss-normalize-positions": "^6.0.0", + "postcss-normalize-repeat-style": "^6.0.0", + "postcss-normalize-string": "^6.0.0", + "postcss-normalize-timing-functions": "^6.0.0", + "postcss-normalize-unicode": "^6.0.0", + "postcss-normalize-url": "^6.0.0", + "postcss-normalize-whitespace": "^6.0.0", + "postcss-ordered-values": "^6.0.0", + "postcss-reduce-initial": "^6.0.0", + "postcss-reduce-transforms": "^6.0.0", + "postcss-svgo": "^6.0.0", + "postcss-unique-selectors": "^6.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.0.tgz", + "integrity": "sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw==", "dev": true, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "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": "^1.1.2" + "css-tree": "~2.2.0" }, "engines": { - "node": ">=8.0.0" + "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/csv": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/csv/-/csv-5.5.3.tgz", @@ -3104,15 +3324,61 @@ "node": ">=0.10.0" } }, - "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==", + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", "dev": true, "dependencies": { - "clone": "^1.0.2" + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" }, - "funding": { + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, @@ -3272,24 +3538,27 @@ } }, "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "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.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, "node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "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" } @@ -3307,12 +3576,12 @@ ] }, "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "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.2.0" + "domelementtype": "^2.3.0" }, "engines": { "node": ">= 4" @@ -3322,14 +3591,14 @@ } }, "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "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": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" @@ -3686,15 +3955,15 @@ } }, "node_modules/eslint-plugin-github": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-4.8.0.tgz", - "integrity": "sha512-1qu1qcyac4FfZmT9KNPr5250DwWzwp6uy6xAqHD2boE4OquUpeTni05yPn1b6y6vUYm/q8+npTdyYiRSqvg+BQ==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-4.10.1.tgz", + "integrity": "sha512-1AqQBockOM+m0ZUpwfjWtX0lWdX5cRi/hwJnSNvXoOmz/Hh+ULH6QFz6ENWueTWjoWpgPv0af3bj+snps6o4og==", "dev": true, "dependencies": { "@github/browserslist-config": "^1.0.0", - "@typescript-eslint/eslint-plugin": "^5.1.0", - "@typescript-eslint/parser": "^5.1.0", - "aria-query": "^5.1.3", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "aria-query": "^5.3.0", "eslint-config-prettier": ">=8.0.0", "eslint-plugin-escompat": "^3.3.3", "eslint-plugin-eslint-comments": "^3.2.0", @@ -3703,10 +3972,10 @@ "eslint-plugin-import": "^2.25.2", "eslint-plugin-jsx-a11y": "^6.7.1", "eslint-plugin-no-only-tests": "^3.0.0", - "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-prettier": "^5.0.0", "eslint-rule-documentation": ">=1.0.0", "jsx-ast-utils": "^3.3.2", - "prettier": "^2.2.1", + "prettier": "^3.0.0", "svg-element-attributes": "^1.3.1" }, "bin": { @@ -3716,6 +3985,239 @@ "eslint": "^8.0.1" } }, + "node_modules/eslint-plugin-github/node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz", + "integrity": "sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.8.0", + "@typescript-eslint/type-utils": "6.8.0", + "@typescript-eslint/utils": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.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/eslint-plugin-github/node_modules/@typescript-eslint/parser": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.8.0.tgz", + "integrity": "sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.8.0", + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/typescript-estree": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.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/eslint-plugin-github/node_modules/@typescript-eslint/scope-manager": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz", + "integrity": "sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-github/node_modules/@typescript-eslint/type-utils": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.8.0.tgz", + "integrity": "sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.8.0", + "@typescript-eslint/utils": "6.8.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/eslint-plugin-github/node_modules/@typescript-eslint/types": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz", + "integrity": "sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-github/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz", + "integrity": "sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.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/eslint-plugin-github/node_modules/@typescript-eslint/utils": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.8.0.tgz", + "integrity": "sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==", + "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.8.0", + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/typescript-estree": "6.8.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/eslint-plugin-github/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz", + "integrity": "sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.8.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/eslint-plugin-github/node_modules/eslint-plugin-prettier": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz", + "integrity": "sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-github/node_modules/prettier": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/eslint-plugin-i18n-text": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-i18n-text/-/eslint-plugin-i18n-text-1.0.1.tgz", @@ -4020,6 +4522,29 @@ "node": ">=0.10.0" } }, + "node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, "node_modules/extendable-error": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", @@ -4053,9 +4578,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -4287,6 +4812,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -4582,6 +5119,15 @@ "integrity": "sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==", "dev": true }, + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -4808,6 +5354,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4838,6 +5399,24 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", @@ -4935,6 +5514,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "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", @@ -5041,6 +5632,33 @@ "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/is-wsl/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/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -5438,29 +6056,30 @@ } }, "node_modules/markdownlint": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.26.2.tgz", - "integrity": "sha512-2Am42YX2Ex5SQhRq35HxYWDfz1NLEOZWWN25nqd2h3AHRKsGRE+Qg1gt1++exW792eXTrR4jCNHfShfWk9Nz8w==", + "version": "0.31.1", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.31.1.tgz", + "integrity": "sha512-CKMR2hgcIBrYlIUccDCOvi966PZ0kJExDrUi1R+oF9PvqQmCrTqjOsgIvf2403OmJ+CWomuzDoylr6KbuMyvHA==", "dev": true, "dependencies": { - "markdown-it": "13.0.1" + "markdown-it": "13.0.1", + "markdownlint-micromark": "0.1.7" }, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/markdownlint-cli2": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.5.1.tgz", - "integrity": "sha512-f3Nb1GF/c8YSrV/FntsCWzpa5mLFJRlO+wzEgv+lkNQjU6MZflUwc2FbyEDPTo6oVhP2VyUOkK0GkFgfuktl1w==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.10.0.tgz", + "integrity": "sha512-kVxjPyKFC+eW7iqcxiNI50RDzwugpXkEX5eQlDso/0IUs9M73jXYguLFHDzgi5KatcxU/57Fu8KoGtkFft9lfA==", "dev": true, "dependencies": { - "globby": "13.1.2", - "markdownlint": "0.26.2", - "markdownlint-cli2-formatter-default": "0.0.3", + "globby": "13.2.2", + "markdownlint": "0.31.1", + "markdownlint-cli2-formatter-default": "0.0.4", "micromatch": "4.0.5", - "strip-json-comments": "5.0.0", - "yaml": "2.1.1" + "strip-json-comments": "5.0.1", + "yaml": "2.3.2" }, "bin": { "markdownlint-cli2": "markdownlint-cli2.js", @@ -5468,27 +6087,27 @@ "markdownlint-cli2-fix": "markdownlint-cli2-fix.js" }, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/markdownlint-cli2-formatter-default": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.3.tgz", - "integrity": "sha512-QEAJitT5eqX1SNboOD+SO/LNBpu4P4je8JlR02ug2cLQAqmIhh8IJnSK7AcaHBHhNADqdGydnPpQOpsNcEEqCw==", + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.4.tgz", + "integrity": "sha512-xm2rM0E+sWgjpPn1EesPXx5hIyrN2ddUnUwnbCsD/ONxYtw3PX6LydvdH6dciWAoFDpwzbHM1TO7uHfcMd6IYg==", "dev": true, "peerDependencies": { "markdownlint-cli2": ">=0.0.4" } }, "node_modules/markdownlint-cli2/node_modules/globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "dependencies": { "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", "merge2": "^1.4.1", "slash": "^4.0.0" }, @@ -5512,9 +6131,9 @@ } }, "node_modules/markdownlint-cli2/node_modules/strip-json-comments": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.0.tgz", - "integrity": "sha512-V1LGY4UUo0jgwC+ELQ2BNWfPa17TIuwBLg+j1AA/9RPzKINl1lhxVEu2r+ZTTO8aetIsUzE5Qj6LMSBkoGYKKw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", + "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", "dev": true, "engines": { "node": ">=14.16" @@ -5524,14 +6143,23 @@ } }, "node_modules/markdownlint-cli2/node_modules/yaml": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", - "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", "dev": true, "engines": { "node": ">= 14" } }, + "node_modules/markdownlint-micromark": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.7.tgz", + "integrity": "sha512-BbRPTC72fl5vlSKv37v/xIENSRDYL/7X/XoFzZ740FGEbs9vZerLrIkFRY0rv7slQKxDczToYuMmqQFN61fi4Q==", + "dev": true, + "engines": { + "node": ">=16" + } + }, "node_modules/mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", @@ -5543,9 +6171,9 @@ } }, "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "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/mdurl": { @@ -5632,6 +6260,18 @@ "node": ">=8.6" } }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -5945,13 +6585,28 @@ "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==", + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6062,6 +6717,39 @@ "wrappy": "1" } }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -6346,9 +7034,9 @@ } }, "node_modules/postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "funding": [ { @@ -6393,14 +7081,17 @@ } }, "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "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.9", + "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0" }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, "peerDependencies": { "postcss": "^8.2.2" } @@ -6617,9 +7308,9 @@ } }, "node_modules/postcss-colormin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", - "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.0.0.tgz", + "integrity": "sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw==", "dev": true, "dependencies": { "browserslist": "^4.21.4", @@ -6628,23 +7319,23 @@ "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.0.0.tgz", + "integrity": "sha512-U5D8QhVwqT++ecmy8rnTb+RL9n/B806UVaS3m60lqle4YDFcpbS3ae5bTQIh3wOGUSDHSEtMYLs/38dNG7EYFw==", "dev": true, "dependencies": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" @@ -6740,48 +7431,48 @@ } }, "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.0.tgz", + "integrity": "sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw==", "dev": true, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.0.tgz", + "integrity": "sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA==", "dev": true, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.0.tgz", + "integrity": "sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ==", "dev": true, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.0.tgz", + "integrity": "sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw==", "dev": true, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" @@ -7030,98 +7721,98 @@ "dev": true }, "node_modules/postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.0.tgz", + "integrity": "sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" + "stylehacks": "^6.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-merge-rules": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", - "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.1.tgz", + "integrity": "sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw==", "dev": true, "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^4.0.0", "postcss-selector-parser": "^6.0.5" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.0.0.tgz", + "integrity": "sha512-zNRAVtyh5E8ndZEYXA4WS8ZYsAp798HiIQ1V2UF/C/munLp2r1UGHwf1+6JFu7hdEhJFN+W1WJQKBrtjhFgEnA==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.0.tgz", + "integrity": "sha512-wO0F6YfVAR+K1xVxF53ueZJza3L+R3E6cp0VwuXJQejnNUH0DjcAFe3JEBeTY1dLwGa0NlDWueCA1VlEfiKgAA==", "dev": true, "dependencies": { "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^4.0.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.0.0.tgz", + "integrity": "sha512-Fz/wMQDveiS0n5JPcvsMeyNXOIMrwF88n7196puSuQSWSa+/Ofc1gDOSY2xi8+A4PqB5dlYCKk/WfqKqsI+ReQ==", "dev": true, "dependencies": { "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^4.0.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.0.tgz", + "integrity": "sha512-ec/q9JNCOC2CRDNnypipGfOhbYPuUkewGwLnbv6omue/PSASbHSU7s6uSQ0tcFRVv731oMIx8k0SP4ZX6be/0g==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.5" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" @@ -7170,134 +7861,133 @@ } }, "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.0.tgz", + "integrity": "sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ==", "dev": true, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.0.tgz", + "integrity": "sha512-Qyt5kMrvy7dJRO3OjF7zkotGfuYALETZE+4lk66sziWSPzlBEt7FrUshV6VLECkI4EN8Z863O6Nci4NXQGNzYw==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.0.tgz", + "integrity": "sha512-mPCzhSV8+30FZyWhxi6UoVRYd3ZBJgTRly4hOkaSifo0H+pjDYcii/aVT4YE6QpOil15a5uiv6ftnY3rm0igPg==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.0.tgz", + "integrity": "sha512-50W5JWEBiOOAez2AKBh4kRFm2uhrT3O1Uwdxz7k24aKtbD83vqmcVG7zoIwo6xI2FZ/HDlbrCopXhLeTpQib1A==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.0.tgz", + "integrity": "sha512-KWkIB7TrPOiqb8ZZz6homet2KWKJwIlysF5ICPZrXAylGe2hzX/HSf4NTX2rRPJMAtlRsj/yfkrWGavFuB+c0w==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.0.tgz", + "integrity": "sha512-tpIXWciXBp5CiFs8sem90IWlw76FV4oi6QEWfQwyeREVwUy39VSeSqjAT7X0Qw650yAimYW5gkl2Gd871N5SQg==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.0.tgz", + "integrity": "sha512-ui5crYkb5ubEUDugDc786L/Me+DXp2dLg3fVJbqyAl0VPkAeALyAijF2zOsnZyaS1HyfPuMH0DwyY18VMFVNkg==", "dev": true, "dependencies": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.0.tgz", + "integrity": "sha512-98mvh2QzIPbb02YDIrYvAg4OUzGH7s1ZgHlD3fIdTHLgPLRpv1ZTKJDnSAKr4Rt21ZQFzwhGMXxpXlfrUBKFHw==", "dev": true, "dependencies": { - "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.0.tgz", + "integrity": "sha512-7cfE1AyLiK0+ZBG6FmLziJzqQCpTQY+8XjMhMAz8WSBSCsCNNUKujgIgjCAmDT3cJ+3zjTXFkoD15ZPsckArVw==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" @@ -7326,16 +8016,16 @@ } }, "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.0.tgz", + "integrity": "sha512-K36XzUDpvfG/nWkjs6d1hRBydeIxGpKS2+n+ywlKPzx1nMYDYpoGbcjhj5AwVYJK1qV2/SDoDEnHzlPD6s3nMg==", "dev": true, "dependencies": { - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^4.0.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" @@ -7475,31 +8165,31 @@ } }, "node_modules/postcss-reduce-initial": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", - "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.0.0.tgz", + "integrity": "sha512-s2UOnidpVuXu6JiiI5U+fV2jamAw5YNA9Fdi/GRK0zLDLCfXmSGqQtzpUPtfN66RtCbb9fFHoyZdQaxOB3WxVA==", "dev": true, "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.0.tgz", + "integrity": "sha512-FQ9f6xM1homnuy1wLe9lP1wujzxnwt1EwiigtWwuyf8FsqqXUDUp2Ulxf9A5yjlUOTdCJO6lonYjg1mgqIIi2w==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" @@ -7636,31 +8326,31 @@ } }, "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.0.tgz", + "integrity": "sha512-r9zvj/wGAoAIodn84dR/kFqwhINp5YsJkLoujybWG59grR/IHx+uQ2Zo+IcOwM0jskfYX3R0mo+1Kip1VSNcvw==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" + "svgo": "^3.0.2" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >= 18" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.0.tgz", + "integrity": "sha512-EPQzpZNxOxP7777t73RQpZE5e9TrnCrkvp7AH7a0l89JmZiPnS82y216JowHXwpBCQitfyxrof9TK3rYbi7/Yw==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.5" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" @@ -7760,206 +8450,11 @@ }, "node_modules/pretty-hrtime": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/primer-changesets-cli": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/primer-changesets-cli/-/primer-changesets-cli-2.2.0.tgz", - "integrity": "sha512-xfptqA9bI5aG40VrOk52XwgYVmnht2gwGl1rysEojzxfNzTz0zBTqs1ro0s9RhoXu9IAk7MJx+nAtkjMxLHf4w==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/apply-release-plan": "^6.1.3", - "@changesets/assemble-release-plan": "^5.2.3", - "@changesets/changelog-git": "^0.1.14", - "@changesets/config": "^2.3.0", - "@changesets/errors": "^0.1.4", - "@changesets/get-dependents-graph": "^1.3.5", - "@changesets/get-release-plan": "^3.0.16", - "@changesets/git": "^2.0.0", - "@changesets/logger": "^0.0.5", - "@changesets/pre": "^1.0.14", - "@changesets/read": "^0.5.9", - "@changesets/types": "^5.2.1", - "@changesets/write": "^0.2.3", - "@manypkg/get-packages": "^1.1.3", - "@types/is-ci": "^3.0.0", - "@types/semver": "^6.0.0", - "ansi-colors": "^4.1.3", - "chalk": "^2.1.0", - "enquirer": "^2.3.0", - "external-editor": "^3.1.0", - "fs-extra": "^7.0.1", - "human-id": "^1.0.2", - "is-ci": "^3.0.1", - "meow": "^6.0.0", - "outdent": "^0.5.0", - "p-limit": "^2.2.0", - "preferred-pm": "^3.0.0", - "resolve-from": "^5.0.0", - "semver": "^5.4.1", - "spawndamnit": "^2.0.0", - "term-size": "^2.1.0", - "tty-table": "^4.1.5" - }, - "bin": { - "changeset": "bin.js" - } - }, - "node_modules/primer-changesets-cli/node_modules/@types/semver": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-6.2.3.tgz", - "integrity": "sha512-KQf+QAMWKMrtBMsB8/24w53tEsxllMj6TuA80TT/5igJalLI/zm0L3oXRbIAl4Ohfc85gyHX/jhMwsVkmhLU4A==", - "dev": true - }, - "node_modules/primer-changesets-cli/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/primer-changesets-cli/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/primer-changesets-cli/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/primer-changesets-cli/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/primer-changesets-cli/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/primer-changesets-cli/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/primer-changesets-cli/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/primer-changesets-cli/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/primer-changesets-cli/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/primer-changesets-cli/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/primer-changesets-cli/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/primer-changesets-cli/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/primer-changesets-cli/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/primer-changesets-cli/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", "dev": true, "engines": { - "node": ">= 4.0.0" + "node": ">= 0.8" } }, "node_modules/pseudomap": { @@ -8353,6 +8848,110 @@ "randombytes": "^2.1.0" } }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/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/run-applescript/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/run-applescript/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/run-applescript/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/run-applescript/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/run-applescript/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/run-applescript/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/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -8417,9 +9016,9 @@ "dev": true }, "node_modules/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -8821,13 +9420,6 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "dev": true - }, "node_modules/stream-transform": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-2.1.3.tgz", @@ -8948,6 +9540,18 @@ "node": ">=4" } }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", @@ -8979,16 +9583,16 @@ "dev": true }, "node_modules/stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.0.tgz", + "integrity": "sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw==", "dev": true, "dependencies": { "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" @@ -9282,24 +9886,43 @@ "dev": true }, "node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz", + "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==", "dev": true, "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" + "css-select": "^5.1.0", + "css-tree": "^2.2.1", + "csso": "^5.0.5", + "picocolors": "^1.0.0" }, "bin": { "svgo": "bin/svgo" }, "engines": { - "node": ">=10.13.0" + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, "node_modules/table": { @@ -9426,6 +10049,18 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -9465,6 +10100,18 @@ "node": ">=8" } }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -9478,9 +10125,9 @@ } }, "node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, "node_modules/tsutils": { @@ -9673,6 +10320,15 @@ "node": ">= 10.0.0" } }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", @@ -10288,13 +10944,13 @@ } }, "@changesets/apply-release-plan": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-6.1.3.tgz", - "integrity": "sha512-ECDNeoc3nfeAe1jqJb5aFQX7CqzQhD2klXRez2JDb/aVpGUbX673HgKrnrgJRuQR/9f2TtLoYIzrGB9qwD77mg==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-6.1.4.tgz", + "integrity": "sha512-FMpKF1fRlJyCZVYHr3CbinpZZ+6MwvOtWUuO8uo+svcATEoc1zRDcj23pAurJ2TZ/uVz1wFHH6K3NlACy0PLew==", "dev": true, "requires": { "@babel/runtime": "^7.20.1", - "@changesets/config": "^2.3.0", + "@changesets/config": "^2.3.1", "@changesets/get-version-range-type": "^0.3.2", "@changesets/git": "^2.0.0", "@changesets/types": "^5.2.1", @@ -10305,9 +10961,165 @@ "outdent": "^0.5.0", "prettier": "^2.7.1", "resolve-from": "^5.0.0", - "semver": "^5.4.1" + "semver": "^7.5.3" + }, + "dependencies": { + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "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 + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "@changesets/assemble-release-plan": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-5.2.4.tgz", + "integrity": "sha512-xJkWX+1/CUaOUWTguXEbCDTyWJFECEhmdtbkjhn5GVBGxdP/JwaHBIU9sW3FR6gD07UwZ7ovpiPclQZs+j+mvg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.1", + "@changesets/errors": "^0.1.4", + "@changesets/get-dependents-graph": "^1.3.6", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "semver": "^7.5.3" + } + }, + "@changesets/changelog-git": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.1.14.tgz", + "integrity": "sha512-+vRfnKtXVWsDDxGctOfzJsPhaCdXRYoe+KyWYoq5X/GqoISREiat0l3L8B0a453B2B4dfHGcZaGyowHbp9BSaA==", + "dev": true, + "requires": { + "@changesets/types": "^5.2.1" + } + }, + "@changesets/changelog-github": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@changesets/changelog-github/-/changelog-github-0.4.8.tgz", + "integrity": "sha512-jR1DHibkMAb5v/8ym77E4AMNWZKB5NPzw5a5Wtqm1JepAuIF+hrKp2u04NKM14oBZhHglkCfrla9uq8ORnK/dw==", + "dev": true, + "requires": { + "@changesets/get-github-info": "^0.5.2", + "@changesets/types": "^5.2.1", + "dotenv": "^8.1.0" + } + }, + "@changesets/cli": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.26.2.tgz", + "integrity": "sha512-dnWrJTmRR8bCHikJHl9b9HW3gXACCehz4OasrXpMp7sx97ECuBGGNjJhjPhdZNCvMy9mn4BWdplI323IbqsRig==", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.1", + "@changesets/apply-release-plan": "^6.1.4", + "@changesets/assemble-release-plan": "^5.2.4", + "@changesets/changelog-git": "^0.1.14", + "@changesets/config": "^2.3.1", + "@changesets/errors": "^0.1.4", + "@changesets/get-dependents-graph": "^1.3.6", + "@changesets/get-release-plan": "^3.0.17", + "@changesets/git": "^2.0.0", + "@changesets/logger": "^0.0.5", + "@changesets/pre": "^1.0.14", + "@changesets/read": "^0.5.9", + "@changesets/types": "^5.2.1", + "@changesets/write": "^0.2.3", + "@manypkg/get-packages": "^1.1.3", + "@types/is-ci": "^3.0.0", + "@types/semver": "^7.5.0", + "ansi-colors": "^4.1.3", + "chalk": "^2.1.0", + "enquirer": "^2.3.0", + "external-editor": "^3.1.0", + "fs-extra": "^7.0.1", + "human-id": "^1.0.2", + "is-ci": "^3.0.1", + "meow": "^6.0.0", + "outdent": "^0.5.0", + "p-limit": "^2.2.0", + "preferred-pm": "^3.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.5.3", + "spawndamnit": "^2.0.0", + "term-size": "^2.1.0", + "tty-table": "^4.1.5" }, "dependencies": { + "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 + }, + "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, + "requires": { + "color-convert": "^1.9.0" + } + }, + "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, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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, + "requires": { + "color-name": "1.1.3" + } + }, + "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 + }, + "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 + }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -10319,6 +11131,12 @@ "universalify": "^0.1.0" } }, + "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 + }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -10328,17 +11146,29 @@ "graceful-fs": "^4.1.6" } }, + "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, + "requires": { + "p-try": "^2.0.0" + } + }, "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 }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "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, + "requires": { + "has-flag": "^3.0.0" + } }, "universalify": { "version": "0.1.2", @@ -10348,56 +11178,14 @@ } } }, - "@changesets/assemble-release-plan": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-5.2.3.tgz", - "integrity": "sha512-g7EVZCmnWz3zMBAdrcKhid4hkHT+Ft1n0mLussFMcB1dE2zCuwcvGoy9ec3yOgPGF4hoMtgHaMIk3T3TBdvU9g==", - "dev": true, - "requires": { - "@babel/runtime": "^7.20.1", - "@changesets/errors": "^0.1.4", - "@changesets/get-dependents-graph": "^1.3.5", - "@changesets/types": "^5.2.1", - "@manypkg/get-packages": "^1.1.3", - "semver": "^5.4.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@changesets/changelog-git": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.1.14.tgz", - "integrity": "sha512-+vRfnKtXVWsDDxGctOfzJsPhaCdXRYoe+KyWYoq5X/GqoISREiat0l3L8B0a453B2B4dfHGcZaGyowHbp9BSaA==", - "dev": true, - "requires": { - "@changesets/types": "^5.2.1" - } - }, - "@changesets/changelog-github": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/@changesets/changelog-github/-/changelog-github-0.4.8.tgz", - "integrity": "sha512-jR1DHibkMAb5v/8ym77E4AMNWZKB5NPzw5a5Wtqm1JepAuIF+hrKp2u04NKM14oBZhHglkCfrla9uq8ORnK/dw==", - "dev": true, - "requires": { - "@changesets/get-github-info": "^0.5.2", - "@changesets/types": "^5.2.1", - "dotenv": "^8.1.0" - } - }, "@changesets/config": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@changesets/config/-/config-2.3.0.tgz", - "integrity": "sha512-EgP/px6mhCx8QeaMAvWtRrgyxW08k/Bx2tpGT+M84jEdX37v3VKfh4Cz1BkwrYKuMV2HZKeHOh8sHvja/HcXfQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@changesets/config/-/config-2.3.1.tgz", + "integrity": "sha512-PQXaJl82CfIXddUOppj4zWu+987GCw2M+eQcOepxN5s+kvnsZOwjEJO3DH9eVy+OP6Pg/KFEWdsECFEYTtbg6w==", "dev": true, "requires": { "@changesets/errors": "^0.1.4", - "@changesets/get-dependents-graph": "^1.3.5", + "@changesets/get-dependents-graph": "^1.3.6", "@changesets/logger": "^0.0.5", "@changesets/types": "^5.2.1", "@manypkg/get-packages": "^1.1.3", @@ -10443,16 +11231,16 @@ } }, "@changesets/get-dependents-graph": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-1.3.5.tgz", - "integrity": "sha512-w1eEvnWlbVDIY8mWXqWuYE9oKhvIaBhzqzo4ITSJY9hgoqQ3RoBqwlcAzg11qHxv/b8ReDWnMrpjpKrW6m1ZTA==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-1.3.6.tgz", + "integrity": "sha512-Q/sLgBANmkvUm09GgRsAvEtY3p1/5OCzgBE5vX3vgb5CvW0j7CEljocx5oPXeQSNph6FXulJlXV3Re/v3K3P3Q==", "dev": true, "requires": { "@changesets/types": "^5.2.1", "@manypkg/get-packages": "^1.1.3", "chalk": "^2.1.0", "fs-extra": "^7.0.1", - "semver": "^5.4.1" + "semver": "^7.5.3" }, "dependencies": { "ansi-styles": { @@ -10522,12 +11310,6 @@ "graceful-fs": "^4.1.6" } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -10556,14 +11338,14 @@ } }, "@changesets/get-release-plan": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-3.0.16.tgz", - "integrity": "sha512-OpP9QILpBp1bY2YNIKFzwigKh7Qe9KizRsZomzLe6pK8IUo8onkAAVUD8+JRKSr8R7d4+JRuQrfSSNlEwKyPYg==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-3.0.17.tgz", + "integrity": "sha512-6IwKTubNEgoOZwDontYc2x2cWXfr6IKxP3IhKeK+WjyD6y3M4Gl/jdQvBw+m/5zWILSOCAaGLu2ZF6Q+WiPniw==", "dev": true, "requires": { "@babel/runtime": "^7.20.1", - "@changesets/assemble-release-plan": "^5.2.3", - "@changesets/config": "^2.3.0", + "@changesets/assemble-release-plan": "^5.2.4", + "@changesets/config": "^2.3.1", "@changesets/pre": "^1.0.14", "@changesets/read": "^0.5.9", "@changesets/types": "^5.2.1", @@ -11085,9 +11867,9 @@ "integrity": "sha512-u8A+DameixqpeyHzvnJWTGj+wfiskQOYHzSiJscCWVfMkIT3rxnbHMtGh3lMthaRY21nbUOK71WcsCnCrXhBJQ==" }, "@github/clipboard-copy-element": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@github/clipboard-copy-element/-/clipboard-copy-element-1.2.1.tgz", - "integrity": "sha512-PLccyUCnzmOQ6zrRsH66rr67iumJyP5r7ij17ezprFQAK/oA8CXhlC8LTG+xpW3cYAvnp2zCgRNTfXS8wk09Lg==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@github/clipboard-copy-element/-/clipboard-copy-element-1.3.0.tgz", + "integrity": "sha512-wyntkQkwoLbLo+Hqg2LIVMXDIzcvUb9bSDz+clX6nVJItwzh103rHxdXFRZD+DmxVbuEW5xSznYQXkz1jZT+xg==" }, "@github/combobox-nav": { "version": "2.1.7", @@ -11381,6 +12163,20 @@ "resolved": "https://registry.npmjs.org/@oddbird/popover-polyfill/-/popover-polyfill-0.2.3.tgz", "integrity": "sha512-XDK+V/gUeE4NEsWp79eVzhlK3wuVcRDJuaas63qo0IJLJpyOLHqycJLFYvuq8kebgT1nl87P3sbSb5ZN6Vyf5g==" }, + "@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + } + }, "@playwright/test": { "version": "1.35.1", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.35.1.tgz", @@ -11393,9 +12189,9 @@ } }, "@primer/behaviors": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@primer/behaviors/-/behaviors-1.3.5.tgz", - "integrity": "sha512-HWwz+6MrfK5NTWcg9GdKFpMBW/yrAV937oXiw2eDtsd88P3SRwoCt6ZO6QmKp9RP3nDU9cbqmuGZ0xBh0eIFeg==" + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@primer/behaviors/-/behaviors-1.3.6.tgz", + "integrity": "sha512-gzryOl22EOzJSPT8pYbHZYHgcKEOw9KxG0L5XRL+cMaS767YGqZGoeF/YEaeJ3dEWMzqz93FPGSem3eo5PmPBA==" }, "@primer/css": { "version": "21.0.2", @@ -11753,9 +12549,9 @@ "dev": true }, "aria-query": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.2.1.tgz", - "integrity": "sha512-7uFg4b+lETFgdaJyETnILsXgnnzVnkHcgRbwbPwevm5x/LmUlt3MjczMRe1zg824iBgXZNRPTBftNYyRSKLp2g==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "requires": { "dequal": "^2.0.3" @@ -11888,6 +12684,12 @@ "is-windows": "^1.0.0" } }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -11900,6 +12702,15 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, + "bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "requires": { + "big-integer": "^1.6.44" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -11958,6 +12769,15 @@ "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true }, + "bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "requires": { + "run-applescript": "^5.0.0" + } + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -12195,9 +13015,9 @@ } }, "css-declaration-sorter": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz", - "integrity": "sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", "dev": true, "requires": {} }, @@ -12260,15 +13080,15 @@ } }, "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "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, "requires": { "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, @@ -12283,21 +13103,13 @@ } }, "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "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, "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "dependencies": { - "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 - } + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" } }, "css-what": { @@ -12319,67 +13131,84 @@ "dev": true }, "cssnano": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", - "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.1.tgz", + "integrity": "sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg==", "dev": true, "requires": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" + "cssnano-preset-default": "^6.0.1", + "lilconfig": "^2.1.0" } }, "cssnano-preset-default": { - "version": "5.2.14", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", - "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.1.tgz", + "integrity": "sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ==", "dev": true, "requires": { "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.1", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.4", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.2", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" + "cssnano-utils": "^4.0.0", + "postcss-calc": "^9.0.0", + "postcss-colormin": "^6.0.0", + "postcss-convert-values": "^6.0.0", + "postcss-discard-comments": "^6.0.0", + "postcss-discard-duplicates": "^6.0.0", + "postcss-discard-empty": "^6.0.0", + "postcss-discard-overridden": "^6.0.0", + "postcss-merge-longhand": "^6.0.0", + "postcss-merge-rules": "^6.0.1", + "postcss-minify-font-values": "^6.0.0", + "postcss-minify-gradients": "^6.0.0", + "postcss-minify-params": "^6.0.0", + "postcss-minify-selectors": "^6.0.0", + "postcss-normalize-charset": "^6.0.0", + "postcss-normalize-display-values": "^6.0.0", + "postcss-normalize-positions": "^6.0.0", + "postcss-normalize-repeat-style": "^6.0.0", + "postcss-normalize-string": "^6.0.0", + "postcss-normalize-timing-functions": "^6.0.0", + "postcss-normalize-unicode": "^6.0.0", + "postcss-normalize-url": "^6.0.0", + "postcss-normalize-whitespace": "^6.0.0", + "postcss-ordered-values": "^6.0.0", + "postcss-reduce-initial": "^6.0.0", + "postcss-reduce-transforms": "^6.0.0", + "postcss-svgo": "^6.0.0", + "postcss-unique-selectors": "^6.0.0" } }, "cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.0.tgz", + "integrity": "sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw==", "dev": true, "requires": {} }, "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dev": true, "requires": { - "css-tree": "^1.1.2" + "css-tree": "~2.2.0" + }, + "dependencies": { + "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, + "requires": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + } + }, + "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 + } } }, "csv": { @@ -12469,6 +13298,28 @@ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true }, + "default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "requires": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + } + }, + "default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "requires": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + } + }, "defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -12478,6 +13329,12 @@ "clone": "^1.0.2" } }, + "define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true + }, "define-properties": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", @@ -12594,20 +13451,20 @@ } }, "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "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, "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, "dependencies": { "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true } } @@ -12619,23 +13476,23 @@ "dev": true }, "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "requires": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" } }, "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" } }, "dotenv": { @@ -12944,15 +13801,15 @@ } }, "eslint-plugin-github": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-4.8.0.tgz", - "integrity": "sha512-1qu1qcyac4FfZmT9KNPr5250DwWzwp6uy6xAqHD2boE4OquUpeTni05yPn1b6y6vUYm/q8+npTdyYiRSqvg+BQ==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-4.10.1.tgz", + "integrity": "sha512-1AqQBockOM+m0ZUpwfjWtX0lWdX5cRi/hwJnSNvXoOmz/Hh+ULH6QFz6ENWueTWjoWpgPv0af3bj+snps6o4og==", "dev": true, "requires": { "@github/browserslist-config": "^1.0.0", - "@typescript-eslint/eslint-plugin": "^5.1.0", - "@typescript-eslint/parser": "^5.1.0", - "aria-query": "^5.1.3", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "aria-query": "^5.3.0", "eslint-config-prettier": ">=8.0.0", "eslint-plugin-escompat": "^3.3.3", "eslint-plugin-eslint-comments": "^3.2.0", @@ -12961,11 +13818,129 @@ "eslint-plugin-import": "^2.25.2", "eslint-plugin-jsx-a11y": "^6.7.1", "eslint-plugin-no-only-tests": "^3.0.0", - "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-prettier": "^5.0.0", "eslint-rule-documentation": ">=1.0.0", "jsx-ast-utils": "^3.3.2", - "prettier": "^2.2.1", + "prettier": "^3.0.0", "svg-element-attributes": "^1.3.1" + }, + "dependencies": { + "@typescript-eslint/eslint-plugin": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz", + "integrity": "sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.8.0", + "@typescript-eslint/type-utils": "6.8.0", + "@typescript-eslint/utils": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.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" + } + }, + "@typescript-eslint/parser": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.8.0.tgz", + "integrity": "sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "6.8.0", + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/typescript-estree": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz", + "integrity": "sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.8.0.tgz", + "integrity": "sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "6.8.0", + "@typescript-eslint/utils": "6.8.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/types": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz", + "integrity": "sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz", + "integrity": "sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/utils": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.8.0.tgz", + "integrity": "sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.8.0", + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/typescript-estree": "6.8.0", + "semver": "^7.5.4" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz", + "integrity": "sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.8.0", + "eslint-visitor-keys": "^3.4.1" + } + }, + "eslint-plugin-prettier": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz", + "integrity": "sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" + } + }, + "prettier": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "dev": true + } } }, "eslint-plugin-i18n-text": { @@ -13162,6 +14137,23 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + } + }, "extendable-error": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", @@ -13192,9 +14184,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -13371,6 +14363,12 @@ "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", "dev": true }, + "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 + }, "get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -13581,6 +14579,12 @@ "integrity": "sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==", "dev": true }, + "human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -13744,6 +14748,12 @@ "has-tostringtag": "^1.0.0" } }, + "is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -13765,6 +14775,15 @@ "is-extglob": "^2.1.1" } }, + "is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "requires": { + "is-docker": "^3.0.0" + } + }, "is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", @@ -13829,6 +14848,12 @@ "call-bind": "^1.0.2" } }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, "is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -13896,6 +14921,23 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, + "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, + "requires": { + "is-docker": "^2.0.0" + }, + "dependencies": { + "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 + } + } + }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -14238,37 +15280,38 @@ } }, "markdownlint": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.26.2.tgz", - "integrity": "sha512-2Am42YX2Ex5SQhRq35HxYWDfz1NLEOZWWN25nqd2h3AHRKsGRE+Qg1gt1++exW792eXTrR4jCNHfShfWk9Nz8w==", + "version": "0.31.1", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.31.1.tgz", + "integrity": "sha512-CKMR2hgcIBrYlIUccDCOvi966PZ0kJExDrUi1R+oF9PvqQmCrTqjOsgIvf2403OmJ+CWomuzDoylr6KbuMyvHA==", "dev": true, "requires": { - "markdown-it": "13.0.1" + "markdown-it": "13.0.1", + "markdownlint-micromark": "0.1.7" } }, "markdownlint-cli2": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.5.1.tgz", - "integrity": "sha512-f3Nb1GF/c8YSrV/FntsCWzpa5mLFJRlO+wzEgv+lkNQjU6MZflUwc2FbyEDPTo6oVhP2VyUOkK0GkFgfuktl1w==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.10.0.tgz", + "integrity": "sha512-kVxjPyKFC+eW7iqcxiNI50RDzwugpXkEX5eQlDso/0IUs9M73jXYguLFHDzgi5KatcxU/57Fu8KoGtkFft9lfA==", "dev": true, "requires": { - "globby": "13.1.2", - "markdownlint": "0.26.2", - "markdownlint-cli2-formatter-default": "0.0.3", + "globby": "13.2.2", + "markdownlint": "0.31.1", + "markdownlint-cli2-formatter-default": "0.0.4", "micromatch": "4.0.5", - "strip-json-comments": "5.0.0", - "yaml": "2.1.1" + "strip-json-comments": "5.0.1", + "yaml": "2.3.2" }, "dependencies": { "globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "requires": { "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", "merge2": "^1.4.1", "slash": "^4.0.0" } @@ -14280,26 +15323,32 @@ "dev": true }, "strip-json-comments": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.0.tgz", - "integrity": "sha512-V1LGY4UUo0jgwC+ELQ2BNWfPa17TIuwBLg+j1AA/9RPzKINl1lhxVEu2r+ZTTO8aetIsUzE5Qj6LMSBkoGYKKw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", + "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", "dev": true }, "yaml": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", - "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", "dev": true } } }, "markdownlint-cli2-formatter-default": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.3.tgz", - "integrity": "sha512-QEAJitT5eqX1SNboOD+SO/LNBpu4P4je8JlR02ug2cLQAqmIhh8IJnSK7AcaHBHhNADqdGydnPpQOpsNcEEqCw==", + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.4.tgz", + "integrity": "sha512-xm2rM0E+sWgjpPn1EesPXx5hIyrN2ddUnUwnbCsD/ONxYtw3PX6LydvdH6dciWAoFDpwzbHM1TO7uHfcMd6IYg==", "dev": true, "requires": {} }, + "markdownlint-micromark": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.7.tgz", + "integrity": "sha512-BbRPTC72fl5vlSKv37v/xIENSRDYL/7X/XoFzZ740FGEbs9vZerLrIkFRY0rv7slQKxDczToYuMmqQFN61fi4Q==", + "dev": true + }, "mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", @@ -14307,9 +15356,9 @@ "dev": true }, "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "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 }, "mdurl": { @@ -14377,6 +15426,12 @@ "picomatch": "^2.3.1" } }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, "min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -14614,11 +15669,22 @@ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true }, - "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 + "npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + }, + "dependencies": { + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + } + } }, "nth-check": { "version": "2.1.1", @@ -14686,13 +15752,34 @@ "es-abstract": "^1.20.4" } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "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, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", "dev": true, "requires": { - "wrappy": "1" + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" } }, "optionator": { @@ -14893,9 +15980,9 @@ "dev": true }, "postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "requires": { "nanoid": "^3.3.6", @@ -14921,12 +16008,12 @@ } }, "postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.9", + "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0" } }, @@ -15065,9 +16152,9 @@ } }, "postcss-colormin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", - "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.0.0.tgz", + "integrity": "sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw==", "dev": true, "requires": { "browserslist": "^4.21.4", @@ -15077,9 +16164,9 @@ } }, "postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.0.0.tgz", + "integrity": "sha512-U5D8QhVwqT++ecmy8rnTb+RL9n/B806UVaS3m60lqle4YDFcpbS3ae5bTQIh3wOGUSDHSEtMYLs/38dNG7EYFw==", "dev": true, "requires": { "browserslist": "^4.21.4", @@ -15133,30 +16220,30 @@ } }, "postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.0.tgz", + "integrity": "sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw==", "dev": true, "requires": {} }, "postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.0.tgz", + "integrity": "sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA==", "dev": true, "requires": {} }, "postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.0.tgz", + "integrity": "sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ==", "dev": true, "requires": {} }, "postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.0.tgz", + "integrity": "sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw==", "dev": true, "requires": {} }, @@ -15296,62 +16383,62 @@ "dev": true }, "postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.0.tgz", + "integrity": "sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" + "stylehacks": "^6.0.0" } }, "postcss-merge-rules": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", - "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.1.tgz", + "integrity": "sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw==", "dev": true, "requires": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^4.0.0", "postcss-selector-parser": "^6.0.5" } }, "postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.0.0.tgz", + "integrity": "sha512-zNRAVtyh5E8ndZEYXA4WS8ZYsAp798HiIQ1V2UF/C/munLp2r1UGHwf1+6JFu7hdEhJFN+W1WJQKBrtjhFgEnA==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.0.tgz", + "integrity": "sha512-wO0F6YfVAR+K1xVxF53ueZJza3L+R3E6cp0VwuXJQejnNUH0DjcAFe3JEBeTY1dLwGa0NlDWueCA1VlEfiKgAA==", "dev": true, "requires": { "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^4.0.0", "postcss-value-parser": "^4.2.0" } }, "postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.0.0.tgz", + "integrity": "sha512-Fz/wMQDveiS0n5JPcvsMeyNXOIMrwF88n7196puSuQSWSa+/Ofc1gDOSY2xi8+A4PqB5dlYCKk/WfqKqsI+ReQ==", "dev": true, "requires": { "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^4.0.0", "postcss-value-parser": "^4.2.0" } }, "postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.0.tgz", + "integrity": "sha512-ec/q9JNCOC2CRDNnypipGfOhbYPuUkewGwLnbv6omue/PSASbHSU7s6uSQ0tcFRVv731oMIx8k0SP4ZX6be/0g==", "dev": true, "requires": { "postcss-selector-parser": "^6.0.5" @@ -15380,61 +16467,61 @@ } }, "postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.0.tgz", + "integrity": "sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ==", "dev": true, "requires": {} }, "postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.0.tgz", + "integrity": "sha512-Qyt5kMrvy7dJRO3OjF7zkotGfuYALETZE+4lk66sziWSPzlBEt7FrUshV6VLECkI4EN8Z863O6Nci4NXQGNzYw==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.0.tgz", + "integrity": "sha512-mPCzhSV8+30FZyWhxi6UoVRYd3ZBJgTRly4hOkaSifo0H+pjDYcii/aVT4YE6QpOil15a5uiv6ftnY3rm0igPg==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.0.tgz", + "integrity": "sha512-50W5JWEBiOOAez2AKBh4kRFm2uhrT3O1Uwdxz7k24aKtbD83vqmcVG7zoIwo6xI2FZ/HDlbrCopXhLeTpQib1A==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.0.tgz", + "integrity": "sha512-KWkIB7TrPOiqb8ZZz6homet2KWKJwIlysF5ICPZrXAylGe2hzX/HSf4NTX2rRPJMAtlRsj/yfkrWGavFuB+c0w==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.0.tgz", + "integrity": "sha512-tpIXWciXBp5CiFs8sem90IWlw76FV4oi6QEWfQwyeREVwUy39VSeSqjAT7X0Qw650yAimYW5gkl2Gd871N5SQg==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.0.tgz", + "integrity": "sha512-ui5crYkb5ubEUDugDc786L/Me+DXp2dLg3fVJbqyAl0VPkAeALyAijF2zOsnZyaS1HyfPuMH0DwyY18VMFVNkg==", "dev": true, "requires": { "browserslist": "^4.21.4", @@ -15442,19 +16529,18 @@ } }, "postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.0.tgz", + "integrity": "sha512-98mvh2QzIPbb02YDIrYvAg4OUzGH7s1ZgHlD3fIdTHLgPLRpv1ZTKJDnSAKr4Rt21ZQFzwhGMXxpXlfrUBKFHw==", "dev": true, "requires": { - "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.0.tgz", + "integrity": "sha512-7cfE1AyLiK0+ZBG6FmLziJzqQCpTQY+8XjMhMAz8WSBSCsCNNUKujgIgjCAmDT3cJ+3zjTXFkoD15ZPsckArVw==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" @@ -15468,12 +16554,12 @@ "requires": {} }, "postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.0.tgz", + "integrity": "sha512-K36XzUDpvfG/nWkjs6d1hRBydeIxGpKS2+n+ywlKPzx1nMYDYpoGbcjhj5AwVYJK1qV2/SDoDEnHzlPD6s3nMg==", "dev": true, "requires": { - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^4.0.0", "postcss-value-parser": "^4.2.0" } }, @@ -15569,9 +16655,9 @@ } }, "postcss-reduce-initial": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", - "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.0.0.tgz", + "integrity": "sha512-s2UOnidpVuXu6JiiI5U+fV2jamAw5YNA9Fdi/GRK0zLDLCfXmSGqQtzpUPtfN66RtCbb9fFHoyZdQaxOB3WxVA==", "dev": true, "requires": { "browserslist": "^4.21.4", @@ -15579,9 +16665,9 @@ } }, "postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.0.tgz", + "integrity": "sha512-FQ9f6xM1homnuy1wLe9lP1wujzxnwt1EwiigtWwuyf8FsqqXUDUp2Ulxf9A5yjlUOTdCJO6lonYjg1mgqIIi2w==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" @@ -15658,19 +16744,19 @@ "requires": {} }, "postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.0.tgz", + "integrity": "sha512-r9zvj/wGAoAIodn84dR/kFqwhINp5YsJkLoujybWG59grR/IHx+uQ2Zo+IcOwM0jskfYX3R0mo+1Kip1VSNcvw==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" + "svgo": "^3.0.2" } }, "postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.0.tgz", + "integrity": "sha512-EPQzpZNxOxP7777t73RQpZE5e9TrnCrkvp7AH7a0l89JmZiPnS82y216JowHXwpBCQitfyxrof9TK3rYbi7/Yw==", "dev": true, "requires": { "postcss-selector-parser": "^6.0.5" @@ -15732,164 +16818,6 @@ "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", "dev": true }, - "primer-changesets-cli": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/primer-changesets-cli/-/primer-changesets-cli-2.2.0.tgz", - "integrity": "sha512-xfptqA9bI5aG40VrOk52XwgYVmnht2gwGl1rysEojzxfNzTz0zBTqs1ro0s9RhoXu9IAk7MJx+nAtkjMxLHf4w==", - "dev": true, - "requires": { - "@babel/runtime": "^7.20.1", - "@changesets/apply-release-plan": "^6.1.3", - "@changesets/assemble-release-plan": "^5.2.3", - "@changesets/changelog-git": "^0.1.14", - "@changesets/config": "^2.3.0", - "@changesets/errors": "^0.1.4", - "@changesets/get-dependents-graph": "^1.3.5", - "@changesets/get-release-plan": "^3.0.16", - "@changesets/git": "^2.0.0", - "@changesets/logger": "^0.0.5", - "@changesets/pre": "^1.0.14", - "@changesets/read": "^0.5.9", - "@changesets/types": "^5.2.1", - "@changesets/write": "^0.2.3", - "@manypkg/get-packages": "^1.1.3", - "@types/is-ci": "^3.0.0", - "@types/semver": "^6.0.0", - "ansi-colors": "^4.1.3", - "chalk": "^2.1.0", - "enquirer": "^2.3.0", - "external-editor": "^3.1.0", - "fs-extra": "^7.0.1", - "human-id": "^1.0.2", - "is-ci": "^3.0.1", - "meow": "^6.0.0", - "outdent": "^0.5.0", - "p-limit": "^2.2.0", - "preferred-pm": "^3.0.0", - "resolve-from": "^5.0.0", - "semver": "^5.4.1", - "spawndamnit": "^2.0.0", - "term-size": "^2.1.0", - "tty-table": "^4.1.5" - }, - "dependencies": { - "@types/semver": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-6.2.3.tgz", - "integrity": "sha512-KQf+QAMWKMrtBMsB8/24w53tEsxllMj6TuA80TT/5igJalLI/zm0L3oXRbIAl4Ohfc85gyHX/jhMwsVkmhLU4A==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "color-convert": "^1.9.0" - } - }, - "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, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "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, - "requires": { - "color-name": "1.1.3" - } - }, - "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 - }, - "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 - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "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 - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "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, - "requires": { - "p-try": "^2.0.0" - } - }, - "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 - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^3.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -16183,6 +17111,76 @@ } } }, + "run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + }, + "dependencies": { + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "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" + } + }, + "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 + }, + "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 + }, + "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 + }, + "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, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "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 + } + } + }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -16216,9 +17214,9 @@ "dev": true }, "semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -16556,12 +17554,6 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, "stream-transform": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-2.1.3.tgz", @@ -16660,6 +17652,12 @@ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + }, "strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", @@ -16682,9 +17680,9 @@ "dev": true }, "stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.0.tgz", + "integrity": "sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw==", "dev": true, "requires": { "browserslist": "^4.21.4", @@ -16899,18 +17897,27 @@ "dev": true }, "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz", + "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==", "dev": true, "requires": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" + "css-select": "^5.1.0", + "css-tree": "^2.2.1", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + } + }, + "synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "requires": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" } }, "table": { @@ -17021,6 +18028,12 @@ } } }, + "titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -17051,6 +18064,13 @@ "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true }, + "ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "requires": {} + }, "tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -17064,9 +18084,9 @@ } }, "tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, "tsutils": { @@ -17208,6 +18228,12 @@ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true + }, "update-browserslist-db": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", diff --git a/package.json b/package.json index fd19558357..8a9208cd2d 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "@github/auto-check-element": "^5.2.0", "@github/auto-complete-element": "^3.3.4", "@github/catalyst": "^1.6.0", - "@github/clipboard-copy-element": "^1.1.2", + "@github/clipboard-copy-element": "^1.3.0", "@github/details-menu-element": "^1.0.12", "@github/image-crop-element": "^5.0.0", "@github/include-fragment-element": "^6.1.1", @@ -56,6 +56,7 @@ }, "devDependencies": { "@changesets/changelog-github": "^0.4.6", + "@changesets/cli": "^2.24.1", "@github/axe-github": "^0.5.0", "@github/browserslist-config": "^1.0.0", "@github/markdownlint-github": "^0.2.2", @@ -70,12 +71,12 @@ "@typescript-eslint/parser": "^5.31.0", "axe-core": "^4.7.1", "chokidar-cli": "^3.0.0", - "cssnano": "^5.1.13", + "cssnano": "^6.0.1", "eslint": "^8.23.1", "eslint-plugin-custom-elements": "^0.0.6", - "eslint-plugin-github": "^4.4.0", + "eslint-plugin-github": "^4.9.2", "eslint-plugin-prettier": "^4.2.1", - "markdownlint-cli2": "^0.5.1", + "markdownlint-cli2": "^0.10.0", "mocha": "^10.0.0", "playwright": "^1.35.1", "postcss": "^8.4.16", @@ -85,7 +86,6 @@ "postcss-mixins": "^9.0.3", "postcss-preset-env": "^7.8.0", "prettier": "2.7.1", - "primer-changesets-cli": "2.2.0", "rollup": "^2.77.1", "rollup-plugin-terser": "^7.0.2", "stylelint": "^14.13.0", diff --git a/previews/primer/alpha/action_menu_preview.rb b/previews/primer/alpha/action_menu_preview.rb index 20b73a83c5..ad9a61568c 100644 --- a/previews/primer/alpha/action_menu_preview.rb +++ b/previews/primer/alpha/action_menu_preview.rb @@ -216,7 +216,10 @@ def with_deferred_preloaded_content # @label With actions # - def with_actions; end + # @param disable_items toggle + def with_actions(disable_items: false, route_format: :html) + render_with_template(locals: { disable_items: disable_items, route_format: route_format }) + end # @label Single select form # @@ -224,6 +227,12 @@ def single_select_form(route_format: :html) render_with_template(locals: { route_format: route_format }) end + # @label Single select form items + # + def single_select_form_items(route_format: :html) + render_with_template(locals: { route_format: route_format }) + end + # @label Multiple select form # def multiple_select_form(route_format: :html) diff --git a/previews/primer/alpha/action_menu_preview/single_select_form_items.html.erb b/previews/primer/alpha/action_menu_preview/single_select_form_items.html.erb new file mode 100644 index 0000000000..f1ad7101e1 --- /dev/null +++ b/previews/primer/alpha/action_menu_preview/single_select_form_items.html.erb @@ -0,0 +1,31 @@ +<%= render(Primer::Alpha::ActionMenu.new(select_variant: :single)) do |menu| %> + <% menu.with_show_button { "Group By" } %> + <% menu.with_item( + label: "Repository", + href: action_menu_form_action_path(format: route_format), + form_arguments: { + method: :post, + inputs: [{ + name: "query", + value: "query" + }, { + name: "foo", # use "foo" here because that's what the controller expects + value: "group-by-repository", + }], + } + ) %> + <% menu.with_item( + label: "Date", + href: action_menu_form_action_path(format: route_format), + form_arguments: { + method: :post, + inputs: [{ + name: "query", + value: "query" + }, { + name: "foo", # use "foo" here because that's what the controller expects + value: "sort-by-date" + }] + } + ) %> +<% end %> diff --git a/previews/primer/alpha/action_menu_preview/with_actions.html.erb b/previews/primer/alpha/action_menu_preview/with_actions.html.erb index 35d91ce360..a51b298123 100644 --- a/previews/primer/alpha/action_menu_preview/with_actions.html.erb +++ b/previews/primer/alpha/action_menu_preview/with_actions.html.erb @@ -8,14 +8,15 @@ <%= render(Primer::Alpha::ActionMenu.new) do |component| %> <% component.with_show_button { "Trigger" } %> - <% component.with_item(label: "Alert", tag: :button, id: "alert-item") %> - <% component.with_item(label: "Navigate", tag: :a, content_arguments: { href: action_menu_landing_path }) %> - <% component.with_item(label: "Copy text", tag: :"clipboard-copy", content_arguments: { value: "Text to copy" }) %> + <% component.with_item(label: "Alert", tag: :button, id: "alert-item", disabled: disable_items) %> + <% component.with_item(label: "Navigate", tag: :a, content_arguments: { href: action_menu_landing_path }, disabled: disable_items) %> + <% component.with_item(label: "Copy text", tag: :"clipboard-copy", content_arguments: { value: "Text to copy" }, disabled: disable_items) %> <% component.with_item( label: "Submit form", - href: action_menu_form_action_path, + href: action_menu_form_action_path(format: route_format), form_arguments: { name: "foo", value: "bar", method: :post - } + }, + disabled: disable_items ) %> <% end %> diff --git a/previews/primer/alpha/check_box_preview.rb b/previews/primer/alpha/check_box_preview.rb index d32f5a6af3..69946d8a2c 100644 --- a/previews/primer/alpha/check_box_preview.rb +++ b/previews/primer/alpha/check_box_preview.rb @@ -24,6 +24,7 @@ def playground( ) system_arguments = { name: name, + id: id, value: value, label: label, caption: caption, diff --git a/previews/primer/alpha/dialog_preview.rb b/previews/primer/alpha/dialog_preview.rb index 8596fa388d..c4f2be60a0 100644 --- a/previews/primer/alpha/dialog_preview.rb +++ b/previews/primer/alpha/dialog_preview.rb @@ -166,6 +166,11 @@ def body_has_scrollbar_overflow(title: "Test Dialog", subtitle: nil, button_text show_divider: show_divider }) end + + # @label Autofocus element with autofocus attribute + def autofocus_element + render_with_template(locals: {}) + end end end end diff --git a/previews/primer/alpha/dialog_preview/autofocus_element.html.erb b/previews/primer/alpha/dialog_preview/autofocus_element.html.erb new file mode 100644 index 0000000000..12eb796301 --- /dev/null +++ b/previews/primer/alpha/dialog_preview/autofocus_element.html.erb @@ -0,0 +1,8 @@ +<%= render(Primer::Alpha::Dialog.new(id: "dialog-one", title: "Dialog")) do |d| %> + <% d.with_show_button { "Show Dialog" } %> + <% d.with_body do %> +
+ +
+ <% end %> +<% end %> diff --git a/previews/primer/alpha/radio_button_preview.rb b/previews/primer/alpha/radio_button_preview.rb index 943304b477..49cdd5d199 100644 --- a/previews/primer/alpha/radio_button_preview.rb +++ b/previews/primer/alpha/radio_button_preview.rb @@ -24,6 +24,7 @@ def playground( ) system_arguments = { name: name, + id: id, value: value, label: label, caption: caption, diff --git a/previews/primer/alpha/segmented_control_preview.rb b/previews/primer/alpha/segmented_control_preview.rb index 89b224158a..6d7374d6aa 100644 --- a/previews/primer/alpha/segmented_control_preview.rb +++ b/previews/primer/alpha/segmented_control_preview.rb @@ -100,6 +100,41 @@ def icons_and_text_large end # @!endgroup + # @!group Trailing Label + # @label Size small + # @snapshot + def trailing_label_width_small + render(Primer::Alpha::SegmentedControl.new("aria-label": "Billing duration", size: :small)) do |component| + component.with_item(label: "Monthly") + component.with_item(label: "Yearly", selected: true) do |button| + button.with_trailing_visual_label(scheme: :accent) { "-8%" } + end + end + end + + # @label Size medium + # @snapshot + def trailing_label_width_medium + render(Primer::Alpha::SegmentedControl.new("aria-label": "Billing duration", size: :medium)) do |component| + component.with_item(label: "Monthly") + component.with_item(label: "Yearly", selected: true) do |button| + button.with_trailing_visual_label(scheme: :accent) { "-8%" } + end + end + end + + # @label Size large + # @snapshot + def trailing_label_width_large + render(Primer::Alpha::SegmentedControl.new("aria-label": "Billing duration", size: :large)) do |component| + component.with_item(label: "Monthly") + component.with_item(label: "Yearly", selected: true) do |button| + button.with_trailing_visual_label(scheme: :accent) { "-8%" } + end + end + end + # @!endgroup + # @!group Icons only # @label Size small # @snapshot diff --git a/previews/primer/alpha/tooltip_preview.rb b/previews/primer/alpha/tooltip_preview.rb index 562d0d9f7a..2083c56348 100644 --- a/previews/primer/alpha/tooltip_preview.rb +++ b/previews/primer/alpha/tooltip_preview.rb @@ -78,11 +78,16 @@ def tooltip_with_icon_button(direction: :s, tooltip_text: "You can press a butto # @!endgroup # @label Tooltip inside Primer::Alpha::Overlay - def tooltip_inside_primer_overlay(direction: :s, tooltip_text: "You can press a button") + def tooltip_inside_primer_overlay render_with_template( locals: {} ) end + + # @label Tooltip with button moving focus to input + def tooltip_with_dialog_moving_focus_to_input + render_with_template(locals: {}) + end end end end diff --git a/previews/primer/alpha/tooltip_preview/tooltip_with_dialog_moving_focus_to_input.html.erb b/previews/primer/alpha/tooltip_preview/tooltip_with_dialog_moving_focus_to_input.html.erb new file mode 100644 index 0000000000..82dc3a69d8 --- /dev/null +++ b/previews/primer/alpha/tooltip_preview/tooltip_with_dialog_moving_focus_to_input.html.erb @@ -0,0 +1,23 @@ +<%= render(Primer::Alpha::Dialog.new(id: "my-dialog", title: "Confirm focus")) do |d| %> + <%= render(Primer::Alpha::Dialog::Body.new()) do %> + Are you sure you want to focus the input? + <% end %> + <%= render(Primer::Alpha::Dialog::Footer.new()) do %> + <%= render(Primer::Beta::Button.new(id: "yes-button", data: { "close-dialog-id": "my-dialog" })) { "Yes" } %> + <%= render(Primer::Beta::Button.new(scheme: :primary, data: { "close-dialog-id": "my-dialog" })) { "Yes but in green" } %> + <% end %> + <% d.with_show_button do |b| %> + Focus input + <% b.with_tooltip(text: "This is a tooltip in an Overlay") %> + <% end %> +<% end %> + + diff --git a/previews/primer/beta/button_group_preview.rb b/previews/primer/beta/button_group_preview.rb index 46f0fe5442..13f9b92c29 100644 --- a/previews/primer/beta/button_group_preview.rb +++ b/previews/primer/beta/button_group_preview.rb @@ -55,16 +55,16 @@ def icon_buttons(size: :medium) # @snapshot def all_tags render(Primer::Beta::ButtonGroup.new) do |component| - component.with_button(id: "button-1", tag: :button) do |component| - component.with_tooltip(text: "Button Tooltip") + component.with_button(id: "button-1", tag: :button) do |button| + button.with_tooltip(text: "Button Tooltip") "Button 1" end - component.with_button(id: "button-2", tag: :a) do |component| - component.with_tooltip(text: "Button Tooltip") + component.with_button(id: "button-2", tag: :a) do |button| + button.with_tooltip(text: "Button Tooltip") "Button 2" end - component.with_button(id: "button-3", tag: :summary) do |component| - component.with_tooltip(text: "Button Tooltip") + component.with_button(id: "button-3", tag: :summary) do |button| + button.with_tooltip(text: "Button Tooltip") "Button 3" end end diff --git a/previews/primer/beta/button_preview.rb b/previews/primer/beta/button_preview.rb index 9b51ed34c2..64d5711f12 100644 --- a/previews/primer/beta/button_preview.rb +++ b/previews/primer/beta/button_preview.rb @@ -18,6 +18,7 @@ class ButtonPreview < ViewComponent::Preview # @param size select [small, medium, large] # @param block toggle # @param disabled toggle + # @param inactive toggle # @param align_content select [center, start] # @param tag select [a, summary, button] def playground( @@ -27,7 +28,8 @@ def playground( id: "button-preview", align_content: :center, tag: :button, - disabled: false + disabled: false, + inactive: false ) render(Primer::Beta::Button.new( scheme: scheme, @@ -36,7 +38,8 @@ def playground( id: id, align_content: align_content, tag: tag, - disabled: disabled + disabled: disabled, + inactive: inactive )) do |_c| "Button" end @@ -341,6 +344,21 @@ def with_tooltip( align_content: align_content }) end + + # @label Inactive + # @param inactive toggle + # @snapshot + def inactive( + id: "button-preview", + inactive: true + ) + render(Primer::Beta::Button.new( + id: id, + inactive: inactive + )) do |_c| + "Button" + end + end end end end diff --git a/previews/primer/beta/icon_button_preview.rb b/previews/primer/beta/icon_button_preview.rb index 90a975b45d..22caba8dd5 100644 --- a/previews/primer/beta/icon_button_preview.rb +++ b/previews/primer/beta/icon_button_preview.rb @@ -9,6 +9,7 @@ class IconButtonPreview < ViewComponent::Preview # @param size select [small, medium, large] # @param aria_label text # @param disabled toggle + # @param inactive toggle # @param tag select [a, summary, button] # @param icon [Symbol] octicon # @param show_tooltip toggle @@ -18,6 +19,7 @@ def playground( id: "button-preview", tag: :button, disabled: false, + inactive: false, icon: :plus, aria_label: "Button", show_tooltip: true @@ -28,6 +30,7 @@ def playground( id: id, tag: tag, disabled: disabled, + inactive: inactive, icon: icon, "aria-label": aria_label, show_tooltip: show_tooltip diff --git a/primer_view_components.gemspec b/primer_view_components.gemspec index 27b6bc0fa3..b03556d336 100644 --- a/primer_view_components.gemspec +++ b/primer_view_components.gemspec @@ -29,27 +29,4 @@ Gem::Specification.new do |spec| spec.add_runtime_dependency "activesupport", ">= 5.0.0" spec.add_runtime_dependency "openproject-octicons", ">= 19.7.0" spec.add_runtime_dependency "view_component", [">= 3.1", "< 4.0"] - - spec.add_development_dependency "allocation_stats", "~> 0.1" - spec.add_development_dependency "allocation_tracer", "~> 0.6.3" - spec.add_development_dependency "benchmark-ips", "~> 2.8.4" - spec.add_development_dependency "capybara", "~> 3.39.2" - spec.add_development_dependency "cuprite", "~> 0.14.3" - spec.add_development_dependency "erb_lint", "~> 0.4.0" - spec.add_development_dependency "erblint-github", "0.4.0" - spec.add_development_dependency "listen", "~> 3.0" - spec.add_development_dependency "matrix", "~> 0.4.2" - spec.add_development_dependency "minitest", "~> 5.0" - spec.add_development_dependency "mocha" - spec.add_development_dependency "pry" - spec.add_development_dependency "rubocop", "= 1.13.0" - spec.add_development_dependency "rubocop-github", "~> 0.16.0" - spec.add_development_dependency "rubocop-performance", "~> 1.7" - spec.add_development_dependency "simplecov", "~> 0.21.2" - spec.add_development_dependency "simplecov-console", "~> 0.9.1" - spec.add_development_dependency "sprockets" - spec.add_development_dependency "sprockets-rails" - spec.add_development_dependency "thor" - spec.add_development_dependency "timecop" - spec.add_development_dependency "yard", "~> 0.9.25" end diff --git a/static/arguments.json b/static/arguments.json index b143852d70..bf609f2466 100644 --- a/static/arguments.json +++ b/static/arguments.json @@ -46,7 +46,18 @@ "source": "https://github.com/primer/view_components/tree/main/app/components/primer/alpha/action_bar/item.rb", "lookbook": "https://primer.style/view-components/lookbook/inspect/primer/alpha/action_bar/item/default/", "parameters": [ - + { + "name": "item_content", + "type": "String", + "default": "N/A", + "description": "The content to render inside the item." + }, + { + "name": "item_arguments", + "type": "Hash", + "default": "N/A", + "description": "[System arguments](/system-arguments)" + } ] }, { @@ -3117,6 +3128,12 @@ "default": "`false`", "description": "Whether or not the button is disabled. If true, this option forces `tag:` to `:button`." }, + { + "name": "inactive", + "type": "Boolean", + "default": "`false`", + "description": "Whether the button looks visually disabled, but can still accept all the same interactions as an enabled button." + }, { "name": "system_arguments", "type": "Hash", diff --git a/static/classes.json b/static/classes.json index 8efd3eecfc..c83e8df87c 100644 --- a/static/classes.json +++ b/static/classes.json @@ -507,6 +507,18 @@ "SegmentedControl--fullWidth": [ "Primer::Alpha::SegmentedControl" ], + "SegmentedControl--iconOnly": [ + "Primer::Alpha::SegmentedControl" + ], + "SegmentedControl--large": [ + "Primer::Alpha::SegmentedControl" + ], + "SegmentedControl--medium": [ + "Primer::Alpha::SegmentedControl" + ], + "SegmentedControl--small": [ + "Primer::Alpha::SegmentedControl" + ], "SegmentedControl-item": [ "Primer::Alpha::SegmentedControl" ], diff --git a/static/constants.json b/static/constants.json index 1266ad4f74..b5059ede83 100644 --- a/static/constants.json +++ b/static/constants.json @@ -544,9 +544,20 @@ "Primer::Alpha::RadioButtonGroup": { }, "Primer::Alpha::SegmentedControl": { + "DEFAULT_SIZE": "medium", "FULL_WIDTH_DEFAULT": false, "HIDE_LABELS_DEFAULT": false, - "Item": "Primer::Alpha::SegmentedControl::Item" + "Item": "Primer::Alpha::SegmentedControl::Item", + "SIZE_MAPPINGS": { + "small": "SegmentedControl--small", + "medium": "SegmentedControl--medium", + "large": "SegmentedControl--large" + }, + "SIZE_OPTIONS": [ + "small", + "medium", + "large" + ] }, "Primer::Alpha::SegmentedControl::Item": { }, diff --git a/static/info_arch.json b/static/info_arch.json index 98504b9034..82110d3218 100644 --- a/static/info_arch.json +++ b/static/info_arch.json @@ -139,7 +139,18 @@ "source": "https://github.com/primer/view_components/tree/main/app/components/primer/alpha/action_bar/item.rb", "lookbook": "https://primer.style/view-components/lookbook/inspect/primer/alpha/action_bar/item/default/", "parameters": [ - + { + "name": "item_content", + "type": "String", + "default": "N/A", + "description": "The content to render inside the item." + }, + { + "name": "item_arguments", + "type": "Hash", + "default": "N/A", + "description": "{{link_to_system_arguments_docs}}" + } ], "slots": [ @@ -1117,8 +1128,8 @@ }, { "fully_qualified_name": "Primer::Alpha::ActionMenu", - "description": "ActionMenu is used for actions, navigation, to display secondary options, or single/multi select lists. They appear when users interact with buttons, actions, or other controls.\n\nThe only allowed elements for the `Item` components are: `:a`, `:button`, and `:clipboard-copy`. The default is `:button`.", - "accessibility_docs": "The action for the menu item needs to be on the element with `role=\"menuitem\"`. Semantics are removed for everything nested inside of it. When a menu item is selected, the menu will close immediately.\n\nAdditional information around the keyboard functionality and implementation can be found on the [WAI-ARIA Authoring Practices](https://www.w3.org/TR/wai-aria-practices-1.2/#menu).", + "description": "ActionMenu is used for actions, navigation, to display secondary options, or single/multi select lists. They appear when\nusers interact with buttons, actions, or other controls.\n\nThe only allowed elements for the `Item` components are: `:a`, `:button`, and `:clipboard-copy`. The default is `:button`.\n\n### Select variants\n\nWhile `ActionMenu`s default to a list of buttons that can link to other pages, copy text to the clipboard, etc, they also support\n`single` and `multiple` select variants. The single select variant allows a single item to be \"selected\" (i.e. marked \"active\")\nwhen clicked, which will cause a check mark to appear to the left of the item text. When the `multiple` select variant is chosen,\nmultiple items may be selected and check marks will appear next to each selected item.\n\nUse the `select_variant:` option to control which variant the `ActionMenu` uses. For more information, see the documentation on\nsupported arguments below.\n\n### Dynamic labels\n\nWhen using the `single` select variant, an optional label indicating the selected item can be displayed inside the menu button.\nDynamic labels can also be prefixed with custom text.\n\nPass `dynamic_label: true` to enable dynamic label behavior, and pass `dynamic_label_prefix: \"\"` to set a custom prefix.\nFor more information, see the documentation on supported arguments below.\n\n### `ActionMenu`s as form inputs\n\nWhen using either the `single` or `multiple` select variants, `ActionMenu`s can be used as form inputs. They behave very\nsimilarly to how HTML `` element.|\n|`inputs` |`Array` |`[]` |An array of hashes representing HTML `` elements. Must contain at least `name:` and `value:` keys. If additional key/value pairs are provided, they are emitted as HTML attributes on the `` element. This argument supercedes the `name:`, `value:`, and `:input_arguments` arguments listed above.|\n\nThe elements of the `inputs:` array will be emitted as HTML `` elements.", + "accessibility_docs": "The action for the menu item needs to be on the element with `role=\"menuitem\"`. Semantics are removed for everything\nnested inside of it. When a menu item is selected, the menu will close immediately.\n\nAdditional information around the keyboard functionality and implementation can be found on the\n[WAI-ARIA Authoring Practices](https://www.w3.org/TR/wai-aria-practices-1.2/#menu).", "is_form_component": false, "is_published": true, "requires_js": true, @@ -1519,6 +1530,19 @@ ] } }, + { + "preview_path": "primer/alpha/action_menu/single_select_form_items", + "name": "single_select_form_items", + "snapshot": "false", + "skip_rules": { + "wont_fix": [ + "region" + ], + "will_fix": [ + "color-contrast" + ] + } + }, { "preview_path": "primer/alpha/action_menu/multiple_select_form", "name": "multiple_select_form", @@ -2565,84 +2589,7 @@ ], "previews": [ - { - "preview_path": "primer/alpha/check_box/playground", - "name": "playground", - "snapshot": "false", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - }, - { - "preview_path": "primer/alpha/check_box/default", - "name": "default", - "snapshot": "false", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - }, - { - "preview_path": "primer/alpha/check_box/with_caption", - "name": "with_caption", - "snapshot": "true", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - }, - { - "preview_path": "primer/alpha/check_box/checked", - "name": "checked", - "snapshot": "false", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - }, - { - "preview_path": "primer/alpha/check_box/visually_hide_label", - "name": "visually_hide_label", - "snapshot": "false", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - }, - { - "preview_path": "primer/alpha/check_box/disabled", - "name": "disabled", - "snapshot": "false", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - } + ], "subcomponents": [ @@ -3095,6 +3042,19 @@ "color-contrast" ] } + }, + { + "preview_path": "primer/alpha/dialog/autofocus_element", + "name": "autofocus_element", + "snapshot": "false", + "skip_rules": { + "wont_fix": [ + "region" + ], + "will_fix": [ + "color-contrast" + ] + } } ], "subcomponents": [ @@ -5977,84 +5937,7 @@ ], "previews": [ - { - "preview_path": "primer/alpha/radio_button/playground", - "name": "playground", - "snapshot": "false", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - }, - { - "preview_path": "primer/alpha/radio_button/default", - "name": "default", - "snapshot": "true", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - }, - { - "preview_path": "primer/alpha/radio_button/with_caption", - "name": "with_caption", - "snapshot": "true", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - }, - { - "preview_path": "primer/alpha/radio_button/checked", - "name": "checked", - "snapshot": "true", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - }, - { - "preview_path": "primer/alpha/radio_button/visually_hide_label", - "name": "visually_hide_label", - "snapshot": "true", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - }, - { - "preview_path": "primer/alpha/radio_button/disabled", - "name": "disabled", - "snapshot": "true", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - } + ], "subcomponents": [ @@ -6398,6 +6281,45 @@ ] } }, + { + "preview_path": "primer/alpha/segmented_control/trailing_label_width_small", + "name": "trailing_label_width_small", + "snapshot": "true", + "skip_rules": { + "wont_fix": [ + "region" + ], + "will_fix": [ + "color-contrast" + ] + } + }, + { + "preview_path": "primer/alpha/segmented_control/trailing_label_width_medium", + "name": "trailing_label_width_medium", + "snapshot": "true", + "skip_rules": { + "wont_fix": [ + "region" + ], + "will_fix": [ + "color-contrast" + ] + } + }, + { + "preview_path": "primer/alpha/segmented_control/trailing_label_width_large", + "name": "trailing_label_width_large", + "snapshot": "true", + "skip_rules": { + "wont_fix": [ + "region" + ], + "will_fix": [ + "color-contrast" + ] + } + }, { "preview_path": "primer/alpha/segmented_control/icon_only_small", "name": "icon_only_small", @@ -6557,10 +6479,32 @@ } ], "slots": [ - + { + "name": "trailing_visual_label", + "description": "Optional trailing Label", + "parameters": [ + { + "name": "system_arguments", + "type": "Hash", + "default": "N/A", + "description": "The arguments accepted by {{#link_to_component}}Primer::Beta::Button{{/link_to_component}}'s `with_trailing_visual_label` slot." + } + ] + } ], "methods": [ - + { + "name": "with_trailing_visual_label", + "description": "Optional trailing label.", + "parameters": [ + { + "name": "system_arguments", + "type": "Hash", + "default": "N/A", + "description": "The arguments accepted by {{#link_to_component}}Primer::Beta::Button{{/link_to_component}}'s `with_trailing_visual_label` slot." + } + ] + } ], "previews": [ @@ -8341,6 +8285,19 @@ "color-contrast" ] } + }, + { + "preview_path": "primer/alpha/tooltip/tooltip_with_dialog_moving_focus_to_input", + "name": "tooltip_with_dialog_moving_focus_to_input", + "snapshot": "false", + "skip_rules": { + "wont_fix": [ + "region" + ], + "will_fix": [ + "color-contrast" + ] + } } ], "subcomponents": [ @@ -9534,6 +9491,12 @@ "default": "`false`", "description": "Whether or not the button is disabled. If true, this option forces `tag:` to `:button`." }, + { + "name": "inactive", + "type": "Boolean", + "default": "`false`", + "description": "Whether the button looks visually disabled, but can still accept all the same interactions as an enabled button." + }, { "name": "system_arguments", "type": "Hash", @@ -10599,6 +10562,19 @@ "color-contrast" ] } + }, + { + "preview_path": "primer/beta/button/inactive", + "name": "inactive", + "snapshot": "true", + "skip_rules": { + "wont_fix": [ + "region" + ], + "will_fix": [ + "color-contrast" + ] + } } ], "subcomponents": [ diff --git a/static/previews.json b/static/previews.json index d8135e70b7..aa3b6976cf 100644 --- a/static/previews.json +++ b/static/previews.json @@ -580,6 +580,19 @@ ] } }, + { + "preview_path": "primer/alpha/action_menu/single_select_form_items", + "name": "single_select_form_items", + "snapshot": "false", + "skip_rules": { + "wont_fix": [ + "region" + ], + "will_fix": [ + "color-contrast" + ] + } + }, { "preview_path": "primer/alpha/action_menu/multiple_select_form", "name": "multiple_select_form", @@ -2144,6 +2157,19 @@ "color-contrast" ] } + }, + { + "preview_path": "primer/beta/button/inactive", + "name": "inactive", + "snapshot": "true", + "skip_rules": { + "wont_fix": [ + "region" + ], + "will_fix": [ + "color-contrast" + ] + } } ] }, @@ -2332,92 +2358,6 @@ } ] }, - { - "name": "check_box", - "component": "CheckBox", - "status": "alpha", - "lookup_path": "primer/alpha/check_box", - "examples": [ - { - "preview_path": "primer/alpha/check_box/playground", - "name": "playground", - "snapshot": "false", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - }, - { - "preview_path": "primer/alpha/check_box/default", - "name": "default", - "snapshot": "false", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - }, - { - "preview_path": "primer/alpha/check_box/with_caption", - "name": "with_caption", - "snapshot": "true", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - }, - { - "preview_path": "primer/alpha/check_box/checked", - "name": "checked", - "snapshot": "false", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - }, - { - "preview_path": "primer/alpha/check_box/visually_hide_label", - "name": "visually_hide_label", - "snapshot": "false", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - }, - { - "preview_path": "primer/alpha/check_box/disabled", - "name": "disabled", - "snapshot": "false", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - } - ] - }, { "name": "check_box_group", "component": "CheckBoxGroup", @@ -2970,6 +2910,19 @@ "color-contrast" ] } + }, + { + "preview_path": "primer/alpha/dialog/autofocus_element", + "name": "autofocus_element", + "snapshot": "false", + "skip_rules": { + "wont_fix": [ + "region" + ], + "will_fix": [ + "color-contrast" + ] + } } ] }, @@ -4891,92 +4844,6 @@ } ] }, - { - "name": "radio_button", - "component": "RadioButton", - "status": "alpha", - "lookup_path": "primer/alpha/radio_button", - "examples": [ - { - "preview_path": "primer/alpha/radio_button/playground", - "name": "playground", - "snapshot": "false", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - }, - { - "preview_path": "primer/alpha/radio_button/default", - "name": "default", - "snapshot": "true", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - }, - { - "preview_path": "primer/alpha/radio_button/with_caption", - "name": "with_caption", - "snapshot": "true", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - }, - { - "preview_path": "primer/alpha/radio_button/checked", - "name": "checked", - "snapshot": "true", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - }, - { - "preview_path": "primer/alpha/radio_button/visually_hide_label", - "name": "visually_hide_label", - "snapshot": "true", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - }, - { - "preview_path": "primer/alpha/radio_button/disabled", - "name": "disabled", - "snapshot": "true", - "skip_rules": { - "wont_fix": [ - "region" - ], - "will_fix": [ - "color-contrast" - ] - } - } - ] - }, { "name": "radio_button_group", "component": "RadioButtonGroup", @@ -5259,6 +5126,45 @@ ] } }, + { + "preview_path": "primer/alpha/segmented_control/trailing_label_width_small", + "name": "trailing_label_width_small", + "snapshot": "true", + "skip_rules": { + "wont_fix": [ + "region" + ], + "will_fix": [ + "color-contrast" + ] + } + }, + { + "preview_path": "primer/alpha/segmented_control/trailing_label_width_medium", + "name": "trailing_label_width_medium", + "snapshot": "true", + "skip_rules": { + "wont_fix": [ + "region" + ], + "will_fix": [ + "color-contrast" + ] + } + }, + { + "preview_path": "primer/alpha/segmented_control/trailing_label_width_large", + "name": "trailing_label_width_large", + "snapshot": "true", + "skip_rules": { + "wont_fix": [ + "region" + ], + "will_fix": [ + "color-contrast" + ] + } + }, { "preview_path": "primer/alpha/segmented_control/icon_only_small", "name": "icon_only_small", @@ -6600,6 +6506,19 @@ "color-contrast" ] } + }, + { + "preview_path": "primer/alpha/tooltip/tooltip_with_dialog_moving_focus_to_input", + "name": "tooltip_with_dialog_moving_focus_to_input", + "snapshot": "false", + "skip_rules": { + "wont_fix": [ + "region" + ], + "will_fix": [ + "color-contrast" + ] + } } ] }, diff --git a/test/components/alpha/action_menu_test.rb b/test/components/alpha/action_menu_test.rb index a05be4874c..bc0b936033 100644 --- a/test/components/alpha/action_menu_test.rb +++ b/test/components/alpha/action_menu_test.rb @@ -115,7 +115,7 @@ def test_disabled render_preview(:with_disabled_items) assert_selector("li[aria-disabled=true]") do - assert_selector("button.ActionListContent[aria-disabled=true][disabled=disabled]", text: "Does something") + assert_selector("button.ActionListContent[aria-disabled=true]", text: "Does something") assert_selector("a.ActionListContent[aria-disabled=true]", text: "Site") end end diff --git a/test/components/primer/alpha/action_bar_test.rb b/test/components/primer/alpha/action_bar_test.rb index ccc43df19b..c1a4487bfa 100644 --- a/test/components/primer/alpha/action_bar_test.rb +++ b/test/components/primer/alpha/action_bar_test.rb @@ -33,4 +33,12 @@ def test_size_small assert_selector("[data-targets=\"action-bar.items\"] .Button--small", count: 4) end + + def test_item_merges_item_arguments + render_inline(Primer::Alpha::ActionBar.new(size: :small)) do |component| + component.with_item_icon_button(icon: :pencil, label: "Button 1", item_arguments: { classes: "foo", tag: :span }) + end + + assert_selector("span.foo.ActionBar-item") + end end diff --git a/test/components/primer/alpha/segmented_control_test.rb b/test/components/primer/alpha/segmented_control_test.rb index ce03d150fb..a2f80e0e9b 100644 --- a/test/components/primer/alpha/segmented_control_test.rb +++ b/test/components/primer/alpha/segmented_control_test.rb @@ -32,6 +32,18 @@ def test_renders_icons_and_text end end + def test_renders_trailing_label + render_preview(:trailing_label_width_medium) + + assert_selector("segmented-control ul.SegmentedControl") do + assert_selector("button.Button", count: 2) do + assert_selector(".Button-visual.Button-trailingVisual") do + assert_selector(".Label", text: "-8%") + end + end + end + end + def test_renders_icons_only render_preview(:icon_only_medium) diff --git a/test/system/alpha/action_bar_test.rb b/test/system/alpha/action_bar_test.rb index 96bafb1490..8e0661d27f 100644 --- a/test/system/alpha/action_bar_test.rb +++ b/test/system/alpha/action_bar_test.rb @@ -18,4 +18,77 @@ def test_resizing_hides_items assert_selector("[data-target=\"action-bar.moreMenu\"]") end end + + def test_focus_set_on_first_item + visit_preview(:default) + page.driver.browser.keyboard.type(:tab) + + assert_selector("action-bar") do + # focus should be set on the first item + assert_equal page.evaluate_script("document.activeElement.classList.contains('Button--iconOnly')"), true + end + end + + def test_focus_set_within_overflow_menu + visit_preview(:default) + + page.driver.browser.resize(width: 145, height: 350) + assert_selector("[data-targets=\"action-bar.items\"]", count: 2) + + page.driver.browser.keyboard.type(:tab, :left) + + assert_equal page.evaluate_script("document.activeElement.classList.contains('Button--iconOnly')"), true + + # We want to ensure that we're within the ActionMenu assert_selector("action-bar") do + page.driver.browser.keyboard.type(:enter) + assert_equal page.evaluate_script("document.activeElement.classList.contains('ActionListContent')"), true + end + + def test_escape_in_overflow_menu_sets_focus_back + visit_preview(:default) + + page.driver.browser.resize(width: 145, height: 350) + assert_selector("[data-targets=\"action-bar.items\"]", count: 2) + + page.driver.browser.keyboard.type(:tab, :left) + + assert_equal page.evaluate_script("!!document.activeElement.closest('action-menu')"), true + + page.driver.browser.keyboard.down(:enter) + assert_equal page.evaluate_script("document.activeElement.classList.contains('ActionListContent')"), true + + page.driver.browser.keyboard.down(:escape) + + assert_equal page.evaluate_script("document.activeElement.classList.contains('Button--iconOnly')"), true + assert_equal page.evaluate_script("!!document.activeElement.closest('action-menu')"), true + end + + def test_click_outside_of_menu_sets_tabindex_back + visit_preview(:default) + + page.driver.browser.resize(width: 145, height: 350) + assert_selector("[data-targets=\"action-bar.items\"]", count: 2) + + page.driver.browser.keyboard.type(:tab, :left) + + page.driver.browser.keyboard.down(:enter) + assert_equal page.evaluate_script("document.activeElement.classList.contains('ActionListContent')"), true + + page.driver.browser.mouse.click(x: 0, y: 0) + page.driver.browser.keyboard.type(:tab) + + # Ensures that ActionMenu trigger is still focusable + assert_equal page.evaluate_script("document.activeElement.classList.contains('Button--iconOnly')"), true + assert_equal page.evaluate_script("!!document.activeElement.closest('action-menu')"), true + end + + def test_arrow_left_loops_to_last_item + visit_preview(:default) + + # Tab to first item and press left arrow + page.driver.browser.keyboard.type(:tab, :left) + + # The last item "Attach" should be focused + assert page.evaluate_script("document.activeElement.querySelector('svg.octicon-paperclip')") + end end diff --git a/test/system/alpha/action_menu_test.rb b/test/system/alpha/action_menu_test.rb index 3c25ba1fe3..557e192591 100644 --- a/test/system/alpha/action_menu_test.rb +++ b/test/system/alpha/action_menu_test.rb @@ -4,17 +4,96 @@ module Alpha class IntegrationActionMenuTest < System::TestCase + ###### HELPER METHODS ###### + + def click_on_invoker_button + find("action-menu button[aria-controls]").click + end + + def click_on_item(idx) + find("action-menu ul li:nth-child(#{idx})").click + end + + def click_on_first_item + click_on_item(1) + end + + def click_on_second_item + click_on_item(2) + end + + def click_on_third_item + click_on_item(3) + end + + def click_on_fourth_item + click_on_item(4) + end + + def focus_on_invoker_button + page.evaluate_script(<<~JS) + document.querySelector('action-menu button[aria-controls]').focus() + JS + end + + def stub_clipboard! + page.evaluate_script(<<~JS) + (() => { + navigator.clipboard.writeText = async (text) => { + this.text = text; + return Promise.resolve(null); + }; + + navigator.clipboard.readText = async () => { + return Promise.resolve(this.text); + }; + })() + JS + + @clipboard_stubbed = true + end + + def read_clipboard + page.evaluate_async_script(<<~JS) + const [done] = arguments; + navigator.clipboard.readText().then(done).catch((e) => done(e)); + JS + end + + def assert_no_alert(message = nil, &block) + accept_alert(&block) + assert false, message || "Unexpected alert dialog" + rescue Capybara::ModalNotFound + # expected behavior + end + + def capture_clipboard + stub_clipboard! unless clipboard_stubbed? + yield + read_clipboard + end + + ########## TESTS ############ + + def setup + @clipboard_stubbed = false + end + + def clipboard_stubbed? + @clipboard_stubbed + end + def test_dynamic_labels visit_preview(:single_select_with_internal_label) assert_selector("action-menu button[aria-controls]", text: "Menu: Quote reply") - find("action-menu button[aria-controls]").click - find("action-menu ul li:first-child").click + click_on_invoker_button + click_on_first_item assert_selector("action-menu button[aria-controls]", text: "Menu: Copy link") - find("action-menu button[aria-controls]").click - find("action-menu ul li:first-child").click + click_on_invoker_button + click_on_first_item assert_selector("action-menu button[aria-controls]", text: "Menu") end @@ -22,27 +101,25 @@ def test_dynamic_labels def test_anchor_align visit_preview(:align_end) - find("action-menu button[aria-controls]").click + click_on_invoker_button assert_selector("anchored-position[align=end]") end - def test_action_onclick + def test_action_js_onclick visit_preview(:with_actions) - find("action-menu button[aria-controls]").click + click_on_invoker_button accept_alert do - find("action-menu ul li:first-child").click + click_on_first_item end end - def test_action_keydown + def test_action_js_keydown visit_preview(:with_actions) - page.evaluate_script(<<~JS) - document.querySelector('action-menu button[aria-controls]').focus() - JS + focus_on_invoker_button accept_alert do # open menu, "click" on first item @@ -50,12 +127,53 @@ def test_action_keydown end end + def test_action_js_keydown_space + visit_preview(:with_actions) + + focus_on_invoker_button + + accept_alert do + # open menu, "click" on first item + page.driver.browser.keyboard.type(:enter, :space) + end + end + + def test_action_js_disabled + visit_preview(:with_actions, disable_items: true) + + click_on_invoker_button + + assert_no_alert do + click_on_first_item + end + end + + def test_action_js_disabled_keydown + visit_preview(:with_actions, disable_items: true) + + focus_on_invoker_button + + assert_no_alert do + # open menu, "click" on first item + page.driver.browser.keyboard.type(:enter, :enter) + end + end + + def test_action_js_disabled_keydown_space + visit_preview(:with_actions, disable_items: true) + + focus_on_invoker_button + + assert_no_alert do + # open menu, "click" on first item + page.driver.browser.keyboard.type(:enter, :space) + end + end + def test_action_keydown_on_icon_button visit_preview(:with_icon_button) - page.evaluate_script(<<~JS) - document.querySelector('action-menu button[aria-controls]').focus() - JS + focus_on_invoker_button page.driver.browser.keyboard.type(:enter) @@ -65,8 +183,8 @@ def test_action_keydown_on_icon_button def test_action_anchor visit_preview(:with_actions) - find("action-menu button[aria-controls]").click - find("action-menu ul li:nth-child(2)").click + click_on_invoker_button + click_on_second_item assert_selector ".action-menu-landing-page", text: "Hello world!" end @@ -74,9 +192,7 @@ def test_action_anchor def test_action_anchor_keydown visit_preview(:with_actions) - page.evaluate_script(<<~JS) - document.querySelector('action-menu button[aria-controls]').focus() - JS + focus_on_invoker_button # open menu, arrow down to second item, "click" second item page.driver.browser.keyboard.type(:enter, :down, :enter) @@ -84,60 +200,131 @@ def test_action_anchor_keydown assert_selector ".action-menu-landing-page", text: "Hello world!" end - def stub_clipboard! - page.evaluate_script(<<~JS) - (() => { - navigator.clipboard.writeText = async (text) => { - this.text = text; - return Promise.resolve(null); - }; + def test_action_anchor_keydown_space + visit_preview(:with_actions) - navigator.clipboard.readText = async () => { - return Promise.resolve(this.text); - }; - })() - JS + focus_on_invoker_button + + # open menu, arrow down to second item, "click" second item + page.driver.browser.keyboard.type(:enter, :down, :space) + + assert_selector ".action-menu-landing-page", text: "Hello world!" end - def read_clipboard - page.evaluate_async_script(<<~JS) - const [done] = arguments; - navigator.clipboard.readText().then(done).catch((e) => done(e)); - JS + def test_action_anchor_disabled + visit_preview(:with_actions, disable_items: true) + + click_on_invoker_button + click_on_second_item + + # assert no navigation took place + refute_selector ".action-menu-landing-page", text: "Hello world!" + end + + def test_action_anchor_disabled_keydown + visit_preview(:with_actions, disable_items: true) + + focus_on_invoker_button + + # open menu, arrow down to second item, "click" second item + page.driver.browser.keyboard.type(:enter, :down, :enter) + + # assert no navigation took place + refute_selector ".action-menu-landing-page", text: "Hello world!" + end + + def test_action_anchor_disabled_keydown_space + visit_preview(:with_actions, disable_items: true) + + focus_on_invoker_button + + # open menu, arrow down to second item, "click" second item + page.driver.browser.keyboard.type(:enter, :down, :space) + + # assert no navigation took place + refute_selector ".action-menu-landing-page", text: "Hello world!" end def test_action_clipboard_copy visit_preview(:with_actions) - stub_clipboard! + click_on_invoker_button - find("action-menu button[aria-controls]").click - find("action-menu ul li:nth-child(3)").click + clipboard_text = capture_clipboard do + click_on_third_item + end - assert_equal read_clipboard, "Text to copy" + assert_equal clipboard_text, "Text to copy" end def test_action_clipboard_copy_keydown visit_preview(:with_actions) - stub_clipboard! + focus_on_invoker_button - page.evaluate_script(<<~JS) - document.querySelector('action-menu button[aria-controls]').focus() - JS + clipboard_text = capture_clipboard do + # open menu, arrow down to third item, "click" third item + page.driver.browser.keyboard.type(:enter, :down, :down, :enter) + end + + assert_equal clipboard_text, "Text to copy" + end + + def test_action_clipboard_copy_keydown_space + visit_preview(:with_actions) + + focus_on_invoker_button + + clipboard_text = capture_clipboard do + # open menu, arrow down to third item, "click" third item + page.driver.browser.keyboard.type(:enter, :down, :down, :space) + end + + assert_equal clipboard_text, "Text to copy" + end + + def test_action_clipboard_copy_disabled + visit_preview(:with_actions, disable_items: true) + + click_on_invoker_button + + clipboard_text = capture_clipboard do + click_on_third_item + end + + assert_nil clipboard_text + end + + def test_action_clipboard_copy_disabled_keydown + visit_preview(:with_actions, disable_items: true) + + focus_on_invoker_button - # open menu, arrow down to third item, "click" third item - page.driver.browser.keyboard.type(:enter, :down, :down, :enter) + clipboard_text = capture_clipboard do + # open menu, arrow down to third item, "click" third item + page.driver.browser.keyboard.type(:enter, :down, :down, :enter) + end + + assert_nil clipboard_text + end + + def test_action_clipboard_copy_disabled_keydown_space + visit_preview(:with_actions, disable_items: true) - assert_equal read_clipboard, "Text to copy" + focus_on_invoker_button + + clipboard_text = capture_clipboard do + # open menu, arrow down to third item, "click" third item + page.driver.browser.keyboard.type(:enter, :down, :down, :space) + end + + assert_nil clipboard_text end def test_first_item_is_focused_on_invoker_keydown visit_preview(:with_actions) - page.evaluate_script(<<~JS) - document.querySelector('action-menu button[aria-controls]').focus() - JS + focus_on_invoker_button # open menu page.driver.browser.keyboard.type(:enter) @@ -145,13 +332,21 @@ def test_first_item_is_focused_on_invoker_keydown assert_equal page.evaluate_script("document.activeElement").text, "Alert" end + def test_first_item_is_focused_on_invoker_click + visit_preview(:with_actions) + + click_on_invoker_button + + assert_equal page.evaluate_script("document.activeElement").text, "Alert" + end + def test_opens_dialog visit_preview(:opens_dialog) - find("action-menu button[aria-controls]").click - find("action-menu ul li:nth-child(2)").click + click_on_invoker_button + click_on_second_item - assert_selector "modal-dialog#my-dialog" + assert_selector "modal-dialog[open]" # opening the dialog should close the menu refute_selector "action-menu ul li" @@ -160,9 +355,7 @@ def test_opens_dialog def test_opens_dialog_on_keydown visit_preview(:opens_dialog) - page.evaluate_script(<<~JS) - document.querySelector('action-menu button[aria-controls]').focus() - JS + focus_on_invoker_button # open menu, arrow down to second item, "click" second item page.driver.browser.keyboard.type(:enter, :down, :enter) @@ -170,11 +363,22 @@ def test_opens_dialog_on_keydown assert_selector "modal-dialog#my-dialog" end + def test_opens_dialog_on_keydown_space + visit_preview(:opens_dialog) + + focus_on_invoker_button + + # open menu, arrow down to second item, "click" second item + page.driver.browser.keyboard.type(:enter, :down, :space) + + assert_selector "modal-dialog#my-dialog" + end + def test_single_select_form_submission visit_preview(:single_select_form, route_format: :json) - find("action-menu button[aria-controls]").click - find("action-menu ul li:first-child").click + click_on_invoker_button + click_on_first_item find("input[type=submit]").click @@ -186,8 +390,8 @@ def test_single_select_form_submission def test_single_select_form_uses_label_if_no_value_provided visit_preview(:single_select_form, route_format: :json) - find("action-menu button[aria-controls]").click - find("action-menu ul li:last-child").click + click_on_invoker_button + click_on_fourth_item find("input[type=submit]").click @@ -199,9 +403,9 @@ def test_single_select_form_uses_label_if_no_value_provided def test_multiple_select_form_submission visit_preview(:multiple_select_form, route_format: :json) - find("action-menu button[aria-controls]").click - find("action-menu ul li:first-child").click - find("action-menu ul li:nth-child(2)").click + click_on_invoker_button + click_on_first_item + click_on_second_item # close the menu to reveal the submit button page.driver.browser.keyboard.type(:escape) @@ -216,9 +420,9 @@ def test_multiple_select_form_submission def test_multiple_select_form_uses_label_if_no_value_provided visit_preview(:multiple_select_form, route_format: :json) - find("action-menu button[aria-controls]").click - find("action-menu ul li:first-child").click - find("action-menu ul li:last-child").click + click_on_invoker_button + click_on_first_item + click_on_fourth_item # close the menu to reveal the submit button page.driver.browser.keyboard.type(:escape) @@ -231,18 +435,67 @@ def test_multiple_select_form_uses_label_if_no_value_provided end def test_individual_items_can_submit_post_requests_via_forms - visit_preview(:with_actions) + visit_preview(:with_actions, route_format: :json) - find("action-menu button[aria-controls]").click - find("action-menu ul li:last-child").click + click_on_invoker_button + click_on_fourth_item + + response = JSON.parse(find("pre").text) + assert_equal "bar", response["value"] + end + + def test_single_select_items_can_submit_forms + visit_preview(:single_select_form_items, route_format: :json) + + click_on_invoker_button + click_on_first_item + + # for some reason the JSON response is wrapped in HTML, I have no idea why + response = JSON.parse(find("pre").text) + assert_equal "group-by-repository", response["value"] + end + + def test_single_select_items_can_submit_forms_on_enter + visit_preview(:single_select_form_items, route_format: :json) + + focus_on_invoker_button + + # open menu, "click" first item + page.driver.browser.keyboard.type(:enter, :enter) + + # for some reason the JSON response is wrapped in HTML, I have no idea why + response = JSON.parse(find("pre").text) + assert_equal "group-by-repository", response["value"] + end + + def test_single_select_items_can_submit_forms_on_keydown_space + visit_preview(:single_select_form_items, route_format: :json) + + focus_on_invoker_button + + # open menu, "click" first item + page.driver.browser.keyboard.type(:enter, :space) + + # for some reason the JSON response is wrapped in HTML, I have no idea why + response = JSON.parse(find("pre").text) + assert_equal "group-by-repository", response["value"] + end + + def test_single_select_items_can_submit_forms_with_multiple_fields + visit_preview(:single_select_form_items, route_format: :json) - assert_equal page.text, 'You selected "bar"' + click_on_invoker_button + click_on_first_item + + # for some reason the JSON response is wrapped in HTML, I have no idea why + response = JSON.parse(find("pre").text) + assert_equal "query", response.dig("other_params", "query") end def test_deferred_loading visit_preview(:with_deferred_content) - find("action-menu button[aria-controls]").click + click_on_invoker_button assert_selector "action-menu ul li", text: "Copy link" assert_selector "action-menu ul li", text: "Quote reply" @@ -254,9 +507,7 @@ def test_deferred_loading def test_deferred_loading_on_keydown visit_preview(:with_deferred_content) - page.evaluate_script(<<~JS) - document.querySelector('action-menu button[aria-controls]').focus() - JS + focus_on_invoker_button page.driver.browser.keyboard.type(:enter) @@ -268,11 +519,13 @@ def test_deferred_loading_on_keydown def test_deferred_dialog_opens visit_preview(:with_deferred_content) - find("action-menu button[aria-controls]").click - - find("action-menu ul li:nth-child(4)").click + click_on_invoker_button + click_on_fourth_item assert_selector "modal-dialog[open]" + + # menu should close + refute_selector "action-menu ul li" end def test_opening_second_menu_closes_first_menu @@ -292,8 +545,8 @@ def test_opening_second_menu_closes_first_menu def test_single_select_item_checked visit_preview(:single_select) - find("action-menu button[aria-controls]").click - find("action-menu ul li:nth-child(2)").click + click_on_invoker_button + click_on_second_item # clicking item closes menu, so checked item is hidden assert_selector "[aria-checked=true]", text: "Recursive", visible: :hidden @@ -302,14 +555,14 @@ def test_single_select_item_checked def test_single_select_item_unchecks_previously_checked_item visit_preview(:single_select) - find("action-menu button[aria-controls]").click - find("action-menu ul li:nth-child(3)").click + click_on_invoker_button + click_on_third_item # clicking item closes menu, so checked item is hidden refute_selector "[aria-checked=true]", text: "Recursive", visible: :hidden - find("action-menu button[aria-controls]").click - find("action-menu ul li:nth-child(2)").click + click_on_invoker_button + click_on_second_item # clicking item closes menu, so checked item is hidden assert_selector "[aria-checked=true]", text: "Recursive", visible: :hidden @@ -318,11 +571,11 @@ def test_single_select_item_unchecks_previously_checked_item def test_single_selected_item_cannot_be_unchecked visit_preview(:single_select) - find("action-menu button[aria-controls]").click - find("action-menu ul li:nth-child(2)").click + click_on_invoker_button + click_on_second_item - find("action-menu button[aria-controls]").click - find("action-menu ul li:nth-child(2)").click + click_on_invoker_button + click_on_second_item # clicking item closes menu, so checked item is hidden assert_selector "[aria-checked=true]", text: "Recursive", visible: :hidden @@ -331,9 +584,9 @@ def test_single_selected_item_cannot_be_unchecked def test_multi_select_items_checked visit_preview(:multiple_select) - find("action-menu button[aria-controls]").click - find("action-menu ul li:nth-child(2)").click - find("action-menu ul li:nth-child(3)").click + click_on_invoker_button + click_on_second_item + click_on_third_item # clicking item closes menu, so checked item is hidden assert_selector "[aria-checked=true]", text: "jonrohan" @@ -343,18 +596,43 @@ def test_multi_select_items_checked def test_multi_select_items_can_be_unchecked visit_preview(:multiple_select) - find("action-menu button[aria-controls]").click - find("action-menu ul li:nth-child(2)").click - find("action-menu ul li:nth-child(3)").click + click_on_invoker_button + click_on_second_item + click_on_third_item # clicking item closes menu, so checked item is hidden assert_selector "[aria-checked=true]", text: "jonrohan" assert_selector "[aria-checked=true]", text: "broccolinisoup" - find("action-menu ul li:nth-child(2)").click - find("action-menu ul li:nth-child(3)").click + click_on_second_item + click_on_third_item refute_selector "[aria-checked=true]" end + + def test_closes_menu_on_focus_out + visit_preview(:default) + + # open menu + click_on_invoker_button + assert_selector "action-menu ul li" + + # focus on invoker element + focus_on_invoker_button + + # list items should no longer be visible + refute_selector "action-menu ul li" + end + + def test_closes_menu_when_open_on_invoker_click + visit_preview(:default) + + click_on_invoker_button + assert_selector "action-menu ul li" + + # clicking the invoker a second time should close the menu + click_on_invoker_button + refute_selector "action-menu ul li" + end end end diff --git a/test/system/alpha/dialog_test.rb b/test/system/alpha/dialog_test.rb index 7238074605..336c82d5a3 100644 --- a/test/system/alpha/dialog_test.rb +++ b/test/system/alpha/dialog_test.rb @@ -4,6 +4,18 @@ module Alpha class IntegrationDialogTest < System::TestCase + def click_on_initial_dialog_close_button + find("button[data-close-dialog-id='dialog-one']").trigger("click") + end + + def click_on_nested_dialog_close_button + find("button[data-close-dialog-id='dialog-two']").click + end + + def click_on_nested_dialog_button + find("#dialog-show-dialog-two").click + end + def test_modal_has_accessible_name visit_preview(:default) @@ -20,5 +32,40 @@ def test_focuses_close_button assert_equal page.evaluate_script("document.activeElement")["aria-label"], "Close" end + + def test_focuses_autofocus_elements_inside_dialog + visit_preview(:autofocus_element) + + click_button("Show Dialog") + + assert_equal page.evaluate_script("document.activeElement")["placeholder"], "This element is focused on open" + end + + def test_closes_top_level_dialog + visit_preview(:nested_dialog) + + click_button("Show Dialog") + click_on_nested_dialog_button + + assert_equal(find("modal-dialog#dialog-two")["open"], true) + + click_on_nested_dialog_close_button + + assert_selector "modal-dialog#dialog-two", visible: :hidden + assert_selector "modal-dialog#dialog-one" + end + + def test_closes_dialog_that_is_not_top_level + visit_preview(:nested_dialog) + + click_button("Show Dialog") + click_on_nested_dialog_button + + assert_equal(find("modal-dialog#dialog-two")["open"], true) + + click_on_initial_dialog_close_button + + assert_selector "modal-dialog#dialog-one", visible: :hidden + end end end diff --git a/test/system/alpha/tooltip_test.rb b/test/system/alpha/tooltip_test.rb index c6f3a307a8..0175218065 100644 --- a/test/system/alpha/tooltip_test.rb +++ b/test/system/alpha/tooltip_test.rb @@ -120,5 +120,21 @@ def test_only_one_visible_at_a_time assert_selector("tool-tip[for='button-2']", visible: :visible) assert_selector("tool-tip.sr-only[for='button-3']", visible: :hidden) end + + def test_tooltip_hidden_after_focus_change + visit_preview(:tooltip_with_dialog_moving_focus_to_input) + + assert_selector("tool-tip[for='dialog-show-my-dialog']", visible: :hidden) + + find("button#dialog-show-my-dialog").hover + + assert_selector("tool-tip[for='dialog-show-my-dialog']", visible: :visible) + + find("button#dialog-show-my-dialog").click + + find("modal-dialog#my-dialog button#yes-button").click + + assert_selector("tool-tip[for='dialog-show-my-dialog']", visible: :hidden) + end end end