From 02f5bf14bad6ff0a24d7bd35466e5b4c62ace588 Mon Sep 17 00:00:00 2001 From: obroccolio Date: Sun, 13 Sep 2026 16:09:59 +0800 Subject: [PATCH] Configure board deployment and backend proxy --- .dockerignore | 8 + .env.example | 9 + .gitea/workflows/build.yml | 68 + .gitignore | 7 + AGENTS.md | 66 + Design/DESIGN-HANDOFF.md | 89 + Design/DESIGN-MANIFEST.json | 185 + Design/control.html | 60 + Design/drawing-2026-09-12T12-48-14-971Z.png | Bin 0 -> 97557 bytes Design/index.html | 126 + Design/screen.html | 98 + Dockerfile.frontend | 25 + README.md | 76 + deploy.sh | 26 + deploy/nginx.conf | 57 + docker-compose.yml | 30 + eslint.config.js | 26 + index.html | 12 + package-lock.json | 5339 +++++++++++++++++ package.json | 46 + .../40588babde574efeb9643f4af05c8d43.svg | 2011 +++++++ server/.dockerignore | 2 + server/Dockerfile | 13 + server/package-lock.json | 36 + server/package.json | 14 + server/realtime-server.mjs | 91 + server/realtime-server.test.mjs | 45 + src/App.tsx | 5 + src/AppRoutes.test.tsx | 217 + src/AppRoutes.tsx | 34 + src/components/CloudHeader.module.css | 99 + src/components/CloudHeader.tsx | 31 + src/components/CloudLoadingState.tsx | 12 + .../CloudUnavailableState.module.css | 24 + src/components/CloudUnavailableState.tsx | 12 + .../ControllerSuccessState.module.css | 59 + src/components/ControllerSuccessState.tsx | 48 + src/components/FloatingSearchDock.module.css | 71 + src/components/FloatingSearchDock.tsx | 65 + src/components/FullscreenButton.module.css | 36 + src/components/FullscreenButton.tsx | 72 + src/components/QRPanel.module.css | 54 + src/components/QRPanel.tsx | 60 + src/components/SearchResultState.module.css | 39 + src/components/SearchResultState.tsx | 58 + src/components/TitleFrost.module.css | 33 + src/components/TitleFrost.tsx | 5 + src/components/WordCloudCanvas.module.css | 108 + src/components/WordCloudCanvas.test.tsx | 176 + src/components/WordCloudCanvas.tsx | 211 + src/config/focus.ts | 16 + src/config/wordcloudApi.test.ts | 10 + src/config/wordcloudApi.ts | 23 + src/data/clouds/demo.ts | 84 + src/data/clouds/imported.ts | 40 + src/data/clouds/importedWordcloud.json | 1 + src/data/clouds/index.ts | 8 + src/hooks/__tests__/focusQueue.test.ts | 45 + src/hooks/__tests__/useWordCloudFocus.test.ts | 33 + src/hooks/focusQueue.ts | 44 + src/hooks/useCloud.ts | 53 + src/hooks/useFocusQueue.ts | 42 + src/hooks/useWordCloudChannel.ts | 73 + src/hooks/useWordCloudFocus.ts | 351 ++ src/lib/__tests__/wordCloud.test.ts | 80 + src/lib/__tests__/wordcloudImport.test.ts | 64 + src/lib/sourceSvg.ts | 44 + src/lib/wordCloud.ts | 138 + src/lib/wordcloudApi.ts | 74 + src/lib/wordcloudImport.ts | 137 + src/main.tsx | 13 + src/pages/PersonalSearchPage.module.css | 23 + src/pages/PersonalSearchPage.tsx | 90 + src/pages/PublicDisplayPage.module.css | 36 + src/pages/PublicDisplayPage.tsx | 88 + src/pages/RemoteControllerPage.module.css | 83 + src/pages/RemoteControllerPage.tsx | 105 + .../__tests__/realtimeAdapter.test.ts | 27 + src/realtime/__tests__/realtimeConfig.test.ts | 41 + .../websocketRealtimeChannel.test.ts | 64 + src/realtime/broadcastRealtimeChannel.ts | 36 + src/realtime/focusEventGuard.ts | 21 + src/realtime/realtimeConfig.ts | 30 + src/realtime/websocketRealtimeChannel.ts | 55 + src/styles/global.css | 112 + src/test/setup.ts | 12 + src/types/channel.ts | 18 + src/types/cloud.ts | 30 + src/vite-env.d.ts | 16 + tsconfig.json | 21 + vite.config.ts | 26 + 91 files changed, 12401 insertions(+) create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 .gitea/workflows/build.yml create mode 100644 .gitignore create mode 100644 AGENTS.md create mode 100644 Design/DESIGN-HANDOFF.md create mode 100644 Design/DESIGN-MANIFEST.json create mode 100644 Design/control.html create mode 100644 Design/drawing-2026-09-12T12-48-14-971Z.png create mode 100644 Design/index.html create mode 100644 Design/screen.html create mode 100644 Dockerfile.frontend create mode 100644 README.md create mode 100755 deploy.sh create mode 100644 deploy/nginx.conf create mode 100644 docker-compose.yml create mode 100644 eslint.config.js create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/wordclouds/40588babde574efeb9643f4af05c8d43.svg create mode 100644 server/.dockerignore create mode 100644 server/Dockerfile create mode 100644 server/package-lock.json create mode 100644 server/package.json create mode 100644 server/realtime-server.mjs create mode 100644 server/realtime-server.test.mjs create mode 100644 src/App.tsx create mode 100644 src/AppRoutes.test.tsx create mode 100644 src/AppRoutes.tsx create mode 100644 src/components/CloudHeader.module.css create mode 100644 src/components/CloudHeader.tsx create mode 100644 src/components/CloudLoadingState.tsx create mode 100644 src/components/CloudUnavailableState.module.css create mode 100644 src/components/CloudUnavailableState.tsx create mode 100644 src/components/ControllerSuccessState.module.css create mode 100644 src/components/ControllerSuccessState.tsx create mode 100644 src/components/FloatingSearchDock.module.css create mode 100644 src/components/FloatingSearchDock.tsx create mode 100644 src/components/FullscreenButton.module.css create mode 100644 src/components/FullscreenButton.tsx create mode 100644 src/components/QRPanel.module.css create mode 100644 src/components/QRPanel.tsx create mode 100644 src/components/SearchResultState.module.css create mode 100644 src/components/SearchResultState.tsx create mode 100644 src/components/TitleFrost.module.css create mode 100644 src/components/TitleFrost.tsx create mode 100644 src/components/WordCloudCanvas.module.css create mode 100644 src/components/WordCloudCanvas.test.tsx create mode 100644 src/components/WordCloudCanvas.tsx create mode 100644 src/config/focus.ts create mode 100644 src/config/wordcloudApi.test.ts create mode 100644 src/config/wordcloudApi.ts create mode 100644 src/data/clouds/demo.ts create mode 100644 src/data/clouds/imported.ts create mode 100644 src/data/clouds/importedWordcloud.json create mode 100644 src/data/clouds/index.ts create mode 100644 src/hooks/__tests__/focusQueue.test.ts create mode 100644 src/hooks/__tests__/useWordCloudFocus.test.ts create mode 100644 src/hooks/focusQueue.ts create mode 100644 src/hooks/useCloud.ts create mode 100644 src/hooks/useFocusQueue.ts create mode 100644 src/hooks/useWordCloudChannel.ts create mode 100644 src/hooks/useWordCloudFocus.ts create mode 100644 src/lib/__tests__/wordCloud.test.ts create mode 100644 src/lib/__tests__/wordcloudImport.test.ts create mode 100644 src/lib/sourceSvg.ts create mode 100644 src/lib/wordCloud.ts create mode 100644 src/lib/wordcloudApi.ts create mode 100644 src/lib/wordcloudImport.ts create mode 100644 src/main.tsx create mode 100644 src/pages/PersonalSearchPage.module.css create mode 100644 src/pages/PersonalSearchPage.tsx create mode 100644 src/pages/PublicDisplayPage.module.css create mode 100644 src/pages/PublicDisplayPage.tsx create mode 100644 src/pages/RemoteControllerPage.module.css create mode 100644 src/pages/RemoteControllerPage.tsx create mode 100644 src/realtime/__tests__/realtimeAdapter.test.ts create mode 100644 src/realtime/__tests__/realtimeConfig.test.ts create mode 100644 src/realtime/__tests__/websocketRealtimeChannel.test.ts create mode 100644 src/realtime/broadcastRealtimeChannel.ts create mode 100644 src/realtime/focusEventGuard.ts create mode 100644 src/realtime/realtimeConfig.ts create mode 100644 src/realtime/websocketRealtimeChannel.ts create mode 100644 src/styles/global.css create mode 100644 src/test/setup.ts create mode 100644 src/types/channel.ts create mode 100644 src/types/cloud.ts create mode 100644 src/vite-env.d.ts create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..3104513 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +node_modules +dist +coverage +screenshots +.git +.DS_Store +.env +server/node_modules diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..525dd68 --- /dev/null +++ b/.env.example @@ -0,0 +1,9 @@ +APP_PORT=47880 +VITE_REALTIME_MODE=websocket +VITE_REALTIME_WS_URL=/ws +VITE_WORDCLOUD_API_BASE_URL=/wordcloud-api +VITE_WORDCLOUD_DEFAULT_JOB_ID=bd1f240adcb4458f857c40ac427122c6 +WORDCLOUD_API_UPSTREAM=http://114.55.99.6:8000 +HARBOR_REGISTRY=192.168.31.213:10081 +HARBOR_PROJECT=wordcloud +IMAGE_TAG=latest diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml new file mode 100644 index 0000000..2ef87d3 --- /dev/null +++ b/.gitea/workflows/build.yml @@ -0,0 +1,68 @@ +name: Build, Push and Deploy + +on: + push: + branches: [main, master, hotfix/*] + +env: + HARBOR: 192.168.31.213:10081 + HARBOR_REGISTRY: 192.168.31.213:10081 + HARBOR_PROJECT: wordcloud + APP_PORT: 47880 + WORDCLOUD_API_UPSTREAM: http://192.168.31.213:8000 + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout code + run: | + set -euo pipefail + GITEA_URL="${GITHUB_SERVER_URL:-http://192.168.31.213:10880}" + git init -q . + git remote add origin "$GITEA_URL/$GITHUB_REPOSITORY.git" + git fetch -q --depth 1 origin "$GITHUB_SHA" + git checkout -q "$GITHUB_SHA" + + - name: Login Harbor + run: | + echo "${{ secrets.HARBOR_PASS }}" | docker login "$HARBOR" \ + -u "${{ secrets.HARBOR_USER }}" --password-stdin + + - name: Build Docker images + run: | + if docker compose version >/dev/null 2>&1; then + COMPOSE="docker compose" + else + COMPOSE="docker-compose" + fi + $COMPOSE build + + - name: Tag and push images + run: | + set -euo pipefail + SHA="${{ github.sha }}" + for name in wordcloud-board-app wordcloud-board-realtime; do + image="$HARBOR/$HARBOR_PROJECT/$name" + docker tag "$image:latest" "$image:$SHA" + docker push "$image:latest" + docker push "$image:$SHA" + done + + deploy: + needs: build + runs-on: ubuntu-latest + steps: + - name: Checkout deploy config + run: | + set -euo pipefail + GITEA_URL="${GITHUB_SERVER_URL:-http://192.168.31.213:10880}" + git init -q . + git remote add origin "$GITEA_URL/$GITHUB_REPOSITORY.git" + git fetch -q --depth 1 origin "$GITHUB_SHA" + git checkout -q "$GITHUB_SHA" + + - name: Deploy WordCloud Board + run: | + chmod +x ./deploy.sh + ./deploy.sh wordcloud-board production "${{ github.sha }}" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2164b23 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +node_modules +dist +coverage +screenshots +*.local +.DS_Store +.env diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..29b4e79 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,66 @@ +# Repository Guidelines + +## Project Structure + +- `Design/` is the current source of truth for the product experience. +- `Design/index.html` is the overview/launcher entry point. +- `Design/control.html` is the participant control surface. +- `Design/screen.html` is the full-screen word-cloud display. +- `Design/DESIGN-MANIFEST.json` maps screens, assets, required states, and responsive checks. +- `Design/DESIGN-HANDOFF.md` defines the implementation contract and must be read before adding production code. +- `Design/drawing-*.png` and future design assets live beside the HTML screens. + +The app is a React + TypeScript + Vite project rooted at the repository root; `Design/` remains the confirmed visual reference. + +## Development Commands + +Use npm for the React app: + +```bash +npm install +npm run dev +``` + +Run verification before claiming completion: + +```bash +npm test +npm run typecheck +npm run lint +npm run build +npm run test:server +``` + +For production, build and run with `docker compose up -d --build`; the port is configured with `APP_PORT`. Nginx serves the SPA and forwards `/ws` to the realtime container. + +For direct design-file inspection without the app: + +```bash +python3 -m http.server 8000 --directory Design +``` + +Then open `http://localhost:8000/index.html`, `/control.html`, or `/screen.html`. + +## Coding Style + +- Keep pages, reusable components, data, hooks, and realtime adapters separated. +- Use two-space indentation for HTML, CSS, TypeScript, and JavaScript. +- Use CSS Modules for page/component styles and keep visual values in `src/styles/global.css`. +- Preserve existing CSS custom properties for color, typography, spacing, radius, shadow, and motion. +- Use descriptive BEM-like class names such as `art-title`, `cloud`, `dock`, and `screen-note`; do not introduce anonymous utility classes for domain-specific layout. +- Keep user-facing copy in the existing Chinese-first style and preserve exact labels unless requirements say otherwise. +- Prefer semantic elements and visible focus states for any interactive implementation. + +## Testing Guidelines + +Use Vitest and React Testing Library. Keep core search, duplicate-target, queue, and adapter behavior covered by tests. For visual or interaction changes, also verify all three routes in a browser, check mobile and desktop viewports, and ensure no horizontal overflow or hidden controls. The manifest's responsive viewport list is the minimum visual checklist. + +## Commit & Pull Request Guidelines + +Use short, imperative commit subjects, for example `Update screen word positions` or `Add control success state`. + +Pull requests should include the change reason, affected screen files, browser and viewport checks performed, and screenshots or short recordings for visual changes. Link related implementation or design tickets when available. + +## Agent Guidance + +Before implementing production code, read `DESIGN-HANDOFF.md` and `DESIGN-MANIFEST.json`, preserve the documented visual system, and keep launcher, control, and display surfaces separate. diff --git a/Design/DESIGN-HANDOFF.md b/Design/DESIGN-HANDOFF.md new file mode 100644 index 0000000..5e9cf87 --- /dev/null +++ b/Design/DESIGN-HANDOFF.md @@ -0,0 +1,89 @@ +# 65d91830-ed68-4c91-99dc-b18d3b4d3d35 implementation handoff + +This archive is the source of truth for turning the design into production code. Start from `index.html`, then preserve the visual system, responsive behavior, and interactions found in the exported files. + +## Implementation target +- Build production UI from the exported design, not a loose reinterpretation. +- Preserve typography scale, spacing rhythm, color tokens, border radii, shadows, motion timing, and component states. +- Replace static placeholders only when the target app has real data or functional equivalents. +- Keep generated product UI free of OpenDesign chrome, preview labels, or design-process annotations. +- Treat this handoff as a visual contract: if implementation choices conflict, match the exported pixels and behavior first, then refactor internals. + +## Source map +- Primary entry: `index.html` +- HTML screens detected: 3 +- Stylesheets detected: 0 +- Script/component files detected: 0 +- Supporting assets detected: 1 + +## Responsive contract +Validate the implementation across this 2025–2026 viewport matrix: +- Mobile compact: 360×800 +- Mobile standard: 390×844 +- Mobile large: 430×932 +- Foldable / small tablet: 600×960 +- Tablet portrait: 820×1180 +- Tablet landscape: 1024×768 +- Laptop: 1366×768 +- Desktop: 1440×900 +- Wide desktop: 1920×1080 + +For responsive web exports, treat these as a modern breakpoint system for one adaptive web experience, not three fixed screenshots. Do not split responsive web into unrelated native app screens unless the project explicitly includes native targets. Use semantic layout thresholds, fluid `clamp()` type/spacing, and container queries where component width matters more than viewport width. Preserve any CSS media queries, container queries, fluid `clamp()` scales, and layout changes already present in the exported files. + +## Design fidelity contract +- Extract reusable tokens before writing components: background, surface, foreground, muted text, border, accent, radius, shadow, spacing, type scale, and motion duration/easing. +- Map product screens, in-app modules/components, optional landing page, and optional OS widget surfaces before coding. Keep these surfaces separate in the target architecture. +- Match layout geometry: max-widths, gutters, grid columns, card proportions, sticky/fixed elements, and viewport-specific navigation. +- Preserve real copy, labels, and data shown in the export. Do not replace specific text with generic marketing filler. +- Preserve interactive affordances: hover, focus, pressed, disabled, loading, validation, copy/share, tab/accordion, modal/sheet, and keyboard states where present. +- Preserve accessibility semantics when converting: headings stay hierarchical, controls remain buttons/links/inputs, focus states stay visible. +- Do not keep prototype-only annotations, frame labels, or OpenDesign chrome in the production UI. + +## CJX-ready UX contract +- Use `DESIGN-MANIFEST.json` as the machine-readable map for screens, app modules, OS widgets, landing pages, tokens, interactions, and viewport checks. +- Screen-file-first: when multiple user-facing surfaces exist, implement each HTML screen as its own route/file. Treat `index.html` as a launcher/overview when the manifest marks it that way, not as a combined final UI. +- If `landing.html`, app screens, platform screens, or OS widget files exist, preserve those boundaries in the target app instead of merging them into one page. +- A single self-contained `index.html` is acceptable only when the export truly contains one user-facing screen and its CSS/JS are structured enough to extract tokens, components, states, and behavior. +- If separate `css/` or `js/` files exist, treat them as source of truth for token/component/interactions before porting to React, Vue, SwiftUI, Compose, or another target stack. +- In-app modules/components are product UI blocks inside the app. OS widgets are home-screen/lock-screen/quick-access surfaces outside the app. Do not merge those concepts. + +## Color and brand contract +- Use the exported design tokens and product/domain context as the color source of truth. +- Do not introduce warm beige / cream / peach / pink / orange-brown background washes unless they are already explicit brand/reference colors in the export. +- No obvious token stylesheet was detected; sample colors from the entry file and convert them into named tokens before coding. + +## Implementation sequence for AI coding tools +1. Open `index.html` and `DESIGN-MANIFEST.json`; identify every screen file, launcher/overview file, app module, and interaction before coding. +2. If multiple HTML screens exist, map them to separate routes/surfaces first; do not merge `landing.html`, product app screens, platform screens, or OS widgets into one route. +3. Extract a token table from CSS/root styles and inline styles before building framework components. +4. Build product screens and domain-specific in-app modules from largest layout regions down to controls; avoid starting with isolated atoms that lose spatial intent. +5. Port responsive behavior across the modern viewport matrix and test each semantic breakpoint before cleanup. +6. Port interactions and states, then replace static placeholders only with real app data or functional equivalents. +7. Keep optional landing page and OS widget surfaces as separate surfaces if present. +8. Compare final screenshots against the export at 360×800, 390×844, 430×932, 820×1180, 1024×768, 1366×768, 1440×900, and 1920×1080 before declaring done. + +## Entry points +- `control.html` +- `index.html` +- `screen.html` + +## Styles +- None detected + +## Scripts/components +- None detected + +## Assets and supporting files +- `drawing-2026-09-12T12-48-14-971Z.png` + +## Coding checklist for AI tools +1. Inspect `index.html` and `DESIGN-MANIFEST.json` first and identify reusable components before coding. +2. Implement each user-facing screen file as its own route/surface; keep launcher, landing, app, platform, and OS widget files separate. +3. Extract design tokens into the target stack: colors, type scale, spacing, radius, shadows, and motion. +4. Implement layout with real 2025–2026 responsive breakpoints, fluid type/spacing, and container-query-aware component behavior; test with no horizontal overflow. +5. Preserve interactive controls, hover/focus/pressed states, form behavior, validation, and copy actions where present. +6. Implement domain-specific in-app modules with real states; do not flatten them into generic cards. +7. Keep landing page, product screens, and OS widget/quick-access surfaces separate when present. +8. Confirm the production result visually matches the exported design before refactoring internals. +9. Reject implementation shortcuts that flatten the design into generic cards, generic gradients, placeholder stats, or framework-default typography. +10. If a detail is ambiguous, keep the exported HTML/CSS/JS behavior rather than inventing a new pattern. diff --git a/Design/DESIGN-MANIFEST.json b/Design/DESIGN-MANIFEST.json new file mode 100644 index 0000000..0c9cda2 --- /dev/null +++ b/Design/DESIGN-MANIFEST.json @@ -0,0 +1,185 @@ +{ + "schema": "open-design.design-manifest.v1", + "title": "65d91830-ed68-4c91-99dc-b18d3b4d3d35", + "entryFile": "index.html", + "sourceFiles": { + "all": [ + "control.html", + "drawing-2026-09-12T12-48-14-971Z.png", + "index.html", + "screen.html" + ], + "html": [ + "control.html", + "index.html", + "screen.html" + ], + "css": [], + "scriptsAndComponents": [], + "assets": [ + "drawing-2026-09-12T12-48-14-971Z.png" + ] + }, + "screens": [ + { + "file": "control.html", + "role": "screen", + "implementationNote": "Preserve visual hierarchy, responsive behavior, and interactive states from this screen." + }, + { + "file": "index.html", + "role": "launcher-overview", + "implementationNote": "Use this as the navigation/overview entry only; implement each linked screen file as its own route/surface." + }, + { + "file": "screen.html", + "role": "product-screen", + "implementationNote": "Preserve visual hierarchy, responsive behavior, and interactive states from this screen." + } + ], + "screenFilePolicy": { + "mode": "screen-file-first", + "entryFileRole": "launcher-overview", + "rules": [ + "Each distinct user-facing screen or surface must be delivered and implemented as its own file/route.", + "If a landing page is present or requested, keep it in landing.html and do not merge it into the product app screen.", + "When multiple HTML screens exist, index.html is a launcher/overview only; it must not be treated as the combined final UI.", + "Keep product app screens, landing pages, platform screens, and OS widget surfaces separate in production code." + ] + }, + "appModules": [ + "Identify domain-specific in-app modules from the exported UI; do not reduce them to generic cards.", + "For each major module, implement purpose, default/loading/empty/error/success states, and responsive behavior.", + "Keep app modules separate from OS home-screen widgets in the production component model." + ], + "osWidgets": [ + "If the export includes home-screen, lock-screen, Live Activity, tablet glance, or Android widget surfaces, implement them as platform quick-access surfaces outside the app UI.", + "If none are present, do not invent OS widgets unless the product requirements request them." + ], + "landingPage": { + "detection": "Inspect files and screen names for a marketing/landing page surface. If present, keep it separate from product app screens.", + "requiredSections": [ + "hero", + "value props", + "product proof/screenshots", + "feature proof", + "CTA" + ] + }, + "tokens": { + "source": [ + "index.html" + ], + "required": [ + "background", + "surface", + "foreground", + "muted text", + "border", + "accent", + "radius", + "shadow", + "spacing", + "type scale", + "motion" + ], + "note": "Extract/freeze tokens before framework implementation so coding tools do not substitute default theme colors or typography." + }, + "interactions": { + "source": [ + "index.html" + ], + "requiredStates": [ + "default", + "hover", + "focus", + "active", + "disabled", + "loading", + "empty", + "error", + "success" + ], + "requiredBehaviors": [ + "forms/validation where present", + "tabs/filters where present", + "dialogs/sheets/drawers where present", + "copy/generate/share actions where present", + "player or quick controls where present" + ], + "note": "If the prototype is static, derive missing behavior from visible controls and document it before coding." + }, + "responsiveViewports": [ + { + "name": "mobile-compact", + "width": 360, + "height": 800, + "category": "mobile", + "mustAvoidHorizontalScroll": true + }, + { + "name": "mobile-standard", + "width": 390, + "height": 844, + "category": "mobile", + "mustAvoidHorizontalScroll": true + }, + { + "name": "mobile-large", + "width": 430, + "height": 932, + "category": "mobile", + "mustAvoidHorizontalScroll": true + }, + { + "name": "foldable-small-tablet", + "width": 600, + "height": 960, + "category": "foldable-tablet", + "mustAvoidHorizontalScroll": true + }, + { + "name": "tablet-portrait", + "width": 820, + "height": 1180, + "category": "tablet", + "mustAvoidHorizontalScroll": true + }, + { + "name": "tablet-landscape", + "width": 1024, + "height": 768, + "category": "tablet", + "mustAvoidHorizontalScroll": true + }, + { + "name": "laptop", + "width": 1366, + "height": 768, + "category": "desktop", + "mustAvoidHorizontalScroll": true + }, + { + "name": "desktop", + "width": 1440, + "height": 900, + "category": "desktop", + "mustAvoidHorizontalScroll": true + }, + { + "name": "wide", + "width": 1920, + "height": 1080, + "category": "wide", + "mustAvoidHorizontalScroll": true + } + ], + "implementationChecklist": [ + "Open entryFile first and map screens, modules, tokens, and interactions.", + "Extract tokens before writing framework components.", + "Implement app-specific modules with real states instead of generic card grids.", + "Preserve or rebuild JS interactions for meaningful UX actions.", + "Validate screenshots at desktop/tablet/mobile viewports with no horizontal overflow.", + "Keep landing pages, in-app modules, and OS widgets as separate implementation surfaces." + ] +} \ No newline at end of file diff --git a/Design/control.html b/Design/control.html new file mode 100644 index 0000000..d8079d6 --- /dev/null +++ b/Design/control.html @@ -0,0 +1,60 @@ + + + + + +遥控器 · 找到你自己 + + + +
+
+

