From 8e9e7650a3f30ee9634bd1e9311ee26fa2dd4e99 Mon Sep 17 00:00:00 2001 From: Sergei Garin Date: Thu, 21 Nov 2024 13:52:20 +0300 Subject: [PATCH 1/2] Add storybook support (#11522) --- .github/workflows/gui-checks.yml | 196 +++ .github/workflows/gui-pull-request.yml | 83 + .github/workflows/gui-tests.yml | 43 - .github/workflows/storybook.yml | 104 ++ .gitignore | 2 + app/common/package.json | 2 +- app/common/src/appConfig.js | 17 +- app/gui/.gitignore | 4 + app/gui/.storybook/env.d.ts | 9 + app/gui/.storybook/main.ts | 63 + app/gui/.storybook/preview.tsx | 69 + app/gui/chromatic.config.json | 8 + app/gui/package.json | 28 +- app/gui/playwright.config.ts | 10 +- app/gui/scripts/ci/dedent.js | 64 + app/gui/scripts/ci/set-message.js | 35 + .../AriaComponents/Button/Button.stories.tsx | 103 ++ .../AriaComponents/Button/Button.tsx | 25 +- app/gui/src/dashboard/components/Result.tsx | 18 +- app/gui/src/dashboard/components/Spinner.tsx | 1 + app/gui/src/dashboard/styles.css | 32 + app/gui/src/dashboard/tailwind.css | 33 - app/gui/src/entrypoint.ts | 1 + app/gui/tsconfig.app.json | 1 + app/gui/tsconfig.storybook.json | 10 + app/gui/vite.config.ts | 3 + app/ide-desktop/client/package.json | 2 +- app/ide-desktop/icons/package.json | 2 +- app/ydoc-server-nodejs/package.json | 2 +- app/ydoc-server-polyglot/package.json | 2 +- app/ydoc-server/package.json | 2 +- app/ydoc-shared/package.json | 2 +- build/build/src/ci_gen.rs | 1 - build/build/src/ci_gen/job.rs | 10 - eslint.config.mjs | 11 + package.json | 9 +- pnpm-lock.yaml | 1462 ++++++++++++++++- 37 files changed, 2302 insertions(+), 167 deletions(-) create mode 100644 .github/workflows/gui-checks.yml create mode 100644 .github/workflows/gui-pull-request.yml create mode 100644 .github/workflows/storybook.yml create mode 100644 app/gui/.storybook/env.d.ts create mode 100644 app/gui/.storybook/main.ts create mode 100644 app/gui/.storybook/preview.tsx create mode 100644 app/gui/chromatic.config.json create mode 100644 app/gui/scripts/ci/dedent.js create mode 100644 app/gui/scripts/ci/set-message.js create mode 100644 app/gui/src/dashboard/components/AriaComponents/Button/Button.stories.tsx create mode 100644 app/gui/src/dashboard/styles.css create mode 100644 app/gui/tsconfig.storybook.json diff --git a/.github/workflows/gui-checks.yml b/.github/workflows/gui-checks.yml new file mode 100644 index 0000000000..0ad4c34a39 --- /dev/null +++ b/.github/workflows/gui-checks.yml @@ -0,0 +1,196 @@ +name: GUI Checks +on: workflow_call + +# Cancel in-progress workflows if a new one is started +concurrency: + group: ${{ github.workflow }}-${{ github.ref }}-gui-checks + cancel-in-progress: true + +permissions: + contents: read # Read-only access to repository contents + issues: write # Write access to issues + pull-requests: write # Write access to pull requests + statuses: write # Write access to commit statuses + checks: write + +jobs: + lint: + name: ๐Ÿ‘ฎ Lint GUI + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref }} + + - name: ๐Ÿ“ฆ Setup pnpm + uses: pnpm/action-setup@v4 + + - uses: actions/setup-node@v4 + name: โŽ” Setup Node + with: + node-version-file: .node-version + cache: "pnpm" + + - uses: actions/cache/restore@v4 + name: Download cache + id: cache + with: + path: | + **/.eslintcache + node_modules/.cache/prettier + key: ${{ runner.os }}-gui-${{ github.run_id }} + restore-keys: | + ${{ runner.os }}-gui + + - if: startsWith(runner.name, 'GitHub Actions') || startsWith(runner.name, 'Hosted Agent') + name: Installing wasm-pack + uses: jetli/wasm-pack-action@v0.4.0 + with: + version: v0.12.1 + + - name: ๐Ÿ“ฆ Install dependencies + run: pnpm install --frozen-lockfile + + - name: ๐Ÿ“ Prettier + id: prettier + continue-on-error: true + run: pnpm run ci:prettier + + # Next Tasks are depend on Typecheck, because we build libraries at this stage + - name: ๐Ÿง  Typecheck + id: typecheck + continue-on-error: true + run: pnpm run ci:typecheck + + - name: ๐Ÿงน Lint + id: lint + continue-on-error: true + run: pnpm run ci:lint + + - name: ๐Ÿงช Unit Tests + id: unit-tests + continue-on-error: true + run: pnpm run ci:test + + - name: ๐Ÿ’พ Save cache + uses: actions/cache/save@v4 + if: always() && steps.cache.outputs.cache-hit != 'true' + id: save-cache + with: + key: ${{ steps.cache.outputs.cache-primary-key }} + path: | + **/.eslintcache + node_modules/.cache/prettier + + - name: ๐Ÿ“ Annotate Code Linting Results + uses: ataylorme/eslint-annotate-action@v3 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + report-json: "./**/eslint_report.json" + markdown-report-on-step-summary: true + check-name: ๐Ÿงน GUI Lint Results + + - name: โŒ Fail if any check failed + if: always() && (steps.prettier.outcome == 'failure' || steps.lint.outcome == 'failure' || steps.typecheck.outcome == 'failure' || steps.unit-tests.outcome == 'failure') + run: | + echo "Prettier outcome: ${{ steps.prettier.outcome }}" + echo "Lint outcome: ${{ steps.lint.outcome }}" + echo "Typecheck outcome: ${{ steps.typecheck.outcome }}" + echo "Unit tests outcome: ${{ steps.unit-tests.outcome }}" + exit 1 + + playwright: + name: ๐ŸŽญ Playwright Tests + env: + NODE_OPTIONS: --disable-warning=ExperimentalWarning + runs-on: + - self-hosted + - Linux + timeout-minutes: 60 + strategy: + fail-fast: false + max-parallel: 24 + matrix: + shardIndex: [1, 2, 3, 4, 5, 6] + shardTotal: [6] + + steps: + - uses: actions/checkout@v4 + + - name: ๐Ÿ“ฆ Setup pnpm + uses: pnpm/action-setup@v4 + + - uses: actions/setup-node@v4 + name: โŽ” Setup Node + with: + node-version-file: .node-version + cache: "pnpm" + + - if: startsWith(runner.name, 'GitHub Actions') || startsWith(runner.name, 'Hosted Agent') + name: Installing wasm-pack + uses: jetli/wasm-pack-action@v0.4.0 + with: + version: v0.12.1 + + - name: ๐Ÿ“ฆ Install dependencies + run: pnpm install --frozen-lockfile + + - name: ๐Ÿ“บ Install Playwright Browsers + working-directory: app/gui + run: pnpm run playwright:install + + - name: ๐ŸŽญ Playwright Tests + working-directory: app/gui + run: pnpm run e2e --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} + + - name: โฌ†๏ธ Upload blob report to GitHub Actions Artifacts + if: ${{ !cancelled() }} + uses: actions/upload-artifact@v4 + with: + name: blob-report-${{ matrix.shardIndex }} + path: app/gui/blob-report + retention-days: 7 + + merge-reports: + name: ๐Ÿ”— Merge Playwright Reports + if: ${{ !cancelled() }} + needs: [playwright] + + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: ๐Ÿ“ฆ Setup pnpm + uses: pnpm/action-setup@v4 + + - uses: actions/setup-node@v4 + with: + node-version-file: .node-version + cache: "pnpm" + + - if: startsWith(runner.name, 'GitHub Actions') || startsWith(runner.name, 'Hosted Agent') + name: Installing wasm-pack + uses: jetli/wasm-pack-action@v0.4.0 + with: + version: v0.12.1 + + - name: ๐Ÿ“ฆ Install dependencies + run: pnpm install --frozen-lockfile --ignore-scripts + + - name: ๐Ÿ“ฅ Download blob reports from GitHub Actions Artifacts + uses: actions/download-artifact@v4 + with: + path: app/gui/blob-report/ + pattern: blob-report-* + merge-multiple: true + + - name: ๐Ÿ”— Merge into HTML Report + working-directory: app/gui + run: pnpm playwright merge-reports --reporter html ./blob-report + + - name: โฌ†๏ธ Upload HTML report + uses: actions/upload-artifact@v4 + with: + name: playwright-report--attempt-${{ github.run_attempt }} + path: app/gui/playwright-report/ + retention-days: 14 diff --git a/.github/workflows/gui-pull-request.yml b/.github/workflows/gui-pull-request.yml new file mode 100644 index 0000000000..a5c56261cc --- /dev/null +++ b/.github/workflows/gui-pull-request.yml @@ -0,0 +1,83 @@ +# This file is not auto-generated. Feel free to edit it. + +name: โœจ GUI Pull Request + +on: + push: + branches: + - develop + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read # Read-only access to repository contents + issues: write # Write access to issues + pull-requests: write # Write access to pull requests + statuses: write # Write access to commit statuses + checks: write + +jobs: + changed-files: + runs-on: ubuntu-latest + name: ๐Ÿ” Detect changed files in GUI + outputs: + all_changed_files: ${{ steps.changed-files.outputs.all_changed_files }} + any_changed: ${{ steps.changed-files.outputs.any_changed }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 2 + - name: Get changed files + id: changed-files + uses: tj-actions/changed-files@v44 + with: + files: | + app/** + package.json + pnpm-lock.yaml + pnpm-workspace.yaml + eslint.config.js + .prettierrc.js + .prettierignore + vitest.workspace.ts + files_ignore: | + app/ide-desktop/** + app/gui/scripts/** + app/gui/.gitignore + .git-* + + - name: List all changed files + env: + ALL_CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }} + run: | + for file in ${ALL_CHANGED_FILES}; do + echo "$file was changed" + done + + checks: + name: ๐Ÿงฐ Checks + uses: ./.github/workflows/gui-checks.yml + needs: [changed-files] + if: ${{ needs.changed-files.outputs.any_changed == 'true' }} + secrets: inherit + + storybook: + name: ๐Ÿ“š Deploy Storybook + uses: ./.github/workflows/storybook.yml + needs: [changed-files] + if: ${{ needs.changed-files.outputs.any_changed == 'true' }} + secrets: inherit + + # This job is used to report success if the needed jobs were successful. + # This is a workaround to make optional jobs required if they run + report-success: + name: โœ… Success or skipped due to no changes + runs-on: ubuntu-latest + needs: [checks, storybook] + if: needs.checks.result == 'skipped' && needs.storybook.result == 'skipped' || needs.checks.result == 'success' && needs.storybook.result == 'success' + steps: + - name: Report success + run: echo "Success!" diff --git a/.github/workflows/gui-tests.yml b/.github/workflows/gui-tests.yml index 8e6ce1d617..4abe8f1d23 100644 --- a/.github/workflows/gui-tests.yml +++ b/.github/workflows/gui-tests.yml @@ -27,49 +27,6 @@ jobs: access_token: ${{ github.token }} permissions: actions: write - enso-build-ci-gen-job-gui-check-linux-amd64: - name: GUI tests (linux, amd64) - runs-on: - - self-hosted - - Linux - steps: - - if: startsWith(runner.name, 'GitHub Actions') || startsWith(runner.name, 'Hosted Agent') - name: Installing wasm-pack - uses: jetli/wasm-pack-action@v0.4.0 - with: - version: v0.12.1 - - name: Expose Artifact API and context information. - uses: actions/github-script@v7 - with: - script: "\n core.exportVariable(\"ACTIONS_RUNTIME_TOKEN\", process.env[\"ACTIONS_RUNTIME_TOKEN\"])\n core.exportVariable(\"ACTIONS_RUNTIME_URL\", process.env[\"ACTIONS_RUNTIME_URL\"])\n core.exportVariable(\"GITHUB_RETENTION_DAYS\", process.env[\"GITHUB_RETENTION_DAYS\"])\n console.log(context)\n " - - name: Checking out the repository - uses: actions/checkout@v4 - with: - clean: false - submodules: recursive - - name: Build Script Setup - run: ./run --help || (git clean -ffdx && ./run --help) - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - if: "(contains(github.event.pull_request.labels.*.name, 'CI: Clean build required') || inputs.clean_build_required)" - name: Clean before - run: ./run git-clean - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - run: ./run gui check - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - if: failure() && runner.os == 'Windows' - name: List files if failed (Windows) - run: Get-ChildItem -Force -Recurse - - if: failure() && runner.os != 'Windows' - name: List files if failed (non-Windows) - run: ls -lAR - - if: "(always()) && (contains(github.event.pull_request.labels.*.name, 'CI: Clean build required') || inputs.clean_build_required)" - name: Clean after - run: ./run git-clean - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} enso-build-ci-gen-job-lint-linux-amd64: name: Lint (linux, amd64) runs-on: diff --git a/.github/workflows/storybook.yml b/.github/workflows/storybook.yml new file mode 100644 index 0000000000..0180f36a41 --- /dev/null +++ b/.github/workflows/storybook.yml @@ -0,0 +1,104 @@ +# This file is not auto-generated. Feel free to edit it. + +name: Storybook Chromatic Deployment + +on: workflow_call + +# Cancel in-progress workflows if a new one is started +concurrency: + group: ${{ github.workflow }}-${{ github.ref }}-chromatic + cancel-in-progress: true + +permissions: + contents: read # Read-only access to repository contents + issues: write # Write access to issues + pull-requests: write # Write access to pull requests + statuses: write # Write access to commit statuses + +env: + ENSO_BUILD_SKIP_VERSION_CHECK: "true" + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1 + +jobs: + deploy-chromatic-react: + name: ๐Ÿš€ Deploy React to Chromatic + runs-on: ubuntu-latest + outputs: + dashboardUrl: ${{ steps.publish_chromatic.outputs.url }} + dashboardStorybookUrl: ${{ steps.publish_chromatic.outputs.storybookUrl }} + env: + CHROMATIC_RETRIES: 3 + CHROMATIC_PROJECT_TOKEN: ${{ secrets.DASHBOARD_CHROMATIC_PROJECT_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + steps: + - uses: actions/checkout@v4 + name: Checkout + with: + fetch-depth: 0 + ref: ${{ github.event.pull_request.head.ref }} + fetch-tags: false + + - name: ๐Ÿ“ฆ Setup pnpm + uses: pnpm/action-setup@v4 + + - uses: actions/setup-node@v4 + name: โŽ” Setup Node + with: + node-version-file: .node-version + cache: "pnpm" + + - if: startsWith(runner.name, 'GitHub Actions') || startsWith(runner.name, 'Hosted Agent') + name: Installing wasm-pack + uses: jetli/wasm-pack-action@v0.4.0 + with: + version: v0.12.1 + + - name: ๐Ÿ“ฆ Install dependencies + run: pnpm install --frozen-lockfile + + - name: ๐Ÿ“ฅ Download storybook cache + uses: actions/cache@v4 + with: + key: ${{ runner.os }}-gui-${{ github.run_id }} + path: app/gui/node_modules/.cache/ + restore-keys: | + ${{ runner.os }}-gui + + - name: ๐Ÿš€ Deploy to Chromatic + id: publish_chromatic + uses: chromaui/action@v11 + with: + workingDir: app/gui + autoAcceptChanges: develop + exitZeroOnChanges: true + exitOnceUploaded: true + configFile: "chromatic.config.json" + + comment-on-pr: + name: ๐Ÿ’ฌ Comment on PR + runs-on: ubuntu-latest + needs: deploy-chromatic-react + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: .node-version + - name: ๐Ÿ’ฌ Comment on PR + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { setMessage } = await import('${{ github.workspace }}/app/gui/scripts/ci/set-message.js') + + await setMessage({ + header: "## ๐Ÿงช Storybook is successfully deployed!", + body: ` + ### ๐Ÿ“Š Dashboard: + - ๐Ÿ‘€ Review changes: ${{ needs.deploy-chromatic-react.outputs.dashboardUrl }} + - ๐Ÿ‘จโ€๐ŸŽจ Preview storybook: ${{ needs.deploy-chromatic-react.outputs.dashboardStorybookUrl }} + `, + github, + repo: context.repo, + prNumber: context.payload.pull_request.number + }) diff --git a/.gitignore b/.gitignore index 2533b869dc..ae09f5121e 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,8 @@ generated/ ############ node_modules/ +eslint_report.json +.eslintcache ############ ## System ## diff --git a/app/common/package.json b/app/common/package.json index 2d34ca4e4e..b1177422ff 100644 --- a/app/common/package.json +++ b/app/common/package.json @@ -29,7 +29,7 @@ }, "scripts": { "test": "vitest run", - "lint": "eslint . --max-warnings=0" + "lint": "eslint . --cache --max-warnings=0" }, "peerDependencies": { "@tanstack/query-core": "5.54.1", diff --git a/app/common/src/appConfig.js b/app/common/src/appConfig.js index 6c662ff59d..2742c11df7 100644 --- a/app/common/src/appConfig.js +++ b/app/common/src/appConfig.js @@ -46,24 +46,9 @@ export async function readEnvironmentFromFile() { } process.env.ENSO_CLOUD_DASHBOARD_VERSION ??= buildInfo.version ?? '0.0.0-dev' process.env.ENSO_CLOUD_DASHBOARD_COMMIT_HASH ??= buildInfo.commit - } catch (error) { + } catch { process.env.ENSO_CLOUD_DASHBOARD_VERSION ??= buildInfo.version process.env.ENSO_CLOUD_DASHBOARD_COMMIT_HASH ??= buildInfo.commit - const expectedKeys = Object.keys(DUMMY_DEFINES) - .map(key => key.replace(/^process[.]env[.]/, '')) - .filter(key => key !== 'NODE_ENV') - /** @type {string[]} */ - const missingKeys = [] - for (const key of expectedKeys) { - if (!(key in process.env)) { - missingKeys.push(key) - } - } - if (missingKeys.length !== 0) { - console.warn('Could not load `.env` file; disabling cloud backend.') - console.warn(`Missing keys: ${missingKeys.map(key => `'${key}'`).join(', ')}`) - console.error(error) - } } } diff --git a/app/gui/.gitignore b/app/gui/.gitignore index b4545e224d..869cec1713 100644 --- a/app/gui/.gitignore +++ b/app/gui/.gitignore @@ -25,7 +25,11 @@ mockDist test-results/ playwright-report/ +blob-report/ playwright/ src/project-view/util/iconList.json src/project-view/util/iconName.ts + +*storybook.log +storybook-static diff --git a/app/gui/.storybook/env.d.ts b/app/gui/.storybook/env.d.ts new file mode 100644 index 0000000000..1050ef8385 --- /dev/null +++ b/app/gui/.storybook/env.d.ts @@ -0,0 +1,9 @@ +declare global { + interface Window { + ENV: { + FRAMEWORK: 'vue' | 'react' + } + } +} + +export {} diff --git a/app/gui/.storybook/main.ts b/app/gui/.storybook/main.ts new file mode 100644 index 0000000000..8930ce35b7 --- /dev/null +++ b/app/gui/.storybook/main.ts @@ -0,0 +1,63 @@ +/** + * @file + * + * Main file for Storybook configuration. + */ +import type { StorybookConfig as ReactStorybookConfig } from '@storybook/react-vite' +import type { StorybookConfig as VueStorybookConfig } from '@storybook/vue3-vite' +import z from 'zod' + +const framework = z.enum(['vue', 'react']).parse(process.env.FRAMEWORK) + +const sharedConfig: Partial = { + addons: [ + '@storybook/addon-onboarding', + '@storybook/addon-essentials', + '@chromatic-com/storybook', + '@storybook/addon-interactions', + ], + features: {}, + core: { disableTelemetry: true }, + env: { FRAMEWORK: framework }, + + previewHead: (head) => { + return ` + + ${head} + ` + }, +} + +const vueConfig: VueStorybookConfig = { + ...sharedConfig, + stories: [ + '../src/project-view/**/*.mdx', + '../src/project-view/**/*.stories.@(js|jsx|mjs|ts|tsx)', + ], + framework: { + name: '@storybook/vue3-vite', + options: {}, + }, + refs: { + Dashboard: { + title: 'Dashboard', + url: 'http://localhost:6007', + }, + }, +} + +const reactConfig: ReactStorybookConfig = { + ...sharedConfig, + stories: ['../src/dashboard/**/*.mdx', '../src/dashboard/**/*.stories.tsx'], + framework: { + name: '@storybook/react-vite', + options: { strictMode: true }, + }, +} + +export default framework === 'vue' ? vueConfig : reactConfig diff --git a/app/gui/.storybook/preview.tsx b/app/gui/.storybook/preview.tsx new file mode 100644 index 0000000000..5348dfe093 --- /dev/null +++ b/app/gui/.storybook/preview.tsx @@ -0,0 +1,69 @@ +/** + * @file Storybook preview + */ +import type { Preview as ReactPreview } from '@storybook/react' +import type { Preview as VuePreview } from '@storybook/vue3' +import React, { useLayoutEffect, useState } from 'react' +import invariant from 'tiny-invariant' +import UIProviders from '../src/dashboard/components/UIProviders' + +import z from 'zod' +import '../src/dashboard/tailwind.css' + +const framework = z.enum(['vue', 'react']).parse(window.ENV.FRAMEWORK) + +const vuePreview: VuePreview = { + parameters: { + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/i, + }, + }, + }, +} + +const reactPreview: ReactPreview = { + parameters: { + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/i, + }, + }, + }, + + // Decorators for all stories + // Decorators are applied in the reverse order they are defined + decorators: [ + (Story, context) => { + const [portalRoot, setPortalRoot] = useState(null) + + useLayoutEffect(() => { + const portalRoot = document.querySelector('#enso-portal-root') + invariant(portalRoot, 'PortalRoot element not found') + + setPortalRoot(portalRoot) + }, []) + + if (!portalRoot) return <> + + return ( + + {Story(context)} + + ) + }, + + (Story, context) => ( + <> +
{Story(context)}
+
+ + ), + ], +} + +const preview = framework === 'vue' ? vuePreview : reactPreview + +export default preview diff --git a/app/gui/chromatic.config.json b/app/gui/chromatic.config.json new file mode 100644 index 0000000000..a6cbd96872 --- /dev/null +++ b/app/gui/chromatic.config.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://www.chromatic.com/config-file.schema.json", + "projectId": "Enso Dashboard", + "autoAcceptChanges": "main", + "exitOnceUploaded": true, + "skip": "dependabot/**", + "buildScriptName": "build-storybook:react" +} diff --git a/app/gui/package.json b/app/gui/package.json index 1ad62333a3..aa0e421a04 100644 --- a/app/gui/package.json +++ b/app/gui/package.json @@ -22,18 +22,22 @@ "build-cloud": "cross-env CLOUD_BUILD=true corepack pnpm run build", "preview": "vite preview", "//": "max-warnings set to 41 to match the amount of warnings introduced by the new react compiler. Eventual goal is to remove all the warnings.", - "lint": "eslint . --max-warnings=39", + "lint": "eslint . --cache --max-warnings=39", "format": "prettier --version && prettier --write src/ && eslint . --fix", "dev:vite": "vite", "test": "corepack pnpm run /^^^^test:.*/", "test:unit": "vitest run", "test-dev:unit": "vitest", - "test:e2e": "cross-env NODE_ENV=production playwright test", "test-dev:e2e": "cross-env NODE_ENV=production playwright test --ui", "test-dev-dashboard:e2e": "cross-env NODE_ENV=production playwright test ./e2e/dashboard/ --ui", "preinstall": "corepack pnpm run generate-metadata", - "postinstall": "playwright install", - "generate-metadata": "node scripts/generateIconMetadata.js" + "generate-metadata": "node scripts/generateIconMetadata.js", + "build-storybook:react": "cross-env FRAMEWORK=react storybook build", + "build-storybook:vue": "cross-env FRAMEWORK=vue storybook build", + "chromatic:react": "cross-env FRAMEWORK=react chromatic deploy", + "chromatic:vue": "cross-env FRAMEWORK=vue chromatic deploy", + "e2e": "cross-env NODE_ENV=production playwright test", + "playwright:install": "playwright install chromium" }, "dependencies": { "@aws-amplify/auth": "5.6.5", @@ -59,7 +63,7 @@ "react": "^18.3.1", "react-aria": "^3.34.3", "react-aria-components": "^1.3.3", - "react-compiler-runtime": "19.0.0-beta-6fc168f-20241025", + "react-compiler-runtime": "19.0.0-beta-a7bf2bd-20241110", "react-dom": "^18.3.1", "react-error-boundary": "4.0.13", "react-hook-form": "^7.51.4", @@ -80,7 +84,7 @@ "@ag-grid-enterprise/core": "^31.1.1", "@ag-grid-enterprise/range-selection": "^31.1.1", "@babel/parser": "^7.24.7", - "babel-plugin-react-compiler": "19.0.0-beta-6fc168f-20241025", + "babel-plugin-react-compiler": "19.0.0-beta-a7bf2bd-20241110", "@codemirror/commands": "^6.6.0", "@codemirror/language": "^6.10.2", "@codemirror/lang-markdown": "^v6.3.0", @@ -125,10 +129,20 @@ "marked": "14.1.3" }, "devDependencies": { + "@chromatic-com/storybook": "^3.2.2", "@fast-check/vitest": "^0.0.8", "@modyfi/vite-plugin-yaml": "^1.0.4", "@playwright/test": "^1.40.0", "@react-types/shared": "^3.22.1", + "@storybook/addon-essentials": "^8.4.2", + "@storybook/addon-interactions": "^8.4.2", + "@storybook/addon-onboarding": "^8.4.2", + "@storybook/blocks": "^8.4.2", + "@storybook/react": "^8.4.2", + "@storybook/react-vite": "^8.4.2", + "@storybook/test": "^8.4.2", + "@storybook/vue3": "^8.4.2", + "@storybook/vue3-vite": "^8.4.2", "@tanstack/react-query-devtools": "5.45.1", "@types/node": "^22.9.0", "@types/react": "^18.0.27", @@ -181,6 +195,8 @@ "react-dom": "^18.3.1", "shuffle-seed": "^1.1.6", "sql-formatter": "^13.0.0", + "storybook": "^8.4.2", + "chromatic": "11.18.1", "tar": "^6.2.1", "tsx": "^4.7.1", "vite-plugin-vue-devtools": "7.6.3", diff --git a/app/gui/playwright.config.ts b/app/gui/playwright.config.ts index b6046bb0b9..96806b97b5 100644 --- a/app/gui/playwright.config.ts +++ b/app/gui/playwright.config.ts @@ -19,7 +19,8 @@ const TIMEOUT_MS = : 15_000 // We tend to use less CPU on CI to reduce the number of failures due to timeouts. -const WORKERS = isCI ? '25%' : '35%' +// Instead of using workers on CI, we use shards to run tests in parallel. +const WORKERS = isCI ? 2 : '35%' async function findFreePortInRange(min: number, max: number) { for (let i = 0; i < 50; i++) { @@ -62,12 +63,13 @@ process.env.PLAYWRIGHT_PORT_PV = `${ports.projectView}` export default defineConfig({ fullyParallel: true, ...(WORKERS ? { workers: WORKERS } : {}), - forbidOnly: !!process.env.CI, - repeatEach: process.env.CI ? 3 : 1, - reporter: 'html', + forbidOnly: isCI, + reporter: isCI ? ([['list'], ['blob']] as const) : ([['list']] as const), + retries: isCI ? 3 : 0, use: { headless: !DEBUG, actionTimeout: 5000, + trace: 'retain-on-failure', ...(DEBUG ? {} diff --git a/app/gui/scripts/ci/dedent.js b/app/gui/scripts/ci/dedent.js new file mode 100644 index 0000000000..3f25d236ed --- /dev/null +++ b/app/gui/scripts/ci/dedent.js @@ -0,0 +1,64 @@ +/** + * @param {string | TemplateStringsArray} strings + * @param {...unknown[]} values + * @returns {string} + */ +export function dedent(strings, ...values) { + const raw = typeof strings === 'string' ? [strings] : strings.raw + const escapeSpecialCharacters = Array.isArray(strings) + + // first, perform interpolation + let result = '' + for (let i = 0; i < raw.length; i++) { + let next = raw[i] + + if (next === undefined) { + continue + } + + if (escapeSpecialCharacters) { + // handle escaped newlines, backticks, and interpolation characters + next = next + .replace(/\\\n[ \t]*/g, '') + .replace(/\\`/g, '`') + .replace(/\\\$/g, '$') + .replace(/\\\{/g, '{') + } + + result += next + + if (i < values.length) { + result += values[i] + } + } + + // now strip indentation + const lines = result.split('\n') + let mindent = null + for (const l of lines) { + const m = l.match(/^(\s+)\S+/) + if (m && m[1]) { + const indent = m[1].length + if (!mindent) { + // this is the first indented line + mindent = indent + } else { + mindent = Math.min(mindent, indent) + } + } + } + + if (mindent !== null) { + const m = mindent + result = lines.map((l) => (l[0] === ' ' || l[0] === '\t' ? l.slice(m) : l)).join('\n') + } + + // dedent eats leading and trailing whitespace too + result = result.trim() + if (escapeSpecialCharacters) { + // handle escaped newlines at the end to ensure they don't get stripped too + result = result.replace(/\\n/g, '\n') + } + + return result +} diff --git a/app/gui/scripts/ci/set-message.js b/app/gui/scripts/ci/set-message.js new file mode 100644 index 0000000000..15ecdb1397 --- /dev/null +++ b/app/gui/scripts/ci/set-message.js @@ -0,0 +1,35 @@ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-nocheck +import { dedent } from './dedent.js' + +export async function setMessage({ header, body, prNumber, repo, github }) { + const commentList = await github.paginate( + 'GET /repos/:owner/:repo/issues/:issue_number/comments', + // eslint-disable-next-line camelcase + { ...repo, issue_number: prNumber }, + ) + + const commentBody = dedent` + ${header} + + ${body} + ` + + const comment = commentList.find((comment) => comment.body.startsWith(header)) + + if (!comment) { + await github.rest.issues.createComment({ + ...repo, + // eslint-disable-next-line camelcase + issue_number: prNumber, + body: commentBody, + }) + } else { + await github.rest.issues.updateComment({ + ...repo, + // eslint-disable-next-line camelcase + comment_id: comment.id, + body: commentBody, + }) + } +} diff --git a/app/gui/src/dashboard/components/AriaComponents/Button/Button.stories.tsx b/app/gui/src/dashboard/components/AriaComponents/Button/Button.stories.tsx new file mode 100644 index 0000000000..f4238680ac --- /dev/null +++ b/app/gui/src/dashboard/components/AriaComponents/Button/Button.stories.tsx @@ -0,0 +1,103 @@ +import Enso from '#/assets/enso_logo.svg' +import type * as aria from '#/components/aria' +import { Text } from '#/components/AriaComponents' +import type { Meta, StoryObj } from '@storybook/react' +import { expect, userEvent, within } from '@storybook/test' +import type { BaseButtonProps } from './Button' +import { Button } from './Button' + +type Story = StoryObj> + +export default { + title: 'Components/AriaComponents/Button', + component: Button, + render: (props) => + + + + + + + + +
+ + Sizes +
+ + + + + + +
+ + Icons +
+ + +
+ + States +
+ + + + +
+ + ), +} + +export const Tooltips: Story = { + render: () => ( +
+ Tooltip +
+ +
+
+ ), +} + +export const LoadingOnPress: Story = { + render: () => { + return ( + + ) + }, + play: async ({ canvasElement }) => { + const { getByRole, findByTestId } = within(canvasElement) + + const button = getByRole('button', { name: 'Click me to trigger loading' }) + await userEvent.click(button) + await expect(button).toHaveAttribute('disabled') + // then the spinner appears after some delay + await expect(await findByTestId('spinner')).toBeInTheDocument() + }, +} diff --git a/app/gui/src/dashboard/components/AriaComponents/Button/Button.tsx b/app/gui/src/dashboard/components/AriaComponents/Button/Button.tsx index e39c3d83a3..282f5fb238 100644 --- a/app/gui/src/dashboard/components/AriaComponents/Button/Button.tsx +++ b/app/gui/src/dashboard/components/AriaComponents/Button/Button.tsx @@ -4,14 +4,14 @@ import * as React from 'react' import * as focusHooks from '#/hooks/focusHooks' import * as aria from '#/components/aria' -import * as ariaComponents from '#/components/AriaComponents' import { StatelessSpinner } from '#/components/StatelessSpinner' import SvgMask from '#/components/SvgMask' import { forwardRef } from '#/utilities/react' import type { ExtractFunction, VariantProps } from '#/utilities/tailwindVariants' import { tv } from '#/utilities/tailwindVariants' -import { TEXT_STYLE } from '../Text' +import { TEXT_STYLE, useVisualTooltip } from '../Text' +import { Tooltip, TooltipTrigger } from '../Tooltip' // ============== // === Button === @@ -82,7 +82,7 @@ export const BUTTON_STYLES = tv({ ], variants: { isDisabled: { - true: 'disabled:opacity-50 disabled:cursor-not-allowed aria-disabled:opacity-50 aria-disabled:cursor-not-allowed', + true: 'opacity-50 cursor-not-allowed', }, isFocused: { true: 'focus:outline-none focus-visible:outline-2 focus-visible:outline-black focus-visible:outline-offset-[-2px]', @@ -256,6 +256,7 @@ export const BUTTON_STYLES = tv({ variant: 'primary', iconPosition: 'start', showIconOnHover: false, + isDisabled: false, }, compoundVariants: [ { isFocused: true, iconOnly: true, class: 'focus-visible:outline-offset-[3px]' }, @@ -393,14 +394,14 @@ export const Button = forwardRef(function Button( render: aria.ButtonRenderProps | aria.LinkRenderProps, ): React.ReactNode => { const iconComponent = (() => { - if (icon == null) { - return null - } else if (isLoading && loaderPosition === 'icon') { + if (isLoading && loaderPosition === 'icon') { return ( ) + } else if (icon == null) { + return null } else { /* @ts-expect-error any here is safe because we transparently pass it to the children, and ts infer the type outside correctly */ const actualIcon = typeof icon === 'function' ? icon(render) : icon @@ -429,7 +430,7 @@ export const Button = forwardRef(function Button( } } - const { tooltip: visualTooltip, targetProps } = ariaComponents.useVisualTooltip({ + const { tooltip: visualTooltip, targetProps } = useVisualTooltip({ targetRef: contentRef, children: tooltipElement, isDisabled: !shouldUseVisualTooltip, @@ -483,14 +484,12 @@ export const Button = forwardRef(function Button( {button} {visualTooltip} - : + : {button} - + {tooltipElement} - - + + ) }) diff --git a/app/gui/src/dashboard/components/Result.tsx b/app/gui/src/dashboard/components/Result.tsx index 59a03b43e5..61e8d34be3 100644 --- a/app/gui/src/dashboard/components/Result.tsx +++ b/app/gui/src/dashboard/components/Result.tsx @@ -4,10 +4,10 @@ import * as React from 'react' import Success from '#/assets/check_mark.svg' import Error from '#/assets/cross.svg' -import * as ariaComponents from '#/components/AriaComponents' -import * as loader from '#/components/Loader' -import SvgMask from '#/components/SvgMask' import { tv, type VariantProps } from '#/utilities/tailwindVariants' +import { Text } from './AriaComponents/Text' +import * as loader from './Loader' +import SvgMask from './SvgMask' // ================= // === Constants === @@ -15,9 +15,9 @@ import { tv, type VariantProps } from '#/utilities/tailwindVariants' const INFO_ICON = ( // eslint-disable-next-line no-restricted-syntax - + ! - + ) const STATUS_ICON_MAP: Readonly> = { @@ -142,15 +142,15 @@ export function Result(props: ResultProps) { : null} {typeof title === 'string' ? - + {title} - + : title} {typeof subtitle === 'string' ? - + {subtitle} - + : subtitle} {children != null &&
{children}
} diff --git a/app/gui/src/dashboard/components/Spinner.tsx b/app/gui/src/dashboard/components/Spinner.tsx index cee0843e3c..902ffb8bd4 100644 --- a/app/gui/src/dashboard/components/Spinner.tsx +++ b/app/gui/src/dashboard/components/Spinner.tsx @@ -40,6 +40,7 @@ export function Spinner(props: SpinnerProps) { fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" + data-testid="spinner" > * { + @apply bg-white/80; + } +} + +:where(.enso-dashboard) { + @apply absolute inset-0 flex flex-col overflow-hidden; +} + +/* Disable all animations. */ +html.disable-animations * { + transition: none !important; + animation: none !important; + animation-play-state: paused !important; +} diff --git a/app/gui/src/dashboard/tailwind.css b/app/gui/src/dashboard/tailwind.css index 16ed542129..deeb0207a2 100644 --- a/app/gui/src/dashboard/tailwind.css +++ b/app/gui/src/dashboard/tailwind.css @@ -398,43 +398,10 @@ --sidebar-section-heading-margin-b: 0.375rem; } -/* Disable all animations. */ -html.disable-animations * { - transition: none !important; - animation: none !important; - animation-play-state: paused !important; -} - -:where(body) { - overflow: hidden; - height: 100vh; - background-blend-mode: lighten; -} - -:where(body:not(.vibrancy)) { - &::before { - content: ''; - inset: 0 -16vw -16vh 0; - z-index: -1; - - background-color: #b09778ff; - - @apply pointer-events-none fixed bg-cover; - } - - & > * { - @apply bg-white/80; - } -} - .Toastify--animate { animation-duration: 200ms; } -:where(.enso-dashboard) { - @apply absolute inset-0 flex flex-col overflow-hidden; -} - /* These styles MUST still be copied * as `.enso-dashboard body` and `.enso-dashboard html` make no sense. */ :where(.enso-dashboard, .enso-chat, .enso-portal-root) { diff --git a/app/gui/src/entrypoint.ts b/app/gui/src/entrypoint.ts index d298fe2337..4ceabcd604 100644 --- a/app/gui/src/entrypoint.ts +++ b/app/gui/src/entrypoint.ts @@ -1,4 +1,5 @@ import * as dashboard from '#/index' +import '#/styles.css' import '#/tailwind.css' import { AsyncApp } from '@/asyncApp' import { baseConfig, configValue, mergeConfig } from '@/util/config' diff --git a/app/gui/tsconfig.app.json b/app/gui/tsconfig.app.json index d0616d938c..f32953b143 100644 --- a/app/gui/tsconfig.app.json +++ b/app/gui/tsconfig.app.json @@ -1,6 +1,7 @@ { "extends": "./tsconfig.json", "include": [ + ".storybook/**/*", "env.d.ts", "lib0-ext.d.ts", "src/**/*.vue", diff --git a/app/gui/tsconfig.storybook.json b/app/gui/tsconfig.storybook.json new file mode 100644 index 0000000000..8940c14dfa --- /dev/null +++ b/app/gui/tsconfig.storybook.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.app.json", + "include": [ + ".storybook/**/*", + ".storybook/env.d.ts", + "./src/**/*.stories.tsx", + "./src/**/*.stories.vue", + "./src/**/*.stories.ts" + ] +} diff --git a/app/gui/vite.config.ts b/app/gui/vite.config.ts index 380da5413f..92b07962b9 100644 --- a/app/gui/vite.config.ts +++ b/app/gui/vite.config.ts @@ -30,12 +30,15 @@ const entrypoint = // and because Vite's HTML env replacements only work with import.meta.env variables, not defines. process.env.ENSO_IDE_VERSION = process.env.ENSO_CLOUD_DASHBOARD_VERSION +const isCI = process.env.CI === 'true' + // https://vitejs.dev/config/ export default defineConfig({ root: fileURLToPath(new URL('.', import.meta.url)), cacheDir: fileURLToPath(new URL('../../node_modules/.cache/vite', import.meta.url)), publicDir: fileURLToPath(new URL('./public', import.meta.url)), envDir: fileURLToPath(new URL('.', import.meta.url)), + logLevel: isCI ? 'error' : 'info', plugins: [ wasm(), ...(process.env.NODE_ENV === 'development' ? [await VueDevTools()] : []), diff --git a/app/ide-desktop/client/package.json b/app/ide-desktop/client/package.json index bc0c815bd5..d09738c16c 100644 --- a/app/ide-desktop/client/package.json +++ b/app/ide-desktop/client/package.json @@ -63,7 +63,7 @@ "typecheck": "tsc --build", "build": "tsx bundle.ts", "dist": "tsx dist.ts", - "lint": "eslint . --max-warnings=0", + "lint": "eslint . --cache --max-warnings=0", "watch:windows": "cross-env ENSO_BUILD_IDE=%LOCALAPPDATA%\\Temp\\enso\\dist\\ide ENSO_BUILD_PROJECT_MANAGER=%CD%\\..\\..\\..\\dist\\backend ENSO_BUILD_PROJECT_MANAGER_IN_BUNDLE_PATH=bin\\project-manager.exe ENSO_BUILD_IDE_BUNDLED_ENGINE_VERSION=0 ENSO_POLYGLOT_YDOC_SERVER=wss://localhost:8080 tsx watch.ts", "watch:linux": "ENSO_BUILD_IDE=\"${ENSO_BUILD_IDE:-/tmp/enso/dist/ide}\" ENSO_BUILD_PROJECT_MANAGER=\"${ENSO_BUILD_PROJECT_MANAGER:-\"$(pwd)/../../../dist/backend\"}\" ENSO_BUILD_PROJECT_MANAGER_IN_BUNDLE_PATH=\"${ENSO_BUILD_PROJECT_MANAGER_IN_BUNDLE_PATH:-bin/project-manager}\" ENSO_BUILD_IDE_BUNDLED_ENGINE_VERSION=\"${ENSO_BUILD_IDE_BUNDLED_ENGINE_VERSION:-0}\" ENSO_POLYGLOT_YDOC_SERVER=\"${ENSO_POLYGLOT_YDOC_SERVER:-wss://localhost:8080}\" tsx watch.ts \"$@\"", "watch:macos": "ENSO_BUILD_IDE=\"${ENSO_BUILD_IDE:-/tmp/enso/dist/ide}\" ENSO_BUILD_PROJECT_MANAGER=\"${ENSO_BUILD_PROJECT_MANAGER:-\"$(pwd)/../../../dist/backend\"}\" ENSO_BUILD_PROJECT_MANAGER_IN_BUNDLE_PATH=\"${ENSO_BUILD_PROJECT_MANAGER_IN_BUNDLE_PATH:-bin/project-manager}\" ENSO_BUILD_IDE_BUNDLED_ENGINE_VERSION=\"${ENSO_BUILD_IDE_BUNDLED_ENGINE_VERSION:-0}\" ENSO_POLYGLOT_YDOC_SERVER=\"${ENSO_POLYGLOT_YDOC_SERVER:-wss://localhost:8080}\" tsx watch.ts \"$@\"" diff --git a/app/ide-desktop/icons/package.json b/app/ide-desktop/icons/package.json index c076c12883..b3a3d7613e 100644 --- a/app/ide-desktop/icons/package.json +++ b/app/ide-desktop/icons/package.json @@ -16,7 +16,7 @@ }, "scripts": { "build": "node src/index.js", - "lint": "eslint . --max-warnings=0" + "lint": "eslint . --cache --max-warnings=0" }, "devDependencies": { "sharp": "^0.31.2", diff --git a/app/ydoc-server-nodejs/package.json b/app/ydoc-server-nodejs/package.json index 7fbcbca9bc..04349e3632 100644 --- a/app/ydoc-server-nodejs/package.json +++ b/app/ydoc-server-nodejs/package.json @@ -12,7 +12,7 @@ "compile": "node ./build.mjs build", "start": "node ./dist/main.mjs", "dev:watch": "node ./build.mjs watch", - "lint": "eslint . --max-warnings=0", + "lint": "eslint . --cache --max-warnings=0", "format": "prettier --version && prettier --write src/ && eslint . --fix" }, "dependencies": { diff --git a/app/ydoc-server-polyglot/package.json b/app/ydoc-server-polyglot/package.json index a9d6abe173..b12f1f578d 100644 --- a/app/ydoc-server-polyglot/package.json +++ b/app/ydoc-server-polyglot/package.json @@ -12,7 +12,7 @@ "compile": "node ./build.mjs build", "start": "node ./dist/main.cjs", "dev:watch": "node ./build.mjs watch", - "lint": "eslint . --max-warnings=0" + "lint": "eslint . --cache --max-warnings=0" }, "dependencies": { "ydoc-server": "workspace:*", diff --git a/app/ydoc-server/package.json b/app/ydoc-server/package.json index 79dbb2808b..3912e4d574 100644 --- a/app/ydoc-server/package.json +++ b/app/ydoc-server/package.json @@ -12,7 +12,7 @@ "test:watch": "vitest", "typecheck": "tsc", "compile": "tsc", - "lint": "eslint . --max-warnings=0" + "lint": "eslint . --cache --max-warnings=0" }, "exports": { ".": { diff --git a/app/ydoc-shared/package.json b/app/ydoc-shared/package.json index 9cd17c7e71..502a157fdf 100644 --- a/app/ydoc-shared/package.json +++ b/app/ydoc-shared/package.json @@ -17,7 +17,7 @@ "generate:ast-schema": "cargo run -p enso-parser-schema > src/ast/generated/ast-schema.json", "generate:ast-types": "vite-node ./parser-codegen/index.ts src/ast/generated/ast-schema.json src/ast/generated/ast.ts", "generate:ast-types-lazy": "vite-node ./parser-codegen/index.ts src/ast/generated/ast-schema.json src/ast/generated/ast.ts --if-changed", - "lint": "eslint . --max-warnings=0", + "lint": "eslint . --cache --max-warnings=0", "format": "prettier --version && prettier --write src/ && eslint . --fix", "postinstall": "corepack pnpm run generate:ast-schema && corepack pnpm run generate:ast-types-lazy" }, diff --git a/build/build/src/ci_gen.rs b/build/build/src/ci_gen.rs index 099534eb04..5e8719e07b 100644 --- a/build/build/src/ci_gen.rs +++ b/build/build/src/ci_gen.rs @@ -661,7 +661,6 @@ pub fn gui_tests() -> Result { workflow.add(PRIMARY_TARGET, job::Lint); workflow.add(PRIMARY_TARGET, job::WasmTest); workflow.add(PRIMARY_TARGET, job::NativeTest); - workflow.add(PRIMARY_TARGET, job::GuiCheck); Ok(workflow) } diff --git a/build/build/src/ci_gen/job.rs b/build/build/src/ci_gen/job.rs index 08c32d0716..8a23e6744b 100644 --- a/build/build/src/ci_gen/job.rs +++ b/build/build/src/ci_gen/job.rs @@ -396,16 +396,6 @@ impl JobArchetype for NativeTest { } } -#[derive(Clone, Copy, Debug)] -pub struct GuiCheck; - -impl JobArchetype for GuiCheck { - fn job(&self, target: Target) -> Job { - plain_job(target, "GUI tests", "gui check") - } -} - - #[derive(Clone, Copy, Debug)] pub struct GuiBuild; diff --git a/eslint.config.mjs b/eslint.config.mjs index 8c2a4343fc..fb9b043816 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -556,4 +556,15 @@ export default [ 'no-undef': 'off', }, }, + { + files: ['app/gui/src/dashboard/**/*.stories.tsx'], + rules: { + 'no-restricted-syntax': 'off', + 'jsdoc/require-jsdoc': 'off', + 'jsdoc/require-param-type': 'off', + 'jsdoc/require-file-overview': 'off', + '@typescript-eslint/no-magic-numbers': 'off', + '@typescript-eslint/unbound-method': 'off', + }, + }, ] diff --git a/package.json b/package.json index 9ebeac7a6a..9acf2c35e5 100644 --- a/package.json +++ b/package.json @@ -1,4 +1,5 @@ { + "type": "module", "devDependencies": { "@typescript-eslint/eslint-plugin": "^8.10.0", "@typescript-eslint/parser": "^8.10.0", @@ -30,10 +31,12 @@ "format": "prettier --write .", "format:workflows": "prettier --write .github/workflows", "ci-check": "corepack pnpm run --aggregate-output /^ci:/", - "ci:prettier": "prettier --check .", - "ci:lint": "corepack pnpm run -r lint", + "ci:prettier": "prettier --check --cache .", + "ci:lint": "corepack pnpm run -r --parallel lint --output-file eslint_report.json --format json", "ci:test": "corepack pnpm run -r --parallel test", - "ci:typecheck": "corepack pnpm run -r typecheck" + "ci:typecheck": "corepack pnpm run -r typecheck", + "ci:chromatic:react": "corepack pnpm run -r --filter enso-gui chromatic:react", + "ci:chromatic:vue": "corepack pnpm run -r --filter enso-gui chromatic:vue" }, "pnpm": { "//": "To completely ignore deep dependencies, see .pnpmfile.cjs", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1d3fc8fd8a..9b8d02e7c5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -218,8 +218,8 @@ importers: specifier: 6.3.6 version: 6.3.6 babel-plugin-react-compiler: - specifier: 19.0.0-beta-6fc168f-20241025 - version: 19.0.0-beta-6fc168f-20241025 + specifier: 19.0.0-beta-a7bf2bd-20241110 + version: 19.0.0-beta-a7bf2bd-20241110 clsx: specifier: ^2.1.1 version: 2.1.1 @@ -290,8 +290,8 @@ importers: specifier: ^1.3.3 version: 1.3.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-compiler-runtime: - specifier: 19.0.0-beta-6fc168f-20241025 - version: 19.0.0-beta-6fc168f-20241025(react@18.3.1) + specifier: 19.0.0-beta-a7bf2bd-20241110 + version: 19.0.0-beta-a7bf2bd-20241110(react@18.3.1) react-dom: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) @@ -362,6 +362,9 @@ importers: specifier: ^4.5.4 version: 4.5.4(@types/react@18.3.3)(react@18.3.1) devDependencies: + '@chromatic-com/storybook': + specifier: ^3.2.2 + version: 3.2.2(react@18.3.1)(storybook@8.4.2(prettier@3.3.2)) '@codemirror/theme-one-dark': specifier: ^6.1.2 version: 6.1.2 @@ -383,6 +386,33 @@ importers: '@react-types/shared': specifier: ^3.22.1 version: 3.25.0(react@18.3.1) + '@storybook/addon-essentials': + specifier: ^8.4.2 + version: 8.4.2(@types/react@18.3.3)(storybook@8.4.2(prettier@3.3.2)) + '@storybook/addon-interactions': + specifier: ^8.4.2 + version: 8.4.2(storybook@8.4.2(prettier@3.3.2)) + '@storybook/addon-onboarding': + specifier: ^8.4.2 + version: 8.4.2(react@18.3.1)(storybook@8.4.2(prettier@3.3.2)) + '@storybook/blocks': + specifier: ^8.4.2 + version: 8.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.2(prettier@3.3.2)) + '@storybook/react': + specifier: ^8.4.2 + version: 8.4.2(@storybook/test@8.4.2(storybook@8.4.2(prettier@3.3.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.2(prettier@3.3.2))(typescript@5.5.3) + '@storybook/react-vite': + specifier: ^8.4.2 + version: 8.4.2(@storybook/test@8.4.2(storybook@8.4.2(prettier@3.3.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.24.0)(storybook@8.4.2(prettier@3.3.2))(typescript@5.5.3)(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1)) + '@storybook/test': + specifier: ^8.4.2 + version: 8.4.2(storybook@8.4.2(prettier@3.3.2)) + '@storybook/vue3': + specifier: ^8.4.2 + version: 8.4.2(storybook@8.4.2(prettier@3.3.2))(vue@3.5.2(typescript@5.5.3)) + '@storybook/vue3-vite': + specifier: ^8.4.2 + version: 8.4.2(storybook@8.4.2(prettier@3.3.2))(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1))(vue@3.5.2(typescript@5.5.3)) '@tanstack/react-query-devtools': specifier: 5.45.1 version: 5.45.1(@tanstack/react-query@5.55.0(react@18.3.1))(react@18.3.1) @@ -449,6 +479,9 @@ importers: chalk: specifier: ^5.3.0 version: 5.3.0 + chromatic: + specifier: 11.18.1 + version: 11.18.1 cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -494,6 +527,9 @@ importers: sql-formatter: specifier: ^13.0.0 version: 13.1.0 + storybook: + specifier: ^8.4.2 + version: 8.4.2(prettier@3.3.2) tailwindcss: specifier: ^3.4.1 version: 3.4.4 @@ -841,6 +877,9 @@ packages: 7zip-bin@5.2.0: resolution: {integrity: sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==} + '@adobe/css-tools@4.4.0': + resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} + '@ag-grid-community/client-side-row-model@31.3.4': resolution: {integrity: sha512-lbrbhwSoY1/N2CiOQBa322gVnrhyrbzyG7cvbOef3itAiaLUzQ03PWBw09d9mj+/0hnqMs386ZuGX15FWJaTqQ==} @@ -1265,6 +1304,12 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@chromatic-com/storybook@3.2.2': + resolution: {integrity: sha512-xmXt/GW0hAPbzNTrxYuVo43Adrtjue4DeVrsoIIEeJdGaPNNeNf+DHMlJKOBdlHmCnFUoe9R/0mLM9zUp5bKWw==} + engines: {node: '>=16.0.0', yarn: '>=1.22.18'} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + '@codemirror/autocomplete@6.16.3': resolution: {integrity: sha512-Vl/tIeRVVUCRDuOG48lttBasNQu8usGgXQawBXI7WJAiUDSFOfzflmEsZFZo48mAvAaa4FZ/4/yLLxFtdJaKYA==} peerDependencies: @@ -1792,6 +1837,15 @@ packages: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@joshwooding/vite-plugin-react-docgen-typescript@0.3.0': + resolution: {integrity: sha512-2D6y7fNvFmsLmRt6UCOFJPvFoPMJGT0Uh1Wg0RaigUp7kdQPs6yYn8Dmx6GZkOH/NW0yMTwRz/p0SRMMRo50vA==} + peerDependencies: + typescript: '>= 4.3.x' + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -1881,6 +1935,12 @@ packages: resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} engines: {node: '>= 10.0.0'} + '@mdx-js/react@3.1.0': + resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} + peerDependencies: + '@types/react': ^18.0.27 + react: '>=16' + '@modyfi/vite-plugin-yaml@1.1.0': resolution: {integrity: sha512-L26xfzkSo1yamODCAtk/ipVlL6OEw2bcJ92zunyHu8zxi7+meV0zefA9xscRMDCsMY8xL3C3wi3DhMiPxcbxbw==} peerDependencies: @@ -2625,6 +2685,185 @@ packages: resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} + '@storybook/addon-actions@8.4.2': + resolution: {integrity: sha512-+hA200XN5aeA4T3jq8IifQq6Y+9FyNQ0Q+blM1L0Tl7WLzBc7B1kHQnKvhSj5pvMSBWc/Q/kY7Ev5t9gdOu13g==} + peerDependencies: + storybook: ^8.4.2 + + '@storybook/addon-backgrounds@8.4.2': + resolution: {integrity: sha512-s4uag5VKuk8q2MSnuNS7Sv+v1/mykzGPXe/zZRW2ammtkdHp8Uy78eQS2G0aiG02chXCX+qQgWMyy5QItDcTFQ==} + peerDependencies: + storybook: ^8.4.2 + + '@storybook/addon-controls@8.4.2': + resolution: {integrity: sha512-raCbHEj1xl4F3wKH6IdfEXNRaxKpY4QGhjSTE8Pte5iJSVhKG86taLqqRr+4dC7H1/LVMPU1XCGV4mkgDGtyxQ==} + peerDependencies: + storybook: ^8.4.2 + + '@storybook/addon-docs@8.4.2': + resolution: {integrity: sha512-jIpykha7hv2Inlrq31ZoYg2QhuCuvcO+Q+uvhT45RDTB+2US/fg3rJINKlw2Djq8RPPOXvty5W0yvE6CrWKhnQ==} + peerDependencies: + storybook: ^8.4.2 + + '@storybook/addon-essentials@8.4.2': + resolution: {integrity: sha512-+/vfPrXM/GWU3Kbrg92PepwAZr7lOeulTTYF4THK0CL3DfUUlkGNpBPLP5PtjCuIkVrTCjXiIEdVWk47d5m2+w==} + peerDependencies: + storybook: ^8.4.2 + + '@storybook/addon-highlight@8.4.2': + resolution: {integrity: sha512-vTtwp7nyJ09SXrsMnH+pukCjHjRMjQXgHZHxvbrv09uoH8ldQMv9B7u+X+9Wcy/jYSKFz/ng7pWo4b4a2oXHkg==} + peerDependencies: + storybook: ^8.4.2 + + '@storybook/addon-interactions@8.4.2': + resolution: {integrity: sha512-+/NTENTApeOcONgFNQ6Olbk0GH3pTDG3w0eh00slCB+2agD1BcVKg8SSlHQV0lQF1cK3vWL/X3jeaxdFLYOjjg==} + peerDependencies: + storybook: ^8.4.2 + + '@storybook/addon-measure@8.4.2': + resolution: {integrity: sha512-z+j6xQwcUBSpgzl1XDU+xU4YYgLraLMljECW7NvRNyJ/PYixvol8R3wtzWbr+CBpxmvbXjEJCPlF+EjF9/mBWQ==} + peerDependencies: + storybook: ^8.4.2 + + '@storybook/addon-onboarding@8.4.2': + resolution: {integrity: sha512-zWzOyRASnIPt2AcaEl1KhI+aOaKDuoIcNB7u1GoABj0YM+V9d6o3lvcsmOAQG5pgwgFyqyOnLwpTfvRSEyzGFA==} + peerDependencies: + storybook: ^8.4.2 + + '@storybook/addon-outline@8.4.2': + resolution: {integrity: sha512-oTMlPEyT4CBqzcQbfemoJzJ6yzeRAmvrAx9ssaBcnQQRsKxo0D2Ri/Jmm6SNcR0yBHxYRkvIH+2phLw8aiflCQ==} + peerDependencies: + storybook: ^8.4.2 + + '@storybook/addon-toolbars@8.4.2': + resolution: {integrity: sha512-DidzW/NQS224niMJIjcJI2ls83emqygUcS9GYNGgdc5Xwro/TPgGYOXP2qnXgYUxXQTHbrxmIbHdEehxC7CcYQ==} + peerDependencies: + storybook: ^8.4.2 + + '@storybook/addon-viewport@8.4.2': + resolution: {integrity: sha512-qVQ2UaxCNsUSFHnAAAizNPIJ/QwfMg7p5bBdpYROTZXJe+bxVp0rFzZmQgHZ3/sn+lzE4ItM4QEfxkfQUWi1ag==} + peerDependencies: + storybook: ^8.4.2 + + '@storybook/blocks@8.4.2': + resolution: {integrity: sha512-yAAvmOWaD8gIrepOxCh/RxQqd/1xZIwd/V+gsvAhW/thawN+SpI+zK63gmcqAPLX84hJ3Dh5pegRk0SoHNuDVA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.4.2 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@storybook/builder-vite@8.4.2': + resolution: {integrity: sha512-dO5FB5yH1C6tr/kBHn1frvGwp8Pt0D1apgXWkJ5ITWEUfh6WwOqX2fqsWsqaNwE7gP0qn0XgwCIEkI/4Mj55SA==} + peerDependencies: + storybook: ^8.4.2 + vite: ^4.0.0 || ^5.0.0 + + '@storybook/components@8.4.2': + resolution: {integrity: sha512-+W59oF7D73LAxLNmCfFrfs98cH9pyNHK9HlJoO5/lKbK4IdWhhOoqUR/AJ3ueksoLuetFat4DxyE8SN1H4Bvrg==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + + '@storybook/core@8.4.2': + resolution: {integrity: sha512-hF8GWoUZTjwwuV5j4OLhMHZtZQL/NYcVUBReC2Ba06c8PkFIKqKZwATr1zKd301gQ5Qwcn9WgmZxJTMgdKQtOg==} + peerDependencies: + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true + + '@storybook/csf-plugin@8.4.2': + resolution: {integrity: sha512-1f0t6W5xbC1sSAHHs3uXYPIQs2NXAEtIGqn6X9i3xbbub6hDS8PF8BIm7dOjQ8dZOPp7d9ltR64V5CoLlsOigA==} + peerDependencies: + storybook: ^8.4.2 + + '@storybook/csf@0.1.11': + resolution: {integrity: sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==} + + '@storybook/global@5.0.0': + resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + + '@storybook/icons@1.2.12': + resolution: {integrity: sha512-UxgyK5W3/UV4VrI3dl6ajGfHM4aOqMAkFLWe2KibeQudLf6NJpDrDMSHwZj+3iKC4jFU7dkKbbtH2h/al4sW3Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/instrumenter@8.4.2': + resolution: {integrity: sha512-gPYCZ/0O6gRLI3zmenu2N6QtKzxDZFdT2xf4RWcNUSZyp28RZkRCIgKFMt3fTmvE0yMzAjQyRSkBdrONjQ44HA==} + peerDependencies: + storybook: ^8.4.2 + + '@storybook/manager-api@8.4.2': + resolution: {integrity: sha512-rhPc4cgQDKDH8NUyRh/ZaJW7QIhR/PO5MNX4xc+vz71sM2nO7ONA/FrgLtCuu4SULdwilEPvGefYvLK0dE+Caw==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + + '@storybook/preview-api@8.4.2': + resolution: {integrity: sha512-5X/xvIvDPaWJKUBCo5zVeBbbjkhnwcI2KPkuOgrHVRRhuQ5WqD0RYxVtOOFNyQXme7g0nNl5RFNgvT7qv9qGeg==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + + '@storybook/react-dom-shim@8.4.2': + resolution: {integrity: sha512-FZVTM1f34FpGnf6e3MDIKkz05gmn8H9wEccvQAgr8pEFe8VWfrpVWeUrmatSAfgrCMNXYC1avDend8UX6IM8Fg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.4.2 + + '@storybook/react-vite@8.4.2': + resolution: {integrity: sha512-OoXaW/V1AqLggMyniRcnuwmqQ1/OtSn38t31lePX4nDDeJhbGT3ZPldRrwvsLb0EaD3N27uoL+QbAOgsYJIhwA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.4.2 + vite: ^4.0.0 || ^5.0.0 + + '@storybook/react@8.4.2': + resolution: {integrity: sha512-rO5/aVKBVhIKENcL7G8ud4QKC5OyWBPCkJIvY6XUHIuhErJy9/4pP+sZ85jypVwx5kq+EqCPF8AEOWjIxB/4/Q==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@storybook/test': 8.4.2 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.4.2 + typescript: '>= 4.2.x' + peerDependenciesMeta: + '@storybook/test': + optional: true + typescript: + optional: true + + '@storybook/test@8.4.2': + resolution: {integrity: sha512-MipTdboStv0hsqF2Sw8TZgP0YnxCcDYwxkTOd4hmRzev/7Brtvpi4pqjqh8k98ZCvhrCPAPVIoX5drk+oi3YUA==} + peerDependencies: + storybook: ^8.4.2 + + '@storybook/theming@8.4.2': + resolution: {integrity: sha512-9j4fnu5LcV+qSs1rdwf61Bt14lms0T1LOZkHxGNcS1c1oH+cPS+sxECh2lxtni+mvOAHUlBs9pKhVZzRPdWpvg==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + + '@storybook/vue3-vite@8.4.2': + resolution: {integrity: sha512-0M2/gFtCi0RzJN398v6QdOm4Iyz5/Slg5cGvXWfpT5ArcJmo7a1FnUBiR0JRu7HI0GcQL3F+wbYCm6vLumK5ow==} + engines: {node: '>=18.0.0'} + peerDependencies: + storybook: ^8.4.2 + vite: ^4.0.0 || ^5.0.0 + + '@storybook/vue3@8.4.2': + resolution: {integrity: sha512-1l4Icg1r8YrKoGVsEuWushhK0KqDsBRmj0tgfLm6Z8tsceNPD9Ev7OGUWmi7SClI8wqkz2Zn3W/TSESI6Bu7Fw==} + engines: {node: '>=18.0.0'} + peerDependencies: + storybook: ^8.4.2 + vue: ^3.0.0 + '@stripe/react-stripe-js@2.7.2': resolution: {integrity: sha512-OCvSr/wMt2GUVwEW2nvRYVvv5Pkey6YQBOevYSx7N0JyuRK8yK7KtedTty7enFNnEk1dFQNppcjofz6V1i5rXA==} peerDependencies: @@ -2676,6 +2915,20 @@ packages: '@vue/composition-api': optional: true + '@testing-library/dom@10.4.0': + resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} + engines: {node: '>=18'} + + '@testing-library/jest-dom@6.5.0': + resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + + '@testing-library/user-event@14.5.2': + resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + '@tootallnate/once@2.0.0': resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} @@ -2683,6 +2936,9 @@ packages: '@tsconfig/node20@20.1.4': resolution: {integrity: sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==} + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -2803,6 +3059,9 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/doctrine@0.0.9': + resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} + '@types/eslint@8.56.10': resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} @@ -2818,6 +3077,9 @@ packages: '@types/geojson@7946.0.14': resolution: {integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==} + '@types/glob@7.2.0': + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + '@types/hammerjs@2.0.45': resolution: {integrity: sha512-qkcUlZmX6c4J8q45taBKTL3p+LbITgyx7qhlPYOdOHZB7B31K0mXbP5YA7i7SgDeEGuI9MnumiKPEMrxg8j3KQ==} @@ -2848,9 +3110,15 @@ packages: '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@types/mime-types@2.1.4': resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==} + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} @@ -2881,6 +3149,9 @@ packages: '@types/react@18.3.3': resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + '@types/resolve@1.20.6': + resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} + '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} @@ -2905,6 +3176,9 @@ packages: '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + '@types/uuid@9.0.8': + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + '@types/validator@13.12.0': resolution: {integrity: sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==} @@ -3007,6 +3281,15 @@ packages: '@vitest/expect@1.6.0': resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + '@vitest/expect@2.0.5': + resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} + + '@vitest/pretty-format@2.0.5': + resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} + + '@vitest/pretty-format@2.1.4': + resolution: {integrity: sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww==} + '@vitest/runner@1.6.0': resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} @@ -3016,18 +3299,36 @@ packages: '@vitest/spy@1.6.0': resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + '@vitest/spy@2.0.5': + resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} + '@vitest/utils@1.6.0': resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + '@vitest/utils@2.0.5': + resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} + + '@vitest/utils@2.1.4': + resolution: {integrity: sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==} + '@volar/language-core@2.4.0-alpha.12': resolution: {integrity: sha512-Dj9qTifcGGgzFLfMbU5dCo13kHyNuEyvPJhtWDnoVBBmgwW3GMwFmgWnNxBhjf63m5x0gux1okaxX2CLN7qSww==} + '@volar/language-core@2.4.10': + resolution: {integrity: sha512-hG3Z13+nJmGaT+fnQzAkS0hjJRa2FCeqZt6Bd+oGNhUkQ+mTFsDETg5rqUTxyzIh5pSOGY7FHCWUS8G82AzLCA==} + '@volar/source-map@2.4.0-alpha.12': resolution: {integrity: sha512-LXATFSj4D7T9sEm7FFj6iBgHjKjrdhAgRPcechVKiNCMQdr3r3GVkkeu8aM+1peaMH3LsCqoDxVZEmh2r7CHiw==} + '@volar/source-map@2.4.10': + resolution: {integrity: sha512-OCV+b5ihV0RF3A7vEvNyHPi4G4kFa6ukPmyVocmqm5QzOd8r5yAtiNvaPEjl8dNvgC/lj4JPryeeHLdXd62rWA==} + '@volar/typescript@2.4.0-alpha.12': resolution: {integrity: sha512-mLg+OQauMTv/+08a7WBWJo1sev/wc8t2is0zhBZIlFU+j5mG89FM4+4089c2p/zoUFZ400Q/VNg2BPfhpZ8wSA==} + '@volar/typescript@2.4.10': + resolution: {integrity: sha512-F8ZtBMhSXyYKuBfGpYwqA5rsONnOwAVvjyE7KPYJ7wgZqo2roASqNWUnianOomJX5u1cxeRooHV59N0PhvEOgw==} + '@vue/babel-helper-vue-transform-on@1.2.2': resolution: {integrity: sha512-nOttamHUR3YzdEqdM/XXDyCSdxMA9VizUKoroLX6yTyRtggzQMHXcmwh8a7ZErcJttIBIc9s68a1B8GZ+Dmvsw==} @@ -3056,19 +3357,22 @@ packages: '@vue/compiler-ssr@3.5.2': resolution: {integrity: sha512-vMtA4tQK/AM3UAYJsmouQzQpgG+h9TKiD5BV+Zt+ZyAMdicxzSEEFGWf/CykRnDpqj9fMfIHPhOezJVNxiXe2A==} + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + '@vue/devtools-api@6.6.3': resolution: {integrity: sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==} - '@vue/devtools-core@7.6.3': - resolution: {integrity: sha512-C7FOuh3Z+EmXXzDU9eRjHQL7zW7/CFovM6yCNNpUb+zXxhrn4fiqTum+a3gNau9DuzYfEtQXwZ9F7MeK0JKYVw==} + '@vue/devtools-core@7.6.4': + resolution: {integrity: sha512-blSwGVYpb7b5TALMjjoBiAl5imuBF7WEOAtaJaBMNikR8SQkm6mkUt4YlIKh9874/qoimwmpDOm+GHBZ4Y5m+g==} peerDependencies: vue: ^3.0.0 - '@vue/devtools-kit@7.6.3': - resolution: {integrity: sha512-ETsFc8GlOp04rSFN79tB2TpVloWfsSx9BoCSElV3w3CaJTSBfz42KsIi5Ka+dNTJs1jY7QVLTDeoBmUGgA9h2A==} + '@vue/devtools-kit@7.6.4': + resolution: {integrity: sha512-Zs86qIXXM9icU0PiGY09PQCle4TI750IPLmAJzW5Kf9n9t5HzSYf6Rz6fyzSwmfMPiR51SUKJh9sXVZu78h2QA==} - '@vue/devtools-shared@7.6.3': - resolution: {integrity: sha512-wJW5QF27i16+sNQIaes8QoEZg1eqEgF83GkiPUlEQe9k7ZoHXHV7PRrnrxOKem42sIHPU813J2V/ZK1uqTJe6g==} + '@vue/devtools-shared@7.6.4': + resolution: {integrity: sha512-nD6CUvBEel+y7zpyorjiUocy0nh77DThZJ0k1GRnJeOmY3ATq2fWijEp7wk37gb023Cb0R396uYh5qMSBQ5WFg==} '@vue/eslint-config-typescript@14.1.3': resolution: {integrity: sha512-L4NUJQz/0We2QYtrNwRAGRy4KfpOagl5V3MpZZ+rQ51a+bKjlKYYrugi7lp7PIX8LolRgu06ZwDoswnSGWnAmA==} @@ -3089,6 +3393,14 @@ packages: typescript: optional: true + '@vue/language-core@2.1.10': + resolution: {integrity: sha512-DAI289d0K3AB5TUG3xDp9OuQ71CnrujQwJrQnfuZDwo6eGNf0UoRlPuaVNO+Zrn65PC3j0oB2i7mNmVPggeGeQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@vue/reactivity@3.5.2': resolution: {integrity: sha512-lJwWL5bNht+2vIwU/+lnGdH+FKFxzz6z8WkoIJityPLiasWU+HDUvEsC7gm3JFwbTf7Kk+Nr9kJMaPy0HXwwxQ==} @@ -3155,11 +3467,21 @@ packages: resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} engines: {node: '>=0.4.0'} + acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + acorn@8.12.0: resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} engines: {node: '>=0.4.0'} hasBin: true + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + ag-charts-community@9.3.2: resolution: {integrity: sha512-jw2llxTYzGAZ24m7eQsKS24BnJBhspZKsL03DbqH0wxLepbEcC3eeWICe+02TBQCbFVsWmSsYukjzQg3FkVWRw==} @@ -3191,6 +3513,9 @@ packages: ajv@8.16.0: resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} + alien-signals@0.2.0: + resolution: {integrity: sha512-StlonZhBBrsPPwrDjiPAiVTf/rolxffLxVPT60Qv/t88BZ81BvUVzHgGqEFvJ1ii8HXtm1+zU2Icr59tfWEcag==} + amazon-cognito-identity-js@6.3.6: resolution: {integrity: sha512-kBq+GE6OkLrxtFj3ZduIOlKBFYeOqZK3EhxbDBkv476UTvy+uwfR0tlriTq2QzNdnvlQAjBIXnXuOM7DwR1UEQ==} @@ -3260,6 +3585,13 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} @@ -3292,9 +3624,15 @@ packages: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + asn1@0.2.6: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + assert-never@1.3.0: + resolution: {integrity: sha512-9Z3vxQ+berkL/JJo0dK+EY3Lp0s3NtSnP3VCLsh5HDcZPrh0M+KQRK5sWhUeyPPH+/RCxZqOxLMR+YC6vlviEQ==} + assert-plus@1.0.0: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} @@ -3302,6 +3640,14 @@ packages: assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -3336,6 +3682,13 @@ packages: babel-plugin-react-compiler@19.0.0-beta-6fc168f-20241025: resolution: {integrity: sha512-wFVeXhF0hkiRe4bEM0jzeTFMlMbcKNTwhXcFvqUIVB6WXf+3vdwOWGWnw7jwvDb2mzvsIZOFt/96itOFt1rwjw==} + babel-plugin-react-compiler@19.0.0-beta-a7bf2bd-20241110: + resolution: {integrity: sha512-WdxXtLxsV4gh/GlEK4fuFDGkcED0Wb9UJEBB6Uc1SFqRFEmJNFKboW+Z4NUS5gYrPImqrjh4IwHAmgS6ZBg4Cg==} + + babel-walk@3.0.0-canary-5: + resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} + engines: {node: '>= 10.0.0'} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -3345,6 +3698,10 @@ packages: bcrypt-pbkdf@1.0.2: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + better-opn@3.0.2: + resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} + engines: {node: '>=12.0.0'} + bignumber.js@2.4.0: resolution: {integrity: sha512-uw4ra6Cv483Op/ebM0GBKKfxZlSmn6NgFRby5L3yGTlunLj53KQgndDlqy2WVFOwgvurocApYkSud0aO+mvrpQ==} @@ -3397,6 +3754,9 @@ packages: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} + browser-assert@1.2.1: + resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} + browserslist@4.23.3: resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -3493,10 +3853,18 @@ packages: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} + chai@5.1.2: + resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} + engines: {node: '>=12'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} + chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -3512,9 +3880,16 @@ packages: resolution: {integrity: sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==} engines: {node: '>=12.20'} + character-parser@2.2.0: + resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==} + check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -3526,6 +3901,18 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + chromatic@11.18.1: + resolution: {integrity: sha512-hkNT9vA6K9+PnE/khhZYBnRCOm8NonaQDs7RZ8YHFo7/lh1b/x/uFMkTjWjaj/mkM6QOR/evu5VcZMtcaauSlw==} + hasBin: true + peerDependencies: + '@chromatic-com/cypress': ^0.*.* || ^1.0.0 + '@chromatic-com/playwright': ^0.*.* || ^1.0.0 + peerDependenciesMeta: + '@chromatic-com/cypress': + optional: true + '@chromatic-com/playwright': + optional: true + chromium-pickle-js@0.2.0: resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} @@ -3646,6 +4033,9 @@ packages: constant-case@3.0.4: resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + constantinople@4.0.1: + resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} + content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} @@ -3914,6 +4304,10 @@ packages: resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -3941,6 +4335,10 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} @@ -3963,6 +4361,10 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -4015,6 +4417,19 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + doctypes@1.1.0: + resolution: {integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==} + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -4175,6 +4590,11 @@ packages: resolution: {integrity: sha512-0bQ6+1tUbySSnxzn5jnXHMDvYnT0cN/Wd4Syk8g/sqAIJUg7buTIi22svS3Qz6ssx895NT+TgLPb33xi1OkZig==} engines: {node: '>=0.10.0'} + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -4276,6 +4696,9 @@ packages: jiti: optional: true + esm-resolve@1.0.11: + resolution: {integrity: sha512-LxF0wfUQm3ldUDHkkV2MIbvvY0TgzIpJ420jHSV1Dm+IlplBEWiJTKWM61GtxUfvjV6iD4OtTYFGAGM2uuIUWg==} + espree@10.2.0: resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4397,6 +4820,10 @@ packages: filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + filesize@10.1.6: + resolution: {integrity: sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==} + engines: {node: '>= 10.4.0'} + fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -4405,6 +4832,9 @@ packages: resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} engines: {node: '>= 0.8'} + find-package-json@1.2.0: + resolution: {integrity: sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw==} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -4569,6 +4999,12 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob-promise@4.2.2: + resolution: {integrity: sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==} + engines: {node: '>=12'} + peerDependencies: + glob: ^7.1.6 + glob@10.4.2: resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} engines: {node: '>=16 || 14 >=14.18'} @@ -4803,6 +5239,10 @@ packages: resolution: {integrity: sha512-giaI0hCj+wWZIZZLsmWHI+LrM4Hwc+rEZ/VrgCafKePcnE42fLnQTFt4xspqLin8fCjI5WnQr2fep/0EFqjaxw==} hasBin: true + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -4838,6 +5278,10 @@ packages: resolution: {integrity: sha512-HjpCHTuxbR/6jWJroc/VN+npo5j0T4Vv2TAI5qdEHQx7hsL767MeccGFSsLtF694EiZKTSEqgoeU6DtGFCcuqQ==} engines: {node: '>=0.10.0'} + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + is-array-buffer@3.0.4: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} @@ -4882,11 +5326,19 @@ packages: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true + is-expression@4.0.0: + resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==} + is-extendable@0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} @@ -4941,6 +5393,9 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -4990,6 +5445,10 @@ packages: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + is-wsl@3.1.0: resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} engines: {node: '>=16'} @@ -5093,6 +5552,9 @@ packages: resolution: {integrity: sha512-SW0rTTG+TBPVD1Kp6HtnOr9kX3//EWA6qMlP2Y/WxbKsSNCBuJbWv3EDB5noKJBEkHYi2mDY+xqMn4Y0QHyjyg==} engines: {node: '>=1.0.0'} + js-stringify@1.0.2: + resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -5176,6 +5638,9 @@ packages: resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} engines: {node: '>=0.6.0'} + jstransformer@1.0.0: + resolution: {integrity: sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==} + jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -5375,6 +5840,9 @@ packages: loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@3.1.2: + resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} + lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -5397,9 +5865,21 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} + lru-cache@8.0.5: + resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} + engines: {node: '>=16.14'} + ltgt@2.2.1: resolution: {integrity: sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==} + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + magic-string@0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + magic-string@0.30.11: resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} @@ -5410,6 +5890,9 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} + map-or-similar@1.5.0: + resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} + markdown-it-anchor@8.6.7: resolution: {integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==} peerDependencies: @@ -5445,6 +5928,9 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + memoizerific@1.11.3: + resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} + memorystream@0.3.1: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} @@ -5493,6 +5979,10 @@ packages: min-document@2.19.0: resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + minimatch@10.0.1: resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} engines: {node: 20 || >=22} @@ -5744,6 +6234,10 @@ packages: resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} engines: {node: '>=18'} + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + opener@1.5.2: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} hasBin: true @@ -5866,6 +6360,10 @@ packages: pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} @@ -5936,6 +6434,10 @@ packages: resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} engines: {node: '>=4.0.0'} + polished@4.3.1: + resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} + engines: {node: '>=10'} + portfinder@1.0.32: resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} engines: {node: '>= 0.12.0'} @@ -6079,6 +6581,10 @@ packages: engines: {node: '>=14'} hasBin: true + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -6098,6 +6604,9 @@ packages: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} + promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -6110,6 +6619,42 @@ packages: psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + pug-attrs@3.0.0: + resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==} + + pug-code-gen@3.0.3: + resolution: {integrity: sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==} + + pug-error@2.1.0: + resolution: {integrity: sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==} + + pug-filters@4.0.0: + resolution: {integrity: sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==} + + pug-lexer@5.0.1: + resolution: {integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==} + + pug-linker@4.0.0: + resolution: {integrity: sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==} + + pug-load@3.0.0: + resolution: {integrity: sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==} + + pug-parser@6.0.0: + resolution: {integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==} + + pug-runtime@3.0.1: + resolution: {integrity: sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==} + + pug-strip-comments@2.0.0: + resolution: {integrity: sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==} + + pug-walk@2.0.0: + resolution: {integrity: sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==} + + pug@3.0.3: + resolution: {integrity: sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==} + pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} @@ -6185,11 +6730,26 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-compiler-runtime@19.0.0-beta-6fc168f-20241025: - resolution: {integrity: sha512-XY5p6GUVaz8P0c/B/2ebqz/xdp0YOtidtOSuiYyQB05fMws0Qys+zubDH7IKQBEtw4AKoCzrJ6ReeTtFLOKniw==} + react-compiler-runtime@19.0.0-beta-a7bf2bd-20241110: + resolution: {integrity: sha512-cSkrfz2eGcC9UZ/83mLf3aqKKDVjFkWJeA/kiYLwKTNp7B0Lq5M1FQ3vTfgSC027fK5ZutXU/JsCS5KxTwk8Mg==} peerDependencies: react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-confetti@6.1.0: + resolution: {integrity: sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==} + engines: {node: '>=10.18'} + peerDependencies: + react: ^16.3.0 || ^17.0.1 || ^18.0.0 + + react-docgen-typescript@2.2.2: + resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} + peerDependencies: + typescript: '>= 4.3.x' + + react-docgen@7.1.0: + resolution: {integrity: sha512-APPU8HB2uZnpl6Vt/+0AFoVYgSRtfiP6FLrZgPPTDmqSb2R4qZRbgd0A3VzIFxDt5e+Fozjx79WjLWnF69DK8g==} + engines: {node: '>=16.14.0'} + react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: @@ -6209,6 +6769,9 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} @@ -6273,6 +6836,14 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + recast@0.23.9: + resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==} + engines: {node: '>= 4'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + reflect.getprototypeof@1.0.6: resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} engines: {node: '>= 0.4'} @@ -6600,6 +7171,15 @@ packages: std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + storybook@8.4.2: + resolution: {integrity: sha512-GMCgyAulmLNrkUtDkCpFO4SB77YrpiIxq6e5tzaQdXEuaDu1mdNwOuP3VG7nE2FzxmqDvagSgriM68YW9iFaZA==} + hasBin: true + peerDependencies: + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true + stream-to-buffer@0.1.0: resolution: {integrity: sha512-Da4WoKaZyu3nf+bIdIifh7IPkFjARBnBK+pYqn0EUJqksjV9afojjaCCHUemH30Jmu7T2qcKvlZm2ykN38uzaw==} engines: {node: '>= 0.8'} @@ -6671,6 +7251,14 @@ packages: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} + strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -6793,6 +7381,10 @@ packages: resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} engines: {node: '>=14.0.0'} + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + tmp-promise@3.0.3: resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} @@ -6816,6 +7408,9 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + token-stream@1.0.0: + resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} + tosource@2.0.0-alpha.3: resolution: {integrity: sha512-KAB2lrSS48y91MzFPFuDg4hLbvDiyTjOVgaK7Erw+5AmZXNq4sFRVn8r6yxSLuNs15PaokrDRpS61ERY9uZOug==} engines: {node: '>=10'} @@ -6848,12 +7443,23 @@ packages: peerDependencies: typescript: '>=4.2.0' + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + ts-map@1.0.3: + resolution: {integrity: sha512-vDWbsl26LIcPGmDpoVzjEP6+hvHZkBkLW7JpvwbCv/5IYPJlsbzCVXY3wsCeAxAUeTclNOUZxnLdGh3VBD/J6w==} + ts-results@3.3.0: resolution: {integrity: sha512-FWqxGX2NHp5oCyaMd96o2y2uMQmSu8Dey6kvyuFdRJ2AzfmWo3kWa4UsPlCGlfQ/qu03m09ZZtppMoY8EMHuiA==} + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} @@ -6865,6 +7471,9 @@ packages: tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + tween-functions@1.2.0: + resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==} + tweetnacl@0.14.5: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} @@ -6884,6 +7493,10 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -6955,6 +7568,15 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unplugin@1.15.0: + resolution: {integrity: sha512-jTPIs63W+DUEDW207ztbaoO7cQ4p5aVaB823LSlxpsFEU3Mykwxf3ZGC/wzxFJeZlASZYgVrWeo7LgOrqJZ8RA==} + engines: {node: '>=14.0.0'} + peerDependencies: + webpack-sources: ^3 + peerDependenciesMeta: + webpack-sources: + optional: true + upath@2.0.1: resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} engines: {node: '>=4'} @@ -7003,6 +7625,9 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} @@ -7012,6 +7637,10 @@ packages: deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. hasBin: true + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -7139,12 +7768,27 @@ packages: jsdom: optional: true + void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + vue-component-meta@2.1.10: + resolution: {integrity: sha512-YEFSau36lLCJNvoM6eynAcq891Y6HKIEdEk3PCzCyNVySeYJAXgE/9iCYqQzLtBJlKg/bBpImz8VbUZsh4N/7Q==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + vue-component-type-helpers@2.0.29: resolution: {integrity: sha512-58i+ZhUAUpwQ+9h5Hck0D+jr1qbYl4voRt5KffBx8qzELViQ4XdT/Tuo+mzq8u63teAG8K0lLaOiL5ofqW38rg==} + vue-component-type-helpers@2.1.10: + resolution: {integrity: sha512-lfgdSLQKrUmADiSV6PbBvYgQ33KF3Ztv6gP85MfGaGaSGMTXORVaHT1EHfsqCgzRNBstPKYDmvAV9Do5CmJ07A==} + vue-demi@0.14.10: resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} engines: {node: '>=12'} @@ -7156,12 +7800,22 @@ packages: '@vue/composition-api': optional: true + vue-docgen-api@4.79.2: + resolution: {integrity: sha512-n9ENAcs+40awPZMsas7STqjkZiVlIjxIKgiJr5rSohDP0/JCrD9VtlzNojafsA1MChm/hz2h3PDtUedx3lbgfA==} + peerDependencies: + vue: '>=2' + vue-eslint-parser@9.4.3: resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' + vue-inbrowser-compiler-independent-utils@4.71.1: + resolution: {integrity: sha512-K3wt3iVmNGaFEOUR4JIThQRWfqokxLfnPslD41FDZB2ajXp789+wCqJyGYlIFsvEQ2P61PInw6/ph5iiqg51gg==} + peerDependencies: + vue: '>=2' + vue-react-wrapper@0.3.1: resolution: {integrity: sha512-kvG3A+fua1GkSiwO24Dp/i67KTz1yTH55HjxVmfnKtVA91sWoAlx2MZ728ooV4PKDt7LCapyPdJesoylPmHkUg==} engines: {pnpm: '>=7'} @@ -7204,6 +7858,9 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -7251,6 +7908,10 @@ packages: engines: {node: '>=8'} hasBin: true + with@7.0.2: + resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} + engines: {node: '>= 10.0.0'} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -7410,6 +8071,8 @@ snapshots: 7zip-bin@5.2.0: {} + '@adobe/css-tools@4.4.0': {} + '@ag-grid-community/client-side-row-model@31.3.4': dependencies: '@ag-grid-community/core': 31.3.4 @@ -8041,6 +8704,19 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} + '@chromatic-com/storybook@3.2.2(react@18.3.1)(storybook@8.4.2(prettier@3.3.2))': + dependencies: + chromatic: 11.18.1 + filesize: 10.1.6 + jsonfile: 6.1.0 + react-confetti: 6.1.0(react@18.3.1) + storybook: 8.4.2(prettier@3.3.2) + strip-ansi: 7.1.0 + transitivePeerDependencies: + - '@chromatic-com/cypress' + - '@chromatic-com/playwright' + - react + '@codemirror/autocomplete@6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.3)(@lezer/common@1.2.1)': dependencies: '@codemirror/language': 6.10.2 @@ -8576,6 +9252,16 @@ snapshots: dependencies: '@sinclair/typebox': 0.27.8 + '@joshwooding/vite-plugin-react-docgen-typescript@0.3.0(typescript@5.5.3)(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1))': + dependencies: + glob: 7.2.3 + glob-promise: 4.2.2(glob@7.2.3) + magic-string: 0.27.0 + react-docgen-typescript: 2.2.2(typescript@5.5.3) + vite: 5.4.10(@types/node@22.9.0)(lightningcss@1.25.1) + optionalDependencies: + typescript: 5.5.3 + '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 @@ -8713,6 +9399,12 @@ snapshots: transitivePeerDependencies: - supports-color + '@mdx-js/react@3.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 18.3.3 + react: 18.3.1 + '@modyfi/vite-plugin-yaml@1.1.0(rollup@4.24.0)(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1))': dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.24.0) @@ -9892,6 +10584,266 @@ snapshots: '@smithy/util-buffer-from': 2.2.0 tslib: 2.6.3 + '@storybook/addon-actions@8.4.2(storybook@8.4.2(prettier@3.3.2))': + dependencies: + '@storybook/global': 5.0.0 + '@types/uuid': 9.0.8 + dequal: 2.0.3 + polished: 4.3.1 + storybook: 8.4.2(prettier@3.3.2) + uuid: 9.0.1 + + '@storybook/addon-backgrounds@8.4.2(storybook@8.4.2(prettier@3.3.2))': + dependencies: + '@storybook/global': 5.0.0 + memoizerific: 1.11.3 + storybook: 8.4.2(prettier@3.3.2) + ts-dedent: 2.2.0 + + '@storybook/addon-controls@8.4.2(storybook@8.4.2(prettier@3.3.2))': + dependencies: + '@storybook/global': 5.0.0 + dequal: 2.0.3 + storybook: 8.4.2(prettier@3.3.2) + ts-dedent: 2.2.0 + + '@storybook/addon-docs@8.4.2(@types/react@18.3.3)(storybook@8.4.2(prettier@3.3.2))': + dependencies: + '@mdx-js/react': 3.1.0(@types/react@18.3.3)(react@18.3.1) + '@storybook/blocks': 8.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.2(prettier@3.3.2)) + '@storybook/csf-plugin': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + '@storybook/react-dom-shim': 8.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.2(prettier@3.3.2)) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + storybook: 8.4.2(prettier@3.3.2) + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + - webpack-sources + + '@storybook/addon-essentials@8.4.2(@types/react@18.3.3)(storybook@8.4.2(prettier@3.3.2))': + dependencies: + '@storybook/addon-actions': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + '@storybook/addon-backgrounds': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + '@storybook/addon-controls': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + '@storybook/addon-docs': 8.4.2(@types/react@18.3.3)(storybook@8.4.2(prettier@3.3.2)) + '@storybook/addon-highlight': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + '@storybook/addon-measure': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + '@storybook/addon-outline': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + '@storybook/addon-toolbars': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + '@storybook/addon-viewport': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + storybook: 8.4.2(prettier@3.3.2) + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + - webpack-sources + + '@storybook/addon-highlight@8.4.2(storybook@8.4.2(prettier@3.3.2))': + dependencies: + '@storybook/global': 5.0.0 + storybook: 8.4.2(prettier@3.3.2) + + '@storybook/addon-interactions@8.4.2(storybook@8.4.2(prettier@3.3.2))': + dependencies: + '@storybook/global': 5.0.0 + '@storybook/instrumenter': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + '@storybook/test': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + polished: 4.3.1 + storybook: 8.4.2(prettier@3.3.2) + ts-dedent: 2.2.0 + + '@storybook/addon-measure@8.4.2(storybook@8.4.2(prettier@3.3.2))': + dependencies: + '@storybook/global': 5.0.0 + storybook: 8.4.2(prettier@3.3.2) + tiny-invariant: 1.3.3 + + '@storybook/addon-onboarding@8.4.2(react@18.3.1)(storybook@8.4.2(prettier@3.3.2))': + dependencies: + react-confetti: 6.1.0(react@18.3.1) + storybook: 8.4.2(prettier@3.3.2) + transitivePeerDependencies: + - react + + '@storybook/addon-outline@8.4.2(storybook@8.4.2(prettier@3.3.2))': + dependencies: + '@storybook/global': 5.0.0 + storybook: 8.4.2(prettier@3.3.2) + ts-dedent: 2.2.0 + + '@storybook/addon-toolbars@8.4.2(storybook@8.4.2(prettier@3.3.2))': + dependencies: + storybook: 8.4.2(prettier@3.3.2) + + '@storybook/addon-viewport@8.4.2(storybook@8.4.2(prettier@3.3.2))': + dependencies: + memoizerific: 1.11.3 + storybook: 8.4.2(prettier@3.3.2) + + '@storybook/blocks@8.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.2(prettier@3.3.2))': + dependencies: + '@storybook/csf': 0.1.11 + '@storybook/icons': 1.2.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + storybook: 8.4.2(prettier@3.3.2) + ts-dedent: 2.2.0 + optionalDependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@storybook/builder-vite@8.4.2(storybook@8.4.2(prettier@3.3.2))(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1))': + dependencies: + '@storybook/csf-plugin': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + browser-assert: 1.2.1 + storybook: 8.4.2(prettier@3.3.2) + ts-dedent: 2.2.0 + vite: 5.4.10(@types/node@22.9.0)(lightningcss@1.25.1) + transitivePeerDependencies: + - webpack-sources + + '@storybook/components@8.4.2(storybook@8.4.2(prettier@3.3.2))': + dependencies: + storybook: 8.4.2(prettier@3.3.2) + + '@storybook/core@8.4.2(prettier@3.3.2)': + dependencies: + '@storybook/csf': 0.1.11 + better-opn: 3.0.2 + browser-assert: 1.2.1 + esbuild: 0.23.0 + esbuild-register: 3.6.0(esbuild@0.23.0) + jsdoc-type-pratt-parser: 4.1.0 + process: 0.11.10 + recast: 0.23.9 + semver: 7.6.3 + util: 0.12.5 + ws: 8.18.0 + optionalDependencies: + prettier: 3.3.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@storybook/csf-plugin@8.4.2(storybook@8.4.2(prettier@3.3.2))': + dependencies: + storybook: 8.4.2(prettier@3.3.2) + unplugin: 1.15.0 + transitivePeerDependencies: + - webpack-sources + + '@storybook/csf@0.1.11': + dependencies: + type-fest: 2.19.0 + + '@storybook/global@5.0.0': {} + + '@storybook/icons@1.2.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@storybook/instrumenter@8.4.2(storybook@8.4.2(prettier@3.3.2))': + dependencies: + '@storybook/global': 5.0.0 + '@vitest/utils': 2.1.4 + storybook: 8.4.2(prettier@3.3.2) + + '@storybook/manager-api@8.4.2(storybook@8.4.2(prettier@3.3.2))': + dependencies: + storybook: 8.4.2(prettier@3.3.2) + + '@storybook/preview-api@8.4.2(storybook@8.4.2(prettier@3.3.2))': + dependencies: + storybook: 8.4.2(prettier@3.3.2) + + '@storybook/react-dom-shim@8.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.2(prettier@3.3.2))': + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + storybook: 8.4.2(prettier@3.3.2) + + '@storybook/react-vite@8.4.2(@storybook/test@8.4.2(storybook@8.4.2(prettier@3.3.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.24.0)(storybook@8.4.2(prettier@3.3.2))(typescript@5.5.3)(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1))': + dependencies: + '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.0(typescript@5.5.3)(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1)) + '@rollup/pluginutils': 5.1.0(rollup@4.24.0) + '@storybook/builder-vite': 8.4.2(storybook@8.4.2(prettier@3.3.2))(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1)) + '@storybook/react': 8.4.2(@storybook/test@8.4.2(storybook@8.4.2(prettier@3.3.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.2(prettier@3.3.2))(typescript@5.5.3) + find-up: 5.0.0 + magic-string: 0.30.11 + react: 18.3.1 + react-docgen: 7.1.0 + react-dom: 18.3.1(react@18.3.1) + resolve: 1.22.8 + storybook: 8.4.2(prettier@3.3.2) + tsconfig-paths: 4.2.0 + vite: 5.4.10(@types/node@22.9.0)(lightningcss@1.25.1) + transitivePeerDependencies: + - '@storybook/test' + - rollup + - supports-color + - typescript + - webpack-sources + + '@storybook/react@8.4.2(@storybook/test@8.4.2(storybook@8.4.2(prettier@3.3.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.2(prettier@3.3.2))(typescript@5.5.3)': + dependencies: + '@storybook/components': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + '@storybook/global': 5.0.0 + '@storybook/manager-api': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + '@storybook/preview-api': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + '@storybook/react-dom-shim': 8.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.2(prettier@3.3.2)) + '@storybook/theming': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + storybook: 8.4.2(prettier@3.3.2) + optionalDependencies: + '@storybook/test': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + typescript: 5.5.3 + + '@storybook/test@8.4.2(storybook@8.4.2(prettier@3.3.2))': + dependencies: + '@storybook/csf': 0.1.11 + '@storybook/global': 5.0.0 + '@storybook/instrumenter': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + '@testing-library/dom': 10.4.0 + '@testing-library/jest-dom': 6.5.0 + '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) + '@vitest/expect': 2.0.5 + '@vitest/spy': 2.0.5 + storybook: 8.4.2(prettier@3.3.2) + + '@storybook/theming@8.4.2(storybook@8.4.2(prettier@3.3.2))': + dependencies: + storybook: 8.4.2(prettier@3.3.2) + + '@storybook/vue3-vite@8.4.2(storybook@8.4.2(prettier@3.3.2))(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1))(vue@3.5.2(typescript@5.5.3))': + dependencies: + '@storybook/builder-vite': 8.4.2(storybook@8.4.2(prettier@3.3.2))(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1)) + '@storybook/vue3': 8.4.2(storybook@8.4.2(prettier@3.3.2))(vue@3.5.2(typescript@5.5.3)) + find-package-json: 1.2.0 + magic-string: 0.30.11 + storybook: 8.4.2(prettier@3.3.2) + typescript: 5.5.3 + vite: 5.4.10(@types/node@22.9.0)(lightningcss@1.25.1) + vue-component-meta: 2.1.10(typescript@5.5.3) + vue-docgen-api: 4.79.2(vue@3.5.2(typescript@5.5.3)) + transitivePeerDependencies: + - vue + - webpack-sources + + '@storybook/vue3@8.4.2(storybook@8.4.2(prettier@3.3.2))(vue@3.5.2(typescript@5.5.3))': + dependencies: + '@storybook/components': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + '@storybook/global': 5.0.0 + '@storybook/manager-api': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + '@storybook/preview-api': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + '@storybook/theming': 8.4.2(storybook@8.4.2(prettier@3.3.2)) + '@vue/compiler-core': 3.5.2 + storybook: 8.4.2(prettier@3.3.2) + ts-dedent: 2.2.0 + type-fest: 2.19.0 + vue: 3.5.2(typescript@5.5.3) + vue-component-type-helpers: 2.1.10 + '@stripe/react-stripe-js@2.7.2(@stripe/stripe-js@3.5.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@stripe/stripe-js': 3.5.0 @@ -9940,10 +10892,37 @@ snapshots: vue: 3.5.2(typescript@5.5.3) vue-demi: 0.14.10(vue@3.5.2(typescript@5.5.3)) + '@testing-library/dom@10.4.0': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/runtime': 7.24.7 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + + '@testing-library/jest-dom@6.5.0': + dependencies: + '@adobe/css-tools': 4.4.0 + aria-query: 5.3.2 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + lodash: 4.17.21 + redent: 3.0.0 + + '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)': + dependencies: + '@testing-library/dom': 10.4.0 + '@tootallnate/once@2.0.0': {} '@tsconfig/node20@20.1.4': {} + '@types/aria-query@5.0.4': {} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.25.6 @@ -10099,6 +11078,8 @@ snapshots: dependencies: '@types/ms': 0.7.34 + '@types/doctrine@0.0.9': {} + '@types/eslint@8.56.10': dependencies: '@types/estree': 1.0.6 @@ -10115,6 +11096,11 @@ snapshots: '@types/geojson@7946.0.14': {} + '@types/glob@7.2.0': + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 22.9.0 + '@types/hammerjs@2.0.45': {} '@types/hash-sum@1.0.2': {} @@ -10146,8 +11132,12 @@ snapshots: '@types/mdurl@2.0.0': {} + '@types/mdx@2.0.13': {} + '@types/mime-types@2.1.4': {} + '@types/minimatch@5.1.2': {} + '@types/ms@0.7.34': {} '@types/node-fetch@2.6.4': @@ -10188,6 +11178,8 @@ snapshots: '@types/prop-types': 15.7.12 csstype: 3.1.3 + '@types/resolve@1.20.6': {} + '@types/responselike@1.0.3': dependencies: '@types/node': 22.9.0 @@ -10213,6 +11205,8 @@ snapshots: '@types/tough-cookie@4.0.5': {} + '@types/uuid@9.0.8': {} + '@types/validator@13.12.0': {} '@types/verror@1.10.10': @@ -10359,6 +11353,21 @@ snapshots: '@vitest/utils': 1.6.0 chai: 4.4.1 + '@vitest/expect@2.0.5': + dependencies: + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 + chai: 5.1.2 + tinyrainbow: 1.2.0 + + '@vitest/pretty-format@2.0.5': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/pretty-format@2.1.4': + dependencies: + tinyrainbow: 1.2.0 + '@vitest/runner@1.6.0': dependencies: '@vitest/utils': 1.6.0 @@ -10375,6 +11384,10 @@ snapshots: dependencies: tinyspy: 2.2.1 + '@vitest/spy@2.0.5': + dependencies: + tinyspy: 3.0.2 + '@vitest/utils@1.6.0': dependencies: diff-sequences: 29.6.3 @@ -10382,18 +11395,43 @@ snapshots: loupe: 2.3.7 pretty-format: 29.7.0 + '@vitest/utils@2.0.5': + dependencies: + '@vitest/pretty-format': 2.0.5 + estree-walker: 3.0.3 + loupe: 3.1.2 + tinyrainbow: 1.2.0 + + '@vitest/utils@2.1.4': + dependencies: + '@vitest/pretty-format': 2.1.4 + loupe: 3.1.2 + tinyrainbow: 1.2.0 + '@volar/language-core@2.4.0-alpha.12': dependencies: '@volar/source-map': 2.4.0-alpha.12 + '@volar/language-core@2.4.10': + dependencies: + '@volar/source-map': 2.4.10 + '@volar/source-map@2.4.0-alpha.12': {} + '@volar/source-map@2.4.10': {} + '@volar/typescript@2.4.0-alpha.12': dependencies: '@volar/language-core': 2.4.0-alpha.12 path-browserify: 1.0.1 vscode-uri: 3.0.8 + '@volar/typescript@2.4.10': + dependencies: + '@volar/language-core': 2.4.10 + path-browserify: 1.0.1 + vscode-uri: 3.0.8 + '@vue/babel-helper-vue-transform-on@1.2.2': {} '@vue/babel-plugin-jsx@1.2.2(@babel/core@7.25.2)': @@ -10453,12 +11491,17 @@ snapshots: '@vue/compiler-dom': 3.5.2 '@vue/shared': 3.5.2 + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + '@vue/devtools-api@6.6.3': {} - '@vue/devtools-core@7.6.3(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1))(vue@3.5.2(typescript@5.5.3))': + '@vue/devtools-core@7.6.4(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1))(vue@3.5.2(typescript@5.5.3))': dependencies: - '@vue/devtools-kit': 7.6.3 - '@vue/devtools-shared': 7.6.3 + '@vue/devtools-kit': 7.6.4 + '@vue/devtools-shared': 7.6.4 mitt: 3.0.1 nanoid: 3.3.7 pathe: 1.1.2 @@ -10467,9 +11510,9 @@ snapshots: transitivePeerDependencies: - vite - '@vue/devtools-kit@7.6.3': + '@vue/devtools-kit@7.6.4': dependencies: - '@vue/devtools-shared': 7.6.3 + '@vue/devtools-shared': 7.6.4 birpc: 0.2.19 hookable: 5.5.3 mitt: 3.0.1 @@ -10477,7 +11520,7 @@ snapshots: speakingurl: 14.0.1 superjson: 2.2.1 - '@vue/devtools-shared@7.6.3': + '@vue/devtools-shared@7.6.4': dependencies: rfdc: 1.4.1 @@ -10508,6 +11551,19 @@ snapshots: optionalDependencies: typescript: 5.5.3 + '@vue/language-core@2.1.10(typescript@5.5.3)': + dependencies: + '@volar/language-core': 2.4.10 + '@vue/compiler-dom': 3.5.2 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.2 + alien-signals: 0.2.0 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.5.3 + '@vue/reactivity@3.5.2': dependencies: '@vue/shared': 3.5.2 @@ -10596,8 +11652,12 @@ snapshots: dependencies: acorn: 8.12.0 + acorn@7.4.1: {} + acorn@8.12.0: {} + acorn@8.14.0: {} + ag-charts-community@9.3.2: {} ag-grid-community@31.3.4: {} @@ -10644,6 +11704,8 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 + alien-signals@0.2.0: {} + amazon-cognito-identity-js@6.3.6: dependencies: '@aws-crypto/sha256-js': 1.2.2 @@ -10759,6 +11821,12 @@ snapshots: argparse@2.0.1: {} + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + aria-query@5.3.2: {} + array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 @@ -10817,14 +11885,24 @@ snapshots: arrify@1.0.1: {} + asap@2.0.6: {} + asn1@0.2.6: dependencies: safer-buffer: 2.1.2 + assert-never@1.3.0: {} + assert-plus@1.0.0: {} assertion-error@1.1.0: {} + assertion-error@2.0.1: {} + + ast-types@0.16.1: + dependencies: + tslib: 2.6.3 + astral-regex@2.0.0: optional: true @@ -10852,6 +11930,14 @@ snapshots: dependencies: '@babel/types': 7.25.6 + babel-plugin-react-compiler@19.0.0-beta-a7bf2bd-20241110: + dependencies: + '@babel/types': 7.25.6 + + babel-walk@3.0.0-canary-5: + dependencies: + '@babel/types': 7.25.6 + balanced-match@1.0.2: {} base64-js@1.5.1: {} @@ -10860,6 +11946,10 @@ snapshots: dependencies: tweetnacl: 0.14.5 + better-opn@3.0.2: + dependencies: + open: 8.4.2 + bignumber.js@2.4.0: {} binary-extensions@2.3.0: {} @@ -10921,6 +12011,8 @@ snapshots: dependencies: fill-range: 7.0.1 + browser-assert@1.2.1: {} + browserslist@4.23.3: dependencies: caniuse-lite: 1.0.30001658 @@ -11045,12 +12137,25 @@ snapshots: pathval: 1.1.1 type-detect: 4.0.8 + chai@5.1.2: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.2 + pathval: 2.0.0 + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 + chalk@3.0.0: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -11075,10 +12180,16 @@ snapshots: char-regex@2.0.1: {} + character-parser@2.2.0: + dependencies: + is-regex: 1.1.4 + check-error@1.0.3: dependencies: get-func-name: 2.0.2 + check-error@2.1.1: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -11095,6 +12206,8 @@ snapshots: chownr@2.0.0: {} + chromatic@11.18.1: {} + chromium-pickle-js@0.2.0: {} ci-info@3.9.0: {} @@ -11217,6 +12330,11 @@ snapshots: tslib: 2.6.3 upper-case: 2.0.2 + constantinople@4.0.1: + dependencies: + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 + content-type@1.0.5: {} convert-source-map@2.0.0: {} @@ -11499,6 +12617,8 @@ snapshots: dependencies: type-detect: 4.0.8 + deep-eql@5.0.2: {} + deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -11524,6 +12644,8 @@ snapshots: es-errors: 1.3.0 gopd: 1.0.1 + define-lazy-prop@2.0.0: {} + define-lazy-prop@3.0.0: {} define-properties@1.2.1: @@ -11542,6 +12664,8 @@ snapshots: depd@2.0.0: {} + dequal@2.0.3: {} + destroy@1.2.0: {} detect-libc@1.0.3: @@ -11600,6 +12724,16 @@ snapshots: dependencies: esutils: 2.0.3 + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + doctypes@1.1.0: {} + + dom-accessibility-api@0.5.16: {} + + dom-accessibility-api@0.6.3: {} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -11842,6 +12976,13 @@ snapshots: esbuild-plugin-wasm@1.1.0: {} + esbuild-register@3.6.0(esbuild@0.23.0): + dependencies: + debug: 4.3.7 + esbuild: 0.23.0 + transitivePeerDependencies: + - supports-color + esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -12043,6 +13184,8 @@ snapshots: transitivePeerDependencies: - supports-color + esm-resolve@1.0.11: {} + espree@10.2.0: dependencies: acorn: 8.12.0 @@ -12159,6 +13302,8 @@ snapshots: dependencies: minimatch: 5.1.6 + filesize@10.1.6: {} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 @@ -12175,6 +13320,8 @@ snapshots: transitivePeerDependencies: - supports-color + find-package-json@1.2.0: {} + find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -12341,6 +13488,11 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-promise@4.2.2(glob@7.2.3): + dependencies: + '@types/glob': 7.2.0 + glob: 7.2.3 + glob@10.4.2: dependencies: foreground-child: 3.2.1 @@ -12646,6 +13798,8 @@ snapshots: fs-extra: 7.0.1 minimist: 1.2.8 + indent-string@4.0.0: {} + inflight@1.0.6: dependencies: once: 1.4.0 @@ -12679,6 +13833,11 @@ snapshots: ip-regex@1.0.3: {} + is-arguments@1.1.1: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 @@ -12723,8 +13882,15 @@ snapshots: dependencies: has-tostringtag: 1.0.2 + is-docker@2.2.1: {} + is-docker@3.0.0: {} + is-expression@4.0.0: + dependencies: + acorn: 7.4.1 + object-assign: 4.1.1 + is-extendable@0.1.1: {} is-extglob@2.1.1: {} @@ -12763,6 +13929,8 @@ snapshots: is-potential-custom-element-name@1.0.1: {} + is-promise@2.2.2: {} + is-regex@1.1.4: dependencies: call-bind: 1.0.7 @@ -12805,6 +13973,10 @@ snapshots: is-what@4.1.16: {} + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + is-wsl@3.1.0: dependencies: is-inside-container: 1.0.0 @@ -12932,6 +14104,8 @@ snapshots: dependencies: easy-stack: 1.0.1 + js-stringify@1.0.2: {} + js-tokens@4.0.0: {} js-tokens@9.0.0: {} @@ -13025,6 +14199,11 @@ snapshots: json-schema: 0.4.0 verror: 1.10.0 + jstransformer@1.0.0: + dependencies: + is-promise: 2.2.2 + promise: 7.3.1 + jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.8 @@ -13235,6 +14414,8 @@ snapshots: dependencies: get-func-name: 2.0.2 + loupe@3.1.2: {} + lower-case@2.0.2: dependencies: tslib: 2.6.3 @@ -13253,9 +14434,17 @@ snapshots: dependencies: yallist: 4.0.0 + lru-cache@8.0.5: {} + ltgt@2.2.1: optional: true + lz-string@1.5.0: {} + + magic-string@0.27.0: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.11: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -13270,6 +14459,8 @@ snapshots: dependencies: semver: 7.6.3 + map-or-similar@1.5.0: {} + markdown-it-anchor@8.6.7(@types/markdown-it@12.2.3)(markdown-it@12.3.2): dependencies: '@types/markdown-it': 12.2.3 @@ -13300,6 +14491,10 @@ snapshots: media-typer@0.3.0: {} + memoizerific@1.11.3: + dependencies: + map-or-similar: 1.5.0 + memorystream@0.3.1: {} merge-stream@2.0.0: {} @@ -13331,6 +14526,8 @@ snapshots: dependencies: dom-walk: 0.1.2 + min-indent@1.0.1: {} + minimatch@10.0.1: dependencies: brace-expansion: 2.0.1 @@ -13569,6 +14766,12 @@ snapshots: is-inside-container: 1.0.0 is-wsl: 3.1.0 + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + opener@1.5.2: {} optionator@0.9.4: @@ -13684,6 +14887,8 @@ snapshots: pathval@1.1.1: {} + pathval@2.0.0: {} + pend@1.2.0: {} perfect-debounce@1.0.0: {} @@ -13736,6 +14941,10 @@ snapshots: pngjs@3.4.0: {} + polished@4.3.1: + dependencies: + '@babel/runtime': 7.24.7 + portfinder@1.0.32: dependencies: async: 2.6.4 @@ -13835,6 +15044,12 @@ snapshots: prettier@3.3.2: {} + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 @@ -13852,6 +15067,10 @@ snapshots: err-code: 2.0.3 retry: 0.12.0 + promise@7.3.1: + dependencies: + asap: 2.0.6 + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -13865,6 +15084,73 @@ snapshots: psl@1.9.0: {} + pug-attrs@3.0.0: + dependencies: + constantinople: 4.0.1 + js-stringify: 1.0.2 + pug-runtime: 3.0.1 + + pug-code-gen@3.0.3: + dependencies: + constantinople: 4.0.1 + doctypes: 1.1.0 + js-stringify: 1.0.2 + pug-attrs: 3.0.0 + pug-error: 2.1.0 + pug-runtime: 3.0.1 + void-elements: 3.1.0 + with: 7.0.2 + + pug-error@2.1.0: {} + + pug-filters@4.0.0: + dependencies: + constantinople: 4.0.1 + jstransformer: 1.0.0 + pug-error: 2.1.0 + pug-walk: 2.0.0 + resolve: 1.22.8 + + pug-lexer@5.0.1: + dependencies: + character-parser: 2.2.0 + is-expression: 4.0.0 + pug-error: 2.1.0 + + pug-linker@4.0.0: + dependencies: + pug-error: 2.1.0 + pug-walk: 2.0.0 + + pug-load@3.0.0: + dependencies: + object-assign: 4.1.1 + pug-walk: 2.0.0 + + pug-parser@6.0.0: + dependencies: + pug-error: 2.1.0 + token-stream: 1.0.0 + + pug-runtime@3.0.1: {} + + pug-strip-comments@2.0.0: + dependencies: + pug-error: 2.1.0 + + pug-walk@2.0.0: {} + + pug@3.0.3: + dependencies: + pug-code-gen: 3.0.3 + pug-filters: 4.0.0 + pug-lexer: 5.0.1 + pug-linker: 4.0.0 + pug-load: 3.0.0 + pug-parser: 6.0.0 + pug-runtime: 3.0.1 + pug-strip-comments: 2.0.0 + pump@3.0.0: dependencies: end-of-stream: 1.4.4 @@ -13996,10 +15282,34 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-compiler-runtime@19.0.0-beta-6fc168f-20241025(react@18.3.1): + react-compiler-runtime@19.0.0-beta-a7bf2bd-20241110(react@18.3.1): dependencies: react: 18.3.1 + react-confetti@6.1.0(react@18.3.1): + dependencies: + react: 18.3.1 + tween-functions: 1.2.0 + + react-docgen-typescript@2.2.2(typescript@5.5.3): + dependencies: + typescript: 5.5.3 + + react-docgen@7.1.0: + dependencies: + '@babel/core': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.6 + '@types/doctrine': 0.0.9 + '@types/resolve': 1.20.6 + doctrine: 3.0.0 + resolve: 1.22.8 + strip-indent: 4.0.0 + transitivePeerDependencies: + - supports-color + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 @@ -14017,6 +15327,8 @@ snapshots: react-is@16.13.1: {} + react-is@17.0.2: {} + react-is@18.3.1: {} react-refresh@0.14.2: {} @@ -14115,6 +15427,19 @@ snapshots: dependencies: picomatch: 2.3.1 + recast@0.23.9: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.6.3 + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + reflect.getprototypeof@1.0.6: dependencies: call-bind: 1.0.7 @@ -14495,6 +15820,16 @@ snapshots: std-env@3.7.0: {} + storybook@8.4.2(prettier@3.3.2): + dependencies: + '@storybook/core': 8.4.2(prettier@3.3.2) + optionalDependencies: + prettier: 3.3.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + stream-to-buffer@0.1.0: dependencies: stream-to: 0.2.2 @@ -14588,6 +15923,14 @@ snapshots: strip-final-newline@3.0.0: {} + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-indent@4.0.0: + dependencies: + min-indent: 1.0.1 + strip-json-comments@2.0.1: {} strip-json-comments@3.1.1: {} @@ -14738,6 +16081,8 @@ snapshots: tinyspy@2.2.1: {} + tinyspy@3.0.2: {} + tmp-promise@3.0.3: dependencies: tmp: 0.2.3 @@ -14760,6 +16105,8 @@ snapshots: toidentifier@1.0.1: {} + token-stream@1.0.0: {} + tosource@2.0.0-alpha.3: {} totalist@3.0.1: {} @@ -14790,10 +16137,20 @@ snapshots: dependencies: typescript: 5.5.3 + ts-dedent@2.2.0: {} + ts-interface-checker@0.1.13: {} + ts-map@1.0.3: {} + ts-results@3.3.0: {} + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + tslib@2.6.3: {} tsx@4.16.0: @@ -14807,6 +16164,8 @@ snapshots: dependencies: safe-buffer: 5.2.1 + tween-functions@1.2.0: {} + tweetnacl@0.14.5: {} type-check@0.4.0: @@ -14820,6 +16179,8 @@ snapshots: type-fest@0.20.2: {} + type-fest@2.19.0: {} + type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -14900,6 +16261,11 @@ snapshots: unpipe@1.0.0: {} + unplugin@1.15.0: + dependencies: + acorn: 8.14.0 + webpack-virtual-modules: 0.6.2 + upath@2.0.1: {} update-browserslist-db@1.1.0(browserslist@4.23.3): @@ -14951,10 +16317,20 @@ snapshots: util-deprecate@1.0.2: {} + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.13 + which-typed-array: 1.1.15 + utils-merge@1.0.1: {} uuid@3.4.0: {} + uuid@9.0.1: {} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -15059,9 +16435,9 @@ snapshots: vite-plugin-vue-devtools@7.6.3(rollup@4.24.0)(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1))(vue@3.5.2(typescript@5.5.3)): dependencies: - '@vue/devtools-core': 7.6.3(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1))(vue@3.5.2(typescript@5.5.3)) - '@vue/devtools-kit': 7.6.3 - '@vue/devtools-shared': 7.6.3 + '@vue/devtools-core': 7.6.4(vite@5.4.10(@types/node@22.9.0)(lightningcss@1.25.1))(vue@3.5.2(typescript@5.5.3)) + '@vue/devtools-kit': 7.6.4 + '@vue/devtools-shared': 7.6.4 execa: 8.0.1 sirv: 3.0.0 vite: 5.4.10(@types/node@22.9.0)(lightningcss@1.25.1) @@ -15137,14 +16513,43 @@ snapshots: - supports-color - terser + void-elements@3.1.0: {} + vscode-uri@3.0.8: {} + vue-component-meta@2.1.10(typescript@5.5.3): + dependencies: + '@volar/typescript': 2.4.10 + '@vue/language-core': 2.1.10(typescript@5.5.3) + path-browserify: 1.0.1 + vue-component-type-helpers: 2.1.10 + optionalDependencies: + typescript: 5.5.3 + vue-component-type-helpers@2.0.29: {} + vue-component-type-helpers@2.1.10: {} + vue-demi@0.14.10(vue@3.5.2(typescript@5.5.3)): dependencies: vue: 3.5.2(typescript@5.5.3) + vue-docgen-api@4.79.2(vue@3.5.2(typescript@5.5.3)): + dependencies: + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 + '@vue/compiler-dom': 3.5.2 + '@vue/compiler-sfc': 3.5.2 + ast-types: 0.16.1 + esm-resolve: 1.0.11 + hash-sum: 2.0.0 + lru-cache: 8.0.5 + pug: 3.0.3 + recast: 0.23.9 + ts-map: 1.0.3 + vue: 3.5.2(typescript@5.5.3) + vue-inbrowser-compiler-independent-utils: 4.71.1(vue@3.5.2(typescript@5.5.3)) + vue-eslint-parser@9.4.3(eslint@9.13.0(jiti@1.21.6)): dependencies: debug: 4.3.7 @@ -15158,6 +16563,10 @@ snapshots: transitivePeerDependencies: - supports-color + vue-inbrowser-compiler-independent-utils@4.71.1(vue@3.5.2(typescript@5.5.3)): + dependencies: + vue: 3.5.2(typescript@5.5.3) + vue-react-wrapper@0.3.1(vue@3.5.2(typescript@5.5.3)): dependencies: '@types/prop-types': 15.7.12 @@ -15205,6 +16614,8 @@ snapshots: webidl-conversions@7.0.0: {} + webpack-virtual-modules@0.6.2: {} + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 @@ -15274,6 +16685,13 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + with@7.0.2: + dependencies: + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 + assert-never: 1.3.0 + babel-walk: 3.0.0-canary-5 + word-wrap@1.2.5: {} wrap-ansi@7.0.0: From 6b758a0938eda1a6855d69b5bb747a6c58d92fcf Mon Sep 17 00:00:00 2001 From: Ilya Bogdanov Date: Thu, 21 Nov 2024 15:26:50 +0400 Subject: [PATCH 2/2] Fix auto-scrolling and increase permitted dropdown width (#11608) I think the date format dropdown is absurdly wide, but we discussed it yesterday. Auto-scrolling is fixed, so it would work with wider inputs. image --- .../components/GraphEditor/widgets/WidgetSelection.vue | 2 +- app/gui/src/project-view/components/widgets/DropdownWidget.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/gui/src/project-view/components/GraphEditor/widgets/WidgetSelection.vue b/app/gui/src/project-view/components/GraphEditor/widgets/WidgetSelection.vue index a0abfd166d..4391e3c43f 100644 --- a/app/gui/src/project-view/components/GraphEditor/widgets/WidgetSelection.vue +++ b/app/gui/src/project-view/components/GraphEditor/widgets/WidgetSelection.vue @@ -49,7 +49,7 @@ const activity = shallowRef() // How much wider a dropdown can be than a port it is attached to, when a long text is present. // Any text beyond that limit will receive an ellipsis and sliding animation on hover. -const MAX_DROPDOWN_OVERSIZE_PX = 150 +const MAX_DROPDOWN_OVERSIZE_PX = 390 const floatReference = computed( () => enclosingTopLevelArgument(widgetRoot.value, tree) ?? widgetRoot.value, diff --git a/app/gui/src/project-view/components/widgets/DropdownWidget.vue b/app/gui/src/project-view/components/widgets/DropdownWidget.vue index feb93547f9..786d5f5ba3 100644 --- a/app/gui/src/project-view/components/widgets/DropdownWidget.vue +++ b/app/gui/src/project-view/components/widgets/DropdownWidget.vue @@ -148,7 +148,7 @@ export interface DropdownEntry { &:hover { background-color: color-mix(in oklab, var(--dropdown-bg) 50%, white 50%); - span { + .itemContent { --text-scroll-max: calc(var(--dropdown-max-width) - 28px); will-change: transform; animation: 6s 1s infinite text-scroll;