From 39793a38c39dee836837977a3e6bd1b05c4f3925 Mon Sep 17 00:00:00 2001 From: Eugene Fox Date: Sat, 3 May 2025 23:59:43 +0300 Subject: [PATCH] !feat: major 3.0 release candidate --- .devcontainer/Dockerfile | 19 + .devcontainer/devcontainer.json | 26 + .github/ISSUE_TEMPLATE/bug_report.yml | 107 + .github/ISSUE_TEMPLATE/config.yml | 7 + .github/ISSUE_TEMPLATE/feature_request.yml | 62 + .github/dependabot.yml | 45 + .github/pull_request_template.md | 33 + .github/release_description_template.md | 14 + .github/workflows/cd_pipeline.yml | 144 + .github/workflows/codeql-analysis.yml | 86 + .github/workflows/pr_next.yml | 31 + .github/workflows/pr_pipeline.yml | 57 + .gitignore | 26 + .vscode/extensions.json | 12 + App.tsx | 11 + CODE_OF_CONDUCT.md | 134 + CONTRIBUTING.md | 4 + LICENSE | 21 + PRIVACY.md | 8 + README.md | 100 + SECURITY.md | 11 + assets/BuyMeACoffee20.tsx | 64 + assets/FaviconPlaceholder.svg | 17 + assets/PagePlaceholder.svg | 33 + assets/global.css | 54 + components/PromptDialog.tsx | 48 + contexts/DialogProvider.tsx | 51 + contexts/ThemeProvider.tsx | 35 + data/links.ts | 24 + entrypoints/background.ts | 338 + entrypoints/content.ts | 46 + entrypoints/options/hooks/useOptionsStyles.ts | 38 + entrypoints/options/index.html | 24 + entrypoints/options/layouts/AboutSection.tsx | 58 + .../options/layouts/ActionsSection.tsx | 55 + .../options/layouts/GeneralSection.tsx | 118 + .../options/layouts/StorageSection.tsx | 64 + entrypoints/options/main.tsx | 45 + entrypoints/options/utils/exportData.ts | 16 + entrypoints/options/utils/importData.ts | 51 + entrypoints/popup.html | 22 + .../components/CollectionView.styles.ts | 101 + .../sidepanel/components/CollectionView.tsx | 84 + .../components/EditDialog.styles.tsx | 40 + .../sidepanel/components/EditDialog.tsx | 142 + .../sidepanel/components/GroupView.styles.ts | 148 + .../sidepanel/components/GroupView.tsx | 114 + .../sidepanel/components/TabView.styles.ts | 114 + entrypoints/sidepanel/components/TabView.tsx | 107 + .../collections/CollectionHeader.tsx | 109 + .../collections/CollectionMoreButton.tsx | 114 + .../components/collections/GroupDropZone.tsx | 45 + .../components/collections/GroupMoreMenu.tsx | 101 + .../collections/OpenCollectionButton.tsx | 97 + .../sidepanel/contexts/CollectionContext.tsx | 14 + .../contexts/CollectionsProvider.tsx | 115 + .../sidepanel/contexts/GroupContext.tsx | 12 + entrypoints/sidepanel/hooks/useDndItem.ts | 61 + entrypoints/sidepanel/index.html | 18 + .../collections/CollectionListView.styles.ts | 51 + .../collections/CollectionListView.tsx | 149 + .../collections/FilterCollectionsButton.tsx | 71 + .../layouts/collections/SearchBar.tsx | 51 + .../collections/SortCollectionsButton.tsx | 46 + .../messages/CloudIssueMessages.tsx | 50 + .../collections/messages/CtaMessage.tsx | 60 + .../messages/StorageCapacityIssueMessage.tsx | 21 + .../sidepanel/layouts/header/ActionButton.tsx | 74 + .../sidepanel/layouts/header/Header.tsx | 53 + .../sidepanel/layouts/header/MoreButton.tsx | 85 + entrypoints/sidepanel/main.tsx | 44 + .../sidepanel/utils/dnd/applyReorder.ts | 61 + .../sidepanel/utils/dnd/collisionDetector.ts | 121 + entrypoints/sidepanel/utils/dnd/dndUtils.ts | 128 + .../utils/exportCollectionToBookmarks.ts | 48 + .../sidepanel/utils/filterCollections.ts | 65 + .../sidepanel/utils/getCollectionTitle.ts | 8 + .../sidepanel/utils/getSelectedTabs.ts | 8 + .../sidepanel/utils/mergePinnedGroups.ts | 27 + entrypoints/sidepanel/utils/opener.ts | 117 + .../sidepanel/utils/sortCollections.ts | 23 + eslint.config.js | 101 + features/collectionStorage/index.ts | 9 + .../utils/collectionStorage.ts | 12 + .../collectionStorage/utils/getChunkKeys.ts | 6 + .../collectionStorage/utils/getCollections.ts | 36 + .../utils/getCollectionsFromCloud.ts | 20 + .../utils/getCollectionsFromLocal.ts | 7 + .../utils/parseCollections.ts | 80 + .../utils/resolveConflict.ts | 41 + .../utils/saveCollections.ts | 44 + .../utils/saveCollectionsToCloud.ts | 55 + .../utils/saveCollectionsToLocal.ts | 9 + .../utils/serializeCollections.ts | 74 + .../collectionStorage/utils/updateGraphics.ts | 51 + features/migration/hooks/useLocalMigration.ts | 10 + features/migration/index.ts | 2 + features/migration/models/LegacyModels.ts | 15 + .../migration/utils/migrateCollections.ts | 38 + .../migration/utils/migrateLocalStorage.ts | 18 + features/migration/utils/migrateStorage.ts | 60 + .../v3welcome/components/WelcomeDialog.tsx | 68 + features/v3welcome/hooks/useWelcomeDialog.tsx | 17 + features/v3welcome/index.ts | 2 + features/v3welcome/utils/showWelcomeDialog.ts | 6 + hooks/useBmcStyles.ts | 13 + hooks/useDangerStyles.ts | 28 + hooks/useGroupColors.ts | 49 + hooks/useSettings.ts | 24 + hooks/useStorageInfo.ts | 27 + locales/en.yml | 245 + locales/ru.yml | 245 + locales/uk.yml | 245 + models/CollectionModels.ts | 41 + package.json | 47 + public/favicon.ico | Bin 0 -> 166552 bytes public/icon/1024.png | Bin 0 -> 38120 bytes public/icon/128.png | Bin 0 -> 1565 bytes public/icon/16.png | Bin 0 -> 286 bytes public/icon/32.png | Bin 0 -> 424 bytes public/icon/48.png | Bin 0 -> 574 bytes public/icon/96.png | Bin 0 -> 4595 bytes public/notification_icons/bookmark_add.png | Bin 0 -> 4260 bytes public/notification_icons/cloud_checkmark.png | Bin 0 -> 4566 bytes public/notification_icons/cloud_error.png | Bin 0 -> 4816 bytes public/notification_icons/save_warning.png | Bin 0 -> 4384 bytes public/promo/dark.webp | Bin 0 -> 157030 bytes public/promo/light.webp | Bin 0 -> 38980 bytes store_descriptions/en.txt | 49 + store_descriptions/ru.txt | 48 + store_descriptions/uk.txt | 48 + tsconfig.json | 9 + utils/browserLocaleKey.ts | 8 + utils/extLink.ts | 7 + utils/getLogger.ts | 13 + utils/messaging.ts | 26 + utils/saveTabsToCollection.ts | 134 + utils/sendNotification.ts | 26 + utils/settings.tsx | 99 + utils/watchTabSelection.ts | 20 + web-ext.config.js | 11 + wxt.config.ts | 89 + yarn.lock | 6889 +++++++++++++++++ 143 files changed, 14277 insertions(+) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/dependabot.yml create mode 100644 .github/pull_request_template.md create mode 100644 .github/release_description_template.md create mode 100644 .github/workflows/cd_pipeline.yml create mode 100644 .github/workflows/codeql-analysis.yml create mode 100644 .github/workflows/pr_next.yml create mode 100644 .github/workflows/pr_pipeline.yml create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 App.tsx create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 PRIVACY.md create mode 100644 README.md create mode 100644 SECURITY.md create mode 100644 assets/BuyMeACoffee20.tsx create mode 100644 assets/FaviconPlaceholder.svg create mode 100644 assets/PagePlaceholder.svg create mode 100644 assets/global.css create mode 100644 components/PromptDialog.tsx create mode 100644 contexts/DialogProvider.tsx create mode 100644 contexts/ThemeProvider.tsx create mode 100644 data/links.ts create mode 100644 entrypoints/background.ts create mode 100644 entrypoints/content.ts create mode 100644 entrypoints/options/hooks/useOptionsStyles.ts create mode 100644 entrypoints/options/index.html create mode 100644 entrypoints/options/layouts/AboutSection.tsx create mode 100644 entrypoints/options/layouts/ActionsSection.tsx create mode 100644 entrypoints/options/layouts/GeneralSection.tsx create mode 100644 entrypoints/options/layouts/StorageSection.tsx create mode 100644 entrypoints/options/main.tsx create mode 100644 entrypoints/options/utils/exportData.ts create mode 100644 entrypoints/options/utils/importData.ts create mode 100644 entrypoints/popup.html create mode 100644 entrypoints/sidepanel/components/CollectionView.styles.ts create mode 100644 entrypoints/sidepanel/components/CollectionView.tsx create mode 100644 entrypoints/sidepanel/components/EditDialog.styles.tsx create mode 100644 entrypoints/sidepanel/components/EditDialog.tsx create mode 100644 entrypoints/sidepanel/components/GroupView.styles.ts create mode 100644 entrypoints/sidepanel/components/GroupView.tsx create mode 100644 entrypoints/sidepanel/components/TabView.styles.ts create mode 100644 entrypoints/sidepanel/components/TabView.tsx create mode 100644 entrypoints/sidepanel/components/collections/CollectionHeader.tsx create mode 100644 entrypoints/sidepanel/components/collections/CollectionMoreButton.tsx create mode 100644 entrypoints/sidepanel/components/collections/GroupDropZone.tsx create mode 100644 entrypoints/sidepanel/components/collections/GroupMoreMenu.tsx create mode 100644 entrypoints/sidepanel/components/collections/OpenCollectionButton.tsx create mode 100644 entrypoints/sidepanel/contexts/CollectionContext.tsx create mode 100644 entrypoints/sidepanel/contexts/CollectionsProvider.tsx create mode 100644 entrypoints/sidepanel/contexts/GroupContext.tsx create mode 100644 entrypoints/sidepanel/hooks/useDndItem.ts create mode 100644 entrypoints/sidepanel/index.html create mode 100644 entrypoints/sidepanel/layouts/collections/CollectionListView.styles.ts create mode 100644 entrypoints/sidepanel/layouts/collections/CollectionListView.tsx create mode 100644 entrypoints/sidepanel/layouts/collections/FilterCollectionsButton.tsx create mode 100644 entrypoints/sidepanel/layouts/collections/SearchBar.tsx create mode 100644 entrypoints/sidepanel/layouts/collections/SortCollectionsButton.tsx create mode 100644 entrypoints/sidepanel/layouts/collections/messages/CloudIssueMessages.tsx create mode 100644 entrypoints/sidepanel/layouts/collections/messages/CtaMessage.tsx create mode 100644 entrypoints/sidepanel/layouts/collections/messages/StorageCapacityIssueMessage.tsx create mode 100644 entrypoints/sidepanel/layouts/header/ActionButton.tsx create mode 100644 entrypoints/sidepanel/layouts/header/Header.tsx create mode 100644 entrypoints/sidepanel/layouts/header/MoreButton.tsx create mode 100644 entrypoints/sidepanel/main.tsx create mode 100644 entrypoints/sidepanel/utils/dnd/applyReorder.ts create mode 100644 entrypoints/sidepanel/utils/dnd/collisionDetector.ts create mode 100644 entrypoints/sidepanel/utils/dnd/dndUtils.ts create mode 100644 entrypoints/sidepanel/utils/exportCollectionToBookmarks.ts create mode 100644 entrypoints/sidepanel/utils/filterCollections.ts create mode 100644 entrypoints/sidepanel/utils/getCollectionTitle.ts create mode 100644 entrypoints/sidepanel/utils/getSelectedTabs.ts create mode 100644 entrypoints/sidepanel/utils/mergePinnedGroups.ts create mode 100644 entrypoints/sidepanel/utils/opener.ts create mode 100644 entrypoints/sidepanel/utils/sortCollections.ts create mode 100644 eslint.config.js create mode 100644 features/collectionStorage/index.ts create mode 100644 features/collectionStorage/utils/collectionStorage.ts create mode 100644 features/collectionStorage/utils/getChunkKeys.ts create mode 100644 features/collectionStorage/utils/getCollections.ts create mode 100644 features/collectionStorage/utils/getCollectionsFromCloud.ts create mode 100644 features/collectionStorage/utils/getCollectionsFromLocal.ts create mode 100644 features/collectionStorage/utils/parseCollections.ts create mode 100644 features/collectionStorage/utils/resolveConflict.ts create mode 100644 features/collectionStorage/utils/saveCollections.ts create mode 100644 features/collectionStorage/utils/saveCollectionsToCloud.ts create mode 100644 features/collectionStorage/utils/saveCollectionsToLocal.ts create mode 100644 features/collectionStorage/utils/serializeCollections.ts create mode 100644 features/collectionStorage/utils/updateGraphics.ts create mode 100644 features/migration/hooks/useLocalMigration.ts create mode 100644 features/migration/index.ts create mode 100644 features/migration/models/LegacyModels.ts create mode 100644 features/migration/utils/migrateCollections.ts create mode 100644 features/migration/utils/migrateLocalStorage.ts create mode 100644 features/migration/utils/migrateStorage.ts create mode 100644 features/v3welcome/components/WelcomeDialog.tsx create mode 100644 features/v3welcome/hooks/useWelcomeDialog.tsx create mode 100644 features/v3welcome/index.ts create mode 100644 features/v3welcome/utils/showWelcomeDialog.ts create mode 100644 hooks/useBmcStyles.ts create mode 100644 hooks/useDangerStyles.ts create mode 100644 hooks/useGroupColors.ts create mode 100644 hooks/useSettings.ts create mode 100644 hooks/useStorageInfo.ts create mode 100644 locales/en.yml create mode 100644 locales/ru.yml create mode 100644 locales/uk.yml create mode 100644 models/CollectionModels.ts create mode 100644 package.json create mode 100644 public/favicon.ico create mode 100644 public/icon/1024.png create mode 100644 public/icon/128.png create mode 100644 public/icon/16.png create mode 100644 public/icon/32.png create mode 100644 public/icon/48.png create mode 100644 public/icon/96.png create mode 100644 public/notification_icons/bookmark_add.png create mode 100644 public/notification_icons/cloud_checkmark.png create mode 100644 public/notification_icons/cloud_error.png create mode 100644 public/notification_icons/save_warning.png create mode 100644 public/promo/dark.webp create mode 100644 public/promo/light.webp create mode 100644 store_descriptions/en.txt create mode 100644 store_descriptions/ru.txt create mode 100644 store_descriptions/uk.txt create mode 100644 tsconfig.json create mode 100644 utils/browserLocaleKey.ts create mode 100644 utils/extLink.ts create mode 100644 utils/getLogger.ts create mode 100644 utils/messaging.ts create mode 100644 utils/saveTabsToCollection.ts create mode 100644 utils/sendNotification.ts create mode 100644 utils/settings.tsx create mode 100644 utils/watchTabSelection.ts create mode 100644 web-ext.config.js create mode 100644 wxt.config.ts create mode 100644 yarn.lock diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..258cc99 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,19 @@ +FROM mcr.microsoft.com/devcontainers/base:focal + +RUN apt update && apt upgrade -y + +RUN apt install -y software-properties-common apt-transport-https ca-certificates curl gnupg + +RUN mkdir -p /etc/apt/keyrings +RUN curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg + +RUN echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list +RUN apt update && apt install -y nodejs + +RUN corepack enable + +RUN echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list +RUN curl -fSsL https://dl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor | sudo tee /usr/share/keyrings/google-chrome.gpg >> /dev/null +RUN echo deb [arch=amd64 signed-by=/usr/share/keyrings/google-chrome.gpg] http://dl.google.com/linux/chrome/deb/ stable main | sudo tee /etc/apt/sources.list.d/google-chrome.list + +RUN apt update && apt install -y google-chrome-stable firefox diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..e89dbc7 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,26 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/typescript-node +{ + "name": "TabsAsideExtension", + "build": { + "dockerfile": "Dockerfile" + }, + + // Configure tool-specific properties. + "customizations": { + "vscode": { + "extensions": [ + "dbaeumer.vscode-eslint", + "zardoy.disable-ts-errors", + "github.vscode-github-actions", + "GitHub.vscode-pull-request-github", + "bierner.github-markdown-preview", + "mrmlnc.vscode-scss", + "Gruntfuggly.todo-tree", + "redhat.vscode-yaml" + ] + } + }, + + "postCreateCommand": "yarn install" +} diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..62570b8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,107 @@ +name: "🐞 Bug Report" +description: Create a report to help us improve the extension +title: "[Bug]: " +labels: ["bug", "needs-triage"] +assignees: + - xfox111 +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this bug report! + + - type: textarea + id: desc + attributes: + label: Description + description: A clear and concise description of what the bug is. + placeholder: e.g. Sometimes when generating a password not all character sets are included + validations: + required: true + + - type: textarea + attributes: + label: Reproduction steps + description: Precisely describe minimal number of steps that make the bug to appear + placeholder: | + 1. Go to '...' + 2. Click on '...' + 3. Scroll down to '...' + 4. See '...' + validations: + required: true + + - type: textarea + attributes: + label: Expected behavior + description: A clear and concise description of what you expected to happen. + placeholder: e.g. Generated password should include at least one character from every enabled character set + validations: + required: true + + - type: textarea + attributes: + label: Screenshot + description: If applicable, add screenshots to help explain your problem. + validations: + required: false + + - type: dropdown + id: os + attributes: + label: Operating system + options: + - "Windows 10 and newer" + - "Windows 8/8.1" + - "Windows 7 and older" + - "MacOS" + - "Debian or Debian-based" + - "Other" + validations: + required: true + + - type: input + id: browser + attributes: + label: Browser name and version + placeholder: e.g. Microsoft Edge 119.0.2151.58 + description: Put here your browser's name and version + validations: + required: true + + - type: input + id: version + attributes: + label: Extension version + placeholder: e.g. 3.0.0 + validations: + required: true + + - type: textarea + id: context + attributes: + label: Additional context + description: Add any other context about the problem here. + validations: + required: false + + - type: dropdown + id: requested-help + attributes: + label: Are you willing to submit a PR for this issue? + options: + - "yes" + - "no" + validations: + required: true + + - type: checkboxes + id: checkboxes + attributes: + label: Validations + description: Before submitting the issue, please make sure you do the following + options: + - label: Check that there isn't already an issue that reports the same bug to avoid creating a duplicate. + required: true + - label: The provided reproduction is a minimal reproducible example of the bug. + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..7a1fa3b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,7 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-issue-config.json + +blank_issues_enabled: true +contact_links: + - name: Questions & Discussions + url: https://github.com/XFox111/TabsAsideExtension/discussions + about: Use GitHub discussions for message-board style questions and discussions. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..6318208 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,62 @@ +name: "🚀 New feature proposal" +description: Suggest a feature idea for this project +title: "[Feature]: " +labels: ["feature", "needs-triage"] +assignees: + - xfox111 +body: + - type: markdown + attributes: + value: | + Thanks for your interest in the project and taking the time to fill out this feature report! + + - type: textarea + id: proposition + attributes: + label: Proposed solution + description: Describe the solution you'd like + validations: + required: true + + - type: textarea + id: justification + attributes: + label: Justification + description: Is your feature request related to a problem? Please describe. + validations: + required: true + + - type: textarea + id: alts + attributes: + label: Alternatives + description: Describe alternatives you've considered. + validations: + required: true + + - type: textarea + id: context + attributes: + label: Additional context + description: Add any other context or screenshots about the feature request here. + validations: + required: false + + - type: dropdown + id: requested-help + attributes: + label: Are you willing to submit a PR for this issue? + options: + - "yes" + - "no" + validations: + required: true + + - type: checkboxes + id: checkboxes + attributes: + label: Validations + description: Before submitting the issue, please make sure you do the following + options: + - label: Check that there isn't already an issue that request the same feature to avoid creating a duplicate. + required: true diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..cf4e028 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,45 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +# yaml-language-server: $schema=https://json.schemastore.org/dependabot-2.0.json + +version: 2 +updates: + + - package-ecosystem: "npm" # See documentation for possible values + directory: "/" # Location of package manifests + target-branch: "next" + assignees: + - "xfox111" + reviewers: + - "xfox111" + schedule: + interval: monthly + rebase-strategy: disabled + open-pull-requests-limit: 20 + + - package-ecosystem: "github-actions" + directory: "/" + target-branch: "next" + assignees: + - "xfox111" + reviewers: + - "xfox111" + schedule: + interval: monthly + rebase-strategy: disabled + open-pull-requests-limit: 20 + + - package-ecosystem: "devcontainers" + directory: "/" + target-branch: "next" + assignees: + - "xfox111" + reviewers: + - "xfox111" + schedule: + interval: monthly + rebase-strategy: disabled + open-pull-requests-limit: 20 diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..a0a4001 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,33 @@ + + +## Description + + +Resolves: #issue_number + + + + + + + diff --git a/.github/release_description_template.md b/.github/release_description_template.md new file mode 100644 index 0000000..812c9ce --- /dev/null +++ b/.github/release_description_template.md @@ -0,0 +1,14 @@ + + +## What's new + + + + +Refer to [Download section of the README.md](https://github.com/XFox111/TabsAsideExtension#download) for sideloading instructions and download links diff --git a/.github/workflows/cd_pipeline.yml b/.github/workflows/cd_pipeline.yml new file mode 100644 index 0000000..db0f4b1 --- /dev/null +++ b/.github/workflows/cd_pipeline.yml @@ -0,0 +1,144 @@ +name: Release pipeline + +on: + release: + types: [ released ] + workflow_dispatch: + inputs: + bypass_audit: + description: Bypass npm audit + type: boolean + default: false + targets: + description: Targets + required: true + default: '["chrome","firefox"]' + type: choice + options: + - '["chrome","firefox"]' + - '["chrome"]' + - '["firefox"]' + firefox: + description: Deploy Firefox + type: boolean + default: true + chrome: + description: Deploy Chrome + type: boolean + default: true + edge: + description: Deploy Edge + type: boolean + default: true + gh-release: + description: Attach to GitHub release + type: boolean + default: true + +jobs: + build: + runs-on: ubuntu-latest + container: node:20 + strategy: + fail-fast: false + matrix: + target: ${{ fromJSON(github.event.inputs.targets || '["chrome","firefox"]') }} + + steps: + - uses: actions/checkout@main + + - run: yarn install + - run: yarn zip -b ${{ matrix.target }} + + - name: Drop build artifacts (${{ matrix.target }}) + uses: actions/upload-artifact@main + with: + name: ${{ matrix.target }} + path: ./.output/tabs-aside-*-${{ matrix.target }}.zip + include-hidden-files: true + + - name: web-ext lint + if: ${{ matrix.target == 'firefox' }} + uses: freaktechnik/web-ext-lint@main + with: + extension-root: ./.output/firefox-mv3 + self-hosted: false + + - run: yarn audit + if: ${{ github.event_name == 'release' || github.event.inputs.bypass_audit == 'false' }} + + publish-github: + needs: build + if: ${{ github.event_name == 'release' || github.event.inputs.gh-release == 'true' }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + target: ${{ fromJSON(github.event.inputs.targets || '["chrome","firefox"]') }} + + steps: + - uses: actions/download-artifact@main + with: + name: ${{ matrix.target }} + + - name: Attach build to release + uses: xresloader/upload-to-github-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + file: tabs-aside-*-${{ matrix.target }}.zip + draft: false + overwrite: true + update_latest_release: true + + publish-chrome: + needs: build + if: ${{ github.event_name == 'release' || (github.event.inputs.chrome == 'true' && contains(github.event.inputs.targets, 'chrome')) }} + runs-on: ubuntu-latest + + steps: + - uses: actions/download-artifact@main + with: + name: chrome + + - uses: wdzeng/chrome-extension@v1.3.0 + with: + extension-id: mgmjbodjgijnebfgohlnjkegdpbdjgin + zip-path: tabs-aside-*-chrome.zip + client-id: ${{ secrets.CHROME_CLIENT_ID }} + client-secret: ${{ secrets.CHROME_CLIENT_SECRET }} + refresh-token: ${{ secrets.CHROME_REFRESH_TOKEN }} + + publish-edge: + needs: build + if: ${{ github.event_name == 'release' || (github.event.inputs.edge == 'true' && contains(github.event.inputs.targets, 'chrome')) }} + runs-on: ubuntu-latest + + steps: + - uses: actions/download-artifact@main + with: + name: chrome + + - uses: wdzeng/edge-addon@v2.1.0 + with: + product-id: ${{ secrets.EDGE_PRODUCT_ID }} + zip-path: tabs-aside-*-chrome.zip + client-id: ${{ secrets.EDGE_CLIENT_ID }} + api-key: ${{ secrets.EDGE_API_KEY }} + + publish-firefox: + needs: build + if: ${{ github.event_name == 'release' || (github.event.inputs.firefox == 'true' && contains(github.event.inputs.targets, 'firefox')) }} + runs-on: ubuntu-latest + + steps: + - uses: actions/download-artifact@main + with: + name: firefox + + - uses: wdzeng/firefox-addon@v1.1.2 + with: + addon-guid: ${{ secrets.FIREFOX_EXT_UUID }} + xpi-path: tabs-aside-*-firefox.zip + jwt-issuer: ${{ secrets.FIREFOX_API_KEY }} + jwt-secret: ${{ secrets.FIREFOX_CLIENT_SECRET }} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 0000000..782a458 --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,86 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ "main", "next" ] + paths-ignore: + - '**.md' + - 'LICENSE' + - '**/cd_pipeline.yaml' + - '**/dependabot.yml' + - '**/pr_pipeline.yaml' + - '.vscode/*' + pull_request: + # The branches below must be a subset of the branches above + branches: [ "main", "next" ] + paths-ignore: + - '**.md' + - 'LICENSE' + - '**/cd_pipeline.yaml' + - '**/dependabot.yml' + - '**/pr_pipeline.yaml' + - '.vscode/*' + schedule: + - cron: '24 7 * * 3' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'typescript' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] + # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v3 + + # â„šī¸ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + + # If the Autobuild fails above, remove it and uncomment the following three lines. + # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. + + # - run: | + # echo "Run, Build Application using script" + # ./location_of_script_within_repo/buildscript.sh + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/pr_next.yml b/.github/workflows/pr_next.yml new file mode 100644 index 0000000..7a30dc6 --- /dev/null +++ b/.github/workflows/pr_next.yml @@ -0,0 +1,31 @@ +name: PR next workflow + +on: + push: + branches: [ main ] + paths: + - 'package.json' + workflow_dispatch: + +permissions: + contents: write + +jobs: + create-release-draft: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@main + + - name: Get version from package.json + id: get_version + run: | + extver=`jq -r ".version" package.json` + echo "version=$extver" >> "$GITHUB_OUTPUT" + + - uses: dev-build-deploy/release-me@v0.18.0 + with: + token: ${{ secrets.GITHUB_TOKEN }} + prefix: v + draft: true + version: v${{ steps.get_version.outputs.version }} + release-notes: .github/release_description_template.md diff --git a/.github/workflows/pr_pipeline.yml b/.github/workflows/pr_pipeline.yml new file mode 100644 index 0000000..5b2c872 --- /dev/null +++ b/.github/workflows/pr_pipeline.yml @@ -0,0 +1,57 @@ +name: PR check pipeline + +on: + pull_request: + branches: [ "main", "next" ] + paths-ignore: + - '**.md' + - 'LICENSE' + - 'PRIVACY' + - '**/cd_pipeline.yaml' + - '**/dependabot.yml' + - '**/codeql-analysis.yml' + - '**/pr_next.yaml' + - '.vscode/*' + - '.devcontainer/*' + workflow_dispatch: + inputs: + targets: + description: Targets + required: true + default: '["chrome","firefox"]' + type: choice + options: + - '["chrome","firefox"]' + - '["chrome"]' + - '["firefox"]' + +jobs: + build: + runs-on: ubuntu-latest + container: node:23 + strategy: + fail-fast: false + matrix: + target: ${{ fromJSON(github.event.inputs.targets || '["chrome","firefox"]') }} + + steps: + - uses: actions/checkout@main + + - run: yarn install + - run: yarn zip -b ${{ matrix.target }} + + - name: Drop artifacts (${{ matrix.target }}) + uses: actions/upload-artifact@main + with: + name: ${{ matrix.target }} + path: ./.output/tabs-aside-*-${{ matrix.target }}.zip + include-hidden-files: true + + - name: web-ext lint + if: ${{ matrix.target == 'firefox' }} + uses: freaktechnik/web-ext-lint@main + with: + extension-root: ./.output/firefox-mv3 + self-hosted: false + + - run: yarn audit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a256953 --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.output +stats.html +stats-*.json +.wxt +web-ext.config.ts + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..8632321 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,12 @@ +{ + "recommendations": [ + "bierner.github-markdown-preview", + "dbaeumer.vscode-eslint", + "github.vscode-github-actions", + "Gruntfuggly.todo-tree", + "jock.svg", + "ms-azuretools.vscode-docker", + "saeris.markdown-github-alerts", + "zardoy.disable-ts-errors" + ] +} diff --git a/App.tsx b/App.tsx new file mode 100644 index 0000000..1db5711 --- /dev/null +++ b/App.tsx @@ -0,0 +1,11 @@ +import DialogProvider from "@/contexts/DialogProvider"; +import ThemeProvider from "@/contexts/ThemeProvider"; + +const App: React.FC = ({ children }: React.PropsWithChildren) => + + + { children } + + ; + +export default App; diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..ad52cd6 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,134 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of + any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, + without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official email address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +[opensource@xfox111.net](mailto:opensource@xfox111.net). +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at +[https://www.contributor-covenant.org/translations][translations]. + +> Contributor Covenant is released under the [Creative Commons Attribution 4.0 International Public License](https://github.com/EthicalSource/contributor_covenant/blob/release/LICENSE.md). + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..60a9362 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,4 @@ +# Contribution Guidelines + +> [!IMPORTANT] +> This article has been moved to the [project's Wiki section](https://github.com/XFox111/TabsAsideExtension/wiki/Contribution-Guidelines) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..db0177c --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Eugene Fox + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/PRIVACY.md b/PRIVACY.md new file mode 100644 index 0000000..dd4cbf0 --- /dev/null +++ b/PRIVACY.md @@ -0,0 +1,8 @@ +# Tabs aside extension Privacy policy +1. Developers of the extension don't affiliate with Google LLC, Mozilla Foundation or Microsoft Corporation in any way. +2. This extension only stores user data related to its core functionality. This includes: + - User settings + - User saved collections of tabs +2. This extension doesn't use any tracking software, nor does it collect, sell or share any personal data with any third parties. +3. This extension uses cloud storage built into your browser to store its data. +4. Refer to your browser's developer regarding the privacy policy of the cloud storage used by your browser. diff --git a/README.md b/README.md new file mode 100644 index 0000000..f36d9b0 --- /dev/null +++ b/README.md @@ -0,0 +1,100 @@ +[![GitHub release (latest by date)](https://img.shields.io/github/v/release/xfox111/TabsAsideExtension)](https://github.com/xfox111/TabsAsideExtension/releases/latest) +[![GitHub last commit](https://img.shields.io/github/last-commit/xfox111/TabsAsideExtension?label=Last+update)](https://github.com/XFox111/TabsAsideExtension/commits/main) + + + + + Password generator + + +Stemming its roots from the original Microsoft Edge browser feature, this extension has grown much bigger than just a temporary storage for tabs. + +It allows you to save and manage your tabs in a convenient way, providing a range of features that make it easy to organize and access your saved tabs. + +## Features +- **Save tabs**: Save all your open tabs in a single click, and restore them later +- **Organize tabs**: Create collections and subgroups to organize your saved tabs +- **Search tabs**: Quickly find the tabs you need using the search feature +- **Sync across devices**: Access your saved tabs from any device with your account +- **Go dark**: Dark mode support for a more comfortable browsing experience +- **Personalize**: Change the appearance and behavior of the extension to suit your needs + +Check out our [latest blog post](https://at.xfox111.net/tabs-aside-3-0) regarding all the new features and improvements in Tabs aside 3.0 + +## Languages +- Chinese (Simplified) +- English +- Italian +- Polish +- Portuguese (Brazil) +- Russian +- Spanish +- Ukrainian + +## Download +[![Chrome Web Store](https://img.shields.io/chrome-web-store/users/mgmjbodjgijnebfgohlnjkegdpbdjgin?label=Chrome%20Webstore%20downloads)](https://chrome.google.com/webstore/detail/mgmjbodjgijnebfgohlnjkegdpbdjgin) +[![Mozilla Add-on](https://img.shields.io/amo/users/ms-edge-tabs-aside?label=Firefox%20Webstore%20downloads)](https://addons.mozilla.org/firefox/addon/ms-edge-tabs-aside/) + +- [Google Chrome Webstore](https://chrome.google.com/webstore/detail/mgmjbodjgijnebfgohlnjkegdpbdjgin) +- [Microsoft Edge Add-ons Webstore](https://microsoftedge.microsoft.com/addons/detail/kmnblllmalkiapkfknnlpobmjjdnlhnd) +- [Firefox Add-ons](https://addons.mozilla.org/en-US/firefox/addon/ms-edge-tabs-aside/) +- [GitHub Releases](https://github.com/xfox111/TabsAsideExtension/releases/latest) + +### Sideloading (for testing purposes only) + +
+ Click to expand + +--- + +
+ Chromium-based browsers (Edge, Chrome, etc.) + +> 1. Go to [Releases](https://github.com/XFox111/TabsAsideExtension/releases) and select a release to download +> 2. Download attached archive for Chromium and unpack it +> 3. Go to `chrome://extensions` +> 4. Enable "Developer mode" +> 5. Click the "Load unpacked" button and navigate to the extension's root folder (contains `manifest.json`) +> 6. Done! + +
+ +
+ Firefox + +> 1. Go to [Releases](https://github.com/XFox111/TabsAsideExtension/releases) and select a release to download +> 2. Download attached archive for Firefox and unpack it +> 3. Go to `about:debugging#/runtime/this-firefox` +> 4. Click the "Load Temporary Add-on..." button and select `manifest.json` file in the root folder +> 5. Done! + +> **Important!** +This will _replace_ officialy installed version if you have one. +If you want to sideload it without replacing to run both versions at the same time - before loading add-on, open `manifest.json` in a text editor and change `id` key (it's `passwordgenerator@xfox111.net` by default) to something else + +
+ +> **Note:** If you delete the extension folder it will disappear from your browser +--- + +
+ +## Contributing +[![GitHub issues](https://img.shields.io/github/issues/xfox111/TabsAsideExtension)](https://github.com/xfox111/TabsAsideExtension/issues) +[![CI](https://github.com/XFox111/TabsAsideExtension/actions/workflows/cd_pipeline.yaml/badge.svg)](https://github.com/XFox111/TabsAsideExtension/actions/workflows/cd_pipeline.yaml) +[![GitHub repo size](https://img.shields.io/github/repo-size/xfox111/TabsAsideExtension?label=repo%20size)](https://github.com/xfox111/TabsAsideExtension) + +There are many ways in which you can participate in the project, for example: +- [Submit bugs and feature requests](https://github.com/xfox111/TabsAsideExtension/issues), and help us verify as they are checked in +- Review [source code changes](https://github.com/xfox111/TabsAsideExtension/pulls) +- Review documentation and make pull requests for anything from typos to new content + +If you are interested in fixing issues and contributing directly to the code base, please refer to the [Contribution Guidelines](https://github.com/XFox111/TabsAsideExtension/wiki/Contribution-Guidelines) + +--- + +[![Bluesky](https://img.shields.io/badge/%40xfox111.net-BSky?logo=bluesky&logoColor=%230285FF&label=Bluesky&labelColor=white&color=%230285FF)](https://bsky.app/profile/xfox111.net) +[![GitHub](https://img.shields.io/badge/%40xfox111-GitHub?logo=github&logoColor=%23181717&label=GitHub&labelColor=white&color=%23181717)](https://github.com/xfox111) +[![Buy Me a Coffee](https://img.shields.io/badge/%40xfox111-BMC?logo=buymeacoffee&logoColor=black&label=Buy%20me%20a%20coffee&labelColor=white&color=%23FFDD00)](https://buymeacoffee.com/xfox111) + +> Š2025 Eugene Fox. Licensed under [MIT license](https://github.com/XFox111/TabsAsideExtension/blob/main/LICENSE) diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..5b2b0a1 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,11 @@ +# Security Policy + +## Supported Versions +Tabs aside extension has a linear versioning system. The latest version is always the most secure one. This is applied to major versions as well. If you are using an older version, please update it to the latest one. + +We regularly run security audits and fix any security issues that are found. If you find a security issue, please report it to us as described below. + +If you are willing to continue using an older version, you can sideload it from the [releases page](https://github.com/XFox111/TabsAsideExtension/releases). Use outdated versions at your own risk. + +## Reporting a Vulnerability +You can report a security issue by clicking "Report a vulnerability" button at the top-right of this page, or by going through [this link](https://github.com/XFox111/TabsAsideExtension/security/advisories/new) diff --git a/assets/BuyMeACoffee20.tsx b/assets/BuyMeACoffee20.tsx new file mode 100644 index 0000000..4c665c8 --- /dev/null +++ b/assets/BuyMeACoffee20.tsx @@ -0,0 +1,64 @@ +import { makeStyles } from "@fluentui/react-components"; +import { FluentIcon } from "@fluentui/react-icons"; + +export const BuyMeACoffee20Regular: FluentIcon = (props) => +{ + const cls = useStyles(); + return ( + + + + + + + + + + + + + + + + + + ); +}; + +export const BuyMeACoffee20Filled: FluentIcon = (props) => +{ + const cls = useStyles(); + return ( + + + + + + + + + + + + + + + + + + + ); +}; + +const useStyles = makeStyles({ + outline: + { + fill: "currentColor" + }, + coffee: + { + fill: "#FFDD00" + } +}); diff --git a/assets/FaviconPlaceholder.svg b/assets/FaviconPlaceholder.svg new file mode 100644 index 0000000..e87674c --- /dev/null +++ b/assets/FaviconPlaceholder.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/PagePlaceholder.svg b/assets/PagePlaceholder.svg new file mode 100644 index 0000000..7ea3430 --- /dev/null +++ b/assets/PagePlaceholder.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + diff --git a/assets/global.css b/assets/global.css new file mode 100644 index 0000000..f28af09 --- /dev/null +++ b/assets/global.css @@ -0,0 +1,54 @@ +html, +body +{ + padding: 0; + margin: 0; + + -moz-user-select: none; + -webkit-user-select: none; + user-select: none; + + overflow: hidden; +} + +* +{ + margin: 0; + box-sizing: border-box; +} + +#root > .fui-FluentProvider +{ + height: 100vh; + overflow: hidden; +} + +/* width */ +::-webkit-scrollbar +{ + width: 8px; + height: 8px; +} + +/* Track */ +::-webkit-scrollbar-track +{ + background: transparent; +} + +/* Handle */ +::-webkit-scrollbar-thumb +{ + background-color: var(--colorNeutralStroke1); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover +{ + background-color: var(--colorNeutralStroke1Hover); +} + +::-webkit-scrollbar-thumb:hover:active +{ + background-color: var(--colorNeutralStroke1Pressed); +} diff --git a/components/PromptDialog.tsx b/components/PromptDialog.tsx new file mode 100644 index 0000000..656a283 --- /dev/null +++ b/components/PromptDialog.tsx @@ -0,0 +1,48 @@ +import { useDangerStyles } from "@/hooks/useDangerStyles"; +import { Button, DialogActions, DialogBody, DialogContent, DialogSurface, DialogTitle, DialogTrigger } from "@fluentui/react-components"; + +export default function PromptDialog(props: PromptDialogProps): React.ReactElement +{ + const dangerCls = useDangerStyles(); + + return ( + + + + { props.title } + + + { props.content } + + + + + + + + + + + + + + ); +} + +export type PromptDialogProps = + { + title: string; + content: React.ReactNode; + confirmText: string; + cancelText?: string; + onConfirm: () => void; + destructive?: boolean; + }; diff --git a/contexts/DialogProvider.tsx b/contexts/DialogProvider.tsx new file mode 100644 index 0000000..3b920aa --- /dev/null +++ b/contexts/DialogProvider.tsx @@ -0,0 +1,51 @@ +import { Dialog, DialogModalType } from "@fluentui/react-components"; +import { createContext, PropsWithChildren, ReactElement } from "react"; +import PromptDialog, { PromptDialogProps } from "@/components/PromptDialog"; + +const DialogContext = createContext(null!); + +export default function DialogProvider(props: PropsWithChildren): ReactElement +{ + const [dialog, setDialog] = useState(null); + const [modalType, setModalType] = useState(undefined); + const [onDismiss, setOnDismiss] = useState<(() => void) | undefined>(undefined); + + const pushPrompt = (props: PromptDialogProps): void => + setDialog( + + ); + + const pushCustom = (dialogSurface: ReactElement, modalType?: DialogModalType, onDismiss?: () => void): void => + { + setDialog(dialogSurface); + setModalType(modalType); + setOnDismiss(() => onDismiss); + }; + + const handleOpenChange = () => + { + onDismiss?.(); + setOnDismiss(undefined); + setTimeout(() => setDialog(null), 200); + }; + + return ( + + { props.children } + + { dialog && + + { dialog } + + } + + ); +} + +export const useDialog = () => useContext(DialogContext); + +export type DialogContextType = + { + pushPrompt(props: PromptDialogProps): void; + pushCustom(dialogSurface: ReactElement, modalType?: DialogModalType, onDismiss?: () => void): void; + }; diff --git a/contexts/ThemeProvider.tsx b/contexts/ThemeProvider.tsx new file mode 100644 index 0000000..480715b --- /dev/null +++ b/contexts/ThemeProvider.tsx @@ -0,0 +1,35 @@ +import { FluentProvider, Theme, webDarkTheme, webLightTheme } from "@fluentui/react-components"; +import { createContext } from "react"; + +const ThemeContext = createContext({ theme: webLightTheme, isDark: false }); +const media: MediaQueryList = window.matchMedia("(prefers-color-scheme: dark)"); + +export default function ThemeProvider(props: React.PropsWithChildren): React.ReactElement +{ + const [isDark, setIsDark] = useState(media.matches); + const theme = useMemo(() => isDark ? webDarkTheme : webLightTheme, [isDark]); + + useEffect(() => + { + const updateTheme = (args: MediaQueryListEvent) => setIsDark(args.matches); + media.addEventListener("change", updateTheme); + + return () => media.removeEventListener("change", updateTheme); + }, []); + + return ( + + + { props.children } + + + ); +} + +export const useTheme = (): ThemeContextType => useContext(ThemeContext); + +export type ThemeContextType = + { + theme: Theme; + isDark: boolean; + }; diff --git a/data/links.ts b/data/links.ts new file mode 100644 index 0000000..16042e0 --- /dev/null +++ b/data/links.ts @@ -0,0 +1,24 @@ +import Package from "@/package.json"; + +export const buyMeACoffeeLink: string = "https://buymeacoffee.com/xfox111"; +export const bskyLink: string = "https://bsky.app/profile/xfox111.net"; +export const websiteLink: string = "https://xfox111.net"; +export const v3blogPost: string = "https://at.xfox111.net/tabs-aside-3-0"; + +const githubLink = (path: string = "."): string => + new URL(path, browser.runtime.getManifest().homepage_url).href; + +export const githubLinks = +{ + repo: githubLink(), + release: githubLink(`releases/tag/v${Package.version}`), + license: githubLink("blob/main/LICENSE"), + translationGuide: githubLink("wiki/Contribution-Guidelines#contributing-to-translations") +}; + +export const storeLink: string = + import.meta.env.FIREFOX + ? "https://addons.mozilla.org/en-US/firefox/addon/ms-edge-tabs-aside/" : + chrome.runtime.getManifest().update_url?.startsWith("https://edge.microsoft.com/") ? + "https://microsoftedge.microsoft.com/addons/detail/tabs-aside/kmnblllmalkiapkfknnlpobmjjdnlhnd" : + "https://chrome.google.com/webstore/detail/mgmjbodjgijnebfgohlnjkegdbdjgin"; diff --git a/entrypoints/background.ts b/entrypoints/background.ts new file mode 100644 index 0000000..7a6176d --- /dev/null +++ b/entrypoints/background.ts @@ -0,0 +1,338 @@ +import { collectionCount, getCollections, saveCollections } from "@/features/collectionStorage"; +import { migrateStorage } from "@/features/migration"; +import { showWelcomeDialog } from "@/features/v3welcome/utils/showWelcomeDialog"; +import { SettingsValue } from "@/hooks/useSettings"; +import { CollectionItem, GraphicsStorage } from "@/models/CollectionModels"; +import getLogger from "@/utils/getLogger"; +import { onMessage, sendMessage } from "@/utils/messaging"; +import saveTabsToCollection from "@/utils/saveTabsToCollection"; +import sendNotification from "@/utils/sendNotification"; +import { settings } from "@/utils/settings"; +import watchTabSelection from "@/utils/watchTabSelection"; +import { Tabs, Windows } from "wxt/browser"; +import { Unwatch } from "wxt/storage"; + +export default defineBackground(() => +{ + try + { + const logger = getLogger("background"); + const graphicsCache: GraphicsStorage = {}; + let listLocation: SettingsValue<"listLocation"> = "sidebar"; + + logger("Background script started"); + + // Little workaround for opening side panel + // See: https://stackoverflow.com/questions/77213045/error-sidepanel-open-may-only-be-called-in-response-to-a-user-gesture-re + settings.listLocation.getValue().then(location => listLocation = location); + settings.listLocation.watch(newLocation => listLocation = newLocation); + + browser.runtime.onInstalled.addListener(async ({ reason, previousVersion }) => + { + logger("onInstalled", reason, previousVersion); + + const previousMajor: number = previousVersion ? parseInt(previousVersion.split(".")[0]) : 0; + + if (reason === "update" && previousMajor < 3) + { + await migrateStorage(); + await showWelcomeDialog.setValue(true); + browser.runtime.reload(); + } + }); + + browser.tabs.onUpdated.addListener((_, __, tab) => + { + if (!tab.url) + return; + + graphicsCache[tab.url] = { + preview: graphicsCache[tab.url]?.preview, + icon: tab.favIconUrl ?? graphicsCache[tab.url]?.icon + }; + }); + + browser.commands.onCommand.addListener( + (command, tab) => performContextAction(command, tab!.windowId!) + ); + + onMessage("getGraphicsCache", () => graphicsCache); + onMessage("addThumbnail", ({ data }) => + { + graphicsCache[data.url] = { + preview: data.thumbnail, + icon: graphicsCache[data.url]?.icon + }; + }); + + setupContextMenu(); + async function setupContextMenu(): Promise + { + await browser.contextMenus.removeAll(); + + const items: Record = + { + "show_collections": i18n.t("actions.show_collections"), + "set_aside": i18n.t("actions.set_aside.all"), + "save": i18n.t("actions.save.all") + }; + + Object.entries(items).forEach(([id, title]) => browser.contextMenus.create({ + id, title, + visible: true, + contexts: ["action", "page"] + })); + + watchTabSelection(async selection => + { + await browser.contextMenus.update("set_aside", { + title: i18n.t(`actions.set_aside.${selection}`) + }); + await browser.contextMenus.update("save", { + title: i18n.t(`actions.save.${selection}`) + }); + }); + + browser.contextMenus.onClicked.addListener( + ({ menuItemId }, tab) => performContextAction((menuItemId as string), tab!.windowId!) + ); + } + + setupBadge(); + async function setupBadge(): Promise + { + let unwatchBadge: Unwatch | null = null; + const updateBadge = async (count: number | null) => + await browser.action.setBadgeText({ text: count && count > 0 ? count.toString() : "" }); + + if (await settings.showBadge.getValue()) + { + updateBadge(await collectionCount.getValue()); + unwatchBadge = collectionCount.watch(updateBadge); + } + + if (import.meta.env.FIREFOX) + { + await browser.action.setBadgeBackgroundColor({ color: "0f6cbd" }); + await browser.action.setBadgeTextColor({ color: "white" }); + } + + settings.showBadge.watch(async showBadge => + { + if (showBadge) + { + updateBadge(await collectionCount.getValue()); + unwatchBadge = collectionCount.watch(updateBadge); + } + else + { + unwatchBadge?.(); + await browser.action.setBadgeText({ text: "" }); + } + }); + } + + setupActionButton(); + async function setupActionButton(): Promise + { + let unwatchActionTitle: Unwatch | null = null; + + const onClickAction = async (): Promise => + { + logger("action.onClicked"); + const defaultAction = await settings.defaultSaveAction.getValue(); + await saveTabs(defaultAction === "set_aside"); + }; + + const updateTitle = async (selection: "all" | "selected"): Promise => + { + const defaultAction = await settings.defaultSaveAction.getValue(); + await browser.action.setTitle({ title: i18n.t(`actions.${defaultAction}.${selection}`) }); + }; + + const updateButton = async (action: SettingsValue<"contextAction">): Promise => + { + logger("updateButton", action); + + // Cleanup any existing behavior + browser.action.onClicked.removeListener(onClickAction); + browser.action.onClicked.removeListener(browser?.sidebarAction?.toggle); + browser.action.onClicked.removeListener(openCollectionsInTab); + + await browser.action.disable(); + await browser.action.setTitle({ title: i18n.t("manifest.name") }); + unwatchActionTitle?.(); + + if (!import.meta.env.FIREFOX) + await chrome.sidePanel.setPanelBehavior({ openPanelOnActionClick: false }); + + // Setup new behavior + if (action === "action") + { + browser.action.onClicked.addListener(onClickAction); + unwatchActionTitle = watchTabSelection(updateTitle); + await browser.action.enable(); + } + else if (action === "open") + { + await browser.action.enable(); + const location = await settings.listLocation.getValue(); + + if (location === "sidebar") + { + if (import.meta.env.FIREFOX) + browser.action.onClicked.addListener(browser.sidebarAction.toggle); + else + chrome.sidePanel.setPanelBehavior({ openPanelOnActionClick: true }); + } + else if (location !== "popup") + browser.action.onClicked.addListener(openCollectionsInTab); + } + }; + + updateButton(await settings.contextAction.getValue()); + settings.contextAction.watch(updateButton); + settings.listLocation.watch(async () => updateButton(await settings.contextAction.getValue())); + } + + setupCollectionView(); + async function setupCollectionView(): Promise + { + const enforcePinnedTab = async (info: Tabs.OnHighlightedHighlightInfoType): Promise => + { + logger("enforcePinnedTab", info); + + const activeWindow: Windows.Window = await browser.windows.getCurrent({ populate: true }); + + if (activeWindow.incognito) + return; + + if (!activeWindow.tabs!.some(tab => + [tab.url, tab.pendingUrl].includes(browser.runtime.getURL("/sidepanel.html"))) + ) + await browser.tabs.create({ + url: browser.runtime.getURL("/sidepanel.html"), + windowId: activeWindow.id, + active: false, + pinned: true + }); + }; + + const updateView = async (viewLocation: SettingsValue<"listLocation">): Promise => + { + logger("updateView", viewLocation); + + browser.tabs.onHighlighted.removeListener(enforcePinnedTab); + const tabs: Tabs.Tab[] = await browser.tabs.query({ + currentWindow: true, + url: browser.runtime.getURL("/sidepanel.html") + }); + await browser.tabs.remove(tabs.map(tab => tab.id!)); + + await browser.action.setPopup({ + popup: viewLocation === "popup" ? browser.runtime.getURL("/popup.html") : "" + }); + + if (import.meta.env.FIREFOX) + await browser.sidebarAction.setPanel({ + panel: viewLocation === "sidebar" ? browser.runtime.getURL("/sidepanel.html") : "" + }); + else + await chrome.sidePanel.setOptions({ enabled: viewLocation === "sidebar" }); + + if (viewLocation === "pinned") + { + await browser.tabs.create({ + url: browser.runtime.getURL("/sidepanel.html"), + active: false, + pinned: true + }); + browser.tabs.onHighlighted.addListener(enforcePinnedTab); + } + }; + + updateView(await settings.listLocation.getValue()); + settings.listLocation.watch(updateView); + } + + function performContextAction(action: string, windowId: number): void + { + if (action === "show_collections") + { + if (listLocation === "sidebar" || listLocation === "popup") + openCollectionsInView(listLocation, windowId); + else + openCollectionsInTab(); + } + else + saveTabs(action === "set_aside"); + } + + function openCollectionsInView(view: "sidebar" | "popup", windowId: number): void + { + if (view === "sidebar") + { + if (import.meta.env.FIREFOX) + browser.sidebarAction.open(); + else + chrome.sidePanel.open({ windowId }); + } + else + browser.action.openPopup(); + } + + async function openCollectionsInTab(): Promise + { + logger("openCollectionsInTab"); + + const currentWindow: Windows.Window = await browser.windows.getCurrent({ populate: true }); + + if (currentWindow.incognito) + { + await browser.windows.create({ + url: browser.runtime.getURL("/sidepanel.html"), + focused: true + }); + } + else + { + const collectionTab: Tabs.Tab | undefined = currentWindow.tabs!.find( + tab => tab.url === browser.runtime.getURL("/sidepanel.html") + ); + + if (collectionTab) + await browser.tabs.update(collectionTab.id, { active: true }); + else + await browser.tabs.create({ + url: browser.runtime.getURL("/sidepanel.html"), + active: true, + windowId: currentWindow.id + }); + } + } + + async function saveTabs(closeAfterSave: boolean): Promise + { + logger("saveTabs", closeAfterSave); + + const collection: CollectionItem = await saveTabsToCollection(closeAfterSave); + const [savedCollections, cloudIssue] = await getCollections(); + const newList = [collection, ...savedCollections]; + + await saveCollections(newList, cloudIssue === null, graphicsCache); + + sendMessage("refreshCollections", undefined); + + if (await settings.notifyOnSave.getValue()) + await sendNotification({ + title: i18n.t("notifications.tabs_saved.title"), + message: i18n.t("notifications.tabs_saved.message"), + icon: "/notification_icons/cloud_checkmark.png" + }); + } + } + catch (ex) + { + console.error(ex); + } +}); diff --git a/entrypoints/content.ts b/entrypoints/content.ts new file mode 100644 index 0000000..3145970 --- /dev/null +++ b/entrypoints/content.ts @@ -0,0 +1,46 @@ +import getLogger from "@/utils/getLogger"; +import { sendMessage } from "@/utils/messaging"; + +// This content script is injected into each browser tab. +// It's purpose is to retrive an OpenGraph thumbnail URL from the metadata + +export default defineContentScript({ + matches: [""], + runAt: "document_idle", + main +}); + +const logger = getLogger("contentScript"); + +async function main(): Promise +{ + logger("init"); + + // This method tries to sequentially retrieve thumbnails from all know meta tags. + // It stops on the first thumbnail found. + + // The order of search is: + // 1. + // 2. + // 3. + // 4. + + const thumbnailUrl: string | undefined = + document.querySelector("head meta[property='og:image']")?.content ?? + document.querySelector("head meta[name='twitter:image']")?.content ?? + document.querySelector("head link[rel=thumbnail]")?.href ?? + document.querySelector("head link[rel=image_src]")?.href; + + if (thumbnailUrl) + { + logger(`Found thumbnail for "${document.location.href}"`, thumbnailUrl); + await sendMessage("addThumbnail", { + url: document.location.href, + thumbnail: thumbnailUrl + }); + } + else + logger(`No thumbnail found for "${document.location.href}"`); + + logger("done"); +} diff --git a/entrypoints/options/hooks/useOptionsStyles.ts b/entrypoints/options/hooks/useOptionsStyles.ts new file mode 100644 index 0000000..6c00652 --- /dev/null +++ b/entrypoints/options/hooks/useOptionsStyles.ts @@ -0,0 +1,38 @@ +import { makeStyles, tokens } from "@fluentui/react-components"; + +export const useOptionsStyles = makeStyles({ + main: + { + display: "grid", + gridTemplateRows: "auto 1fr", + height: "100%" + }, + tabList: + { + flexWrap: "wrap" + }, + article: + { + display: "flex", + flexFlow: "column", + gap: tokens.spacingVerticalMNudge, + padding: `${tokens.spacingVerticalS} ${tokens.spacingHorizontalM}`, + overflowY: "auto" + }, + section: + { + display: "flex", + flexFlow: "column", + alignItems: "flex-start" + }, + buttonFix: + { + minHeight: "32px" + }, + horizontalButtons: + { + display: "flex", + flexWrap: "wrap", + gap: tokens.spacingHorizontalS + } +}); diff --git a/entrypoints/options/index.html b/entrypoints/options/index.html new file mode 100644 index 0000000..423ea30 --- /dev/null +++ b/entrypoints/options/index.html @@ -0,0 +1,24 @@ + + + + + + + Tabs aside | Settings + + + + + + + +
+ + + + diff --git a/entrypoints/options/layouts/AboutSection.tsx b/entrypoints/options/layouts/AboutSection.tsx new file mode 100644 index 0000000..4153502 --- /dev/null +++ b/entrypoints/options/layouts/AboutSection.tsx @@ -0,0 +1,58 @@ +import { BuyMeACoffee20Regular } from "@/assets/BuyMeACoffee20"; +import { bskyLink, buyMeACoffeeLink, githubLinks, storeLink, websiteLink } from "@/data/links"; +import { useBmcStyles } from "@/hooks/useBmcStyles"; +import extLink from "@/utils/extLink"; +import { Body1, Button, Caption1, Link, Subtitle1, Text } from "@fluentui/react-components"; +import { PersonFeedback20Regular } from "@fluentui/react-icons"; +import { useOptionsStyles } from "../hooks/useOptionsStyles"; +import Package from "@/package.json"; + +export default function AboutSection(): React.ReactElement +{ + const cls = useOptionsStyles(); + const bmcCls = useBmcStyles(); + + return ( + <> + + { i18n.t("manifest.name") } + v{ Package.version } + + + + { i18n.t("options_page.about.developed_by") } (@xfox111.net)
+ { i18n.t("options_page.about.licensed_under") } { i18n.t("options_page.about.mit_license") } +
+ + + { i18n.t("options_page.about.translation_cta.text") }
+ + { i18n.t("options_page.about.translation_cta.button") } + +
+ + + { i18n.t("options_page.about.links.website") }
+ { i18n.t("options_page.about.links.source") }
+ { i18n.t("options_page.about.links.changelog") } +
+ +
+ + +
+ + ); +} diff --git a/entrypoints/options/layouts/ActionsSection.tsx b/entrypoints/options/layouts/ActionsSection.tsx new file mode 100644 index 0000000..dcc6832 --- /dev/null +++ b/entrypoints/options/layouts/ActionsSection.tsx @@ -0,0 +1,55 @@ +import useSettings, { SettingsValue } from "@/hooks/useSettings"; +import { Dropdown, Field, Option } from "@fluentui/react-components"; + +export default function ActionsSection(): React.ReactElement +{ + const [saveAction, setSaveAction] = useSettings("defaultSaveAction"); + const [restoreAction, setRestoreAction] = useSettings("defaultRestoreAction"); + + return ( + <> + + setSaveAction(e.optionValue as SaveActionType) } + > + { Object.entries(saveActionOptions).map(([value, label]) => + + ) } + + + + + setRestoreAction(e.optionValue as RestoreActionType) } + > + { Object.entries(restoreActionOptions).map(([value, label]) => + + ) } + + + + ); +} + +type SaveActionType = SettingsValue<"defaultSaveAction">; +type RestoreActionType = SettingsValue<"defaultRestoreAction">; + +const restoreActionOptions: Record = +{ + "open": i18n.t("options_page.actions.options.restore_actions.options.open"), + "restore": i18n.t("options_page.actions.options.restore_actions.options.restore") +}; + +const saveActionOptions: Record = +{ + "set_aside": i18n.t("options_page.actions.options.save_actions.options.set_aside"), + "save": i18n.t("options_page.actions.options.save_actions.options.save") +}; diff --git a/entrypoints/options/layouts/GeneralSection.tsx b/entrypoints/options/layouts/GeneralSection.tsx new file mode 100644 index 0000000..0c47a83 --- /dev/null +++ b/entrypoints/options/layouts/GeneralSection.tsx @@ -0,0 +1,118 @@ +import useSettings, { SettingsValue } from "@/hooks/useSettings"; +import { Button, Checkbox, Dropdown, Field, Option, OptionOnSelectData } from "@fluentui/react-components"; +import { KeyCommand20Regular } from "@fluentui/react-icons"; +import { useOptionsStyles } from "../hooks/useOptionsStyles"; + +export default function GeneralSection(): React.ReactElement +{ + const [alwaysShowToolbars, setAlwaysShowToolbars] = useSettings("alwaysShowToolbars"); + const [ignorePinned, setIgnorePinned] = useSettings("ignorePinned"); + const [deletePrompt, setDeletePrompt] = useSettings("deletePrompt"); + const [showBadge, setShowBadge] = useSettings("showBadge"); + const [notifyOnSave, setNotifyOnSave] = useSettings("notifyOnSave"); + const [dismissOnLoad, setDismissOnLoad] = useSettings("dismissOnLoad"); + const [listLocation, setListLocation] = useSettings("listLocation"); + const [contextAction, setContextAction] = useSettings("contextAction"); + + const cls = useOptionsStyles(); + + const openShortcutsPage = (): Promise => + browser.tabs.create({ + url: "chrome://extensions/shortcuts", + active: true + }); + + const handleListLocationChange = (_: any, e: OptionOnSelectData): void => + { + if (e.optionValue === "popup" && contextAction !== "open") + setContextAction("open"); + + setListLocation(e.optionValue as ListLocationType); + }; + + return ( + <> +
+ setAlwaysShowToolbars(e.checked as boolean) } /> + setIgnorePinned(!e.checked) } /> + setDeletePrompt(e.checked as boolean) } /> + setShowBadge(e.checked as boolean) } /> + setNotifyOnSave(e.checked as boolean) } /> + setDismissOnLoad(e.checked as boolean) } /> +
+ + + + { Object.entries(listLocationOptions).map(([key, value]) => + + ) } + + + + + setContextAction(e.optionValue as ContextActionType) } + disabled={ listLocation === "popup" } + > + { Object.entries(contextActionOptions).map(([key, value]) => + key === "context" && import.meta.env.FIREFOX + ? <> : + + ) } + + + + { !import.meta.env.FIREFOX && + + } + + ); +} + +type ListLocationType = SettingsValue<"listLocation">; +type ContextActionType = SettingsValue<"contextAction">; + +const listLocationOptions: Record = +{ + "sidebar": i18n.t("options_page.general.options.list_locations.options.sidebar"), + "popup": i18n.t("options_page.general.options.list_locations.options.popup"), + "tab": i18n.t("options_page.general.options.list_locations.options.tab"), + "pinned": i18n.t("options_page.general.options.list_locations.options.pinned") +}; + +const contextActionOptions: Record = +{ + "action": i18n.t("options_page.general.options.icon_action.options.action"), + "context": i18n.t("options_page.general.options.icon_action.options.context"), + "open": i18n.t("options_page.general.options.icon_action.options.open") +}; diff --git a/entrypoints/options/layouts/StorageSection.tsx b/entrypoints/options/layouts/StorageSection.tsx new file mode 100644 index 0000000..d212be4 --- /dev/null +++ b/entrypoints/options/layouts/StorageSection.tsx @@ -0,0 +1,64 @@ +import { useDialog } from "@/contexts/DialogProvider"; +import useStorageInfo from "@/hooks/useStorageInfo"; +import { Button, Field, MessageBar, MessageBarBody, MessageBarTitle, ProgressBar } from "@fluentui/react-components"; +import { ArrowDownload20Regular, ArrowUpload20Regular } from "@fluentui/react-icons"; +import { useOptionsStyles } from "../hooks/useOptionsStyles"; +import exportData from "../utils/exportData"; +import importData from "../utils/importData"; + +export default function StorageSection(): React.ReactElement +{ + const { bytesInUse, storageQuota, usedStorageRatio } = useStorageInfo(); + const [importResult, setImportResult] = useState(null); + + const dialog = useDialog(); + const cls = useOptionsStyles(); + + const handleImport = (): void => + dialog.pushPrompt({ + title: i18n.t("options_page.storage.import_prompt.title"), + confirmText: i18n.t("options_page.storage.import_prompt.proceed"), + onConfirm: () => importData().then(setImportResult), + content: ( + + + { i18n.t("options_page.storage.import_prompt.warning_title") } + + { i18n.t("options_page.storage.import_prompt.warning_text") } + + + ) + }); + + return ( + <> + = 0.8 ? "error" : undefined } + > + + + +
+ + +
+ + { importResult !== null && + + + { importResult === true ? + i18n.t("options_page.storage.import_results.success") : + i18n.t("options_page.storage.import_results.error") + } + + + } + + ); +} diff --git a/entrypoints/options/main.tsx b/entrypoints/options/main.tsx new file mode 100644 index 0000000..8e70ff6 --- /dev/null +++ b/entrypoints/options/main.tsx @@ -0,0 +1,45 @@ +import App from "@/App.tsx"; +import "@/assets/global.css"; +import { Tab, TabList } from "@fluentui/react-components"; +import ReactDOM from "react-dom/client"; +import { useOptionsStyles } from "./hooks/useOptionsStyles.ts"; +import AboutSection from "./layouts/AboutSection.tsx"; +import ActionsSection from "./layouts/ActionsSection.tsx"; +import GeneralSection from "./layouts/GeneralSection.tsx"; +import StorageSection from "./layouts/StorageSection.tsx"; + +ReactDOM.createRoot(document.getElementById("root")!).render( + + + +); + +function OptionsPage(): React.ReactElement +{ + const [selection, setSelection] = useState("general"); + const cls = useOptionsStyles(); + + return ( +
+ setSelection(data.value as SelectionType) } + > + { i18n.t("options_page.general.title") } + { i18n.t("options_page.actions.title") } + { i18n.t("options_page.storage.title") } + { i18n.t("options_page.about.title") } + + +
+ { selection === "general" && } + { selection === "actions" && } + { selection === "storage" && } + { selection === "about" && } +
+
+ ); +} + +type SelectionType = "general" | "actions" | "storage" | "about"; diff --git a/entrypoints/options/utils/exportData.ts b/entrypoints/options/utils/exportData.ts new file mode 100644 index 0000000..4c82168 --- /dev/null +++ b/entrypoints/options/utils/exportData.ts @@ -0,0 +1,16 @@ +export default async function exportData(): Promise +{ + const data: string = JSON.stringify({ + local: await browser.storage.local.get(null), + sync: await browser.storage.sync.get(null) + }); + + const element: HTMLAnchorElement = document.createElement("a"); + element.style.display = "none"; + element.href = `data:application/json;charset=utf-8,${data}`; + element.setAttribute("download", "tabs-aside_data.json"); + + document.body.appendChild(element); + element.click(); + document.body.removeChild(element); +}; diff --git a/entrypoints/options/utils/importData.ts b/entrypoints/options/utils/importData.ts new file mode 100644 index 0000000..3d66d35 --- /dev/null +++ b/entrypoints/options/utils/importData.ts @@ -0,0 +1,51 @@ +import { sendMessage } from "@/utils/messaging"; + +export default async function importData(): Promise +{ + const element: HTMLInputElement = document.createElement("input"); + element.style.display = "none"; + element.hidden = true; + element.type = "file"; + element.accept = ".json"; + + document.body.appendChild(element); + element.click(); + + await new Promise(resolve => + { + const listener = () => + { + element.removeEventListener("input", listener); + resolve(null); + }; + element.addEventListener("input", listener); + }); + + if (!element.files || element.files.length < 1) + return null; + + const file: File = element.files[0]; + const content: string = await file.text(); + + document.body.removeChild(element); + + try + { + const data: any = JSON.parse(content); + + if (data.local) + await browser.storage.local.set(data.local); + + if (data.sync) + await browser.storage.sync.set(data.sync); + } + catch (error) + { + console.error("Failed to parse JSON", error); + return false; + } + + sendMessage("refreshCollections", undefined); + + return true; +} diff --git a/entrypoints/popup.html b/entrypoints/popup.html new file mode 100644 index 0000000..4318975 --- /dev/null +++ b/entrypoints/popup.html @@ -0,0 +1,22 @@ + + + + + + + Tabs aside + + + + +
+ + + + diff --git a/entrypoints/sidepanel/components/CollectionView.styles.ts b/entrypoints/sidepanel/components/CollectionView.styles.ts new file mode 100644 index 0000000..6f666c7 --- /dev/null +++ b/entrypoints/sidepanel/components/CollectionView.styles.ts @@ -0,0 +1,101 @@ +import { makeStyles, tokens } from "@fluentui/react-components"; + +export const useStyles_CollectionView = makeStyles({ + root: + { + backgroundColor: tokens.colorNeutralBackground1, + border: `${tokens.strokeWidthThin} solid ${tokens.colorNeutralStroke1}`, + borderRadius: tokens.borderRadiusLarge, + display: "flex", + flexFlow: "column", + + "--border": tokens.colorNeutralForeground1, + + "&:hover .CollectionView__toolbar, &:focus-within .CollectionView__toolbar": + { + display: "flex" + }, + + "&:hover": + { + boxShadow: tokens.shadow4 + } + }, + color: + { + border: `${tokens.strokeWidthThick} solid var(--border)` + }, + verticalRoot: + { + height: "560px" + }, + empty: + { + display: "flex", + flexFlow: "column", + flexGrow: 1, + margin: `${tokens.spacingVerticalNone} ${tokens.spacingHorizontalSNudge}`, + marginBottom: tokens.spacingVerticalSNudge, + alignItems: "center", + justifyContent: "center", + gap: tokens.spacingVerticalS, + padding: `${tokens.spacingVerticalXL} ${tokens.spacingHorizontalL}`, + color: tokens.colorNeutralForeground3, + height: "144px" + }, + emptyText: + { + display: "flex", + flexFlow: "column", + alignItems: "center", + gap: tokens.spacingVerticalXS + }, + emptyCaption: + { + display: "flex", + flexWrap: "wrap", + alignItems: "center", + justifyContent: "center", + columnGap: tokens.spacingHorizontalXS + }, + list: + { + display: "grid", + padding: `${tokens.spacingVerticalXS} ${tokens.spacingHorizontalS}`, + columnGap: tokens.spacingHorizontalS, + rowGap: tokens.spacingHorizontalSNudge, + overflowX: "auto", + alignItems: "flex-end", + alignSelf: "flex-start", + maxWidth: "100%", + gridAutoFlow: "column" + }, + verticalList: + { + gridAutoFlow: "row", + width: "100%", + paddingBottom: tokens.spacingVerticalS + }, + dragOverlay: + { + cursor: "grabbing !important", + transform: "scale(1.05)", + boxShadow: `${tokens.shadow16} !important`, + "& > div": + { + pointerEvents: "none" + } + }, + sorting: + { + pointerEvents: "none" + }, + dragging: + { + visibility: "hidden" + }, + draggingOver: + { + backgroundColor: tokens.colorBrandBackground2 + } +}); diff --git a/entrypoints/sidepanel/components/CollectionView.tsx b/entrypoints/sidepanel/components/CollectionView.tsx new file mode 100644 index 0000000..77ef360 --- /dev/null +++ b/entrypoints/sidepanel/components/CollectionView.tsx @@ -0,0 +1,84 @@ +import CollectionHeader from "@/entrypoints/sidepanel/components/collections/CollectionHeader"; +import useDndItem from "@/entrypoints/sidepanel/hooks/useDndItem"; +import { useGroupColors } from "@/hooks/useGroupColors"; +import { CollectionItem } from "@/models/CollectionModels"; +import { horizontalListSortingStrategy, SortableContext, verticalListSortingStrategy } from "@dnd-kit/sortable"; +import { Body1Strong, mergeClasses } from "@fluentui/react-components"; +import { CollectionsRegular } from "@fluentui/react-icons"; +import { ReactElement } from "react"; +import CollectionContext from "../contexts/CollectionContext"; +import { useCollections } from "../contexts/CollectionsProvider"; +import { useStyles_CollectionView } from "./CollectionView.styles"; +import GroupView from "./GroupView"; +import TabView from "./TabView"; + +export default function CollectionView({ collection, index: collectionIndex, dragOverlay }: CollectionViewProps): ReactElement +{ + const { tilesView } = useCollections(); + const { + setNodeRef, + nodeProps, + setActivatorNodeRef, + activatorProps, + activeItem, isCurrentlySorting, isBeingDragged, isActiveOverThis: isOver + } = useDndItem({ id: collectionIndex.toString(), data: { indices: [collectionIndex], item: collection } }); + + const isActiveOverThis: boolean = isOver && activeItem?.item.type !== "collection"; + + const tabCount: number = useMemo(() => collection.items.flatMap(i => i.type === "group" ? i.items : i).length, [collection.items]); + const hasPinnedGroup: boolean = useMemo(() => collection.items.length > 0 && + (collection.items[0].type === "group" && collection.items[0].pinned === true), [collection.items]); + + const cls = useStyles_CollectionView(); + const colorCls = useGroupColors(); + + return ( + +
+ + + + { collection.items.length < 1 ? +
+ + { i18n.t("collections.empty") } +
+ : +
+ [collectionIndex, index].join("/")) } + strategy={ tilesView ? horizontalListSortingStrategy : verticalListSortingStrategy } + > + { collection.items.map((i, index) => + i.type === "group" ? + + : + + ) } + +
+ } +
+
+ ); +} + +export type CollectionViewProps = + { + collection: CollectionItem; + index: number; + dragOverlay?: boolean; + }; diff --git a/entrypoints/sidepanel/components/EditDialog.styles.tsx b/entrypoints/sidepanel/components/EditDialog.styles.tsx new file mode 100644 index 0000000..051efef --- /dev/null +++ b/entrypoints/sidepanel/components/EditDialog.styles.tsx @@ -0,0 +1,40 @@ +import { makeStyles, shorthands, tokens } from "@fluentui/react-components"; + +export const useStyles_EditDialog = makeStyles({ + surface: + { + "--border": tokens.colorTransparentStroke, + ...shorthands.borderWidth(tokens.strokeWidthThick), + ...shorthands.borderColor("var(--border)") + }, + content: + { + display: "flex", + flexFlow: "column", + gap: tokens.spacingVerticalS + }, + colorPicker: + { + display: "flex", + flexWrap: "wrap", + rowGap: tokens.spacingVerticalS, + columnGap: tokens.spacingVerticalS + }, + colorButton: + { + "&[aria-pressed=true]": + { + color: "var(--text) !important", + backgroundColor: "var(--border) !important", + + "& .fui-Button__icon": + { + color: "var(--text)" + } + } + }, + colorButton_icon: + { + color: "var(--border)" + } +}); diff --git a/entrypoints/sidepanel/components/EditDialog.tsx b/entrypoints/sidepanel/components/EditDialog.tsx new file mode 100644 index 0000000..86a99b3 --- /dev/null +++ b/entrypoints/sidepanel/components/EditDialog.tsx @@ -0,0 +1,142 @@ +import { getCollectionTitle } from "@/entrypoints/sidepanel/utils/getCollectionTitle"; +import { useGroupColors } from "@/hooks/useGroupColors"; +import { CollectionItem, GroupItem } from "@/models/CollectionModels"; +import * as fui from "@fluentui/react-components"; +import { Circle20Filled, CircleOff20Regular, Pin20Filled, Rename20Regular } from "@fluentui/react-icons"; +import { ReactElement } from "react"; +import { useStyles_EditDialog } from "./EditDialog.styles"; + +export default function EditDialog(props: GroupEditDialogProps): ReactElement +{ + const [title, setTitle] = useState( + (props.type === "collection" + ? props.collection?.title : + (props.group?.pinned !== true ? props.group?.title : "")) + ?? "" + ); + + const [color, setColor] = useState( + props.type === "collection" + ? props.collection?.color : + props.group?.pinned === true ? "pinned" : (props.group?.color ?? "blue") + ); + + const cls = useStyles_EditDialog(); + const colorCls = useGroupColors(); + + const handleSave = () => + { + if (props.type === "collection") + props.onSave({ + type: "collection", + timestamp: props.collection?.timestamp ?? Date.now(), + color: (color === "pinned") ? undefined : color!, + title, + items: props.collection?.items ?? [] + }); + else if (color === "pinned") + props.onSave({ + type: "group", + pinned: true, + items: props.group?.items ?? [] + }); + else + props.onSave({ + type: "group", + pinned: false, + color: color!, + title, + items: props.group?.items ?? [] + }); + }; + + return ( + + + + { + props.type === "collection" ? + i18n.t(`dialogs.edit.title.${props.collection ? "edit" : "new"}_collection`) : + i18n.t(`dialogs.edit.title.${props.group ? "edit" : "new"}_group`) + } + + + +
+ + } + disabled={ color === "pinned" } + placeholder={ + props.type === "collection" ? getCollectionTitle(props.collection) : "" + } + value={ color === "pinned" ? i18n.t("groups.pinned") : title } + onChange={ (_, e) => setTitle(e.value) } /> + + +
+ { (props.type === "group" && (!props.hidePinned || props.group?.pinned)) && + setColor("pinned") } + icon={ } + shape="circular" + > + { i18n.t("groups.pinned") } + + } + { props.type === "collection" && + setColor(undefined) } + icon={ } + shape="circular" + > + { i18n.t("colors.none") } + + } + { Object.keys(colorCls).map(i => + setColor(i as chrome.tabGroups.ColorEnum) } + className={ fui.mergeClasses(cls.colorButton, colorCls[i as chrome.tabGroups.ColorEnum]) } + icon={ { + className: cls.colorButton_icon, + children: + } } + key={ i } + shape="circular" + > + { i18n.t(`colors.${i as chrome.tabGroups.ColorEnum}`) } + + ) } +
+
+
+
+ + + + { i18n.t("common.actions.save") } + + + { i18n.t("common.actions.cancel") } + + +
+
+ ); +} + +export type GroupEditDialogProps = + { + type: "collection"; + collection?: CollectionItem; + onSave: (item: CollectionItem) => void; + } | + { + type: "group"; + hidePinned?: boolean; + group?: GroupItem; + onSave: (item: GroupItem) => void; + }; diff --git a/entrypoints/sidepanel/components/GroupView.styles.ts b/entrypoints/sidepanel/components/GroupView.styles.ts new file mode 100644 index 0000000..0dcaaea --- /dev/null +++ b/entrypoints/sidepanel/components/GroupView.styles.ts @@ -0,0 +1,148 @@ +import { makeStyles, tokens } from "@fluentui/react-components"; + +export const useStyles_GroupView = makeStyles({ + root: + { + display: "flex", + flexFlow: "column", + alignSelf: "normal", + + padding: `${tokens.spacingVerticalSNudge} ${tokens.spacingHorizontalS}`, + paddingBottom: tokens.spacingVerticalNone, + borderRadius: tokens.borderRadiusLarge, + + "&:hover .GroupView-toolbar, &:focus-within .GroupView-toolbar": + { + visibility: "visible" + }, + + "&:hover": + { + backgroundColor: tokens.colorNeutralBackground1Hover + } + }, + header: + { + display: "flex", + justifyContent: "space-between", + alignItems: "flex-end", + gap: tokens.spacingHorizontalM, + + borderBottom: `${tokens.strokeWidthThick} solid var(--border)`, + borderBottomLeftRadius: tokens.borderRadiusLarge + }, + verticalHeader: + { + borderBottomLeftRadius: tokens.borderRadiusNone + }, + title: + { + display: "grid", + gridAutoFlow: "column", + alignItems: "center", + minHeight: "12px", + minWidth: "24px", + gap: tokens.spacingHorizontalXS, + width: "max-content", + maxWidth: "160px", + + padding: `${tokens.spacingVerticalXXS} ${tokens.spacingHorizontalS}`, + paddingBottom: tokens.spacingVerticalXS, + marginBottom: "-2px", + + border: `${tokens.strokeWidthThick} solid var(--border)`, + borderRadius: `${tokens.borderRadiusLarge} ${tokens.borderRadiusLarge} ${tokens.borderRadiusNone} ${tokens.borderRadiusLarge}`, + borderBottom: "none", + backgroundColor: "var(--border)", + color: "var(--text)" + }, + verticalTitle: + { + borderBottomLeftRadius: tokens.borderRadiusNone + }, + pinned: + { + backgroundColor: "transparent" + }, + toolbar: + { + display: "flex", + gap: tokens.spacingHorizontalS, + visibility: "hidden", + + "@media (pointer: coarse)": + { + visibility: "visible" + } + }, + showToolbar: + { + visibility: "visible" + }, + openAllLink: + { + whiteSpace: "nowrap" + }, + empty: + { + display: "flex", + flexFlow: "column", + alignItems: "center", + justifyContent: "center", + color: tokens.colorNeutralForeground3, + minWidth: "160px", + height: "120px", + marginBottom: tokens.spacingVerticalSNudge + }, + verticalEmpty: + { + height: "auto", + padding: `${tokens.spacingVerticalS} ${tokens.spacingHorizontalM}` + }, + list: + { + display: "flex", + columnGap: tokens.spacingHorizontalS, + rowGap: tokens.spacingHorizontalSNudge, + height: "100%" + }, + verticalList: + { + flexFlow: "column" + }, + listContainer: + { + padding: `${tokens.spacingVerticalS} ${tokens.spacingHorizontalXS}`, + paddingBottom: tokens.spacingVerticalNone, + height: "100%" + }, + verticalListContainer: + { + borderLeft: `${tokens.strokeWidthThick} solid var(--border)`, + padding: tokens.spacingVerticalSNudge, + marginBottom: tokens.spacingVerticalSNudge, + borderTopLeftRadius: tokens.borderRadiusNone, + borderBottomLeftRadius: tokens.borderRadiusNone, + borderTop: "none" + }, + pinnedColor: + { + "--border": tokens.colorNeutralStrokeAccessible, + "--text": tokens.colorNeutralForeground1 + }, + dragOverlay: + { + backgroundColor: tokens.colorNeutralBackground1Hover, + transform: "scale(1.05)", + cursor: "grabbing !important", + boxShadow: `${tokens.shadow16} !important`, + "& > div": + { + pointerEvents: "none" + } + }, + dragging: + { + visibility: "hidden" + } +}); diff --git a/entrypoints/sidepanel/components/GroupView.tsx b/entrypoints/sidepanel/components/GroupView.tsx new file mode 100644 index 0000000..f4962ab --- /dev/null +++ b/entrypoints/sidepanel/components/GroupView.tsx @@ -0,0 +1,114 @@ +import GroupContext from "@/entrypoints/sidepanel/contexts/GroupContext"; +import useDndItem from "@/entrypoints/sidepanel/hooks/useDndItem"; +import { openGroup } from "@/entrypoints/sidepanel/utils/opener"; +import { useGroupColors } from "@/hooks/useGroupColors"; +import useSettings from "@/hooks/useSettings"; +import { GroupItem } from "@/models/CollectionModels"; +import { horizontalListSortingStrategy, SortableContext, verticalListSortingStrategy } from "@dnd-kit/sortable"; +import { Caption1Strong, Link, mergeClasses, Tooltip } from "@fluentui/react-components"; +import { Pin16Filled, WebAssetRegular } from "@fluentui/react-icons"; +import { ReactElement } from "react"; +import { useCollections } from "../contexts/CollectionsProvider"; +import GroupDropZone from "./collections/GroupDropZone"; +import GroupMoreMenu from "./collections/GroupMoreMenu"; +import { useStyles_GroupView } from "./GroupView.styles"; +import TabView from "./TabView"; + +export default function GroupView({ group, indices, dragOverlay }: GroupViewProps): ReactElement +{ + const [alwaysShowToolbars] = useSettings("alwaysShowToolbars"); + const { tilesView } = useCollections(); + + const groupId: string = useMemo(() => indices.join("/"), [indices]); + + const { + setNodeRef, nodeProps, + setActivatorNodeRef, activatorProps, + activeItem: active, isBeingDragged + } = useDndItem({ id: groupId, data: { indices, item: group }, disabled: group.pinned }); + + const disableDropZone: boolean = useMemo( + () => active !== null && + (active.item.type !== "tab" || (active.indices[0] === indices[0] && active.indices[1] === indices[1])), + [active, indices]); + const disableSorting: boolean = useMemo( + () => active !== null && (active.item.type !== "tab" || active.indices[0] !== indices[0]), + [active, indices]); + + const cls = useStyles_GroupView(); + const colorCls = useGroupColors(); + + return ( + +
+
+ +
+ { group.pinned === true ? + <> + + { i18n.t("groups.pinned") } + + : + + { group.title } + + } +
+ +
+ { group.items.length > 0 && + openGroup(group, false) }> + { i18n.t("groups.open") } + + } + + +
+
+ + + { group.items.length < 1 ? +
+ + { i18n.t("groups.empty") } +
+ : +
+ [...indices, index].join("/")) } + disabled={ disableSorting } + strategy={ !tilesView ? verticalListSortingStrategy : horizontalListSortingStrategy } + > + { group.items.map((i, index) => + + ) } + +
+ } +
+
+
+ ); +} + +export type GroupViewProps = + { + group: GroupItem; + indices: number[]; + dragOverlay?: boolean; + }; diff --git a/entrypoints/sidepanel/components/TabView.styles.ts b/entrypoints/sidepanel/components/TabView.styles.ts new file mode 100644 index 0000000..523ab0c --- /dev/null +++ b/entrypoints/sidepanel/components/TabView.styles.ts @@ -0,0 +1,114 @@ +import { makeStyles, tokens } from "@fluentui/react-components"; + +export const useStyles_TabView = makeStyles({ + root: + { + display: "grid", + position: "relative", + + width: "160px", + height: "120px", + marginBottom: tokens.spacingVerticalSNudge, + + border: `${tokens.strokeWidthThin} solid ${tokens.colorNeutralStroke3}`, + borderRadius: tokens.borderRadiusMedium, + backgroundColor: tokens.colorNeutralBackground1, + + cursor: "pointer", + textDecoration: "none !important", + userSelect: "none", + + "&:hover button, &:focus-within button": + { + display: "inline-flex" + }, + + "&:hover": + { + boxShadow: tokens.shadow4 + }, + + "&:focus-visible": + { + outline: `2px solid ${tokens.colorStrokeFocus2}` + } + }, + listView: + { + width: "100%", + height: "min-content", + marginBottom: tokens.spacingVerticalNone + }, + image: + { + zIndex: 0, + position: "absolute", + height: "100%", + width: "100%", + + borderRadius: tokens.borderRadiusMedium, + objectFit: "cover" + }, + header: + { + zIndex: 1, + alignSelf: "end", + minHeight: "32px", + + display: "grid", + gridTemplateColumns: "auto 1fr auto", + alignItems: "center", + gap: tokens.spacingHorizontalSNudge, + paddingLeft: tokens.spacingHorizontalS, + + borderBottomLeftRadius: tokens.borderRadiusMedium, + borderBottomRightRadius: tokens.borderRadiusMedium, + + backgroundColor: tokens.colorSubtleBackgroundLightAlphaHover, + color: tokens.colorNeutralForeground1, + "-webkit-backdrop-filer": "blur(4px)", + backdropFilter: "blur(4px)" + }, + icon: + { + cursor: "grab", + + "&:active": + { + cursor: "grabbing" + } + }, + title: + { + overflowX: "hidden", + justifySelf: "start", + maxWidth: "100%" + }, + deleteButton: + { + display: "none", + + "@media (pointer: coarse)": + { + display: "inline-flex" + } + }, + showDeleteButton: + { + display: "inline-flex" + }, + dragOverlay: + { + cursor: "grabbing !important", + transform: "scale(1.05)", + boxShadow: `${tokens.shadow16} !important`, + "& > div": + { + pointerEvents: "none" + } + }, + dragging: + { + visibility: "hidden" + } +}); diff --git a/entrypoints/sidepanel/components/TabView.tsx b/entrypoints/sidepanel/components/TabView.tsx new file mode 100644 index 0000000..5bad05a --- /dev/null +++ b/entrypoints/sidepanel/components/TabView.tsx @@ -0,0 +1,107 @@ +import faviconPlaceholder from "@/assets/FaviconPlaceholder.svg"; +import pagePlaceholder from "@/assets/PagePlaceholder.svg"; +import { useDialog } from "@/contexts/DialogProvider"; +import { useCollections } from "@/entrypoints/sidepanel/contexts/CollectionsProvider"; +import useDndItem from "@/entrypoints/sidepanel/hooks/useDndItem"; +import useSettings from "@/hooks/useSettings"; +import { TabItem } from "@/models/CollectionModels"; +import { Button, Caption1, Link, mergeClasses, Tooltip } from "@fluentui/react-components"; +import { Dismiss20Regular } from "@fluentui/react-icons"; +import { MouseEventHandler, ReactElement } from "react"; +import { useStyles_TabView } from "./TabView.styles"; + +export default function TabView({ tab, indices, dragOverlay }: TabViewProps): ReactElement +{ + const { removeItem, graphics, tilesView } = useCollections(); + const { + setNodeRef, setActivatorNodeRef, + nodeProps, activatorProps, isBeingDragged + } = useDndItem({ id: indices.join("/"), data: { indices, item: tab } }); + const dialog = useDialog(); + + const [deletePrompt] = useSettings("deletePrompt"); + const [showToolbar] = useSettings("alwaysShowToolbars"); + + const cls = useStyles_TabView(); + + const handleDelete: MouseEventHandler = (args) => + { + args.preventDefault(); + args.stopPropagation(); + + if (deletePrompt) + dialog.pushPrompt({ + title: i18n.t("tabs.delete"), + content: i18n.t("common.delete_prompt"), + destructive: true, + confirmText: i18n.t("common.actions.delete"), + onConfirm: () => removeItem(...indices) + }); + else + removeItem(...indices); + }; + + const handleClick: MouseEventHandler = (args) => + { + args.preventDefault(); + browser.tabs.create({ url: tab.url, active: true }); + }; + + const handleAuxClick: MouseEventHandler = (args) => + { + args.preventDefault(); + + if (args.button === 1) + browser.tabs.create({ url: tab.url, active: false }); + }; + + return ( + + { tilesView && + e.currentTarget.src = pagePlaceholder } + className={ cls.image } draggable={ false } /> + } + +
+ e.currentTarget.src = faviconPlaceholder } + height={ 20 } width={ 20 } + className={ cls.icon } draggable={ false } /> + + + + { tab.title ?? tab.url } + + + + +
+ + ); +} + +export type TabViewProps = + { + tab: TabItem; + indices: number[]; + dragOverlay?: boolean; + }; diff --git a/entrypoints/sidepanel/components/collections/CollectionHeader.tsx b/entrypoints/sidepanel/components/collections/CollectionHeader.tsx new file mode 100644 index 0000000..3b4ec45 --- /dev/null +++ b/entrypoints/sidepanel/components/collections/CollectionHeader.tsx @@ -0,0 +1,109 @@ +import { getCollectionTitle } from "@/entrypoints/sidepanel/utils/getCollectionTitle"; +import getSelectedTabs from "@/entrypoints/sidepanel/utils/getSelectedTabs"; +import useSettings from "@/hooks/useSettings"; +import { TabItem } from "@/models/CollectionModels"; +import { Button, Caption1, makeStyles, mergeClasses, Subtitle2, tokens, Tooltip } from "@fluentui/react-components"; +import { Add20Filled, Add20Regular, bundleIcon } from "@fluentui/react-icons"; +import CollectionContext, { CollectionContextType } from "../../contexts/CollectionContext"; +import { useCollections } from "../../contexts/CollectionsProvider"; +import CollectionMoreButton from "./CollectionMoreButton"; +import OpenCollectionButton from "./OpenCollectionButton"; + +export default function CollectionHeader({ dragHandleRef, dragHandleProps }: CollectionHeaderProps): React.ReactElement +{ + const { updateCollection } = useCollections(); + const { tabCount, collection, collectionIndex } = useContext(CollectionContext); + const [alwaysShowToolbars] = useSettings("alwaysShowToolbars"); + + const AddIcon = bundleIcon(Add20Filled, Add20Regular); + + const handleAddSelected = async () => + { + const newTabs: TabItem[] = await getSelectedTabs(); + updateCollection({ ...collection, items: [...collection.items, ...newTabs] }, collectionIndex); + }; + + const cls = useStyles(); + + return ( +
+
+ + + { getCollectionTitle(collection) } + + + + + { i18n.t("collections.tabs_count", [tabCount]) } + +
+ +
+ { tabCount < 1 ? + + : + + } + + +
+
+ ); +} + +export type CollectionHeaderProps = + { + dragHandleRef?: React.LegacyRef; + dragHandleProps?: React.HTMLAttributes; + }; + +const useStyles = makeStyles({ + header: + { + color: "var(--border)", + display: "grid", + gridTemplateColumns: "1fr auto", + padding: `${tokens.spacingVerticalS} ${tokens.spacingHorizontalS}`, + paddingBottom: tokens.spacingVerticalS + }, + title: + { + display: "flex", + flexFlow: "column", + alignItems: "flex-start", + overflow: "hidden" + }, + titleText: + { + maxWidth: "100%" + }, + toolbar: + { + display: "none", + gap: tokens.spacingHorizontalS, + alignItems: "flex-start", + + "@media (pointer: coarse)": + { + display: "flex" + } + }, + showToolbar: + { + display: "flex" + } +}); diff --git a/entrypoints/sidepanel/components/collections/CollectionMoreButton.tsx b/entrypoints/sidepanel/components/collections/CollectionMoreButton.tsx new file mode 100644 index 0000000..e944691 --- /dev/null +++ b/entrypoints/sidepanel/components/collections/CollectionMoreButton.tsx @@ -0,0 +1,114 @@ +import { useDialog } from "@/contexts/DialogProvider"; +import { useDangerStyles } from "@/hooks/useDangerStyles"; +import useSettings from "@/hooks/useSettings"; +import { Button, Menu, MenuDivider, MenuItem, MenuList, MenuPopover, MenuTrigger, Tooltip } from "@fluentui/react-components"; +import * as ic from "@fluentui/react-icons"; +import CollectionContext, { CollectionContextType } from "../../contexts/CollectionContext"; +import { useCollections } from "../../contexts/CollectionsProvider"; +import exportCollectionToBookmarks from "../../utils/exportCollectionToBookmarks"; +import EditDialog from "../EditDialog"; + +export default function CollectionMoreButton({ onAddSelected }: CollectionMoreButtonProps): React.ReactElement +{ + const { removeItem, updateCollection } = useCollections(); + const { tabCount, hasPinnedGroup, collection, collectionIndex } = useContext(CollectionContext); + const dialog = useDialog(); + const [deletePrompt] = useSettings("deletePrompt"); + + const AddIcon = ic.bundleIcon(ic.Add20Filled, ic.Add20Regular); + const GroupIcon = ic.bundleIcon(ic.GroupList20Filled, ic.GroupList20Regular); + const EditIcon = ic.bundleIcon(ic.Edit20Filled, ic.Edit20Regular); + const DeleteIcon = ic.bundleIcon(ic.Delete20Filled, ic.Delete20Regular); + const PinnedIcon = ic.bundleIcon(ic.Pin20Filled, ic.Pin20Regular); + const BookmarkIcon = ic.bundleIcon(ic.BookmarkAdd20Filled, ic.BookmarkAdd20Regular); + + const dangerCls = useDangerStyles(); + + const handleDelete = () => + { + if (deletePrompt) + dialog.pushPrompt({ + title: i18n.t("collections.menu.delete"), + content: i18n.t("common.delete_prompt"), + destructive: true, + confirmText: i18n.t("common.actions.delete"), + onConfirm: () => removeItem(collectionIndex) + }); + else + removeItem(collectionIndex); + }; + + const handleEdit = () => + dialog.pushCustom( + updateCollection(item, collectionIndex) } /> + ); + + const handleCreateGroup = () => + dialog.pushCustom( + updateCollection({ ...collection, items: [...collection.items, group] }, collectionIndex) } /> + ); + + const handleAddPinnedGroup = () => + { + updateCollection({ + ...collection, + items: [ + { type: "group", pinned: true, items: [] }, + ...collection.items + ] + }, collectionIndex); + }; + + return ( + + + + + ); +} + +export type CollectionMoreButtonProps = + { + onAddSelected?: () => void; + }; diff --git a/entrypoints/sidepanel/components/collections/GroupDropZone.tsx b/entrypoints/sidepanel/components/collections/GroupDropZone.tsx new file mode 100644 index 0000000..0a8bbab --- /dev/null +++ b/entrypoints/sidepanel/components/collections/GroupDropZone.tsx @@ -0,0 +1,45 @@ +import { useDroppable } from "@dnd-kit/core"; +import { makeStyles, mergeClasses, tokens } from "@fluentui/react-components"; +import GroupContext, { GroupContextType } from "../../contexts/GroupContext"; + +export default function GroupDropZone({ disabled, ...props }: DropZoneProps): React.ReactElement +{ + const { group, indices } = useContext(GroupContext); + const id: string = indices.join("/") + "_dropzone"; + const { isOver, setNodeRef, active } = useDroppable({ id, data: { indices, item: group }, disabled }); + + const isDragging = !disabled && active !== null; + const cls = useStyles(); + + return ( +
+ { props.children } +
+ ); +} + +export type DropZoneProps = React.DetailedHTMLProps, HTMLDivElement> + & { + disabled?: boolean; + }; + +const useStyles = makeStyles({ + root: + { + borderRadius: tokens.borderRadiusLarge, + borderTopRightRadius: tokens.borderRadiusNone, + border: `${tokens.strokeWidthThin} solid transparent` + }, + over: + { + backgroundColor: tokens.colorBrandBackground2, + border: `${tokens.strokeWidthThin} solid ${tokens.colorBrandStroke1}` + }, + dragging: + { + border: `${tokens.strokeWidthThin} dashed ${tokens.colorNeutralStroke1}` + } +}); diff --git a/entrypoints/sidepanel/components/collections/GroupMoreMenu.tsx b/entrypoints/sidepanel/components/collections/GroupMoreMenu.tsx new file mode 100644 index 0000000..8280582 --- /dev/null +++ b/entrypoints/sidepanel/components/collections/GroupMoreMenu.tsx @@ -0,0 +1,101 @@ +import { useDialog } from "@/contexts/DialogProvider"; +import EditDialog from "@/entrypoints/sidepanel/components/EditDialog"; +import CollectionContext, { CollectionContextType } from "@/entrypoints/sidepanel/contexts/CollectionContext"; +import { useCollections } from "@/entrypoints/sidepanel/contexts/CollectionsProvider"; +import GroupContext, { GroupContextType } from "@/entrypoints/sidepanel/contexts/GroupContext"; +import getSelectedTabs from "@/entrypoints/sidepanel/utils/getSelectedTabs"; +import { useDangerStyles } from "@/hooks/useDangerStyles"; +import useSettings from "@/hooks/useSettings"; +import { TabItem } from "@/models/CollectionModels"; +import { Button, Menu, MenuItem, MenuList, MenuPopover, MenuTrigger, Tooltip } from "@fluentui/react-components"; +import * as ic from "@fluentui/react-icons"; +import { ReactElement } from "react"; +import { openGroup } from "../../utils/opener"; + +export default function GroupMoreMenu(): ReactElement +{ + const { group, indices } = useContext(GroupContext); + const { hasPinnedGroup } = useContext(CollectionContext); + const [deletePrompt] = useSettings("deletePrompt"); + const dialog = useDialog(); + const { updateGroup, removeItem, ungroup } = useCollections(); + + const dangerCls = useDangerStyles(); + + const AddIcon = ic.bundleIcon(ic.Add20Filled, ic.Add20Regular); + const UngroupIcon = ic.bundleIcon(ic.FullScreenMaximize20Filled, ic.FullScreenMaximize20Regular); + const EditIcon = ic.bundleIcon(ic.Edit20Filled, ic.Edit20Regular); + const NewWindowIcon = ic.bundleIcon(ic.WindowNew20Filled, ic.WindowNew20Regular); + const DeleteIcon = ic.bundleIcon(ic.Delete20Filled, ic.Delete20Regular); + + const handleDelete = () => + { + if (deletePrompt) + dialog.pushPrompt({ + title: i18n.t("groups.menu.delete"), + content: i18n.t("common.delete_prompt"), + confirmText: i18n.t("common.actions.delete"), + destructive: true, + onConfirm: () => removeItem(...indices) + }); + else + removeItem(...indices); + }; + + const handleEdit = () => + dialog.pushCustom( + updateGroup(item, indices[0], indices[1]) } /> + ); + + const handleAddSelected = async () => + { + const newTabs: TabItem[] = await getSelectedTabs(); + updateGroup({ ...group, items: [...group.items, ...newTabs] }, indices[0], indices[1]); + }; + + return ( + + + + + ); +} diff --git a/entrypoints/sidepanel/components/collections/OpenCollectionButton.tsx b/entrypoints/sidepanel/components/collections/OpenCollectionButton.tsx new file mode 100644 index 0000000..c5b678f --- /dev/null +++ b/entrypoints/sidepanel/components/collections/OpenCollectionButton.tsx @@ -0,0 +1,97 @@ +import { useDialog } from "@/contexts/DialogProvider"; +import useSettings from "@/hooks/useSettings"; +import browserLocaleKey from "@/utils/browserLocaleKey"; +import { Menu, MenuButtonProps, MenuItem, MenuList, MenuPopover, MenuTrigger, SplitButton } from "@fluentui/react-components"; +import * as ic from "@fluentui/react-icons"; +import CollectionContext, { CollectionContextType } from "../../contexts/CollectionContext"; +import { useCollections } from "../../contexts/CollectionsProvider"; +import { openCollection } from "../../utils/opener"; + +export default function OpenCollectionButton(): React.ReactElement +{ + const [defaultAction] = useSettings("defaultRestoreAction"); + const { removeItem } = useCollections(); + const dialog = useDialog(); + const { collection, collectionIndex } = useContext(CollectionContext); + + const OpenIcon = ic.bundleIcon(ic.Open20Filled, ic.Open20Regular); + const RestoreIcon = ic.bundleIcon(ic.ArrowExportRtl20Filled, ic.ArrowExportRtl20Regular); + const NewWindowIcon = ic.bundleIcon(ic.WindowNew20Filled, ic.WindowNew20Regular); + const InPrivateIcon = ic.bundleIcon(ic.TabInPrivate20Filled, ic.TabInPrivate20Regular); + + const handleIncognito = async () => + { + if (await browser.extension.isAllowedIncognitoAccess()) + openCollection(collection, "incognito"); + else + dialog.pushPrompt({ + title: i18n.t("collections.incognito_check.title"), + content: ( + <> + { i18n.t(`collections.incognito_check.message.${browserLocaleKey}.p1`) } +
+
+ { i18n.t(`collections.incognito_check.message.${browserLocaleKey}.p2`) } + + ), + confirmText: i18n.t("collections.incognito_check.action"), + onConfirm: async () => import.meta.env.FIREFOX ? + await browser.runtime.openOptionsPage() : + await browser.tabs.create({ + url: `chrome://extensions/?id=${browser.runtime.id}`, + active: true + }) + }); + }; + + const handleOpen = (mode: "current" | "new") => + () => openCollection(collection, mode); + + const handleRestore = async () => + { + await openCollection(collection); + removeItem(collectionIndex); + }; + + return ( + + + { (triggerProps: MenuButtonProps) => defaultAction === "restore" ? + } menuButton={ triggerProps } + primaryActionButton={ { onClick: handleRestore } } + > + { i18n.t("collections.actions.restore") } + + : + } menuButton={ triggerProps } + primaryActionButton={ { onClick: handleOpen("current") } } + > + { i18n.t("collections.actions.open") } + + } + + + + + { defaultAction === "restore" ? + } onClick={ handleOpen("current") }> + { i18n.t("collections.actions.open") } + + : + } onClick={ handleRestore }> + { i18n.t("collections.actions.restore") } + + } + } onClick={ () => handleOpen("new") }> + { i18n.t("collections.actions.new_window") } + + } onClick={ handleIncognito }> + { i18n.t(`collections.actions.incognito.${browserLocaleKey}`) } + + + + + ); +} diff --git a/entrypoints/sidepanel/contexts/CollectionContext.tsx b/entrypoints/sidepanel/contexts/CollectionContext.tsx new file mode 100644 index 0000000..a28fdd4 --- /dev/null +++ b/entrypoints/sidepanel/contexts/CollectionContext.tsx @@ -0,0 +1,14 @@ +import { CollectionItem } from "@/models/CollectionModels"; +import { createContext } from "react"; + +const CollectionContext = createContext(null!); + +export default CollectionContext; + +export type CollectionContextType = + { + collection: CollectionItem; + collectionIndex: number; + tabCount: number; + hasPinnedGroup: boolean; + }; diff --git a/entrypoints/sidepanel/contexts/CollectionsProvider.tsx b/entrypoints/sidepanel/contexts/CollectionsProvider.tsx new file mode 100644 index 0000000..634eebe --- /dev/null +++ b/entrypoints/sidepanel/contexts/CollectionsProvider.tsx @@ -0,0 +1,115 @@ +import { CloudStorageIssueType, getCollections, graphics as graphicsStorage, saveCollections } from "@/features/collectionStorage"; +import useSettings from "@/hooks/useSettings"; +import { CollectionItem, GraphicsStorage, GroupItem } from "@/models/CollectionModels"; +import getLogger from "@/utils/getLogger"; +import { onMessage } from "@/utils/messaging"; +import { createContext } from "react"; +import mergePinnedGroups from "../utils/mergePinnedGroups"; + +const logger = getLogger("CollectionsProvider"); + +const CollectionsContext = createContext(null!); + +export const useCollections = () => useContext(CollectionsContext); + +export default function CollectionsProvider({ children }: React.PropsWithChildren): React.ReactElement +{ + const [collections, setCollections] = useState(null!); + const [cloudIssue, setCloudIssue] = useState(null); + const [graphics, setGraphics] = useState({}); + const [tilesView] = useSettings("tilesView"); + + useEffect(() => + { + refreshCollections(); + onMessage("refreshCollections", refreshCollections); + }, []); + + const refreshCollections = async (): Promise => + { + const [result, issues] = await getCollections(); + setCloudIssue(issues); + setCollections(result); + setGraphics(await graphicsStorage.getValue()); + }; + + const updateStorage = async (collectionList: CollectionItem[]): Promise => + { + logger("save"); + collectionList.forEach(mergePinnedGroups); + setCollections([...collectionList]); + await saveCollections(collectionList, cloudIssue === null); + setGraphics(await graphicsStorage.getValue()); + }; + + const addCollection = (collection: CollectionItem): void => + { + updateStorage([collection, ...collections]); + }; + + const removeItem = (...indices: number[]): void => + { + if (indices.length > 2) + (collections[indices[0]].items[indices[1]] as GroupItem).items.splice(indices[2], 1); + else if (indices.length > 1) + collections[indices[0]].items.splice(indices[1], 1); + else + collections.splice(indices[0], 1); + + updateStorage(collections); + }; + + const updateCollections = (collectionList: CollectionItem[]): void => + { + updateStorage(collectionList); + }; + + const updateCollection = (collection: CollectionItem, index: number): void => + { + collections[index] = collection; + updateStorage(collections); + }; + + const updateGroup = (group: GroupItem, collectionIndex: number, groupIndex: number): void => + { + collections[collectionIndex].items[groupIndex] = group; + updateStorage(collections); + }; + + const ungroup = (collectionIndex: number, groupIndex: number): void => + { + const group = collections[collectionIndex].items[groupIndex] as GroupItem; + collections[collectionIndex].items.splice(groupIndex, 1, ...group.items); + updateStorage(collections); + }; + + return ( + + { children } + + ); +} + +export type CollectionsContextType = + { + collections: CollectionItem[] | null; + cloudIssue: CloudStorageIssueType | null; + graphics: GraphicsStorage; + tilesView: boolean; + + refreshCollections: () => Promise; + addCollection: (collection: CollectionItem) => void; + + updateCollections: (collections: CollectionItem[]) => void; + updateCollection: (collection: CollectionItem, index: number) => void; + updateGroup: (group: GroupItem, collectionIndex: number, groupIndex: number) => void; + ungroup: (collectionIndex: number, groupIndex: number) => void; + + removeItem: (...indices: number[]) => void; + }; diff --git a/entrypoints/sidepanel/contexts/GroupContext.tsx b/entrypoints/sidepanel/contexts/GroupContext.tsx new file mode 100644 index 0000000..d0d8c06 --- /dev/null +++ b/entrypoints/sidepanel/contexts/GroupContext.tsx @@ -0,0 +1,12 @@ +import { GroupItem } from "@/models/CollectionModels"; +import { createContext } from "react"; + +const GroupContext = createContext(null!); + +export default GroupContext; + +export type GroupContextType = + { + group: GroupItem; + indices: number[]; + }; diff --git a/entrypoints/sidepanel/hooks/useDndItem.ts b/entrypoints/sidepanel/hooks/useDndItem.ts new file mode 100644 index 0000000..a2bb2e5 --- /dev/null +++ b/entrypoints/sidepanel/hooks/useDndItem.ts @@ -0,0 +1,61 @@ +import { CollectionItem, GroupItem, TabItem } from "@/models/CollectionModels"; +import { useSortable } from "@dnd-kit/sortable"; +import { Arguments } from "@dnd-kit/sortable/dist/hooks/useSortable"; + +export default function useDndItem(args: Arguments): DndItemHook +{ + const { + setActivatorNodeRef, setNodeRef, + transform, attributes, listeners, + active, over, + isDragging, + isSorting, + isOver + } = useSortable({ transition: null, ...args }); + + return { + setActivatorNodeRef, + setNodeRef, + nodeProps: + { + style: + { + transform: transform ? `translate(${transform.x}px, ${transform.y}px)` : undefined + }, + ...attributes + }, + activatorProps: + { + ...listeners, + style: + { + cursor: args.disabled ? undefined : "grab" + } + }, + activeItem: active ? { ...active.data.current, id: active.id } as DndItem : null, + overItem: over ? { ...over.data.current, id: over.id } as DndItem : null, + isBeingDragged: isDragging, + isCurrentlySorting: isSorting, + isActiveOverThis: isOver + }; +} + +export type DndItem = + { + id: string; + indices: number[]; + item: (TabItem | CollectionItem | GroupItem); + }; + +export type DndItemHook = + { + setNodeRef: (element: HTMLElement | null) => void; + setActivatorNodeRef: (element: HTMLElement | null) => void; + nodeProps: React.HTMLAttributes; + activatorProps: React.HTMLAttributes; + activeItem: DndItem | null; + overItem: DndItem | null; + isBeingDragged: boolean; + isCurrentlySorting: boolean; + isActiveOverThis: boolean; + }; diff --git a/entrypoints/sidepanel/index.html b/entrypoints/sidepanel/index.html new file mode 100644 index 0000000..2611a2e --- /dev/null +++ b/entrypoints/sidepanel/index.html @@ -0,0 +1,18 @@ + + + + + + + Tabs aside + + + + + + +
+ + + + diff --git a/entrypoints/sidepanel/layouts/collections/CollectionListView.styles.ts b/entrypoints/sidepanel/layouts/collections/CollectionListView.styles.ts new file mode 100644 index 0000000..cd13917 --- /dev/null +++ b/entrypoints/sidepanel/layouts/collections/CollectionListView.styles.ts @@ -0,0 +1,51 @@ +import { makeStyles, tokens } from "@fluentui/react-components"; + +export const useStyles_CollectionListView = makeStyles({ + root: + { + display: "flex", + flexFlow: "column", + gap: tokens.spacingVerticalM, + padding: `${tokens.spacingVerticalS} ${tokens.spacingHorizontalS}`, + overflowX: "hidden", + overflowY: "auto" + }, + collectionList: + { + display: "flex", + flexFlow: "column", + gap: tokens.spacingVerticalM + }, + searchBar: + { + boxShadow: tokens.shadow2 + }, + emptySearch: + { + display: "flex", + flexFlow: "column", + flexGrow: 1, + alignItems: "center", + justifyContent: "center", + gap: tokens.spacingVerticalS + }, + empty: + { + display: "flex", + flexFlow: "column", + alignItems: "center", + justifyContent: "center", + gap: tokens.spacingVerticalS, + padding: `${tokens.spacingVerticalM} ${tokens.spacingHorizontalM}`, + color: tokens.colorNeutralForeground2 + }, + msgBar: + { + flex: "none" + }, + listView: + { + display: "grid", + gridTemplateColumns: "repeat(auto-fit, minmax(360px, 1fr))" + } +}); diff --git a/entrypoints/sidepanel/layouts/collections/CollectionListView.tsx b/entrypoints/sidepanel/layouts/collections/CollectionListView.tsx new file mode 100644 index 0000000..1ec1889 --- /dev/null +++ b/entrypoints/sidepanel/layouts/collections/CollectionListView.tsx @@ -0,0 +1,149 @@ +import CollectionView from "@/entrypoints/sidepanel/components/CollectionView"; +import GroupView from "@/entrypoints/sidepanel/components/GroupView"; +import { DndItem } from "@/entrypoints/sidepanel/hooks/useDndItem"; +import CloudIssueMessages from "@/entrypoints/sidepanel/layouts/collections/messages/CloudIssueMessages"; +import CtaMessage from "@/entrypoints/sidepanel/layouts/collections/messages/CtaMessage"; +import filterCollections, { CollectionFilterType } from "@/entrypoints/sidepanel/utils/filterCollections"; +import sortCollections from "@/entrypoints/sidepanel/utils/sortCollections"; +import useSettings from "@/hooks/useSettings"; +import { CollectionItem } from "@/models/CollectionModels"; +import { DndContext, DragEndEvent, DragOverlay, DragStartEvent, MouseSensor, TouchSensor, useSensor, useSensors } from "@dnd-kit/core"; +import { rectSortingStrategy, SortableContext, verticalListSortingStrategy } from "@dnd-kit/sortable"; +import { Body1, Button, Caption1, mergeClasses, Subtitle2 } from "@fluentui/react-components"; +import { ArrowUndo20Regular, SearchInfo24Regular, Sparkle48Regular } from "@fluentui/react-icons"; +import { ReactElement } from "react"; +import TabView from "../../components/TabView"; +import CollectionContext from "../../contexts/CollectionContext"; +import { useCollections } from "../../contexts/CollectionsProvider"; +import applyReorder from "../../utils/dnd/applyReorder"; +import { collisionDetector } from "../../utils/dnd/collisionDetector"; +import { useStyles_CollectionListView } from "./CollectionListView.styles"; +import SearchBar from "./SearchBar"; +import StorageCapacityIssueMessage from "./messages/StorageCapacityIssueMessage"; + +export default function CollectionListView(): ReactElement +{ + const { tilesView, updateCollections, collections } = useCollections(); + + const [sortMode, setSortMode] = useSettings("sortMode"); + const [query, setQuery] = useState(""); + const [colors, setColors] = useState([]); + + const [active, setActive] = useState(null); + + const sensors = useSensors( + useSensor(MouseSensor, { activationConstraint: { delay: 100, tolerance: 0 } }), + useSensor(TouchSensor, { activationConstraint: { delay: 300, tolerance: 20 } }) + ); + + const resultList = useMemo( + () => sortCollections(filterCollections(collections, { query, colors }), sortMode), + [query, colors, sortMode, collections] + ); + + const cls = useStyles_CollectionListView(); + + const resetFilter = useCallback(() => + { + setQuery(""); + setColors([]); + }, []); + + const handleDragStart = (event: DragStartEvent): void => + { + setActive(event.active.data.current as DndItem); + }; + + const handleDragEnd = (args: DragEndEvent): void => + { + setActive(null); + const result: CollectionItem[] | null = applyReorder(resultList, args); + + if (result !== null) + { + updateCollections(result); + if (sortMode !== "custom") + setSortMode("custom"); + } + }; + + if (sortMode === null || collections === null) + return <>; + + if (collections.length < 1) + return ( +
+ + { i18n.t("main.list.empty.title") } + { i18n.t("main.list.empty.message") } +
+ ); + + return ( +
+ + + + + + + { resultList.length < 1 ? +
+ + { i18n.t("main.list.empty_search.title") } + { i18n.t("main.list.empty_search.message") } + +
+ : +
+ + index.toString()) } + strategy={ tilesView ? verticalListSortingStrategy : rectSortingStrategy } + > + { resultList.map((collection, index) => + + ) } + + + + { active && + <> + { active.item.type === "collection" && + + } + { active.item.type === "group" && + + + + } + { active.item.type === "tab" && + + } + + } + + +
+ } +
+ ); +} diff --git a/entrypoints/sidepanel/layouts/collections/FilterCollectionsButton.tsx b/entrypoints/sidepanel/layouts/collections/FilterCollectionsButton.tsx new file mode 100644 index 0000000..a36842b --- /dev/null +++ b/entrypoints/sidepanel/layouts/collections/FilterCollectionsButton.tsx @@ -0,0 +1,71 @@ +import { useGroupColors } from "@/hooks/useGroupColors"; +import * as fui from "@fluentui/react-components"; +import * as ic from "@fluentui/react-icons"; +import { CollectionFilterType } from "../../utils/filterCollections"; + +export default function FilterCollectionsButton({ value, onChange }: FilterCollectionsButtonProps): React.ReactElement +{ + const cls = useStyles(); + const colorCls = useGroupColors(); + + const ColorFilterIcon = ic.bundleIcon(ic.Color20Filled, ic.Color20Regular); + const ColorIcon = ic.bundleIcon(ic.Circle20Filled, ic.CircleHalfFill20Regular); + const NoColorIcon = ic.bundleIcon(ic.CircleOffFilled, ic.CircleOffRegular); + const AnyColorIcon = ic.bundleIcon(ic.PhotoFilter20Filled, ic.PhotoFilter20Regular); + + return ( + + onChange?.(e.checkedItems.includes("any") ? [] : e.checkedItems as CollectionFilterType["colors"]) + } + > + + + + } /> + + + + + + }> + { i18n.t("colors.any") } + + + }> + { i18n.t("colors.none") } + + + { Object.keys(colorCls).map(i => + + } + > + { i18n.t(`colors.${i as chrome.tabGroups.ColorEnum}`) } + + ) } + + + + ); +} + +export type FilterCollectionsButtonProps = + { + value?: CollectionFilterType["colors"]; + onChange?: (value: CollectionFilterType["colors"]) => void; + }; + +const useStyles = fui.makeStyles({ + colorIcon: + { + color: "var(--border)" + } +}); diff --git a/entrypoints/sidepanel/layouts/collections/SearchBar.tsx b/entrypoints/sidepanel/layouts/collections/SearchBar.tsx new file mode 100644 index 0000000..a525e19 --- /dev/null +++ b/entrypoints/sidepanel/layouts/collections/SearchBar.tsx @@ -0,0 +1,51 @@ +import { Button, Input, makeStyles, tokens, Tooltip } from "@fluentui/react-components"; +import { ArrowUndo20Filled, ArrowUndo20Regular, bundleIcon, Search20Regular } from "@fluentui/react-icons"; +import { CollectionFilterType } from "../../utils/filterCollections"; +import { CollectionSortMode } from "../../utils/sortCollections"; +import FilterCollectionsButton from "./FilterCollectionsButton"; +import SortCollectionsButton from "./SortCollectionsButton"; + +export default function SearchBar(props: SearchBarProps): React.ReactElement +{ + const cls = useStyles(); + + const ResetIcon = bundleIcon(ArrowUndo20Filled, ArrowUndo20Regular); + + return ( + } + placeholder={ i18n.t("main.list.searchbar.title") } + value={ props.query } onChange={ (_, e) => props.onQueryChange?.(e.value) } + contentAfter={ + <> + { (props.query || (props.filter && props.filter.length > 0)) && + + + + + } + + { cloudIssue === "merge_conflict" && + + + { i18n.t("merge_conflict_message.title") } + { i18n.t("merge_conflict_message.message") } + + + + + + + } + + ); +} diff --git a/entrypoints/sidepanel/layouts/collections/messages/CtaMessage.tsx b/entrypoints/sidepanel/layouts/collections/messages/CtaMessage.tsx new file mode 100644 index 0000000..847f065 --- /dev/null +++ b/entrypoints/sidepanel/layouts/collections/messages/CtaMessage.tsx @@ -0,0 +1,60 @@ +import { BuyMeACoffee20Regular } from "@/assets/BuyMeACoffee20"; +import { buyMeACoffeeLink, storeLink } from "@/data/links"; +import { useBmcStyles } from "@/hooks/useBmcStyles"; +import extLink from "@/utils/extLink"; +import { Button, Link, MessageBar, MessageBarActions, MessageBarBody, MessageBarProps, MessageBarTitle } from "@fluentui/react-components"; +import { DismissRegular, HeartFilled } from "@fluentui/react-icons"; +import { ReactElement } from "react"; + +export default function CtaMessage(props: MessageBarProps): ReactElement +{ + const [counter, setCounter] = useState(0); + const bmcCls = useBmcStyles(); + + useEffect(() => + { + ctaCounter.getValue().then(c => + { + if (c >= 0) + { + setCounter(c); + ctaCounter.setValue(c + 1); + } + }); + }, []); + + const resetCounter = async (counter: number) => + { + await ctaCounter.setValue(counter); + setCounter(counter); + }; + + if (counter < 50) + return <>; + + return ( + } { ...props }> + + { i18n.t("cta_message.title") } + { i18n.t("cta_message.message") } { i18n.t("cta_message.feedback") } + + } appearance="transparent" onClick={ () => resetCounter(0) } /> + } + > + + + + ); +} + +const ctaCounter = storage.defineItem("local:ctaCounter", { fallback: 0 }); diff --git a/entrypoints/sidepanel/layouts/collections/messages/StorageCapacityIssueMessage.tsx b/entrypoints/sidepanel/layouts/collections/messages/StorageCapacityIssueMessage.tsx new file mode 100644 index 0000000..537981e --- /dev/null +++ b/entrypoints/sidepanel/layouts/collections/messages/StorageCapacityIssueMessage.tsx @@ -0,0 +1,21 @@ +import useStorageInfo from "@/hooks/useStorageInfo"; +import { MessageBar, MessageBarBody, MessageBarProps, MessageBarTitle } from "@fluentui/react-components"; + +export default function StorageCapacityIssueMessage(props: MessageBarProps): JSX.Element +{ + const { usedStorageRatio } = useStorageInfo(); + + if (usedStorageRatio < 0.8) + return <>; + + return ( + + + + { i18n.t("storage_full_message.title", [(usedStorageRatio * 100).toFixed(1)]) } + + { i18n.t("storage_full_message.message") } + + + ); +} diff --git a/entrypoints/sidepanel/layouts/header/ActionButton.tsx b/entrypoints/sidepanel/layouts/header/ActionButton.tsx new file mode 100644 index 0000000..810b1a5 --- /dev/null +++ b/entrypoints/sidepanel/layouts/header/ActionButton.tsx @@ -0,0 +1,74 @@ +import { useCollections } from "@/entrypoints/sidepanel/contexts/CollectionsProvider"; +import useSettings, { SettingsValue } from "@/hooks/useSettings"; +import saveTabsToCollection from "@/utils/saveTabsToCollection"; +import watchTabSelection from "@/utils/watchTabSelection"; +import { Menu, MenuButtonProps, MenuItem, MenuList, MenuPopover, MenuTrigger, SplitButton } from "@fluentui/react-components"; +import * as ic from "@fluentui/react-icons"; +import { ReactElement } from "react"; + +export default function ActionButton(): ReactElement +{ + const { addCollection } = useCollections(); + const [defaultAction] = useSettings("defaultSaveAction"); + const [selection, setSelection] = useState<"all" | "selected">("all"); + + const handleAction = async (primary: boolean) => + { + const colection = await saveTabsToCollection(primary === (defaultAction === "set_aside")); + addCollection(colection); + }; + + useEffect(() => + { + return watchTabSelection(setSelection); + }, []); + + if (defaultAction === null) + return
; + + const primaryActionKey: ActionsKey = `${defaultAction}.${selection}`; + const PrimaryIcon = actionIcons[primaryActionKey]; + const secondaryActionKey: ActionsKey = `${defaultAction === "save" ? "set_aside" : "save"}.${selection}`; + const SecondaryIcon = actionIcons[secondaryActionKey]; + + return ( + + + { (triggerProps: MenuButtonProps) => ( + } + menuButton={ triggerProps } + primaryActionButton={ { onClick: () => handleAction(true) } } + > + { i18n.t(`actions.${primaryActionKey}`) } + + ) } + + + + + } onClick={ () => handleAction(false) }> + { i18n.t(`actions.${secondaryActionKey}`) } + + + + + ); +} + +const actionIcons: Record = +{ + "save.all": ic.bundleIcon(ic.SaveArrowRight20Filled, ic.SaveArrowRight20Regular), + "save.selected": ic.bundleIcon(ic.SaveCopy20Filled, ic.SaveCopy20Regular), + "set_aside.all": ic.bundleIcon(ic.ArrowRight20Filled, ic.ArrowRight20Regular), + "set_aside.selected": ic.bundleIcon(ic.CopyArrowRight20Filled, ic.CopyArrowRight20Regular) +}; + +export type ActionsKey = `${SettingsValue<"defaultSaveAction">}.${"all" | "selected"}`; + +export type ActionsValue = + { + label: string; + icon: ic.FluentIcon; + }; diff --git a/entrypoints/sidepanel/layouts/header/Header.tsx b/entrypoints/sidepanel/layouts/header/Header.tsx new file mode 100644 index 0000000..22150b9 --- /dev/null +++ b/entrypoints/sidepanel/layouts/header/Header.tsx @@ -0,0 +1,53 @@ +import { useDialog } from "@/contexts/DialogProvider"; +import { useCollections } from "@/entrypoints/sidepanel/contexts/CollectionsProvider"; +import { Button, makeStyles, tokens, Tooltip } from "@fluentui/react-components"; +import { CollectionsAddRegular } from "@fluentui/react-icons"; +import { ReactElement } from "react"; +import EditDialog from "../../components/EditDialog"; +import ActionButton from "./ActionButton"; +import MoreButton from "./MoreButton"; + +export default function Header(): ReactElement +{ + const { addCollection } = useCollections(); + const dialog = useDialog(); + const cls = useStyles(); + + const handleCreateCollection = () => + dialog.pushCustom( + + ); + + return ( +
+ + +
+ + +
+
+ ); +} + +const useStyles = makeStyles({ + header: + { + display: "flex", + justifyContent: "space-between", + padding: `${tokens.spacingVerticalS} ${tokens.spacingHorizontalS}`, + gap: tokens.spacingHorizontalS + }, + headerSecondary: + { + display: "flex", + gap: tokens.spacingHorizontalXS + } +}); diff --git a/entrypoints/sidepanel/layouts/header/MoreButton.tsx b/entrypoints/sidepanel/layouts/header/MoreButton.tsx new file mode 100644 index 0000000..5359855 --- /dev/null +++ b/entrypoints/sidepanel/layouts/header/MoreButton.tsx @@ -0,0 +1,85 @@ +import { BuyMeACoffee20Filled, BuyMeACoffee20Regular } from "@/assets/BuyMeACoffee20"; +import { buyMeACoffeeLink, githubLinks, storeLink } from "@/data/links"; +import useSettings from "@/hooks/useSettings"; +import extLink from "@/utils/extLink"; +import sendNotification from "@/utils/sendNotification"; +import * as fui from "@fluentui/react-components"; +import * as ic from "@fluentui/react-icons"; +import { ReactElement } from "react"; + +export default function MoreButton(): ReactElement +{ + const [tilesView, setTilesView] = useSettings("tilesView"); + + const SettingsIcon: ic.FluentIcon = ic.bundleIcon(ic.Settings20Filled, ic.Settings20Regular); + const ViewIcon: ic.FluentIcon = ic.bundleIcon(ic.GridKanban20Filled, ic.GridKanban20Regular); + const FeedbackIcon: ic.FluentIcon = ic.bundleIcon(ic.PersonFeedback20Filled, ic.PersonFeedback20Regular); + const LearnIcon: ic.FluentIcon = ic.bundleIcon(ic.QuestionCircle20Filled, ic.QuestionCircle20Regular); + const BmcIcon: ic.FluentIcon = ic.bundleIcon(BuyMeACoffee20Filled, BuyMeACoffee20Regular); + + return ( + setTilesView(e.checkedItems.length > 0) } + > + + + } /> + + + + + + + } onClick={ () => browser.runtime.openOptionsPage() }> + { i18n.t("options_page.title") } + + }> + { i18n.t("main.header.menu.tiles_view") } + + + + + } { ...extLink(buyMeACoffeeLink) }> + { i18n.t("common.cta.sponsor") } + + } { ...extLink(storeLink) } > + { i18n.t("common.cta.feedback") } + + } { ...extLink(githubLinks.release) } > + { i18n.t("main.header.menu.changelog") } + + + { import.meta.env.DEV && + + Dev tools + } + onClick={ () => document.location.reload() } + > + Reload page + + } + onClick={ () => browser.tabs.create({ url: browser.runtime.getURL("/sidepanel.html"), active: true }) } + > + Open in tab + + } + onClick={ async () => await sendNotification({ + icon: "/notification_icons/cloud_error.png", + message: "Notification message", + title: "Notification title" + }) } + > + Show test notification + + + } + + + + ); +} diff --git a/entrypoints/sidepanel/main.tsx b/entrypoints/sidepanel/main.tsx new file mode 100644 index 0000000..a9a2560 --- /dev/null +++ b/entrypoints/sidepanel/main.tsx @@ -0,0 +1,44 @@ +import App from "@/App.tsx"; +import "@/assets/global.css"; +import { useLocalMigration } from "@/features/migration"; +import useWelcomeDialog from "@/features/v3welcome/hooks/useWelcomeDialog"; +import { Divider, makeStyles } from "@fluentui/react-components"; +import ReactDOM from "react-dom/client"; +import CollectionsProvider from "./contexts/CollectionsProvider"; +import CollectionListView from "./layouts/collections/CollectionListView"; +import Header from "./layouts/header/Header"; + +ReactDOM.createRoot(document.getElementById("root")!).render( + + + +); + +document.title = i18n.t("manifest.name"); + +function MainPage(): React.ReactElement +{ + const cls = useStyles(); + + useLocalMigration(); + useWelcomeDialog(); + + return ( + +
+
+ + +
+
+ ); +} + +const useStyles = makeStyles({ + main: + { + display: "grid", + gridTemplateRows: "auto auto 1fr", + height: "100vh" + } +}); diff --git a/entrypoints/sidepanel/utils/dnd/applyReorder.ts b/entrypoints/sidepanel/utils/dnd/applyReorder.ts new file mode 100644 index 0000000..b5b29a2 --- /dev/null +++ b/entrypoints/sidepanel/utils/dnd/applyReorder.ts @@ -0,0 +1,61 @@ +import { CollectionItem, GroupItem, TabItem } from "@/models/CollectionModels"; +import { DragEndEvent } from "@dnd-kit/core"; +import { arrayMove } from "@dnd-kit/sortable"; +import { DndItem } from "../../hooks/useDndItem"; + +export default function applyReorder(collections: CollectionItem[], { over, active }: DragEndEvent): null | CollectionItem[] +{ + if (!over || active.id === over.id) + return null; + + const activeItem: DndItem = active.data.current as DndItem; + const overItem: DndItem = over.data.current as DndItem; + + console.log("DragEnd", `active: ${active.id} ${activeItem.item.type}`, `over: ${over.id} ${overItem.item.type}`); + + let newList: CollectionItem[] = [ + ...collections.map(collection => ({ + ...collection, + items: collection.items.map(item => + item.type === "group" ? + { ...item, items: item.items.map(tab => ({ ...tab })) } : + { ...item } + ) + })) + ]; + + if (activeItem.item.type === "collection") + { + newList = arrayMove( + newList, + activeItem.indices[0], + overItem.indices[0] + ); + + return newList; + } + + const sourceItem: GroupItem | CollectionItem = activeItem.indices.length > 2 ? + (newList[activeItem.indices[0]].items[activeItem.indices[1]] as GroupItem) : + newList[activeItem.indices[0]]; + + if ((over.id as string).endsWith("_dropzone") || overItem.item.type === "collection") + { + const destItem: GroupItem | CollectionItem = overItem.indices.length > 1 ? + (newList[overItem.indices[0]].items[overItem.indices[1]] as GroupItem) : + newList[overItem.indices[0]]; + + destItem.items.push(activeItem.item as any); + sourceItem.items.splice(activeItem.indices[activeItem.indices.length - 1], 1); + } + else + { + sourceItem.items = arrayMove( + sourceItem.items, + activeItem.indices[activeItem.indices.length - 1], + overItem.indices[overItem.indices.length - 1] + ); + } + + return newList; +} diff --git a/entrypoints/sidepanel/utils/dnd/collisionDetector.ts b/entrypoints/sidepanel/utils/dnd/collisionDetector.ts new file mode 100644 index 0000000..b175d20 --- /dev/null +++ b/entrypoints/sidepanel/utils/dnd/collisionDetector.ts @@ -0,0 +1,121 @@ +import { ClientRect, Collision, CollisionDescriptor, CollisionDetection } from "@dnd-kit/core"; +import { DndItem } from "../../hooks/useDndItem"; +import { centerOfRectangle, distanceBetween, getIntersectionRatio, getMaxIntersectionRatio, getRectSideCoordinates, sortCollisionsAsc } from "./dndUtils"; + +export function collisionDetector(vertical?: boolean): CollisionDetection +{ + return (args): Collision[] => + { + const { collisionRect, droppableContainers, droppableRects, active, pointerCoordinates } = args; + const activeItem = active.data.current as DndItem; + + if (!pointerCoordinates) + return []; + + const collisions: CollisionDescriptor[] = []; + const centerRect = centerOfRectangle( + collisionRect, + collisionRect.left, + collisionRect.top + ); + + for (const droppableContainer of droppableContainers) + { + const { id, data } = droppableContainer; + const rect = droppableRects.get(id); + + const droppableItem: DndItem = data.current as DndItem; + + if (!rect) + continue; + + let value: number = 0; + + if (activeItem.item.type === "collection") + { + if (droppableItem.item.type !== "collection") + continue; + + value = distanceBetween(centerOfRectangle(rect), centerRect); + collisions.push({ id, data: { droppableContainer, value } }); + continue; + } + + const intersectionRatio: number = getIntersectionRatio(rect, collisionRect); + const intersectionCoefficient: number = intersectionRatio / getMaxIntersectionRatio(rect, collisionRect); + + if (droppableItem.item.type === "collection") + { + if (activeItem.indices.length === 2 && activeItem.indices[0] === droppableItem.indices[0]) + continue; + + if (intersectionCoefficient < 0.7 && activeItem.item.type === "tab") + continue; + + if (activeItem.indices.length === 3 && activeItem.indices[0] === droppableItem.indices[0]) + { + const [collectionId, groupId] = activeItem.indices; + const groupRect: ClientRect | undefined = droppableRects.get(`${collectionId}/${groupId}`); + + if (!groupRect) + continue; + + value = 1 / (intersectionRatio - getIntersectionRatio(groupRect, collisionRect)); + } + else + { + value = 1 / intersectionRatio; + } + } + else if (droppableItem.item.type === "group" && (id as string).endsWith("_dropzone")) + { + if (activeItem.item.type === "group") + continue; + + if ( + activeItem.indices.length === 3 && + activeItem.indices[0] === droppableItem.indices[0] && + activeItem.indices[1] === droppableItem.indices[1] + ) + continue; + + if (intersectionCoefficient < 0.5) + continue; + + value = 1 / intersectionRatio; + } + else if (activeItem.indices.length === droppableItem.indices.length) + { + if (activeItem.indices[0] !== droppableItem.indices[0]) + continue; + + if (activeItem.indices.length === 3 && activeItem.indices[1] !== droppableItem.indices[1]) + continue; + + if (droppableItem.item.type === "group" && droppableItem.item.pinned === true) + continue; + + if (activeItem.item.type === "tab" && droppableItem.item.type === "tab") + { + value = distanceBetween(centerOfRectangle(rect), centerRect); + } + else + { + const activeIndex: number = activeItem.indices[activeItem.indices.length - 1]; + const droppableIndex: number = droppableItem.indices[droppableItem.indices.length - 1]; + const before: boolean = activeIndex < droppableIndex; + + value = distanceBetween( + getRectSideCoordinates(rect, before, vertical), + getRectSideCoordinates(collisionRect, before, vertical) + ); + } + } + + if ((value > 0 && value < Number.POSITIVE_INFINITY) || active.id === id) + collisions.push({ id, data: { droppableContainer, value } }); + }; + + return collisions.sort(sortCollisionsAsc); + }; +} diff --git a/entrypoints/sidepanel/utils/dnd/dndUtils.ts b/entrypoints/sidepanel/utils/dnd/dndUtils.ts new file mode 100644 index 0000000..389bb3b --- /dev/null +++ b/entrypoints/sidepanel/utils/dnd/dndUtils.ts @@ -0,0 +1,128 @@ +import { ClientRect, CollisionDescriptor } from "@dnd-kit/core"; +import { Coordinates } from "@dnd-kit/utilities"; + +export function getRectSideCoordinates(rect: ClientRect, before: boolean, vertical?: boolean) +{ + if (before) + return vertical ? bottomsideOfRect(rect) : rightsideOfRect(rect); + + return vertical ? topsideOfRect(rect) : leftsideOfRect(rect); +} + +export function getMaxIntersectionRatio(entry: ClientRect, target: ClientRect): number +{ + const entrySize = entry.width * entry.height; + const targetSize = target.width * target.height; + + return Math.min(targetSize / entrySize, entrySize / targetSize); +} + +function topsideOfRect(rect: ClientRect): Coordinates +{ + const { left, top } = rect; + + return { + x: left + rect.width * 0.5, + y: top + }; +} + +function bottomsideOfRect(rect: ClientRect): Coordinates +{ + const { left, bottom } = rect; + return { + x: left + rect.width * 0.5, + y: bottom + }; +} + +function rightsideOfRect(rect: ClientRect): Coordinates +{ + const { right, top } = rect; + return { + x: right, + y: top + rect.height * 0.5 + }; +} + +function leftsideOfRect(rect: ClientRect): Coordinates +{ + const { left, top } = rect; + return { + x: left, + y: top + rect.height * 0.5 + }; +} + +/* + * MIT License + * + * Copyright (c) 2021, ClaudÊric Demers + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +export function distanceBetween(p1: Coordinates, p2: Coordinates) +{ + return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2)); +} + +export function sortCollisionsAsc( + { data: { value: a } }: CollisionDescriptor, + { data: { value: b } }: CollisionDescriptor +) +{ + return a - b; +} + +export function getIntersectionRatio(entry: ClientRect, target: ClientRect): number +{ + const top = Math.max(target.top, entry.top); + const left = Math.max(target.left, entry.left); + const right = Math.min(target.left + target.width, entry.left + entry.width); + const bottom = Math.min(target.top + target.height, entry.top + entry.height); + const width = right - left; + const height = bottom - top; + + if (left < right && top < bottom) + { + const targetArea = target.width * target.height; + const entryArea = entry.width * entry.height; + const intersectionArea = width * height; + const intersectionRatio = + intersectionArea / (targetArea + entryArea - intersectionArea); + + return Number(intersectionRatio.toFixed(4)); + } + + // Rectangles do not overlap, or overlap has an area of zero (edge/corner overlap) + return 0; +} + +export function centerOfRectangle( + rect: ClientRect, + left = rect.left, + top = rect.top +): Coordinates +{ + return { + x: left + rect.width * 0.5, + y: top + rect.height * 0.5 + }; +} diff --git a/entrypoints/sidepanel/utils/exportCollectionToBookmarks.ts b/entrypoints/sidepanel/utils/exportCollectionToBookmarks.ts new file mode 100644 index 0000000..20c645e --- /dev/null +++ b/entrypoints/sidepanel/utils/exportCollectionToBookmarks.ts @@ -0,0 +1,48 @@ +import { CollectionItem, TabItem } from "@/models/CollectionModels"; +import sendNotification from "@/utils/sendNotification"; +import { Bookmarks } from "wxt/browser"; +import { getCollectionTitle } from "./getCollectionTitle"; + +export default async function exportCollectionToBookmarks(collection: CollectionItem) +{ + const rootFolder: Bookmarks.BookmarkTreeNode = await browser.bookmarks.create({ + title: getCollectionTitle(collection) + }); + + for (let i = 0; i < collection.items.length; i++) + { + const item = collection.items[i]; + + if (item.type === "tab") + { + await createTabBookmark(item, rootFolder.id); + } + else + { + const groupFolder = await browser.bookmarks.create({ + parentId: rootFolder.id, + title: item.pinned + ? `📌 ${i18n.t("groups.pinned")}` : + (item.title?.trim() || `${i18n.t("groups.title")} ${i}`) + }); + + for (const tab of item.items) + await createTabBookmark(tab, groupFolder.id); + } + } + + await sendNotification({ + title: i18n.t("notifications.bookmark_saved.title"), + message: i18n.t("notifications.bookmark_saved.message"), + icon: "/notification_icons/bookmark_add.png" + }); +} + +async function createTabBookmark(tab: TabItem, parentId: string): Promise +{ + await browser.bookmarks.create({ + parentId, + title: tab.title?.trim() || tab.url, + url: tab.url + }); +}; diff --git a/entrypoints/sidepanel/utils/filterCollections.ts b/entrypoints/sidepanel/utils/filterCollections.ts new file mode 100644 index 0000000..a1fbb48 --- /dev/null +++ b/entrypoints/sidepanel/utils/filterCollections.ts @@ -0,0 +1,65 @@ +import { getCollectionTitle } from "@/entrypoints/sidepanel/utils/getCollectionTitle"; +import { CollectionItem, TabItem } from "@/models/CollectionModels"; + +export default function filterCollections( + collections: CollectionItem[] | null, + filter: CollectionFilterType +): CollectionItem[] +{ + if (!collections || collections.length < 1) + return []; + + if (!filter.query && filter.colors.length < 1) + return collections; + + const query: string = filter.query.toLocaleLowerCase(); + + return collections.filter(collection => + { + let querySatisfied: boolean = query.length < 1 || + getCollectionTitle(collection).toLocaleLowerCase().includes(query); + let colorSatisfied: boolean = filter.colors.length < 1 || + filter.colors.includes(collection.color ?? "none"); + + if (querySatisfied && colorSatisfied) + return true; + + function probeTab(tab: TabItem, query: string): boolean + { + return tab.title?.toLocaleLowerCase().includes(query) || tab.url.toLocaleLowerCase().includes(query); + } + + for (const item of collection.items) + { + if (item.type === "tab" && !querySatisfied) + { + querySatisfied = probeTab(item, query); + } + else if (item.type === "group") + { + if (item.pinned !== true) + { + if (!querySatisfied) + querySatisfied = (item.title?.toLocaleLowerCase() ?? "").includes(query); + + if (!colorSatisfied) + colorSatisfied = filter.colors.includes(item.color); + } + + if (!querySatisfied) + querySatisfied = item.items.some(i => probeTab(i, query)); + } + + if (querySatisfied && colorSatisfied) + return true; + } + + return false; + }); +} + +export type CollectionFilterType = + { + query: string; + colors: (chrome.tabGroups.ColorEnum | "none")[]; + }; diff --git a/entrypoints/sidepanel/utils/getCollectionTitle.ts b/entrypoints/sidepanel/utils/getCollectionTitle.ts new file mode 100644 index 0000000..aa55bc2 --- /dev/null +++ b/entrypoints/sidepanel/utils/getCollectionTitle.ts @@ -0,0 +1,8 @@ +import { CollectionItem } from "@/models/CollectionModels"; + +export function getCollectionTitle(collection?: CollectionItem): string +{ + return collection?.title + || new Date(collection?.timestamp ?? Date.now()) + .toLocaleDateString(browser.i18n.getUILanguage(), { year: "numeric", month: "short", day: "numeric" }); +} diff --git a/entrypoints/sidepanel/utils/getSelectedTabs.ts b/entrypoints/sidepanel/utils/getSelectedTabs.ts new file mode 100644 index 0000000..e298e55 --- /dev/null +++ b/entrypoints/sidepanel/utils/getSelectedTabs.ts @@ -0,0 +1,8 @@ +import { TabItem } from "@/models/CollectionModels"; +import { Tabs } from "wxt/browser"; + +export default async function getSelectedTabs(): Promise +{ + const tabs: Tabs.Tab[] = await browser.tabs.query({ currentWindow: true, highlighted: true }); + return tabs.filter(i => i.url).map(i => ({ type: "tab", url: i.url!, title: i.title })); +} diff --git a/entrypoints/sidepanel/utils/mergePinnedGroups.ts b/entrypoints/sidepanel/utils/mergePinnedGroups.ts new file mode 100644 index 0000000..26d554f --- /dev/null +++ b/entrypoints/sidepanel/utils/mergePinnedGroups.ts @@ -0,0 +1,27 @@ +import { CollectionItem, TabItem } from "@/models/CollectionModels"; + +export default function mergePinnedGroups(collection: CollectionItem): void +{ + const pinnedItems: TabItem[] = []; + const otherItems: CollectionItem["items"] = []; + let pinExists: boolean = false; + + collection.items.forEach(item => + { + if (item.type === "group" && item.pinned === true) + { + pinExists = true; + pinnedItems.push(...item.items); + } + else + otherItems.push(item); + }); + + if (pinnedItems.length > 0 || pinExists) + collection.items = [ + { type: "group", pinned: true, items: pinnedItems }, + ...otherItems + ]; + else + collection.items = otherItems; +} diff --git a/entrypoints/sidepanel/utils/opener.ts b/entrypoints/sidepanel/utils/opener.ts new file mode 100644 index 0000000..29fca28 --- /dev/null +++ b/entrypoints/sidepanel/utils/opener.ts @@ -0,0 +1,117 @@ +import { getCollectionTitle } from "@/entrypoints/sidepanel/utils/getCollectionTitle"; +import { CollectionItem, GroupItem, TabItem } from "@/models/CollectionModels"; +import { settings } from "@/utils/settings"; +import { Tabs, Windows } from "wxt/browser"; + +export async function openCollection(collection: CollectionItem, targetWindow?: "current" | "new" | "incognito"): Promise +{ + if (targetWindow === "incognito" && !(await browser.extension.isAllowedIncognitoAccess())) + throw new Error("The extension doesn't have incognito permission"); + + const discard: boolean = await settings.dismissOnLoad.getValue(); + + await manageWindow( + async windowId => + { + if (collection.items.some(i => i.type === "group")) + // Open tabs as regular, open groups as groups + await Promise.all(collection.items.map(async i => + { + if (i.type === "tab") + await createTab(i.url, windowId, discard); + else + await createGroup(i, windowId, discard); + })); + + else if (collection.color) + // Open collection as one big group + await createGroup({ + type: "group", + color: collection.color, + title: getCollectionTitle(collection), + items: collection.items as TabItem[] + }, windowId); + + else + // Open collection tabs as is + await Promise.all(collection.items.map(async i => + await createTab((i as TabItem).url, windowId, discard) + )); + }, + (!targetWindow || targetWindow === "current") ? + undefined : + { incognito: targetWindow === "incognito" } + ); +} + +export async function openGroup(group: GroupItem, newWindow: boolean = false): Promise +{ + await manageWindow( + windowId => createGroup(group, windowId), + newWindow ? {} : undefined + ); +} + +async function createGroup(group: GroupItem, windowId: number, discard?: boolean): Promise +{ + discard ??= await settings.dismissOnLoad.getValue(); + const tabIds: number[] = await Promise.all(group.items.map(async i => + (await createTab(i.url, windowId, discard, group.pinned)).id! + )); + + // "Pinned" group is technically not a group, so not much else to do here + // and Firefox doesn't even support tab groups + if (group.pinned === true || import.meta.env.FIREFOX) + return; + + const groupId: number = await chrome.tabs.group({ + tabIds, createProperties: { + windowId + } + }); + + await chrome.tabGroups.update(groupId, { + title: group.title, + color: group.color + }); +} + +async function manageWindow(handle: (windowId: number) => Promise, windowProps?: Windows.CreateCreateDataType): Promise +{ + const currentWindow: Windows.Window = windowProps ? + await browser.windows.create({ url: "about:blank", focused: true, ...windowProps }) : + await browser.windows.getCurrent(); + const windowId: number = currentWindow.id!; + + await handle(windowId); + + if (windowProps) + // Close "about:blank" tab + await browser.tabs.remove(currentWindow.tabs![0].id!); +} + +async function createTab(url: string, windowId: number, discard: boolean, pinned?: boolean): Promise +{ + const tab = await browser.tabs.create({ url, windowId: windowId, active: false, pinned }); + + if (discard) + discardOnLoad(tab.id!); + + return tab; +} + +function discardOnLoad(tabId: number): void +{ + const handleTabUpdated = (id: number, _: any, tab: Tabs.Tab) => + { + if (id !== tabId || !tab.url) + return; + + browser.tabs.onUpdated.removeListener(handleTabUpdated); + + if (!tab.active) + browser.tabs.discard(tabId); + }; + + browser.tabs.onUpdated.addListener(handleTabUpdated); +} diff --git a/entrypoints/sidepanel/utils/sortCollections.ts b/entrypoints/sidepanel/utils/sortCollections.ts new file mode 100644 index 0000000..5e1aa69 --- /dev/null +++ b/entrypoints/sidepanel/utils/sortCollections.ts @@ -0,0 +1,23 @@ +import { getCollectionTitle } from "@/entrypoints/sidepanel/utils/getCollectionTitle"; +import { CollectionItem } from "@/models/CollectionModels"; + +export default function sortCollections( + collections: CollectionItem[], + mode?: CollectionSortMode | null +): CollectionItem[] +{ + return sorters[mode ?? "custom"]([...collections]); +} + +export type CollectionSortMode = "ascending" | "descending" | "newest" | "oldest" | "custom"; + +const sorters: Record = +{ + ascending: i => i.sort((a, b) => getCollectionTitle(a).localeCompare(getCollectionTitle(b))), + descending: i => i.sort((a, b) => getCollectionTitle(b).localeCompare(getCollectionTitle(a))), + newest: i => i.sort((a, b) => b.timestamp - a.timestamp), + oldest: i => i.sort((a, b) => a.timestamp - b.timestamp), + custom: i => i +}; + +type CollectionSorter = (collections: CollectionItem[]) => CollectionItem[]; diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..d31604d --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,101 @@ +import css from "@eslint/css"; +import js from "@eslint/js"; +import json from "@eslint/json"; +import stylistic from "@stylistic/eslint-plugin"; +import pluginReact from "eslint-plugin-react"; +import { defineConfig } from "eslint/config"; +import globals from "globals"; +import tseslint from "typescript-eslint"; + +export default defineConfig([ + { + ignores: [".wxt/", ".output/"] + }, + { files: ["**/*.{js,mjs,cjs,ts,jsx,tsx}"], plugins: { js }, extends: ["js/recommended"] }, + { files: ["**/*.{js,mjs,cjs,ts,jsx,tsx}"], languageOptions: { globals: globals.browser } }, + { files: ["**/*.{js,mjs,cjs,ts,jsx,tsx}"], extends: [tseslint.configs.recommended] }, + { files: ["**/*.{js,mjs,cjs,ts,jsx,tsx}"], extends: [pluginReact.configs.flat.recommended] }, + { files: ["**/*.{js,mjs,cjs,ts,jsx,tsx}"], extends: [stylistic.configs.recommended] }, + { files: ["**/*.css"], plugins: { css }, language: "css/css", extends: ["css/recommended"] }, + { + files: ["**/*.{jsonc,json}"], + plugins: { json }, + language: "json/jsonc", + extends: ["json/recommended"] + }, + { + files: ["**/*.json"], + ignores: [".devcontainer/devcontainer.json"], + plugins: { json }, + language: "json/json", + extends: ["json/recommended"] + }, + { + files: ["**/*.{js,mjs,cjs,ts,jsx,tsx}"], + settings: + { + react: + { + version: "detect" + } + } + }, + { + files: ["**/*.{js,mjs,cjs,ts,jsx,tsx}"], + plugins: { + "@stylistic": stylistic + }, + rules: + { + "@stylistic/semi": ["error", "always"], + "@stylistic/block-spacing": ["warn", "always"], + "@stylistic/arrow-spacing": ["warn", { before: true, after: true }], + "@stylistic/indent": ["warn", "tab"], + "@stylistic/quotes": ["error", "double"], + "@stylistic/comma-spacing": ["warn"], + "@stylistic/comma-dangle": ["warn", "never"], + "@stylistic/no-tabs": ["warn", { allowIndentationTabs: true }], + "@stylistic/brace-style": ["warn", "allman", { allowSingleLine: true }], + "@stylistic/member-delimiter-style": ["error", { multiline: { delimiter: "semi", requireLast: true }, singleline: { delimiter: "semi", requireLast: true } }], + "@stylistic/jsx-curly-spacing": ["warn", { when: "always", children: true, attributes: true }], + "react/react-in-jsx-scope": ["off"], + "@stylistic/jsx-indent-props": ["warn", "tab"], + "@stylistic/jsx-max-props-per-line": ["off"], + "@stylistic/indent-binary-ops": ["warn", "tab"], + "@stylistic/no-multiple-empty-lines": ["warn"], + "@stylistic/operator-linebreak": ["off"], + "@stylistic/jsx-wrap-multilines": ["off"], + "@typescript-eslint/no-explicit-any": ["off"], + "@stylistic/jsx-curly-newline": ["off"], + "@stylistic/jsx-tag-spacing": + [ + "warn", + { closingSlash: "never", beforeSelfClosing: "always", afterOpening: "never" } + ], + "@stylistic/jsx-closing-bracket-location": + [ + "warn", + { nonEmpty: "tag-aligned", selfClosing: "after-props" } + ], + "@stylistic/jsx-first-prop-new-line": ["warn", "multiline"], + "@stylistic/jsx-one-expression-per-line": ["off"], + "@stylistic/jsx-closing-tag-location": ["warn"], + "@stylistic/arrow-parens": ["off"], + "@stylistic/quote-props": ["off"], + "@stylistic/multiline-ternary": ["warn"], + "@stylistic/no-trailing-spaces": ["warn"], + "@stylistic/no-mixed-spaces-and-tabs": ["warn"], + "@typescript-eslint/no-unused-vars": ["warn"], + "prefer-const": ["warn"], + "@stylistic/padded-blocks": ["warn"] + } + }, + { + files: ["**/*.css"], + plugins: { css }, + rules: + { + "css/use-baseline": ["off"] + } + } +]); diff --git a/features/collectionStorage/index.ts b/features/collectionStorage/index.ts new file mode 100644 index 0000000..2e5983d --- /dev/null +++ b/features/collectionStorage/index.ts @@ -0,0 +1,9 @@ +import { collectionStorage } from "./utils/collectionStorage"; +export * from "./utils/getCollections"; + +export { default as getCollections } from "./utils/getCollections"; +export { default as resoveConflict } from "./utils/resolveConflict"; +export { default as saveCollections } from "./utils/saveCollections"; + +export const collectionCount = collectionStorage.count; +export const graphics = collectionStorage.graphics; diff --git a/features/collectionStorage/utils/collectionStorage.ts b/features/collectionStorage/utils/collectionStorage.ts new file mode 100644 index 0000000..e6443e4 --- /dev/null +++ b/features/collectionStorage/utils/collectionStorage.ts @@ -0,0 +1,12 @@ +import { CollectionItem, GraphicsStorage } from "@/models/CollectionModels"; + +export const collectionStorage = +{ + chunkCount: storage.defineItem("sync:chunkCount", { fallback: 0 }), + syncLastUpdated: storage.defineItem("sync:lastUpdated", { fallback: 0 }), + localLastUpdated: storage.defineItem("local:lastUpdated", { fallback: 0 }), + localCollections: storage.defineItem("local:collections", { fallback: [] }), + count: storage.defineItem("local:count", { fallback: 0 }), + graphics: storage.defineItem("local:graphics", { fallback: {} }), + maxChunkCount: 12 +}; diff --git a/features/collectionStorage/utils/getChunkKeys.ts b/features/collectionStorage/utils/getChunkKeys.ts new file mode 100644 index 0000000..06222d2 --- /dev/null +++ b/features/collectionStorage/utils/getChunkKeys.ts @@ -0,0 +1,6 @@ +import { collectionStorage } from "./collectionStorage"; + +export default function getChunkKeys(start: number = 0, end: number = collectionStorage.maxChunkCount): string[] +{ + return Array.from({ length: end - start }, (_, i) => "c" + (i + start)); +} diff --git a/features/collectionStorage/utils/getCollections.ts b/features/collectionStorage/utils/getCollections.ts new file mode 100644 index 0000000..3e81897 --- /dev/null +++ b/features/collectionStorage/utils/getCollections.ts @@ -0,0 +1,36 @@ +import { CollectionItem } from "@/models/CollectionModels"; +import { collectionStorage } from "./collectionStorage"; +import getCollectionsFromCloud from "./getCollectionsFromCloud"; +import getCollectionsFromLocal from "./getCollectionsFromLocal"; +import saveCollectionsToLocal from "./saveCollectionsToLocal"; +import getLogger from "@/utils/getLogger"; + +const logger = getLogger("getCollections"); + +export default async function getCollections(): Promise<[CollectionItem[], CloudStorageIssueType | null]> +{ + const lastUpdatedLocal: number = await collectionStorage.localLastUpdated.getValue(); + const lastUpdatedSync: number = await collectionStorage.syncLastUpdated.getValue(); + + if (lastUpdatedLocal === lastUpdatedSync) + return [await getCollectionsFromLocal(), null]; + + if (lastUpdatedLocal > lastUpdatedSync) + return [await getCollectionsFromLocal(), "merge_conflict"]; + + try + { + const collections: CollectionItem[] = await getCollectionsFromCloud(); + await saveCollectionsToLocal(collections, lastUpdatedSync); + + return [collections, null]; + } + catch (ex) + { + logger("Failed to get cloud storage"); + console.error(ex); + return [await getCollectionsFromLocal(), "parse_error"]; + } +} + +export type CloudStorageIssueType = "parse_error" | "merge_conflict"; diff --git a/features/collectionStorage/utils/getCollectionsFromCloud.ts b/features/collectionStorage/utils/getCollectionsFromCloud.ts new file mode 100644 index 0000000..e04a915 --- /dev/null +++ b/features/collectionStorage/utils/getCollectionsFromCloud.ts @@ -0,0 +1,20 @@ +import { CollectionItem } from "@/models/CollectionModels"; +import { decompress } from "lzutf8"; +import { collectionStorage } from "./collectionStorage"; +import getChunkKeys from "./getChunkKeys"; +import parseCollections from "./parseCollections"; + +export default async function getCollectionsFromCloud(): Promise +{ + const chunkCount: number = await collectionStorage.chunkCount.getValue(); + + if (chunkCount < 1) + return []; + + const chunks: Record = + await browser.storage.sync.get(getChunkKeys(0, chunkCount)) as Record; + + const data: string = decompress(Object.values(chunks).join(), { inputEncoding: "StorageBinaryString" }); + + return parseCollections(data); +} diff --git a/features/collectionStorage/utils/getCollectionsFromLocal.ts b/features/collectionStorage/utils/getCollectionsFromLocal.ts new file mode 100644 index 0000000..f3d4c52 --- /dev/null +++ b/features/collectionStorage/utils/getCollectionsFromLocal.ts @@ -0,0 +1,7 @@ +import { CollectionItem } from "@/models/CollectionModels"; +import { collectionStorage } from "./collectionStorage"; + +export default async function getCollectionsFromLocal(): Promise +{ + return await collectionStorage.localCollections.getValue(); +} diff --git a/features/collectionStorage/utils/parseCollections.ts b/features/collectionStorage/utils/parseCollections.ts new file mode 100644 index 0000000..fd74191 --- /dev/null +++ b/features/collectionStorage/utils/parseCollections.ts @@ -0,0 +1,80 @@ +import { CollectionItem, GroupItem, TabItem } from "@/models/CollectionModels"; + +export default function parseCollections(data: string): CollectionItem[] +{ + if (!data) + return []; + + const collections: CollectionItem[] = []; + const lines: string[] = data.split("\n"); + + for (const line of lines) + { + if (line.startsWith("c")) + { + const collection: CollectionItem = parseCollection(line); + collections.push(collection); + } + else if (line.startsWith("\tg")) + { + const group: GroupItem = parseGroup(line); + collections[collections.length - 1].items.push(group); + } + else if (line.startsWith("\t\tt")) + { + const tab: TabItem = parseTab(line); + + const collectionIndex: number = collections.length - 1; + const groupIndex: number = collections[collectionIndex].items.length - 1; + + (collections[collectionIndex].items[groupIndex] as GroupItem).items.push(tab); + } + else if (line.startsWith("\tt")) + { + const tab: TabItem = parseTab(line); + collections[collections.length - 1].items.push(tab); + } + } + + return collections; +} + +function parseCollection(data: string): CollectionItem +{ + return { + type: "collection", + timestamp: parseInt(data.match(/(?<=^c)\d+/)!.toString()), + color: data.match(/(?<=^c\d+\/)[a-z]+/)?.toString() as chrome.tabGroups.ColorEnum, + title: data.match(/(?<=^c[\da-z/]*\|).*/)?.toString(), + items: [] + }; +} + +function parseGroup(data: string): GroupItem +{ + const isPinned: boolean = data.match(/^\tg\/p$/) !== null; + + if (isPinned) + return { + type: "group", + pinned: true, + items: [] + }; + + return { + type: "group", + pinned: false, + color: data.match(/(?<=^\tg\/)[a-z]+/)?.toString() as chrome.tabGroups.ColorEnum, + title: data.match(/(?<=^\tg\/[a-z]+\|).*$/)?.toString(), + items: [] + }; +} + +function parseTab(data: string): TabItem +{ + return { + type: "tab", + url: data.match(/(?<=^(\t){1,2}t\|).*(?=\|)/)!.toString(), + title: data.match(/(?<=^(\t){1,2}t\|.*\|).*$/)?.toString() + }; +} diff --git a/features/collectionStorage/utils/resolveConflict.ts b/features/collectionStorage/utils/resolveConflict.ts new file mode 100644 index 0000000..2b0e463 --- /dev/null +++ b/features/collectionStorage/utils/resolveConflict.ts @@ -0,0 +1,41 @@ +import { CollectionItem } from "@/models/CollectionModels"; +import getLogger from "@/utils/getLogger"; +import { collectionStorage } from "./collectionStorage"; +import getCollectionsFromCloud from "./getCollectionsFromCloud"; +import getCollectionsFromLocal from "./getCollectionsFromLocal"; +import saveCollectionsToCloud from "./saveCollectionsToCloud"; +import saveCollectionsToLocal from "./saveCollectionsToLocal"; + +const logger = getLogger("resolveConflict"); + +export default function resolveConflict(acceptSource: "local" | "sync"): Promise +{ + if (acceptSource === "local") + return replaceCloudWithLocal(); + + return replaceLocalWithCloud(); +} + +async function replaceCloudWithLocal(): Promise +{ + const collections: CollectionItem[] = await getCollectionsFromLocal(); + const lastUpdated: number = await collectionStorage.localLastUpdated.getValue(); + + await saveCollectionsToCloud(collections, lastUpdated); +} + +async function replaceLocalWithCloud(): Promise +{ + try + { + const collections: CollectionItem[] = await getCollectionsFromCloud(); + const lastUpdated: number = await collectionStorage.syncLastUpdated.getValue(); + + await saveCollectionsToLocal(collections, lastUpdated); + } + catch (ex) + { + logger("Failed to get cloud storage"); + console.error(ex); + } +} diff --git a/features/collectionStorage/utils/saveCollections.ts b/features/collectionStorage/utils/saveCollections.ts new file mode 100644 index 0000000..e266b84 --- /dev/null +++ b/features/collectionStorage/utils/saveCollections.ts @@ -0,0 +1,44 @@ +import { CollectionItem, GraphicsStorage } from "@/models/CollectionModels"; +import getLogger from "@/utils/getLogger"; +import sendNotification from "@/utils/sendNotification"; +import saveCollectionsToCloud from "./saveCollectionsToCloud"; +import saveCollectionsToLocal from "./saveCollectionsToLocal"; +import updateGraphics from "./updateGraphics"; + +const logger = getLogger("saveCollections"); + +export default async function saveCollections( + collections: CollectionItem[], + updateCloud: boolean = true, + graphicsCache?: GraphicsStorage +): Promise +{ + const timestamp: number = Date.now(); + await saveCollectionsToLocal(collections, timestamp); + + if (updateCloud) + try + { + await saveCollectionsToCloud(collections, timestamp); + } + catch (ex) + { + logger("Failed to save cloud storage"); + console.error(ex); + + if ((ex as Error).message.includes("MAX_WRITE_OPERATIONS_PER_MINUTE")) + await sendNotification({ + title: i18n.t("notifications.error_quota_exceeded.title"), + message: i18n.t("notifications.error_quota_exceeded.message"), + icon: "/notification_icons/cloud_error.png" + }); + else + await sendNotification({ + title: i18n.t("notifications.error_storage_full.title"), + message: i18n.t("notifications.error_storage_full.message"), + icon: "/notification_icons/cloud_error.png" + }); + } + + await updateGraphics(collections, graphicsCache); +}; diff --git a/features/collectionStorage/utils/saveCollectionsToCloud.ts b/features/collectionStorage/utils/saveCollectionsToCloud.ts new file mode 100644 index 0000000..392aafa --- /dev/null +++ b/features/collectionStorage/utils/saveCollectionsToCloud.ts @@ -0,0 +1,55 @@ +import { CollectionItem } from "@/models/CollectionModels"; +import { compress } from "lzutf8"; +import { WxtStorageItem } from "wxt/storage"; +import { collectionStorage } from "./collectionStorage"; +import getChunkKeys from "./getChunkKeys"; +import serializeCollections from "./serializeCollections"; + +export default async function saveCollectionsToCloud(collections: CollectionItem[], timestamp: number): Promise +{ + if (!collections || collections.length < 1) + { + await collectionStorage.chunkCount.setValue(0); + await browser.storage.sync.remove(getChunkKeys()); + return; + } + + const data: string = compress(serializeCollections(collections), { outputEncoding: "StorageBinaryString" }); + const chunks: string[] = splitIntoChunks(data); + + if (chunks.length > collectionStorage.maxChunkCount) + throw new Error("Data is too large to be stored in sync storage."); + + // Since there's a limit for cloud write operations, we need to write all chunks in one go. + const newRecords: Record = + { + [getStorageKey(collectionStorage.chunkCount)]: chunks.length, + [getStorageKey(collectionStorage.syncLastUpdated)]: timestamp + }; + + for (let i = 0; i < chunks.length; i++) + newRecords[`c${i}`] = chunks[i]; + + await browser.storage.sync.set(newRecords); + + if (chunks.length < collectionStorage.maxChunkCount) + await browser.storage.sync.remove(getChunkKeys(chunks.length)); +} + +function splitIntoChunks(data: string): string[] +{ + // QUOTA_BYTES_PER_ITEM includes length of key name, length of content and 2 more bytes (for unknown reason). + const chunkKey: string = getChunkKeys(collectionStorage.maxChunkCount - 1)[0]; + const chunkSize = (chrome.storage.sync.QUOTA_BYTES_PER_ITEM ?? 8192) - chunkKey.length - 2; + const chunks: string[] = []; + + for (let i = 0; i < data.length; i += chunkSize) + chunks.push(data.slice(i, i + chunkSize)); + + return chunks; +} + +function getStorageKey(storageItem: WxtStorageItem): string +{ + return storageItem.key.split(":")[1]; +} diff --git a/features/collectionStorage/utils/saveCollectionsToLocal.ts b/features/collectionStorage/utils/saveCollectionsToLocal.ts new file mode 100644 index 0000000..f6707bb --- /dev/null +++ b/features/collectionStorage/utils/saveCollectionsToLocal.ts @@ -0,0 +1,9 @@ +import { CollectionItem } from "@/models/CollectionModels"; +import { collectionStorage } from "./collectionStorage"; + +export default async function saveCollectionsToLocal(collections: CollectionItem[], timestamp: number): Promise +{ + await collectionStorage.localCollections.setValue(collections); + await collectionStorage.count.setValue(collections.length); + await collectionStorage.localLastUpdated.setValue(timestamp); +} diff --git a/features/collectionStorage/utils/serializeCollections.ts b/features/collectionStorage/utils/serializeCollections.ts new file mode 100644 index 0000000..76d7c8d --- /dev/null +++ b/features/collectionStorage/utils/serializeCollections.ts @@ -0,0 +1,74 @@ +import { CollectionItem, GroupItem, TabItem } from "@/models/CollectionModels"; + +export default function serializeCollections(collections: CollectionItem[]): string +{ + let data: string = ""; + + for (const collection of collections) + { + data += getCollectionString(collection); + + for (const item of collection.items) + { + if (item.type === "group") + { + data += getGroupString(item); + + for (const tab of item.items) + data += `\t${getTabString(tab)}`; + } + else if (item.type === "tab") + data += getTabString(item); + } + } + + return data; +} + +function getCollectionString(collection: CollectionItem): string +{ + let data: string = `c${collection.timestamp}`; + + if (collection.color) + data += `/${collection.color}`; + + if (collection.title) + data += `|${collection.title}`; + + data += "\n"; + + return data; +} + +function getGroupString(group: GroupItem): string +{ + let data: string = "\tg"; + + if (group.pinned === true) + data += "/p"; + else + { + data += `/${group.color}`; + + if (group.title) + data += `|${group.title}`; + } + + data += "\n"; + + return data; +} + +function getTabString(tab: TabItem): string +{ + let data: string = "\tt"; + + data += `|${tab.url}|`; + + if (tab.title) + data += tab.title; + + data += "\n"; + + return data; +} diff --git a/features/collectionStorage/utils/updateGraphics.ts b/features/collectionStorage/utils/updateGraphics.ts new file mode 100644 index 0000000..2b09ce1 --- /dev/null +++ b/features/collectionStorage/utils/updateGraphics.ts @@ -0,0 +1,51 @@ +import { CollectionItem, GraphicsItem, GraphicsStorage } from "@/models/CollectionModels"; +import { sendMessage } from "@/utils/messaging"; +import { collectionStorage } from "./collectionStorage"; + +export default async function updateGraphics( + collections: CollectionItem[], + graphicsCache?: GraphicsStorage +): Promise +{ + const localGraphics: GraphicsStorage = await collectionStorage.graphics.getValue(); + const tempGraphics: GraphicsStorage = graphicsCache || await sendMessage("getGraphicsCache", undefined); + + function getGraphics(url: string): GraphicsItem | null + { + const preview = tempGraphics[url]?.preview ?? localGraphics[url]?.preview; + const icon = tempGraphics[url]?.icon ?? localGraphics[url]?.icon; + + const graphics: GraphicsItem = {}; + + if (preview) + graphics.preview = preview; + if (icon) + graphics.icon = icon; + + return preview || icon ? graphics : null; + } + + const newGraphics: GraphicsStorage = {}; + + for (const collection of collections) + for (const item of collection.items) + { + if (item.type === "group") + for (const tab of item.items) + { + const graphics = getGraphics(tab.url); + + if (graphics) + newGraphics[tab.url] = graphics; + } + else + { + const graphics = getGraphics(item.url); + + if (graphics) + newGraphics[item.url] = graphics; + } + } + + await collectionStorage.graphics.setValue(newGraphics); +} diff --git a/features/migration/hooks/useLocalMigration.ts b/features/migration/hooks/useLocalMigration.ts new file mode 100644 index 0000000..80b60bf --- /dev/null +++ b/features/migration/hooks/useLocalMigration.ts @@ -0,0 +1,10 @@ +import migrateLocalStorage from "../utils/migrateLocalStorage"; + +export default function useLocalMigration(): void +{ + useEffect(() => + { + if (globalThis.localStorage?.getItem("sets")) + migrateLocalStorage().then(() => document.location.reload()); + }, []); +} diff --git a/features/migration/index.ts b/features/migration/index.ts new file mode 100644 index 0000000..a3b01ea --- /dev/null +++ b/features/migration/index.ts @@ -0,0 +1,2 @@ +export { default as useLocalMigration } from "./hooks/useLocalMigration"; +export { default as migrateStorage } from "./utils/migrateStorage"; diff --git a/features/migration/models/LegacyModels.ts b/features/migration/models/LegacyModels.ts new file mode 100644 index 0000000..1c91228 --- /dev/null +++ b/features/migration/models/LegacyModels.ts @@ -0,0 +1,15 @@ +export type LegacyCollection = + { + timestamp: number; + tabsCount: number; + titles: string[]; + links: string[]; + icons?: string[]; + thumbnails?: string[]; + }; + +export type LegacyGraphics = + { + pageCapture?: string; + iconUrl?: string; + }; diff --git a/features/migration/utils/migrateCollections.ts b/features/migration/utils/migrateCollections.ts new file mode 100644 index 0000000..6197794 --- /dev/null +++ b/features/migration/utils/migrateCollections.ts @@ -0,0 +1,38 @@ +import { CollectionItem, GraphicsStorage, TabItem } from "@/models/CollectionModels"; +import { LegacyCollection } from "../models/LegacyModels"; + +export default function migrateCollections(legacyCollections: LegacyCollection[]): [CollectionItem[], GraphicsStorage] +{ + const collections: CollectionItem[] = []; + const graphics: GraphicsStorage = {}; + + for (let i = 0; i < legacyCollections.length; i++) + { + const legacyCollection: LegacyCollection = legacyCollections[i]; + const items: TabItem[] = legacyCollection.links.map((url, index) => + { + const title: string | undefined = legacyCollection.titles[index]; + const icon: string | undefined = legacyCollection.icons?.[index]; + const preview: string | undefined = legacyCollection.thumbnails?.[index]; + + if (!graphics[url]) + graphics[url] = { icon, preview }; + else + graphics[url] = { icon: graphics[url].icon ?? icon, preview: graphics[url].preview ?? preview }; + + return { + type: "tab", + url, + title + }; + }); + + collections.push({ + type: "collection", + timestamp: legacyCollection.timestamp, + items + }); + } + + return [collections, graphics]; +} diff --git a/features/migration/utils/migrateLocalStorage.ts b/features/migration/utils/migrateLocalStorage.ts new file mode 100644 index 0000000..4c6a0e9 --- /dev/null +++ b/features/migration/utils/migrateLocalStorage.ts @@ -0,0 +1,18 @@ +import { getCollections } from "@/features/collectionStorage"; +import saveCollections from "@/features/collectionStorage/utils/saveCollections"; +import { LegacyCollection } from "../models/LegacyModels"; +import migrateCollections from "./migrateCollections"; + +export default async function migrateLocalStorage(): Promise +{ + // Retrieve v1 collections + const legacyCollections: LegacyCollection[] = JSON.parse(globalThis.localStorage?.getItem("sets") || "[]"); + + // Nuke localStorage + globalThis.localStorage?.clear(); + + // Migrate collections + const [resultCollections, resultGraphics] = migrateCollections(legacyCollections); + const [collections] = await getCollections(); + await saveCollections([...collections, ...resultCollections], true, resultGraphics); +} diff --git a/features/migration/utils/migrateStorage.ts b/features/migration/utils/migrateStorage.ts new file mode 100644 index 0000000..92b5b9d --- /dev/null +++ b/features/migration/utils/migrateStorage.ts @@ -0,0 +1,60 @@ +import { saveCollections } from "@/features/collectionStorage"; +import { GraphicsStorage } from "@/models/CollectionModels"; +import { settings } from "@/utils/settings"; +import { decompress } from "lzutf8"; +import { LegacyCollection, LegacyGraphics } from "../models/LegacyModels"; +import migrateCollections from "./migrateCollections"; + +export default async function migrateStorage(): Promise +{ + // Retrieve settings + const loadOnRestore: boolean | null = await storage.getItem("sync:loadOnRestore"); + const setAsideOnClick: boolean | null = await storage.getItem("sync:setAsideOnClick"); + const showDeleteDialog: boolean | null = await storage.getItem("sync:showDeleteDialog"); + const listView: boolean | null = await storage.getItem("sync:listview"); + + // Retrieve v2 collections + const legacyCollections: LegacyCollection[] = []; + Object.entries(await browser.storage.sync.get(null)).forEach(([key, value]) => + { + if (key.startsWith("set_")) + legacyCollections.push({ + ...JSON.parse(decompress(value, { inputEncoding: "StorageBinaryString" })), + timestamp: parseInt(key.substring(4)) + }); + }); + + // Retrieve v2 graphics + const v2Graphics: Record = await storage.getItem("local:thumbnails") ?? {}; + + // Nuke everything + await browser.storage.local.clear(); + await browser.storage.sync.clear(); + + // Migrate collections & graphics + const [collections] = migrateCollections(legacyCollections); + const graphics: GraphicsStorage = {}; + + for (const [key, record] of Object.entries(v2Graphics)) + { + if (!graphics[key]) + graphics[key] = { icon: record.iconUrl, preview: record.pageCapture }; + else + { + graphics[key].icon ??= record.iconUrl; + graphics[key].preview ??= record.pageCapture; + } + } + + await saveCollections(collections, true, graphics); + + // Migrate settings + if (loadOnRestore !== null) + settings.dismissOnLoad.setValue(!loadOnRestore); + if (setAsideOnClick !== null) + settings.contextAction.setValue(setAsideOnClick ? "action" : "open"); + if (showDeleteDialog !== null) + settings.deletePrompt.setValue(showDeleteDialog); + if (listView !== null) + settings.tilesView.setValue(!listView); +} diff --git a/features/v3welcome/components/WelcomeDialog.tsx b/features/v3welcome/components/WelcomeDialog.tsx new file mode 100644 index 0000000..391b9cf --- /dev/null +++ b/features/v3welcome/components/WelcomeDialog.tsx @@ -0,0 +1,68 @@ +import { useTheme } from "@/contexts/ThemeProvider"; +import { v3blogPost } from "@/data/links"; +import extLink from "@/utils/extLink"; +import * as fui from "@fluentui/react-components"; + +export default function WelcomeDialog(): React.ReactElement +{ + const { isDark } = useTheme(); + const cls = useStyles(); + + return ( + + + + + + { i18n.t("features.v3welcome.title") } + + + { i18n.t("features.v3welcome.text1") } + + + { i18n.t("features.v3welcome.text2") } + +
    + { !import.meta.env.FIREFOX && +
  • { i18n.t("features.v3welcome.list.item1") }
  • + } +
  • { i18n.t("features.v3welcome.list.item2") }
  • +
  • { i18n.t("features.v3welcome.list.item3") }
  • +
  • { i18n.t("features.v3welcome.list.item4") }
  • +
  • { i18n.t("features.v3welcome.list.item5") }
  • +
+ + { i18n.t("features.v3welcome.text3") } + + +
+ + + + + { i18n.t("features.v3welcome.actions.visit_blog") } + + + + + { i18n.t("common.actions.close") } + + + +
+
+ ); +} + +const useStyles = fui.makeStyles({ + root: + { + display: "flex", + flexFlow: "column", + gap: fui.tokens.spacingVerticalS + }, + image: + { + display: "contents" + } +}); diff --git a/features/v3welcome/hooks/useWelcomeDialog.tsx b/features/v3welcome/hooks/useWelcomeDialog.tsx new file mode 100644 index 0000000..36f7fd8 --- /dev/null +++ b/features/v3welcome/hooks/useWelcomeDialog.tsx @@ -0,0 +1,17 @@ +import { useDialog } from "@/contexts/DialogProvider"; +import WelcomeDialog from "../components/WelcomeDialog"; +import { showWelcomeDialog } from "../utils/showWelcomeDialog"; + +export default function useWelcomeDialog(): void +{ + const dialog = useDialog(); + + useEffect(() => + { + showWelcomeDialog.getValue().then(showWelcome => + { + if (showWelcome || import.meta.env.DEV) + dialog.pushCustom(, undefined, () => showWelcomeDialog.removeValue()); + }); + }, []); +} diff --git a/features/v3welcome/index.ts b/features/v3welcome/index.ts new file mode 100644 index 0000000..7f2d83f --- /dev/null +++ b/features/v3welcome/index.ts @@ -0,0 +1,2 @@ +export { default as useWelcomeDialog } from "./hooks/useWelcomeDialog"; +export { showWelcomeDialog } from "./utils/showWelcomeDialog"; diff --git a/features/v3welcome/utils/showWelcomeDialog.ts b/features/v3welcome/utils/showWelcomeDialog.ts new file mode 100644 index 0000000..064da88 --- /dev/null +++ b/features/v3welcome/utils/showWelcomeDialog.ts @@ -0,0 +1,6 @@ +export const showWelcomeDialog = storage.defineItem( + "local:showWelcome", + { + fallback: false + } +); diff --git a/hooks/useBmcStyles.ts b/hooks/useBmcStyles.ts new file mode 100644 index 0000000..2fc7a2b --- /dev/null +++ b/hooks/useBmcStyles.ts @@ -0,0 +1,13 @@ +import { makeStyles } from "@fluentui/react-components"; + +export const useBmcStyles = makeStyles({ + button: + { + backgroundColor: "#ff813f", + + "&:hover, &:hover:active": + { + backgroundColor: "#ff6b1c" + } + } +}); diff --git a/hooks/useDangerStyles.ts b/hooks/useDangerStyles.ts new file mode 100644 index 0000000..787d9ae --- /dev/null +++ b/hooks/useDangerStyles.ts @@ -0,0 +1,28 @@ +import { makeStyles, tokens } from "@fluentui/react-components"; + +export const useDangerStyles = makeStyles({ + menuItem: + { + color: tokens.colorStatusDangerForeground1 + " !important", + + "& .fui-MenuItem__icon": + { + color: tokens.colorStatusDangerForeground1 + " !important" + } + }, + buttonPrimary: + { + backgroundColor: tokens.colorStatusDangerBackground3, + color: tokens.colorNeutralForegroundStaticInverted, + + "&:hover": + { + backgroundColor: tokens.colorStatusDangerBackground3Hover, + + "&:active": + { + backgroundColor: tokens.colorStatusDangerBackground3Pressed + } + } + } +}); diff --git a/hooks/useGroupColors.ts b/hooks/useGroupColors.ts new file mode 100644 index 0000000..2ab500e --- /dev/null +++ b/hooks/useGroupColors.ts @@ -0,0 +1,49 @@ +import { makeStyles, tokens } from "@fluentui/react-components"; + +export const useGroupColors: () => Record = makeStyles({ + blue: + { + "--border": tokens.colorPaletteBlueBorderActive, + "--text": tokens.colorNeutralForegroundInverted + }, + cyan: + { + "--border": tokens.colorPaletteTealBorderActive, + "--text": tokens.colorNeutralForegroundInverted + }, + green: + { + "--border": tokens.colorPaletteGreenBorderActive, + "--text": tokens.colorNeutralForegroundInverted + }, + grey: + { + "--border": tokens.colorPalettePlatinumBorderActive, + "--text": tokens.colorNeutralForegroundInverted + }, + orange: + { + "--border": tokens.colorPalettePeachBorderActive, + "--text": tokens.colorNeutralForegroundInverted + }, + pink: + { + "--border": tokens.colorPalettePinkBorderActive, + "--text": tokens.colorNeutralForegroundInverted + }, + purple: + { + "--border": tokens.colorPalettePurpleBorderActive, + "--text": tokens.colorNeutralForegroundStaticInverted + }, + red: + { + "--border": tokens.colorPaletteRedBackground3, + "--text": tokens.colorNeutralForegroundStaticInverted + }, + yellow: + { + "--border": tokens.colorPaletteYellowBorderActive, + "--text": tokens.colorNeutralForeground1Static + } +}); diff --git a/hooks/useSettings.ts b/hooks/useSettings.ts new file mode 100644 index 0000000..3000497 --- /dev/null +++ b/hooks/useSettings.ts @@ -0,0 +1,24 @@ +import { settings } from "@/utils/settings"; + +export default function useSettings(key: K): SettingsHook +{ + const [value, setValue] = useState | null>(null); + + useEffect(() => + { + settings[key].getValue() + .then(value => setValue(value as SettingsValue)); + + const unwatch = settings[key].watch(value => setValue(value as SettingsValue)); + + return () => unwatch(); + }, [key]); + + return [value, settings[key].setValue] as SettingsHook; +} + +export type SettingsValue = + typeof settings[K] extends { fallback: infer T; } ? T : never; + +export type SettingsHook = + [SettingsValue | null, (newValue: SettingsValue) => Promise]; diff --git a/hooks/useStorageInfo.ts b/hooks/useStorageInfo.ts new file mode 100644 index 0000000..ed736a0 --- /dev/null +++ b/hooks/useStorageInfo.ts @@ -0,0 +1,27 @@ +export default function useStorageInfo(): StorageInfoHook +{ + const [bytesInUse, setBytesInUse] = useState(0); + + useEffect(() => + { + const updateValue = async () => + setBytesInUse(await browser.storage.sync.getBytesInUse()); + + updateValue(); + browser.storage.sync.onChanged.addListener(updateValue); + return () => browser.storage.sync.onChanged.removeListener(updateValue); + }, []); + + return { + bytesInUse, + storageQuota: chrome.storage.sync.QUOTA_BYTES ?? 102400, + usedStorageRatio: bytesInUse / (chrome.storage.sync.QUOTA_BYTES ?? 102400) + }; +} + +export type StorageInfoHook = + { + bytesInUse: number; + storageQuota: number; + usedStorageRatio: number; + }; diff --git a/locales/en.yml b/locales/en.yml new file mode 100644 index 0000000..50d1d00 --- /dev/null +++ b/locales/en.yml @@ -0,0 +1,245 @@ +manifest: + name: "Tabs aside" + description: "Save and organize your tabs for later. Pick up where you left off" + author: "Eugene Fox" + +shortcuts: + toggle_sidebar: "Open collection list" + set_aside: "Set tabs aside" + save_tabs: "Save tabs without closing" + +common: + actions: + cancel: "Cancel" + save: "Save" + close: "Close" + delete: "Delete" + reset_filters: "Reset filters" + cta: + feedback: "Leave feedback" + sponsor: "Buy me a coffee" + tooltips: + more: "More" + delete_prompt: "Are you sure? This action cannot be undone." + +features: + v3welcome: + title: "Welcome to Tabs aside 3.0" + text1: "We are happy to announce our new major update for Tabs aside extension!" + text2: "This update brings a brand new UI, and a lot of new features, including:" + list: + item1: "Tab groups support" + item2: "Collection customization" + item3: "Drag and drop reordering and organizing" + item4: "Manual collection creation from scratch" + item5: "And more!" + text3: "Visit our dev blog to learn more about this update and all of its features!" + actions: + visit_blog: "Read dev blog" + +notifications: + tabs_saved: + title: "New collection created" + message: "Your tabs have been saved to a new collection" + error_quota_exceeded: + title: "Maximum cloud write operations exceeded" + message: "We saved your tabs in local storage. You will have to manually update your cloud storage" + error_storage_full: + title: "Your cloud storage is full" + message: "We saved your tabs in local storage. Please clear some space in your cloud storage" + bookmark_saved: + title: "Exported to bookmarks" + message: "Your collection has been exported to bookmarks" + partial_save: + title: "Some tabs couldn't be saved" + message: "Some of the tabs were system tabs we could not access. They were skipped" + +actions: + save: + all: "Save all tabs" + selected: "Save selected tabs" + set_aside: + all: "Set all tabs aside" + selected: "Set selected tabs aside" + show_collections: "Show collections" + +options_page: + title: "Settings" + general: + title: "General" + options: + always_show_toolbars: "Always show toolbars" + include_pinned: "Include pinned tabs when saving all tabs" + show_delete_prompt: "Ask for confirmation when deleting an item" + show_badge: "Show counter badge" + show_notification: "Show notification when saving tabs using context menu" + unload_tabs: "Do not load tabs after opening" + list_locations: + title: "Open collection list in:" + options: + sidebar: "Sidebar" + popup: "Popup" + tab: "Separate tab" + pinned: "Separate pinned tab" + icon_action: + title: "When clicking on the extension icon:" + options: + action: "Perform default save action" + context: "Show context menu" + open: "Open collection list" + change_shortcuts: "Change extension shortcuts" + actions: + title: "Default actions" + options: + save_actions: + title: "Default action when saving tabs" + options: + set_aside: "Save and close tabs" + save: "Save tabs without closing" + restore_actions: + title: "Default action when opening collections" + options: + open: "Just open the tabs" + restore: "Open tabs and remove the collection" + storage: + title: "Storage" + capacity: + title: "Cloud storage capacity" + description: "$1 of $2 KiB" + import: "Import data" + export: "Export data" + import_results: + success: "Data successfully imported" + error: "Provided file appears to be corrupted. Nothing was imported" + import_prompt: + title: "Import data" + warning_title: "This is an irreversible action" + warning_text: "This will overwrite all your data. Make sure you picked a correct file, otherwise data corruption or loss may occur. It is recommended to export data first." + proceed: "Pick a file" + about: + title: "About" + developed_by: "Developed by Eugene Fox" + licensed_under: "Licensed under" + mit_license: "MIT License" + translation_cta: + text: "Found a typo or want a translation for your language?" + button: "Get started here" + links: + website: "My website" + source: "Source code" + changelog: "Changelog" + +collections: + empty: "This collection is empty" + tabs_count: "$1 tabs" + actions: + open: "Open all" + restore: "Restore all" + new_window: "Open all in new window" + incognito: + edge: "Open all in new InPrivate window" + firefox: "Open all in new private window" + chrome: "Open all in incognito window" + incognito_check: + title: "Permissions required" + message: + edge: + p1: "The extension needs permission to open tabs in InPrivate window" + p2: "To do this, click \"Settings\" and then check \"Allow in InPrivate\" option" + firefox: + p1: "The extension needs permission to open tabs in private window" + p2: "To do this, click \"Settings\", go to \"Details\" and set \"Run in Private Windows\" to \"Allow\"" + chrome: + p1: "The extension needs permission to open tabs in incognito window" + p2: "To do this, click \"Settings\" and then check \"Allow in Incognito\" option" + action: "Settings" + menu: + delete: "Delete collection" + add_selected: "Add selected tabs" + add_group: "Add empty group" + add_pinned: "Add pinned group" + export_bookmarks: "Export to bookmarks" + edit: "Edit collection" + +groups: + title: "Group" + pinned: "Pinned" + open: "Open all" + empty: "This group is empty" + menu: + new_window: "Open in new window" + add_selected: "Add selected tabs" + edit: "Edit group" + ungroup: "Ungroup" + delete: "Delete group" + +tabs: + delete: "Delete tab" + +colors: + none: "No color" + any: "Any color" + grey: "Grey" + blue: "Blue" + red: "Red" + yellow: "Yellow" + green: "Green" + pink: "Pink" + purple: "Purple" + cyan: "Cyan" + orange: "Orange" + +dialogs: + edit: + title: + edit_collection: "Edit collection" + edit_group: "Edit group" + new_group: "New group" + new_collection: "New collection" + collection_title: "Title" + color: "Color" + +main: + header: + create_collection: "Create new collection" + menu: + tiles_view: "Tiles view" + changelog: "What's new?" + list: + searchbar: + title: "Search" + filter: "Filter" + sort: + title: "Sort" + options: + newest: "Newest first" + oldest: "Oldest first" + ascending: "From A to Z" + descending: "From Z to A" + custom: "Custom" + empty: + title: "Nothing to show here yet" + message: "Set aside your current tabs, or create a new collection" + empty_search: + title: "Couldn't find anything" + message: "Try to change your search query" + +cta_message: + title: "Like this extension?" + message: "Consider supporting the author with a donation, or" + feedback: "leaving a feedback" + +storage_full_message: + title: "Your cloud storage is almost full ($1%)" + message: "You can free up some space by deleting unused collections." + +parse_error_message: + title: "We couldn't get collections from your cloud storage." + message: "Your cloud storage appears to be corrupted. You can fix it by replacing it with your local copy." + action: "Fix with local copy" + +merge_conflict_message: + title: "Your local and cloud storages have conflicting changes." + message: "To fix this, you can either upload your local copy to the cloud, or accept the cloud changes." + accept_local: "Replace with local" + accept_cloud: "Accept cloud changes" diff --git a/locales/ru.yml b/locales/ru.yml new file mode 100644 index 0000000..5c471a2 --- /dev/null +++ b/locales/ru.yml @@ -0,0 +1,245 @@ +manifest: + name: "ĐžŅ‚ĐģĐžĐļĐĩĐŊĐŊŅ‹Đĩ вĐēĐģадĐēи" + description: "ĐžŅ‚ĐēĐģĐ°Đ´Ņ‹Đ˛Đ°ĐšŅ‚Đĩ и ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇŅƒĐšŅ‚Đĩ ŅĐ˛ĐžĐ¸ вĐēĐģадĐēи. ĐŸŅ€ĐžĐ´ĐžĐģĐļĐ°ĐšŅ‚Đĩ ҁ Ņ‚ĐžĐŗĐž ĐŧĐĩŅŅ‚Đ°, ĐŗĐ´Đĩ ĐžŅŅ‚Đ°ĐŊОвиĐģĐ¸ŅŅŒ" + author: "Đ•Đ˛ĐŗĐĩĐŊиК Đ›Đ¸Ņ" + +shortcuts: + toggle_sidebar: "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ ҁĐŋĐ¸ŅĐžĐē ĐēĐžĐģĐģĐĩĐēŅ†Đ¸Đš" + set_aside: "ĐžŅ‚ĐģĐžĐļĐ¸Ņ‚ŅŒ вĐēĐģадĐēи" + save_tabs: "ĐĄĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ вĐēĐģадĐēи" + +common: + actions: + cancel: "ĐžŅ‚ĐŧĐĩĐŊа" + save: "ĐĄĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ" + close: "ЗаĐēŅ€Ņ‹Ņ‚ŅŒ" + delete: "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ" + reset_filters: "ĐĄĐąŅ€ĐžŅĐ¸Ņ‚ŅŒ Ņ„Đ¸ĐģŅŒŅ‚Ņ€Ņ‹" + cta: + feedback: "ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ ĐžŅ‚ĐˇŅ‹Đ˛" + sponsor: "ПоддĐĩŅ€ĐļĐ°Ņ‚ŅŒ" + tooltips: + more: "Đ•Ņ‰Ņ‘" + delete_prompt: "Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹? Đ­Ņ‚Đž Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Đĩ ĐŊĐĩĐģŅŒĐˇŅ ĐžŅ‚ĐŧĐĩĐŊĐ¸Ņ‚ŅŒ." + +features: + v3welcome: + title: "Đ”ĐžĐąŅ€Đž ĐŋĐžĐļаĐģĐžĐ˛Đ°Ņ‚ŅŒ в ĐžŅ‚ĐģĐžĐļĐĩĐŊĐŊŅ‹Đĩ вĐēĐģадĐēи 3.0" + text1: "ĐœŅ‹ Ņ€Đ°Đ´Ņ‹ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ ĐŊОвОĐĩ йОĐģŅŒŅˆĐžĐĩ ОйĐŊОвĐģĐĩĐŊиĐĩ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐ¸Ņ!" + text2: "Đ­Ņ‚Đž ОйĐŊОвĐģĐĩĐŊиĐĩ вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ ŅĐžĐ˛ĐĩŅ€ŅˆĐĩĐŊĐŊĐž ĐŊĐžĐ˛Ņ‹Đš иĐŊŅ‚ĐĩҀ҄ĐĩĐšŅ и ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛Đž ĐŊĐžĐ˛Ņ‹Ņ… Ņ„ŅƒĐŊĐēŅ†Đ¸Đš, Ņ‚Đ°ĐēĐ¸Ņ… ĐēаĐē:" + list: + item1: "ПоддĐĩŅ€ĐļĐēа ĐŗŅ€ŅƒĐŋĐŋĐ¸Ņ€ĐžĐ˛Đēи вĐēĐģадОĐē" + item2: "ПĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ°Ņ†Đ¸Ņ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸Đš" + item3: "ПĐĩŅ€ĐĩŅ‚Đ°ŅĐēиваĐŊиĐĩ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸Đš и ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛" + item4: "ХОСдаĐŊиĐĩ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸Đš ҁ ĐŊ҃ĐģŅ" + item5: "И ĐŧĐŊĐžĐŗĐžĐĩ Đ´Ņ€ŅƒĐŗĐžĐĩ!" + text3: "ĐŸĐžŅĐĩŅ‚Đ¸Ņ‚Đĩ ĐąĐģĐžĐŗ Ņ€Đ°ĐˇŅ€Đ°ĐąĐžŅ‚Ņ‡Đ¸Đēа (Ņ‚ĐžĐģҌĐēĐž ĐŊа аĐŊĐŗĐģĐ¸ĐšŅĐēĐžĐŧ), Ņ‡Ņ‚ĐžĐąŅ‹ ŅƒĐˇĐŊĐ°Ņ‚ŅŒ йОĐģҌ҈Đĩ Ой ŅŅ‚ĐžĐŧ ОйĐŊОвĐģĐĩĐŊии и Đ˛ŅĐĩŅ… ĐĩĐŗĐž Ņ„ŅƒĐŊĐēŅ†Đ¸ŅŅ…!" + actions: + visit_blog: "Đ§Đ¸Ņ‚Đ°Ņ‚ŅŒ ĐąĐģĐžĐŗ" + +notifications: + tabs_saved: + title: "ХОСдаĐŊа ĐŊĐžĐ˛Đ°Ņ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸Ņ" + message: "Đ’Đ°ŅˆĐ¸ вĐēĐģадĐēи ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊŅ‹ в ĐŊĐžĐ˛ŅƒŅŽ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸ŅŽ" + error_quota_exceeded: + title: "ĐŸŅ€ĐĩĐ˛Ņ‹ŅˆĐĩĐŊ ĐģиĐŧĐ¸Ņ‚ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đš СаĐŋĐ¸ŅĐ¸ в ОйĐģаĐēĐž" + message: "ĐœŅ‹ ŅĐžŅ…Ņ€Đ°ĐŊиĐģи Đ˛Đ°ŅˆĐ¸ вĐēĐģадĐēи в ĐģĐžĐēаĐģҌĐŊĐžĐĩ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ. ВаĐŧ ĐŊ҃ĐļĐŊĐž ĐąŅƒĐ´ĐĩŅ‚ Đ˛Ņ€ŅƒŅ‡ĐŊŅƒŅŽ ОйĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ОйĐģĐ°Ņ‡ĐŊĐžĐĩ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ" + error_storage_full: + title: "ОбĐģĐ°Ņ‡ĐŊĐžĐĩ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ СаĐŋĐžĐģĐŊĐĩĐŊĐž" + message: "ĐœŅ‹ ŅĐžŅ…Ņ€Đ°ĐŊиĐģи Đ˛Đ°ŅˆĐ¸ вĐēĐģадĐēи в ĐģĐžĐēаĐģҌĐŊĐžĐĩ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ. ПоĐļаĐģŅƒĐšŅŅ‚Đ°, ĐžŅĐ˛ĐžĐąĐžĐ´Đ¸Ņ‚Đĩ ĐŧĐĩŅŅ‚Đž в ОйĐģĐ°Ņ‡ĐŊĐžĐŧ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ" + bookmark_saved: + title: "Đ­ĐēҁĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐž в СаĐēĐģадĐēи" + message: "Đ’Đ°ŅˆĐ° ĐēĐžĐģĐģĐĩĐēŅ†Đ¸Ņ ŅĐēҁĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊа в СаĐēĐģадĐēи" + partial_save: + title: "НĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ вĐēĐģадĐēи ĐŊĐĩ ĐąŅ‹Đģи ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊŅ‹" + message: "НĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ иС вĐēĐģадОĐē ŅĐ˛ĐģŅŅŽŅ‚ŅŅ ŅĐ¸ŅŅ‚ĐĩĐŧĐŊŅ‹Đŧи и ĐŊĐĩ ĐŧĐžĐŗŅƒŅ‚ ĐąŅ‹Ņ‚ŅŒ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊŅ‹" + +actions: + save: + all: "ĐĄĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ Đ˛ŅĐĩ вĐēĐģадĐēи" + selected: "ĐĄĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊŅ‹Đĩ вĐēĐģадĐēи" + set_aside: + all: "ĐžŅ‚ĐģĐžĐļĐ¸Ņ‚ŅŒ Đ˛ŅĐĩ вĐēĐģадĐēи" + selected: "ĐžŅ‚ĐģĐžĐļĐ¸Ņ‚ŅŒ Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊŅ‹Đĩ вĐēĐģадĐēи" + show_collections: "ПоĐēĐ°ĐˇĐ°Ņ‚ŅŒ ҁĐŋĐ¸ŅĐžĐē ĐēĐžĐģĐģĐĩĐēŅ†Đ¸Đš" + +options_page: + title: "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи" + general: + title: "ĐžĐąŅ‰Đ¸Đĩ" + options: + always_show_toolbars: "Đ’ŅĐĩĐŗĐ´Đ° ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ ĐŋаĐŊĐĩĐģи Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Đš" + include_pinned: "ĐĄĐžŅ…Ņ€Đ°ĐŊŅŅ‚ŅŒ СаĐēŅ€ĐĩĐŋĐģĐĩĐŊĐŊŅ‹Đĩ вĐēĐģадĐēи ĐŋŅ€Đ¸ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊии Đ˛ŅĐĩŅ… вĐēĐģадОĐē" + show_delete_prompt: "ĐĄĐŋŅ€Đ°ŅˆĐ¸Đ˛Đ°Ņ‚ŅŒ ĐŋĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ ĐŋŅ€Đ¸ ŅƒĐ´Đ°ĐģĐĩĐŊии ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛" + show_badge: "ПоĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ ҁ҇ĐĩŅ‚Ņ‡Đ¸Đē" + show_notification: "ПоĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ ŅƒĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊиĐĩ ĐŋŅ€Đ¸ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊии ҇ĐĩŅ€ĐĩС ĐēĐžĐŊŅ‚ĐĩĐēҁ҂ĐŊĐžĐĩ ĐŧĐĩĐŊŅŽ" + unload_tabs: "НĐĩ ĐˇĐ°ĐŗŅ€ŅƒĐļĐ°Ņ‚ŅŒ вĐēĐģадĐēи ĐŋĐžŅĐģĐĩ ĐžŅ‚ĐēŅ€Ņ‹Ņ‚Đ¸Ņ" + list_locations: + title: "ĐžŅ‚ĐēŅ€Ņ‹Đ˛Đ°Ņ‚ŅŒ ҁĐŋĐ¸ŅĐžĐē ĐēĐžĐģĐģĐĩĐēŅ†Đ¸Đš в:" + options: + sidebar: "БоĐēОвОК ĐŋаĐŊĐĩĐģи" + popup: "Đ’ŅĐŋĐģŅ‹Đ˛Đ°ŅŽŅ‰ĐĩĐŧ ĐžĐēĐŊĐĩ" + tab: "ĐžŅ‚Đ´ĐĩĐģҌĐŊОК вĐēĐģадĐēĐĩ" + pinned: "ĐžŅ‚Đ´ĐĩĐģҌĐŊОК СаĐēŅ€ĐĩĐŋĐģĐĩĐŊĐŊОК вĐēĐģадĐēĐĩ" + icon_action: + title: "ĐŸŅ€Đ¸ ĐŊаĐļĐ°Ņ‚Đ¸Đ¸ ĐŊа иĐēĐžĐŊĐē҃ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐ¸Ņ:" + options: + action: "Đ’Ņ‹ĐŋĐžĐģĐŊĐ¸Ņ‚ŅŒ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Đĩ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ" + context: "ПоĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐēĐžĐŊŅ‚ĐĩĐēҁ҂ĐŊĐžĐĩ ĐŧĐĩĐŊŅŽ" + open: "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ ҁĐŋĐ¸ŅĐžĐē ĐēĐžĐģĐģĐĩĐēŅ†Đ¸Đš" + change_shortcuts: "ИСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐŗĐžŅ€ŅŅ‡Đ¸Đĩ ĐēĐģĐ°Đ˛Đ¸ŅˆĐ¸" + actions: + title: "ДĐĩĐšŅŅ‚Đ˛Đ¸Ņ" + options: + save_actions: + title: "ДĐĩĐšŅŅ‚Đ˛Đ¸Đĩ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ ĐŋŅ€Đ¸ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊии вĐēĐģадОĐē" + options: + set_aside: "ĐĄĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ и СаĐēŅ€Ņ‹Ņ‚ŅŒ вĐēĐģадĐēи" + save: "ĐĄĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ вĐēĐģадĐēи, ĐŊĐĩ СаĐēŅ€Ņ‹Đ˛Đ°Ņ Đ¸Ņ…" + restore_actions: + title: "ДĐĩĐšŅŅ‚Đ˛Đ¸Đĩ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ ĐŋŅ€Đ¸ ĐžŅ‚ĐēŅ€Ņ‹Ņ‚Đ¸Đ¸ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸Đš" + options: + open: "ĐŸŅ€ĐžŅŅ‚Đž ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ вĐēĐģадĐēи" + restore: "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ вĐēĐģадĐēи и ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸ŅŽ" + storage: + title: "ĐĨŅ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ" + capacity: + title: "ĐžĐąŅŠŅ‘Đŧ ОйĐģĐ°Ņ‡ĐŊĐžĐŗĐž Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ°" + description: "$1 иС $2 КиБ" + import: "ИĐŧĐŋĐžŅ€Ņ‚ даĐŊĐŊҋ҅" + export: "Đ­ĐēҁĐŋĐžŅ€Ņ‚ даĐŊĐŊҋ҅" + import_results: + success: "ДаĐŊĐŊŅ‹Đĩ ҃ҁĐŋĐĩ҈ĐŊĐž иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊŅ‹" + error: "ĐŸĐžŅ…ĐžĐļĐĩ, Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊŅ‹Đš Ņ„Đ°ĐšĐģ ĐŋĐžĐ˛Ņ€ĐĩĐļĐ´ĐĩĐŊ. ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ ĐąŅ‹ĐģĐž иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐž" + import_prompt: + title: "ИĐŧĐŋĐžŅ€Ņ‚ даĐŊĐŊҋ҅" + warning_title: "Đ­Ņ‚Đž ĐŊĐĩĐžĐąŅ€Đ°Ņ‚Đ¸ĐŧĐžĐĩ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Đĩ!" + warning_text: "ОĐŊĐž ĐŋĐĩŅ€ĐĩСаĐŋĐ¸ŅˆĐĩŅ‚ Đ˛ŅĐĩ Đ˛Đ°ŅˆĐ¸ даĐŊĐŊŅ‹Đĩ. ĐŖĐąĐĩĐ´Đ¸Ņ‚ĐĩҁҌ, Ņ‡Ņ‚Đž Đ˛Ņ‹ Đ˛Ņ‹ĐąŅ€Đ°Đģи ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊŅ‹Đš Ņ„Đ°ĐšĐģ, иĐŊĐ°Ņ‡Đĩ ŅŅ‚Đž ĐŧĐžĐļĐĩŅ‚ ĐŋŅ€Đ¸Đ˛ĐĩŅŅ‚Đ¸ Đē ĐŋĐžĐ˛Ņ€ĐĩĐļĐ´ĐĩĐŊĐ¸ŅŽ иĐģи ĐŋĐžŅ‚ĐĩŅ€Đĩ даĐŊĐŊҋ҅. Đ ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ ҁĐŊĐ°Ņ‡Đ°Đģа ŅĐēҁĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ даĐŊĐŊŅ‹Đĩ." + proceed: "Đ’Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ Ņ„Đ°ĐšĐģ" + about: + title: "О Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊии" + developed_by: "Đ Đ°ĐˇŅ€Đ°ĐąĐžŅ‚Ņ‡Đ¸Đē: Đ•Đ˛ĐŗĐĩĐŊиК Đ›Đ¸Ņ" + licensed_under: "" + mit_license: "Đ›Đ¸Ņ†ĐĩĐŊĐˇĐ¸Ņ MIT" + translation_cta: + text: "ĐĐ°ŅˆĐģи ĐžĐŋĐĩŅ‡Đ°Ņ‚Đē҃ иĐģи Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋĐĩŅ€ĐĩвОд ĐŊа Đ˛Đ°Ņˆ ŅĐˇŅ‹Đē?" + button: "ĐĐ°Ņ‡ĐŊĐ¸Ņ‚Đĩ СдĐĩҁҌ" + links: + website: "Мой вĐĩĐą-ŅĐ°ĐšŅ‚" + source: "Đ˜ŅŅ…ĐžĐ´ĐŊŅ‹Đš ĐēОд" + changelog: "ĐĄĐŋĐ¸ŅĐžĐē иСĐŧĐĩĐŊĐĩĐŊиК" + +collections: + empty: "Đ­Ņ‚Đ° ĐēĐžĐģĐģĐĩĐēŅ†Đ¸Ņ ĐŋŅƒŅŅ‚Đ°" + tabs_count: "ВĐēĐģадОĐē: $1" + actions: + open: "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ Đ˛ŅĐĩ" + restore: "Đ’ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ˛ŅĐĩ" + new_window: "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ в ĐŊОвОĐŧ ĐžĐēĐŊĐĩ" + incognito: + edge: "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ в ĐžĐēĐŊĐĩ InPrivate" + firefox: "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ в ĐŊОвОĐŧ ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊĐžĐŧ ĐžĐēĐŊĐĩ" + chrome: "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ в Ņ€ĐĩĐļиĐŧĐĩ иĐŊĐēĐžĐŗĐŊĐ¸Ņ‚Đž" + incognito_check: + title: "ĐĸŅ€ĐĩĐąŅƒĐĩŅ‚ŅŅ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊиĐĩ" + message: + edge: + p1: "Đ Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐ¸ŅŽ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐž Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊĐžĐĩ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊиĐĩ Ņ‡Ņ‚ĐžĐąŅ‹ ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ вĐēĐģадĐēи в Ņ€ĐĩĐļиĐŧĐĩ InPrivate" + p2: "ДĐģŅ ŅŅ‚ĐžĐŗĐž ĐŊаĐļĐŧĐ¸Ņ‚Đĩ \"ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи\" и ĐˇĐ°Ņ‚ĐĩĐŧ ĐžŅ‚ĐŧĐĩŅ‚ŅŒŅ‚Đĩ ĐžĐŋŅ†Đ¸ŅŽ \"Đ Đ°ĐˇŅ€ĐĩŅˆĐ¸Ņ‚ŅŒ в Ņ€ĐĩĐļиĐŧĐĩ InPrivate\"" + firefox: + p1: "Đ Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐ¸ŅŽ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐž Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊĐžĐĩ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊиĐĩ Ņ‡Ņ‚ĐžĐąŅ‹ ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ вĐēĐģадĐēи в ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊĐžĐŧ ĐžĐēĐŊĐĩ" + p2: "ДĐģŅ ŅŅ‚ĐžĐŗĐž ĐŊаĐļĐŧĐ¸Ņ‚Đĩ \"ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи\", ĐŋĐĩŅ€ĐĩĐšĐ´Đ¸Ņ‚Đĩ в \"ĐŸĐžĐ´Ņ€ĐžĐąĐŊĐžŅŅ‚Đ¸\" и Ņ€Đ°ĐˇŅ€ĐĩŅˆĐ¸Ņ‚Đĩ \"ЗаĐŋ҃ҁĐē в ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊҋ҅ ĐžĐēĐŊĐ°Ņ…\"" + chrome: + p1: "Đ Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐ¸ŅŽ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐž Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊĐžĐĩ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊиĐĩ Ņ‡Ņ‚ĐžĐąŅ‹ ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ вĐēĐģадĐēи в Ņ€ĐĩĐļиĐŧĐĩ иĐŊĐēĐžĐŗĐŊĐ¸Ņ‚Đž" + p2: "ДĐģŅ ŅŅ‚ĐžĐŗĐž ĐŊаĐļĐŧĐ¸Ņ‚Đĩ \"ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи\" и ĐžŅ‚ĐŧĐĩŅ‚ŅŒŅ‚Đĩ ĐžĐŋŅ†Đ¸ŅŽ \"Đ Đ°ĐˇŅ€ĐĩŅˆĐ¸Ņ‚ŅŒ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩ в Ņ€ĐĩĐļиĐŧĐĩ иĐŊĐēĐžĐŗĐŊĐ¸Ņ‚Đž\"" + action: "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи" + menu: + delete: "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸ŅŽ" + add_selected: "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊŅ‹Đĩ вĐēĐģадĐēи" + add_group: "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŋŅƒŅŅ‚ŅƒŅŽ ĐŗŅ€ŅƒĐŋĐŋ҃" + add_pinned: "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ СаĐēŅ€ĐĩĐŋĐģĐĩĐŊĐŊŅƒŅŽ ĐŗŅ€ŅƒĐŋĐŋ҃" + export_bookmarks: "Đ­ĐēҁĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ в СаĐēĐģадĐēи" + edit: "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸ŅŽ" + +groups: + title: "Đ“Ņ€ŅƒĐŋĐŋа" + pinned: "ЗаĐēŅ€ĐĩĐŋĐģĐĩĐŊĐŊŅ‹Đĩ" + open: "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ Đ˛ŅĐĩ" + empty: "Đ­Ņ‚Đ° ĐŗŅ€ŅƒĐŋĐŋа ĐŋŅƒŅŅ‚Đ°" + menu: + new_window: "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ в ĐŊОвОĐŧ ĐžĐēĐŊĐĩ" + add_selected: "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊŅ‹Đĩ вĐēĐģадĐēи" + edit: "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŗŅ€ŅƒĐŋĐŋ҃" + ungroup: "Đ Đ°ĐˇĐŗŅ€ŅƒĐŋĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ" + delete: "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐŗŅ€ŅƒĐŋĐŋ҃" + +tabs: + delete: "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ вĐēĐģадĐē҃" + +colors: + none: "БĐĩС Ņ†Đ˛ĐĩŅ‚Đ°" + any: "Đ›ŅŽĐąĐžĐš Ņ†Đ˛ĐĩŅ‚" + grey: "ĐĄĐĩŅ€Ņ‹Đš" + blue: "ХиĐŊиК" + red: "ĐšŅ€Đ°ŅĐŊŅ‹Đš" + yellow: "Đ–Ņ‘ĐģŅ‚Ņ‹Đš" + green: "ЗĐĩĐģŅ‘ĐŊŅ‹Đš" + pink: "Đ ĐžĐˇĐžĐ˛Ņ‹Đš" + purple: "ФиОĐģĐĩŅ‚ĐžĐ˛Ņ‹Đš" + cyan: "ГоĐģŅƒĐąĐžĐš" + orange: "ĐžŅ€Đ°ĐŊĐļĐĩĐ˛Ņ‹Đš" + +dialogs: + edit: + title: + edit_collection: "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸ŅŽ" + edit_group: "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŗŅ€ŅƒĐŋĐŋ҃" + new_group: "ĐĐžĐ˛Đ°Ņ ĐŗŅ€ŅƒĐŋĐŋа" + new_collection: "ĐĐžĐ˛Đ°Ņ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸Ņ" + collection_title: "НазваĐŊиĐĩ" + color: "ĐĻвĐĩŅ‚" + +main: + header: + create_collection: "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ ĐŊĐžĐ˛ŅƒŅŽ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸ŅŽ" + menu: + tiles_view: "ПĐģĐ¸Ņ‚Đēи" + changelog: "Đ§Ņ‚Đž ĐŊĐžĐ˛ĐžĐŗĐž?" + list: + searchbar: + title: "ĐŸĐžĐ¸ŅĐē" + filter: "ФиĐģŅŒŅ‚Ņ€" + sort: + title: "ĐĄĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đēа" + options: + newest: "ĐĄĐŊĐ°Ņ‡Đ°Đģа ĐŊĐžĐ˛Ņ‹Đĩ" + oldest: "ĐĄĐŊĐ°Ņ‡Đ°Đģа ŅŅ‚Đ°Ņ€Ņ‹Đĩ" + ascending: "ĐžŅ‚ А Đ´Đž Đ¯" + descending: "ĐžŅ‚ Đ¯ Đ´Đž А" + custom: "ĐŸŅ€ĐžĐ¸ĐˇĐ˛ĐžĐģҌĐŊĐ°Ņ" + empty: + title: "ПоĐēа Ņ‡Ņ‚Đž СдĐĩҁҌ ĐŊĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩŅ‚" + message: "ĐžŅ‚ĐģĐžĐļĐ¸Ņ‚Đĩ Ņ‚ĐĩĐēŅƒŅ‰Đ¸Đĩ вĐēĐģадĐēи иĐģи ŅĐžĐˇĐ´Đ°ĐšŅ‚Đĩ ĐŊĐžĐ˛ŅƒŅŽ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸ŅŽ" + empty_search: + title: "ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ ĐŊаКдĐĩĐŊĐž" + message: "ПоĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐŋĐžĐ¸ŅĐēĐžĐ˛Ņ‹Đš СаĐŋŅ€ĐžŅ" + +cta_message: + title: "ĐŅ€Đ°Đ˛Đ¸Ņ‚ŅŅ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиĐĩ?" + message: "ПоддĐĩŅ€ĐļĐ¸Ņ‚Đĩ Đ°Đ˛Ņ‚ĐžŅ€Đ° ĐŋĐžĐļĐĩŅ€Ņ‚Đ˛ĐžĐ˛Đ°ĐŊиĐĩĐŧ иĐģи" + feedback: "ĐžŅŅ‚Đ°Đ˛ŅŒŅ‚Đĩ ĐžŅ‚ĐˇŅ‹Đ˛" + +storage_full_message: + title: "ОбĐģĐ°Ņ‡ĐŊĐžĐĩ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ ĐŋĐžŅ‡Ņ‚Đ¸ СаĐŋĐžĐģĐŊĐĩĐŊĐž ($1%)" + message: "Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐžŅĐ˛ĐžĐąĐžĐ´Đ¸Ņ‚ŅŒ ĐŧĐĩŅŅ‚Đž, ŅƒĐ´Đ°Đģив ĐŊĐĩĐ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧŅ‹Đĩ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸Đ¸." + +parse_error_message: + title: "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ŅŒ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸Đ¸ иС Đ˛Đ°ŅˆĐĩĐŗĐž ОйĐģĐ°Ņ‡ĐŊĐžĐŗĐž Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ°." + message: "ĐŸĐžŅ…ĐžĐļĐĩ, ОйĐģĐ°Ņ‡ĐŊĐžĐĩ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ ĐŋĐžĐ˛Ņ€ĐĩĐļĐ´ĐĩĐŊĐž. Đ§Ņ‚ĐžĐąŅ‹ ŅŅ‚Đž Đ¸ŅĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ СаĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐĩĐŗĐž ĐģĐžĐēаĐģҌĐŊОК ĐēĐžĐŋиĐĩĐš." + action: "Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐģĐžĐēаĐģҌĐŊŅƒŅŽ ĐēĐžĐŋĐ¸ŅŽ" + +merge_conflict_message: + title: "В ĐģĐžĐēаĐģҌĐŊĐžĐŧ и ОйĐģĐ°Ņ‡ĐŊĐžĐŧ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ°Ņ… ĐĩŅŅ‚ŅŒ ĐēĐžĐŊŅ„ĐģиĐēŅ‚ŅƒŅŽŅ‰Đ¸Đĩ иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ." + message: "Đ§Ņ‚ĐžĐąŅ‹ ŅŅ‚Đž Đ¸ŅĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ŅĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ ĐģĐžĐēаĐģҌĐŊŅƒŅŽ ĐēĐžĐŋĐ¸ŅŽ в ОйĐģаĐēĐž, ĐģийО ĐŋŅ€Đ¸ĐŊŅŅ‚ŅŒ иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ иС ОйĐģаĐēа." + accept_local: "ЗаĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐģĐžĐēаĐģҌĐŊОК" + accept_cloud: "ĐŸŅ€Đ¸ĐŊŅŅ‚ŅŒ ОйĐģĐ°Ņ‡ĐŊŅ‹Đĩ иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ" diff --git a/locales/uk.yml b/locales/uk.yml new file mode 100644 index 0000000..939ecdd --- /dev/null +++ b/locales/uk.yml @@ -0,0 +1,245 @@ +manifest: + name: "Đ’Ņ–Đ´ĐēĐģадĐĩĐŊŅ– вĐēĐģадĐēи" + description: "Đ’Ņ–Đ´ĐēĐģĐ°Đ´Đ°ĐšŅ‚Đĩ Ņ‚Đ° ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐžĐ˛ŅƒĐšŅ‚Đĩ ŅĐ˛ĐžŅ— вĐēĐģадĐēи. ĐŸŅ€ĐžĐ´ĐžĐ˛ĐļŅ‚Đĩ С Ņ‚ĐžĐŗĐž ĐŧŅ–ŅŅ†Ņ, Đ´Đĩ ĐˇŅƒĐŋиĐŊиĐģĐ¸ŅŅ" + author: "Đ„Đ˛ĐŗĐĩĐŊ Đ›Đ¸Ņ" + +shortcuts: + toggle_sidebar: "Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ ҁĐŋĐ¸ŅĐžĐē ĐēĐžĐģĐĩĐēŅ†Ņ–Đš" + set_aside: "Đ’Ņ–Đ´ĐēĐģĐ°ŅŅ‚Đ¸ вĐēĐģадĐēи" + save_tabs: "ЗбĐĩŅ€ĐĩĐŗŅ‚Đ¸ вĐēĐģадĐēи" + +common: + actions: + cancel: "ĐĄĐēĐ°ŅŅƒĐ˛Đ°Ņ‚Đ¸" + save: "ЗбĐĩŅ€ĐĩĐŗŅ‚Đ¸" + close: "ЗаĐēŅ€Đ¸Ņ‚Đ¸" + delete: "ВидаĐģĐ¸Ņ‚Đ¸" + reset_filters: "ĐĄĐēиĐŊŅƒŅ‚Đ¸ ҄ҖĐģŅŒŅ‚Ņ€Đ¸" + cta: + feedback: "ЗаĐģĐ¸ŅˆĐ¸Ņ‚Đ¸ Đ˛Ņ–Đ´ĐŗŅƒĐē" + sponsor: "ĐŸŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸" + tooltips: + more: "ĐŠĐĩ" + delete_prompt: "Ви вĐŋĐĩвĐŊĐĩĐŊŅ–? ĐĻŅŽ Đ´Ņ–ŅŽ ĐŊĐĩ ĐŧĐžĐļĐŊа ҁĐēĐ°ŅŅƒĐ˛Đ°Ņ‚Đ¸." + +features: + v3welcome: + title: "Đ›Đ°ŅĐēавО ĐŋŅ€ĐžŅĐ¸ĐŧĐž Đ´Đž Đ’Ņ–Đ´ĐēĐģадĐĩĐŊĐ¸Ņ… вĐēĐģадОĐē 3.0" + text1: "Ми Ņ€Đ°Đ´Ņ– ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛Đ¸Ņ‚Đ¸ ĐŊОвĐĩ вĐĩĐģиĐēĐĩ ĐžĐŊОвĐģĐĩĐŊĐŊŅ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ!" + text2: "ĐĻĐĩ ĐžĐŊОвĐģĐĩĐŊĐŊŅ вĐēĐģŅŽŅ‡Đ°Ņ” Đ°ĐąŅĐžĐģŅŽŅ‚ĐŊĐž ĐŊОвиК Ņ–ĐŊŅ‚ĐĩҀ҄ĐĩĐšŅ Ņ– ĐąĐĩСĐģҖ҇ ĐŊĐžĐ˛Đ¸Ņ… Ņ„ŅƒĐŊĐēŅ†Ņ–Đš, Ņ‚Đ°ĐēĐ¸Ņ… ŅĐē:" + list: + item1: "ĐŸŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐēа ĐŗŅ€ŅƒĐŋŅƒĐ˛Đ°ĐŊĐŊŅ вĐēĐģадОĐē" + item2: "ПĐĩŅ€ŅĐžĐŊаĐģŅ–ĐˇĐ°Ņ†Ņ–Ņ ĐēĐžĐģĐĩĐēŅ†Ņ–Đš" + item3: "ПĐĩŅ€ĐĩŅ‚ŅĐŗŅƒĐ˛Đ°ĐŊĐŊŅ ĐēĐžĐģĐĩĐēŅ†Ņ–Đš Ņ‚Đ° ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Ņ–Đ˛" + item4: "ĐĄŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ ĐēĐžĐģĐĩĐēŅ†Ņ–Đš С ĐŊ҃ĐģŅ" + item5: "І ҉Đĩ ĐąĐ°ĐŗĐ°Ņ‚Đž Ņ–ĐŊŅˆĐžĐŗĐž!" + text3: "Đ’Ņ–Đ´Đ˛Ņ–Đ´Đ°ĐšŅ‚Đĩ ĐąĐģĐžĐŗ Ņ€ĐžĐˇŅ€ĐžĐąĐŊиĐēа (҂ҖĐģҌĐēи аĐŊĐŗĐģŅ–ĐšŅŅŒĐēĐžŅŽ), Ņ‰ĐžĐą Đ´Ņ–ĐˇĐŊĐ°Ņ‚Đ¸ŅŅ ĐąŅ–ĐģҌ҈Đĩ ĐŋŅ€Đž ҆Đĩ ĐžĐŊОвĐģĐĩĐŊĐŊŅ Ņ‚Đ° Đ˛ŅŅ– ĐšĐžĐŗĐž Ņ„ŅƒĐŊĐē҆Җҗ!" + actions: + visit_blog: "Đ§Đ¸Ņ‚Đ°Ņ‚Đ¸ ĐąĐģĐžĐŗ" + +notifications: + tabs_saved: + title: "ĐĄŅ‚Đ˛ĐžŅ€ĐĩĐŊĐž ĐŊĐžĐ˛Ņƒ ĐēĐžĐģĐĩĐēŅ†Ņ–ŅŽ" + message: "Đ’Đ°ŅˆŅ– вĐēĐģадĐēи СйĐĩŅ€ĐĩĐļĐĩĐŊĐž в ĐŊĐžĐ˛Ņƒ ĐēĐžĐģĐĩĐēŅ†Ņ–ŅŽ" + error_quota_exceeded: + title: "ПĐĩŅ€ĐĩĐ˛Đ¸Ņ‰ĐĩĐŊĐž ĐģŅ–ĐŧŅ–Ņ‚ ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Đš СаĐŋĐ¸ŅŅƒ в Ņ…ĐŧĐ°Ņ€Ņ–" + message: "Ми СйĐĩŅ€ĐĩĐŗĐģи Đ˛Đ°ŅˆŅ– вĐēĐģадĐēи в ĐģĐžĐēаĐģҌĐŊĐžĐŧ҃ ŅŅ…ĐžĐ˛Đ¸Ņ‰Ņ–. ВаĐŧ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐąŅƒĐ´Đĩ Đ˛Ņ€ŅƒŅ‡ĐŊ҃ ĐžĐŊĐžĐ˛Đ¸Ņ‚Đ¸ Ņ…ĐŧĐ°Ņ€ĐŊĐĩ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đĩ" + error_storage_full: + title: "ĐĨĐŧĐ°Ņ€ĐŊĐĩ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đĩ СаĐŋОвĐŊĐĩĐŊĐĩ" + message: "Ми СйĐĩŅ€ĐĩĐŗĐģи Đ˛Đ°ŅˆŅ– вĐēĐģадĐēи в ĐģĐžĐēаĐģҌĐŊĐžĐŧ҃ ŅŅ…ĐžĐ˛Đ¸Ņ‰Ņ–. Đ‘ŅƒĐ´ŅŒ ĐģĐ°ŅĐēа, ĐˇĐ˛Ņ–ĐģҌĐŊŅ–Ņ‚ŅŒ ĐŧҖҁ҆Đĩ в Ņ…ĐŧĐ°Ņ€ĐŊĐžĐŧ҃ ŅŅ…ĐžĐ˛Đ¸Ņ‰Ņ–" + bookmark_saved: + title: "ЕĐēҁĐŋĐžŅ€Ņ‚ĐžĐ˛Đ°ĐŊĐž в СаĐēĐģадĐēи" + message: "Đ’Đ°ŅˆĐ° ĐēĐžĐģĐĩĐēŅ†Ņ–Ņ ĐĩĐēҁĐŋĐžŅ€Ņ‚ĐžĐ˛Đ°ĐŊа в СаĐēĐģадĐēи" + partial_save: + title: "ДĐĩŅĐēŅ– вĐēĐģадĐēи ĐŊĐĩ ĐąŅƒĐģи СйĐĩŅ€ĐĩĐļĐĩĐŊŅ–" + message: "ДĐĩŅĐēŅ– С вĐēĐģадОĐē Ņ” ŅĐ¸ŅŅ‚ĐĩĐŧĐŊиĐŧи Ņ– ĐŊĐĩ ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ СйĐĩŅ€ĐĩĐļĐĩĐŊŅ–" + +actions: + save: + all: "ЗбĐĩŅ€ĐĩĐŗŅ‚Đ¸ Đ˛ŅŅ– вĐēĐģадĐēи" + selected: "ЗбĐĩŅ€ĐĩĐŗŅ‚Đ¸ Đ˛Đ¸ĐąŅ€Đ°ĐŊŅ– вĐēĐģадĐēи" + set_aside: + all: "Đ’Ņ–Đ´ĐēĐģĐ°ŅŅ‚Đ¸ Đ˛ŅŅ– вĐēĐģадĐēи" + selected: "Đ’Ņ–Đ´ĐēĐģĐ°ŅŅ‚Đ¸ Đ˛Đ¸ĐąŅ€Đ°ĐŊŅ– вĐēĐģадĐēи" + show_collections: "ПоĐēĐ°ĐˇĐ°Ņ‚Đ¸ ҁĐŋĐ¸ŅĐžĐē ĐēĐžĐģĐĩĐēŅ†Ņ–Đš" + +options_page: + title: "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ" + general: + title: "Đ—Đ°ĐŗĐ°ĐģҌĐŊŅ–" + options: + always_show_toolbars: "ЗавĐļди ĐŋĐžĐēĐ°ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋаĐŊĐĩĐģŅ– Đ´Ņ–Đš" + include_pinned: "ЗбĐĩŅ€Ņ–ĐŗĐ°Ņ‚Đ¸ СаĐēҀҖĐŋĐģĐĩĐŊŅ– вĐēĐģадĐēи ĐŋŅ€Đ¸ СйĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ– Đ˛ŅŅ–Ņ… вĐēĐģадОĐē" + show_delete_prompt: "ЗаĐŋĐ¸Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ ĐŋŅ€Đ¸ видаĐģĐĩĐŊĐŊŅ– ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Ņ–Đ˛" + show_badge: "ПоĐēĐ°ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ ĐģŅ–Ņ‡Đ¸ĐģҌĐŊиĐē" + show_notification: "ПоĐēĐ°ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ ҁĐŋĐžĐ˛Ņ–Ņ‰ĐĩĐŊĐŊŅ ĐŋŅ€Đ¸ СйĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ– ҇ĐĩŅ€ĐĩС ĐēĐžĐŊŅ‚ĐĩĐēҁ҂ĐŊĐĩ ĐŧĐĩĐŊŅŽ" + unload_tabs: "НĐĩ СаваĐŊŅ‚Đ°ĐļŅƒĐ˛Đ°Ņ‚Đ¸ вĐēĐģадĐēи ĐŋҖҁĐģŅ Đ˛Ņ–Đ´ĐēŅ€Đ¸Ņ‚Ņ‚Ņ" + list_locations: + title: "Đ’Ņ–Đ´ĐēŅ€Đ¸Đ˛Đ°Ņ‚Đ¸ ҁĐŋĐ¸ŅĐžĐē ĐēĐžĐģĐĩĐēŅ†Ņ–Đš ҃:" + options: + sidebar: "Đ‘Ņ–Ņ‡ĐŊĐžŅ— ĐŋаĐŊĐĩĐģŅ–" + popup: "Đ’ŅĐŋĐģĐ¸Đ˛Đ°ŅŽŅ‡ĐžĐŧ҃ Đ˛Ņ–ĐēĐŊŅ–" + tab: "ОĐēŅ€ĐĩĐŧŅ–Đš вĐēĐģĐ°Đ´Ņ†Ņ–" + pinned: "ЗаĐēҀҖĐŋĐģĐĩĐŊŅ–Đš вĐēĐģĐ°Đ´Ņ†Ņ–" + icon_action: + title: "ĐŸŅ€Đ¸ ĐŊĐ°Ņ‚Đ¸ŅĐēаĐŊĐŊŅ– ĐŊа Ņ–ĐēĐžĐŊĐē҃ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ:" + options: + action: "ВиĐēĐžĐŊĐ°Ņ‚Đ¸ Đ´Ņ–ŅŽ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ" + context: "ПоĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐēĐžĐŊŅ‚ĐĩĐēҁ҂ĐŊĐĩ ĐŧĐĩĐŊŅŽ" + open: "Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ ҁĐŋĐ¸ŅĐžĐē ĐēĐžĐģĐĩĐēŅ†Ņ–Đš" + change_shortcuts: "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ĐŗĐ°Ņ€ŅŅ‡Ņ– ĐēĐģĐ°Đ˛Ņ–ŅˆŅ–" + actions: + title: "Đ”Ņ–Ņ—" + options: + save_actions: + title: "Đ”Ņ–Ņ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ĐŋŅ€Đ¸ СйĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ– вĐēĐģадОĐē" + options: + set_aside: "ЗбĐĩŅ€ĐĩĐŗŅ‚Đ¸ Ņ‚Đ° СаĐēŅ€Đ¸Ņ‚Đ¸ вĐēĐģадĐēи" + save: "ЗбĐĩŅ€ĐĩĐŗŅ‚Đ¸ вĐēĐģадĐēи, ĐŊĐĩ СаĐēŅ€Đ¸Đ˛Đ°ŅŽŅ‡Đ¸ Ņ—Ņ…" + restore_actions: + title: "Đ”Ņ–Ņ Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ĐŋŅ€Đ¸ Đ˛Ņ–Đ´ĐēŅ€Đ¸Ņ‚Ņ‚Ņ– ĐēĐžĐģĐĩĐēŅ†Ņ–Đš" + options: + open: "ĐŸŅ€ĐžŅŅ‚Đž Đ˛Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ вĐēĐģадĐēи" + restore: "Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ вĐēĐģадĐēи Ņ‚Đ° видаĐģĐ¸Ņ‚Đ¸ ĐēĐžĐģĐĩĐēŅ†Ņ–ŅŽ" + storage: + title: "ĐĄŅ…ĐžĐ˛Đ¸Ņ‰Đĩ" + capacity: + title: "ĐĨĐŧĐ°Ņ€ĐŊĐĩ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đĩ" + description: "$1 С $2 ĐšŅ–Đ‘" + import: "ІĐŧĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ даĐŊŅ–" + export: "ЕĐēҁĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ даĐŊŅ–" + import_results: + success: "ДаĐŊŅ– ҃ҁĐŋŅ–ŅˆĐŊĐž Ņ–ĐŧĐŋĐžŅ€Ņ‚ĐžĐ˛Đ°ĐŊŅ–" + error: "ĐĄŅ…ĐžĐļĐĩ, Đ˛Đ¸ĐąŅ€Đ°ĐŊиК Ņ„Đ°ĐšĐģ ĐŋĐžŅˆĐēОдĐļĐĩĐŊиК. ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ ĐąŅƒĐģĐž Ņ–ĐŧĐŋĐžŅ€Ņ‚ĐžĐ˛Đ°ĐŊĐž" + import_prompt: + title: "ІĐŧĐŋĐžŅ€Ņ‚ даĐŊĐ¸Ņ…" + warning_title: "ĐĻĐĩ ĐŊĐĩĐˇĐ˛ĐžŅ€ĐžŅ‚ĐŊа Đ´Ņ–Ņ!" + warning_text: "ВоĐŊа ĐŋĐĩŅ€ĐĩСаĐŋĐ¸ŅˆĐĩ Đ˛ŅŅ– Đ˛Đ°ŅˆŅ– даĐŊŅ–. ПĐĩŅ€ĐĩĐēĐžĐŊĐ°ĐšŅ‚ĐĩŅŅ, Ņ‰Đž ви Đ˛Đ¸ĐąŅ€Đ°Đģи ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊиК Ņ„Đ°ĐšĐģ, Ņ–ĐŊаĐē҈Đĩ ҆Đĩ ĐŧĐžĐļĐĩ ĐŋŅ€Đ¸ĐˇĐ˛ĐĩŅŅ‚Đ¸ Đ´Đž ĐŋĐžŅˆĐēОдĐļĐĩĐŊĐŊŅ айО Đ˛Ņ‚Ņ€Đ°Ņ‚Đ¸ даĐŊĐ¸Ņ…. Đ ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ ҁĐŋĐžŅ‡Đ°Ņ‚Đē҃ ĐĩĐēҁĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ даĐŊŅ–." + proceed: "Đ’Đ¸ĐąŅ€Đ°Ņ‚Đ¸ Ņ„Đ°ĐšĐģ" + about: + title: "О Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ–" + developed_by: "Đ ĐžĐˇŅ€ĐžĐąĐŊиĐē: Đ„Đ˛ĐŗĐĩĐŊ Đ›Đ¸Ņ" + licensed_under: "" + mit_license: "Đ›Ņ–Ņ†ĐĩĐŊĐˇŅ–Ņ MIT" + translation_cta: + text: "ЗĐŊĐ°ĐšŅˆĐģи ĐŋĐžĐŧиĐģĐē҃ айО Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐēĐģад ĐŊа Đ˛Đ°ŅˆŅƒ ĐŧĐžĐ˛Ņƒ?" + button: "ĐŸĐžŅ‡ĐŊŅ–Ņ‚ŅŒ Ņ‚ŅƒŅ‚" + links: + website: "ĐœŅ–Đš вĐĩĐą-ŅĐ°ĐšŅ‚" + source: "Đ’Đ¸Ņ…Ņ–Đ´ĐŊиК ĐēОд" + changelog: "ĐĄĐŋĐ¸ŅĐžĐē СĐŧŅ–ĐŊ" + +collections: + empty: "ĐĻŅ ĐēĐžĐģĐĩĐēŅ†Ņ–Ņ ĐŋŅƒŅŅ‚Đ°" + tabs_count: "ВĐēĐģадОĐē: $1" + actions: + open: "Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ Đ˛ŅŅ–" + restore: "Đ’Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ Đ˛ŅŅ–" + new_window: "Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ ҃ ĐŊОвОĐŧ҃ Đ˛Ņ–ĐēĐŊŅ–" + incognito: + edge: "Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ ҃ Đ˛Ņ–ĐēĐŊŅ– InPrivate" + firefox: "Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ в ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊĐžĐŧ҃ Đ˛Ņ–ĐēĐŊŅ–" + chrome: "Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ в аĐŊĐžĐŊŅ–ĐŧĐŊĐžĐŧ҃ Đ˛Ņ–ĐēĐŊŅ–" + incognito_check: + title: "ĐŸĐžŅ‚Ņ€Ņ–ĐąĐĩĐŊ Đ´ĐžĐˇĐ˛Ņ–Đģ" + message: + edge: + p1: "Đ ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅŽ ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž Đ´ĐžĐ´Đ°Ņ‚ĐēОвĐĩ дОСвОĐģĐĩĐŊĐŊŅ, Ņ‰ĐžĐą Đ˛Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ вĐēĐģадĐēи в Ņ€ĐĩĐļиĐŧŅ– InPrivate" + p2: "ДĐģŅ Ņ†ŅŒĐžĐŗĐž ĐŊĐ°Ņ‚Đ¸ŅĐŊŅ–Ņ‚ŅŒ \"НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ\" Ņ– ĐŋĐžŅ‚Ņ–Đŧ Đ˛Ņ–Đ´ĐŧŅ–Ņ‚ŅŒŅ‚Đĩ ĐžĐŋŅ†Ņ–ŅŽ \"ДозвоĐģĐ¸Ņ‚Đ¸ Ņ€ĐĩĐļиĐŧ ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊĐžŅŅ‚Ņ– InPrivate\"" + firefox: + p1: "Đ ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅŽ ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž Đ´ĐžĐ´Đ°Ņ‚ĐēОвĐĩ дОСвОĐģĐĩĐŊĐŊŅ, Ņ‰ĐžĐą Đ˛Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ вĐēĐģадĐēи в ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊĐžĐŧ҃ Đ˛Ņ–ĐēĐŊŅ–" + p2: "ДĐģŅ Ņ†ŅŒĐžĐŗĐž ĐŊĐ°Ņ‚Đ¸ŅĐŊŅ–Ņ‚ŅŒ \"НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ\", ĐŋĐĩŅ€ĐĩĐšĐ´Ņ–Ņ‚ŅŒ ҃ \"ĐŸĐžĐ´Ņ€ĐžĐąĐ¸Ņ†Ņ–\" Ņ– дОСвОĐģŅŒŅ‚Đĩ \"ВиĐēĐžĐŊŅƒĐ˛Đ°Ņ‚Đ¸ в ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊĐ¸Ņ… Đ˛Ņ–ĐēĐŊĐ°Ņ…\"" + chrome: + p1: "Đ ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅŽ ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž Đ´ĐžĐ´Đ°Ņ‚ĐēОвĐĩ дОСвОĐģĐĩĐŊĐŊŅ, Ņ‰ĐžĐą Đ˛Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ вĐēĐģадĐēи в аĐŊĐžĐŊŅ–ĐŧĐŊĐžĐŧ҃ Ņ€ĐĩĐļиĐŧŅ–" + p2: "ДĐģŅ Ņ†ŅŒĐžĐŗĐž ĐŊĐ°Ņ‚Đ¸ŅĐŊŅ–Ņ‚ŅŒ \"НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ\" Ņ– Đ˛Ņ–Đ´ĐŧŅ–Ņ‚ŅŒŅ‚Đĩ ĐžĐŋŅ†Ņ–ŅŽ \"ДозвоĐģĐ¸Ņ‚Đ¸ в аĐŊĐžĐŊŅ–ĐŧĐŊĐžĐŧ҃ Ņ€ĐĩĐļиĐŧŅ–\"" + action: "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи" + menu: + delete: "ВидаĐģĐ¸Ņ‚Đ¸ ĐēĐžĐģĐĩĐēŅ†Ņ–ŅŽ" + add_selected: "Đ”ĐžĐ´Đ°Ņ‚Đ¸ Đ˛Đ¸ĐąŅ€Đ°ĐŊŅ– вĐēĐģадĐēи" + add_group: "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐŋĐžŅ€ĐžĐļĐŊŅŽ ĐŗŅ€ŅƒĐŋ҃" + add_pinned: "Đ”ĐžĐ´Đ°Ņ‚Đ¸ СаĐēҀҖĐŋĐģĐĩĐŊ҃ ĐŗŅ€ŅƒĐŋ҃" + export_bookmarks: "ЕĐēҁĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ в СаĐēĐģадĐēи" + edit: "Đ ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐžĐģĐĩĐēŅ†Ņ–ŅŽ" + +groups: + title: "Đ“Ņ€ŅƒĐŋа" + pinned: "ЗаĐēҀҖĐŋĐģĐĩĐŊŅ–" + open: "Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ Đ˛ŅŅ–" + empty: "ĐĻŅ ĐŗŅ€ŅƒĐŋа ĐŋŅƒŅŅ‚Đ°" + menu: + new_window: "Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ ҃ ĐŊОвОĐŧ҃ Đ˛Ņ–ĐēĐŊŅ–" + add_selected: "Đ”ĐžĐ´Đ°Ņ‚Đ¸ Đ˛Đ¸ĐąŅ€Đ°ĐŊŅ– вĐēĐģадĐēи" + edit: "Đ ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°Ņ‚Đ¸ ĐŗŅ€ŅƒĐŋ҃" + ungroup: "Đ ĐžĐˇĐŗŅ€ŅƒĐŋŅƒĐ˛Đ°Ņ‚Đ¸" + delete: "ВидаĐģĐ¸Ņ‚Đ¸ ĐŗŅ€ŅƒĐŋ҃" + +tabs: + delete: "ВидаĐģĐ¸Ņ‚Đ¸ вĐēĐģадĐē҃" + +colors: + none: "БĐĩС ĐēĐžĐģŅŒĐžŅ€Ņƒ" + any: "Đ‘ŅƒĐ´ŅŒ-ŅĐēиК ĐēĐžĐģŅ–Ņ€" + grey: "ĐĄŅ–Ņ€Đ¸Đš" + blue: "ХиĐŊŅ–Đš" + red: "ЧĐĩŅ€Đ˛ĐžĐŊиК" + yellow: "Đ–ĐžĐ˛Ņ‚Đ¸Đš" + green: "ЗĐĩĐģĐĩĐŊиК" + pink: "Đ ĐžĐļĐĩвиК" + purple: "Đ¤Ņ–ĐžĐģĐĩŅ‚ĐžĐ˛Đ¸Đš" + cyan: "ГоĐģŅƒĐąĐ¸Đš" + orange: "ПоĐŧĐ°Ņ€Đ°ĐŊ҇ĐĩвиК" + +dialogs: + edit: + title: + edit_collection: "Đ ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐžĐģĐĩĐēŅ†Ņ–ŅŽ" + edit_group: "Đ ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°Ņ‚Đ¸ ĐŗŅ€ŅƒĐŋ҃" + new_group: "Нова ĐŗŅ€ŅƒĐŋа" + new_collection: "Нова ĐēĐžĐģĐĩĐēŅ†Ņ–Ņ" + collection_title: "Назва" + color: "КоĐģŅ–Ņ€" + +main: + header: + create_collection: "ĐĄŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ ĐŊĐžĐ˛Ņƒ ĐēĐžĐģĐĩĐēŅ†Ņ–ŅŽ" + menu: + tiles_view: "ПĐģĐ¸Ņ‚Đēи" + changelog: "ĐŠĐž ĐŊĐžĐ˛ĐžĐŗĐž?" + list: + searchbar: + title: "ĐŸĐžŅˆŅƒĐē" + filter: "Đ¤Ņ–ĐģŅŒŅ‚Ņ€" + sort: + title: "ĐĄĐžŅ€Ņ‚ŅƒĐ˛Đ°ĐŊĐŊŅ" + options: + newest: "ĐĄĐŋĐžŅ‡Đ°Ņ‚Đē҃ ĐŊĐžĐ˛Ņ–" + oldest: "ĐĄĐŋĐžŅ‡Đ°Ņ‚Đē҃ ŅŅ‚Đ°Ņ€Ņ–" + ascending: "Đ’Ņ–Đ´ А Đ´Đž Đ¯" + descending: "Đ’Ņ–Đ´ Đ¯ Đ´Đž А" + custom: "ĐŸŅ€ĐžĐ¸ĐˇĐ˛ĐžĐģҌĐŊĐ°Ņ" + empty: + title: "ПоĐēи Ņ‰Đž Ņ‚ŅƒŅ‚ ĐŊŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩĐŧĐ°Ņ”" + message: "Đ’Ņ–Đ´ĐēĐģĐ°Đ´Ņ–Ņ‚ŅŒ ĐŋĐžŅ‚ĐžŅ‡ĐŊŅ– вĐēĐģадĐēи айО ŅŅ‚Đ˛ĐžŅ€Ņ–Ņ‚ŅŒ ĐŊĐžĐ˛Ņƒ ĐēĐžĐģĐĩĐēŅ†Ņ–ŅŽ" + empty_search: + title: "ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŊаКдĐĩĐŊĐž" + message: "ĐĄĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ĐŋĐžŅˆŅƒĐēОвиК СаĐŋĐ¸Ņ‚" + +cta_message: + title: "ĐŸĐžĐ´ĐžĐąĐ°Ņ”Ņ‚ŅŒŅŅ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ?" + message: "ĐŸŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐ°ĐšŅ‚Đĩ Đ°Đ˛Ņ‚ĐžŅ€Đ° ĐŋĐžĐļĐĩŅ€Ņ‚Đ˛ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ айО" + feedback: "СаĐģĐ¸ŅˆŅ‚Đĩ Đ˛Ņ–Đ´ĐŗŅƒĐē" + +storage_full_message: + title: "ĐĨĐŧĐ°Ņ€ĐŊĐĩ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đĩ ĐŧаКĐļĐĩ СаĐŋОвĐŊĐĩĐŊĐĩ ($1%)" + message: "Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇĐ˛Ņ–ĐģҌĐŊĐ¸Ņ‚Đ¸ ĐŧҖҁ҆Đĩ, видаĐģĐ¸Đ˛ŅˆĐ¸ ĐŊĐĩвиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°ĐŊŅ– ĐēĐžĐģĐĩĐē҆Җҗ." + +parse_error_message: + title: "Ми ĐŊĐĩ СĐŧĐžĐŗĐģи ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ ĐēĐžĐģĐĩĐē҆Җҗ С Đ˛Đ°ŅˆĐžĐŗĐž Ņ…ĐŧĐ°Ņ€ĐŊĐžĐŗĐž ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ°." + message: "ĐĄŅ…ĐžĐļĐĩ, Ņ…ĐŧĐ°Ņ€ĐŊĐĩ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đĩ ĐŋĐžŅˆĐēОдĐļĐĩĐŊĐĩ. ЊОй ҆Đĩ виĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đ¸, ви ĐŧĐžĐļĐĩŅ‚Đĩ СаĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ĐšĐžĐŗĐž ĐģĐžĐēаĐģҌĐŊĐžŅŽ ĐēĐžĐŋŅ–Ņ”ŅŽ." + action: "ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ ĐģĐžĐēаĐģҌĐŊ҃ ĐēĐžĐŋŅ–ŅŽ" + +merge_conflict_message: + title: "В ĐģĐžĐēаĐģҌĐŊĐžĐŧ҃ Ņ– ОйĐģĐ°Ņ‡ĐŊĐžĐŧ҃ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ°Ņ… Ņ” ĐēĐžĐŊŅ„ĐģŅ–ĐēŅ‚ŅƒŅŽŅ‡Ņ– СĐŧŅ–ĐŊи." + message: "ЊОй ҆Đĩ виĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đ¸, ви ĐŧĐžĐļĐĩŅ‚Đĩ СйĐĩŅ€ĐĩĐŗŅ‚Đ¸ ĐģĐžĐēаĐģҌĐŊ҃ ĐēĐžĐŋŅ–ŅŽ в Ņ…ĐŧĐ°Ņ€Ņ–, айО ĐŋŅ€Đ¸ĐšĐŊŅŅ‚Đ¸ СĐŧŅ–ĐŊи С Ņ…ĐŧĐ°Ņ€Đ¸." + accept_local: "ЗаĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐģĐžĐēаĐģҌĐŊĐžŅŽ" + accept_cloud: "ĐŸŅ€Đ¸ĐšĐŊŅŅ‚Đ¸ ОйĐģĐ°Ņ‡ĐŊŅ– СĐŧŅ–ĐŊи" diff --git a/models/CollectionModels.ts b/models/CollectionModels.ts new file mode 100644 index 0000000..31c4c30 --- /dev/null +++ b/models/CollectionModels.ts @@ -0,0 +1,41 @@ +export type TabItem = + { + type: "tab"; + url: string; + title?: string; + }; + +export type PinnedGroupItem = + { + type: "group"; + pinned: true; + items: TabItem[]; + }; + +export type DefaultGroupItem = + { + type: "group"; + pinned?: false; + title?: string; + color: chrome.tabGroups.ColorEnum; + items: TabItem[]; + }; + +export type GroupItem = PinnedGroupItem | DefaultGroupItem; + +export type CollectionItem = + { + type: "collection"; + timestamp: number; + title?: string; + color?: chrome.tabGroups.ColorEnum; + items: (TabItem | GroupItem)[]; + }; + +export type GraphicsStorage = Record; + +export type GraphicsItem = + { + preview?: string; + icon?: string; + }; diff --git a/package.json b/package.json new file mode 100644 index 0000000..e201f77 --- /dev/null +++ b/package.json @@ -0,0 +1,47 @@ +{ + "name": "tabs-aside", + "private": true, + "version": "3.0.0-rc1", + "type": "module", + "scripts": { + "dev": "wxt", + "build": "wxt build", + "zip": "wxt zip", + "lint": "npm run compile && eslint . -c eslint.config.js", + "prebuild": "npm run lint", + "prezip": "npm run build", + "compile": "tsc --noEmit", + "postinstall": "wxt prepare" + }, + "dependencies": { + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/modifiers": "^9.0.0", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@fluentui/react-components": "^9.63.0", + "@fluentui/react-icons": "^2.0.298", + "@webext-core/messaging": "^2.2.0", + "@wxt-dev/i18n": "^0.2.3", + "lzutf8": "^0.6.3", + "react": "^18.3.1", + "react-dom": "18.3.1" + }, + "devDependencies": { + "@eslint/css": "^0.7.0", + "@eslint/js": "^9.26.0", + "@eslint/json": "^0.12.0", + "@stylistic/eslint-plugin": "^4.2.0", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.1", + "@wxt-dev/module-react": "^1.1.3", + "eslint": "^9.26.0", + "eslint-plugin-react": "^7.37.5", + "globals": "^16.0.0", + "scheduler": "0.23.0", + "typescript": "^5.8.3", + "typescript-eslint": "^8.31.1", + "vite": "^6.3.4", + "wxt": "~0.19.29" + }, + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a2fc7f27f39182ecf3fe435ce7362dd6c55e5ce0 GIT binary patch literal 166552 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 z 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 Ar~m)} literal 0 HcmV?d00001 diff --git a/public/icon/128.png b/public/icon/128.png new file mode 100644 index 0000000000000000000000000000000000000000..04302bdef260b51d964cadd50530f0ecc4c2fc13 GIT binary patch literal 1565 zcmV+&2IBdNP)`yT{Vuf`k>kU|!~Z`v!0EUVbbY+P=Gw&UOKmJT9?_a(E1W`v zW|%1L^C;!m8Yd5fP&42>a%_o{*NN&)!b>@}#wkS%%21DED@4=4UX`Io^=gUl0Dy$o zS>J?3nv+gnfXcO~}vl^D~|&a13!4aBQP}j{y97S0Gl?2B}%nu}7m*b9Xd3Xw1>Je%S39l1y;=&M#dgS~-8SFW# z6oya+fzo#LtIi|Go96+JuX8xsYWO*}dwP1p^8^BXe0+S(^cLB#Q7aE`eG387;~N`m zae27LEhOd>L7;=wMJXx|FTLum`~bAEy*_rG1pqcs&jKWqNm=0nGNdkUl@E!MN;oFo z9+6>jyvJYOe`>$RygZzO7Q1q_ zckaA$tWqA%@zZ*uC^jQ;tXdvUZI|-X`l{=J;}NO;tCfdS+J}xI;kE&1ULMW`B)qPA zRr!!8O8Z`~y52du%>pPkPzE_imGbZ$c}}~OpW5;$vFU|l^YU;=cw3IH%EKYy^*OpI z51&QCW9QwHW3n(rOTsDbN1iCF^U&x&Ss0Q7r2~$iQ76i?dbuqRhlJPRNc#5h6exp0 zfk%1lLBgdR-Is?$!fgZ2ZFx8(T!&-M#%*~x*Y~UvF10~@^DDF9mn8S zuvEfh$6P;M1^<40Sk) z6@YSrl=dFwaR!bm3Q#if6hAo|NVuG%+9HrcBGoSC2NJH&QSBDMJ;5B|oNq0g*_FX8 z3()e@(?nUFhb2e#EFgBw_0!`-^{8H|SwM^grM*XaoPnd70#J#j{6NC%b5vaeq)2dl z#QZ?Q^#jf{3*fX59YezT9J%LVngwXw3LxRO9E0B%K*hFgf7f-r+Z~oZ6R=f!TQ+82 zYGc7MHa2D)xmT$+9v>e!>n~p5`qr}HaBOuR>RZ7jfQ095tT?&|fE`%e)#vCY0I;}g z!?Ae)c$UW*IJ#Q{K*H;CbfW-}@HQN~%K|7iPzE~3?y>+VgD%HmvH*&W#Z}ik$04!+ zs!hm#_S=lhH9+WpkZ>E0t`uM~7=#fd{0L2s?$!WHgF(==(d1}#9@lVn3xI^zS1-}? z07|%do?!F-{`qJeQ&$EsK3r`C0ri0Zm>dXz$$9)&eN6tK) z?|9gtAW($S;lq(#>rTE>JSK6ha7nyx!0l~33s?$7SxXC_tyr~6r7QP#lTYEL?|-lR z1#!Bp-%~m7=j6%GYhHONysxy|I{A-lYr}NEa#U@?HjqNG=j#H*O zY;5=O()cX&>4~zDq!QL%loWco=8sijB;1=(Va1+UeOZw8Q zAoA0*i4iHWU;2G5psclUr|Dax1ArRG(Q2(hDFyD$$G*7~f7`a|41n49{XKAt9UVvs zj!XS9Gq`XVhEt?crmrHEvVRJkP1E$Fwf;@vJ5>`+(|lyw&%Mic8(;aJ9LJS->P)(^c@JU2LRA_9#7g|@%^qR!QU$-s(yI+j(_uY#h0&D|uCgzF_0m&-hJx~!EJjdUbDVBg`pswql z-XjT_(gJkwceOPG+w`_=`=yk6NRbG8%Cbc1lT>J zkcf>@s!xhU(J%@Z-J?S>dfF24U6w%tt~hCrG8Kf;D^6O|%uIP<6cVb5yfDg{ICiF@ zViYdOR8)*|13e9+wzp*xHNS0H=G5y%Y7%pUOOq%chGAC{yDpy;NR%H1Nnw;Tam-9v z1)PCVh@2@>z*!jO1nQG1Q~(H($ftTm1x(ZQt&}QU&If4{p#p|s_yGX)!fp;GO(Jp$ zQRW+HtV{(7NP$G&0#YH7mw+oTEJtIo1?bm_DHL?@7W@Bi6;T6#UptEHoIp^wH~;_u M07*qoM6N<$f;f@x4*&oF literal 0 HcmV?d00001 diff --git a/public/icon/96.png b/public/icon/96.png new file mode 100644 index 0000000000000000000000000000000000000000..016877a8ea7362e350cb75139a249474f5541f0d GIT binary patch literal 4595 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 V&Bv>-58MCMoG?KfKQKHS^&jdV)CB+l literal 0 HcmV?d00001 diff --git a/public/notification_icons/bookmark_add.png b/public/notification_icons/bookmark_add.png new file mode 100644 index 0000000000000000000000000000000000000000..395d06058e4b6f5635a3ca6dc4ee2980a335a6a3 GIT binary patch literal 4260 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

c0{3o6nklk)S?fpJYc~;VwUaLMrj* zbcLszPpFCuJrmywx%JKrGu+en)zp|7#wjL${6nC_l>}{A;4xgl!}v(%&`&APO_LwA zF~qp7sDf7x5Q1gVc=QRX+$tcC7{0G1c8U`WCeQr;JH0G8-2#4((%&!II(PoHE^S)6Tm2H6mRcEKpp|I)Nk w6pajA(P5NT{ejwlM;at|evc5<|1M%E>+Nsn<8JMiS3eBU(KOH~S4V{Z4~De~{r~^~ literal 0 HcmV?d00001 diff --git a/public/notification_icons/save_warning.png b/public/notification_icons/save_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..405f5435dd36ed0773cc560e7f21985d75fbab87 GIT binary patch literal 4384 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 WM2bq|jvcdqY`8mnJDqnR@BAMzo;slb literal 0 HcmV?d00001 diff --git a/public/promo/dark.webp b/public/promo/dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..0f1284e550affb33872a201e927d886cc50b00c8 GIT binary patch literal 157030 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�B$OH9;G5N4}oZA3=An#MRq|WQA5wjLz&Bm?4*&m6gkO$^d#sTwPG-2K4mP&X9bz%*>*Y(62WZ)|J zg8$~D5_{Z7%M!oIeZ266f0GNpS6sp8cWxSaS>eba|4aJSG7yLL?CjICJdp^FStf+2x(E?ma zNJ}Y^J9Tp~vk_}l2Tu{*ozpHJPrCqhqq-ruFv`0NquXXvO6HJUVcsYmKJT$IOx+d0k2Jt@69X)uzzdzc4c(&2G%eM8I* zwOe}WRXjSuE#xdL^r=01iO|E@YuN-j8^BsikxoJiVULhNpO}gh z%tRP3_r$(pK$)~&tod)m0rDEk8kRLKEDiYUAv#q}Quoya9Y3t;^@o+hjJmdGdA~$hk}xfbU$Uyeuc+aIur!|Zgm83K&6E3FCzjTDwv%M(LE4$&5xm<7HE-UyZ5Hl)TZ~pc$jO zo0|alszf+b=FjG#GXt)`Q9TM$FXLo`GJ8P-X;2Bkl-aJiDIxcdWm(@0-_wO)a9unp z3W86gIF-}X-a(aq{u_@@aFmi#$dF*g3=swlph(1paG-gBdkgo7|EICrAPlCJIpJ}t zOQN!gu?Z6=Zh*-NPmDqc<5%qCYdjauXCCwWC}J=BjfGcl?OQ8xFZr#q!G&-6b3}&A zx9$9m-x^@i8Sdz<{fghf9lbO6nz0sEtHbY$`lNyTMPC6FyaEV`J*KDg zOa;nTHi!a|E&hzWMS+QfxXgY%0ac7mR=2_}G=Yt)BvmwV-Ka@tIB=c~0d_{+O@{yY zM;~o-E^6J>#zM{sigTmwIk-X!Vw}Lirn8STTEg^0U{+}D=kB9+JYtXMevegmZaU~r zGTVs#h;xf`QK=Uh8`TkgZt)dzE-#{tvyt&4?sG&nhjfig5nI&5ozBztOzm1lF=sAZ zS)Pg$;$j>nUL`37D=(q*Ram3%72K8j5tAdu5YX(YQ(HfiJFBv4e=3N&7kQh-8}3ZWcm-`fI&(g)wQW19Ijvc})W zgMa1kzmC6pl<~Z>##`G$SN=WUeV@4fpZv?`e8w-H_xLXy94%2xWA)#UjVN!f`BvuG z<RVdOcF z{7;+5D~-`ZZ~5P=_p#GksG8!c6LkzFg93mbS)5PR|HXQ|zwABCJ<12KPKMoZa*v0n(StQDY%mS_Fv^W@j4?e zRP|GUi2d8&PcX`1z)oT-qvy2*qbVjcrt|{Ws{?0>N zq<&3YhIBs7#(lVM2*)y{##-&i)K@~7IQ!;G*5L|5?o~jdSr8Cqz>qwXe^~^^rHPTB zsI*jbTtSSCA^?dk*j@HWu+so*cMl+jZY*J(7JN7y?r(qDe*VFJ|F{3g@UVG4X0CR( z*DL>++Sc?(zaiY>`%3#8NoCi@zMA8x<-oCpEhWazXF9g-FnG#tSr)JaS1Vykk^1DM zy+WI(9kJZQ%**H~{VZbLtJ|3qW+rG7ZlCC;d9g@xNJe|`KWz=O>)}SHv4VaVaRrrz znI?`w2@ipU@E9t5G5BJlhpvLyVc0P7IU>U7qQs4m9{%Gg{qtDxpQ0(o{M#(>1I+q2 z>;KMZ>5NiuGi+bf#W?VwPMXqm*6TUUE&gxUcoCsBoA`LV-lPKM5x(n$>~twSBr;9OvE}X=wgGL%aO}h z%k!pthor6)TQPm@S@!x;qOgqJ+dj#$juE&ix|vad4VX$DKTgXON`GWFxLp@cX2}aw z$0F27=q7<7SOTr48HfRZ7>ohRFBb;Zk$E##8w5P-6v4G&21RoPj?|Ky29p2vj@k-< ze9sYak+euwu@0Y_FmQiuQYYrRBjy&?3R0$yNcpP2eejjSRF$DZjV4x(tolr%jiHq%0D_dQvBEXsmdHRx1X4ee!G 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%0A&rFi3EX5>6%P#4zGA0s!hSJKF9q8bOr)e#i7!+? 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%0Ab8oSI6 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 literal 0 HcmV?d00001 diff --git a/public/promo/light.webp b/public/promo/light.webp new file mode 100644 index 0000000000000000000000000000000000000000..b47e365f48ec61487312571e7c4ce537930a66fd GIT binary patch literal 38980 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 literal 0 HcmV?d00001 diff --git a/store_descriptions/en.txt b/store_descriptions/en.txt new file mode 100644 index 0000000..c2fb440 --- /dev/null +++ b/store_descriptions/en.txt @@ -0,0 +1,49 @@ + + +Stemming its roots from the original Microsoft Edge browser feature, this extension has grown much bigger than just a temporary storage for tabs. + +It allows you to save and manage your tabs in a convenient way, providing a range of features that make it easy to organize and access your saved tabs. + +## Features +- Save tabs: Save all your open tabs in a single click, and restore them later +- Organize tabs: Create collections and subgroups to organize your saved tabs +- Search tabs: Quickly find the tabs you need using the search feature +- Sync across devices: Access your saved tabs from any device with your account +- Go dark: Dark mode support for a more comfortable browsing experience +- Personalize: Change the appearance and behavior of the extension to suit your needs + +Check out our blog post regarding all the new features and improvements in Tabs aside 3.0 at: +https://at.xfox111.net/tabs-aside-3-0 + +## Hey, it's an open-source software! +If you know how to improve this extension you can check its GitHub Repository at: +https://github.com/xfox111/TabsAsideExtension + +Check out release changelog on: +https://github.com/xfox111/TabsAsideExtension/releases/latest + + + + + + +Stemming its roots from the original Microsoft Edge browser feature, this extension has grown much bigger than just a temporary storage for tabs. + +It allows you to save and manage your tabs in a convenient way, providing a range of features that make it easy to organize and access your saved tabs. + +Features +

+ +Check out our blog post regarding all the new features and improvements in Tabs aside 3.0 + +Hey, it's an open-source software! +If you know how to improve this extension you can check its GitHub Repository + +Check out release changelog diff --git a/store_descriptions/ru.txt b/store_descriptions/ru.txt new file mode 100644 index 0000000..716c64f --- /dev/null +++ b/store_descriptions/ru.txt @@ -0,0 +1,48 @@ + + +Đ’Đ´ĐžŅ…ĐŊОвĐģĐĩĐŊĐŊĐžĐĩ Ņ„ŅƒĐŊĐēŅ†Đ¸ĐĩĐš ĐŋŅ€ĐĩĐ˛Ņ‹Ņ… вĐĩŅ€ŅĐ¸Đš ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ° Microsoft Edge, ŅŅ‚Đž Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиĐĩ ŅŅ‚Đ°ĐģĐž ĐŗĐžŅ€Đ°ĐˇĐ´Đž йОĐģҌ҈Đĩ, ҇ĐĩĐŧ ĐŋŅ€ĐžŅŅ‚Đž Đ˛Ņ€ĐĩĐŧĐĩĐŊĐŊĐžĐĩ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ Đ´ĐģŅ вĐēĐģадОĐē. + +ОĐŊĐž ĐŋОСвОĐģŅĐĩŅ‚ ŅĐžŅ…Ņ€Đ°ĐŊŅŅ‚ŅŒ и ҃ĐŋŅ€Đ°Đ˛ĐģŅŅ‚ŅŒ Đ˛Đ°ŅˆĐ¸Đŧи вĐēĐģадĐēаĐŧи ŅƒĐ´ĐžĐąĐŊŅ‹Đŧ ĐžĐąŅ€Đ°ĐˇĐžĐŧ, ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģŅŅ ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛Đž Ņ„ŅƒĐŊĐēŅ†Đ¸Đš, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ҃ĐŋŅ€ĐžŅ‰Đ°ŅŽŅ‚ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŽ и Đ´ĐžŅŅ‚ŅƒĐŋ Đē ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐŊŅ‹Đŧ вĐēĐģадĐēаĐŧ. + +## ВозĐŧĐžĐļĐŊĐžŅŅ‚Đ¸ +- ĐĄĐžŅ…Ņ€Đ°ĐŊĐĩĐŊиĐĩ вĐēĐģадОĐē: ĐĄĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚Đĩ Đ˛ŅĐĩ ĐžŅ‚ĐēҀҋ҂ҋĐĩ вĐēĐģадĐēи ОдĐŊиĐŧ ĐēĐģиĐēĐžĐŧ и Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đĩ Đ¸Ņ… ĐŋОСĐļĐĩ +- ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ вĐēĐģадОĐē: ĐĄĐžĐˇĐ´Đ°Đ˛Đ°ĐšŅ‚Đĩ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸Đ¸ и ĐŋĐžĐ´ĐŗŅ€ŅƒĐŋĐŋŅ‹ Đ´ĐģŅ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐŊҋ҅ вĐēĐģадОĐē +- ĐŸĐžĐ¸ŅĐē вĐēĐģадОĐē: Đ‘Ņ‹ŅŅ‚Ņ€Đž ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚Đĩ ĐŊ҃ĐļĐŊŅ‹Đĩ вĐēĐģадĐēи ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ Ņ„ŅƒĐŊĐēŅ†Đ¸Đ¸ ĐŋĐžĐ¸ŅĐēа +- ХиĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ ĐŧĐĩĐļĐ´Ņƒ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°Đŧи: Đ”ĐžŅŅ‚ŅƒĐŋ Đē ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐŊŅ‹Đŧ вĐēĐģадĐēаĐŧ ҁ ĐģŅŽĐąĐžĐŗĐž ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° ҇ĐĩŅ€ĐĩС Đ˛Đ°Ņˆ аĐēĐēĐ°ŅƒĐŊŅ‚ +- ĐĸĐĩĐŧĐŊŅ‹Đš Ņ€ĐĩĐļиĐŧ: ПоддĐĩŅ€ĐļĐēа Ņ‚ĐĩĐŧĐŊĐžĐŗĐž Ņ€ĐĩĐļиĐŧа Đ´ĐģŅ йОĐģĐĩĐĩ ĐēĐžĐŧŅ„ĐžŅ€Ņ‚ĐŊĐžĐŗĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ +- ПĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ°Ņ†Đ¸Ņ: ИСĐŧĐĩĐŊŅĐšŅ‚Đĩ вĐŊĐĩ҈ĐŊиК вид и ĐŋОвĐĩĐ´ĐĩĐŊиĐĩ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐ¸Ņ ĐŋОд ŅĐ˛ĐžĐ¸ ĐŊ҃ĐļĐ´Ņ‹ + +ĐŸĐžŅĐĩŅ‚Đ¸Ņ‚Đĩ ĐŊĐ°Ņˆ ĐąĐģĐžĐŗ, Ņ‡Ņ‚ĐžĐąŅ‹ ŅƒĐˇĐŊĐ°Ņ‚ŅŒ йОĐģҌ҈Đĩ Đž Đ˛ŅĐĩŅ… ĐŊĐžĐ˛Ņ‹Ņ… Ņ„ŅƒĐŊĐēŅ†Đ¸ŅŅ… и ҃ĐģŅƒŅ‡ŅˆĐĩĐŊĐ¸ŅŅ… в ĐžŅ‚ĐģĐžĐļĐĩĐŊĐŊҋ҅ вĐēĐģадĐēĐ°Ņ… 3.0 ĐŋĐž ҁҁҋĐģĐēĐĩ: +https://at.xfox111.net/tabs-aside-3-0 + +## ĐšŅŅ‚Đ°Ņ‚Đ¸ ŅŅ‚Đž ĐžĐŋĐĩĐŊŅĐžŅ€Ņ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиĐĩ! +Đ•ŅĐģи Đ˛Ņ‹ СĐŊаĐĩŅ‚Đĩ, ĐēаĐē ĐŧĐžĐļĐŊĐž ĐĩĐŗĐž ҃ĐģŅƒŅ‡ŅˆĐ¸Ņ‚ŅŒ, ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐšŅ‚Đ¸ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ GitHub Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Ņ ĐŋŅ€ĐžĐĩĐēŅ‚Đ°: +https://github.com/xfox111/TabsAsideExtension + +ĐĄĐŋĐ¸ŅĐžĐē иСĐŧĐĩĐŊĐĩĐŊиК ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐš вĐĩŅ€ŅĐ¸Đ¸: +https://github.com/xfox111/TabsAsideExtension/releases/latest + + + + + +Đ’Đ´ĐžŅ…ĐŊОвĐģĐĩĐŊĐŊĐžĐĩ Ņ„ŅƒĐŊĐēŅ†Đ¸ĐĩĐš ĐŋŅ€ĐĩĐ˛Ņ‹Ņ… вĐĩŅ€ŅĐ¸Đš ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ° Microsoft Edge, ŅŅ‚Đž Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиĐĩ ŅŅ‚Đ°ĐģĐž ĐŗĐžŅ€Đ°ĐˇĐ´Đž йОĐģҌ҈Đĩ, ҇ĐĩĐŧ ĐŋŅ€ĐžŅŅ‚Đž Đ˛Ņ€ĐĩĐŧĐĩĐŊĐŊĐžĐĩ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ Đ´ĐģŅ вĐēĐģадОĐē. + +ОĐŊĐž ĐŋОСвОĐģŅĐĩŅ‚ ŅĐžŅ…Ņ€Đ°ĐŊŅŅ‚ŅŒ и ҃ĐŋŅ€Đ°Đ˛ĐģŅŅ‚ŅŒ Đ˛Đ°ŅˆĐ¸Đŧи вĐēĐģадĐēаĐŧи ŅƒĐ´ĐžĐąĐŊŅ‹Đŧ ĐžĐąŅ€Đ°ĐˇĐžĐŧ, ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģŅŅ ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛Đž Ņ„ŅƒĐŊĐēŅ†Đ¸Đš, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ҃ĐŋŅ€ĐžŅ‰Đ°ŅŽŅ‚ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŽ и Đ´ĐžŅŅ‚ŅƒĐŋ Đē ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐŊŅ‹Đŧ вĐēĐģадĐēаĐŧ. + +ВозĐŧĐžĐļĐŊĐžŅŅ‚Đ¸ +
    +
  • ĐĄĐžŅ…Ņ€Đ°ĐŊĐĩĐŊиĐĩ вĐēĐģадОĐē: ĐĄĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚Đĩ Đ˛ŅĐĩ ĐžŅ‚ĐēҀҋ҂ҋĐĩ вĐēĐģадĐēи ОдĐŊиĐŧ ĐēĐģиĐēĐžĐŧ и Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đĩ Đ¸Ņ… ĐŋОСĐļĐĩ
  • +
  • ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ вĐēĐģадОĐē: ĐĄĐžĐˇĐ´Đ°Đ˛Đ°ĐšŅ‚Đĩ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸Đ¸ и ĐŋĐžĐ´ĐŗŅ€ŅƒĐŋĐŋŅ‹ Đ´ĐģŅ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐŊҋ҅ вĐēĐģадОĐē
  • +
  • ĐŸĐžĐ¸ŅĐē вĐēĐģадОĐē: Đ‘Ņ‹ŅŅ‚Ņ€Đž ĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚Đĩ ĐŊ҃ĐļĐŊŅ‹Đĩ вĐēĐģадĐēи ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ Ņ„ŅƒĐŊĐēŅ†Đ¸Đ¸ ĐŋĐžĐ¸ŅĐēа
  • +
  • ХиĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ ĐŧĐĩĐļĐ´Ņƒ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°Đŧи: Đ”ĐžŅŅ‚ŅƒĐŋ Đē ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐŊŅ‹Đŧ вĐēĐģадĐēаĐŧ ҁ ĐģŅŽĐąĐžĐŗĐž ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° ҇ĐĩŅ€ĐĩС Đ˛Đ°Ņˆ аĐēĐēĐ°ŅƒĐŊŅ‚
  • +
  • ĐĸĐĩĐŧĐŊŅ‹Đš Ņ€ĐĩĐļиĐŧ: ПоддĐĩŅ€ĐļĐēа Ņ‚ĐĩĐŧĐŊĐžĐŗĐž Ņ€ĐĩĐļиĐŧа Đ´ĐģŅ йОĐģĐĩĐĩ ĐēĐžĐŧŅ„ĐžŅ€Ņ‚ĐŊĐžĐŗĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ
  • +
  • ПĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ°Ņ†Đ¸Ņ: ИСĐŧĐĩĐŊŅĐšŅ‚Đĩ вĐŊĐĩ҈ĐŊиК вид и ĐŋОвĐĩĐ´ĐĩĐŊиĐĩ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐ¸Ņ ĐŋОд ŅĐ˛ĐžĐ¸ ĐŊ҃ĐļĐ´Ņ‹
  • +
+ +ĐŸĐžŅĐĩŅ‚Đ¸Ņ‚Đĩ ĐŊĐ°Ņˆ ĐąĐģĐžĐŗ, Ņ‡Ņ‚ĐžĐąŅ‹ ŅƒĐˇĐŊĐ°Ņ‚ŅŒ йОĐģҌ҈Đĩ Đž Đ˛ŅĐĩŅ… ĐŊĐžĐ˛Ņ‹Ņ… Ņ„ŅƒĐŊĐēŅ†Đ¸ŅŅ… и ҃ĐģŅƒŅ‡ŅˆĐĩĐŊĐ¸ŅŅ… в ĐžŅ‚ĐģĐžĐļĐĩĐŊĐŊҋ҅ вĐēĐģадĐēĐ°Ņ… 3.0 ĐŋĐž ҁҁҋĐģĐēĐĩ + +ĐšŅŅ‚Đ°Ņ‚Đ¸ ŅŅ‚Đž ĐžĐŋĐĩĐŊŅĐžŅ€Ņ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиĐĩ! +Đ•ŅĐģи Đ˛Ņ‹ СĐŊаĐĩŅ‚Đĩ, ĐēаĐē ĐŧĐžĐļĐŊĐž ĐĩĐŗĐž ҃ĐģŅƒŅ‡ŅˆĐ¸Ņ‚ŅŒ, ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐšŅ‚Đ¸ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ GitHub Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Ņ ĐŋŅ€ĐžĐĩĐēŅ‚Đ° + +ĐĄĐŋĐ¸ŅĐžĐē иСĐŧĐĩĐŊĐĩĐŊиК ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐš вĐĩŅ€ŅĐ¸Đ¸ diff --git a/store_descriptions/uk.txt b/store_descriptions/uk.txt new file mode 100644 index 0000000..598586d --- /dev/null +++ b/store_descriptions/uk.txt @@ -0,0 +1,48 @@ + + +ĐĐ°Đ´Đ¸Ņ…ĐŊŅƒŅ‚Đĩ Ņ„ŅƒĐŊĐēŅ†Ņ–Ņ”ŅŽ ĐŋĐĩŅ€ŅˆĐ¸Ņ… вĐĩŅ€ŅŅ–Đš Microsoft Edge, ҆Đĩ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ ŅŅ‚Đ°ĐģĐž ĐŊĐ°ĐąĐ°ĐŗĐ°Ņ‚Đž ĐąŅ–ĐģҌ҈Đĩ, ĐŊŅ–Đļ ĐŋŅ€ĐžŅŅ‚Đž Ņ‚Đ¸ĐŧŅ‡Đ°ŅĐžĐ˛Đĩ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đĩ Đ´ĐģŅ вĐēĐģадОĐē. + +ВоĐŊĐž дОСвОĐģŅŅ” СйĐĩŅ€Ņ–ĐŗĐ°Ņ‚Đ¸ Ņ‚Đ° ĐēĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛Đ°ŅˆĐ¸Đŧи вĐēĐģадĐēаĐŧи ĐˇŅ€ŅƒŅ‡ĐŊĐž, ĐŊĐ°Đ´Đ°ŅŽŅ‡Đ¸ ĐąĐĩСĐģҖ҇ Ņ„ŅƒĐŊĐēŅ†Ņ–Đš, ŅĐēŅ– ҁĐŋŅ€ĐžŅ‰ŅƒŅŽŅ‚ŅŒ ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–ŅŽ Ņ‚Đ° Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž СйĐĩŅ€ĐĩĐļĐĩĐŊĐ¸Ņ… вĐēĐģадОĐē. + +## МоĐļĐģĐ¸Đ˛ĐžŅŅ‚Ņ– +- ЗбĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ вĐēĐģадОĐē: ЗбĐĩŅ€ĐĩĐļŅ–Ņ‚ŅŒ ŅƒŅŅ– Đ˛Ņ–Đ´ĐēŅ€Đ¸Ņ‚Ņ– вĐēĐģадĐēи ОдĐŊиĐŧ ĐēĐģŅ–ĐēĐžĐŧ Ņ– Đ˛Ņ–Đ´ĐŊĐžĐ˛Ņ–Ņ‚ŅŒ Ņ—Ņ… ĐŋŅ–ĐˇĐŊŅ–ŅˆĐĩ +- ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ вĐēĐģадОĐē: ĐĄŅ‚Đ˛ĐžŅ€ŅŽĐšŅ‚Đĩ ĐēĐžĐģĐĩĐē҆Җҗ Ņ‚Đ° ĐŋŅ–Đ´ĐŗŅ€ŅƒĐŋи Đ´ĐģŅ ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— СйĐĩŅ€ĐĩĐļĐĩĐŊĐ¸Ņ… вĐēĐģадОĐē +- ĐŸĐžŅˆŅƒĐē вĐēĐģадОĐē: ШвидĐēĐž СĐŊĐ°Ņ…ĐžĐ´ŅŒŅ‚Đĩ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊŅ– вĐēĐģадĐēи Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ Ņ„ŅƒĐŊĐē҆Җҗ ĐŋĐžŅˆŅƒĐē҃ +- ХиĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ ĐŧŅ–Đļ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅĐŧи: Đ”ĐžŅŅ‚ŅƒĐŋ Đ´Đž СйĐĩŅ€ĐĩĐļĐĩĐŊĐ¸Ņ… вĐēĐģадОĐē С ĐąŅƒĐ´ŅŒ-ŅĐēĐžĐŗĐž ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ ҇ĐĩŅ€ĐĩС Đ˛Đ°Ņˆ ОйĐģŅ–ĐēОвиК СаĐŋĐ¸Ņ +- ĐĸĐĩĐŧĐŊиК Ņ€ĐĩĐļиĐŧ: ĐŸŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐēа Ņ‚ĐĩĐŧĐŊĐžĐŗĐž Ņ€ĐĩĐļиĐŧ҃ Đ´ĐģŅ ĐąŅ–ĐģҌ҈ ĐēĐžĐŧŅ„ĐžŅ€Ņ‚ĐŊĐžĐŗĐž виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ +- ПĐĩŅ€ŅĐžĐŊаĐģŅ–ĐˇĐ°Ņ†Ņ–Ņ: ЗĐŧŅ–ĐŊŅŽĐšŅ‚Đĩ СОвĐŊŅ–ŅˆĐŊŅ–Đš Đ˛Đ¸ĐŗĐģŅĐ´ Ņ– ĐŋОвĐĩĐ´Ņ–ĐŊĐē҃ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ ĐŋŅ–Đ´ ŅĐ˛ĐžŅ— ĐŋĐžŅ‚Ņ€Đĩйи + +Đ’Ņ–Đ´Đ˛Ņ–Đ´Đ°ĐšŅ‚Đĩ ĐŊĐ°Ņˆ ĐąĐģĐžĐŗ, Ņ‰ĐžĐą Đ´Ņ–ĐˇĐŊĐ°Ņ‚Đ¸ŅŅ ĐąŅ–ĐģҌ҈Đĩ ĐŋŅ€Đž Đ˛ŅŅ– ĐŊĐžĐ˛Ņ– Ņ„ŅƒĐŊĐē҆Җҗ Ņ‚Đ° ĐŋĐžĐēŅ€Đ°Ņ‰ĐĩĐŊĐŊŅ ҃ Đ’Ņ–Đ´ĐēĐģадĐĩĐŊĐ¸Ņ… вĐēĐģадĐēĐ°Ņ… 3.0 Са ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅĐŧ: +https://at.xfox111.net/tabs-aside-3-0 + +## До Ņ€Đĩ҇Җ, ҆Đĩ ĐžĐŋĐĩĐŊŅĐžŅ€Ņ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ! +Đ¯ĐēŅ‰Đž ви СĐŊĐ°Ņ”Ņ‚Đĩ, ŅĐē ĐŋĐžĐēŅ€Đ°Ņ‰Đ¸Ņ‚Đ¸ ҆Đĩ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ, ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛Ņ–Đ´Đ˛Ņ–Đ´Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Ņ–Đš ĐŊа GitHub: +https://github.com/xfox111/TabsAsideExtension + +ĐĄĐŋĐ¸ŅĐžĐē СĐŧŅ–ĐŊ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— вĐĩҀҁҖҗ: +https://github.com/xfox111/TabsAsideExtension/releases/latest + + + + + +ĐĐ°Đ´Đ¸Ņ…ĐŊŅƒŅ‚Đĩ Ņ„ŅƒĐŊĐēŅ†Ņ–Ņ”ŅŽ ĐŋĐĩŅ€ŅˆĐ¸Ņ… вĐĩŅ€ŅŅ–Đš Microsoft Edge, ҆Đĩ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ ŅŅ‚Đ°ĐģĐž ĐŊĐ°ĐąĐ°ĐŗĐ°Ņ‚Đž ĐąŅ–ĐģҌ҈Đĩ, ĐŊŅ–Đļ ĐŋŅ€ĐžŅŅ‚Đž Ņ‚Đ¸ĐŧŅ‡Đ°ŅĐžĐ˛Đĩ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đĩ Đ´ĐģŅ вĐēĐģадОĐē. + +ВоĐŊĐž дОСвОĐģŅŅ” СйĐĩŅ€Ņ–ĐŗĐ°Ņ‚Đ¸ Ņ‚Đ° ĐēĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛Đ°ŅˆĐ¸Đŧи вĐēĐģадĐēаĐŧи ĐˇŅ€ŅƒŅ‡ĐŊĐž, ĐŊĐ°Đ´Đ°ŅŽŅ‡Đ¸ ĐąĐĩСĐģҖ҇ Ņ„ŅƒĐŊĐēŅ†Ņ–Đš, ŅĐēŅ– ҁĐŋŅ€ĐžŅ‰ŅƒŅŽŅ‚ŅŒ ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–ŅŽ Ņ‚Đ° Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž СйĐĩŅ€ĐĩĐļĐĩĐŊĐ¸Ņ… вĐēĐģадОĐē. + +МоĐļĐģĐ¸Đ˛ĐžŅŅ‚Ņ– +
    +
  • ЗбĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ вĐēĐģадОĐē: ЗбĐĩŅ€ĐĩĐļŅ–Ņ‚ŅŒ ŅƒŅŅ– Đ˛Ņ–Đ´ĐēŅ€Đ¸Ņ‚Ņ– вĐēĐģадĐēи ОдĐŊиĐŧ ĐēĐģŅ–ĐēĐžĐŧ Ņ– Đ˛Ņ–Đ´ĐŊĐžĐ˛Ņ–Ņ‚ŅŒ Ņ—Ņ… ĐŋŅ–ĐˇĐŊŅ–ŅˆĐĩ
  • +
  • ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ вĐēĐģадОĐē: ĐĄŅ‚Đ˛ĐžŅ€ŅŽĐšŅ‚Đĩ ĐēĐžĐģĐĩĐē҆Җҗ Ņ‚Đ° ĐŋŅ–Đ´ĐŗŅ€ŅƒĐŋи Đ´ĐģŅ ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— СйĐĩŅ€ĐĩĐļĐĩĐŊĐ¸Ņ… вĐēĐģадОĐē
  • +
  • ĐŸĐžŅˆŅƒĐē вĐēĐģадОĐē: ШвидĐēĐž СĐŊĐ°Ņ…ĐžĐ´ŅŒŅ‚Đĩ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊŅ– вĐēĐģадĐēи Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ Ņ„ŅƒĐŊĐē҆Җҗ ĐŋĐžŅˆŅƒĐē҃
  • +
  • ХиĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ ĐŧŅ–Đļ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅĐŧи: Đ”ĐžŅŅ‚ŅƒĐŋ Đ´Đž СйĐĩŅ€ĐĩĐļĐĩĐŊĐ¸Ņ… вĐēĐģадОĐē С ĐąŅƒĐ´ŅŒ-ŅĐēĐžĐŗĐž ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ ҇ĐĩŅ€ĐĩС Đ˛Đ°Ņˆ ОйĐģŅ–ĐēОвиК СаĐŋĐ¸Ņ
  • +
  • ĐĸĐĩĐŧĐŊиК Ņ€ĐĩĐļиĐŧ: ĐŸŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐēа Ņ‚ĐĩĐŧĐŊĐžĐŗĐž Ņ€ĐĩĐļиĐŧ҃ Đ´ĐģŅ ĐąŅ–ĐģҌ҈ ĐēĐžĐŧŅ„ĐžŅ€Ņ‚ĐŊĐžĐŗĐž виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ
  • +
  • ПĐĩŅ€ŅĐžĐŊаĐģŅ–ĐˇĐ°Ņ†Ņ–Ņ: ЗĐŧŅ–ĐŊŅŽĐšŅ‚Đĩ СОвĐŊŅ–ŅˆĐŊŅ–Đš Đ˛Đ¸ĐŗĐģŅĐ´ Ņ– ĐŋОвĐĩĐ´Ņ–ĐŊĐē҃ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ ĐŋŅ–Đ´ ŅĐ˛ĐžŅ— ĐŋĐžŅ‚Ņ€Đĩйи
  • +
+ +Đ’Ņ–Đ´Đ˛Ņ–Đ´Đ°ĐšŅ‚Đĩ ĐŊĐ°Ņˆ ĐąĐģĐžĐŗ, Ņ‰ĐžĐą Đ´Ņ–ĐˇĐŊĐ°Ņ‚Đ¸ŅŅ ĐąŅ–ĐģҌ҈Đĩ ĐŋŅ€Đž Đ˛ŅŅ– ĐŊĐžĐ˛Ņ– Ņ„ŅƒĐŊĐē҆Җҗ Ņ‚Đ° ĐŋĐžĐēŅ€Đ°Ņ‰ĐĩĐŊĐŊŅ ҃ Đ’Ņ–Đ´ĐēĐģадĐĩĐŊĐ¸Ņ… вĐēĐģадĐēĐ°Ņ… 3.0 + +До Ņ€Đĩ҇Җ, ҆Đĩ ĐžĐŋĐĩĐŊŅĐžŅ€Ņ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ! +Đ¯ĐēŅ‰Đž ви СĐŊĐ°Ņ”Ņ‚Đĩ, ŅĐē ĐŋĐžĐēŅ€Đ°Ņ‰Đ¸Ņ‚Đ¸ ҆Đĩ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ, ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛Ņ–Đ´Đ˛Ņ–Đ´Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Ņ–Đš ĐŊа GitHub + +ĐĄĐŋĐ¸ŅĐžĐē СĐŧŅ–ĐŊ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— вĐĩҀҁҖҗ diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..f39bbb5 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "./.wxt/tsconfig.json", + "compilerOptions": { + "allowImportingTsExtensions": true, + "jsx": "react-jsx", + "strict": true, + "strictNullChecks": true + } +} diff --git a/utils/browserLocaleKey.ts b/utils/browserLocaleKey.ts new file mode 100644 index 0000000..0b2979a --- /dev/null +++ b/utils/browserLocaleKey.ts @@ -0,0 +1,8 @@ +const browserLocaleKey: "firefox" | "edge" | "chrome" = + import.meta.env.FIREFOX ? + "firefox" : + import.meta.env.EDGE ? + "edge" : + "chrome"; + +export default browserLocaleKey; diff --git a/utils/extLink.ts b/utils/extLink.ts new file mode 100644 index 0000000..e3ccc98 --- /dev/null +++ b/utils/extLink.ts @@ -0,0 +1,7 @@ +const extLink = (href: string) => ({ + href, + target: "_blank", + rel: "noopener" +}); + +export default extLink; diff --git a/utils/getLogger.ts b/utils/getLogger.ts new file mode 100644 index 0000000..0aacb49 --- /dev/null +++ b/utils/getLogger.ts @@ -0,0 +1,13 @@ +/** + * Creates a logger function for a specific component. + * The logger prepends a standardized prefix to all log messages, + * indicating the component name for easier debugging. + * + * @param component - The name of the component to include in the log prefix. + * @returns A logging function that accepts any number of arguments and logs them + * to the console with the component-specific prefix. + */ +export default function getLogger(component: string): (...data: any[]) => void +{ + return (...data: any[]): void => console.log(`[TabsAside.${component}]`, ...data); +} diff --git a/utils/messaging.ts b/utils/messaging.ts new file mode 100644 index 0000000..d7dfbdf --- /dev/null +++ b/utils/messaging.ts @@ -0,0 +1,26 @@ +import { GraphicsStorage } from "@/models/CollectionModels"; +import { defineExtensionMessaging, ExtensionMessenger } from "@webext-core/messaging"; + +type ProtocolMap = + { + addThumbnail(data: { url: string; thumbnail: string; }): void; + getGraphicsCache(): GraphicsStorage; + refreshCollections(): void; + }; + +const protocol: ExtensionMessenger = defineExtensionMessaging(); + +export const onMessage = protocol.onMessage; + +export const sendMessage: ExtensionMessenger["sendMessage"] = async (...args) => +{ + try + { + return await protocol.sendMessage(...args); + } + catch (ex) + { + console.error(ex); + return undefined!; + } +}; diff --git a/utils/saveTabsToCollection.ts b/utils/saveTabsToCollection.ts new file mode 100644 index 0000000..9461ac9 --- /dev/null +++ b/utils/saveTabsToCollection.ts @@ -0,0 +1,134 @@ +import { CollectionItem, GroupItem } from "@/models/CollectionModels"; +import { Tabs } from "wxt/browser"; +import { settings } from "./settings"; +import sendNotification from "./sendNotification"; + +export default async function saveTabsToCollection(closeTabs: boolean): Promise +{ + let tabs: Tabs.Tab[] = await browser.tabs.query({ + currentWindow: true, + highlighted: true + }); + + if (tabs.length < 2) + { + const ignorePinned: boolean = await settings.ignorePinned.getValue(); + tabs = await browser.tabs.query({ + currentWindow: true, + pinned: ignorePinned ? false : undefined + }); + } + + const [collection, tabsToClose] = await createCollectionFromTabs(tabs); + + if (closeTabs) + await browser.tabs.remove(tabsToClose.map(i => i.id!)); + + return collection; +} + +async function createCollectionFromTabs(tabs: Tabs.Tab[]): Promise<[CollectionItem, Tabs.Tab[]]> +{ + if (tabs.length < 1) + return [{ type: "collection", timestamp: Date.now(), items: [] }, []]; + + const tabCount: number = tabs.length; + + tabs = tabs.filter(i => + i.url && + !i.url.startsWith(browser.runtime.getURL("/")) && + new URL(i.url).protocol !== "about:" && + new URL(i.url).hostname !== "newtab" + ); + + const collection: CollectionItem = { + type: "collection", + timestamp: Date.now(), + items: [] + }; + + let tabIndex: number = 0; + + if (tabs[tabIndex].pinned) + { + collection.items.push({ type: "group", pinned: true, items: [] }); + + for (; tabIndex < tabs.length; tabIndex++) + { + if (!tabs[tabIndex].pinned) + break; + + (collection.items[0] as GroupItem).items.push({ + type: "tab", + url: tabs[tabIndex].url!, + title: tabs[tabIndex].title + }); + } + } + + if (import.meta.env.FIREFOX) + { + for (; tabIndex < tabs.length; tabIndex++) + collection.items.push({ type: "tab", url: tabs[tabIndex].url!, title: tabs[tabIndex].title }); + + return [collection, tabs]; + } + + // Special case, if all tabs are in the same group, create a collection with the group title + if (tabs[0].groupId && tabs[0].groupId !== chrome.tabGroups.TAB_GROUP_ID_NONE && + tabs.every(i => i.groupId === tabs[0].groupId) + ) + { + const group = await browser.tabGroups!.get(tabs[0].groupId); + collection.title = group.title; + collection.color = group.color; + + tabs.forEach(i => + collection.items.push({ type: "tab", url: i.url!, title: i.title }) + ); + + return [collection, tabs]; + } + + let activeGroup: number | null = null; + + for (; tabIndex < tabs.length; tabIndex++) + { + const tab = tabs[tabIndex]; + + if (!tab.groupId || tab.groupId === chrome.tabGroups.TAB_GROUP_ID_NONE) + { + collection.items.push({ type: "tab", url: tab.url!, title: tab.title }); + activeGroup = null; + continue; + } + + if (!activeGroup || activeGroup !== tab.groupId) + { + activeGroup = tab.groupId; + const group = await browser.tabGroups!.get(activeGroup); + + collection.items.push({ + type: "group", + color: group.color, + title: group.title, + items: [] + }); + } + + (collection.items[collection.items.length - 1] as GroupItem).items.push({ + type: "tab", + url: tab.url!, + title: tab.title + }); + } + + if (tabs.length < tabCount) + await sendNotification({ + title: i18n.t("notifications.partial_save.title"), + message: i18n.t("notifications.partial_save.message"), + icon: "/notification_icons/save_warning.png" + }); + + return [collection, tabs]; +} diff --git a/utils/sendNotification.ts b/utils/sendNotification.ts new file mode 100644 index 0000000..40d35dc --- /dev/null +++ b/utils/sendNotification.ts @@ -0,0 +1,26 @@ +import { PublicPath } from "wxt/browser"; + +export default async function sendNotification(props: NotificationProps): Promise +{ + try + { + await browser.notifications.create({ + type: "basic", + title: props.title, + message: props.message, + iconUrl: browser.runtime.getURL(props.icon) + }); + } + catch (ex) + { + console.error("Error while showing cloud error notification (probably because of user restrictions)"); + console.error(ex); + } +} + +export type NotificationProps = + { + title: string; + message: string; + icon: PublicPath; + }; diff --git a/utils/settings.tsx b/utils/settings.tsx new file mode 100644 index 0000000..eb4753e --- /dev/null +++ b/utils/settings.tsx @@ -0,0 +1,99 @@ +import { CollectionSortMode } from "@/entrypoints/sidepanel/utils/sortCollections"; + +export const settings = { + defaultRestoreAction: storage.defineItem<"open" | "restore">( + "sync:defaultRestoreAction", + { + fallback: "open", + version: 1 + } + ), + + defaultSaveAction: storage.defineItem<"save" | "set_aside">( + "sync:defaultSaveAction", + { + fallback: "set_aside", + version: 1 + } + ), + + dismissOnLoad: storage.defineItem( + "sync:dismissOnLoad", + { + fallback: false, + version: 1 + } + ), + + deletePrompt: storage.defineItem( + "sync:deletePrompt", + { + fallback: true, + version: 1 + } + ), + + tilesView: storage.defineItem( + "sync:tilesView", + { + fallback: true, + version: 1 + } + ), + + sortMode: storage.defineItem( + "sync:sortMode", + { + fallback: "custom", + version: 1 + } + ), + + ignorePinned: storage.defineItem( + "sync:ignorePinned", + { + fallback: true, + version: 1 + } + ), + + alwaysShowToolbars: storage.defineItem( + "sync:alwaysShowToolbars", + { + fallback: false, + version: 1 + } + ), + + showBadge: storage.defineItem( + "sync:showBadge", + { + fallback: true, + version: 1 + } + ), + + contextAction: storage.defineItem<"action" | "context" | "open">( + "sync:contextAction", + { + fallback: "open", + version: 1 + } + ), + + listLocation: storage.defineItem<"sidebar" | "popup" | "tab" | "pinned">( + "sync:listLocation", + { + fallback: "sidebar", + version: 1 + } + ), + + notifyOnSave: storage.defineItem( + "sync:notifyOnSave", + { + fallback: true, + version: 1 + } + ) +}; diff --git a/utils/watchTabSelection.ts b/utils/watchTabSelection.ts new file mode 100644 index 0000000..20e95a4 --- /dev/null +++ b/utils/watchTabSelection.ts @@ -0,0 +1,20 @@ +import { Unwatch } from "wxt/storage"; + +export default function watchTabSelection(onChange: TabSelectChangeHandler): Unwatch +{ + const handleTabSelection = async () => + { + const highlightedTabs = await browser.tabs.query({ + currentWindow: true, + highlighted: true + }); + onChange(highlightedTabs.length > 1 ? "selected" : "all"); + }; + + handleTabSelection(); + browser.tabs.onHighlighted.addListener(handleTabSelection); + + return () => browser.tabs.onHighlighted.removeListener(handleTabSelection); +} + +export type TabSelectChangeHandler = (selection: "all" | "selected") => void; diff --git a/web-ext.config.js b/web-ext.config.js new file mode 100644 index 0000000..3ae7115 --- /dev/null +++ b/web-ext.config.js @@ -0,0 +1,11 @@ +import { defineRunnerConfig } from "wxt"; + +export default defineRunnerConfig({ + binaries: + { + edge: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe" + }, + chromiumArgs: [ + "--lang=en-US" + ] +}); diff --git a/wxt.config.ts b/wxt.config.ts new file mode 100644 index 0000000..a413367 --- /dev/null +++ b/wxt.config.ts @@ -0,0 +1,89 @@ +import { ConfigEnv, defineConfig, UserManifest } from "wxt"; + +// See https://wxt.dev/api/config.html +export default defineConfig({ + modules: ["@wxt-dev/module-react", "@wxt-dev/i18n/module"], + imports: { + dirsScanOptions: + { + // Disable auto-imports for project's files + fileFilter: () => false + } + }, + + manifest: ({ browser }: ConfigEnv) => + { + const manifest: UserManifest = { + name: "__MSG_manifest_name__", + description: "__MSG_manifest_description__", + homepage_url: "https://github.com/xfox111/TabsAsideExtension/", + + action: { + default_title: "__MSG_manifest_name__" + }, + + default_locale: "en", + permissions: + [ + "storage", + "unlimitedStorage", + "tabs", + "notifications", + "contextMenus", + "bookmarks" + ], + + commands: + { + show_collections: + { + suggested_key: + { + default: "Alt+P", + mac: "MacCtrl+P" + }, + description: "__MSG_shortcuts_toggle_sidebar__" + }, + set_aside: { + suggested_key: + { + default: "Alt+T", + mac: "MacCtrl+T" + }, + description: "__MSG_shortcuts_set_aside__" + }, + save: + { + suggested_key: + { + default: "Alt+U", + mac: "MacCtrl+U" + }, + description: "__MSG_shortcuts_save_tabs__" + } + }, + + host_permissions: [""] + }; + + if (browser === "firefox") + { + manifest.browser_specific_settings = { + gecko: + { + id: "tabs-aside@xfox111.net", + strict_min_version: "109.0" + } + }; + + // @ts-expect-error author key in Firefox has a different format + manifest.author = "__MSG_manifest_author__"; + } + else + { + manifest.permissions!.push("tabGroups"); + } + + return manifest; + } +}); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..81296f7 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,6889 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@1natsu/wait-element@^4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@1natsu/wait-element/-/wait-element-4.1.2.tgz#f18b031dc9fb4ac22e114ed04daeef1fbde2217f" + integrity sha512-qWxSJD+Q5b8bKOvESFifvfZ92DuMsY+03SBNjTO34ipJLP6mZ9yK4bQz/vlh48aEQXoJfaZBqUwKL5BdI5iiWw== + dependencies: + defu "^6.1.4" + many-keys-map "^2.0.1" + +"@aklinker1/rollup-plugin-visualizer@5.12.0": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@aklinker1/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.12.0.tgz#259d7ab48248eaea6439b7b281a5d1b262c21bb6" + integrity sha512-X24LvEGw6UFmy0lpGJDmXsMyBD58XmX1bbwsaMLhNoM+UMQfQ3b2RtC+nz4b/NoRK5r6QJSKJHBNVeUdwqybaQ== + dependencies: + open "^8.4.0" + picomatch "^2.3.1" + source-map "^0.7.4" + yargs "^17.5.1" + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@babel/code-frame@^7.21.4", "@babel/code-frame@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== + dependencies: + "@babel/helper-validator-identifier" "^7.27.1" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/compat-data@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.27.1.tgz#db7cf122745e0a332c44e847ddc4f5e5221a43f6" + integrity sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A== + +"@babel/core@^7.26.10": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.27.1.tgz#89de51e86bd12246003e3524704c49541b16c3e6" + integrity sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.27.1" + "@babel/helper-compilation-targets" "^7.27.1" + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helpers" "^7.27.1" + "@babel/parser" "^7.27.1" + "@babel/template" "^7.27.1" + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.1.tgz#862d4fad858f7208edd487c28b58144036b76230" + integrity sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w== + dependencies: + "@babel/parser" "^7.27.1" + "@babel/types" "^7.27.1" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/helper-compilation-targets@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz#eac1096c7374f161e4f33fc8ae38f4ddf122087a" + integrity sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g== + dependencies: + "@babel/compat-data" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-module-imports@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-module-transforms@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz#e1663b8b71d2de948da5c4fb2a20ca4f3ec27a6f" + integrity sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/helper-plugin-utils@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" + integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== + +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== + +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== + +"@babel/helpers@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.1.tgz#ffc27013038607cdba3288e692c3611c06a18aa4" + integrity sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ== + dependencies: + "@babel/template" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.25.4", "@babel/parser@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.1.tgz#c55d5bed74449d1223701f1869b9ee345cc94cc9" + integrity sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ== + dependencies: + "@babel/types" "^7.27.1" + +"@babel/plugin-transform-react-jsx-self@^7.25.9": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz#af678d8506acf52c577cac73ff7fe6615c85fc92" + integrity sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-react-jsx-source@^7.25.9": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz#dcfe2c24094bb757bf73960374e7c55e434f19f0" + integrity sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/runtime@7.27.0": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.0.tgz#fbee7cf97c709518ecc1f590984481d5460d4762" + integrity sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.1.tgz#9fce313d12c9a77507f264de74626e87fd0dc541" + integrity sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog== + +"@babel/template@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.1.tgz#b9e4f55c17a92312774dfbdde1b3c01c547bbae2" + integrity sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/traverse@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.1.tgz#4db772902b133bbddd1c4f7a7ee47761c1b9f291" + integrity sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.27.1" + "@babel/parser" "^7.27.1" + "@babel/template" "^7.27.1" + "@babel/types" "^7.27.1" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.4", "@babel/types@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.1.tgz#9defc53c16fc899e46941fc6901a9eea1c9d8560" + integrity sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + +"@ctrl/tinycolor@^3.3.4": + version "3.6.1" + resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz#b6c75a56a1947cc916ea058772d666a2c8932f31" + integrity sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA== + +"@devicefarmer/adbkit-logcat@^2.1.2": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@devicefarmer/adbkit-logcat/-/adbkit-logcat-2.1.3.tgz#c7a1fb58e500f5799711f32906a2210c0d1ac5ac" + integrity sha512-yeaGFjNBc/6+svbDeul1tNHtNChw6h8pSHAt5D+JsedUrMTN7tla7B15WLDyekxsuS2XlZHRxpuC6m92wiwCNw== + +"@devicefarmer/adbkit-monkey@~1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@devicefarmer/adbkit-monkey/-/adbkit-monkey-1.2.1.tgz#28cd6a121c5d572588081dd1c53454c604eef241" + integrity sha512-ZzZY/b66W2Jd6NHbAhLyDWOEIBWC11VizGFk7Wx7M61JZRz7HR9Cq5P+65RKWUU7u6wgsE8Lmh9nE4Mz+U2eTg== + +"@devicefarmer/adbkit@3.3.8": + version "3.3.8" + resolved "https://registry.yarnpkg.com/@devicefarmer/adbkit/-/adbkit-3.3.8.tgz#04bc35cb3a2d7385f2e22de40f54162088083183" + integrity sha512-7rBLLzWQnBwutH2WZ0EWUkQdihqrnLYCUMaB44hSol9e0/cdIhuNFcqZO0xNheAU6qqHVA8sMiLofkYTgb+lmw== + dependencies: + "@devicefarmer/adbkit-logcat" "^2.1.2" + "@devicefarmer/adbkit-monkey" "~1.2.1" + bluebird "~3.7" + commander "^9.1.0" + debug "~4.3.1" + node-forge "^1.3.1" + split "~1.0.1" + +"@dnd-kit/accessibility@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz#3b4202bd6bb370a0730f6734867785919beac6af" + integrity sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw== + dependencies: + tslib "^2.0.0" + +"@dnd-kit/core@^6.3.1": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@dnd-kit/core/-/core-6.3.1.tgz#4c36406a62c7baac499726f899935f93f0e6d003" + integrity sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ== + dependencies: + "@dnd-kit/accessibility" "^3.1.1" + "@dnd-kit/utilities" "^3.2.2" + tslib "^2.0.0" + +"@dnd-kit/modifiers@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@dnd-kit/modifiers/-/modifiers-9.0.0.tgz#96a0280c77b10c716ef79d9792ce7ad04370771d" + integrity sha512-ybiLc66qRGuZoC20wdSSG6pDXFikui/dCNGthxv4Ndy8ylErY0N3KVxY2bgo7AWwIbxDmXDg3ylAFmnrjcbVvw== + dependencies: + "@dnd-kit/utilities" "^3.2.2" + tslib "^2.0.0" + +"@dnd-kit/sortable@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@dnd-kit/sortable/-/sortable-10.0.0.tgz#1f9382b90d835cd5c65d92824fa9dafb78c4c3e8" + integrity sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg== + dependencies: + "@dnd-kit/utilities" "^3.2.2" + tslib "^2.0.0" + +"@dnd-kit/utilities@^3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@dnd-kit/utilities/-/utilities-3.2.2.tgz#5a32b6af356dc5f74d61b37d6f7129a4040ced7b" + integrity sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg== + dependencies: + tslib "^2.0.0" + +"@emotion/hash@^0.9.0": + version "0.9.2" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.2.tgz#ff9221b9f58b4dfe61e619a7788734bd63f6898b" + integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g== + +"@esbuild/aix-ppc64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz#014180d9a149cffd95aaeead37179433f5ea5437" + integrity sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ== + +"@esbuild/android-arm64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz#649e47e04ddb24a27dc05c395724bc5f4c55cbfe" + integrity sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ== + +"@esbuild/android-arm@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.3.tgz#8a0f719c8dc28a4a6567ef7328c36ea85f568ff4" + integrity sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A== + +"@esbuild/android-x64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.3.tgz#e2ab182d1fd06da9bef0784a13c28a7602d78009" + integrity sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ== + +"@esbuild/darwin-arm64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz#c7f3166fcece4d158a73dcfe71b2672ca0b1668b" + integrity sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w== + +"@esbuild/darwin-x64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz#d8c5342ec1a4bf4b1915643dfe031ba4b173a87a" + integrity sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A== + +"@esbuild/freebsd-arm64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz#9f7d789e2eb7747d4868817417cc968ffa84f35b" + integrity sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw== + +"@esbuild/freebsd-x64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz#8ad35c51d084184a8e9e76bb4356e95350a64709" + integrity sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q== + +"@esbuild/linux-arm64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz#3af0da3d9186092a9edd4e28fa342f57d9e3cd30" + integrity sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A== + +"@esbuild/linux-arm@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz#e91cafa95e4474b3ae3d54da12e006b782e57225" + integrity sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ== + +"@esbuild/linux-ia32@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz#81025732d85b68ee510161b94acdf7e3007ea177" + integrity sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw== + +"@esbuild/linux-loong64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz#3c744e4c8d5e1148cbe60a71a11b58ed8ee5deb8" + integrity sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g== + +"@esbuild/linux-mips64el@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz#1dfe2a5d63702db9034cc6b10b3087cc0424ec26" + integrity sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag== + +"@esbuild/linux-ppc64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz#2e85d9764c04a1ebb346dc0813ea05952c9a5c56" + integrity sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg== + +"@esbuild/linux-riscv64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz#a9ea3334556b09f85ccbfead58c803d305092415" + integrity sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA== + +"@esbuild/linux-s390x@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz#f6a7cb67969222b200974de58f105dfe8e99448d" + integrity sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ== + +"@esbuild/linux-x64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz#a237d3578ecdd184a3066b1f425e314ade0f8033" + integrity sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA== + +"@esbuild/netbsd-arm64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz#4c15c68d8149614ddb6a56f9c85ae62ccca08259" + integrity sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA== + +"@esbuild/netbsd-x64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz#12f6856f8c54c2d7d0a8a64a9711c01a743878d5" + integrity sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g== + +"@esbuild/openbsd-arm64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz#ca078dad4a34df192c60233b058db2ca3d94bc5c" + integrity sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ== + +"@esbuild/openbsd-x64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz#c9178adb60e140e03a881d0791248489c79f95b2" + integrity sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w== + +"@esbuild/sunos-x64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz#03765eb6d4214ff27e5230af779e80790d1ee09f" + integrity sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA== + +"@esbuild/win32-arm64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz#f1c867bd1730a9b8dfc461785ec6462e349411ea" + integrity sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ== + +"@esbuild/win32-ia32@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz#77491f59ef6c9ddf41df70670d5678beb3acc322" + integrity sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew== + +"@esbuild/win32-x64@0.25.3": + version "0.25.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz#b17a2171f9074df9e91bfb07ef99a892ac06412a" + integrity sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.7.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" + integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + +"@eslint/config-array@^0.20.0": + version "0.20.0" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.20.0.tgz#7a1232e82376712d3340012a2f561a2764d1988f" + integrity sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ== + dependencies: + "@eslint/object-schema" "^2.1.6" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/config-helpers@^0.2.1": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.2.2.tgz#3779f76b894de3a8ec4763b79660e6d54d5b1010" + integrity sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg== + +"@eslint/core@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.12.0.tgz#5f960c3d57728be9f6c65bd84aa6aa613078798e" + integrity sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/core@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.13.0.tgz#bf02f209846d3bf996f9e8009db62df2739b458c" + integrity sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/css-tree@^3.3.3": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@eslint/css-tree/-/css-tree-3.5.0.tgz#23a9cc7759893e84178418390a02646f4d2e6ce5" + integrity sha512-RtpdRxIq6AVf078nY0oqZ+x5UTzuxdt/Q2n3RmA4mcfTQVtsvdoIvOxo+4qikydlr6WskqIIofXc5KeGwTYLeg== + dependencies: + mdn-data "2.20.0" + source-map-js "^1.0.1" + +"@eslint/css@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@eslint/css/-/css-0.7.0.tgz#e864fb73334fefef3385e28832ce9f3ae846d034" + integrity sha512-d6mo8etv4igrTGxgvWSgA5+TsppfObM/Xhlu8JWbkqNBiaJXztUNH45R1B4i1GL2PNIFMLREI3Kh9lTBi19l7g== + dependencies: + "@eslint/core" "^0.13.0" + "@eslint/css-tree" "^3.3.3" + "@eslint/plugin-kit" "^0.2.5" + +"@eslint/eslintrc@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964" + integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@9.26.0", "@eslint/js@^9.26.0": + version "9.26.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.26.0.tgz#1e13126b67a3db15111d2dcc61f69a2acff70bd5" + integrity sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ== + +"@eslint/json@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@eslint/json/-/json-0.12.0.tgz#7d1cb7152d01f3837703c154a5b38233f409395e" + integrity sha512-n/7dz8HFStpEe4o5eYk0tdkBdGUS/ZGb0GQCeDWN1ZmRq67HMHK4vC33b0rQlTT6xdZoX935P4vstiWVk5Ying== + dependencies: + "@eslint/core" "^0.12.0" + "@eslint/plugin-kit" "^0.2.7" + "@humanwhocodes/momoa" "^3.3.4" + natural-compare "^1.4.0" + +"@eslint/object-schema@^2.1.6": + version "2.1.6" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" + integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== + +"@eslint/plugin-kit@^0.2.5", "@eslint/plugin-kit@^0.2.7", "@eslint/plugin-kit@^0.2.8": + version "0.2.8" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz#47488d8f8171b5d4613e833313f3ce708e3525f8" + integrity sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA== + dependencies: + "@eslint/core" "^0.13.0" + levn "^0.4.1" + +"@floating-ui/core@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.7.0.tgz#1aff27a993ea1b254a586318c29c3b16ea0f4d0a" + integrity sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA== + dependencies: + "@floating-ui/utils" "^0.2.9" + +"@floating-ui/devtools@0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@floating-ui/devtools/-/devtools-0.2.1.tgz#3e8023e09ede273a7aa426e7911f3dac630024c5" + integrity sha512-8PHJLbD6VhBh+LJ1uty/Bz30qs02NXCE5u8WpOhSewlYXUWl03GNXknr9AS2yaAWJEQaY27x7eByJs44gODBcw== + +"@floating-ui/dom@^1.6.12": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.0.tgz#f9f83ee4fee78ac23ad9e65b128fc11a27857532" + integrity sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg== + dependencies: + "@floating-ui/core" "^1.7.0" + "@floating-ui/utils" "^0.2.9" + +"@floating-ui/utils@^0.2.9": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.9.tgz#50dea3616bc8191fb8e112283b49eaff03e78429" + integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg== + +"@fluentui/keyboard-keys@^9.0.8": + version "9.0.8" + resolved "https://registry.yarnpkg.com/@fluentui/keyboard-keys/-/keyboard-keys-9.0.8.tgz#812b923f20d428f3c5cdff9922a4478b59e907c5" + integrity sha512-iUSJUUHAyTosnXK8O2Ilbfxma+ZyZPMua5vB028Ys96z80v+LFwntoehlFsdH3rMuPsA8GaC1RE7LMezwPBPdw== + dependencies: + "@swc/helpers" "^0.5.1" + +"@fluentui/priority-overflow@^9.1.15": + version "9.1.15" + resolved "https://registry.yarnpkg.com/@fluentui/priority-overflow/-/priority-overflow-9.1.15.tgz#edce236aa21024ead00dbf6e7c5e4eaa89cd6a1d" + integrity sha512-/3jPBBq64hRdA416grVj+ZeMBUIaKZk2S5HiRg7CKCAV1JuyF84Do0rQI6ns8Vb9XOGuc4kurMcL/UEftoEVrg== + dependencies: + "@swc/helpers" "^0.5.1" + +"@fluentui/react-accordion@^9.6.8": + version "9.6.8" + resolved "https://registry.yarnpkg.com/@fluentui/react-accordion/-/react-accordion-9.6.8.tgz#b11d8823aed71176ab5147dcc3ef5a96c5255f4b" + integrity sha512-KE3YNGPTsN7tbnAfgbs7THAFfURj+yvO2GgEIVr++2xTgHXR7GEwM7RrbE1ZbJZM7gbeGE5rCg006OBfE4qbuQ== + dependencies: + "@fluentui/react-aria" "^9.14.6" + "@fluentui/react-context-selector" "^9.1.76" + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-motion" "^9.7.2" + "@fluentui/react-motion-components-preview" "^0.4.9" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-alert@9.0.0-beta.124": + version "9.0.0-beta.124" + resolved "https://registry.yarnpkg.com/@fluentui/react-alert/-/react-alert-9.0.0-beta.124.tgz#b408971fd5b1e76bdca20fcae280a527858ad2f5" + integrity sha512-yFBo3B5H9hnoaXxlkuz8wRz04DEyQ+ElYA/p5p+Vojf19Zuta8DmFZZ6JtWdtxcdnnQ4LvAfC5OYYlzdReozPA== + dependencies: + "@fluentui/react-avatar" "^9.6.29" + "@fluentui/react-button" "^9.3.83" + "@fluentui/react-icons" "^2.0.239" + "@fluentui/react-jsx-runtime" "^9.0.39" + "@fluentui/react-tabster" "^9.21.5" + "@fluentui/react-theme" "^9.1.19" + "@fluentui/react-utilities" "^9.18.10" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-aria@^9.14.6": + version "9.14.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-aria/-/react-aria-9.14.6.tgz#b6799e991bcd393d62744ec7b668a2587adf79b9" + integrity sha512-3vaEzujXdQxhYFzRXnkDNDImbMS0FXa8pq9WPo0JiKThsQp1QQQzdQbFsY7vfHd9aWjjWyCrRDMH25H37ZZ06w== + dependencies: + "@fluentui/keyboard-keys" "^9.0.8" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-utilities" "^9.19.0" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-avatar@^9.6.29", "@fluentui/react-avatar@^9.7.6": + version "9.7.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-avatar/-/react-avatar-9.7.6.tgz#b7b86388c61accce987edee8b00e1bf4b5b7d52a" + integrity sha512-T4W+CaGjdkWgfiI7Me+wtFj2ewZFH+GpZbSexatqDjoq5ywrFOZf+aADtaHuocHcH7hx/U3AXMvTTQyzoDMuRg== + dependencies: + "@fluentui/react-badge" "^9.2.54" + "@fluentui/react-context-selector" "^9.1.76" + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-popover" "^9.10.6" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-tooltip" "^9.6.6" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-badge@^9.2.54": + version "9.2.54" + resolved "https://registry.yarnpkg.com/@fluentui/react-badge/-/react-badge-9.2.54.tgz#63b7d0065a2fe535296f81f95c63bd255b56d048" + integrity sha512-2PU0UA0VDz/XwbYKmMmPQKg4ykYHoUsgs3oZIqdwMPM3zxuhclsFEFx2xj4nxpMKiGCTBSBTM0fdOEQwRrbluQ== + dependencies: + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-breadcrumb@^9.1.6": + version "9.1.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-breadcrumb/-/react-breadcrumb-9.1.6.tgz#deca150702603a8bba90400946f7d2c54923d797" + integrity sha512-61oH9e/6kBRhnDeSStWe0AMS/9I9nkSzTFEKHEWJDnZYPFIhvlzn56TcAtuzVUYgHV1Jsk5PRLd9aQtJL1ENYw== + dependencies: + "@fluentui/react-aria" "^9.14.6" + "@fluentui/react-button" "^9.4.6" + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-link" "^9.4.6" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-button@^9.3.83", "@fluentui/react-button@^9.4.6": + version "9.4.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-button/-/react-button-9.4.6.tgz#27151615a8d498bafeedae518bce66ae94570150" + integrity sha512-1G92nGpWOYQ7vR+3g0Y0RLeAlqpZnpHVhXpQG504+yDGIAsn76I1zt+XcD9/2uaDmoH4tXiHS1SPtShujYVXjA== + dependencies: + "@fluentui/keyboard-keys" "^9.0.8" + "@fluentui/react-aria" "^9.14.6" + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-card@^9.2.5": + version "9.2.5" + resolved "https://registry.yarnpkg.com/@fluentui/react-card/-/react-card-9.2.5.tgz#05a60b5cd84ba8d5f9cfe5feac2818ca61d44d28" + integrity sha512-ODgwhKt+GL0TbLLRb3kHuf4ftCdcat3uNdN6mcVrqsL3+elJONvd7OA02jFbU/WFVR3IKOx6dUjRYNQYol0CiA== + dependencies: + "@fluentui/keyboard-keys" "^9.0.8" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-text" "^9.4.36" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-carousel@^9.6.6": + version "9.6.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-carousel/-/react-carousel-9.6.6.tgz#ce0f3fbd6662bada5021b5e65b613e8b3f22bbb4" + integrity sha512-/08DyIdg+wn72D+ShnOUQXHqMgAsFUIlCMmyBvNlMImFIDxE6NjVXy+5Yes5mpsJYGWetmCAcECf+SQdgDsU1w== + dependencies: + "@fluentui/react-aria" "^9.14.6" + "@fluentui/react-button" "^9.4.6" + "@fluentui/react-context-selector" "^9.1.76" + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-tooltip" "^9.6.6" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + embla-carousel "^8.5.1" + embla-carousel-autoplay "^8.5.1" + embla-carousel-fade "^8.5.1" + +"@fluentui/react-checkbox@^9.3.6": + version "9.3.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-checkbox/-/react-checkbox-9.3.6.tgz#bfb4af78cef5ec260f088bc0af008d785a385e55" + integrity sha512-70HiPwnR5Ed59bulKs733xTFtm9JHQCJlaJc+l9LR6jpiZucvMqNGDfpYDqvFTbCm+FCrvo6gxmKfADAHxANWw== + dependencies: + "@fluentui/react-field" "^9.2.6" + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-label" "^9.1.87" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-color-picker@^9.0.4": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@fluentui/react-color-picker/-/react-color-picker-9.0.4.tgz#70418e9584efe01663a3cfbd797ae0cb321af906" + integrity sha512-srbVlDDo3iRcjBMH55MPKiDchIN9SWwZfvE4gpJ1PE80Bs8Frjzk1m1iRO7ZkEtedhEqvVzaWYN5BvAQE8S5qg== + dependencies: + "@ctrl/tinycolor" "^3.3.4" + "@fluentui/react-context-selector" "^9.1.76" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-combobox@^9.14.6": + version "9.14.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-combobox/-/react-combobox-9.14.6.tgz#d7c71c6da046ecd3c0631d6ebcbd08dd425cf5dc" + integrity sha512-JGkc5wW+NNlMs1P+UIMLWCzYux5SMgFMLjXuXEFP52hX8ka9Nk7l8WSTW58LRsccT5Mf6JXDiSs4CK5D6VXBOA== + dependencies: + "@fluentui/keyboard-keys" "^9.0.8" + "@fluentui/react-aria" "^9.14.6" + "@fluentui/react-context-selector" "^9.1.76" + "@fluentui/react-field" "^9.2.6" + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-portal" "^9.5.6" + "@fluentui/react-positioning" "^9.16.7" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-components@^9.63.0": + version "9.63.0" + resolved "https://registry.yarnpkg.com/@fluentui/react-components/-/react-components-9.63.0.tgz#7a65d222df0450cc447c2b72296e4ba4466fa002" + integrity sha512-2Wka+gKv70FbSWp/FUASfNZ4QctBUIl87O44B41VEcX7/ucOsHhF4yVB4KS8dgxnkL30M9mX8COu5c2bORDq4A== + dependencies: + "@fluentui/react-accordion" "^9.6.8" + "@fluentui/react-alert" "9.0.0-beta.124" + "@fluentui/react-aria" "^9.14.6" + "@fluentui/react-avatar" "^9.7.6" + "@fluentui/react-badge" "^9.2.54" + "@fluentui/react-breadcrumb" "^9.1.6" + "@fluentui/react-button" "^9.4.6" + "@fluentui/react-card" "^9.2.5" + "@fluentui/react-carousel" "^9.6.6" + "@fluentui/react-checkbox" "^9.3.6" + "@fluentui/react-color-picker" "^9.0.4" + "@fluentui/react-combobox" "^9.14.6" + "@fluentui/react-dialog" "^9.12.8" + "@fluentui/react-divider" "^9.2.86" + "@fluentui/react-drawer" "^9.7.8" + "@fluentui/react-field" "^9.2.6" + "@fluentui/react-image" "^9.1.84" + "@fluentui/react-infobutton" "9.0.0-beta.102" + "@fluentui/react-infolabel" "^9.2.0" + "@fluentui/react-input" "^9.5.6" + "@fluentui/react-label" "^9.1.87" + "@fluentui/react-link" "^9.4.6" + "@fluentui/react-list" "^9.1.6" + "@fluentui/react-menu" "^9.16.6" + "@fluentui/react-message-bar" "^9.4.7" + "@fluentui/react-motion" "^9.7.2" + "@fluentui/react-overflow" "^9.3.6" + "@fluentui/react-persona" "^9.3.6" + "@fluentui/react-popover" "^9.10.6" + "@fluentui/react-portal" "^9.5.6" + "@fluentui/react-positioning" "^9.16.7" + "@fluentui/react-progress" "^9.2.6" + "@fluentui/react-provider" "^9.20.6" + "@fluentui/react-radio" "^9.3.6" + "@fluentui/react-rating" "^9.1.6" + "@fluentui/react-search" "^9.1.6" + "@fluentui/react-select" "^9.2.6" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-skeleton" "^9.2.6" + "@fluentui/react-slider" "^9.3.7" + "@fluentui/react-spinbutton" "^9.3.6" + "@fluentui/react-spinner" "^9.5.11" + "@fluentui/react-swatch-picker" "^9.2.6" + "@fluentui/react-switch" "^9.2.6" + "@fluentui/react-table" "^9.16.6" + "@fluentui/react-tabs" "^9.7.6" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-tag-picker" "^9.5.6" + "@fluentui/react-tags" "^9.5.4" + "@fluentui/react-teaching-popover" "^9.4.5" + "@fluentui/react-text" "^9.4.36" + "@fluentui/react-textarea" "^9.4.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-toast" "^9.4.8" + "@fluentui/react-toolbar" "^9.4.5" + "@fluentui/react-tooltip" "^9.6.6" + "@fluentui/react-tree" "^9.10.9" + "@fluentui/react-utilities" "^9.19.0" + "@fluentui/react-virtualizer" "9.0.0-alpha.96" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-context-selector@^9.1.76": + version "9.1.76" + resolved "https://registry.yarnpkg.com/@fluentui/react-context-selector/-/react-context-selector-9.1.76.tgz#83541784a9d401de7034123709f6bfb2fa368421" + integrity sha512-GmkHiLuMBzYOVvPkXNhMJTusx9hf43+VizFjAhSfZWOnNwLjiekjDocs7S2XD0f3MmcVx+aB2tRdTDHxGAF/1A== + dependencies: + "@fluentui/react-utilities" "^9.19.0" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-dialog@^9.12.8": + version "9.12.8" + resolved "https://registry.yarnpkg.com/@fluentui/react-dialog/-/react-dialog-9.12.8.tgz#a81c7eecec3930c9011c9a67088b8de3c0b5e392" + integrity sha512-bfZehsH5ejXc8qO5SZdu50siusz3VhpP1imCVSz92cwsyowjOaGX8DAjfbvb+QfNT/0RYqqdveCXTLPVC7SFWQ== + dependencies: + "@fluentui/keyboard-keys" "^9.0.8" + "@fluentui/react-aria" "^9.14.6" + "@fluentui/react-context-selector" "^9.1.76" + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-motion" "^9.7.2" + "@fluentui/react-motion-components-preview" "^0.4.9" + "@fluentui/react-portal" "^9.5.6" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-divider@^9.2.86": + version "9.2.86" + resolved "https://registry.yarnpkg.com/@fluentui/react-divider/-/react-divider-9.2.86.tgz#696ed355c23156b2e63025dfa8e499a62f59e40e" + integrity sha512-8hzwDVdW7CkumW8XU16lsrrg6s0tNAIWdsFC4Utfb/BL2xgfJRdg/0q6Dzw12uhQHtssC3pKNQV0mp4ia0oqww== + dependencies: + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-drawer@^9.7.8": + version "9.7.8" + resolved "https://registry.yarnpkg.com/@fluentui/react-drawer/-/react-drawer-9.7.8.tgz#f9f409214924fa38176aa39412682ff2a89c5f11" + integrity sha512-s9epUHmw/MrkVEpjzZJcdwjYSx2dVM7Uf9deHA//+dgHCM0Yybmn6vWJ+OArNkzdpYHLBuG3Cwk07tnQqGJx2Q== + dependencies: + "@fluentui/react-dialog" "^9.12.8" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-motion" "^9.7.2" + "@fluentui/react-portal" "^9.5.6" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-field@^9.2.6": + version "9.2.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-field/-/react-field-9.2.6.tgz#caffd4f7b18e686b8b59e2b20868684338272f60" + integrity sha512-C+x+96pRgpx1ib08krazPdYn7+lgD7kDGNlvadmUPM05Zm68Zm2mytMjZ/iy50N/iydozmbLG/i930LVUAF7/g== + dependencies: + "@fluentui/react-context-selector" "^9.1.76" + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-label" "^9.1.87" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-icons@^2.0.237", "@fluentui/react-icons@^2.0.239", "@fluentui/react-icons@^2.0.245", "@fluentui/react-icons@^2.0.298": + version "2.0.298" + resolved "https://registry.yarnpkg.com/@fluentui/react-icons/-/react-icons-2.0.298.tgz#298e02796c460c1d3fc08c4e5fb8dafa1ed5be15" + integrity sha512-4bLyZsLtdpS1634ptlBQeoEDlsg//61s8Lp8RlM+TyBgXaIONS9KIlRiujlrGJyuksDujq2V+uEfpqAGrkAHtQ== + dependencies: + "@griffel/react" "^1.0.0" + tslib "^2.1.0" + +"@fluentui/react-image@^9.1.84": + version "9.1.84" + resolved "https://registry.yarnpkg.com/@fluentui/react-image/-/react-image-9.1.84.tgz#72aa5838485b9ec10ab4b675167b3d18b602f269" + integrity sha512-+8X9IPtNi+RLsSJEIODUfnnalPXLJpfqSyyjrVcm/xjEasCm77F1kMSzCGiHbFYvz7hq5g5I4B/OH4TjL+fcqg== + dependencies: + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-infobutton@9.0.0-beta.102": + version "9.0.0-beta.102" + resolved "https://registry.yarnpkg.com/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.102.tgz#c0473275141999455fae4388f47d4f77b98c0f89" + integrity sha512-3kA4F0Vga8Ds6JGlBajLCCDOo/LmPuS786Wg7ui4ZTDYVIMzy1yp2XuVcZniifBFvEp0HQCUoDPWUV0VI3FfzQ== + dependencies: + "@fluentui/react-icons" "^2.0.237" + "@fluentui/react-jsx-runtime" "^9.0.36" + "@fluentui/react-label" "^9.1.68" + "@fluentui/react-popover" "^9.9.6" + "@fluentui/react-tabster" "^9.21.0" + "@fluentui/react-theme" "^9.1.19" + "@fluentui/react-utilities" "^9.18.7" + "@griffel/react" "^1.5.14" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-infolabel@^9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@fluentui/react-infolabel/-/react-infolabel-9.2.0.tgz#e0a9a19cf93cf7259014638f7ba92c0c9192f7c8" + integrity sha512-lNxcGj2kcpykdoOW9HSielq7o30RI2vI5LTy4pgd5OQ7/1ffik6+ioKPjylnIV6nIPgv035x4Pf/8s9B6m0+oA== + dependencies: + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-label" "^9.1.87" + "@fluentui/react-popover" "^9.10.6" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-input@^9.5.6": + version "9.5.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-input/-/react-input-9.5.6.tgz#563ac8f60d2ee9ea9d7635e8457f6a37dd2ea522" + integrity sha512-qegsdTawoewipYPYKfuYm21p5VZ59Yl33ofQiGoUgY03r/ddylHenWIOLdFyuUuPXBv2m/ESMCL1MZaiDUPDFg== + dependencies: + "@fluentui/react-field" "^9.2.6" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-jsx-runtime@^9.0.36", "@fluentui/react-jsx-runtime@^9.0.39", "@fluentui/react-jsx-runtime@^9.0.54": + version "9.0.54" + resolved "https://registry.yarnpkg.com/@fluentui/react-jsx-runtime/-/react-jsx-runtime-9.0.54.tgz#2b2cf65b32e61486711343f6bb1468cdaa9da186" + integrity sha512-zSkP9X/bAFg17QUDBs4bnbDUgeQSpSBVbH4nKYa3cZb78vV3e3m3nyADBvb97NYkywyd7CfIXq8iTpDWVEoWTw== + dependencies: + "@fluentui/react-utilities" "^9.19.0" + "@swc/helpers" "^0.5.1" + react-is "^17.0.2" + +"@fluentui/react-label@^9.1.68", "@fluentui/react-label@^9.1.87": + version "9.1.87" + resolved "https://registry.yarnpkg.com/@fluentui/react-label/-/react-label-9.1.87.tgz#3de034d907360e86b837579db3c6c40730231870" + integrity sha512-vfUppmSWkpwXztHU21oGcduYQ9jldkPrFpl+/zWmbiOia5CKTMqJtHqLJMMe/W1uoNKqoNU37uVp3bZgIWUHJg== + dependencies: + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-link@^9.4.6": + version "9.4.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-link/-/react-link-9.4.6.tgz#19c8c5bcb9ae2733e7d4e632821aa1971cc620d8" + integrity sha512-PuOyp8JObLWzvUsK8PKjqITtwdcRxonEUxOztvv3HPAyE11EtgdvPKEhm5cQPmXN/EA/D2/Dk80PHLeNRzVaZQ== + dependencies: + "@fluentui/keyboard-keys" "^9.0.8" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-list@^9.1.6": + version "9.1.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-list/-/react-list-9.1.6.tgz#5ea7909f77771f0fbfc60ef7b016abc0d5dc0ac2" + integrity sha512-Sgl0wVQnJrKFRh4AERtB3eyJERDkSBhH4dGz+KaPaltItWe/0g2/VOqNSOk9oaG3rka7BYSeU6pLUf5AwkqMgA== + dependencies: + "@fluentui/keyboard-keys" "^9.0.8" + "@fluentui/react-checkbox" "^9.3.6" + "@fluentui/react-context-selector" "^9.1.76" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-menu@^9.16.6": + version "9.16.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-menu/-/react-menu-9.16.6.tgz#b3ee9a020f7491c0851d3a68dcceab8bfddb799b" + integrity sha512-qiVoje/i8Pj0joZN/uaJd6r0H9qZTgjAEgsnJc32HEXQuX3HDGkxdxiCES+h24a8Alu09ELwVJAzdbWvedCqug== + dependencies: + "@fluentui/keyboard-keys" "^9.0.8" + "@fluentui/react-aria" "^9.14.6" + "@fluentui/react-context-selector" "^9.1.76" + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-portal" "^9.5.6" + "@fluentui/react-positioning" "^9.16.7" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-message-bar@^9.4.7": + version "9.4.7" + resolved "https://registry.yarnpkg.com/@fluentui/react-message-bar/-/react-message-bar-9.4.7.tgz#111a33169950749c185f4629d6d5089255b69011" + integrity sha512-9XevlyC5Kr7oVBMo8Dd9ddw8Fmgq/yLN19zz+jyHzPGZMWU+BC40LM/w8l11WdgqN6ij5LZewq9pElMRMJIKkw== + dependencies: + "@fluentui/react-button" "^9.4.6" + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-link" "^9.4.6" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + react-transition-group "^4.4.1" + +"@fluentui/react-motion-components-preview@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@fluentui/react-motion-components-preview/-/react-motion-components-preview-0.4.9.tgz#2b3c8647920ee421eb327548decdc294f24e51de" + integrity sha512-sMtCqgmPHclfo6EqeIZmtXqJt+1fJn0Bo7ORsayXRJvjrmf8buDFnCJCjzYPNUR3npy9GFedMqmIkC6ovKkV0w== + dependencies: + "@fluentui/react-motion" "*" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-motion@*", "@fluentui/react-motion@^9.7.2": + version "9.7.2" + resolved "https://registry.yarnpkg.com/@fluentui/react-motion/-/react-motion-9.7.2.tgz#fcd2c54082975b6c7f91de813e8efe8eb7daef13" + integrity sha512-xUDkTNPsXKZIlk+Xr+uozdEmKfZ3iNE7dXUAPOgX5rntdMS50JZf4ggyaKdSJsuOVQNqWAoEcCNYLISroDw07g== + dependencies: + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-utilities" "^9.19.0" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-overflow@^9.3.6": + version "9.3.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-overflow/-/react-overflow-9.3.6.tgz#f343a3a9fdefc9442f82aba6d9cb6789ef6b4ec6" + integrity sha512-yyYX+6jLDyWwZg2G3r4gTxziaT70U9pdRUO1oEVE6Sv1xvMsQGfRQth4khl6OihB1fAFv4mAyx7NTX94D8RYhw== + dependencies: + "@fluentui/priority-overflow" "^9.1.15" + "@fluentui/react-context-selector" "^9.1.76" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-persona@^9.3.6": + version "9.3.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-persona/-/react-persona-9.3.6.tgz#672341e4e4f52aa09a7205f6c578fc27da310c80" + integrity sha512-EJZk6ZANrWoZ+lGvjW+xXuj5AGu5uNT6LiBo1H3SM6ug/eldz32Pa+UXYPU6sVEW0T8+wUCvPZmhgMnahELSew== + dependencies: + "@fluentui/react-avatar" "^9.7.6" + "@fluentui/react-badge" "^9.2.54" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-popover@^9.10.6", "@fluentui/react-popover@^9.9.6": + version "9.10.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-popover/-/react-popover-9.10.6.tgz#e8a82b6ee84bc3dfb1cbe92362bdf2fd635b31b6" + integrity sha512-ddYAbytBGukB2EgcjcMV7q7A8Yh6tmWk8Eg9m1O0rAnB/8xlkuG8BLAN98S4kAGsmrxX2GMb1R3NBBFr+yMdGA== + dependencies: + "@fluentui/keyboard-keys" "^9.0.8" + "@fluentui/react-aria" "^9.14.6" + "@fluentui/react-context-selector" "^9.1.76" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-portal" "^9.5.6" + "@fluentui/react-positioning" "^9.16.7" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-portal@^9.5.6": + version "9.5.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-portal/-/react-portal-9.5.6.tgz#6f9c70dddc23cb35f00deb9a0a2d502175c8dd7c" + integrity sha512-mAZ5sVf+2TiG5BKOo7Vv88+UeBZEeVGnTZcI6U2iggB7LLzPQdl3Bw+w8QUMBO9PHS/QtzliTqeGpt2QbtMyxw== + dependencies: + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + use-disposable "^1.0.1" + +"@fluentui/react-positioning@^9.16.7": + version "9.16.7" + resolved "https://registry.yarnpkg.com/@fluentui/react-positioning/-/react-positioning-9.16.7.tgz#0db87caf86e16a1e495277c3aad4de405ef32464" + integrity sha512-31i2VdDegR5NsHiQxPP7pWQz4u8lkQq9T1rUFHUUtT7OLr3vOcKf0dGWIeMfZ3LzIv+aCX/P3d2bwEiydCeXuA== + dependencies: + "@floating-ui/devtools" "0.2.1" + "@floating-ui/dom" "^1.6.12" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-progress@^9.2.6": + version "9.2.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-progress/-/react-progress-9.2.6.tgz#071051151784433aaaf1fec895ef34febdeae722" + integrity sha512-I3zTci64PskUGMS/2tnR3nw5hKsBKu5S7PEiCySUoy+fGSFLKGWaUC0G68EdmFCIwa4AIHG66dUyyTfr/Hjfzg== + dependencies: + "@fluentui/react-field" "^9.2.6" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-provider@^9.20.6": + version "9.20.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-provider/-/react-provider-9.20.6.tgz#097dd52792675f0da6aa97c329e46558338539e7" + integrity sha512-yxMWLP1SZMKVLSuE4Z4617DpbzcvItjOvQl/MOiaQHdC6zfq6X+1Ud4thH49o42KIUoIeWsCBSsEyaDAdYBUvg== + dependencies: + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/core" "^1.16.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-radio@^9.3.6": + version "9.3.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-radio/-/react-radio-9.3.6.tgz#d010ec79bcdcefefbbffea4afe8db60c6768ae12" + integrity sha512-cOZzd8lN1NCVwKnkepTi9B58mEJdds2wJH8veqLv9cbNceD4Bju53xTr2UG9nIXugwdV85tptYU/o0a4oakIRA== + dependencies: + "@fluentui/react-field" "^9.2.6" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-label" "^9.1.87" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-rating@^9.1.6": + version "9.1.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-rating/-/react-rating-9.1.6.tgz#0bba3051a98ce1aae2c3c6bb8902d9ada29baddb" + integrity sha512-uFyp+/iY9Y4ORdtljYBRDfDBZL/wdCmEHwFyNFXKSdFPePeZhkCaKZq7RH+6KCGHY4KTFqDer4IaBgxBaC2oHg== + dependencies: + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-search@^9.1.6": + version "9.1.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-search/-/react-search-9.1.6.tgz#6870c4914050148e749302cb50dc96700c25658d" + integrity sha512-3iu+axBpXuSg2wywOVj9mCqwWEiAtIseLQVFTvY8/q93/fXkHWwXEV1pgfTzPlXNWy19CLV+cuXF0v4D2+JmDA== + dependencies: + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-input" "^9.5.6" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-select@^9.2.6": + version "9.2.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-select/-/react-select-9.2.6.tgz#99f0d70a7e11a4ab5f54aeaa3ea59efe78833167" + integrity sha512-Yeb/EGOhNrCAseTj6eBgJ0QtWiyibloXepYbyZ3QryXhPeZBLR32yhKVvzGB+ScB4hdY45k/Tam8BdfofstAqw== + dependencies: + "@fluentui/react-field" "^9.2.6" + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-shared-contexts@^9.23.1": + version "9.23.1" + resolved "https://registry.yarnpkg.com/@fluentui/react-shared-contexts/-/react-shared-contexts-9.23.1.tgz#96155b604574c2207d1100727d477f5ab6e6e36d" + integrity sha512-mP+7talxLz7n0G36o7Asdvst+JPzUbqbnoMKUWRVB5YwzlOXumEgaQDgL1BkRUJYaDGOjIiSTUjHOEkBt7iSdg== + dependencies: + "@fluentui/react-theme" "^9.1.24" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-skeleton@^9.2.6": + version "9.2.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-skeleton/-/react-skeleton-9.2.6.tgz#db88971c7ef5af80283644341a8b764c81b88565" + integrity sha512-qAb0Td07EqCmyJAK53TYDfWs3NWedqAC7YRt2RVfhaQobI60+etMkXhGDwGDZwryQIFMYlNm6mSV4M5qkC4gCA== + dependencies: + "@fluentui/react-field" "^9.2.6" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-slider@^9.3.7": + version "9.3.7" + resolved "https://registry.yarnpkg.com/@fluentui/react-slider/-/react-slider-9.3.7.tgz#6eb5886c4813076458f7facc989337660e5e4a92" + integrity sha512-PY4Z9KujrxyRZaLgdY47BlGj3LCmIiCRJE/96DSDz7iPbwfVluH0HJbBsw+MfW70c0CwyPD5VSHtPIi0pnGnKw== + dependencies: + "@fluentui/react-field" "^9.2.6" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-spinbutton@^9.3.6": + version "9.3.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-spinbutton/-/react-spinbutton-9.3.6.tgz#44bd36013ce7c8854bb9cd80f8ed65713ec22a00" + integrity sha512-XVK1AOjKS47MBEKDDKzgePc3DfIr2f1LI+OgmbcAlhBUgyy2FGeixqdAvbJTnRehO6kRRzFjSmMLnb6c6m/W/w== + dependencies: + "@fluentui/keyboard-keys" "^9.0.8" + "@fluentui/react-field" "^9.2.6" + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-spinner@^9.5.11": + version "9.5.11" + resolved "https://registry.yarnpkg.com/@fluentui/react-spinner/-/react-spinner-9.5.11.tgz#7d5f48c9aab6104e316d88e8cc50e4cf5f9750ac" + integrity sha512-q0mJLG7LfWSRqa2fO+Qvxw/noZWjk3HM4wurbddTOClezTcBlMXlYlad7rueu9TpzM5caGsWcMF791/gNYLHmQ== + dependencies: + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-label" "^9.1.87" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-swatch-picker@^9.2.6": + version "9.2.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-swatch-picker/-/react-swatch-picker-9.2.6.tgz#9195cd32e4799ec238d8617a4b954640adb2c7f6" + integrity sha512-s9rGkiONRxc8lmc19vbKgrkGtFzKCRv1+Cov5esIG/uJnvmTctzOLjgFj+NeWehvQgrtv8t7Bs7AszlQzfEP5A== + dependencies: + "@fluentui/react-context-selector" "^9.1.76" + "@fluentui/react-field" "^9.2.6" + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-switch@^9.2.6": + version "9.2.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-switch/-/react-switch-9.2.6.tgz#a60bc731dcfba40037ce81b97bf3ac169af6f6b5" + integrity sha512-stFoqh/ahYmY3LPVIi3voGMPm/wcMMEepkWL8ZLYU5ZKP/knJ2Yy5peW1uVo+5d6PbLUvan9tsSB53IN/2utpA== + dependencies: + "@fluentui/react-field" "^9.2.6" + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-label" "^9.1.87" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-table@^9.16.6": + version "9.16.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-table/-/react-table-9.16.6.tgz#4873c3ccc9e7b7e797cfded69ba649cbb3cf02ba" + integrity sha512-u/skqMkdw16Lnje4CevcU1xoSspwTWRLoHXvIiWQyjSkd/mHkspflNJy/wK2aoEO5F7pPak0u72IBxMg+0KIvQ== + dependencies: + "@fluentui/keyboard-keys" "^9.0.8" + "@fluentui/react-aria" "^9.14.6" + "@fluentui/react-avatar" "^9.7.6" + "@fluentui/react-checkbox" "^9.3.6" + "@fluentui/react-context-selector" "^9.1.76" + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-radio" "^9.3.6" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-tabs@^9.7.6": + version "9.7.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-tabs/-/react-tabs-9.7.6.tgz#bca22a799fc0436cc660c0fc32b07951618e1614" + integrity sha512-N8wey1p/bGnHNZd8L/AVU7GOiI3bodbAlL9x9L8grncPMX/WWnwTGMui7A3Ge3u2IQ3rR8XEXz/dVxFpTdv+dg== + dependencies: + "@fluentui/react-context-selector" "^9.1.76" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-tabster@^9.21.0", "@fluentui/react-tabster@^9.21.5", "@fluentui/react-tabster@^9.24.6": + version "9.24.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-tabster/-/react-tabster-9.24.6.tgz#b053ee6aee8e7c178704910eb3927bdf1578c54c" + integrity sha512-d0i4Yey8UE+zf+dM/wYtblRwRhxuE9uWdwsxWD5tdvDY3KZxIa9NsNW7xBRA1Az5dhvWw83fJJBd88DosX2sYw== + dependencies: + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + keyborg "^2.6.0" + tabster "^8.5.0" + +"@fluentui/react-tag-picker@^9.5.6": + version "9.5.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-tag-picker/-/react-tag-picker-9.5.6.tgz#0df301cee537321564337b77611bc581385e5162" + integrity sha512-DO65MbrWXz7YFc44TSCLGaowtnnje6UMqczCYrQVwzmQlxf00RqgbB3CVjKvW0Z3r89aNLtX9b+mYOQL4ForVg== + dependencies: + "@fluentui/keyboard-keys" "^9.0.8" + "@fluentui/react-aria" "^9.14.6" + "@fluentui/react-combobox" "^9.14.6" + "@fluentui/react-context-selector" "^9.1.76" + "@fluentui/react-field" "^9.2.6" + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-portal" "^9.5.6" + "@fluentui/react-positioning" "^9.16.7" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-tags" "^9.5.4" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-tags@^9.5.4": + version "9.5.4" + resolved "https://registry.yarnpkg.com/@fluentui/react-tags/-/react-tags-9.5.4.tgz#3a9b9c5a650977c6037f50c59b25b0902e69e196" + integrity sha512-xmrhhmNa/hwW4p6gTjsFbctcohsiBJS96SfA/cQQ/pRpNKpjwiAZvppF3R4dBYo1Apnt9VCdAmEYhu7qmjq69A== + dependencies: + "@fluentui/keyboard-keys" "^9.0.8" + "@fluentui/react-aria" "^9.14.6" + "@fluentui/react-avatar" "^9.7.6" + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-teaching-popover@^9.4.5": + version "9.4.5" + resolved "https://registry.yarnpkg.com/@fluentui/react-teaching-popover/-/react-teaching-popover-9.4.5.tgz#a191357d14307a52dca59bb9ab97bc1fb5362ebb" + integrity sha512-axKj4EQuoDsGSK0sEdOAEuwg3ew7Maxu4xKF2Z2jOOf0J7+6lKiZilTzt3gf5XLHUzFMU2bTM7VVAN8O8Et04A== + dependencies: + "@fluentui/react-aria" "^9.14.6" + "@fluentui/react-button" "^9.4.6" + "@fluentui/react-context-selector" "^9.1.76" + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-popover" "^9.10.6" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + use-sync-external-store "^1.2.0" + +"@fluentui/react-text@^9.4.36": + version "9.4.36" + resolved "https://registry.yarnpkg.com/@fluentui/react-text/-/react-text-9.4.36.tgz#d4d6e12ef9059fd087ffc76457fe0e174e138ac1" + integrity sha512-oLSGz6uksooCQrc+FXvWwAZCP+ucn2h12vZFyWSAOVODDtQMjtycol03p408BEHnPBQbrYaQCFpd3Id5eLuxBg== + dependencies: + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-textarea@^9.4.6": + version "9.4.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-textarea/-/react-textarea-9.4.6.tgz#6e6c3dea377bbc70f088269a647fed5241e25da5" + integrity sha512-zdpeCSnVJihbPXHeAYHa1MiO7dJba3Ugtyu7TqJkmiy0Lr5OfeTkX2nLchOPKiEDjQFfSviqDNYZERwO2NGD1g== + dependencies: + "@fluentui/react-field" "^9.2.6" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-theme@^9.1.19", "@fluentui/react-theme@^9.1.24": + version "9.1.24" + resolved "https://registry.yarnpkg.com/@fluentui/react-theme/-/react-theme-9.1.24.tgz#8ad614df32a60278719a073ea7e308f5016aae34" + integrity sha512-OhVKYD7CMYHxzJEn4PtIszledj8hbQJNWBMfIZsp4Sytdp9vCi0txIQUx4BhS1WqtQPhNGCF16eW9Q3NRrnIrQ== + dependencies: + "@fluentui/tokens" "1.0.0-alpha.21" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-toast@^9.4.8": + version "9.4.8" + resolved "https://registry.yarnpkg.com/@fluentui/react-toast/-/react-toast-9.4.8.tgz#bfffcb011fcbfea1eb2942420958add9cfe47505" + integrity sha512-1welldVf/M/c7msCwB8a0yFgKjIF/aUxAgjTHza9jEmxBl45oCzPZY7PVApCY2sSx+iRn8XjSKRkYSPgHUYzKA== + dependencies: + "@fluentui/keyboard-keys" "^9.0.8" + "@fluentui/react-aria" "^9.14.6" + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-motion" "^9.7.2" + "@fluentui/react-motion-components-preview" "^0.4.9" + "@fluentui/react-portal" "^9.5.6" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-toolbar@^9.4.5": + version "9.4.5" + resolved "https://registry.yarnpkg.com/@fluentui/react-toolbar/-/react-toolbar-9.4.5.tgz#26e8b8a1d55163dc62f43e8bd234240644434733" + integrity sha512-/Za5QHVqcF1bLW7FIRebl17TI+MCdoVqvHoaE7xodRmAA0a5MWcs3aqtumaeQjZBnGh9HsFYmxTKdh0KEu4LVg== + dependencies: + "@fluentui/react-button" "^9.4.6" + "@fluentui/react-context-selector" "^9.1.76" + "@fluentui/react-divider" "^9.2.86" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-radio" "^9.3.6" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-tooltip@^9.6.6": + version "9.6.6" + resolved "https://registry.yarnpkg.com/@fluentui/react-tooltip/-/react-tooltip-9.6.6.tgz#386346b9f5f837552cc57c93f4f296b1b7aa6fd9" + integrity sha512-4EHxH5CvzPQjOjl9opldAhSAVSOoUo4ei412RoCRASzoaVBJwQ81r2MaVlf9P84G6WOUUXttRbUQ+0jWV5WoKg== + dependencies: + "@fluentui/keyboard-keys" "^9.0.8" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-portal" "^9.5.6" + "@fluentui/react-positioning" "^9.16.7" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-tree@^9.10.9": + version "9.10.9" + resolved "https://registry.yarnpkg.com/@fluentui/react-tree/-/react-tree-9.10.9.tgz#ba8af52517cc875ae3c2f8b8e1e8aa2f1e0541c3" + integrity sha512-Pj/eSXVVw3kGae7Jl3ZBaRqjSOm9JytzgA13eYdHpx58YpqGsYOU6G5CFwx28pTQKeIZIfsIgTDPhD+S5LcVOQ== + dependencies: + "@fluentui/keyboard-keys" "^9.0.8" + "@fluentui/react-aria" "^9.14.6" + "@fluentui/react-avatar" "^9.7.6" + "@fluentui/react-button" "^9.4.6" + "@fluentui/react-checkbox" "^9.3.6" + "@fluentui/react-context-selector" "^9.1.76" + "@fluentui/react-icons" "^2.0.245" + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-motion" "^9.7.2" + "@fluentui/react-motion-components-preview" "^0.4.9" + "@fluentui/react-radio" "^9.3.6" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-tabster" "^9.24.6" + "@fluentui/react-theme" "^9.1.24" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-utilities@^9.18.10", "@fluentui/react-utilities@^9.18.7", "@fluentui/react-utilities@^9.19.0": + version "9.19.0" + resolved "https://registry.yarnpkg.com/@fluentui/react-utilities/-/react-utilities-9.19.0.tgz#e85cd29e5462f745140a286a380ff961aef4459f" + integrity sha512-66Kdpr4xZsov6KSqbPDmKR5CB96RUPZuWihMC3RYHj9uH+oxd81k2Jyrb6rM058xjVKDFSFVLUZlsp1Mgts38w== + dependencies: + "@fluentui/keyboard-keys" "^9.0.8" + "@fluentui/react-shared-contexts" "^9.23.1" + "@swc/helpers" "^0.5.1" + +"@fluentui/react-virtualizer@9.0.0-alpha.96": + version "9.0.0-alpha.96" + resolved "https://registry.yarnpkg.com/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.96.tgz#7a60bbacff894626ad576eb807e7d40e9fa417c5" + integrity sha512-0o9RSTAAIoJ4xdM2g8hF5u98Up0OHRknRhMolZHZDoqXEvhJ5GroGtp+NPfU7LxU+dxHrZLx9gQ6wVWe/35ZzQ== + dependencies: + "@fluentui/react-jsx-runtime" "^9.0.54" + "@fluentui/react-shared-contexts" "^9.23.1" + "@fluentui/react-utilities" "^9.19.0" + "@griffel/react" "^1.5.22" + "@swc/helpers" "^0.5.1" + +"@fluentui/tokens@1.0.0-alpha.21": + version "1.0.0-alpha.21" + resolved "https://registry.yarnpkg.com/@fluentui/tokens/-/tokens-1.0.0-alpha.21.tgz#25738cabb95aa5a90dad92397325ce70044ad5f7" + integrity sha512-xQ1T56sNgDFGl+kJdIwhz67mHng8vcwO7Dvx5Uja4t+NRULQBgMcJ4reUo4FGF3TjufHj08pP0/OnKQgnOaSVg== + dependencies: + "@swc/helpers" "^0.5.1" + +"@griffel/core@^1.16.0", "@griffel/core@^1.19.2": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@griffel/core/-/core-1.19.2.tgz#994070585bb49795d882355fc0787eb9878db71c" + integrity sha512-WkB/QQkjy9dE4vrNYGhQvRRUHFkYVOuaznVOMNTDT4pS9aTJ9XPrMTXXlkpcwaf0D3vNKoerj4zAwnU2lBzbOg== + dependencies: + "@emotion/hash" "^0.9.0" + "@griffel/style-types" "^1.3.0" + csstype "^3.1.3" + rtl-css-js "^1.16.1" + stylis "^4.2.0" + tslib "^2.1.0" + +"@griffel/react@^1.0.0", "@griffel/react@^1.5.14", "@griffel/react@^1.5.22": + version "1.5.30" + resolved "https://registry.yarnpkg.com/@griffel/react/-/react-1.5.30.tgz#6638e79d88573e5a71651a909326428cac2ce9c3" + integrity sha512-1q4ojbEVFY5YA0j1NamP0WWF4BKh+GHsVugltDYeEgEaVbH3odJ7tJabuhQgY+7Nhka0pyEFWSiHJev0K3FSew== + dependencies: + "@griffel/core" "^1.19.2" + tslib "^2.1.0" + +"@griffel/style-types@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@griffel/style-types/-/style-types-1.3.0.tgz#42b4f1902a0221a9a8334fda12a2fe88f13d65ee" + integrity sha512-bHwD3sUE84Xwv4dH011gOKe1jul77M1S6ZFN9Tnq8pvZ48UMdY//vtES6fv7GRS5wXYT4iqxQPBluAiYAfkpmw== + dependencies: + csstype "^3.1.3" + +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.6": + version "0.16.6" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" + integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.3.0" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/momoa@^3.3.4": + version "3.3.8" + resolved "https://registry.yarnpkg.com/@humanwhocodes/momoa/-/momoa-3.3.8.tgz#b00630bf689b6f758419c029e15a4be25c12179b" + integrity sha512-/3PZzor2imi/RLLcnHztkwA79txiVvW145Ve2cp5dxRcH5qOUNJPToasqLFHniTfw4B4lT7jGDdBOPXbXYlIMQ== + +"@humanwhocodes/retry@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" + integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== + +"@humanwhocodes/retry@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.2.tgz#1860473de7dfa1546767448f333db80cb0ff2161" + integrity sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ== + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@lukeed/csprng@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@lukeed/csprng/-/csprng-1.1.0.tgz#1e3e4bd05c1cc7a0b2ddbd8a03f39f6e4b5e6cfe" + integrity sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA== + +"@modelcontextprotocol/sdk@^1.8.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@modelcontextprotocol/sdk/-/sdk-1.11.0.tgz#9f1762efe6f3365f0bf3b019cc9bd1629d19bc50" + integrity sha512-k/1pb70eD638anoi0e8wUGAlbMJXyvdV4p62Ko+EZ7eBe1xMx8Uhak1R5DgfoofsK5IBBnRwsYGTaLZl+6/+RQ== + dependencies: + content-type "^1.0.5" + cors "^2.8.5" + cross-spawn "^7.0.3" + eventsource "^3.0.2" + express "^5.0.1" + express-rate-limit "^7.5.0" + pkce-challenge "^5.0.0" + raw-body "^3.0.0" + zod "^3.23.8" + zod-to-json-schema "^3.24.1" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pnpm/config.env-replace@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" + integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== + +"@pnpm/network.ca-file@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983" + integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== + dependencies: + graceful-fs "4.2.10" + +"@pnpm/npm-conf@^2.1.0": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz#bb375a571a0bd63ab0a23bece33033c683e9b6b0" + integrity sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw== + dependencies: + "@pnpm/config.env-replace" "^1.1.0" + "@pnpm/network.ca-file" "^1.0.1" + config-chain "^1.1.11" + +"@rollup/pluginutils@^5.1.4": + version "5.1.4" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.4.tgz#bb94f1f9eaaac944da237767cdfee6c5b2262d4a" + integrity sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^4.0.2" + +"@rollup/rollup-android-arm-eabi@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz#e1562d360bca73c7bef6feef86098de3a2f1d442" + integrity sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw== + +"@rollup/rollup-android-arm64@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz#37ba63940211673e15dcc5f469a78e34276dbca7" + integrity sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw== + +"@rollup/rollup-darwin-arm64@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz#58b1eb86d997d71dabc5b78903233a3c27438ca0" + integrity sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA== + +"@rollup/rollup-darwin-x64@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz#5e22dab3232b1e575d930ce891abb18fe19c58c9" + integrity sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw== + +"@rollup/rollup-freebsd-arm64@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz#04c892d9ff864d66e31419634726ab0bebb33707" + integrity sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw== + +"@rollup/rollup-freebsd-x64@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz#f4b1e091f7cf5afc9e3a029d70128ad56409ecfb" + integrity sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q== + +"@rollup/rollup-linux-arm-gnueabihf@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz#c8814bb5ce047a81b1fe4a33628dfd4ac52bd864" + integrity sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg== + +"@rollup/rollup-linux-arm-musleabihf@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz#5b4e7bd83cbebbf5ffe958802dcfd4ee34bf73a3" + integrity sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg== + +"@rollup/rollup-linux-arm64-gnu@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz#141c848e53cee011e82a11777b8a51f1b3e8d77c" + integrity sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg== + +"@rollup/rollup-linux-arm64-musl@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz#22ebeaf2fa301aa4aa6c84b760e6cd1d1ac7eb1e" + integrity sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ== + +"@rollup/rollup-linux-loongarch64-gnu@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz#20b77dc78e622f5814ff8e90c14c938ceb8043bc" + integrity sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ== + +"@rollup/rollup-linux-powerpc64le-gnu@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz#2c90f99c987ef1198d4f8d15d754c286e1f07b13" + integrity sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg== + +"@rollup/rollup-linux-riscv64-gnu@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz#9336fd5e47d7f4760d02aa85f76976176eef53ca" + integrity sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ== + +"@rollup/rollup-linux-riscv64-musl@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz#d75b4d54d46439bb5c6c13762788f57e798f5670" + integrity sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA== + +"@rollup/rollup-linux-s390x-gnu@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz#e9f09b802f1291839247399028beaef9ce034c81" + integrity sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg== + +"@rollup/rollup-linux-x64-gnu@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz#0413169dc00470667dea8575c1129d4e7a73eb29" + integrity sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ== + +"@rollup/rollup-linux-x64-musl@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz#c76fd593323c60ea219439a00da6c6d33ffd0ea6" + integrity sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ== + +"@rollup/rollup-win32-arm64-msvc@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz#c7724c386eed0bda5ae7143e4081c1910cab349b" + integrity sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg== + +"@rollup/rollup-win32-ia32-msvc@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz#7749e1b65cb64fe6d41ad1ad9e970a0ccc8ac350" + integrity sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA== + +"@rollup/rollup-win32-x64-msvc@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz#8078b71fe0d5825dcbf83d52a7dc858b39da165c" + integrity sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA== + +"@stylistic/eslint-plugin@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin/-/eslint-plugin-4.2.0.tgz#7860ea84aa7ee3b21757907b863eb62f4f8b0455" + integrity sha512-8hXezgz7jexGHdo5WN6JBEIPHCSFyyU4vgbxevu4YLVS5vl+sxqAAGyXSzfNDyR6xMNSH5H1x67nsXcYMOHtZA== + dependencies: + "@typescript-eslint/utils" "^8.23.0" + eslint-visitor-keys "^4.2.0" + espree "^10.3.0" + estraverse "^5.3.0" + picomatch "^4.0.2" + +"@swc/helpers@^0.5.1": + version "0.5.17" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.17.tgz#5a7be95ac0f0bf186e7e6e890e7a6f6cda6ce971" + integrity sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A== + dependencies: + tslib "^2.8.0" + +"@types/babel__core@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9" + integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.7.tgz#968cdc2366ec3da159f61166428ee40f370e56c2" + integrity sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng== + dependencies: + "@babel/types" "^7.20.7" + +"@types/chrome@^0.0.280": + version "0.0.280" + resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.280.tgz#7ef46940c1aa78947508c2371993a301df8c4115" + integrity sha512-AotSmZrL9bcZDDmSI1D9dE7PGbhOur5L0cKxXd7IqbVizQWCY4gcvupPUVsQ4FfDj3V2tt/iOpomT9EY0s+w1g== + dependencies: + "@types/filesystem" "*" + "@types/har-format" "*" + +"@types/estree@1.0.7", "@types/estree@^1.0.0", "@types/estree@^1.0.6": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" + integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== + +"@types/filesystem@*": + version "0.0.36" + resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.36.tgz#7227c2d76bfed1b21819db310816c7821d303857" + integrity sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA== + dependencies: + "@types/filewriter" "*" + +"@types/filewriter@*": + version "0.0.33" + resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.33.tgz#d9d611db9d9cd99ae4e458de420eeb64ad604ea8" + integrity sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g== + +"@types/har-format@*": + version "1.2.16" + resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.16.tgz#b71ede8681400cc08b3685f061c31e416cf94944" + integrity sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A== + +"@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/minimatch@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + +"@types/node@*": + version "22.15.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.15.3.tgz#b7fb9396a8ec5b5dfb1345d8ac2502060e9af68b" + integrity sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw== + dependencies: + undici-types "~6.21.0" + +"@types/prop-types@*": + version "15.7.14" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.14.tgz#1433419d73b2a7ebfc6918dcefd2ec0d5cd698f2" + integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ== + +"@types/react-dom@^18.3.1": + version "18.3.7" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.7.tgz#b89ddf2cd83b4feafcc4e2ea41afdfb95a0d194f" + integrity sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ== + +"@types/react@^18.3.1": + version "18.3.20" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.20.tgz#b0dccda9d2f1bc24d2a04b1d0cb5d0b9a3576ad3" + integrity sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + +"@types/webextension-polyfill@^0.12.1": + version "0.12.3" + resolved "https://registry.yarnpkg.com/@types/webextension-polyfill/-/webextension-polyfill-0.12.3.tgz#a4ac3452b816e4bd646024007a886234e2f6293e" + integrity sha512-F58aDVSeN/MjUGazXo/cPsmR76EvqQhQ1v4x23hFjUX0cfAJYE+JBWwiOGW36/VJGGxoH74sVlRIF3z7SJCKyg== + +"@types/yauzl@^2.9.1": + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@8.31.1": + version "8.31.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.31.1.tgz#62f1befe59647524994e89de4516d8dcba7a850a" + integrity sha512-oUlH4h1ABavI4F0Xnl8/fOtML/eu8nI2A1nYd+f+55XI0BLu+RIqKoCiZKNo6DtqZBEQm5aNKA20G3Z5w3R6GQ== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.31.1" + "@typescript-eslint/type-utils" "8.31.1" + "@typescript-eslint/utils" "8.31.1" + "@typescript-eslint/visitor-keys" "8.31.1" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^2.0.1" + +"@typescript-eslint/parser@8.31.1": + version "8.31.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.31.1.tgz#e9b0ccf30d37dde724ee4d15f4dbc195995cce1b" + integrity sha512-oU/OtYVydhXnumd0BobL9rkJg7wFJ9bFFPmSmB/bf/XWN85hlViji59ko6bSKBXyseT9V8l+CN1nwmlbiN0G7Q== + dependencies: + "@typescript-eslint/scope-manager" "8.31.1" + "@typescript-eslint/types" "8.31.1" + "@typescript-eslint/typescript-estree" "8.31.1" + "@typescript-eslint/visitor-keys" "8.31.1" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@8.31.1": + version "8.31.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.31.1.tgz#1eb52e76878f545e4add142e0d8e3e97e7aa443b" + integrity sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw== + dependencies: + "@typescript-eslint/types" "8.31.1" + "@typescript-eslint/visitor-keys" "8.31.1" + +"@typescript-eslint/type-utils@8.31.1": + version "8.31.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.31.1.tgz#be0f438fb24b03568e282a0aed85f776409f970c" + integrity sha512-fNaT/m9n0+dpSp8G/iOQ05GoHYXbxw81x+yvr7TArTuZuCA6VVKbqWYVZrV5dVagpDTtj/O8k5HBEE/p/HM5LA== + dependencies: + "@typescript-eslint/typescript-estree" "8.31.1" + "@typescript-eslint/utils" "8.31.1" + debug "^4.3.4" + ts-api-utils "^2.0.1" + +"@typescript-eslint/types@8.31.1": + version "8.31.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.31.1.tgz#478ed6f7e8aee1be7b63a60212b6bffe1423b5d4" + integrity sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ== + +"@typescript-eslint/typescript-estree@8.31.1": + version "8.31.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.1.tgz#37792fe7ef4d3021c7580067c8f1ae66daabacdf" + integrity sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag== + dependencies: + "@typescript-eslint/types" "8.31.1" + "@typescript-eslint/visitor-keys" "8.31.1" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^2.0.1" + +"@typescript-eslint/utils@8.31.1", "@typescript-eslint/utils@^8.23.0": + version "8.31.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.31.1.tgz#5628ea0393598a0b2f143d0fc6d019f0dee9dd14" + integrity sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.31.1" + "@typescript-eslint/types" "8.31.1" + "@typescript-eslint/typescript-estree" "8.31.1" + +"@typescript-eslint/visitor-keys@8.31.1": + version "8.31.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.1.tgz#6742b0e3ba1e0c1e35bdaf78c03e759eb8dd8e75" + integrity sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw== + dependencies: + "@typescript-eslint/types" "8.31.1" + eslint-visitor-keys "^4.2.0" + +"@vitejs/plugin-react@^4.3.4": + version "4.4.1" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz#d7d1e9c9616d7536b0953637edfee7c6cbe2fe0f" + integrity sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w== + dependencies: + "@babel/core" "^7.26.10" + "@babel/plugin-transform-react-jsx-self" "^7.25.9" + "@babel/plugin-transform-react-jsx-source" "^7.25.9" + "@types/babel__core" "^7.20.5" + react-refresh "^0.17.0" + +"@webext-core/fake-browser@^1.3.1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@webext-core/fake-browser/-/fake-browser-1.3.2.tgz#e41443fd857e1c49586c6ce881eaf09de4e101fe" + integrity sha512-jFyPWWz+VkHAC9DRIiIPOyu6X/KlC8dYqSKweHz6tsDb86QawtVgZSpYcM+GOQBlZc5DHFo92jJ7cIq4uBnU0A== + dependencies: + lodash.merge "^4.6.2" + +"@webext-core/isolated-element@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@webext-core/isolated-element/-/isolated-element-1.1.2.tgz#b50f2698ae93e2c4ab621048c1d569d7a9d3908f" + integrity sha512-CNHYhsIR8TPkPb+4yqTIuzaGnVn/Fshev5fyoPW+/8Cyc93tJbCjP9PC1XSK6fDWu+xASdPHLZaoa2nWAYoxeQ== + dependencies: + is-potential-custom-element-name "^1.0.1" + +"@webext-core/match-patterns@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@webext-core/match-patterns/-/match-patterns-1.0.3.tgz#d590e5063e21a6a83d245700dfeb5489fbd99a77" + integrity sha512-NY39ACqCxdKBmHgw361M9pfJma8e4AZo20w9AY+5ZjIj1W2dvXC8J31G5fjfOGbulW9w4WKpT8fPooi0mLkn9A== + +"@webext-core/messaging@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@webext-core/messaging/-/messaging-2.2.0.tgz#d941a5b5cfe179af0fe365d2d9b4ce6d88ed3c5c" + integrity sha512-CRKFSH8ZAp55QpzfseOO/RlW6fAVSGWYNJK1j23khB855Ba9wHu8PB3uuqMVZtfEAwAmsw/2U8HIkony5adFBQ== + dependencies: + uid "^2.0.2" + serialize-error "^11.0.0" + webextension-polyfill "^0.10.0" + +"@wxt-dev/i18n@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@wxt-dev/i18n/-/i18n-0.2.3.tgz#5688cbdf5324e86fbd65d585073121bf8d493085" + integrity sha512-2X005PB1r+6sDYMOuZD5hxSOPkogEZZTLB5HEsOotQ5RYXF3c/OOMD+DffVeq+S0yKY2Dmg4Ujfu0Pq4busJYQ== + dependencies: + chokidar "^3.6.0" + confbox "^0.1.7" + fast-glob "^3.3.2" + +"@wxt-dev/module-react@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@wxt-dev/module-react/-/module-react-1.1.3.tgz#b103d90f228b9bbc6dddb47d6316e7b4c5165141" + integrity sha512-ede2FLS3sdJwtyI61jvY1UiF194ouv3wxm+fCYjfP4FfvoXQbif8UuusYBC0KSa/L2AL9Cfa/lEvsdNYrKFUaA== + dependencies: + "@vitejs/plugin-react" "^4.3.4" + +"@wxt-dev/storage@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@wxt-dev/storage/-/storage-1.1.1.tgz#06b4b785bcfc7113733fda189ab1c2cd7a5e1825" + integrity sha512-H1vYWeoWz03INV4r+sLYDFil88b3rgMMfgGp/EXy3bLbveJeiMiFs/G0bsBN2Ra87Iqlf2oVYRb/ABQpAugbew== + dependencies: + async-mutex "^0.5.0" + dequal "^2.0.3" + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +accepts@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895" + integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== + dependencies: + mime-types "^3.0.0" + negotiator "^1.0.0" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.14.0: + version "8.14.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" + integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== + +adm-zip@~0.5.x: + version "0.5.16" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.5.16.tgz#0b5e4c779f07dedea5805cdccb1147071d94a909" + integrity sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-align@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-escapes@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz#00fc19f491bbb18e1d481b97868204f92109bfe7" + integrity sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw== + dependencies: + environment "^1.0.0" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.0.0, ansi-styles@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== + dependencies: + call-bound "^1.0.3" + is-array-buffer "^3.0.5" + +array-differ@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-4.0.0.tgz#aa3c891c653523290c880022f45b06a42051b026" + integrity sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw== + +array-includes@^3.1.6, array-includes@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" + +array-union@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz#da52630d327f8b88cfbfb57728e2af5cd9b6b975" + integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== + +array.prototype.findlast@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" + integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + +array.prototype.flatmap@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" + integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + is-array-buffer "^3.0.4" + +async-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" + integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== + +async-mutex@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.5.0.tgz#353c69a0b9e75250971a64ac203b0ebfddd75482" + integrity sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA== + dependencies: + tslib "^2.4.0" + +async@^3.2.0: + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + +atomically@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/atomically/-/atomically-2.0.3.tgz#27e47bbe39994d324918491ba7c0edb7783e56cb" + integrity sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw== + dependencies: + stubborn-fs "^1.2.5" + when-exit "^2.1.1" + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +big-integer@^1.6.44: + version "1.6.52" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" + integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +bl@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-5.1.0.tgz#183715f678c7188ecef9fe475d90209400624273" + integrity sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ== + dependencies: + buffer "^6.0.3" + inherits "^2.0.4" + readable-stream "^3.4.0" + +bluebird@~3.7: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +body-parser@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-2.2.0.tgz#f7a9656de305249a715b549b7b8fd1ab9dfddcfa" + integrity sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg== + dependencies: + bytes "^3.1.2" + content-type "^1.0.5" + debug "^4.4.0" + http-errors "^2.0.0" + iconv-lite "^0.6.3" + on-finished "^2.4.1" + qs "^6.14.0" + raw-body "^3.0.0" + type-is "^2.0.0" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +boxen@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-8.0.1.tgz#7e9fcbb45e11a2d7e6daa8fdcebfc3242fc19fe3" + integrity sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw== + dependencies: + ansi-align "^3.0.1" + camelcase "^8.0.0" + chalk "^5.3.0" + cli-boxes "^3.0.0" + string-width "^7.2.0" + type-fest "^4.21.0" + widest-line "^5.0.0" + wrap-ansi "^9.0.0" + +bplist-parser@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" + integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== + dependencies: + big-integer "^1.6.44" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.24.0: + version "4.24.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.5.tgz#aa0f5b8560fe81fde84c6dcb38f759bafba0e11b" + integrity sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw== + dependencies: + caniuse-lite "^1.0.30001716" + electron-to-chromium "^1.5.149" + node-releases "^2.0.19" + update-browserslist-db "^1.1.3" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bundle-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" + integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== + dependencies: + run-applescript "^5.0.0" + +bundle-name@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" + integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== + dependencies: + run-applescript "^7.0.0" + +bytes@3.1.2, bytes@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +c12@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/c12/-/c12-3.0.3.tgz#4d6d4d35f084606ff616d1bcae60e6676eacd4bd" + integrity sha512-uC3MacKBb0Z15o5QWCHvHWj5Zv34pGQj9P+iXKSpTuSGFS0KKhUWf4t9AJ+gWjYOdmWCPEGpEzm8sS0iqbpo1w== + dependencies: + chokidar "^4.0.3" + confbox "^0.2.2" + defu "^6.1.4" + dotenv "^16.4.7" + exsolve "^1.0.4" + giget "^2.0.0" + jiti "^2.4.2" + ohash "^2.0.11" + pathe "^2.0.3" + perfect-debounce "^1.0.0" + pkg-types "^2.1.0" + rc9 "^2.1.2" + +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-8.0.0.tgz#c0d36d418753fb6ad9c5e0437579745c1c14a534" + integrity sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA== + +caniuse-lite@^1.0.30001716: + version "1.0.30001716" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001716.tgz#39220dfbc58c85d9d4519e7090b656aa11ca4b85" + integrity sha512-49/c1+x3Kwz7ZIWt+4DvK3aMJy9oYXXG6/97JKsnjdCk/6n9vVyWL8NAwVt95Lwt9eigI10Hl782kDfZUUlRXw== + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^5.0.0, chalk@^5.3.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.1.tgz#1b48bf0963ec158dce2aacf69c093ae2dd2092d8" + integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== + +chokidar@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chokidar@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-launcher@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-1.1.2.tgz#52eff6b3fd7f24b65192b2624a108dadbcca4b9d" + integrity sha512-YclTJey34KUm5jB1aEJCq807bSievi7Nb/TU4Gu504fUYi3jw3KCIaH6L7nFWQhdEgH3V+wCh+kKD1P5cXnfxw== + dependencies: + "@types/node" "*" + escape-string-regexp "^4.0.0" + is-wsl "^2.2.0" + lighthouse-logger "^2.0.1" + +ci-info@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.2.0.tgz#cbd21386152ebfe1d56f280a3b5feccbd96764c7" + integrity sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg== + +citty@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/citty/-/citty-0.1.6.tgz#0f7904da1ed4625e1a9ea7e0fa780981aab7c5e4" + integrity sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ== + dependencies: + consola "^3.2.3" + +cli-boxes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" + integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== + +cli-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" + integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== + dependencies: + restore-cursor "^4.0.0" + +cli-cursor@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" + integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== + dependencies: + restore-cursor "^5.0.0" + +cli-highlight@^2.1.11: + version "2.1.11" + resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" + integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== + dependencies: + chalk "^4.0.0" + highlight.js "^10.7.1" + mz "^2.4.0" + parse5 "^5.1.1" + parse5-htmlparser2-tree-adapter "^6.0.0" + yargs "^16.0.0" + +cli-spinners@^2.6.1, cli-spinners@^2.9.2: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + +cli-truncate@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" + integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== + dependencies: + slice-ansi "^5.0.0" + string-width "^7.0.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^2.0.20: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +commander@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + integrity sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A== + dependencies: + graceful-readlink ">= 1.0.0" + +commander@^9.1.0: + version "9.5.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" + integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concat-stream@^1.4.7: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +confbox@^0.1.7, confbox@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06" + integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== + +confbox@^0.2.1, confbox@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.2.2.tgz#8652f53961c74d9e081784beed78555974a9c110" + integrity sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ== + +config-chain@^1.1.11: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-7.0.0.tgz#4461561fc51cb40e5ee1161230bc0337e069cc6b" + integrity sha512-yk7/5PN5im4qwz0WFZW3PXnzHgPu9mX29Y8uZ3aefe2lBPC1FYttWZRcaW9fKkT0pBCJyuQ2HfbmPVaODi9jcQ== + dependencies: + atomically "^2.0.3" + dot-prop "^9.0.0" + graceful-fs "^4.2.11" + xdg-basedir "^5.1.0" + +consola@^3.2.3, consola@^3.4.0: + version "3.4.2" + resolved "https://registry.yarnpkg.com/consola/-/consola-3.4.2.tgz#5af110145397bb67afdab77013fdc34cae590ea7" + integrity sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA== + +content-disposition@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-1.0.0.tgz#844426cb398f934caefcbb172200126bc7ceace2" + integrity sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg== + dependencies: + safe-buffer "5.2.1" + +content-type@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie-signature@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793" + integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== + +cookie@^0.7.1: + version "0.7.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cors@^2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cross-spawn@^7.0.3, cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + +csstype@^3.0.2, csstype@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +data-view-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-offset@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +debounce@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + +debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + +debug@~4.3.1: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +default-browser-id@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" + integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== + dependencies: + bplist-parser "^0.2.0" + untildify "^4.0.0" + +default-browser-id@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.0.tgz#a1d98bf960c15082d8a3fa69e83150ccccc3af26" + integrity sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA== + +default-browser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da" + integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== + dependencies: + bundle-name "^3.0.0" + default-browser-id "^3.0.0" + execa "^7.1.1" + titleize "^3.0.0" + +default-browser@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.2.1.tgz#7b7ba61204ff3e425b556869ae6d3e9d9f1712cf" + integrity sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg== + dependencies: + bundle-name "^4.1.0" + default-browser-id "^5.0.0" + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== + +define-properties@^1.1.3, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +defu@^6.1.4: + version "6.1.4" + resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.4.tgz#4e0c9cf9ff68fe5f3d7f2765cc1a012dfdcb0479" + integrity sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg== + +depd@2.0.0, depd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +destr@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.5.tgz#7d112ff1b925fb8d2079fac5bdb4a90973b51fdb" + integrity sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA== + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1, domutils@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" + integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +dot-prop@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-9.0.0.tgz#bae5982fe6dc6b8fddb92efef4f2ddff26779e92" + integrity sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ== + dependencies: + type-fest "^4.18.2" + +dotenv-expand@^12.0.1: + version "12.0.2" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-12.0.2.tgz#0c812c61a71901b8bd90387e0e0edd0678b8a181" + integrity sha512-lXpXz2ZE1cea1gL4sz2Ipj8y4PiVjytYr3Ij0SWoms1PGxIv7m2CRKuRuCRtHdVuvM/hNJPMxt5PbhboNC4dPQ== + dependencies: + dotenv "^16.4.5" + +dotenv@^16.3.1, dotenv@^16.4.5, dotenv@^16.4.7: + version "16.5.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.5.0.tgz#092b49f25f808f020050051d1ff258e404c78692" + integrity sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg== + +dunder-proto@^1.0.0, dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.5.149: + version "1.5.149" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.149.tgz#b6d1a468b9537165e2494d0b5b82e9b3392d0ddb" + integrity sha512-UyiO82eb9dVOx8YO3ajDf9jz2kKyt98DEITRdeLPstOEuTlLzDA4Gyq5K9he71TQziU5jUVu2OAu5N48HmQiyQ== + +embla-carousel-autoplay@^8.5.1: + version "8.6.0" + resolved "https://registry.yarnpkg.com/embla-carousel-autoplay/-/embla-carousel-autoplay-8.6.0.tgz#bc86c97de00d52ec34b05058736ef50af6e0d0e4" + integrity sha512-OBu5G3nwaSXkZCo1A6LTaFMZ8EpkYbwIaH+bPqdBnDGQ2fh4+NbzjXjs2SktoPNKCtflfVMc75njaDHOYXcrsA== + +embla-carousel-fade@^8.5.1: + version "8.6.0" + resolved "https://registry.yarnpkg.com/embla-carousel-fade/-/embla-carousel-fade-8.6.0.tgz#92d19ecd54441eb6f37910bf9e16fd3f547e3374" + integrity sha512-qaYsx5mwCz72ZrjlsXgs1nKejSrW+UhkbOMwLgfRT7w2LtdEB03nPRI06GHuHv5ac2USvbEiX2/nAHctcDwvpg== + +embla-carousel@^8.5.1: + version "8.6.0" + resolved "https://registry.yarnpkg.com/embla-carousel/-/embla-carousel-8.6.0.tgz#abcedff2bff36992ea8ac27cd30080ca5b6a3f58" + integrity sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA== + +emoji-regex@^10.3.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" + integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +entities@^4.2.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +entities@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-6.0.0.tgz#09c9e29cb79b0a6459a9b9db9efb418ac5bb8e51" + integrity sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw== + +environment@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" + integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== + +error-ex@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9: + version "1.23.9" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.9.tgz#5b45994b7de78dada5c1bebf1379646b32b9d606" + integrity sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA== + dependencies: + array-buffer-byte-length "^1.0.2" + arraybuffer.prototype.slice "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.3" + data-view-buffer "^1.0.2" + data-view-byte-length "^1.0.2" + data-view-byte-offset "^1.0.1" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.1.0" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.8" + get-intrinsic "^1.2.7" + get-proto "^1.0.0" + get-symbol-description "^1.1.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + internal-slot "^1.1.0" + is-array-buffer "^3.0.5" + is-callable "^1.2.7" + is-data-view "^1.0.2" + is-regex "^1.2.1" + is-shared-array-buffer "^1.0.4" + is-string "^1.1.1" + is-typed-array "^1.1.15" + is-weakref "^1.1.0" + math-intrinsics "^1.1.0" + object-inspect "^1.13.3" + object-keys "^1.1.1" + object.assign "^4.1.7" + own-keys "^1.0.1" + regexp.prototype.flags "^1.5.3" + safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" + safe-regex-test "^1.1.0" + set-proto "^1.0.0" + string.prototype.trim "^1.2.10" + string.prototype.trimend "^1.0.9" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.3" + typed-array-byte-length "^1.0.3" + typed-array-byte-offset "^1.0.4" + typed-array-length "^1.0.7" + unbox-primitive "^1.1.0" + which-typed-array "^1.1.18" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-iterator-helpers@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz#d1dd0f58129054c0ad922e6a9a1e65eef435fe75" + integrity sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-abstract "^1.23.6" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.6" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + iterator.prototype "^1.1.4" + safe-array-concat "^1.1.3" + +es-module-lexer@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" + integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3, es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +es-shim-unscopables@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" + integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== + dependencies: + hasown "^2.0.2" + +es-to-primitive@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== + dependencies: + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" + +es6-error@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + +esbuild@^0.25.0: + version "0.25.3" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.3.tgz#371f7cb41283e5b2191a96047a7a89562965a285" + integrity sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q== + optionalDependencies: + "@esbuild/aix-ppc64" "0.25.3" + "@esbuild/android-arm" "0.25.3" + "@esbuild/android-arm64" "0.25.3" + "@esbuild/android-x64" "0.25.3" + "@esbuild/darwin-arm64" "0.25.3" + "@esbuild/darwin-x64" "0.25.3" + "@esbuild/freebsd-arm64" "0.25.3" + "@esbuild/freebsd-x64" "0.25.3" + "@esbuild/linux-arm" "0.25.3" + "@esbuild/linux-arm64" "0.25.3" + "@esbuild/linux-ia32" "0.25.3" + "@esbuild/linux-loong64" "0.25.3" + "@esbuild/linux-mips64el" "0.25.3" + "@esbuild/linux-ppc64" "0.25.3" + "@esbuild/linux-riscv64" "0.25.3" + "@esbuild/linux-s390x" "0.25.3" + "@esbuild/linux-x64" "0.25.3" + "@esbuild/netbsd-arm64" "0.25.3" + "@esbuild/netbsd-x64" "0.25.3" + "@esbuild/openbsd-arm64" "0.25.3" + "@esbuild/openbsd-x64" "0.25.3" + "@esbuild/sunos-x64" "0.25.3" + "@esbuild/win32-arm64" "0.25.3" + "@esbuild/win32-ia32" "0.25.3" + "@esbuild/win32-x64" "0.25.3" + +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-goat@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-4.0.0.tgz#9424820331b510b0666b98f7873fe11ac4aa8081" + integrity sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg== + +escape-html@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + +eslint-plugin-react@^7.37.5: + version "7.37.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz#2975511472bdda1b272b34d779335c9b0e877065" + integrity sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA== + dependencies: + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" + array.prototype.flatmap "^1.3.3" + array.prototype.tosorted "^1.1.4" + doctrine "^2.1.0" + es-iterator-helpers "^1.2.1" + estraverse "^5.3.0" + hasown "^2.0.2" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.9" + object.fromentries "^2.0.8" + object.values "^1.2.1" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.12" + string.prototype.repeat "^1.0.0" + +eslint-scope@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.3.0.tgz#10cd3a918ffdd722f5f3f7b5b83db9b23c87340d" + integrity sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" + integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== + +eslint@^9.26.0: + version "9.26.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.26.0.tgz#978fe029adc2aceed28ab437bca876e83461c3b4" + integrity sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.20.0" + "@eslint/config-helpers" "^0.2.1" + "@eslint/core" "^0.13.0" + "@eslint/eslintrc" "^3.3.1" + "@eslint/js" "9.26.0" + "@eslint/plugin-kit" "^0.2.8" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.2" + "@modelcontextprotocol/sdk" "^1.8.0" + "@types/estree" "^1.0.6" + "@types/json-schema" "^7.0.15" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.6" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.3.0" + eslint-visitor-keys "^4.2.0" + espree "^10.3.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + zod "^3.24.2" + +espree@^10.0.1, espree@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" + integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== + dependencies: + acorn "^8.14.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.2.0" + +esquery@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +estree-walker@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +eventsource-parser@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eventsource-parser/-/eventsource-parser-3.0.1.tgz#5e358dba9a55ba64ca90da883c4ca35bd82467bd" + integrity sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA== + +eventsource@^3.0.2: + version "3.0.6" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-3.0.6.tgz#5c4b24cd70c0323eed2651a5ee07bd4bc391e656" + integrity sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA== + dependencies: + eventsource-parser "^3.0.1" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + 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" + +execa@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" + integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== + 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" + +execa@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + +express-rate-limit@^7.5.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-7.5.0.tgz#6a67990a724b4fbbc69119419feef50c51e8b28f" + integrity sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg== + +express@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/express/-/express-5.1.0.tgz#d31beaf715a0016f0d53f47d3b4d7acf28c75cc9" + integrity sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA== + dependencies: + accepts "^2.0.0" + body-parser "^2.2.0" + content-disposition "^1.0.0" + content-type "^1.0.5" + cookie "^0.7.1" + cookie-signature "^1.2.1" + debug "^4.4.0" + encodeurl "^2.0.0" + escape-html "^1.0.3" + etag "^1.8.1" + finalhandler "^2.1.0" + fresh "^2.0.0" + http-errors "^2.0.0" + merge-descriptors "^2.0.0" + mime-types "^3.0.0" + on-finished "^2.4.1" + once "^1.4.0" + parseurl "^1.3.3" + proxy-addr "^2.0.7" + qs "^6.14.0" + range-parser "^1.2.1" + router "^2.2.0" + send "^1.1.0" + serve-static "^2.2.0" + statuses "^2.0.1" + type-is "^2.0.1" + vary "^1.1.2" + +exsolve@^1.0.1, exsolve@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/exsolve/-/exsolve-1.0.5.tgz#1f5b6b4fe82ad6b28a173ccb955a635d77859dcf" + integrity sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg== + +extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.3.2, fast-glob@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.8" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-redact@^3.1.1: + version "3.5.0" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.5.0.tgz#e9ea02f7e57d0cd8438180083e93077e496285e4" + integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A== + +fastq@^1.6.0: + version "1.19.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" + integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== + dependencies: + reusify "^1.0.4" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + +fdir@^6.4.4: + version "6.4.4" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.4.tgz#1cfcf86f875a883e19a8fab53622cfe992e8d2f9" + integrity sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg== + +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + +filesize@^10.1.6: + version "10.1.6" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-10.1.6.tgz#31194da825ac58689c0bce3948f33ce83aabd361" + integrity sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w== + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-2.1.0.tgz#72306373aa89d05a8242ed569ed86a1bff7c561f" + integrity sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q== + dependencies: + debug "^4.4.0" + encodeurl "^2.0.0" + escape-html "^1.0.3" + on-finished "^2.4.1" + parseurl "^1.3.3" + statuses "^2.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +firefox-profile@4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/firefox-profile/-/firefox-profile-4.7.0.tgz#97087b17a9a38fea58ec0acf2bca19a5cc121cb7" + integrity sha512-aGApEu5bfCNbA4PGUZiRJAIU6jKmghV2UVdklXAofnNtiDjqYw0czLS46W7IfFqVKgKhFB8Ao2YoNGHY4BoIMQ== + dependencies: + adm-zip "~0.5.x" + fs-extra "^11.2.0" + ini "^4.1.3" + minimist "^1.2.8" + xml2js "^0.6.2" + +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + +flatted@^3.2.9: + version "3.3.3" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== + +for-each@^0.3.3, for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== + dependencies: + is-callable "^1.2.7" + +formdata-node@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/formdata-node/-/formdata-node-6.0.3.tgz#48f8e2206ae2befded82af621ef015f08168dc6d" + integrity sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-2.0.0.tgz#8dd7df6a1b3a1b3a5cf186c05a5dd267622635a4" + integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== + +fs-extra@^11.2.0: + version "11.3.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.0.tgz#0daced136bbaf65a555a326719af931adc7a314d" + integrity sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" + integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + functions-have-names "^1.2.3" + hasown "^2.0.2" + is-callable "^1.2.7" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +fx-runner@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/fx-runner/-/fx-runner-1.4.0.tgz#7a3f0374cc78c6c689ef75937b7b0cd75428c509" + integrity sha512-rci1g6U0rdTg6bAaBboP7XdRu01dzTAaKXxFf+PUqGuCv6Xu7o8NZdY1D5MvKGIjb6EdS1g3VlXOgksir1uGkg== + dependencies: + commander "2.9.0" + shell-quote "1.7.3" + spawn-sync "1.0.15" + when "3.7.7" + which "1.2.4" + winreg "0.0.12" + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-east-asian-width@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz#21b4071ee58ed04ee0db653371b55b4299875389" + integrity sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ== + +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-port-please@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/get-port-please/-/get-port-please-3.1.2.tgz#502795e56217128e4183025c89a48c71652f4e49" + integrity sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ== + +get-proto@^1.0.0, get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0, get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + +get-symbol-description@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + +giget@^1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/giget/-/giget-1.2.5.tgz#0bd4909356a0da75cc1f2b33538f93adec0d202f" + integrity sha512-r1ekGw/Bgpi3HLV3h1MRBIlSAdHoIMklpaQ3OQLFcRw9PwAj2rqigvIbg+dBUI51OxVI2jsEtDywDBjSiuf7Ug== + dependencies: + citty "^0.1.6" + consola "^3.4.0" + defu "^6.1.4" + node-fetch-native "^1.6.6" + nypm "^0.5.4" + pathe "^2.0.3" + tar "^6.2.1" + +giget@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/giget/-/giget-2.0.0.tgz#395fc934a43f9a7a29a29d55b99f23e30c14f195" + integrity sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA== + dependencies: + citty "^0.1.6" + consola "^3.4.0" + defu "^6.1.4" + node-fetch-native "^1.6.6" + nypm "^0.6.0" + pathe "^2.0.3" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +global-directory@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" + integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== + dependencies: + ini "4.1.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globals@^16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-16.0.0.tgz#3d7684652c5c4fbd086ec82f9448214da49382d8" + integrity sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A== + +globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +graceful-fs@4.2.10: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + integrity sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw== + +has-bigints@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" + integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +highlight.js@^10.7.1: + version "10.7.3" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== + +hookable@^5.5.3: + version "5.5.3" + resolved "https://registry.yarnpkg.com/hookable/-/hookable-5.5.3.tgz#6cfc358984a1ef991e2518cb9ed4a778bbd3215d" + integrity sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ== + +html-escaper@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-3.0.3.tgz#4d336674652beb1dcbc29ef6b6ba7f6be6fdfed6" + integrity sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ== + +htmlparser2@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-10.0.0.tgz#77ad249037b66bf8cc99c6e286ef73b83aeb621d" + integrity sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.2.1" + entities "^6.0.0" + +http-errors@2.0.0, http-errors@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +human-signals@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" + integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== + +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + +iconv-lite@0.6.3, iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0, ignore@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + +import-fresh@^3.2.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-meta-resolve@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#f9db8bead9fafa61adb811db77a2bf22c5399706" + integrity sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" + integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== + +ini@^1.3.4, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +ini@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.3.tgz#4c359675a6071a46985eb39b14e4a2c0ec98a795" + integrity sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg== + +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.2" + side-channel "^1.1.0" + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.1.7.tgz#847491119fccb5fb436217cc737f7faad50f603f" + integrity sha512-Xi9/ZSn4NFapG8RP98iNPMOeaV3mXPisxKxzKtHVqr3g56j/fBn+yZmnxSVAA8lmZbl2J9b/a4kJvfU3hqQYgA== + dependencies: + is-relative "^0.1.0" + +is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-async-function@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" + integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== + dependencies: + async-function "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== + dependencies: + has-bigints "^1.0.2" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + +is-data-view@^1.0.1, is-data-view@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== + dependencies: + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + is-typed-array "^1.1.13" + +is-date-object@^1.0.5, is-date-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== + dependencies: + call-bound "^1.0.3" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-fullwidth-code-point@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" + integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== + dependencies: + get-east-asian-width "^1.0.0" + +is-generator-function@^1.0.10: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" + integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== + dependencies: + call-bound "^1.0.3" + get-proto "^1.0.0" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-in-ci@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-in-ci/-/is-in-ci-1.0.0.tgz#9a86bbda7e42c6129902e0574c54b018fbb6ab88" + integrity sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg== + +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + +is-installed-globally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-1.0.0.tgz#08952c43758c33d815692392f7f8437b9e436d5a" + integrity sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ== + dependencies: + global-directory "^4.0.1" + is-path-inside "^4.0.0" + +is-interactive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90" + integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== + +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-npm@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-6.0.0.tgz#b59e75e8915543ca5d881ecff864077cba095261" + integrity sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ== + +is-number-object@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-4.0.0.tgz#805aeb62c47c1b12fc3fd13bfb3ed1e7430071db" + integrity sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-primitive@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-3.0.1.tgz#98c4db1abff185485a657fc2905052b940524d05" + integrity sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w== + +is-promise@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + +is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== + dependencies: + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +is-relative@^0.1.0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.1.3.tgz#905fee8ae86f45b3ec614bc3c15c869df0876e82" + integrity sha512-wBOr+rNM4gkAZqoLRJI4myw5WzzIdQosFAAbnvfXP5z1LyzgAI3ivOKehC5KfqlQJZoihVhirgtCBj378Eg8GA== + +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== + dependencies: + call-bound "^1.0.3" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + +is-string@^1.0.7, is-string@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-symbol@^1.0.4, is-symbol@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== + dependencies: + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" + +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== + dependencies: + which-typed-array "^1.1.16" + +is-unicode-supported@^1.1.0, is-unicode-supported@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" + integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== + +is-unicode-supported@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz#09f0ab0de6d3744d48d265ebb98f65d11f2a9b3a" + integrity sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ== + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2, is-weakref@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" + integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== + dependencies: + call-bound "^1.0.3" + +is-weakset@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" + integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== + dependencies: + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +is-wsl@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" + integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== + dependencies: + is-inside-container "^1.0.0" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" + integrity sha512-d2eJzK691yZwPHcv1LbeAOa91yMJ9QmfTgSO1oXB65ezVhXQsxBac2vEB4bMVms9cGzaA99n6V2viHMq82VLDw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +iterator.prototype@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.5.tgz#12c959a29de32de0aa3bbbb801f4d777066dae39" + integrity sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g== + dependencies: + define-data-property "^1.1.4" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + get-proto "^1.0.0" + has-symbols "^1.1.0" + set-function-name "^2.0.2" + +jiti@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.4.2.tgz#d19b7732ebb6116b06e2038da74a55366faef560" + integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-9.0.1.tgz#2ec43964658435296f6761b34e10671c2d9527f4" + integrity sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz#b43d35e89c0f3be6b5fbbe9dc6c82467b30c28da" + integrity sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +jszip@^3.10.1, jszip@^3.2.2: + version "3.10.1" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" + integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + setimmediate "^1.0.5" + +keyborg@2.6.0, keyborg@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/keyborg/-/keyborg-2.6.0.tgz#ebfcaaed2f517f9295058ff5d57d14e71958ab5a" + integrity sha512-o5kvLbuTF+o326CMVYpjlaykxqYP9DphFQZ2ZpgrvBouyvOxyEB7oqe8nOLFpiV5VCtz0D3pt8gXQYWpLpBnmA== + +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +ky@^1.2.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/ky/-/ky-1.8.1.tgz#b1adaa473bc30aced2bab4c408ec177b78d198f0" + integrity sha512-7Bp3TpsE+L+TARSnnDpk3xg8Idi8RwSLdj6CMbNWoOARIrGrbuLGusV0dYwbZOm4bB3jHNxSw8Wk/ByDqJEnDw== + +latest-version@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-9.0.0.tgz#e91ed216e7a4badc6f73b66c65adb46c58ec6ba1" + integrity sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA== + dependencies: + package-json "^10.0.0" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + +lighthouse-logger@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/lighthouse-logger/-/lighthouse-logger-2.0.1.tgz#48895f639b61cca89346bb6f47f7403a3895fa02" + integrity sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ== + dependencies: + debug "^2.6.9" + marky "^1.2.2" + +lines-and-columns@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.4.tgz#d00318855905d2660d8c0822e3f5a4715855fc42" + integrity sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A== + +linkedom@^0.18.5: + version "0.18.10" + resolved "https://registry.yarnpkg.com/linkedom/-/linkedom-0.18.10.tgz#28c2e2ed26770f0d104f176404429d48dde8fb79" + integrity sha512-ESCqVAtme2GI3zZnlVRidiydByV6WmPlmKeFzFVQslADiAO2Wi+H6xL/5kr/pUOESjEoVb2Eb3cYFJ/TQhQOWA== + dependencies: + css-select "^5.1.0" + cssom "^0.5.0" + html-escaper "^3.0.3" + htmlparser2 "^10.0.0" + uhyphen "^0.2.0" + +listr2@^8.0.1: + version "8.3.2" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.3.2.tgz#c252ec9a3334950bfca9238457d0ad2c1a5cc867" + integrity sha512-vsBzcU4oE+v0lj4FhVLzr9dBTv4/fHIa57l+GCwovP8MoFNZJTOhGU8PXd4v2VJCbECAaijBiHntiekFMLvo0g== + dependencies: + cli-truncate "^4.0.0" + colorette "^2.0.20" + eventemitter3 "^5.0.1" + log-update "^6.1.0" + rfdc "^1.4.1" + wrap-ansi "^9.0.0" + +local-pkg@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-1.1.1.tgz#f5fe74a97a3bd3c165788ee08ca9fbe998dc58dd" + integrity sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg== + dependencies: + mlly "^1.7.4" + pkg-types "^2.0.1" + quansync "^0.2.8" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +lodash.kebabcase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" + integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.snakecase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== + +log-symbols@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-5.1.0.tgz#a20e3b9a5f53fac6aeb8e2bb22c07cf2c8f16d93" + integrity sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA== + dependencies: + chalk "^5.0.0" + is-unicode-supported "^1.1.0" + +log-symbols@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-6.0.0.tgz#bb95e5f05322651cac30c0feb6404f9f2a8a9439" + integrity sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw== + dependencies: + chalk "^5.3.0" + is-unicode-supported "^1.3.0" + +log-update@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz#1a04ff38166f94647ae1af562f4bd6a15b1b7cd4" + integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== + dependencies: + ansi-escapes "^7.0.0" + cli-cursor "^5.0.0" + slice-ansi "^7.1.0" + strip-ansi "^7.1.0" + wrap-ansi "^9.0.0" + +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lzutf8@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/lzutf8/-/lzutf8-0.6.3.tgz#37a2ebe80922a8405f1e3f24c6c2b74c3e430981" + integrity sha512-CAkF9HKrM+XpB0f3DepQ2to2iUEo0zrbh+XgBqgNBc1+k8HMM3u/YSfHI3Dr4GmoTIez2Pr/If1XFl3rU26AwA== + dependencies: + readable-stream "^4.0.0" + +magic-string@^0.30.17: + version "0.30.17" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" + integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + +magicast@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/magicast/-/magicast-0.3.5.tgz#8301c3c7d66704a0771eb1bad74274f0ec036739" + integrity sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ== + dependencies: + "@babel/parser" "^7.25.4" + "@babel/types" "^7.25.4" + source-map-js "^1.2.0" + +make-error@^1.3.2: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +many-keys-map@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/many-keys-map/-/many-keys-map-2.0.1.tgz#3ae9f97cff78e08f79311d4e9c42fb3cc583f61e" + integrity sha512-DHnZAD4phTbZ+qnJdjoNEVU1NecYoSdbOOoVmTDH46AuxDkEVh3MxTVpXq10GtcTC6mndN9dkv1rNfpjRcLnOw== + +marky@^1.2.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/marky/-/marky-1.3.0.tgz#422b63b0baf65022f02eda61a238eccdbbc14997" + integrity sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ== + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +mdn-data@2.20.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.20.0.tgz#b2274bafb8d1ce544bd040b9d427b8534010575d" + integrity sha512-/d3otgvmquUkAN2RVxSg6lIbQrYX7isR4aC5Hvw8JuHvzctR3eUG50WmsAZjb9MkbJ5LbijPSy7uIxEtQDGI0w== + +media-typer@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561" + integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== + +merge-descriptors@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz#ea922f660635a2249ee565e0449f951e6b603808" + integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mime-db@^1.54.0: + version "1.54.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + +mime-types@^3.0.0, mime-types@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.1.tgz#b1d94d6997a9b32fd69ebaed0db73de8acb519ce" + integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA== + dependencies: + mime-db "^1.54.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +mimic-function@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" + integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== + +minimatch@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.1.tgz#ce0521856b453c86e25f2c4c0d03e6ff7ddc440b" + integrity sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.4, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mlly@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.4.tgz#3d7295ea2358ec7a271eaa5d000a0f84febe100f" + integrity sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw== + dependencies: + acorn "^8.14.0" + pathe "^2.0.1" + pkg-types "^1.3.0" + ufo "^1.5.4" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multimatch@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-6.0.0.tgz#c72a9bddbc94baa4727efd613b5d22a1fe4d6ee3" + integrity sha512-I7tSVxHGPlmPN/enE3mS1aOSo6bWBfls+3HmuEeCUBCE7gWnm3cBXCBkpurzFjVRwC6Kld8lLaZ1Iv5vOcjvcQ== + dependencies: + "@types/minimatch" "^3.0.5" + array-differ "^4.0.0" + array-union "^3.0.1" + minimatch "^3.0.4" + +mz@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nano-spawn@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/nano-spawn/-/nano-spawn-0.2.0.tgz#855cae42ac99caa6984aa2e9890bf191ef09994c" + integrity sha512-IjZBIOLxSlxu+m/kacg9JuP93oUpRemeV0mEuCy64nzBKKIL9m0aLJHtVPcVuzJDHFhElzjpwbW4a3tMzgKoZQ== + +nanoid@^3.3.8: + version "3.3.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a" + integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== + +node-fetch-native@^1.6.4, node-fetch-native@^1.6.6: + version "1.6.6" + resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.6.6.tgz#ae1d0e537af35c2c0b0de81cbff37eedd410aa37" + integrity sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ== + +node-forge@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-notifier@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-10.0.1.tgz#0e82014a15a8456c4cfcdb25858750399ae5f1c7" + integrity sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ== + dependencies: + growly "^1.3.0" + is-wsl "^2.2.0" + semver "^7.3.5" + shellwords "^0.1.1" + uuid "^8.3.2" + which "^2.0.2" + +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +nypm@^0.3.12: + version "0.3.12" + resolved "https://registry.yarnpkg.com/nypm/-/nypm-0.3.12.tgz#37541bec0af3a37d3acd81d6662c6666e650b22e" + integrity sha512-D3pzNDWIvgA+7IORhD/IuWzEk4uXv6GsgOxiid4UU3h9oq5IqV1KtPDi63n4sZJ/xcWlr88c0QM2RgN5VbOhFA== + dependencies: + citty "^0.1.6" + consola "^3.2.3" + execa "^8.0.1" + pathe "^1.1.2" + pkg-types "^1.2.0" + ufo "^1.5.4" + +nypm@^0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/nypm/-/nypm-0.5.4.tgz#a5ab0d8d37f96342328479f88ef58699f29b3051" + integrity sha512-X0SNNrZiGU8/e/zAB7sCTtdxWTMSIO73q+xuKgglm2Yvzwlo8UoC5FNySQFCvl84uPaeADkqHUZUkWy4aH4xOA== + dependencies: + citty "^0.1.6" + consola "^3.4.0" + pathe "^2.0.3" + pkg-types "^1.3.1" + tinyexec "^0.3.2" + ufo "^1.5.4" + +nypm@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/nypm/-/nypm-0.6.0.tgz#3a04623d1c358a93fc4b3cb9cfb6a11af080feca" + integrity sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg== + dependencies: + citty "^0.1.6" + consola "^3.4.0" + pathe "^2.0.3" + pkg-types "^2.0.0" + tinyexec "^0.3.2" + +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.3: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4, object.assign@^4.1.7: + version "4.1.7" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" + object-keys "^1.1.1" + +object.entries@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.9.tgz#e4770a6a1444afb61bd39f984018b5bede25f8b3" + integrity sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-object-atoms "^1.1.1" + +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.values@^1.1.6, object.values@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" + integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +ofetch@^1.3.3: + version "1.4.1" + resolved "https://registry.yarnpkg.com/ofetch/-/ofetch-1.4.1.tgz#b6bf6b0d75ba616cef6519dd8b6385a8bae480ec" + integrity sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw== + dependencies: + destr "^2.0.3" + node-fetch-native "^1.6.4" + ufo "^1.5.4" + +ohash@^1.1.4: + version "1.1.6" + resolved "https://registry.yarnpkg.com/ohash/-/ohash-1.1.6.tgz#9ff7b0271d7076290794537d68ec2b40a60d133e" + integrity sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg== + +ohash@^2.0.11: + version "2.0.11" + resolved "https://registry.yarnpkg.com/ohash/-/ohash-2.0.11.tgz#60b11e8cff62ca9dee88d13747a5baa145f5900b" + integrity sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ== + +on-exit-leak-free@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz#fed195c9ebddb7d9e4c3842f93f281ac8dadd3b8" + integrity sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA== + +on-finished@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +onetime@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" + integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== + dependencies: + mimic-function "^5.0.0" + +open@^10.1.0: + version "10.1.2" + resolved "https://registry.yarnpkg.com/open/-/open-10.1.2.tgz#d5df40984755c9a9c3c93df8156a12467e882925" + integrity sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw== + dependencies: + default-browser "^5.2.1" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + is-wsl "^3.1.0" + +open@^8.4.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +open@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6" + integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== + dependencies: + default-browser "^4.0.0" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + is-wsl "^2.2.0" + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +ora@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-6.3.1.tgz#a4e9e5c2cf5ee73c259e8b410273e706a2ad3ed6" + integrity sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ== + dependencies: + chalk "^5.0.0" + cli-cursor "^4.0.0" + cli-spinners "^2.6.1" + is-interactive "^2.0.0" + is-unicode-supported "^1.1.0" + log-symbols "^5.1.0" + stdin-discarder "^0.1.0" + strip-ansi "^7.0.1" + wcwidth "^1.0.1" + +ora@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-8.2.0.tgz#8fbbb7151afe33b540dd153f171ffa8bd38e9861" + integrity sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw== + dependencies: + chalk "^5.3.0" + cli-cursor "^5.0.0" + cli-spinners "^2.9.2" + is-interactive "^2.0.0" + is-unicode-supported "^2.0.0" + log-symbols "^6.0.0" + stdin-discarder "^0.2.2" + string-width "^7.2.0" + strip-ansi "^7.1.0" + +os-shim@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" + integrity sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A== + +own-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" + integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== + dependencies: + get-intrinsic "^1.2.6" + object-keys "^1.1.1" + safe-push-apply "^1.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +package-json@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-10.0.1.tgz#e49ee07b8de63b638e7f1b5bb353733e428fe7d7" + integrity sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg== + dependencies: + ky "^1.2.0" + registry-auth-token "^5.0.2" + registry-url "^6.0.1" + semver "^7.6.0" + +pako@~1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-7.1.1.tgz#68f7e6f0edf88c54ab14c00eb700b753b14e2120" + integrity sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw== + dependencies: + "@babel/code-frame" "^7.21.4" + error-ex "^1.3.2" + json-parse-even-better-errors "^3.0.0" + lines-and-columns "^2.0.3" + type-fest "^3.8.0" + +parse5-htmlparser2-tree-adapter@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== + dependencies: + parse5 "^6.0.1" + +parse5@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + +parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseurl@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@^8.0.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4" + integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== + +pathe@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" + integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== + +pathe@^2.0.1, pathe@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +perfect-debounce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a" + integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA== + +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + +pino-abstract-transport@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz#de241578406ac7b8a33ce0d77ae6e8a0b3b68a60" + integrity sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw== + dependencies: + split2 "^4.0.0" + +pino-std-serializers@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz#7c625038b13718dbbd84ab446bd673dc52259e3b" + integrity sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA== + +pino@9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-9.6.0.tgz#6bc628159ba0cc81806d286718903b7fc6b13169" + integrity sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.1.1" + on-exit-leak-free "^2.1.0" + pino-abstract-transport "^2.0.0" + pino-std-serializers "^7.0.0" + process-warning "^4.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.2.0" + safe-stable-stringify "^2.3.1" + sonic-boom "^4.0.1" + thread-stream "^3.0.0" + +pkce-challenge@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pkce-challenge/-/pkce-challenge-5.0.0.tgz#c3a405cb49e272094a38e890a2b51da0228c4d97" + integrity sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ== + +pkg-types@^1.2.0, pkg-types@^1.3.0, pkg-types@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df" + integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ== + dependencies: + confbox "^0.1.8" + mlly "^1.7.4" + pathe "^2.0.1" + +pkg-types@^2.0.0, pkg-types@^2.0.1, pkg-types@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-2.1.0.tgz#70c9e1b9c74b63fdde749876ee0aa007ea9edead" + integrity sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A== + dependencies: + confbox "^0.2.1" + exsolve "^1.0.1" + pathe "^2.0.3" + +possible-typed-array-names@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== + +postcss@^8.5.3: + version "8.5.3" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" + integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== + dependencies: + nanoid "^3.3.8" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process-warning@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-4.0.1.tgz#5c1db66007c67c756e4e09eb170cdece15da32fb" + integrity sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +promise-toolbox@0.21.0: + version "0.21.0" + resolved "https://registry.yarnpkg.com/promise-toolbox/-/promise-toolbox-0.21.0.tgz#6919876f9dea375f01b4ddaec4206db83cb0aa55" + integrity sha512-NV8aTmpwrZv+Iys54sSFOBx3tuVaOBvvrft5PNppnxy9xpU/akHbaWIril22AB22zaPgrgwKdD0KsrM0ptUtpg== + dependencies: + make-error "^1.3.2" + +prompts@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.6.2, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + +proxy-addr@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +"publish-browser-extension@^2.3.0 || ^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/publish-browser-extension/-/publish-browser-extension-3.0.0.tgz#938e226a10a10a995e83b5552a69337679a9204c" + integrity sha512-gwjH8mIepNqID2VqKIxzT6lmtvkcc5tcWYzrGSUdkeUFFFSHhGp9xx01EZ7j8wPq50dDe0XU5VNbHMAqr6wWAA== + dependencies: + cac "^6.7.14" + cli-highlight "^2.1.11" + consola "^3.2.3" + dotenv "^16.3.1" + extract-zip "^2.0.1" + formdata-node "^6.0.3" + listr2 "^8.0.1" + lodash.camelcase "^4.3.0" + lodash.kebabcase "^4.1.1" + lodash.snakecase "^4.1.1" + ofetch "^1.3.3" + open "^9.1.0" + ora "^6.3.1" + prompts "^2.4.2" + zod "^3.22.4" + +pump@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +pupa@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-3.1.0.tgz#f15610274376bbcc70c9a3aa8b505ea23f41c579" + integrity sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug== + dependencies: + escape-goat "^4.0.0" + +qs@^6.14.0: + version "6.14.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" + integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== + dependencies: + side-channel "^1.1.0" + +quansync@^0.2.8: + version "0.2.10" + resolved "https://registry.yarnpkg.com/quansync/-/quansync-0.2.10.tgz#32053cf166fa36511aae95fc49796116f2dc20e1" + integrity sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + +range-parser@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-3.0.0.tgz#25b3476f07a51600619dae3fe82ddc28a36e5e0f" + integrity sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.6.3" + unpipe "1.0.0" + +rc9@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/rc9/-/rc9-2.1.2.tgz#6282ff638a50caa0a91a31d76af4a0b9cbd1080d" + integrity sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg== + dependencies: + defu "^6.1.4" + destr "^2.0.3" + +rc@1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-dom@18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.2" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-refresh@^0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.17.0.tgz#b7e579c3657f23d04eccbe4ad2e58a8ed51e7e53" + integrity sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ== + +react-transition-group@^4.4.1: + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== + dependencies: + loose-envify "^1.1.0" + +readable-stream@^2.2.2, readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@^4.0.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.7.0.tgz#cedbd8a1146c13dfff8dab14068028d58c15ac91" + integrity sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + string_decoder "^1.3.0" + +readdirp@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +real-require@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.2.0.tgz#209632dea1810be2ae063a6ac084fee7e33fba78" + integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg== + +reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" + integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.7" + get-proto "^1.0.1" + which-builtin-type "^1.2.1" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regexp.prototype.flags@^1.5.3: + version "1.5.4" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" + integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-errors "^1.3.0" + get-proto "^1.0.1" + gopd "^1.2.0" + set-function-name "^2.0.2" + +registry-auth-token@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.1.0.tgz#3c659047ecd4caebd25bc1570a3aa979ae490eca" + integrity sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw== + dependencies: + "@pnpm/npm-conf" "^2.1.0" + +registry-url@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-6.0.1.tgz#056d9343680f2f64400032b1e199faa692286c58" + integrity sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q== + dependencies: + rc "1.2.8" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" + integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +restore-cursor@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" + integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== + dependencies: + onetime "^7.0.0" + signal-exit "^4.1.0" + +reusify@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== + +rfdc@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== + +rollup@^4.34.9: + version "4.40.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.40.1.tgz#03d6c53ebb6a9c2c060ae686a61e72a2472b366f" + integrity sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw== + dependencies: + "@types/estree" "1.0.7" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.40.1" + "@rollup/rollup-android-arm64" "4.40.1" + "@rollup/rollup-darwin-arm64" "4.40.1" + "@rollup/rollup-darwin-x64" "4.40.1" + "@rollup/rollup-freebsd-arm64" "4.40.1" + "@rollup/rollup-freebsd-x64" "4.40.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.40.1" + "@rollup/rollup-linux-arm-musleabihf" "4.40.1" + "@rollup/rollup-linux-arm64-gnu" "4.40.1" + "@rollup/rollup-linux-arm64-musl" "4.40.1" + "@rollup/rollup-linux-loongarch64-gnu" "4.40.1" + "@rollup/rollup-linux-powerpc64le-gnu" "4.40.1" + "@rollup/rollup-linux-riscv64-gnu" "4.40.1" + "@rollup/rollup-linux-riscv64-musl" "4.40.1" + "@rollup/rollup-linux-s390x-gnu" "4.40.1" + "@rollup/rollup-linux-x64-gnu" "4.40.1" + "@rollup/rollup-linux-x64-musl" "4.40.1" + "@rollup/rollup-win32-arm64-msvc" "4.40.1" + "@rollup/rollup-win32-ia32-msvc" "4.40.1" + "@rollup/rollup-win32-x64-msvc" "4.40.1" + fsevents "~2.3.2" + +router@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/router/-/router-2.2.0.tgz#019be620b711c87641167cc79b99090f00b146ef" + integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== + dependencies: + debug "^4.4.0" + depd "^2.0.0" + is-promise "^4.0.0" + parseurl "^1.3.3" + path-to-regexp "^8.0.0" + +rtl-css-js@^1.16.1: + version "1.16.1" + resolved "https://registry.yarnpkg.com/rtl-css-js/-/rtl-css-js-1.16.1.tgz#4b48b4354b0ff917a30488d95100fbf7219a3e80" + integrity sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg== + dependencies: + "@babel/runtime" "^7.1.2" + +run-applescript@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c" + integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== + dependencies: + execa "^5.0.0" + +run-applescript@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.0.0.tgz#e5a553c2bffd620e169d276c1cd8f1b64778fbeb" + integrity sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-array-concat@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" + integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + has-symbols "^1.1.0" + isarray "^2.0.5" + +safe-buffer@5.2.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-push-apply@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== + dependencies: + es-errors "^1.3.0" + isarray "^2.0.5" + +safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-regex "^1.2.1" + +safe-stable-stringify@^2.3.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@>=0.6.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== + +scheduler@0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== + dependencies: + loose-envify "^1.1.0" + +scule@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/scule/-/scule-1.3.0.tgz#6efbd22fd0bb801bdcc585c89266a7d2daa8fbd3" + integrity sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g== + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.5, semver@^7.6.0, semver@^7.6.3: + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + +send@^1.1.0, send@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/send/-/send-1.2.0.tgz#32a7554fb777b831dfa828370f773a3808d37212" + integrity sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw== + dependencies: + debug "^4.3.5" + encodeurl "^2.0.0" + escape-html "^1.0.3" + etag "^1.8.1" + fresh "^2.0.0" + http-errors "^2.0.0" + mime-types "^3.0.1" + ms "^2.1.3" + on-finished "^2.4.1" + range-parser "^1.2.1" + statuses "^2.0.1" + +serialize-error@^11.0.0: + version "11.0.3" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-11.0.3.tgz#b54f439e15da5b4961340fbbd376b6b04aa52e92" + integrity sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g== + dependencies: + type-fest "^2.12.2" + +serve-static@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.0.tgz#9c02564ee259bdd2251b82d659a2e7e1938d66f9" + integrity sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ== + dependencies: + encodeurl "^2.0.0" + escape-html "^1.0.3" + parseurl "^1.3.3" + send "^1.2.0" + +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +set-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" + integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== + dependencies: + dunder-proto "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + +set-value@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-4.1.0.tgz#aa433662d87081b75ad88a4743bd450f044e7d09" + integrity sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw== + dependencies: + is-plain-object "^2.0.4" + is-primitive "^3.0.1" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" + integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +slice-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" + integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" + +sonic-boom@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-4.2.0.tgz#e59a525f831210fa4ef1896428338641ac1c124d" + integrity sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww== + dependencies: + atomic-sleep "^1.0.0" + +source-map-js@^1.0.1, source-map-js@^1.2.0, source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +source-map-support@0.5.21: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +spawn-sync@1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" + integrity sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw== + dependencies: + concat-stream "^1.4.7" + os-shim "^0.1.2" + +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + +split@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== + dependencies: + through "2" + +statuses@2.0.1, statuses@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +stdin-discarder@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.1.0.tgz#22b3e400393a8e28ebf53f9958f3880622efde21" + integrity sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ== + dependencies: + bl "^5.0.0" + +stdin-discarder@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.2.2.tgz#390037f44c4ae1a1ae535c5fe38dc3aba8d997be" + integrity sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ== + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^7.0.0, string-width@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + +string.prototype.matchall@^4.0.12: + version "4.0.12" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz#6c88740e49ad4956b1332a911e949583a275d4c0" + integrity sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-abstract "^1.23.6" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + gopd "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + regexp.prototype.flags "^1.5.3" + set-function-name "^2.0.2" + side-channel "^1.1.0" + +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trim@^1.2.10: + version "1.2.10" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" + integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-data-property "^1.1.4" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-object-atoms "^1.0.0" + has-property-descriptors "^1.0.2" + +string.prototype.trimend@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" + integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string_decoder@^1.1.1, string_decoder@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1, strip-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-5.0.0.tgz#88d2e135d154dca7a5e06b4a4ba9653b6bdc0dd2" + integrity sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-json-comments@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-5.0.1.tgz#0d8b7d01b23848ed7dbdf4baaaa31a8250d8cfa0" + integrity sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +strip-literal@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-2.1.1.tgz#26906e65f606d49f748454a08084e94190c2e5ad" + integrity sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q== + dependencies: + js-tokens "^9.0.1" + +stubborn-fs@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/stubborn-fs/-/stubborn-fs-1.2.5.tgz#e5e244223166921ddf66ed5e062b6b3bf285bfd2" + integrity sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g== + +stylis@^4.2.0: + version "4.3.6" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.6.tgz#7c7b97191cb4f195f03ecab7d52f7902ed378320" + integrity sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tabster@^8.5.0: + version "8.5.4" + resolved "https://registry.yarnpkg.com/tabster/-/tabster-8.5.4.tgz#c4455e140ffeeb1f13883f194ba6f5c2d495a017" + integrity sha512-5Fe8vonlp6wjkBuaU3YImZsFncXkdxhCIE6CR28nD0n84kZERIDr9T9wBeya5h1Oj19AhzGFWyZrL6/29tCobA== + dependencies: + keyborg "2.6.0" + tslib "^2.3.1" + +tar@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +thread-stream@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-3.1.0.tgz#4b2ef252a7c215064507d4ef70c05a5e2d34c4f1" + integrity sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A== + dependencies: + real-require "^0.2.0" + +through@2: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tinyexec@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" + integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== + +tinyglobby@^0.2.13: + version "0.2.13" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.13.tgz#a0e46515ce6cbcd65331537e57484af5a7b2ff7e" + integrity sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw== + dependencies: + fdir "^6.4.4" + picomatch "^4.0.2" + +titleize@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" + integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== + +tmp@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +ts-api-utils@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91" + integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== + +tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^2.12.2: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + +type-fest@^3.8.0: + version "3.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" + integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== + +type-fest@^4.18.2, type-fest@^4.21.0: + version "4.40.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.40.1.tgz#d78a09f08dd1081a434dd377967650cfd565401d" + integrity sha512-9YvLNnORDpI+vghLU/Nf+zSv0kL47KbVJ1o3sKgoTefl6i+zebxbiDQWoe/oWWqPhIgQdRZRT1KA9sCPL810SA== + +type-is@^2.0.0, type-is@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-2.0.1.tgz#64f6cf03f92fce4015c2b224793f6bdd4b068c97" + integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw== + dependencies: + content-type "^1.0.5" + media-typer "^1.1.0" + mime-types "^3.0.0" + +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" + +typed-array-byte-length@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== + dependencies: + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.14" + +typed-array-byte-offset@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.15" + reflect.getprototypeof "^1.0.9" + +typed-array-length@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + +typescript-eslint@^8.31.1: + version "8.31.1" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.31.1.tgz#b77ab1e48ced2daab9225ff94bab54391a4af69b" + integrity sha512-j6DsEotD/fH39qKzXTQRwYYWlt7D+0HmfpOK+DVhwJOFLcdmn92hq3mBb7HlKJHbjjI/gTOqEcc9d6JfpFf/VA== + dependencies: + "@typescript-eslint/eslint-plugin" "8.31.1" + "@typescript-eslint/parser" "8.31.1" + "@typescript-eslint/utils" "8.31.1" + +typescript@^5.8.3: + version "5.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" + integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== + +ufo@^1.5.4: + version "1.6.1" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.6.1.tgz#ac2db1d54614d1b22c1d603e3aef44a85d8f146b" + integrity sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA== + +uhyphen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/uhyphen/-/uhyphen-0.2.0.tgz#8fdf0623314486e020a3c00ee5cc7a12fe722b81" + integrity sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA== + +uid@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/uid/-/uid-2.0.2.tgz#4b5782abf0f2feeefc00fa88006b2b3b7af3e3b9" + integrity sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g== + dependencies: + "@lukeed/csprng" "^1.0.0" + +unbox-primitive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== + dependencies: + call-bound "^1.0.3" + has-bigints "^1.0.2" + has-symbols "^1.1.0" + which-boxed-primitive "^1.1.1" + +undici-types@~6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" + integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== + +unimport@^3.13.1: + version "3.14.6" + resolved "https://registry.yarnpkg.com/unimport/-/unimport-3.14.6.tgz#f01170aa2fb94c4f97b22c0ac2822ef7e8e0726d" + integrity sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g== + dependencies: + "@rollup/pluginutils" "^5.1.4" + acorn "^8.14.0" + escape-string-regexp "^5.0.0" + estree-walker "^3.0.3" + fast-glob "^3.3.3" + local-pkg "^1.0.0" + magic-string "^0.30.17" + mlly "^1.7.4" + pathe "^2.0.1" + picomatch "^4.0.2" + pkg-types "^1.3.0" + scule "^1.3.0" + strip-literal "^2.1.1" + unplugin "^1.16.1" + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +unplugin@^1.16.1: + version "1.16.1" + resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-1.16.1.tgz#a844d2e3c3b14a4ac2945c42be80409321b61199" + integrity sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w== + dependencies: + acorn "^8.14.0" + webpack-virtual-modules "^0.6.2" + +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + +update-browserslist-db@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +update-notifier@7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-7.3.1.tgz#49af1ad6acfa0ea01c0d0f3c04047c154ead7096" + integrity sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA== + dependencies: + boxen "^8.0.1" + chalk "^5.3.0" + configstore "^7.0.0" + is-in-ci "^1.0.0" + is-installed-globally "^1.0.0" + is-npm "^6.0.0" + latest-version "^9.0.0" + pupa "^3.1.0" + semver "^7.6.3" + xdg-basedir "^5.1.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +use-disposable@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/use-disposable/-/use-disposable-1.0.4.tgz#9fb7b0cd4828fc8a271be16c136daefa2fd9ebca" + integrity sha512-j83t6AMLWUyb5zwlTDqf6dP9LezM9R0yTbI/b6olmdaGtCKQUe9pgJWV6dRaaQLcozypjIEp4EmZr2DkZGKLSg== + +use-sync-external-store@^1.2.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz#55122e2a3edd2a6c106174c27485e0fd59bcfca0" + integrity sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +vary@^1, vary@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +"vite-node@^2.1.4 || ^3.0.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-3.1.2.tgz#b17869a12307f5260b20ba4b58cf493afee70aa7" + integrity sha512-/8iMryv46J3aK13iUXsei5G/A3CUlW4665THCPS+K8xAaqrVWiGB4RfXMQXCLjpK9P2eK//BczrVkn5JLAk6DA== + dependencies: + cac "^6.7.14" + debug "^4.4.0" + es-module-lexer "^1.6.0" + pathe "^2.0.3" + vite "^5.0.0 || ^6.0.0" + +"vite@^5.0.0 || ^6.0.0", vite@^6.3.4: + version "6.3.4" + resolved "https://registry.yarnpkg.com/vite/-/vite-6.3.4.tgz#d441a72c7cd9a93b719bb851250a4e6c119c9cff" + integrity sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw== + dependencies: + esbuild "^0.25.0" + fdir "^6.4.4" + picomatch "^4.0.2" + postcss "^8.5.3" + rollup "^4.34.9" + tinyglobby "^0.2.13" + optionalDependencies: + fsevents "~2.3.3" + +watchpack@2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" + integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +web-ext-run@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/web-ext-run/-/web-ext-run-0.2.3.tgz#a1d997c94a499a49f41a65050fa41c02700930bd" + integrity sha512-u/IiZaZ7dHFqTM1MLF27rBy8mS9fEEsqoOKL0u+kQdOLmEioA/0Szp67ADd3WAJZLd8/hO8cFST1IC/YMXKIjQ== + dependencies: + "@babel/runtime" "7.27.0" + "@devicefarmer/adbkit" "3.3.8" + chrome-launcher "1.1.2" + debounce "1.2.1" + es6-error "4.1.1" + firefox-profile "4.7.0" + fx-runner "1.4.0" + multimatch "6.0.0" + node-notifier "10.0.1" + parse-json "7.1.1" + pino "9.6.0" + promise-toolbox "0.21.0" + set-value "4.1.0" + source-map-support "0.5.21" + strip-bom "5.0.0" + strip-json-comments "5.0.1" + tmp "0.2.3" + update-notifier "7.3.1" + watchpack "2.4.2" + ws "8.18.1" + zip-dir "2.0.0" + +webextension-polyfill@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.10.0.tgz#ccb28101c910ba8cf955f7e6a263e662d744dbb8" + integrity sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g== + +webextension-polyfill@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.12.0.tgz#f62c57d2cd42524e9fbdcee494c034cae34a3d69" + integrity sha512-97TBmpoWJEE+3nFBQ4VocyCdLKfw54rFaJ6EVQYLBCXqCIpLSZkwGgASpv4oPt9gdKCJ80RJlcmNzNn008Ag6Q== + +webpack-virtual-modules@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz#057faa9065c8acf48f24cb57ac0e77739ab9a7e8" + integrity sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ== + +when-exit@^2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/when-exit/-/when-exit-2.1.4.tgz#e2a0e998f7ad67eb0d2ce37e9794386663cc96f7" + integrity sha512-4rnvd3A1t16PWzrBUcSDZqcAmsUIy4minDXT/CZ8F2mVDgd65i4Aalimgz1aQkRGU0iH5eT5+6Rx2TK8o443Pg== + +when@3.7.7: + version "3.7.7" + resolved "https://registry.yarnpkg.com/when/-/when-3.7.7.tgz#aba03fc3bb736d6c88b091d013d8a8e590d84718" + integrity sha512-9lFZp/KHoqH6bPKjbWqa+3Dg/K/r2v0X/3/G2x4DBGchVS2QX2VXL3cZV994WQVnTM1/PD71Az25nAzryEUugw== + +which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== + dependencies: + is-bigint "^1.1.0" + is-boolean-object "^1.2.1" + is-number-object "^1.1.1" + is-string "^1.1.1" + is-symbol "^1.1.1" + +which-builtin-type@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== + dependencies: + call-bound "^1.0.2" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.1.0" + is-finalizationregistry "^1.1.0" + is-generator-function "^1.0.10" + is-regex "^1.2.1" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.1.0" + which-collection "^1.0.2" + which-typed-array "^1.1.16" + +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.16, which-typed-array@^1.1.18: + version "1.1.19" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" + integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + +which@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.4.tgz#1557f96080604e5b11b3599eb9f45b50a9efd722" + integrity sha512-zDRAqDSBudazdfM9zpiI30Fu9ve47htYXcGi3ln0wfKu2a7SmrT6F3VDoYONu//48V8Vz4TdCRNPjtvyRO3yBA== + dependencies: + is-absolute "^0.1.7" + isexe "^1.1.1" + +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +widest-line@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-5.0.0.tgz#b74826a1e480783345f0cd9061b49753c9da70d0" + integrity sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA== + dependencies: + string-width "^7.0.0" + +winreg@0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/winreg/-/winreg-0.0.12.tgz#07105554ba1a9d08979251d129475bffae3006b7" + integrity sha512-typ/+JRmi7RqP1NanzFULK36vczznSNN8kWVA9vIqXyv8GhghUlwhGp1Xj3Nms1FsPcNnsQrJOR10N58/nQ9hQ== + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" + integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== + dependencies: + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@8.18.1: + version "8.18.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.1.tgz#ea131d3784e1dfdff91adb0a4a116b127515e3cb" + integrity sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w== + +wxt@~0.19.29: + version "0.19.29" + resolved "https://registry.yarnpkg.com/wxt/-/wxt-0.19.29.tgz#82d1260725b7feb2d93a53f3ab80c9f03431b126" + integrity sha512-n6DRR34OAFczJfZOwJeY5dn+j+w2BTquW2nAX32vk3FMLWUhzpv5svMvSUTyNiFq3P0o3U7YxfxHdmKJnXZHBA== + dependencies: + "@1natsu/wait-element" "^4.1.2" + "@aklinker1/rollup-plugin-visualizer" "5.12.0" + "@types/chrome" "^0.0.280" + "@types/webextension-polyfill" "^0.12.1" + "@webext-core/fake-browser" "^1.3.1" + "@webext-core/isolated-element" "^1.1.2" + "@webext-core/match-patterns" "^1.0.3" + "@wxt-dev/storage" "^1.0.0" + async-mutex "^0.5.0" + c12 "^3.0.2" + cac "^6.7.14" + chokidar "^4.0.3" + ci-info "^4.1.0" + consola "^3.2.3" + defu "^6.1.4" + dotenv "^16.4.5" + dotenv-expand "^12.0.1" + esbuild "^0.25.0" + fast-glob "^3.3.2" + filesize "^10.1.6" + fs-extra "^11.2.0" + get-port-please "^3.1.2" + giget "^1.2.3" + hookable "^5.5.3" + import-meta-resolve "^4.1.0" + is-wsl "^3.1.0" + jiti "^2.4.2" + json5 "^2.2.3" + jszip "^3.10.1" + linkedom "^0.18.5" + magicast "^0.3.5" + minimatch "^10.0.1" + nano-spawn "^0.2.0" + normalize-path "^3.0.0" + nypm "^0.3.12" + ohash "^1.1.4" + open "^10.1.0" + ora "^8.1.1" + perfect-debounce "^1.0.0" + picocolors "^1.1.1" + prompts "^2.4.2" + publish-browser-extension "^2.3.0 || ^3.0.0" + scule "^1.3.0" + unimport "^3.13.1" + vite "^5.0.0 || ^6.0.0" + vite-node "^2.1.4 || ^3.0.0" + web-ext-run "^0.2.1" + webextension-polyfill "^0.12.0" + +xdg-basedir@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" + integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== + +xml2js@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.2.tgz#dd0b630083aa09c161e25a4d0901e2b2a929b499" + integrity sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^16.0.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.5.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zip-dir@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/zip-dir/-/zip-dir-2.0.0.tgz#c5df6e15c8f9efeb4e320377028c9f5c8277c932" + integrity sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg== + dependencies: + async "^3.2.0" + jszip "^3.2.2" + +zod-to-json-schema@^3.24.1: + version "3.24.5" + resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz#d1095440b147fb7c2093812a53c54df8d5df50a3" + integrity sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g== + +zod@^3.22.4, zod@^3.23.8, zod@^3.24.2: + version "3.24.3" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.24.3.tgz#1f40f750a05e477396da64438e0e1c0995dafd87" + integrity sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==