LIVE · 现场互动

+

找到你自己

+

输入名字,它会出现在大屏幕上。

+
+ +
输入你的名字
+
+
在大屏上找到我
+
+
+

找到了 · 抬头看看大屏

+

几秒后大屏会恢复完整词云 · 再找一个名字

+
+

请留意现场大屏

+

静态设计示意 · 不可交互

+
+
+ + diff --git a/Design/drawing-2026-09-12T12-48-14-971Z.png b/Design/drawing-2026-09-12T12-48-14-971Z.png new file mode 100644 index 0000000000000000000000000000000000000000..ed79cf5dd21ea68fd93b6f5f9364c6d9b050d0e7 GIT binary patch literal 97557 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 literal 0 HcmV?d00001 diff --git a/Design/index.html b/Design/index.html new file mode 100644 index 0000000..46efc48 --- /dev/null +++ b/Design/index.html @@ -0,0 +1,126 @@ + + + + + +个人查找 · 词云 + + + + +

+

LIVE ARCHIVE · 2026

+
+

2026 毕业典礼 · 全体名单

+

CLASS OF 2026 · WORD CLOUD

+
+ +
+
+
+
输入你的名字
+
查找
+
+
+ 找到你了 · 王小明 + 你在这里 · 静态示意,不可点击 +
+ 查看全图 + 找到 2 处 · 1 / 2 +
+
+

