From a8e8f2ca5c4ff45edc0d6bcfc72639624447236a Mon Sep 17 00:00:00 2001 From: RisingOrange Date: Mon, 20 Apr 2026 13:14:28 +0200 Subject: [PATCH 01/23] Add per-PR visual diff via Playwright + Chromatic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Captures HTML+asset archives of 15 key routes × 2 viewports on each PR and uploads to Chromatic for server-side rendering and diffing against baseline. Posts a non-blocking "UI Review" check on the PR. - Routes auto-discovered from src/routes/, plus 5 markdown-post representatives; form/admin/content-churn routes explicitly excluded with WHY comments - Deterministic snapshots: /api/news mocked with a fixture, Tally iframes on /statement and /join aborted to avoid async-height churn - Chromium-only, non-blocking by design (exitZeroOnChanges) - Fork PRs supported via plaintext project token in the workflow (Chromatic's recommended pattern) - Playwright report (per-route screenshots) uploaded as GHA artifact --- .github/workflows/visual-diff.yml | 75 ++ .gitignore | 9 + package.json | 2 + playwright.config.ts | 36 + pnpm-lock.yaml | 950 +++++++++++++++++++++- src/posts/action.md | 2 + src/posts/funding.md | 2 + src/posts/if-anyone-builds-it-campaign.md | 2 + src/posts/join.md | 2 + src/posts/learn.md | 2 + src/posts/values.md | 2 + src/routes/chat/+page.svelte | 1 - src/routes/posts/+page.svelte | 1 + src/routes/quotes/+page.svelte | 1 + src/routes/submitted/+page.svelte | 1 + src/routes/verify/+page.svelte | 1 + tests/visual/fixtures/news.json | 53 ++ tests/visual/routes.ts | 93 +++ tests/visual/smoke.spec.ts | 57 ++ tsconfig.check.json | 2 + 20 files changed, 1284 insertions(+), 10 deletions(-) create mode 100644 .github/workflows/visual-diff.yml create mode 100644 playwright.config.ts create mode 100644 tests/visual/fixtures/news.json create mode 100644 tests/visual/routes.ts create mode 100644 tests/visual/smoke.spec.ts diff --git a/.github/workflows/visual-diff.yml b/.github/workflows/visual-diff.yml new file mode 100644 index 000000000..b1eeb0843 --- /dev/null +++ b/.github/workflows/visual-diff.yml @@ -0,0 +1,75 @@ +name: Visual diff (Chromatic) + +on: + push: + branches: + - main + pull_request: + +permissions: + contents: read + +concurrency: + group: visual-diff-${{ github.ref }} + cancel-in-progress: true + +jobs: + chromatic: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + - uses: pnpm/action-setup@v5 + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version-file: '.nvmrc' + cache: 'pnpm' + - name: Copy environment file + run: cp template.env .env + - name: Install dependencies + run: pnpm install --frozen-lockfile + - name: Cache imagetools transforms + uses: actions/cache@v4 + with: + path: node_modules/.cache/imagetools + key: imagetools-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'vite.config.ts', 'src/**/*.{png,jpg,jpeg,webp,avif,svg}', 'static/**/*.{png,jpg,jpeg,webp,avif,svg}') }} + restore-keys: | + imagetools-${{ runner.os }}- + - name: Cache Playwright browsers + id: playwright-cache + uses: actions/cache@v4 + with: + path: ~/.cache/ms-playwright + key: playwright-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }} + restore-keys: | + playwright-${{ runner.os }}- + - name: Install Playwright (browser + deps on cache miss) + if: steps.playwright-cache.outputs.cache-hit != 'true' + run: pnpm exec playwright install --with-deps chromium + - name: Install Playwright system deps (cache hit) + if: steps.playwright-cache.outputs.cache-hit == 'true' + run: pnpm exec playwright install-deps chromium + - name: Run Playwright tests + run: pnpm exec playwright test + - name: Upload Playwright report + if: always() + uses: actions/upload-artifact@v4 + with: + name: playwright-report + path: playwright-report/ + retention-days: 14 + - name: Publish to Chromatic + # Inlined plaintext token — Chromatic's own recommended pattern for fork-PR + # support (forks can't read repo secrets). The token is a project-scoped + # write credential (anyone with it can run builds and consume snapshot + # quota for this project), rotatable from the Chromatic UI. See + # https://www.chromatic.com/docs/github-actions/ for the full rationale + # and any capability/scope details. + uses: chromaui/action@v16 + with: + playwright: true + projectToken: chpt_cefd614c783fb5c + exitZeroOnChanges: true + exitOnceUploaded: true diff --git a/.gitignore b/.gitignore index 054022cb1..806d93f30 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,12 @@ CLAUDE.md .env.sentry-build-plugin .prettierignore + +# Playwright +/test-results +/playwright-report + +# Chromatic (only produced by local CLI runs, not CI) +/build-archive.log +/chromatic.log +/chromatic-diagnostics.json diff --git a/package.json b/package.json index 66b704ec7..dbf990e2a 100644 --- a/package.json +++ b/package.json @@ -35,10 +35,12 @@ } }, "devDependencies": { + "@chromatic-com/playwright": "^0.13.1", "@eslint/js": "^10.0.1", "@eslint/markdown": "^8.0.1", "@inlang/paraglide-js": "^2.16.0", "@netlify/edge-functions": "^3.0.6", + "@playwright/test": "^1.59.1", "@sveltejs/adapter-netlify": "^5.2.4", "@sveltejs/kit": "^2.57.1", "@sveltejs/vite-plugin-svelte": "^7.0.0", diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 000000000..66fc6b3ab --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,36 @@ +import { defineConfig, devices } from '@playwright/test' + +export default defineConfig({ + testDir: 'tests/visual', + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 1 : 0, + reporter: [['list'], ['html', { open: 'never' }]], + use: { + baseURL: 'http://localhost:4173', + // Pin locale and timezone so any date / number formatting that depends + // on the browser context renders the same on every run. + locale: 'en-US', + timezoneId: 'UTC', + // Opts into the site's `@media (prefers-reduced-motion: reduce)` block + // (src/styles/reset.css), which zeros out animation and transition + // durations. Keeps snapshots from capturing mid-animation state without + // needing a custom style-injection in tests. + contextOptions: { reducedMotion: 'reduce' } + }, + projects: [ + { + name: 'desktop', + use: { ...devices['Desktop Chrome'], viewport: { width: 1280, height: 800 } } + }, + { + name: 'mobile', + use: { ...devices['Pixel 7'], viewport: { width: 412, height: 839 } } + } + ], + webServer: { + command: 'pnpm build && pnpm preview', + port: 4173, + timeout: 360_000, + reuseExistingServer: !process.env.CI + } +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 12490c154..f64d80f30 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -91,7 +91,7 @@ importers: version: 4.0.2 motion-sv: specifier: ^0.1.12 - version: 0.1.12(svelte@5.55.4) + version: 0.1.12(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(svelte@5.55.4) pagefind: specifier: ^1.5.2 version: 1.5.2 @@ -120,6 +120,9 @@ importers: specifier: ^1.0.41 version: 1.0.41 devDependencies: + '@chromatic-com/playwright': + specifier: ^0.13.1 + version: 0.13.1(@playwright/test@1.59.1)(@testing-library/dom@10.4.1)(prettier@3.8.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@eslint/js': specifier: ^10.0.1 version: 10.0.1(eslint@10.2.1(jiti@2.6.1)) @@ -132,6 +135,9 @@ importers: '@netlify/edge-functions': specifier: ^3.0.6 version: 3.0.6 + '@playwright/test': + specifier: ^1.59.1 + version: 1.59.1 '@sveltejs/adapter-netlify': specifier: ^5.2.4 version: 5.2.4(@sveltejs/kit@2.57.1(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@7.0.0(svelte@5.55.4)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)))(svelte@5.55.4)(typescript@5.9.3)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))) @@ -210,6 +216,9 @@ importers: minimist: specifier: ^1.2.8 version: 1.2.8 + msw: + specifier: ^2.13.5 + version: 2.13.5(@types/node@24.12.2)(typescript@5.9.3) npm-run-all2: specifier: ^8.0.4 version: 8.0.4 @@ -257,10 +266,13 @@ importers: version: 1.4.8(rollup@4.59.0)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) vitest: specifier: ^4.1.4 - version: 4.1.4(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.4(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(msw@2.13.5(@types/node@24.12.2)(typescript@5.9.3))(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) packages: + '@adobe/css-tools@4.4.4': + resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} + '@anthropic-ai/sdk@0.39.0': resolution: {integrity: sha512-eMyDIPRZbt1CCLErRCi3exlAvNkBtRe+kW5vvJyef93PmNr/clstYgHhtvmkxN82nlKgzyGPCyGxrm0JQ1ZIdg==} @@ -319,6 +331,10 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/runtime@7.29.2': + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + engines: {node: '>=6.9.0'} + '@babel/template@7.28.6': resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} @@ -331,6 +347,15 @@ packages: resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} + '@chromatic-com/playwright@0.13.1': + resolution: {integrity: sha512-IzR93Dd2Wv8EUI3LURai1IXa0TmWz76zecjgaf9UoSS+F9Mdz09x8PF1zoGm5Wt3D1uirV5eDzQjO6D8f2Ys4Q==} + hasBin: true + peerDependencies: + '@playwright/test': ^1.0.0 + + '@chromaui/rrweb-snapshot@2.0.0-alpha.18-noAbsolute': + resolution: {integrity: sha512-glB+dgHTLLiDS8ljwYDBb2EPNe/sPxz2uOWjm11PoDYmVw204VKzyq07jredeHs9nUocb47RyDcZWCa5Cbw3yw==} + '@emnapi/core@1.9.2': resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} @@ -904,6 +929,41 @@ packages: resolution: {integrity: sha512-y0C3xaKo6pSGDr3p5OdreRVT3THJpgKVe1lLvG3BE4v9lskp3UfI9cPCbN8X2dpfLt/4ljtehMb5SykpMfJrMg==} engines: {node: '>=20.0.0'} + '@inquirer/ansi@2.0.5': + resolution: {integrity: sha512-doc2sWgJpbFQ64UflSVd17ibMGDuxO1yKgOgLMwavzESnXjFWJqUeG8saYosqKpHp4kWiM5x1nXvEjbpx90gzw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + + '@inquirer/confirm@6.0.12': + resolution: {integrity: sha512-h9FgGun3QwVYNj5TWIZZ+slii73bMoBFjPfVIGtnFuL4t8gBiNDV9PcSfIzkuxvgquJKt9nr1QzszpBzTbH8Og==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@11.1.9': + resolution: {integrity: sha512-BDE4fG22uYh1bGSifcj7JSx119TVYNViMhMu85usp4Fswrzh6M0DV3yld64jA98uOAa2GSQ4Bg4bZRm2d2cwSg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@2.0.5': + resolution: {integrity: sha512-NsSs4kzfm12lNetHwAn3GEuH317IzpwrMCbOuMIVytpjnJ90YYHNwdRgYGuKmVxwuIqSgqk3M5qqQt1cDk0tGQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + + '@inquirer/type@4.0.5': + resolution: {integrity: sha512-aetVUNeKNc/VriqXlw1NRSW0zhMBB0W4bNbWRJgzRl/3d0QNDQFfk0GO5SDdtjMZVg6o8ZKEiadd7SCCzoOn5Q==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -933,6 +993,14 @@ packages: '@lix-js/server-protocol-schema@0.1.1': resolution: {integrity: sha512-jBeALB6prAbtr5q4vTuxnRZZv1M2rKe8iNqRQhFJ4Tv7150unEa0vKyz0hs8Gl3fUGsWaNJBh3J8++fpbrpRBQ==} + '@lukeed/csprng@1.1.0': + resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} + engines: {node: '>=8'} + + '@lukeed/uuid@2.0.1': + resolution: {integrity: sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==} + engines: {node: '>=8'} + '@mapbox/jsonlint-lines-primitives@2.0.2': resolution: {integrity: sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==} engines: {node: '>= 0.6'} @@ -969,6 +1037,16 @@ packages: '@maplibre/vt-pbf@4.3.0': resolution: {integrity: sha512-jIvp8F5hQCcreqOOpEt42TJMUlsrEcpf/kI1T2v85YrQRV6PPXUcEXUg5karKtH6oh47XJZ4kHu56pUkOuqA7w==} + '@mswjs/interceptors@0.41.5': + resolution: {integrity: sha512-Fa2HztoLlZxRN6wVC2KB7q0SvRTKjfP0328NVnSit03+0nzm62syxyT46KGbgq3Vr1A/mmLeQwu3GprB0lNTjw==} + engines: {node: '>=18'} + + '@napi-rs/wasm-runtime@1.1.3': + resolution: {integrity: sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + '@napi-rs/wasm-runtime@1.1.4': resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} peerDependencies: @@ -1004,6 +1082,18 @@ packages: peerDependencies: svelte: ^4 || ^5 + '@open-draft/deferred-promise@2.2.0': + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + + '@open-draft/deferred-promise@3.0.0': + resolution: {integrity: sha512-XW375UK8/9SqUVNVa6M0yEy8+iTi4QN5VZ7aZuRFQmy76LRwI9wy5F4YIBU6T+eTe2/DNDo8tqu8RHlwLHM6RA==} + + '@open-draft/logger@0.3.0': + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + + '@open-draft/until@2.1.0': + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + '@opentelemetry/api@1.9.1': resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} engines: {node: '>=8.0.0'} @@ -1287,6 +1377,11 @@ packages: cpu: [x64] os: [win32] + '@playwright/test@1.59.1': + resolution: {integrity: sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==} + engines: {node: '>=18'} + hasBin: true + '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} @@ -1545,6 +1640,16 @@ packages: cpu: [x64] os: [win32] + '@segment/analytics-core@1.7.0': + resolution: {integrity: sha512-0DHSriS/oAB/2bIgOMv3fFV9/ivp39ibdOTTf+dDOhf+vlciBv0+MHw47k/6PRobbuls27cKkKZAKc4DDC2+gw==} + + '@segment/analytics-generic-utils@1.2.0': + resolution: {integrity: sha512-DfnW6mW3YQOLlDQQdR89k4EqfHb0g/3XvBXkovH1FstUN93eL1kfW9CsDcVQyH3bAC5ZsFyjA/o/1Q2j0QeoWw==} + + '@segment/analytics-node@2.1.3': + resolution: {integrity: sha512-xwMkyXgr7xgPsP0w79nzCwRHYi9jzj9ps4Im7xWGK8AKKE4eox39tMZOdRtpDbvXQlrs9fh64ZC0w/yZZDM/9g==} + engines: {node: '>=18'} + '@sentry-internal/browser-utils@10.49.0': resolution: {integrity: sha512-n0QRx0Ysx6mPfIydTkz7VP0FmwM+/EqMZiRqdsU3aTYsngE9GmEDV0OL1bAy6a8N/C1xf9vntkuAtj6N/8Z51w==} engines: {node: '>=18'} @@ -1671,6 +1776,15 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@storybook/global@5.0.0': + resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + + '@storybook/icons@2.0.1': + resolution: {integrity: sha512-/smVjw88yK3CKsiuR71vNgWQ9+NuY2L+e8X7IMrFjexjm6ZR8ULrV2DRkTA61aV6ryefslzHEGDInGpnNeIocg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@sveltejs/acorn-typescript@1.0.9': resolution: {integrity: sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==} peerDependencies: @@ -1711,6 +1825,20 @@ packages: svelte: ^5.46.4 vite: ^8.0.0-beta.7 || ^8.0.0 + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} + + '@testing-library/jest-dom@6.9.1': + resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + + '@testing-library/user-event@14.6.1': + resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + '@turf/distance@7.3.4': resolution: {integrity: sha512-9drWgd46uHPPyzgrcRQLgSvdS/SjVlQ6ZIBoRQagS5P2kSjUbcOXHIMeOSPwfxwlKhEtobLyr+IiR2ns1TfF8w==} @@ -1723,6 +1851,9 @@ packages: '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -1789,6 +1920,12 @@ packages: '@types/remark-heading-id@1.0.0': resolution: {integrity: sha512-V6OgBN2Uv3kaYHOrBI2+j9xIo6N56bMpIFoKVkGltoJtzHr7Vo8pFxDZxNqUXC5NScV991Iq3BYD52BkCFMY+w==} + '@types/set-cookie-parser@2.4.10': + resolution: {integrity: sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==} + + '@types/statuses@2.0.6': + resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} + '@types/supercluster@7.1.3': resolution: {integrity: sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==} @@ -1873,6 +2010,9 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/expect@4.1.4': resolution: {integrity: sha512-iPBpra+VDuXmBFI3FMKHSFXp3Gx5HfmSCE8X67Dn+bwephCnQCaB7qWK2ldHa+8ncN8hJU8VTMcxjPpyMkUjww==} @@ -1887,6 +2027,9 @@ packages: vite: optional: true + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/pretty-format@4.1.4': resolution: {integrity: sha512-ddmDHU0gjEUyEVLxtZa7xamrpIefdEETu3nZjWtHeZX4QxqJ7tRxSteHVXJOcr8jhiLoGAhkK4WJ3WqBpjx42A==} @@ -1896,9 +2039,15 @@ packages: '@vitest/snapshot@4.1.4': resolution: {integrity: sha512-MCjCFgaS8aZz+m5nTcEcgk/xhWv0rEH4Yl53PPlMXOZ1/Ka2VcZU6CJ+MgYCZbcJvzGhQRjVrGQNZqkGPttIKw==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@4.1.4': resolution: {integrity: sha512-XxNdAsKW7C+FLydqFJLb5KhJtl3PGCMmYwFRfhvIgxJvLSXhhVI1zM8f1qD3Zg7RCjTSzDVyct6sghs9UEgBEQ==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/utils@4.1.4': resolution: {integrity: sha512-13QMT+eysM5uVGa1rG4kegGYNp6cnQcsTc67ELFbhNLQO+vgsygtYJx2khvdt4gVQqSSpC/KT5FZZxUpP3Oatw==} @@ -1954,10 +2103,17 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + aria-query@5.3.1: resolution: {integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==} engines: {node: '>= 0.4'} @@ -1969,6 +2125,10 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -1999,6 +2159,9 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.10.14: resolution: {integrity: sha512-fOVLPAsFTsQfuCkvahZkzq6nf8KvGWanlYoTh0SVA0A/PIUxQGU2AOZAoD95n2gFLVDW/jP6sbGLny95nmEuHA==} engines: {node: '>=6.0.0'} @@ -2023,6 +2186,13 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -2033,6 +2203,10 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} @@ -2048,6 +2222,10 @@ packages: character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} + engines: {node: '>= 16'} + chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -2060,9 +2238,17 @@ packages: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + clipboard-polyfill@4.1.1: resolution: {integrity: sha512-nbvNLrcX0zviek5QHLFRAaLrx8y/s8+RF2stH43tuS+kP5XlHMrcD0UGBWq43Hwp6WuuK7KefRMP56S45ibZkA==} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -2108,6 +2294,10 @@ packages: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + cross-env@7.0.3: resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} @@ -2117,6 +2307,9 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -2145,6 +2338,10 @@ packages: babel-plugin-macros: optional: true + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -2152,6 +2349,18 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.5.0: + resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} + engines: {node: '>=18'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -2170,6 +2379,12 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} @@ -2177,6 +2392,10 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -2190,6 +2409,9 @@ packages: emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} @@ -2372,6 +2594,15 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + + fast-wrap-ansi@0.2.0: + resolution: {integrity: sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==} + fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} @@ -2452,6 +2683,11 @@ packages: react-dom: optional: true + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2464,6 +2700,10 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.5.0: resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} engines: {node: '>=18'} @@ -2516,6 +2756,10 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + graphql@16.13.2: + resolution: {integrity: sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -2544,6 +2788,9 @@ packages: hast-util-whitespace@2.0.1: resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + headers-polyfill@5.0.1: + resolution: {integrity: sha512-1TJ6Fih/b8h5TIcv+1+Hw0PDQWJTKDKzFZzcKOiW1wJza3XoAQlkCuXLbymPYB8+ZQyw8mHvdw560e8zVFIWyA==} + hey-listen@1.0.8: resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} @@ -2573,6 +2820,9 @@ packages: engines: {node: '>=18'} hasBin: true + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -2589,6 +2839,10 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -2602,10 +2856,19 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + 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-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + is-fullwidth-code-point@4.0.0: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} engines: {node: '>=12'} @@ -2618,6 +2881,14 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -2641,6 +2912,10 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -2652,6 +2927,9 @@ packages: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true + jose@5.10.0: + resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} + js-sha256@0.11.1: resolution: {integrity: sha512-o6WSo/LUvY2uC4j7mO50a2ms7E/EAdbP0swigLV+nzHKTTaYnaLIWJ02VdXrsJX0vGedDESQnLsOekr94ryfjg==} @@ -2822,6 +3100,9 @@ packages: longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -2837,6 +3118,10 @@ packages: peerDependencies: svelte: ^3 || ^4 || ^5.0.0-next.42 + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -3026,6 +3311,10 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + minimatch@10.2.5: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} @@ -3063,9 +3352,23 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + msw@2.13.5: + resolution: {integrity: sha512-LuJem+CbqbywJtafv4zh5kcCQNmZnKwfJgJ/LcNYjeG3CU/xJLepJM1CNZcbp+oV8tXFGvUfswPGru34Mx7QGQ==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + typescript: '>= 4.8.x' + peerDependenciesMeta: + typescript: + optional: true + murmurhash-js@1.0.0: resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==} + mute-stream@3.0.0: + resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} + engines: {node: ^20.17.0 || >=22.9.0} + nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -3121,10 +3424,17 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + outvariant@1.4.3: + resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + oxc-parser@0.127.0: resolution: {integrity: sha512-bkgD4qHlN7WxLdX8bLXdaU54TtQtAIg/ZBAfm0aje/mo3MRDo3P0hZSgr4U7O3xfX+fQmR5AP04JS/TGcZLcFA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3168,9 +3478,16 @@ packages: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + pbf@4.0.1: resolution: {integrity: sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA==} hasBin: true @@ -3191,6 +3508,16 @@ packages: engines: {node: '>=0.10'} hasBin: true + playwright-core@1.59.1: + resolution: {integrity: sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.59.1: + resolution: {integrity: sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==} + engines: {node: '>=18'} + hasBin: true + postcss-load-config@3.1.4: resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} @@ -3241,6 +3568,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} + prism-svelte@0.4.7: resolution: {integrity: sha512-yABh19CYbM24V7aS7TuPYRNMqthxwbvx6FF/Rw920YbyBWO3tnyPIqRMgHuSVsLmuHkkBS1Akyof463FVdkeDQ==} @@ -3275,6 +3606,18 @@ packages: quickselect@3.0.0: resolution: {integrity: sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==} + react-dom@19.2.5: + resolution: {integrity: sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==} + peerDependencies: + react: ^19.2.5 + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react@19.2.5: + resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==} + engines: {node: '>=0.10.0'} + read-package-json-fast@4.0.0: resolution: {integrity: sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==} engines: {node: ^18.17.0 || >=20.5.0} @@ -3283,6 +3626,14 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + rehype-slug@5.1.0: resolution: {integrity: sha512-Gf91dJoXneiorNEnn+Phx97CO7oRMrpi+6r155tTxzGuLtm+QrI4cTwCa9e1rtePdL4i9tSO58PeSS6HWfgsiw==} @@ -3299,6 +3650,10 @@ packages: remove-markdown@0.5.5: resolution: {integrity: sha512-lMR8tOtDqazFT6W2bZidoXwkptMdF3pCxpri0AEokHg0sZlC2GdoLqnoaxsEj1o7/BtXV1MKtT3YviA1t7rW7g==} + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} @@ -3309,6 +3664,9 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} + rettime@0.11.8: + resolution: {integrity: sha512-0fERGXktJTyJ+h8fBEiPxHPEFOu0h15JY7JtwrOVqR5K+vb99ho6IyOo7ekLS3h4sJCzIDy4VWKIbZUfe9njmg==} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -3326,6 +3684,10 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -3336,6 +3698,9 @@ packages: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + schema-dts@1.1.5: resolution: {integrity: sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==} @@ -3411,6 +3776,10 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + sqlite-wasm-kysely@0.3.0: resolution: {integrity: sha512-TzjBNv7KwRw6E3pdKdlRyZiTmUIE0UttT/Sl56MVwVARl/u5gp978KepazCJZewFUnlWHz9i3NQd4kOtP/Afdg==} peerDependencies: @@ -3419,13 +3788,33 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + std-env@4.0.0: resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==} + storybook@10.2.13: + resolution: {integrity: sha512-heMfJjOfbHvL+wlCAwFZlSxcakyJ5yQDam6e9k2RRArB1veJhRnsjO6lO1hOXjJYrqxfHA/ldIugbBVlCDqfvQ==} + hasBin: true + peerDependencies: + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true + + strict-event-emitter@0.5.1: + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + string-width@7.2.0: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} @@ -3442,6 +3831,10 @@ 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-json-comments@5.0.3: resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} engines: {node: '>=14.16'} @@ -3492,9 +3885,16 @@ packages: resolution: {integrity: sha512-q8DFohk6vUswSng95IZb9nzWJnbINZsK7OiM1snAa3qCjJBL0ZQpvMyAaVXjUukdM75J/m8UE8xwqat8Ors/zQ==} engines: {node: '>=18'} + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -3513,10 +3913,25 @@ packages: tinyqueue@3.0.0: resolution: {integrity: sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==} + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + tinyrainbow@3.1.0: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + engines: {node: '>=14.0.0'} + + tldts-core@7.0.28: + resolution: {integrity: sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ==} + + tldts@7.0.28: + resolution: {integrity: sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw==} + hasBin: true + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -3525,6 +3940,10 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} + tough-cookie@6.0.1: + resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} + engines: {node: '>=16'} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -3537,6 +3956,10 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -3553,6 +3976,10 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} + type-fest@5.6.0: + resolution: {integrity: sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==} + engines: {node: '>=20'} + typescript-eslint@8.59.0: resolution: {integrity: sha512-BU3ONW9X+v90EcCH9ZS6LMackcVtxRLlI3XrYyqZIwVSHIk7Qf7bFw1z0M9Q0IUxhTMZCf8piY9hTYaNEIASrw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3641,6 +4068,9 @@ packages: resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} engines: {node: '>=18.12.0'} + until-async@3.0.2: + resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} + update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true @@ -3653,6 +4083,11 @@ packages: urlpattern-polyfill@10.1.0: resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -3823,10 +4258,34 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + wrap-ansi@9.0.2: resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} + ws@8.20.0: + resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -3839,6 +4298,14 @@ packages: engines: {node: '>= 14.6'} hasBin: true + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -3854,6 +4321,8 @@ packages: snapshots: + '@adobe/css-tools@4.4.4': {} + '@anthropic-ai/sdk@0.39.0': dependencies: '@types/node': 18.19.130 @@ -3943,6 +4412,8 @@ snapshots: dependencies: '@babel/types': 7.29.0 + '@babel/runtime@7.29.2': {} + '@babel/template@7.28.6': dependencies: '@babel/code-frame': 7.29.0 @@ -3966,6 +4437,26 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@chromatic-com/playwright@0.13.1(@playwright/test@1.59.1)(@testing-library/dom@10.4.1)(prettier@3.8.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + dependencies: + '@chromaui/rrweb-snapshot': 2.0.0-alpha.18-noAbsolute + '@playwright/test': 1.59.1 + '@segment/analytics-node': 2.1.3 + storybook: 10.2.13(@testing-library/dom@10.4.1)(prettier@3.8.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@testing-library/dom' + - bufferutil + - encoding + - prettier + - react + - react-dom + - utf-8-validate + + '@chromaui/rrweb-snapshot@2.0.0-alpha.18-noAbsolute': + dependencies: + postcss: 8.5.8 + '@emnapi/core@1.9.2': dependencies: '@emnapi/wasi-threads': 1.2.1 @@ -4344,6 +4835,33 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros + '@inquirer/ansi@2.0.5': {} + + '@inquirer/confirm@6.0.12(@types/node@24.12.2)': + dependencies: + '@inquirer/core': 11.1.9(@types/node@24.12.2) + '@inquirer/type': 4.0.5(@types/node@24.12.2) + optionalDependencies: + '@types/node': 24.12.2 + + '@inquirer/core@11.1.9(@types/node@24.12.2)': + dependencies: + '@inquirer/ansi': 2.0.5 + '@inquirer/figures': 2.0.5 + '@inquirer/type': 4.0.5(@types/node@24.12.2) + cli-width: 4.1.0 + fast-wrap-ansi: 0.2.0 + mute-stream: 3.0.0 + signal-exit: 4.1.0 + optionalDependencies: + '@types/node': 24.12.2 + + '@inquirer/figures@2.0.5': {} + + '@inquirer/type@4.0.5(@types/node@24.12.2)': + optionalDependencies: + '@types/node': 24.12.2 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -4385,6 +4903,12 @@ snapshots: '@lix-js/server-protocol-schema@0.1.1': {} + '@lukeed/csprng@1.1.0': {} + + '@lukeed/uuid@2.0.1': + dependencies: + '@lukeed/csprng': 1.1.0 + '@mapbox/jsonlint-lines-primitives@2.0.2': {} '@mapbox/point-geometry@1.1.0': {} @@ -4431,6 +4955,22 @@ snapshots: pbf: 4.0.1 supercluster: 8.0.1 + '@mswjs/interceptors@0.41.5': + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.3 + strict-event-emitter: 0.5.1 + + '@napi-rs/wasm-runtime@1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@tybys/wasm-util': 0.10.1 + optional: true + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': dependencies: '@emnapi/core': 1.9.2 @@ -4469,6 +5009,17 @@ snapshots: number-flow: 0.5.12 svelte: 5.55.4 + '@open-draft/deferred-promise@2.2.0': {} + + '@open-draft/deferred-promise@3.0.0': {} + + '@open-draft/logger@0.3.0': + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.3 + + '@open-draft/until@2.1.0': {} + '@opentelemetry/api@1.9.1': {} '@oxc-parser/binding-android-arm-eabi@0.127.0': @@ -4630,6 +5181,10 @@ snapshots: '@pagefind/windows-x64@1.5.2': optional: true + '@playwright/test@1.59.1': + dependencies: + playwright: 1.59.1 + '@polka/url@1.0.0-next.29': {} '@prgm/sveltekit-progress-bar@3.0.2(@sveltejs/kit@2.57.1(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@7.0.0(svelte@5.55.4)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)))(svelte@5.55.4)(typescript@5.9.3)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)))(svelte@5.55.4)': @@ -4679,7 +5234,7 @@ snapshots: dependencies: '@emnapi/core': 1.9.2 '@emnapi/runtime': 1.9.2 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) optional: true '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15': @@ -4773,6 +5328,29 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.59.0': optional: true + '@segment/analytics-core@1.7.0': + dependencies: + '@lukeed/uuid': 2.0.1 + '@segment/analytics-generic-utils': 1.2.0 + dset: 3.1.4 + tslib: 2.8.1 + + '@segment/analytics-generic-utils@1.2.0': + dependencies: + tslib: 2.8.1 + + '@segment/analytics-node@2.1.3': + dependencies: + '@lukeed/uuid': 2.0.1 + '@segment/analytics-core': 1.7.0 + '@segment/analytics-generic-utils': 1.2.0 + buffer: 6.0.3 + jose: 5.10.0 + node-fetch: 2.7.0 + tslib: 2.8.1 + transitivePeerDependencies: + - encoding + '@sentry-internal/browser-utils@10.49.0': dependencies: '@sentry/core': 10.49.0 @@ -4905,6 +5483,13 @@ snapshots: '@standard-schema/spec@1.1.0': {} + '@storybook/global@5.0.0': {} + + '@storybook/icons@2.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + dependencies: + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + '@sveltejs/acorn-typescript@1.0.9(acorn@8.16.0)': dependencies: acorn: 8.16.0 @@ -4959,6 +5544,30 @@ snapshots: vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) vitefu: 1.1.3(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) + '@testing-library/dom@10.4.1': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/runtime': 7.29.2 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + picocolors: 1.1.1 + pretty-format: 27.5.1 + + '@testing-library/jest-dom@6.9.1': + dependencies: + '@adobe/css-tools': 4.4.4 + aria-query: 5.3.1 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + picocolors: 1.1.1 + redent: 3.0.0 + + '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': + dependencies: + '@testing-library/dom': 10.4.1 + '@turf/distance@7.3.4': dependencies: '@turf/helpers': 7.3.4 @@ -4982,6 +5591,8 @@ snapshots: tslib: 2.8.1 optional: true + '@types/aria-query@5.0.4': {} + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -5048,6 +5659,12 @@ snapshots: dependencies: unified: 11.0.5 + '@types/set-cookie-parser@2.4.10': + dependencies: + '@types/node': 24.12.2 + + '@types/statuses@2.0.6': {} + '@types/supercluster@7.1.3': dependencies: '@types/geojson': 7946.0.16 @@ -5157,6 +5774,14 @@ snapshots: '@ungap/structured-clone@1.3.0': {} + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.3 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + tinyrainbow: 2.0.0 + '@vitest/expect@4.1.4': dependencies: '@standard-schema/spec': 1.1.0 @@ -5166,14 +5791,19 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.4(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))': + '@vitest/mocker@4.1.4(msw@2.13.5(@types/node@24.12.2)(typescript@5.9.3))(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.1.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: + msw: 2.13.5(@types/node@24.12.2)(typescript@5.9.3) vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 + '@vitest/pretty-format@4.1.4': dependencies: tinyrainbow: 3.1.0 @@ -5190,8 +5820,18 @@ snapshots: magic-string: 0.30.21 pathe: 2.0.3 + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.4 + '@vitest/spy@4.1.4': {} + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + '@vitest/utils@4.1.4': dependencies: '@vitest/pretty-format': 4.1.4 @@ -5251,14 +5891,24 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.3: {} + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + aria-query@5.3.1: {} array-timsort@1.0.3: {} assertion-error@2.0.1: {} + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + asynckit@0.4.0: {} axios-mock-adapter@2.1.0(axios@1.15.0): @@ -5288,6 +5938,8 @@ snapshots: balanced-match@4.0.4: {} + base64-js@1.5.1: {} + baseline-browser-mapping@2.10.14: {} bcp-47@2.1.0: @@ -5316,6 +5968,15 @@ snapshots: node-releases: 2.0.37 update-browserslist-db: 1.2.3(browserslist@4.28.2) + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -5325,6 +5986,14 @@ snapshots: ccount@2.0.1: {} + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.3 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + chai@6.2.2: {} chalk@4.1.2: @@ -5336,6 +6005,8 @@ snapshots: character-entities@2.0.2: {} + check-error@2.1.3: {} + chokidar@4.0.3: dependencies: readdirp: 4.1.2 @@ -5349,8 +6020,16 @@ snapshots: slice-ansi: 5.0.0 string-width: 7.2.0 + cli-width@4.1.0: {} + clipboard-polyfill@4.1.1: {} + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + clsx@2.1.1: {} color-convert@2.0.1: @@ -5382,6 +6061,8 @@ snapshots: cookie@0.6.0: {} + cookie@1.1.1: {} + cross-env@7.0.3: dependencies: cross-spawn: 7.0.6 @@ -5392,6 +6073,8 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + css.escape@1.5.1: {} + cssesc@3.0.0: {} csstype@3.2.3: {} @@ -5406,10 +6089,21 @@ snapshots: dedent@1.5.1: {} + deep-eql@5.0.2: {} + deep-is@0.1.4: {} deepmerge@4.3.1: {} + default-browser-id@5.0.1: {} + + default-browser@5.5.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + + define-lazy-prop@3.0.0: {} + delayed-stream@1.0.0: {} dequal@2.0.3: {} @@ -5422,6 +6116,10 @@ snapshots: dependencies: dequal: 2.0.3 + dom-accessibility-api@0.5.16: {} + + dom-accessibility-api@0.6.3: {} + dot-case@3.0.4: dependencies: no-case: 3.0.4 @@ -5429,6 +6127,8 @@ snapshots: dotenv@16.6.1: {} + dset@3.1.4: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -5441,6 +6141,8 @@ snapshots: emoji-regex@10.6.0: {} + emoji-regex@8.0.0: {} + environment@1.1.0: {} es-define-property@1.0.1: {} @@ -5694,6 +6396,16 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + + fast-wrap-ansi@0.2.0: + dependencies: + fast-string-width: 3.0.2 + fastq@1.20.1: dependencies: reusify: 1.1.0 @@ -5753,11 +6465,17 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 4.0.0-beta.3 - framer-motion@12.38.0: + framer-motion@12.38.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5): dependencies: motion-dom: 12.38.0 motion-utils: 12.36.0 tslib: 2.8.1 + optionalDependencies: + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + + fsevents@2.3.2: + optional: true fsevents@2.3.3: optional: true @@ -5766,6 +6484,8 @@ snapshots: gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} + get-east-asian-width@1.5.0: {} get-intrinsic@1.3.0: @@ -5827,6 +6547,8 @@ snapshots: gopd@1.2.0: {} + graphql@16.13.2: {} + has-flag@4.0.0: {} has-symbols@1.1.0: {} @@ -5851,6 +6573,11 @@ snapshots: hast-util-whitespace@2.0.1: {} + headers-polyfill@5.0.1: + dependencies: + '@types/set-cookie-parser': 2.4.10 + set-cookie-parser: 3.1.0 + hey-listen@1.0.8: {} html-to-image@1.11.13: {} @@ -5874,6 +6601,8 @@ snapshots: husky@9.1.7: {} + ieee754@1.2.1: {} + ignore@5.3.2: {} ignore@7.0.5: {} @@ -5882,6 +6611,8 @@ snapshots: imurmurhash@0.1.4: {} + indent-string@4.0.0: {} + is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -5893,8 +6624,12 @@ snapshots: is-decimal@2.0.1: {} + is-docker@3.0.0: {} + is-extglob@2.1.1: {} + is-fullwidth-code-point@3.0.0: {} + is-fullwidth-code-point@4.0.0: {} is-fullwidth-code-point@5.1.0: @@ -5905,6 +6640,12 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-node-process@1.2.0: {} + is-number@7.0.0: {} is-path-inside@4.0.0: {} @@ -5919,12 +6660,18 @@ snapshots: is-stream@3.0.0: {} + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + isexe@2.0.0: {} isexe@3.1.5: {} jiti@2.6.1: {} + jose@5.10.0: {} + js-sha256@0.11.1: {} js-tokens@4.0.0: {} @@ -6079,6 +6826,8 @@ snapshots: longest-streak@3.1.0: {} + loupe@3.2.1: {} + lower-case@2.0.2: dependencies: tslib: 2.8.1 @@ -6093,6 +6842,8 @@ snapshots: dependencies: svelte: 5.55.4 + lz-string@1.5.0: {} + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -6501,6 +7252,8 @@ snapshots: mimic-function@5.0.1: {} + min-indent@1.0.1: {} + minimatch@10.2.5: dependencies: brace-expansion: 5.0.5 @@ -6517,10 +7270,10 @@ snapshots: dependencies: motion-utils: 12.36.0 - motion-sv@0.1.12(svelte@5.55.4): + motion-sv@0.1.12(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(svelte@5.55.4): dependencies: csstype: 3.2.3 - framer-motion: 12.38.0 + framer-motion: 12.38.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) hey-listen: 1.0.8 motion-dom: 12.38.0 motion-utils: 12.36.0 @@ -6538,8 +7291,35 @@ snapshots: ms@2.1.3: {} + msw@2.13.5(@types/node@24.12.2)(typescript@5.9.3): + dependencies: + '@inquirer/confirm': 6.0.12(@types/node@24.12.2) + '@mswjs/interceptors': 0.41.5 + '@open-draft/deferred-promise': 3.0.0 + '@types/statuses': 2.0.6 + cookie: 1.1.1 + graphql: 16.13.2 + headers-polyfill: 5.0.1 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + picocolors: 1.1.1 + rettime: 0.11.8 + statuses: 2.0.2 + strict-event-emitter: 0.5.1 + tough-cookie: 6.0.1 + type-fest: 5.6.0 + until-async: 3.0.2 + yargs: 17.7.2 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@types/node' + murmurhash-js@1.0.0: {} + mute-stream@3.0.0: {} + nanoid@3.3.11: {} natural-compare@1.4.0: {} @@ -6588,6 +7368,13 @@ snapshots: dependencies: mimic-function: 5.0.1 + open@10.2.0: + dependencies: + default-browser: 5.5.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -6597,6 +7384,8 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + outvariant@1.4.3: {} + oxc-parser@0.127.0: dependencies: '@oxc-project/types': 0.127.0 @@ -6684,8 +7473,12 @@ snapshots: lru-cache: 11.2.7 minipass: 7.1.3 + path-to-regexp@6.3.0: {} + pathe@2.0.3: {} + pathval@2.0.1: {} + pbf@4.0.1: dependencies: resolve-protobuf-schema: 2.1.0 @@ -6698,6 +7491,14 @@ snapshots: pidtree@0.6.0: {} + playwright-core@1.59.1: {} + + playwright@1.59.1: + dependencies: + playwright-core: 1.59.1 + optionalDependencies: + fsevents: 2.3.2 + postcss-load-config@3.1.4(postcss@8.5.8): dependencies: lilconfig: 2.1.0 @@ -6735,6 +7536,12 @@ snapshots: prettier@3.8.3: {} + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + prism-svelte@0.4.7: {} prismjs@1.30.0: {} @@ -6755,6 +7562,15 @@ snapshots: quickselect@3.0.0: {} + react-dom@19.2.5(react@19.2.5): + dependencies: + react: 19.2.5 + scheduler: 0.27.0 + + react-is@17.0.2: {} + + react@19.2.5: {} + read-package-json-fast@4.0.0: dependencies: json-parse-even-better-errors: 4.0.0 @@ -6762,6 +7578,19 @@ snapshots: readdirp@4.1.2: {} + recast@0.23.11: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + rehype-slug@5.1.0: dependencies: '@types/hast': 2.3.10 @@ -6791,6 +7620,8 @@ snapshots: remove-markdown@0.5.5: {} + require-directory@2.1.1: {} + resolve-pkg-maps@1.0.0: {} resolve-protobuf-schema@2.1.0: @@ -6802,6 +7633,8 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 + rettime@0.11.8: {} + reusify@1.1.0: {} rfdc@1.4.1: {} @@ -6859,6 +7692,8 @@ snapshots: fsevents: 2.3.3 optional: true + run-applescript@7.1.0: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -6869,6 +7704,8 @@ snapshots: dependencies: mri: 1.2.0 + scheduler@0.27.0: {} + schema-dts@1.1.5: {} semver@6.3.1: {} @@ -6965,6 +7802,8 @@ snapshots: source-map-js@1.2.1: {} + source-map@0.6.1: {} + sqlite-wasm-kysely@0.3.0(kysely@0.28.15): dependencies: '@sqlite.org/sqlite-wasm': 3.48.0-build4 @@ -6972,10 +7811,43 @@ snapshots: stackback@0.0.2: {} + statuses@2.0.2: {} + std-env@4.0.0: {} + storybook@10.2.13(@testing-library/dom@10.4.1)(prettier@3.8.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + dependencies: + '@storybook/global': 5.0.0 + '@storybook/icons': 2.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@testing-library/jest-dom': 6.9.1 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) + '@vitest/expect': 3.2.4 + '@vitest/spy': 3.2.4 + esbuild: 0.27.7 + open: 10.2.0 + recast: 0.23.11 + semver: 7.7.4 + use-sync-external-store: 1.6.0(react@19.2.5) + ws: 8.20.0 + optionalDependencies: + prettier: 3.8.3 + transitivePeerDependencies: + - '@testing-library/dom' + - bufferutil + - react + - react-dom + - utf-8-validate + + strict-event-emitter@0.5.1: {} + string-argv@0.3.2: {} + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + string-width@7.2.0: dependencies: emoji-regex: 10.6.0 @@ -6992,6 +7864,10 @@ snapshots: strip-final-newline@3.0.0: {} + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + strip-json-comments@5.0.3: {} supercluster@8.0.1: @@ -7062,8 +7938,12 @@ snapshots: magic-string: 0.30.21 zimmerframe: 1.1.4 + tagged-tag@1.0.0: {} + text-table@0.2.0: {} + tiny-invariant@1.3.3: {} + tinybench@2.9.0: {} tinyexec@1.0.4: {} @@ -7080,14 +7960,28 @@ snapshots: tinyqueue@3.0.0: {} + tinyrainbow@2.0.0: {} + tinyrainbow@3.1.0: {} + tinyspy@4.0.4: {} + + tldts-core@7.0.28: {} + + tldts@7.0.28: + dependencies: + tldts-core: 7.0.28 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 totalist@3.0.1: {} + tough-cookie@6.0.1: + dependencies: + tldts: 7.0.28 + tr46@0.0.3: {} trough@2.2.0: {} @@ -7096,6 +7990,8 @@ snapshots: dependencies: typescript: 5.9.3 + ts-dedent@2.2.0: {} + tslib@2.8.1: {} tsx@4.21.0: @@ -7111,6 +8007,10 @@ snapshots: type-fest@4.41.0: {} + type-fest@5.6.0: + dependencies: + tagged-tag: 1.0.0 + typescript-eslint@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3): dependencies: '@typescript-eslint/eslint-plugin': 8.59.0(@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3) @@ -7231,6 +8131,8 @@ snapshots: picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 + until-async@3.0.2: {} + update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: browserslist: 4.28.2 @@ -7243,6 +8145,10 @@ snapshots: urlpattern-polyfill@10.1.0: {} + use-sync-external-store@1.6.0(react@19.2.5): + dependencies: + react: 19.2.5 + util-deprecate@1.0.2: {} uuid@10.0.0: {} @@ -7310,10 +8216,10 @@ snapshots: optionalDependencies: vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) - vitest@4.1.4(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)): + vitest@4.1.4(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(msw@2.13.5(@types/node@24.12.2)(typescript@5.9.3))(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.4 - '@vitest/mocker': 4.1.4(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/mocker': 4.1.4(msw@2.13.5(@types/node@24.12.2)(typescript@5.9.3))(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/pretty-format': 4.1.4 '@vitest/runner': 4.1.4 '@vitest/snapshot': 4.1.4 @@ -7366,18 +8272,44 @@ snapshots: word-wrap@1.2.5: {} + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@9.0.2: dependencies: ansi-styles: 6.2.3 string-width: 7.2.0 strip-ansi: 7.2.0 + ws@8.20.0: {} + + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.1 + + y18n@5.0.8: {} + yallist@3.1.1: {} yaml@1.10.3: {} yaml@2.8.3: {} + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + yocto-queue@0.1.0: {} zimmerframe@1.1.4: {} diff --git a/src/posts/action.md b/src/posts/action.md index 1349c1bac..850bcdbef 100644 --- a/src/posts/action.md +++ b/src/posts/action.md @@ -3,6 +3,8 @@ title: Take Action description: Ways to help reduce AI risk. --- + + diff --git a/src/posts/funding.md b/src/posts/funding.md index 160c15851..c50f17595 100644 --- a/src/posts/funding.md +++ b/src/posts/funding.md @@ -3,6 +3,8 @@ title: PauseAI Funding & Donors description: A list of our largest donors. --- + + diff --git a/src/posts/if-anyone-builds-it-campaign.md b/src/posts/if-anyone-builds-it-campaign.md index f840557e1..0bf04175f 100644 --- a/src/posts/if-anyone-builds-it-campaign.md +++ b/src/posts/if-anyone-builds-it-campaign.md @@ -5,6 +5,8 @@ description: PauseAI events in support of If Anyone Builds It, Everyone Dies image: /iabied-event.jpg --- + + The recently published New York Times Bestseller [_If Anyone Builds It, Everyone Dies_](https://ifanyonebuildsit.com/) warns of the threat of human extinction if the race to build superintelligent AI is allowed to continue. At PauseAI, we're organising a coordinated international response to the book by hosting events across 4 countries. These book readings will provide a space for people to learn more about the book's warning, and to begin to use their voice to support an international treaty pausing frontier AI development. diff --git a/src/posts/join.md b/src/posts/join.md index 42e226ead..75ac051e2 100644 --- a/src/posts/join.md +++ b/src/posts/join.md @@ -3,6 +3,8 @@ title: Join PauseAI description: Sign up to join the PauseAI movement --- + + diff --git a/src/posts/faq.md b/src/posts/faq.md index ce4bf1a65..a76778117 100644 --- a/src/posts/faq.md +++ b/src/posts/faq.md @@ -3,6 +3,8 @@ title: FAQ description: Frequently asked questions about PauseAI and the risks of superintelligent AI. --- + + diff --git a/src/posts/pdoom.md b/src/posts/pdoom.md index 564016d48..9d54f2232 100644 --- a/src/posts/pdoom.md +++ b/src/posts/pdoom.md @@ -4,6 +4,8 @@ description: How likely do AI various researchers believe AI will cause human ex date: 2023-12-18 --- + + From 40f9819453b0e035ca44afb6fcb02947510a4cea Mon Sep 17 00:00:00 2001 From: RisingOrange Date: Sun, 26 Apr 2026 18:10:01 +0200 Subject: [PATCH 15/23] Resolve PR by head ref to avoid default-branch API quirk When a commit lives on the repo's default branch, GitHub's listPullRequestsAssociatedWithCommit endpoint only returns merged PRs; open PRs with that commit at their head are filtered out. This is unlikely in production (the feature branch is never main), but it silently breaks the scope comment on any fork where the feature branch happens to be default. Switch to pulls?state=open&head={owner}:{branch}, which has no such quirk. Trusted-inputs safety property is unchanged: head owner/branch come from workflow_run, and we still verify head.repo.id and head.sha against the trusted payload before posting. --- .github/workflows/visual-diff-comment.yml | 30 ++++++++++++++--------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/.github/workflows/visual-diff-comment.yml b/.github/workflows/visual-diff-comment.yml index be3f6eb98..d14c8f34d 100644 --- a/.github/workflows/visual-diff-comment.yml +++ b/.github/workflows/visual-diff-comment.yml @@ -37,22 +37,30 @@ jobs: with: script: | const run = context.payload.workflow_run - const { data: prs } = await github.rest.repos.listPullRequestsAssociatedWithCommit({ + // Look up open PRs by head ref directly. We deliberately don't use + // `listPullRequestsAssociatedWithCommit` here: when the commit is + // on the repo's default branch, that endpoint only returns merged + // PRs, so an open PR whose head is at this commit gets filtered + // out (hit on a fork where the feature branch was the default). + // `pulls?head=` has no such quirk. + const headOwner = run.head_repository?.owner?.login + const headBranch = run.head_branch + const { data: prs } = await github.rest.pulls.list({ owner: context.repo.owner, repo: context.repo.repo, - commit_sha: run.head_sha + state: 'open', + head: `${headOwner}:${headBranch}` }) - // Narrow by trusted workflow_run fields — head_branch AND - // head_repository.id — so a commit shared between multiple open - // PRs routes the comment to the right one. Edge case we don't - // handle: same fork branch opened as TWO open PRs against - // different base branches simultaneously (rare). In that case - // `.find()` picks the first match and the comment may land on - // the wrong PR until one is closed. + // Narrow by trusted workflow_run fields — head_repository.id and + // head_sha — so a commit shared between multiple open PRs routes + // the comment to the right one. Edge case we don't handle: same + // fork branch opened as TWO open PRs against different base + // branches simultaneously (rare). In that case `.find()` picks + // the first match and the comment may land on the wrong PR + // until one is closed. const match = prs.find((p) => { - if (p.state !== 'open') return false - if (run.head_branch && p.head.ref !== run.head_branch) return false if (run.head_repository?.id && p.head.repo?.id !== run.head_repository.id) return false + if (p.head.sha !== run.head_sha) return false return true }) if (!match) { From cbd7d83ff46a2ec5e667b54d187f588108bca94e Mon Sep 17 00:00:00 2001 From: Wituareard <87208350+Wituareard@users.noreply.github.com> Date: Thu, 16 Jul 2026 21:42:50 +0200 Subject: [PATCH 16/23] Install Chromatic locally to avoid pnpm package isolation --- package.json | 1 + pnpm-lock.yaml | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/package.json b/package.json index 7d5469e1d..ce09c1533 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "@types/remark-heading-id": "^1.0.0", "axios-mock-adapter": "^2.1.0", "axios-retry": "^4.5.0", + "chromatic": "^18.0.1", "cross-env": "^10.1.0", "dotenv": "^17.4.2", "eslint": "^10.7.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index efd396521..f1dbebd28 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -165,6 +165,9 @@ importers: axios-retry: specifier: ^4.5.0 version: 4.5.0(axios@1.18.1) + chromatic: + specifier: ^18.0.1 + version: 18.0.1(@chromatic-com/playwright@0.13.4(@playwright/test@1.61.1)(@testing-library/dom@10.4.1)(prettier@3.9.5)(react@19.2.7)) cross-env: specifier: ^10.1.0 version: 10.1.0 @@ -2182,6 +2185,22 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + chromatic@18.0.1: + resolution: {integrity: sha512-GlTYrZ4ui5ZW8Jzut6SAo5bMH3sIugYZ37Nq2DyVHBfPINeEzGA8eG5xNo4N/I2aRdM9Xnqw0SCls7wgf2llvA==} + engines: {node: '>=22.0.0'} + hasBin: true + peerDependencies: + '@chromatic-com/cypress': ^0.*.* || ^1.0.0 + '@chromatic-com/playwright': ^0.*.* || ^1.0.0 + '@chromatic-com/vitest': ^0.*.* || ^1.0.0 + peerDependenciesMeta: + '@chromatic-com/cypress': + optional: true + '@chromatic-com/playwright': + optional: true + '@chromatic-com/vitest': + optional: true + cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} @@ -6171,6 +6190,12 @@ snapshots: dependencies: readdirp: 4.1.2 + chromatic@18.0.1(@chromatic-com/playwright@0.13.4(@playwright/test@1.61.1)(@testing-library/dom@10.4.1)(prettier@3.9.5)(react@19.2.7)): + dependencies: + semver: 7.7.4 + optionalDependencies: + '@chromatic-com/playwright': 0.13.4(@playwright/test@1.61.1)(@testing-library/dom@10.4.1)(prettier@3.9.5)(react@19.2.7) + cli-width@4.1.0: {} clipboard-polyfill@4.1.1: {} From 45e0180e797b7513ce1c19a297c7191207f460c1 Mon Sep 17 00:00:00 2001 From: Wituareard <87208350+Wituareard@users.noreply.github.com> Date: Thu, 16 Jul 2026 21:58:12 +0200 Subject: [PATCH 17/23] Exclude Playwright visual suite from Vitest discovery --- vite.config.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/vite.config.ts b/vite.config.ts index 97025dc49..cd428da8d 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -12,6 +12,7 @@ import { sentryVitePlugin } from '@sentry/vite-plugin' import { isDev } from './src/lib/env' import { MARKDOWN_L10NS } from './src/lib/l10n' import { locales as compiledLocales } from './src/lib/paraglide/runtime.js' +import { configDefaults } from 'vitest/config' /** * Dev-only middleware: Netlify's `/.netlify/*` routes don't exist in the @@ -106,6 +107,20 @@ export default defineConfig(() => { external: getLocaleExcludePatterns() } } as const, + + // Vitest config — `pnpm test` runs Vitest, which by default would + // also pick up `tests/visual/smoke.spec.ts`. That file imports + // `test` from `@chromatic-com/playwright` (a Playwright test runner + // wrapper), and Playwright's `test.describe()` throws + // "did not expect test.describe() to be called here" when invoked + // outside the Playwright runner. The visual suite is launched + // separately via `playwright.config.ts` (and Chromatic), so exclude + // it from Vitest's discovery. `exclude` replaces Vitest's defaults, + // so spread `configDefaults.exclude` to keep node_modules / dist / + // cypress / config files filtered out. + test: { + exclude: [...configDefaults.exclude, 'tests/visual/**'] + }, plugins: [ suppressNetlifyRoute404s(), lucidePreprocess(), From 73c8e8746927d4e96e29a94a92d9a6ea3a99bf23 Mon Sep 17 00:00:00 2001 From: Wituareard <87208350+Wituareard@users.noreply.github.com> Date: Thu, 16 Jul 2026 22:03:17 +0200 Subject: [PATCH 18/23] Undo addition of chromatic dependency --- package.json | 1 - pnpm-lock.yaml | 25 ------------------------- 2 files changed, 26 deletions(-) diff --git a/package.json b/package.json index ce09c1533..7d5469e1d 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,6 @@ "@types/remark-heading-id": "^1.0.0", "axios-mock-adapter": "^2.1.0", "axios-retry": "^4.5.0", - "chromatic": "^18.0.1", "cross-env": "^10.1.0", "dotenv": "^17.4.2", "eslint": "^10.7.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f1dbebd28..efd396521 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -165,9 +165,6 @@ importers: axios-retry: specifier: ^4.5.0 version: 4.5.0(axios@1.18.1) - chromatic: - specifier: ^18.0.1 - version: 18.0.1(@chromatic-com/playwright@0.13.4(@playwright/test@1.61.1)(@testing-library/dom@10.4.1)(prettier@3.9.5)(react@19.2.7)) cross-env: specifier: ^10.1.0 version: 10.1.0 @@ -2185,22 +2182,6 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} - chromatic@18.0.1: - resolution: {integrity: sha512-GlTYrZ4ui5ZW8Jzut6SAo5bMH3sIugYZ37Nq2DyVHBfPINeEzGA8eG5xNo4N/I2aRdM9Xnqw0SCls7wgf2llvA==} - engines: {node: '>=22.0.0'} - hasBin: true - peerDependencies: - '@chromatic-com/cypress': ^0.*.* || ^1.0.0 - '@chromatic-com/playwright': ^0.*.* || ^1.0.0 - '@chromatic-com/vitest': ^0.*.* || ^1.0.0 - peerDependenciesMeta: - '@chromatic-com/cypress': - optional: true - '@chromatic-com/playwright': - optional: true - '@chromatic-com/vitest': - optional: true - cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} @@ -6190,12 +6171,6 @@ snapshots: dependencies: readdirp: 4.1.2 - chromatic@18.0.1(@chromatic-com/playwright@0.13.4(@playwright/test@1.61.1)(@testing-library/dom@10.4.1)(prettier@3.9.5)(react@19.2.7)): - dependencies: - semver: 7.7.4 - optionalDependencies: - '@chromatic-com/playwright': 0.13.4(@playwright/test@1.61.1)(@testing-library/dom@10.4.1)(prettier@3.9.5)(react@19.2.7) - cli-width@4.1.0: {} clipboard-polyfill@4.1.1: {} From 573e672521b7ed95afbf09be8a72d315a5229e81 Mon Sep 17 00:00:00 2001 From: Wituareard <87208350+Wituareard@users.noreply.github.com> Date: Thu, 16 Jul 2026 22:18:17 +0200 Subject: [PATCH 19/23] Update web server timeout in Playwright config --- playwright.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playwright.config.ts b/playwright.config.ts index 97c3e06b2..30f4b54d0 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -40,7 +40,7 @@ export default defineConfig({ webServer: { command: 'pnpm build && pnpm preview', port: 4173, - timeout: 360_000, + timeout: 10 /*m*/ * 60 /*s*/ * 1000 /*ms*/, reuseExistingServer: !process.env.CI } }) From 490680b2aa31b7668be26ea02d3f5dc49aa2dc66 Mon Sep 17 00:00:00 2001 From: RisingOrange Date: Sat, 18 Jul 2026 14:11:37 +0200 Subject: [PATCH 20/23] Fix visual-diff MSW preload + Substack canary under pnpm 11 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two regressions surfaced after the pnpm 10.29.2 -> 11.1.3 bump in the last main merge: 1. MSW never booted. The preload was injected via NPM_CONFIG_NODE_OPTIONS, which pnpm 10 translated into the child NODE_OPTIONS but pnpm 11 ignores entirely, so build/preview hit live Airtable/Notion (401s) instead of fixtures. Set NODE_OPTIONS directly — pnpm 11 passes it through untouched. 2. The homepage Substack self-check waited for a fixture post title in the rendered first page. /api/news sorts merged internal + Substack items by date, and enough newer dated internal posts have since accrued to push the fixtures off page one. Assert the fixture is reachable via the /api/news API (paging through) instead of where it happens to sort. Verified end-to-end on Node 24.2 (the .nvmrc pin): both home snapshots pass, MSW warn log clean, no live API calls. --- .github/workflows/visual-diff.yml | 14 +++++++++----- tests/visual/smoke.spec.ts | 31 ++++++++++++++++++++++++++----- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/.github/workflows/visual-diff.yml b/.github/workflows/visual-diff.yml index 465726f71..25780ef87 100644 --- a/.github/workflows/visual-diff.yml +++ b/.github/workflows/visual-diff.yml @@ -55,11 +55,15 @@ jobs: run: pnpm exec playwright test env: VISUAL_TEST: '1' - # NPM_CONFIG_NODE_OPTIONS is the only way to propagate --import through - # pnpm: pnpm overwrites NODE_OPTIONS (with --experimental-global-webcrypto) - # when spawning scripts, but npm config values pass through untouched. - # See https://github.com/pnpm/pnpm/issues/6210 - NPM_CONFIG_NODE_OPTIONS: '--import ./tests/visual/msw-setup.ts' + # Preload MSW-node into every node process the build/preview spawns + # (prerender, remote fns, on-demand SSR) so outbound HTTP is served + # from fixtures. pnpm 11 passes NODE_OPTIONS through to run-scripts + # untouched; the .ts loader relies on Node's built-in type stripping + # (default on the Node 24 pinned in .nvmrc). + # NB: must be NODE_OPTIONS, not NPM_CONFIG_NODE_OPTIONS — pnpm 10 + # translated the latter into the former, but pnpm 11 (bumped here in + # the July merge) ignores it, so the preload silently never ran. + NODE_OPTIONS: '--import ./tests/visual/msw-setup.ts' # Fake keys so the SDKs actually make HTTP requests (they short-circuit # to a "no key" error otherwise, bypassing MSW entirely). The real # requests are intercepted by MSW and served from fixtures. diff --git a/tests/visual/smoke.spec.ts b/tests/visual/smoke.spec.ts index dbdc285f4..5678cd225 100644 --- a/tests/visual/smoke.spec.ts +++ b/tests/visual/smoke.spec.ts @@ -54,12 +54,33 @@ test.describe('routes', () => { page.waitForLoadState('networkidle') ]) // Self-validate the MSW Substack mock is actually being used — otherwise - // the suite would quietly capture live feed data. The homepage renders - // news items whose titles come from fixtures/substack-feed.xml. + // the suite would quietly capture live feed data. /api/news merges the + // fixture Substack items with dated internal `news:` posts and sorts by + // date, so a fixture post drops to a later page as newer internal posts + // accrue (it no longer reliably lands on the rendered first page). Page + // through the API instead, so this check doesn't silently rot as content + // grows — it asserts the fixture is reachable, not where it sorts. if (path === '/') { - await page - .getByText('Fixture Substack post one') - .waitFor({ state: 'visible', timeout: 5000 }) + let found = false + let pageNum = 1 + let totalPages = 1 + do { + // Fetch from inside the page (same-origin, so beforeEach's route + // handler lets it through) rather than via page.request, whose + // separate context isn't covered by page.route. + const body = await page.evaluate(async (p) => { + const res = await fetch(`/api/news?page=${p}&pageSize=12`) + return (await res.json()) as { items: Array<{ title: string }>; totalPages: number } + }, pageNum) + totalPages = body.totalPages + found = body.items.some((item) => item.title.startsWith('Fixture Substack post')) + pageNum++ + } while (!found && pageNum <= totalPages) + if (!found) { + throw new Error( + 'MSW Substack fixture missing from /api/news — the live feed may have leaked into the run' + ) + } } const screenshot = await page.screenshot({ fullPage: true }) await testInfo.attach('full-page', { body: screenshot, contentType: 'image/png' }) From 8bd70757da6792766efcbd93140065c7060e1b8f Mon Sep 17 00:00:00 2001 From: RisingOrange Date: Sat, 18 Jul 2026 14:24:17 +0200 Subject: [PATCH 21/23] Address review: fix lint, harden Substack canary, refresh docs - smoke.spec.ts: rewrite the /api/news paging loop as a for-loop so the found/totalPages initialisers are read before reassignment (eslint no-useless-assignment was failing pnpm-check); guard res.ok and optional items/totalPages so an API error surfaces a targeted message; sharpen the failure wording (MSW handler broken *or* live feed leaked). - visual-diff.yml: use an absolute --import path (github.workspace) since --import resolves relative specifiers per-process cwd. - README.md, knip.config.ts: NPM_CONFIG_NODE_OPTIONS -> NODE_OPTIONS to match the workflow (the old mechanism is a no-op on pnpm 11). --- .github/workflows/visual-diff.yml | 4 +++- knip.config.ts | 2 +- tests/visual/README.md | 2 +- tests/visual/smoke.spec.ts | 19 ++++++++++--------- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/.github/workflows/visual-diff.yml b/.github/workflows/visual-diff.yml index 25780ef87..6a16214e5 100644 --- a/.github/workflows/visual-diff.yml +++ b/.github/workflows/visual-diff.yml @@ -63,7 +63,9 @@ jobs: # NB: must be NODE_OPTIONS, not NPM_CONFIG_NODE_OPTIONS — pnpm 10 # translated the latter into the former, but pnpm 11 (bumped here in # the July merge) ignores it, so the preload silently never ran. - NODE_OPTIONS: '--import ./tests/visual/msw-setup.ts' + # Absolute path: --import resolves relative specifiers against each + # process's cwd, and not every spawned step runs from the repo root. + NODE_OPTIONS: '--import ${{ github.workspace }}/tests/visual/msw-setup.ts' # Fake keys so the SDKs actually make HTTP requests (they short-circuit # to a "no key" error otherwise, bypassing MSW entirely). The real # requests are intercepted by MSW and served from fixtures. diff --git a/knip.config.ts b/knip.config.ts index da9d76aed..ea9257e49 100644 --- a/knip.config.ts +++ b/knip.config.ts @@ -5,7 +5,7 @@ const ADDITIONALLY_ENTRY_POINTS = [ 'src/routes/sayno/SelfieUX.svelte', // dynamically imported 'src/lib/components/NationalGroupItem.svelte', // imported only in Markdown file 'src/lib/components/PressCoveragePanelLoader.svelte', // imported only in Markdown file - 'tests/visual/msw-setup.ts' // loaded via NPM_CONFIG_NODE_OPTIONS=--import in the visual-diff workflow + 'tests/visual/msw-setup.ts' // loaded via NODE_OPTIONS=--import in the visual-diff workflow ] const config: KnipConfig = { diff --git a/tests/visual/README.md b/tests/visual/README.md index 039cc3d6e..af582a0fe 100644 --- a/tests/visual/README.md +++ b/tests/visual/README.md @@ -20,7 +20,7 @@ Every PR gets a side-by-side visual diff via Playwright + Chromatic. The check i The workflow runs `pnpm build` without production secrets. Two interception mechanisms keep snapshots deterministic: -- **MSW-node** (`msw-setup.ts`, loaded via `NPM_CONFIG_NODE_OPTIONS=--import` in the workflow) intercepts outbound HTTP from the Node process — Notion, Airtable, and Substack RSS — and serves pinned fixtures from `fixtures/`. Covers both build-time prerender (press, funding) and request-time SSR (about, statement, national-groups, `/api/news`). Catch-all handlers for Airtable + Notion return empty results for un-fixtured endpoints so new tables/databases fail deterministically instead of producing flaky real-network 401s. The trade-off: a page that depends on a new external integration will silently render its empty state until an explicit handler + fixture is added — review `msw-setup.ts` whenever an integration lands. +- **MSW-node** (`msw-setup.ts`, loaded via `NODE_OPTIONS=--import` in the workflow) intercepts outbound HTTP from the Node process — Notion, Airtable, and Substack RSS — and serves pinned fixtures from `fixtures/`. Covers both build-time prerender (press, funding) and request-time SSR (about, statement, national-groups, `/api/news`). Catch-all handlers for Airtable + Notion return empty results for un-fixtured endpoints so new tables/databases fail deterministically instead of producing flaky real-network 401s. The trade-off: a page that depends on a new external integration will silently render its empty state until an explicit handler + fixture is added — review `msw-setup.ts` whenever an integration lands. - **Playwright `page.route()`** in `smoke.spec.ts` **default-denies** any cross-origin document / XHR / fetch originating in the browser (Tally, Mapbox, Luma, analytics, any new third-party widget added later). Cross-origin _resources_ (scripts, fonts, images from CDNs) pass through. No fixture data is served at the browser boundary — aborted requests just render as empty containers. **What this means for reviewers:** snapshots show the app rendering against _fixtures_ that look representative but are not live data. A green diff on `/about` means "no layout regression given the fixture people list," not "the Airtable integration works." diff --git a/tests/visual/smoke.spec.ts b/tests/visual/smoke.spec.ts index 5678cd225..ccd7cbf2d 100644 --- a/tests/visual/smoke.spec.ts +++ b/tests/visual/smoke.spec.ts @@ -62,23 +62,24 @@ test.describe('routes', () => { // grows — it asserts the fixture is reachable, not where it sorts. if (path === '/') { let found = false - let pageNum = 1 - let totalPages = 1 - do { + // A for-loop (condition checked before the first body) rather than a + // do-while, so the `found` / `totalPages` initialisers are read before + // being reassigned — otherwise eslint's no-useless-assignment fires. + for (let pageNum = 1, totalPages = 1; !found && pageNum <= totalPages; pageNum++) { // Fetch from inside the page (same-origin, so beforeEach's route // handler lets it through) rather than via page.request, whose // separate context isn't covered by page.route. const body = await page.evaluate(async (p) => { const res = await fetch(`/api/news?page=${p}&pageSize=12`) - return (await res.json()) as { items: Array<{ title: string }>; totalPages: number } + if (!res.ok) throw new Error(`/api/news returned ${res.status}`) + return (await res.json()) as { items?: Array<{ title?: string }>; totalPages?: number } }, pageNum) - totalPages = body.totalPages - found = body.items.some((item) => item.title.startsWith('Fixture Substack post')) - pageNum++ - } while (!found && pageNum <= totalPages) + totalPages = body.totalPages ?? 0 + found = (body.items ?? []).some((item) => item.title?.startsWith('Fixture Substack post')) + } if (!found) { throw new Error( - 'MSW Substack fixture missing from /api/news — the live feed may have leaked into the run' + 'Fixture Substack post not found in /api/news — the MSW handler is broken or the live feed leaked into the run' ) } } From e0729e8e0944c22bdb76782c05e15845cc9395be Mon Sep 17 00:00:00 2001 From: RisingOrange Date: Sat, 18 Jul 2026 15:27:07 +0200 Subject: [PATCH 22/23] Harden visual-diff determinism + pin action SHAs (review follow-up) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From a full-PR review (Codex + Fable): - QuotesCarousel: skip Glide autoplay when prefers-reduced-motion is set. The home page snapshot ran ~13s against a 10s autoplay interval, so the captured slide was nondeterministic; reduced-motion (which Playwright sets) now freezes it. Doubles as an a11y improvement for real visitors. - airtable-people fixture: replace the live api.dicebear.com avatar URLs with inline data-URI SVGs. Chromatic doesn't archive cross-origin assets (no assetDomains configured), so /about was re-fetching them live on every diff — an availability/drift flake on the pipeline meant to remove live deps. - SHA-pin the two third-party actions that hold credentials: chromaui/action (project token) and marocchino/sticky-pull-request-comment (pull-requests: write). A moved/compromised mutable tag would otherwise run with those. Verified on Node 24.2: home + about snapshots pass, MSW warn log clean (no dicebear or other live requests). --- .github/workflows/visual-diff-comment.yml | 4 +++- .github/workflows/visual-diff.yml | 4 +++- src/lib/components/QuotesCarousel.svelte | 7 ++++++- tests/visual/fixtures/airtable-people.json | 6 +++--- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/.github/workflows/visual-diff-comment.yml b/.github/workflows/visual-diff-comment.yml index d14c8f34d..a6f9034dd 100644 --- a/.github/workflows/visual-diff-comment.yml +++ b/.github/workflows/visual-diff-comment.yml @@ -81,7 +81,9 @@ jobs: path: scope - name: Post or update sticky comment if: steps.pr.outputs.number != '' && steps.download.outcome == 'success' - uses: marocchino/sticky-pull-request-comment@v2 + # SHA-pinned (a mutable tag on an action that runs with pull-requests: + # write could be moved to hostile code). Bump the SHA + comment together. + uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2 with: header: visual-diff-scope number: ${{ steps.pr.outputs.number }} diff --git a/.github/workflows/visual-diff.yml b/.github/workflows/visual-diff.yml index 6a16214e5..ef4aaa6b6 100644 --- a/.github/workflows/visual-diff.yml +++ b/.github/workflows/visual-diff.yml @@ -89,7 +89,9 @@ jobs: # quota for this project), rotatable from the Chromatic UI. See # https://www.chromatic.com/docs/github-actions/ for the full rationale # and any capability/scope details. - uses: chromaui/action@v16 + # SHA-pinned (a mutable tag on an action that receives the project + # token could be moved to hostile code). Bump the SHA + comment together. + uses: chromaui/action@1bbb5819252d9782cb7d77122d9becae467def18 # v16 with: playwright: true projectToken: chpt_cefd614c783fb5c diff --git a/src/lib/components/QuotesCarousel.svelte b/src/lib/components/QuotesCarousel.svelte index c068c9adf..538613546 100644 --- a/src/lib/components/QuotesCarousel.svelte +++ b/src/lib/components/QuotesCarousel.svelte @@ -82,8 +82,13 @@ Swipe } = await import('@glidejs/glide/dist/glide.modular.esm') + // Auto-advancing on a timer is motion; skip it when the visitor asked for + // reduced motion. This also keeps timer-based visual-diff snapshots + // deterministic (Playwright runs with prefers-reduced-motion: reduce). + const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches + glide = new Glide('.glide', { - autoplay: AUTOPLAY_INTERVAL + autoplay: prefersReducedMotion ? false : AUTOPLAY_INTERVAL }) glide.on('move', () => { diff --git a/tests/visual/fixtures/airtable-people.json b/tests/visual/fixtures/airtable-people.json index bc64daf7c..79421e000 100644 --- a/tests/visual/fixtures/airtable-people.json +++ b/tests/visual/fixtures/airtable-people.json @@ -10,7 +10,7 @@ "Photo": [ { "thumbnails": { - "large": { "url": "https://api.dicebear.com/7.x/bottts/svg?seed=fixture1" } + "large": { "url": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMDAiIGhlaWdodD0iNDAwIj48cmVjdCB3aWR0aD0iMzAwIiBoZWlnaHQ9IjQwMCIgZmlsbD0iIzRGNDZFNSIvPjxjaXJjbGUgY3g9IjE1MCIgY3k9IjE1MCIgcj0iNzAiIGZpbGw9IiNFMEU3RkYiLz48cGF0aCBkPSJNNjAgNDAwYzAtNzAgNDAtMTEwIDkwLTExMHM5MCA0MCA5MCAxMTB6IiBmaWxsPSIjRTBFN0ZGIi8+PC9zdmc+" } } } ], @@ -29,7 +29,7 @@ "Photo": [ { "thumbnails": { - "large": { "url": "https://api.dicebear.com/7.x/bottts/svg?seed=fixture2" } + "large": { "url": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMDAiIGhlaWdodD0iNDAwIj48cmVjdCB3aWR0aD0iMzAwIiBoZWlnaHQ9IjQwMCIgZmlsbD0iIzA1OTY2OSIvPjxjaXJjbGUgY3g9IjE1MCIgY3k9IjE1MCIgcj0iNzAiIGZpbGw9IiNEMUZBRTUiLz48cGF0aCBkPSJNNjAgNDAwYzAtNzAgNDAtMTEwIDkwLTExMHM5MCA0MCA5MCAxMTB6IiBmaWxsPSIjRDFGQUU1Ii8+PC9zdmc+" } } } ], @@ -48,7 +48,7 @@ "Photo": [ { "thumbnails": { - "large": { "url": "https://api.dicebear.com/7.x/bottts/svg?seed=fixture3" } + "large": { "url": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMDAiIGhlaWdodD0iNDAwIj48cmVjdCB3aWR0aD0iMzAwIiBoZWlnaHQ9IjQwMCIgZmlsbD0iI0RCMjc3NyIvPjxjaXJjbGUgY3g9IjE1MCIgY3k9IjE1MCIgcj0iNzAiIGZpbGw9IiNGQ0U3RjMiLz48cGF0aCBkPSJNNjAgNDAwYzAtNzAgNDAtMTEwIDkwLTExMHM5MCA0MCA5MCAxMTB6IiBmaWxsPSIjRkNFN0YzIi8+PC9zdmc+" } } } ], From 8aef4d1ac98c3cbdcc5c090f8daa3b941f29afbd Mon Sep 17 00:00:00 2001 From: RisingOrange Date: Sat, 18 Jul 2026 15:31:54 +0200 Subject: [PATCH 23/23] Format people fixture with prettier The data-URI avatars pushed the inline "large" objects past print-width, so prettier expands them to multi-line. Pure formatting; no data change. --- tests/visual/fixtures/airtable-people.json | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tests/visual/fixtures/airtable-people.json b/tests/visual/fixtures/airtable-people.json index 79421e000..8c0ee18d7 100644 --- a/tests/visual/fixtures/airtable-people.json +++ b/tests/visual/fixtures/airtable-people.json @@ -10,7 +10,9 @@ "Photo": [ { "thumbnails": { - "large": { "url": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMDAiIGhlaWdodD0iNDAwIj48cmVjdCB3aWR0aD0iMzAwIiBoZWlnaHQ9IjQwMCIgZmlsbD0iIzRGNDZFNSIvPjxjaXJjbGUgY3g9IjE1MCIgY3k9IjE1MCIgcj0iNzAiIGZpbGw9IiNFMEU3RkYiLz48cGF0aCBkPSJNNjAgNDAwYzAtNzAgNDAtMTEwIDkwLTExMHM5MCA0MCA5MCAxMTB6IiBmaWxsPSIjRTBFN0ZGIi8+PC9zdmc+" } + "large": { + "url": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMDAiIGhlaWdodD0iNDAwIj48cmVjdCB3aWR0aD0iMzAwIiBoZWlnaHQ9IjQwMCIgZmlsbD0iIzRGNDZFNSIvPjxjaXJjbGUgY3g9IjE1MCIgY3k9IjE1MCIgcj0iNzAiIGZpbGw9IiNFMEU3RkYiLz48cGF0aCBkPSJNNjAgNDAwYzAtNzAgNDAtMTEwIDkwLTExMHM5MCA0MCA5MCAxMTB6IiBmaWxsPSIjRTBFN0ZGIi8+PC9zdmc+" + } } } ], @@ -29,7 +31,9 @@ "Photo": [ { "thumbnails": { - "large": { "url": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMDAiIGhlaWdodD0iNDAwIj48cmVjdCB3aWR0aD0iMzAwIiBoZWlnaHQ9IjQwMCIgZmlsbD0iIzA1OTY2OSIvPjxjaXJjbGUgY3g9IjE1MCIgY3k9IjE1MCIgcj0iNzAiIGZpbGw9IiNEMUZBRTUiLz48cGF0aCBkPSJNNjAgNDAwYzAtNzAgNDAtMTEwIDkwLTExMHM5MCA0MCA5MCAxMTB6IiBmaWxsPSIjRDFGQUU1Ii8+PC9zdmc+" } + "large": { + "url": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMDAiIGhlaWdodD0iNDAwIj48cmVjdCB3aWR0aD0iMzAwIiBoZWlnaHQ9IjQwMCIgZmlsbD0iIzA1OTY2OSIvPjxjaXJjbGUgY3g9IjE1MCIgY3k9IjE1MCIgcj0iNzAiIGZpbGw9IiNEMUZBRTUiLz48cGF0aCBkPSJNNjAgNDAwYzAtNzAgNDAtMTEwIDkwLTExMHM5MCA0MCA5MCAxMTB6IiBmaWxsPSIjRDFGQUU1Ii8+PC9zdmc+" + } } } ], @@ -48,7 +52,9 @@ "Photo": [ { "thumbnails": { - "large": { "url": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMDAiIGhlaWdodD0iNDAwIj48cmVjdCB3aWR0aD0iMzAwIiBoZWlnaHQ9IjQwMCIgZmlsbD0iI0RCMjc3NyIvPjxjaXJjbGUgY3g9IjE1MCIgY3k9IjE1MCIgcj0iNzAiIGZpbGw9IiNGQ0U3RjMiLz48cGF0aCBkPSJNNjAgNDAwYzAtNzAgNDAtMTEwIDkwLTExMHM5MCA0MCA5MCAxMTB6IiBmaWxsPSIjRkNFN0YzIi8+PC9zdmc+" } + "large": { + "url": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMDAiIGhlaWdodD0iNDAwIj48cmVjdCB3aWR0aD0iMzAwIiBoZWlnaHQ9IjQwMCIgZmlsbD0iI0RCMjc3NyIvPjxjaXJjbGUgY3g9IjE1MCIgY3k9IjE1MCIgcj0iNzAiIGZpbGw9IiNGQ0U3RjMiLz48cGF0aCBkPSJNNjAgNDAwYzAtNzAgNDAtMTEwIDkwLTExMHM5MCA0MCA5MCAxMTB6IiBmaWxsPSIjRkNFN0YzIi8+PC9zdmc+" + } } } ],