静态设计示意 · 不可交互

+
+
+
+ + diff --git a/Design/screen.html b/Design/screen.html new file mode 100644 index 0000000..08fcbec --- /dev/null +++ b/Design/screen.html @@ -0,0 +1,98 @@ + + + + + +大屏展示 · 词云 + + + +
+

LIVE ARCHIVE · 2026

+
+

2026 毕业典礼 · 全体名单

+

CLASS OF 2026 · WORD CLOUD

+
+

静态设计示意 · 不可交互

+ +

THIS WALL IS MADE OF EVERYONE HERE

+ +
+ + diff --git a/Dockerfile.frontend b/Dockerfile.frontend new file mode 100644 index 0000000..3592e7b --- /dev/null +++ b/Dockerfile.frontend @@ -0,0 +1,25 @@ +FROM node:22-alpine AS build +WORKDIR /app + +COPY package.json package-lock.json ./ +RUN npm ci + +COPY . . +ARG VITE_REALTIME_MODE=websocket +ARG VITE_REALTIME_WS_URL=/ws +ARG VITE_WORDCLOUD_API_BASE_URL=/wordcloud-api +ARG VITE_WORDCLOUD_DEFAULT_JOB_ID=bd1f240adcb4458f857c40ac427122c6 +ENV VITE_REALTIME_MODE=$VITE_REALTIME_MODE +ENV VITE_REALTIME_WS_URL=$VITE_REALTIME_WS_URL +ENV VITE_WORDCLOUD_API_BASE_URL=$VITE_WORDCLOUD_API_BASE_URL +ENV VITE_WORDCLOUD_DEFAULT_JOB_ID=$VITE_WORDCLOUD_DEFAULT_JOB_ID +RUN npm run build + +FROM nginx:1.27-alpine +ENV WORDCLOUD_API_UPSTREAM=http://192.168.31.213:8000 +COPY deploy/nginx.conf /etc/nginx/templates/default.conf.template +COPY --from=build /app/dist /usr/share/nginx/html + +EXPOSE 80 +HEALTHCHECK --interval=15s --timeout=3s --start-period=5s --retries=3 \ + CMD wget -qO- http://127.0.0.1/healthz | grep -q '^ok$' diff --git a/README.md b/README.md new file mode 100644 index 0000000..93951a0 --- /dev/null +++ b/README.md @@ -0,0 +1,76 @@ +# wc-board + +词云现场互动 Web 应用,包含个人查找、大屏展示和遥控器三个页面。`demo` 可用于离线验收;其他路由会在运行时加载 WordCloud 任务的位置数据与 SVG。 + +## Quick Start + +```bash +npm install +npm run dev +``` + +打开以下路由验证离线完整流程: + +```text +/cloud/demo +/screen/demo +/control/demo +``` + +在同一浏览器的两个 tab 中分别打开大屏与遥控器后,遥控器提交名字可以让大屏聚焦;多个连续提交会排队展示。 + +## Commands + +```bash +npm run dev +npm run build +npm run preview +npm test +npm run typecheck +npm run lint +``` + +## Structure + +- `src/pages/`:Personal Search、Public Display、Remote Controller。 +- `src/components/`:词云、搜索 dock、QR panel、状态组件。 +- `src/data/clouds/`:离线 `demo` 词云数据。 +- `src/lib/wordcloudApi.ts`:WordCloud API 适配器;运行时读取位置数据与 SVG。 +- `src/hooks/useCloud.ts`:为三个页面统一加载本地 demo 或远程任务词云。 +- `src/hooks/`:focus lifecycle、queue 和 realtime integration。 +- `src/realtime/`:BroadcastChannel adapter;后续 WebSocket/Supabase 等实现替换这一层。 +- `src/styles/global.css`:从既有设计提取的全局 tokens。 +- `Design/`:已确认的视觉基准和设计 handoff。 + +本地开发默认使用同一浏览器内的 BroadcastChannel;生产构建默认使用同源 WebSocket adapter,适合多设备访问。当前 realtime 服务是内存转发,暂不保存名单或事件。 + +## Production Deployment + +```bash +cp .env.example .env +docker compose up -d --build +``` + +默认端口由 `.env` 的 `APP_PORT` 控制,例如 `APP_PORT=47880` 时通过下面地址访问: + +```text +http://:47880/cloud/demo +http://:47880/screen/demo +http://:47880/control/demo +``` + +生产构建使用 WebSocket adapter,浏览器连接同源 `/ws`;Nginx 会将该路径转发到 `realtime` 容器。因为二维码按当前浏览器的 origin 生成,通过 A 域名打开大屏时,扫码会进入 A 域名的 Controller,而不会跳去 B 域名。 + +如果 A 和 B 是不同域名并都指向同一台服务器,可以在外层网关或 DNS 上都转发到 Compose 暴露的端口;前端与二维码会保留访问者实际使用的域名。 + +除 `demo` 外,路由参数即 WordCloud `jobId`。例如: + +```text +/cloud/bd1f240adcb4458f857c40ac427122c6 +/screen/bd1f240adcb4458f857c40ac427122c6 +/control/bd1f240adcb4458f857c40ac427122c6 +``` + +`/cloud/imported`、`/screen/imported` 与 `/control/imported` 是由 `VITE_WORDCLOUD_DEFAULT_JOB_ID` 配置的默认任务别名。应用默认从同源 `/wordcloud-api` 读取位置与 SVG,Nginx 再将其转发到 `WORDCLOUD_API_UPSTREAM`,默认值为 `http://192.168.31.213:8000`。这样浏览器不需要跨域读取 SVG,且多域名部署时仍保留访问者实际使用的域名。 + +本地 `npm run dev` 也会将 `/wordcloud-api` 转发到同一个后端。只有在已具备可靠 CORS 的场景,才需要把 `VITE_WORDCLOUD_API_BASE_URL` 改为完整的远端 URL。 diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..39689d5 --- /dev/null +++ b/deploy.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +set -euo pipefail + +APP_NAME="${1:-wordcloud-board}" +TARGET_ENV="${2:-production}" +IMAGE_TAG="${3:-latest}" + +cd "$(dirname "$0")" + +if docker compose version >/dev/null 2>&1; then + COMPOSE="docker compose" +else + COMPOSE="docker-compose" +fi + +export COMPOSE_PROJECT_NAME="${APP_NAME}" +export HARBOR_REGISTRY="${HARBOR_REGISTRY:-192.168.31.213:10081}" +export HARBOR_PROJECT="${HARBOR_PROJECT:-wordcloud}" +export APP_PORT="${APP_PORT:-47880}" +export WORDCLOUD_API_UPSTREAM="${WORDCLOUD_API_UPSTREAM:-http://192.168.31.213:8000}" +export IMAGE_TAG + +echo "[deploy] project=${APP_NAME} env=${TARGET_ENV} image_tag=${IMAGE_TAG} port=${APP_PORT}" +"$COMPOSE" pull +"$COMPOSE" up -d --remove-orphans +"$COMPOSE" ps diff --git a/deploy/nginx.conf b/deploy/nginx.conf new file mode 100644 index 0000000..d108b73 --- /dev/null +++ b/deploy/nginx.conf @@ -0,0 +1,57 @@ +map $http_upgrade $connection_upgrade { + default upgrade; + '' close; +} + +server { + listen 80; + server_name _; + root /usr/share/nginx/html; + index index.html; + + gzip on; + gzip_types text/plain text/css application/javascript application/json image/svg+xml; + gzip_min_length 1024; + + location = /healthz { + access_log off; + default_type text/plain; + return 200 'ok\n'; + } + + location /ws { + proxy_pass http://realtime:8787; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Port $server_port; + proxy_read_timeout 1d; + proxy_send_timeout 1d; + } + + location ^~ /wordcloud-api/ { + proxy_pass ${WORDCLOUD_API_UPSTREAM}/; + proxy_http_version 1.1; + proxy_set_header Host $proxy_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Port $server_port; + } + + location ^~ /assets/ { + try_files $uri =404; + add_header Cache-Control "public, max-age=31536000, immutable"; + } + + location / { + try_files $uri $uri/ /index.html; + add_header Cache-Control "no-store, must-revalidate"; + } +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..f2bbf10 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,30 @@ +services: + app: + image: ${HARBOR_REGISTRY:-192.168.31.213:10081}/wordcloud/wordcloud-board-app:${IMAGE_TAG:-latest} + build: + context: . + dockerfile: Dockerfile.frontend + args: + VITE_REALTIME_MODE: ${VITE_REALTIME_MODE:-websocket} + VITE_REALTIME_WS_URL: ${VITE_REALTIME_WS_URL:-/ws} + VITE_WORDCLOUD_API_BASE_URL: ${VITE_WORDCLOUD_API_BASE_URL:-/wordcloud-api} + VITE_WORDCLOUD_DEFAULT_JOB_ID: ${VITE_WORDCLOUD_DEFAULT_JOB_ID:-bd1f240adcb4458f857c40ac427122c6} + ports: + - "${APP_PORT:-47880}:80" + depends_on: + realtime: + condition: service_healthy + environment: + WORDCLOUD_API_UPSTREAM: ${WORDCLOUD_API_UPSTREAM:-http://192.168.31.213:8000} + restart: unless-stopped + + realtime: + image: ${HARBOR_REGISTRY:-192.168.31.213:10081}/wordcloud/wordcloud-board-realtime:${IMAGE_TAG:-latest} + build: + context: ./server + dockerfile: Dockerfile + environment: + REALTIME_PORT: 8787 + expose: + - "8787" + restart: unless-stopped diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..76baa98 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,26 @@ +import js from '@eslint/js'; +import globals from 'globals'; +import reactHooks from 'eslint-plugin-react-hooks'; +import reactRefresh from 'eslint-plugin-react-refresh'; +import tseslint from 'typescript-eslint'; + +export default tseslint.config( + { ignores: ['dist', 'node_modules'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'no-console': 'warn', + '@typescript-eslint/no-explicit-any': 'error', + }, + }, +); diff --git a/index.html b/index.html new file mode 100644 index 0000000..6ef460d --- /dev/null +++ b/index.html @@ -0,0 +1,12 @@ + + + + + + 找到你自己 · 词云 + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..d191ffb --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5339 @@ +{ + "name": "wc-board", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "wc-board", + "version": "0.1.0", + "dependencies": { + "lucide-react": "^1.45.0", + "qrcode": "^1.5.4", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^7.18.3" + }, + "devDependencies": { + "@eslint/js": "^8.57.1", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.1.0", + "@testing-library/user-event": "^14.5.2", + "@types/node": "^22.10.2", + "@types/qrcode": "^1.5.5", + "@types/react": "^18.3.18", + "@types/react-dom": "^18.3.5", + "@typescript-eslint/eslint-plugin": "^7.18.0", + "@typescript-eslint/parser": "^7.18.0", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^8.57.1", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-refresh": "^0.4.16", + "globals": "^15.14.0", + "jsdom": "^24.1.3", + "typescript": "~5.6.3", + "typescript-eslint": "^7.18.0", + "vite": "^5.4.19", + "vitest": "^2.1.8" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.5.0.tgz", + "integrity": "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.2.tgz", + "integrity": "sha512-Xa6RDoWa+hNiX6PgsljlH6W75RaONx3y6PVlbLhkEWW+GaPQ3dP5gwbL/erAzQHWwkvW5UxdD5l87Qx2FAQ/4A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.2.tgz", + "integrity": "sha512-vNASxsghMfQ5s+v3PrpnJd+ryL/26lxCCaGI+sDJ7VzmHiYXIrrVltsDhaawxLM1WcoMU2oYlbPHLaYQtBzhcg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.2.tgz", + "integrity": "sha512-0dWDjmlrpZAgjPD/aPzUDhBW8APLRjAni5bOrM76wiiZm+E+KTMVKNhAzaTBohz8UyO2fKNAl0+fygbe2HZXOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.2.tgz", + "integrity": "sha512-N58uktcwzk3+qT4KHEuNdIxX1N01RWrkfVoml69EAbSaNDL+sbNVLx2RMl4Qd23lpA0fgPvyh5hHb4weD5WKmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.2.tgz", + "integrity": "sha512-HWF2zH8EAp2scWRpt2PGe6iUGz7zi04waXsdRr3zb4DWCk2ImIo5FZu0jjmD53nP/DGSvnW0e7/1ToCNZs2lZw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.2.tgz", + "integrity": "sha512-MkvcwHMnzPSMOQEwB6wHnLzmc+hT8BGc5bW/Mhmjjgx3wbj6VBnlc47XsK74kD0K9MikFfXpQqyz4NUXaUW62A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.2.tgz", + "integrity": "sha512-xe1bCKPJaKsD0tfd7Rb6bGfUogJTpKbTEEthsfdb7hTfTRNJVQTdirabQx0o6ERVba/smkM720soMY+0QnrlSQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.2.tgz", + "integrity": "sha512-yOM7LdK0p6gk6+Q773OEwtlsikT1TL3yMmYsTtRlDRPha5vV2DC5x7LqRWDr6f3cSYNMKVqxzffXv8ivxNBIFQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.2.tgz", + "integrity": "sha512-qiWuJJV3DybA2IfzvRimeKXGrGuVPv1zobSY/26KnP3HbV0VcNb3ECzgvtbvF3xjSMkcooou6HASXZuLdjnhpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.2.tgz", + "integrity": "sha512-akcZquRzCY/KpUoZAMBhGf7oi4LmXq1BzRA5CPAC3rkUf28Y/sAYV3jSL+JKd7cwEyFvR5G0XVZ0gaMedP+60A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.2.tgz", + "integrity": "sha512-fNwYHrPyYyxauPzX/cpYw8Z7LQpp+DGA0KCoswA0aVFBpmdMil9XgjB8V3Ny64Ihu797+GKcuJqnsOKEmor7fA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.2.tgz", + "integrity": "sha512-XfvsgzR7DZqREdst7K1Mj3ilSUM5xLAHJcIMDFPKdxTs9q5VHOT8aMA+a683fqBu7DQl8+Sd9HCsQYL8EMY9qA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.2.tgz", + "integrity": "sha512-Pp7gVZggEFlbcuztay+/U0gVG9S1XAh8i7I1Re/htbAzo43P5wHZHw6pTyzotISqlKohoh9RpIfnOz3RbemK1w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.2.tgz", + "integrity": "sha512-zkgL2xff6i7u5hau/m6FGeS8gRkLEdgLw522WGmdWWlLd9btmNl3S80mcEjtGq+kvgUekQ3+BOYLLLcPlS2LIA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.2.tgz", + "integrity": "sha512-qOheJomrkVCbbHFJ7L3J97cnhfogKqguAQphv26+3ZsAQIF1L19b+dArl//s8rjJHJLz9byykyM8NBP4nmSa1g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.2.tgz", + "integrity": "sha512-XlxLD54wQhH3FciCgMofxBw27NzUe818gJH410qWvc41UT0ZFcgxVjyX5/EK8MPTupjeVWqN5oy+9pCA9mqfCA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.2.tgz", + "integrity": "sha512-vdryWeRb2bLJZf0Fv/W8se6nvsHe2PkTCxV0meheK3nQE+G90VCJcke51Miy1yQRsfm2uqIyjXOu4wmUzbTtkQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.2.tgz", + "integrity": "sha512-bcq2h2pkKmH2po4cZV8VWzO4lL40STyu/nLoFpYMQp9C2tCVNTdcVv86MwSsn3D5s1FBe2Ty1atqvVAUTMimNg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.2.tgz", + "integrity": "sha512-EGoo5DMVMRkTId8fuTDaoxVlR5ZTsKULUezRjd9gCw5eeY+DjCvDpZAOlNUvKPGX+7rS1RWx6j+yOpNPx0cUgQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.2.tgz", + "integrity": "sha512-MErl12k7BFHZG1TI9QF/3lSSZARzq9KgNy/FjnqFMCkv+N4RSSzoUCA5h2mqHX4Mox3WaTVKblyzhQ1zRb2ZuQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.2.tgz", + "integrity": "sha512-ILs8k07Wh4p0PsNY4wYLEaXZKMOpVhrG5QDB0yHhGhuzOfDlnyHN6sflL4El/MpUP1y8uY2lUZrv4oBS6pTT3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.2.tgz", + "integrity": "sha512-hKgB3nz/TKD3Wv78XEsyXzQsNjvhOHmwKQTvXADGOyU/cIClZDO7DsoggbdmJDPGp5V80tA3Vfv61PaKTLH3LA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.2.tgz", + "integrity": "sha512-T4wf1mudIDxN8Q/CWIBJC1u5gQUc+r5mPvlwoSbIvNkyVTP2TAFeobEmst5AQ4gMyAz4sSByVdoTDfvTmGK/8g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.2.tgz", + "integrity": "sha512-tC3IY7qoaD9Ll3/8WJQn49j5V2f/NuI9S41NOE2iM5MPs3sPIvOkVToLcz/7Bz4pyF7PSvrtwu8I/pUrGOSecQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.2.tgz", + "integrity": "sha512-6NHnk/K3eq2ZFYcU1X8g67s9qIJRCOTT92gwLMVBp08dB2uuuwI1/Q/empzL2Bfr2f2WRLJVwpp90RmacQyFkw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.3.tgz", + "integrity": "sha512-Uo193NgQbPMz6lrrhtRQQFcMC6Re/ELLFbbuVL30WDlZxlpZf9/lMHTAVxPRLw1q1iu9OJmR1c2BLiENRstdBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.7", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.7.tgz", + "integrity": "sha512-MPCpX8bxe8zS+JmmTwLp8jd0dy1rAm60Te/SL8JrQM3qvQJcBOs1d7IefJMyZzqM3EWBrDn/LWDt1BCGu4ASfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.20.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.2.tgz", + "integrity": "sha512-xlvWf4Vs9n1PEVYwP1n4vvG07M6y8WgvJ2t0vbrWTmijsIHp1cS+uJ2kMIRdY3nHZK0nCYKrPeD171+SzF4/zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/qrcode": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.5.6.tgz", + "integrity": "sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/react": { + "version": "18.3.31", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", + "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", + "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/type-utils": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", + "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz", + "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@vitest/expect": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz", + "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz", + "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.9", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", + "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz", + "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.1.9", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz", + "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz", + "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", + "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.22", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.22.tgz", + "integrity": "sha512-pWc4w51fBFd7mav43/zKRC+RI6f4yfzQoVlfvE8dECePyfkn1bzLp01Fj0QACcyCZyFhiEMyD2qScfKRWgWibA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.9.tgz", + "integrity": "sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.20", + "caniuse-lite": "^1.0.30001810", + "electron-to-chromium": "^1.5.420", + "node-releases": "^2.0.54", + "update-browserslist-db": "^1.3.2" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/dijkstrajs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", + "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==", + "license": "MIT" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.427", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.427.tgz", + "integrity": "sha512-n14zb3FdsChZ2BNobqNHAJMcP3ifFv4paox2LvCrfVAQcqGiSURgbJl+PfMpHVCNFkStnNc+RRVtPBTVW5PDgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", + "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "24.1.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.3.tgz", + "integrity": "sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.0.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.12", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.4", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.45.0.tgz", + "integrity": "sha512-yH1ubCAduho9UR7oJhRXIQXogksRILBiTuZC4/bQIGeB9JOkxMlSuEHyyZpo1Z3S0yWJO2KTSUZbjiNvVxeOUw==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.55", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.55.tgz", + "integrity": "sha512-mIrE/Cw9y+9Au6dS5vDKDhQza9YvG6w+ZrS6X+ZzA7yFW/soAeaups4Qzn1bL6g5FVy8WtP79+0j82oPIbqRjQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/nwsapi": { + "version": "2.2.27", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.27.tgz", + "integrity": "sha512-gQPNF78qebCQ6tvVFBYrvJdBNOrYZm90ZlXgpIFm06p6qHDHq/XC4TnJftN6OMbxVE0UTBAoRgcsDeJBBooITw==", + "dev": true, + "license": "MIT" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/postcss": { + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qrcode": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", + "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", + "license": "MIT", + "dependencies": { + "dijkstrajs": "^1.0.1", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.3.tgz", + "integrity": "sha512-gyXgtdr5uACJ5b1Q4udzjVV+tb/rlHIMJKuJ0e89R4Kzgz47z/rgP0dIKxktqIEUhDHluGTPJJH/wRha7CyqsA==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.3.tgz", + "integrity": "sha512-ytVbyBBM7vMfRCam25r0WMhSVSom909A8p+8m0/f1w853dz/xfFu6etAT2SEbVoSnI+ZoPRDqIsQXVT89gp7kg==", + "license": "MIT", + "dependencies": { + "react-router": "7.18.3" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "license": "ISC" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.63.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.2.tgz", + "integrity": "sha512-l5eyksV4tPBj6lJyEa37YzIOCSOV7lkZzEHUdpjWZbtD7wTcFYmEYXSgm5bT4vV+dZLb9rBG1W9GROOG4NS4Ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.63.2", + "@rollup/rollup-android-arm64": "4.63.2", + "@rollup/rollup-darwin-arm64": "4.63.2", + "@rollup/rollup-darwin-x64": "4.63.2", + "@rollup/rollup-freebsd-arm64": "4.63.2", + "@rollup/rollup-freebsd-x64": "4.63.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.63.2", + "@rollup/rollup-linux-arm-musleabihf": "4.63.2", + "@rollup/rollup-linux-arm64-gnu": "4.63.2", + "@rollup/rollup-linux-arm64-musl": "4.63.2", + "@rollup/rollup-linux-loong64-gnu": "4.63.2", + "@rollup/rollup-linux-loong64-musl": "4.63.2", + "@rollup/rollup-linux-ppc64-gnu": "4.63.2", + "@rollup/rollup-linux-ppc64-musl": "4.63.2", + "@rollup/rollup-linux-riscv64-gnu": "4.63.2", + "@rollup/rollup-linux-riscv64-musl": "4.63.2", + "@rollup/rollup-linux-s390x-gnu": "4.63.2", + "@rollup/rollup-linux-x64-gnu": "4.63.2", + "@rollup/rollup-linux-x64-musl": "4.63.2", + "@rollup/rollup-openbsd-x64": "4.63.2", + "@rollup/rollup-openharmony-arm64": "4.63.2", + "@rollup/rollup-win32-arm64-msvc": "4.63.2", + "@rollup/rollup-win32-ia32-msvc": "4.63.2", + "@rollup/rollup-win32-x64-gnu": "4.63.2", + "@rollup/rollup-win32-x64-msvc": "4.63.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.18.0.tgz", + "integrity": "sha512-PonBkP603E3tt05lDkbOMyaxJjvKqQrXsnow72sVeOFINDE/qNmnnd+f9b4N+U7W6MXnnYyrhtmF2t08QWwUbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "7.18.0", + "@typescript-eslint/parser": "7.18.0", + "@typescript-eslint/utils": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz", + "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz", + "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz", + "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "2.1.9", + "@vitest/mocker": "2.1.9", + "@vitest/pretty-format": "^2.1.9", + "@vitest/runner": "2.1.9", + "@vitest/snapshot": "2.1.9", + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", + "pathe": "^1.1.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.9", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.9", + "@vitest/ui": "2.1.9", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "license": "ISC" + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "license": "ISC" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..d5471b9 --- /dev/null +++ b/package.json @@ -0,0 +1,46 @@ +{ + "name": "wc-board", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "dev:realtime": "npm --prefix server run dev", + "build": "tsc --noEmit && vite build", + "preview": "vite preview", + "test": "vitest run", + "test:watch": "vitest", + "typecheck": "tsc --noEmit", + "lint": "eslint .", + "test:server": "npm --prefix server test" + }, + "dependencies": { + "lucide-react": "^1.45.0", + "qrcode": "^1.5.4", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^7.18.3" + }, + "devDependencies": { + "@eslint/js": "^8.57.1", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.1.0", + "@testing-library/user-event": "^14.5.2", + "@types/node": "^22.10.2", + "@types/qrcode": "^1.5.5", + "@types/react": "^18.3.18", + "@types/react-dom": "^18.3.5", + "@typescript-eslint/eslint-plugin": "^7.18.0", + "@typescript-eslint/parser": "^7.18.0", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^8.57.1", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-refresh": "^0.4.16", + "globals": "^15.14.0", + "jsdom": "^24.1.3", + "typescript": "~5.6.3", + "typescript-eslint": "^7.18.0", + "vite": "^5.4.19", + "vitest": "^2.1.8" + } +} diff --git a/public/wordclouds/40588babde574efeb9643f4af05c8d43.svg b/public/wordclouds/40588babde574efeb9643f4af05c8d43.svg new file mode 100644 index 0000000..14374ae --- /dev/null +++ b/public/wordclouds/40588babde574efeb9643f4af05c8d43.svg @@ -0,0 +1,2011 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/server/.dockerignore b/server/.dockerignore new file mode 100644 index 0000000..fd4f2b0 --- /dev/null +++ b/server/.dockerignore @@ -0,0 +1,2 @@ +node_modules +.DS_Store diff --git a/server/Dockerfile b/server/Dockerfile new file mode 100644 index 0000000..ebde046 --- /dev/null +++ b/server/Dockerfile @@ -0,0 +1,13 @@ +FROM node:22-alpine +WORKDIR /app + +COPY package.json package-lock.json ./ +RUN npm ci --omit=dev && npm cache clean --force +COPY realtime-server.mjs ./ + +USER node +EXPOSE 8787 +HEALTHCHECK --interval=15s --timeout=3s --start-period=5s --retries=3 \ + CMD wget -qO- http://127.0.0.1:8787/healthz | grep -q '"status":"ok"' + +CMD ["node", "realtime-server.mjs"] diff --git a/server/package-lock.json b/server/package-lock.json new file mode 100644 index 0000000..b4eae29 --- /dev/null +++ b/server/package-lock.json @@ -0,0 +1,36 @@ +{ + "name": "wc-board-realtime", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "wc-board-realtime", + "version": "0.1.0", + "dependencies": { + "ws": "^8.18.3" + } + }, + "node_modules/ws": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", + "license": "MIT", + "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 + } + } + } + } +} diff --git a/server/package.json b/server/package.json new file mode 100644 index 0000000..9f2288f --- /dev/null +++ b/server/package.json @@ -0,0 +1,14 @@ +{ + "name": "wc-board-realtime", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "node realtime-server.mjs", + "start": "node realtime-server.mjs", + "test": "node --test" + }, + "dependencies": { + "ws": "^8.18.3" + } +} diff --git a/server/realtime-server.mjs b/server/realtime-server.mjs new file mode 100644 index 0000000..8b7ae23 --- /dev/null +++ b/server/realtime-server.mjs @@ -0,0 +1,91 @@ +import { createServer } from 'node:http'; +import { pathToFileURL } from 'node:url'; +import { WebSocketServer } from 'ws'; + +function isFocusEvent(value) { + return ( + typeof value === 'object' && + value !== null && + value.type === 'FOCUS_NAME' && + typeof value.cloudId === 'string' && + typeof value.name === 'string' && + typeof value.messageId === 'string' && + typeof value.sentAt === 'number' && + (value.targetIndex === undefined || + (typeof value.targetIndex === 'number' && + Number.isInteger(value.targetIndex) && + value.targetIndex >= 0)) + ); +} + +export function createRealtimeServer(port = Number(process.env.REALTIME_PORT || 8787)) { + const server = createServer((request, response) => { + if (request.url === '/healthz') { + response.writeHead(200, { 'content-type': 'application/json' }); + response.end(JSON.stringify({ status: 'ok' })); + return; + } + + response.writeHead(404, { 'content-type': 'text/plain' }); + response.end('Not found'); + }); + const realtime = new WebSocketServer({ + server, + maxPayload: 16 * 1024, + }); + const heartbeat = setInterval(() => { + for (const socket of realtime.clients) { + if (socket.isAlive === false) { + socket.terminate(); + continue; + } + + socket.isAlive = false; + socket.ping(); + } + }, 30_000); + + heartbeat.unref(); + + realtime.on('connection', (socket) => { + socket.isAlive = true; + socket.on('pong', () => { + socket.isAlive = true; + }); + + socket.on('message', (data) => { + let value; + + try { + value = JSON.parse(data.toString()); + } catch { + return; + } + + if (!isFocusEvent(value)) { + return; + } + + const message = JSON.stringify(value); + + for (const client of realtime.clients) { + if (client !== socket && client.readyState === client.OPEN) { + client.send(message); + } + } + }); + }); + + realtime.on('close', () => { + clearInterval(heartbeat); + }); + + return server; +} + +if (import.meta.url === pathToFileURL(process.argv[1] || '').href) { + const port = Number(process.env.REALTIME_PORT || 8787); + createRealtimeServer(port).listen(port, () => { + console.log(`Realtime WebSocket server listening on port ${port}`); + }); +} diff --git a/server/realtime-server.test.mjs b/server/realtime-server.test.mjs new file mode 100644 index 0000000..e7635b4 --- /dev/null +++ b/server/realtime-server.test.mjs @@ -0,0 +1,45 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { createRealtimeServer } from './realtime-server.mjs'; +import WebSocket from 'ws'; + +test('broadcasts focus events to other connected clients', async () => { + const server = createRealtimeServer(0); + await new Promise((resolve) => server.listen(resolve)); + const { port } = server.address(); + + try { + const screen = new WebSocket(`ws://127.0.0.1:${port}`); + const controller = new WebSocket(`ws://127.0.0.1:${port}`); + + await Promise.all([ + new Promise((resolve) => screen.once('open', resolve)), + new Promise((resolve) => controller.once('open', resolve)), + ]); + + const received = new Promise((resolve) => { + screen.once('message', (data) => resolve(JSON.parse(data))); + }); + + controller.send(JSON.stringify({ + type: 'FOCUS_NAME', + cloudId: 'demo', + name: 'Sophia', + messageId: 'focus-1', + sentAt: 1, + })); + + assert.deepEqual(await received, { + type: 'FOCUS_NAME', + cloudId: 'demo', + name: 'Sophia', + messageId: 'focus-1', + sentAt: 1, + }); + + screen.close(); + controller.close(); + } finally { + await new Promise((resolve) => server.close(resolve)); + } +}); diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..76fa6b9 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,5 @@ +import { AppRoutes } from './AppRoutes'; + +export default function App() { + return ; +} diff --git a/src/AppRoutes.test.tsx b/src/AppRoutes.test.tsx new file mode 100644 index 0000000..482f14c --- /dev/null +++ b/src/AppRoutes.test.tsx @@ -0,0 +1,217 @@ +import { render, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { MemoryRouter } from 'react-router-dom'; +import { afterEach, vi } from 'vitest'; +import { AppRoutes } from './AppRoutes'; + +const remoteJobId = 'bd1f240adcb4458f857c40ac427122c6'; +const remoteLocationResult = { + job_id: remoteJobId, + query: '', + mode: 'exact', + total: 2, + canvas_width: 4000, + canvas_height: 3563, + matches: [ + { + id: 1, + name: '王小明', + x: 100, + y: 100, + font_size: 80, + color: '#000000', + orientation: 'horizontal', + box_x: 100, + box_y: 100, + box_width: 240, + box_height: 80, + }, + { + id: 2, + name: ' 李欣', + x: 400, + y: 400, + font_size: 48, + color: '#000000', + orientation: 'vertical', + box_x: 400, + box_y: 400, + box_width: 48, + box_height: 96, + }, + ], +}; +const remoteSvg = `${ + ''.repeat(5) +}`; + +function mockRemoteCloudApi() { + return vi.fn(async (input: RequestInfo | URL) => { + const url = String(input); + + if (url.endsWith(`/api/jobs/${remoteJobId}`)) { + return new Response('job not found', { status: 404 }); + } + + if (url.includes(`/api/jobs/${remoteJobId}/locations`)) { + return new Response(JSON.stringify(remoteLocationResult), { status: 200 }); + } + + if (url.endsWith(`/api/jobs/${remoteJobId}/files/svg`)) { + return new Response(remoteSvg, { status: 200 }); + } + + return new Response('not found', { status: 404 }); + }); +} + +afterEach(() => { + vi.unstubAllGlobals(); + vi.restoreAllMocks(); +}); + +describe('application routes', () => { + it('renders the personal search word cloud and input', () => { + render( + + + , + ); + + expect(screen.getAllByText('王小明')).toHaveLength(2); + expect(screen.getByPlaceholderText('输入你的名字')).toBeInTheDocument(); + }); + + it('enables the localized title layer on both word cloud views', () => { + const personal = render( + + + , + ); + + expect(personal.container.querySelector('[class*="title"]')) + .toHaveAttribute('data-layered', 'true'); + personal.unmount(); + + render( + + + , + ); + + expect(document.querySelector('[class*="title"]')) + .toHaveAttribute('data-layered', 'true'); + }); + + it('renders the public display with a real QR panel', async () => { + render( + + + , + ); + + expect(screen.getByRole('heading', { name: '2026 毕业典礼 · 全体名单' })).toBeInTheDocument(); + expect(await screen.findByRole('img', { name: '扫码进入遥控器' })).toBeInTheDocument(); + expect(screen.getByText('找到你的名字')).toBeInTheDocument(); + }); + + it('provides a fullscreen control on the public display', () => { + render( + + + , + ); + + expect(screen.getByRole('button', { name: '进入全屏' })).toBeInTheDocument(); + }); + + it('loads a remote job from locations when the job-status route omits disk-backed jobs', async () => { + const observe = vi.fn(); + class ResizeObserverMock { + constructor() {} + + observe = observe; + disconnect = vi.fn(); + } + vi.stubGlobal('ResizeObserver', ResizeObserverMock); + vi.spyOn(HTMLElement.prototype, 'getBoundingClientRect').mockReturnValue({ + width: 1200, + height: 800, + top: 0, + right: 1200, + bottom: 800, + left: 0, + x: 0, + y: 0, + toJSON: () => ({}), + }); + const fetchMock = mockRemoteCloudApi(); + vi.stubGlobal('fetch', fetchMock); + const user = userEvent.setup(); + + const personal = render( + + + , + ); + + await waitFor(() => { + expect(personal.container.querySelectorAll('g[data-word-id]')).toHaveLength(2); + }); + expect(observe).toHaveBeenCalledWith(expect.any(HTMLDivElement)); + expect(fetchMock).toHaveBeenCalledWith( + `/wordcloud-api/api/jobs/${remoteJobId}/locations?name=`, + ); + expect(fetchMock).not.toHaveBeenCalledWith(`/wordcloud-api/api/jobs/${remoteJobId}`); + + await user.type(screen.getByPlaceholderText('输入你的名字'), '王小明'); + await user.click(screen.getByRole('button', { name: '查找' })); + + await waitFor(() => { + expect(personal.container.querySelector('[data-phase="focusing"]')?.getAttribute('style')) + .not.toContain('translate3d(0px, 0px, 0px)'); + }); + personal.unmount(); + + const screenView = render( + + + , + ); + + await waitFor(() => { + expect(screenView.container.querySelectorAll('g[data-word-id]')).toHaveLength(2); + }); + }); + + it('renders the remote controller form', () => { + render( + + + , + ); + + expect(screen.getByRole('heading', { name: '找到你自己' })).toBeInTheDocument(); + expect(screen.getByLabelText('你的名字')).toBeInTheDocument(); + }); + + it('lets the controller move between duplicate name matches', async () => { + const user = userEvent.setup(); + render( + + + , + ); + + await user.type(screen.getByLabelText('你的名字'), 'Alex'); + await user.click(screen.getByRole('button', { name: '在大屏上找到我' })); + + expect(screen.getByText('找到 2 处 · 1 / 2')).toBeInTheDocument(); + + await user.click(screen.getByRole('button', { name: '下一个名字' })); + expect(screen.getByText('找到 2 处 · 2 / 2')).toBeInTheDocument(); + + await user.click(screen.getByRole('button', { name: '上一个名字' })); + expect(screen.getByText('找到 2 处 · 1 / 2')).toBeInTheDocument(); + }); +}); diff --git a/src/AppRoutes.tsx b/src/AppRoutes.tsx new file mode 100644 index 0000000..2b16763 --- /dev/null +++ b/src/AppRoutes.tsx @@ -0,0 +1,34 @@ +import { Navigate, Route, Routes, useParams } from 'react-router-dom'; +import { PersonalSearchPage } from './pages/PersonalSearchPage'; +import { PublicDisplayPage } from './pages/PublicDisplayPage'; +import { RemoteControllerPage } from './pages/RemoteControllerPage'; + +export function AppRoutes() { + return ( + + } /> + } /> + } /> + } /> + } /> + + ); +} + +function PersonalRoute() { + const { cloudId = '' } = useParams(); + + return ; +} + +function PublicRoute() { + const { cloudId = '' } = useParams(); + + return ; +} + +function ControllerRoute() { + const { cloudId = '' } = useParams(); + + return ; +} diff --git a/src/components/CloudHeader.module.css b/src/components/CloudHeader.module.css new file mode 100644 index 0000000..3339305 --- /dev/null +++ b/src/components/CloudHeader.module.css @@ -0,0 +1,99 @@ +.header { + position: absolute; + inset: 0; + z-index: 10; + pointer-events: none; + transition: opacity var(--motion-normal) ease; +} + +.header[data-dimmed='true'] .eyebrow, +.header[data-dimmed='true'] .title h1, +.header[data-dimmed='true'] .title p { + opacity: 0.14; +} + +.eyebrow { + position: absolute; + top: max(16px, env(safe-area-inset-top)); + left: 16px; + z-index: 3; + margin: 0; + color: var(--text-meta); + font-size: var(--text-xs); + font-weight: 700; + letter-spacing: 0.14em; +} + +.title { + position: absolute; + top: max(44px, calc(env(safe-area-inset-top) + 36px)); + left: 50%; + z-index: 2; + width: max-content; + max-width: min(88vw, 640px); + margin: 0; + text-align: center; + transform: translateX(-50%); + pointer-events: none; +} + +.title h1 { + margin: 0; + color: var(--text-primary); + font-size: clamp(22px, 6vw, 32px); + font-weight: 700; + letter-spacing: var(--tracking-display); + line-height: 1.2; + text-wrap: balance; +} + +.title p { + margin: 6px 0 0; + color: var(--text-meta); + font-size: var(--text-xs); + font-weight: 700; + letter-spacing: 0.2em; + white-space: nowrap; +} + +.title::after { + width: 32px; + height: 2px; + margin: 10px auto 0; + content: ''; + display: block; + opacity: 0.9; + background: var(--accent); + border-radius: 2px; +} + +@media (min-width: 768px) { + .eyebrow { + top: 48px; + left: 48px; + } + + .title { + top: 48px; + max-width: min(80vw, 900px); + } + + .title h1 { + font-size: clamp(38px, 4.2vw, 62px); + line-height: 1.1; + } + + .title p { + margin-top: 10px; + font-size: var(--text-sm); + letter-spacing: 0.24em; + } + + .title::after { + width: 48px; + height: 3px; + margin-top: 14px; + border-radius: 3px; + } + +} diff --git a/src/components/CloudHeader.tsx b/src/components/CloudHeader.tsx new file mode 100644 index 0000000..5ce2998 --- /dev/null +++ b/src/components/CloudHeader.tsx @@ -0,0 +1,31 @@ +import styles from './CloudHeader.module.css'; + +interface CloudHeaderProps { + eyebrow: string; + title: string; + subtitle: string; + dimmed?: boolean; + layered?: boolean; +} + +export function CloudHeader({ + eyebrow, + title, + subtitle, + dimmed = false, + layered = false, +}: CloudHeaderProps) { + return ( +
+

{eyebrow}

+
+

{title}

+

{subtitle}

+
+
+ ); +} diff --git a/src/components/CloudLoadingState.tsx b/src/components/CloudLoadingState.tsx new file mode 100644 index 0000000..a27bbdf --- /dev/null +++ b/src/components/CloudLoadingState.tsx @@ -0,0 +1,12 @@ +import styles from './CloudUnavailableState.module.css'; + +export function CloudLoadingState() { + return ( +
+
+

正在加载词云

+

正在读取名单和词云画面。

+
+
+ ); +} diff --git a/src/components/CloudUnavailableState.module.css b/src/components/CloudUnavailableState.module.css new file mode 100644 index 0000000..0c30772 --- /dev/null +++ b/src/components/CloudUnavailableState.module.css @@ -0,0 +1,24 @@ +.page { + min-height: 100dvh; + display: grid; + place-items: center; + padding: 48px 16px; + background: var(--background); +} + +.box { + max-width: 440px; + text-align: center; +} + +.box h1 { + margin: 0 0 8px; + color: var(--text-primary); + font-size: var(--text-2xl); + letter-spacing: var(--tracking-display); +} + +.box p { + margin: 0; + color: var(--text-secondary); +} diff --git a/src/components/CloudUnavailableState.tsx b/src/components/CloudUnavailableState.tsx new file mode 100644 index 0000000..e29007b --- /dev/null +++ b/src/components/CloudUnavailableState.tsx @@ -0,0 +1,12 @@ +import styles from './CloudUnavailableState.module.css'; + +export function CloudUnavailableState() { + return ( +
+
+

暂时没有找到这个词云

+

请确认二维码对应的词云。

+
+
+ ); +} diff --git a/src/components/ControllerSuccessState.module.css b/src/components/ControllerSuccessState.module.css new file mode 100644 index 0000000..55eb73f --- /dev/null +++ b/src/components/ControllerSuccessState.module.css @@ -0,0 +1,59 @@ +.success { + display: grid; + gap: 12px; + justify-items: center; + padding: 32px 0; + text-align: center; + border-top: 1px solid var(--border-soft); +} + +.mark { + width: 64px; + height: 64px; + color: var(--success); + background: var(--surface-warm); + border-radius: var(--radius-pill); + display: grid; + place-items: center; + font-size: 28px; + font-weight: 700; +} + +.success h2 { + margin: 0; + font-size: var(--text-xl); +} + +.success p { + margin: 0; + color: var(--text-secondary); + font-size: var(--text-sm); +} + +.duplicateNav { + display: flex; + gap: 8px; + align-items: center; + justify-content: center; +} + +.ghostButton { + min-height: 44px; + padding: 10px 16px; + color: var(--text-strong); + background: var(--surface-warm); + border-radius: var(--radius-md); + font-size: var(--text-sm); + font-weight: 700; +} + +.ghostButton:disabled { + color: var(--text-meta); + background: var(--surface); + cursor: not-allowed; +} + +.count { + color: var(--text-secondary); + font-size: var(--text-sm); +} diff --git a/src/components/ControllerSuccessState.tsx b/src/components/ControllerSuccessState.tsx new file mode 100644 index 0000000..6083bf3 --- /dev/null +++ b/src/components/ControllerSuccessState.tsx @@ -0,0 +1,48 @@ +import styles from './ControllerSuccessState.module.css'; + +interface ControllerSuccessStateProps { + targetCount: number; + selectedTargetIndex: number; + onSelectTarget: (targetIndex: number) => void; +} + +export function ControllerSuccessState({ + targetCount, + selectedTargetIndex, + onSelectTarget, +}: ControllerSuccessStateProps) { + const hasDuplicateMatches = targetCount > 1; + + return ( +
+ +

找到了 · 抬头看看大屏

+

几秒后大屏会恢复完整词云 · 再找一个名字

+ {hasDuplicateMatches ? ( +
+ + + 找到 {targetCount} 处 · {selectedTargetIndex + 1} / {targetCount} + + +
+ ) : null} +
+ ); +} diff --git a/src/components/FloatingSearchDock.module.css b/src/components/FloatingSearchDock.module.css new file mode 100644 index 0000000..028c528 --- /dev/null +++ b/src/components/FloatingSearchDock.module.css @@ -0,0 +1,71 @@ +.dockWrap { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 10; + display: flex; + justify-content: center; + padding: 0 16px calc(16px + env(safe-area-inset-bottom)); +} + +.dock { + display: grid; + gap: 8px; + width: min(520px, 100%); + padding: 12px; + background: var(--surface); + border: 1px solid var(--border-soft); + border-radius: var(--radius-md); + box-shadow: var(--elev-raised); +} + +.row { + display: flex; + gap: 8px; +} + +.searchInput { + flex: 1; + min-width: 0; + min-height: 48px; + padding: 12px 15px; + color: var(--text-primary); + background: var(--background); + border: 1px solid var(--text-meta); + border-radius: var(--radius-md); + font-size: var(--text-base); +} + +.searchInput::placeholder { + color: var(--text-meta); +} + +.searchButton { + min-height: 48px; + padding: 12px 20px; + color: var(--text-strong); + background: var(--accent); + border-radius: var(--radius-md); + font-size: var(--text-sm); + font-weight: 700; + display: grid; + place-items: center; +} + +.notFound { + padding: 10px 12px; + background: var(--background); + border: 1px dashed var(--border); + border-radius: var(--radius-md); +} + +.notFound strong { + display: block; + font-size: var(--text-base); +} + +.notFound small { + color: var(--text-secondary); + font-size: var(--text-sm); +} diff --git a/src/components/FloatingSearchDock.tsx b/src/components/FloatingSearchDock.tsx new file mode 100644 index 0000000..dc41ff5 --- /dev/null +++ b/src/components/FloatingSearchDock.tsx @@ -0,0 +1,65 @@ +import type { FormEvent } from 'react'; +import { SearchResultState } from './SearchResultState'; +import styles from './FloatingSearchDock.module.css'; + +interface FloatingSearchDockProps { + name: string; + status: 'idle' | 'not-found' | 'found'; + targetCount: number; + selectedTargetIndex: number; + onChange: (name: string) => void; + onSubmit: (event: FormEvent) => void; + onReset: () => void; + onSelectTarget: (targetIndex: number) => void; +} + +export function FloatingSearchDock({ + name, + status, + targetCount, + selectedTargetIndex, + onChange, + onSubmit, + onReset, + onSelectTarget, +}: FloatingSearchDockProps) { + return ( +
+
+
+ + onChange(event.target.value)} + /> + +
+ {status === 'not-found' ? ( +
+ 暂时没有找到这个名字 + 试试完整名字或英文大小写写法 +
+ ) : null} + {status === 'found' ? ( + + ) : null} +
+
+ ); +} diff --git a/src/components/FullscreenButton.module.css b/src/components/FullscreenButton.module.css new file mode 100644 index 0000000..a96950c --- /dev/null +++ b/src/components/FullscreenButton.module.css @@ -0,0 +1,36 @@ +.button { + position: absolute; + top: max(16px, env(safe-area-inset-top)); + right: 16px; + z-index: 4; + display: grid; + width: 40px; + height: 40px; + padding: 0; + place-items: center; + border: 1px solid rgba(200, 200, 193, 0.82); + border-radius: var(--radius-sm); + background: rgba(255, 255, 255, 0.78); + color: var(--text-primary); + box-shadow: var(--elev-raised); + backdrop-filter: blur(8px); + transition: + background var(--motion-fast) ease, + color var(--motion-fast) ease, + transform var(--motion-fast) ease; +} + +.button:hover { + background: var(--surface); +} + +.button:active { + transform: scale(0.94); +} + +@media (min-width: 768px) { + .button { + top: 48px; + right: 48px; + } +} diff --git a/src/components/FullscreenButton.tsx b/src/components/FullscreenButton.tsx new file mode 100644 index 0000000..aaecaf9 --- /dev/null +++ b/src/components/FullscreenButton.tsx @@ -0,0 +1,72 @@ +import { Maximize2, Minimize2 } from 'lucide-react'; +import { useEffect, useState } from 'react'; +import styles from './FullscreenButton.module.css'; + +type FullscreenDocument = Document & { + webkitExitFullscreen?: () => Promise | void; + webkitFullscreenElement?: Element | null; +}; + +type FullscreenElement = HTMLElement & { + webkitRequestFullscreen?: () => Promise | void; +}; + +function getFullscreenElement() { + const fullscreenDocument = document as FullscreenDocument; + return document.fullscreenElement ?? fullscreenDocument.webkitFullscreenElement ?? null; +} + +export function FullscreenButton() { + const [isFullscreen, setIsFullscreen] = useState(false); + + useEffect(() => { + const syncFullscreenState = () => { + setIsFullscreen(Boolean(getFullscreenElement())); + }; + + syncFullscreenState(); + document.addEventListener('fullscreenchange', syncFullscreenState); + document.addEventListener('webkitfullscreenchange', syncFullscreenState); + + return () => { + document.removeEventListener('fullscreenchange', syncFullscreenState); + document.removeEventListener('webkitfullscreenchange', syncFullscreenState); + }; + }, []); + + const toggleFullscreen = async () => { + const fullscreenDocument = document as FullscreenDocument; + + try { + if (getFullscreenElement()) { + const exitFullscreen = document.exitFullscreen ?? fullscreenDocument.webkitExitFullscreen; + await exitFullscreen?.call(document); + return; + } + + const target = document.documentElement as FullscreenElement; + const requestFullscreen = target.requestFullscreen ?? target.webkitRequestFullscreen; + await requestFullscreen?.call(target); + } catch { + // The browser can deny a fullscreen request; preserve the current screen state. + } + }; + + const label = isFullscreen ? '退出全屏' : '进入全屏'; + const Icon = isFullscreen ? Minimize2 : Maximize2; + + return ( + + ); +} diff --git a/src/components/QRPanel.module.css b/src/components/QRPanel.module.css new file mode 100644 index 0000000..6ed55ef --- /dev/null +++ b/src/components/QRPanel.module.css @@ -0,0 +1,54 @@ +.panel { + position: absolute; + right: 48px; + bottom: 48px; + z-index: 10; + display: flex; + gap: 16px; + align-items: center; + width: min(360px, calc(100vw - 96px)); + padding: 16px; + background: var(--surface); + border: 1px solid var(--border-soft); + border-radius: var(--radius-md); + box-shadow: var(--elev-raised); +} + +.code { + width: 168px; + height: 168px; + flex: none; + display: block; + border: 1px solid var(--border-soft); + border-radius: var(--radius-sm); + background: #ffffff; +} + +.content { + min-width: 0; +} + +.content h2 { + margin: 0 0 4px; + font-size: var(--text-lg); +} + +.content p { + margin: 0; + color: var(--text-secondary); + font-size: var(--text-sm); +} + +@media (max-width: 760px) { + .panel { + right: 16px; + left: 16px; + bottom: 16px; + width: auto; + } + + .code { + width: 120px; + height: 120px; + } +} diff --git a/src/components/QRPanel.tsx b/src/components/QRPanel.tsx new file mode 100644 index 0000000..1b95363 --- /dev/null +++ b/src/components/QRPanel.tsx @@ -0,0 +1,60 @@ +import { useEffect, useState } from 'react'; +import { toDataURL } from 'qrcode'; +import styles from './QRPanel.module.css'; + +interface QRPanelProps { + cloudId: string; +} + +export function QRPanel({ cloudId }: QRPanelProps) { + const [qrDataUrl, setQRDataUrl] = useState(null); + + useEffect(() => { + let cancelled = false; + const url = new URL(`/control/${encodeURIComponent(cloudId)}`, window.location.origin).href; + + toDataURL(url, { + errorCorrectionLevel: 'M', + margin: 1, + width: 336, + color: { + dark: '#211922', + light: '#ffffff', + }, + }) + .then((dataUrl) => { + if (cancelled) { + return; + } + + setQRDataUrl(dataUrl); + }) + .catch(() => { + if (!cancelled) { + setQRDataUrl(null); + } + }); + + return () => { + cancelled = true; + }; + }, [cloudId]); + + return ( + + ); +} diff --git a/src/components/SearchResultState.module.css b/src/components/SearchResultState.module.css new file mode 100644 index 0000000..0525cd0 --- /dev/null +++ b/src/components/SearchResultState.module.css @@ -0,0 +1,39 @@ +.result { + padding: 10px 12px; + background: var(--background); + border: 1px dashed var(--border); + border-radius: var(--radius-md); +} + +.result strong { + display: block; + font-size: var(--text-base); +} + +.result small { + display: block; + color: var(--text-secondary); + font-size: var(--text-sm); +} + +.resultRow { + display: flex; + gap: 8px; + align-items: center; + margin-top: 8px; +} + +.ghostButton { + min-height: 44px; + padding: 10px 16px; + color: var(--text-strong); + background: var(--surface-warm); + border-radius: var(--radius-md); + font-size: var(--text-sm); + font-weight: 700; +} + +.count { + color: var(--text-secondary); + font-size: var(--text-sm); +} diff --git a/src/components/SearchResultState.tsx b/src/components/SearchResultState.tsx new file mode 100644 index 0000000..e250465 --- /dev/null +++ b/src/components/SearchResultState.tsx @@ -0,0 +1,58 @@ +import styles from './SearchResultState.module.css'; + +interface SearchResultStateProps { + query: string; + targetCount: number; + selectedTargetIndex: number; + onReset: () => void; + onSelectTarget: (targetIndex: number) => void; +} + +export function SearchResultState({ + query, + targetCount, + selectedTargetIndex, + onReset, + onSelectTarget, +}: SearchResultStateProps) { + const hasMultipleTargets = targetCount > 1; + + return ( +
+ 找到你了 · {query} + {hasMultipleTargets ? `找到 ${targetCount} 处` : '你在这里'} +
+ + {hasMultipleTargets ? ( + <> + + + + {selectedTargetIndex + 1} / {targetCount} + + + ) : null} +
+
+ ); +} diff --git a/src/components/TitleFrost.module.css b/src/components/TitleFrost.module.css new file mode 100644 index 0000000..7ccdc72 --- /dev/null +++ b/src/components/TitleFrost.module.css @@ -0,0 +1,33 @@ +.frost { + position: absolute; + top: 20px; + left: 50%; + z-index: 1; + width: min(88vw, 660px); + height: 132px; + transform: translateX(-50%); + background: radial-gradient( + 120% 120% at 50% 50%, + rgba(255, 255, 255, 0.34) 0%, + rgba(255, 255, 255, 0.16) 48%, + rgba(255, 255, 255, 0.04) 78%, + rgba(255, 255, 255, 0) 100% + ); + backdrop-filter: blur(22px) saturate(180%) brightness(1.12) contrast(1.05); + -webkit-backdrop-filter: blur(22px) saturate(180%) brightness(1.12) contrast(1.05); + border: 1px solid rgba(255, 255, 255, 0.4); + border-radius: 24px; + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.5), + 0 10px 24px rgba(0, 0, 0, 0.06); + pointer-events: none; +} + +@media (min-width: 768px) { + .frost { + top: 24px; + width: min(80vw, 760px); + height: 150px; + border-radius: 28px; + } +} diff --git a/src/components/TitleFrost.tsx b/src/components/TitleFrost.tsx new file mode 100644 index 0000000..eb3e3c7 --- /dev/null +++ b/src/components/TitleFrost.tsx @@ -0,0 +1,5 @@ +import styles from './TitleFrost.module.css'; + +export function TitleFrost() { + return