From 6487c7f8ce22cf00b1e907e9010ea5355fbbb75f Mon Sep 17 00:00:00 2001 From: Mike Babb Date: Thu, 4 Jun 2026 11:45:00 -0400 Subject: [PATCH 01/11] deps(tranche-B W1): demo/tooling to latest behind the regression gate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Minors batched (vite 8.0.16, vue, vue-router 5.1, vitest 4.1.8, reka-ui, lucide, vaul-vue, prettier-plugin-classnames, three 0.184 + types, monaco 0.55). Majors each breaking-read: vue-sonner 2.0.9 (nuxt peers optional, core toast API stable), @iconify/vue 5.0.1 (zero call sites), jsdom 29.1.1 (286/286 green), @types/node 25.9.1, vite-plugin-dts 5.0.2. vite-plugin-dts 5: rollupTypes→bundleTypes rename (old key silently ignored) + @microsoft/api-extractor now an optional peer the consumer provides — both fixed with the correct v5 pin, caught by the dts byte-check this wave mandates (green build, missing artefact). HELD: zod at latest-3 3.25.76 (@vee-validate/zod peer ^3.24.0 blocks 4; trigger = upstream zod-4 peer). v-calendar at ^3.1.2 (latest dist-tag points at 2.4.2 — a downgrade artefact, not an upgrade). Gate: check:lib + build:lib + dts byte-check (48460 B, 15/15 symbols) + test 286/286 under jsdom 29 + proof:boundary + gh-pages exit 0. --- docs/tranches/B/waves/W1.md | 22 + package-lock.json | 13728 +++++++++++++++++----------------- package.json | 35 +- vite.config.ts | 11 +- 4 files changed, 6967 insertions(+), 6829 deletions(-) diff --git a/docs/tranches/B/waves/W1.md b/docs/tranches/B/waves/W1.md index d7a252a..3c8e237 100644 --- a/docs/tranches/B/waves/W1.md +++ b/docs/tranches/B/waves/W1.md @@ -322,3 +322,25 @@ Resolved choices and their trade-offs: This is the no-workaround mandate applied to the dependency graph — the lockfile must reflect a genuinely-resolvable tree (which also keeps B.W6's lockfile/inv-β reconciliation honest). + +## § Execution record (run 2026-06-04, tranche-b) + +Live registry reconciled (`npm outdated` at execution; the matrix was the +method, the registry the truth). Resolved dispositions: + +| Dep | Disposition | Evidence | +|---|---|---| +| zod 3→4 | **HELD at latest-3 (`3.25.76`)** — `@vee-validate/zod@4.15.1` declares `peerDependencies.zod: ^3.24.0`; zod-4 would force a peer conflict. Trigger: upstream zod-4 peer release. | `npm view @vee-validate/zod@4.15.1 peerDependencies`; zero app call sites confirmed (`grep zod/toTypedSchema demo/ src/` → 0). | +| vue-sonner 1→2 | **BUMPED → 2.0.9.** The v2 Nuxt peers are `optional: true` (plain-Vue safe); the demo's 8 call-site files use the stable core API (`toast.success/error(msg, {description})` + ``), v2-compatible. Paint verification rides W4's repaired build + inv γ. | `npm view vue-sonner@2.0.9 peerDependenciesMeta`; call-site grep. | +| @iconify/vue 4→5 | **BUMPED → 5.0.1.** Zero runtime call sites (`` unused; demo uses `@lucide/vue` + `@iconify-json/radix-icons` data); vue peer `>=3.0.0` satisfied. | grep → 0 app call sites. | +| jsdom 26→29 | **BUMPED → 29.1.1.** Full suite green under the new env: 286/286 across 20 files, incl. the DOM-resolution-sensitive `units`/`morph`/`animation` sets. | `npm test -- --run` → 286 passed. | +| vite-plugin-dts 4→5 | **BUMPED → 5.0.2** with the correct v5 pin. TWO v5 breaks found by the byte-check, exactly as this spec predicted: (1) v5 renames `rollupTypes` → `bundleTypes` and SILENTLY ignores the old key; (2) `@microsoft/api-extractor` moved from bundled dependency to optional peer — absent, the roll-up no-ops with zero warning. Fix: `bundleTypes: true` + `@microsoft/api-extractor` devDependency (the consumer-provided peer). `entryRoot`/`rootDir` lockstep pin retained and still load-bearing. | `dist/keyframes.d.ts` = 48460 bytes (byte-identical to the v4 baseline), all 15 public symbols present; the green-build-no-artefact state reproduced first, then fixed. | +| @types/node 24→25 | **BUMPED → 25.9.1.** `check:lib` green. | tsc exit 0. | +| three / @types/three | **BUMPED → 0.184.0 / 0.184.1** (18 minors, rolled together). Demo-graph only; W3's amiga rebuild targets current three. | gh-pages build exit 0. | +| monaco-editor | **BUMPED → 0.55.1.** `vendor-monaco` chunk name unchanged (`manualChunks` matches on `node_modules` id). | gh-pages build exit 0. | +| minors batch | vite 8.0.16 · vue 3.5.x-latest · vue-router 5.1.0 · vitest 4.1.8 · reka-ui 2.9.9 · @lucide/vue 1.17.0 · vaul-vue 0.4.1 · prettier-plugin-classnames 0.10.2 — one roll. | gate chain green. | +| v-calendar | **HELD at `^3.1.2`** — the `latest` dist-tag points at 2.4.2 (below installed); not a real upgrade. | `npm outdated` shows the downgrade-major artefact. | + +Gate evidence: `check:lib` ✓ · `build:lib` ✓ + dts byte-check ✓ (48460 B, 15/15 +symbols) · `npm test -- --run` 286/286 ✓ · `proof:boundary` ✓ · +`npm run gh-pages` exit 0 (paint gate pends W4/inv γ as planned). diff --git a/package-lock.json b/package-lock.json index de8e899..1ff66c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6815 +1,6921 @@ { - "name": "@mkbabb/keyframes.js", - "version": "3.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@mkbabb/keyframes.js", - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "@mkbabb/parse-that": "^0.8.2", - "@mkbabb/value.js": "^0.10.0" - }, - "devDependencies": { - "@iconify-json/radix-icons": "^1.2.6", - "@iconify/vue": "^4.1.2", - "@lucide/vue": "^1.16.0", - "@tailwindcss/postcss": "^4.3.0", - "@types/node": "^24.12.4", - "@types/three": "^0.166.0", - "@unovis/ts": "^1.6.5", - "@unovis/vue": "^1.6.5", - "@vee-validate/zod": "^4.15.1", - "@vitejs/plugin-vue": "^6.0.7", - "@vueuse/core": "^14.3.0", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "embla-carousel-vue": "^8.6.0", - "highlight.js": "^11.11.1", - "html2canvas": "^1.4.1", - "jsdom": "^26.1.0", - "monaco-editor": "^0.50.0", - "monaco-themes": "^0.4.8", - "prettier": "^3.8.3", - "prettier-plugin-classnames": "^0.10.1", - "prettier-plugin-merge": "^0.10.1", - "prettier-plugin-organize-imports": "^4.3.0", - "prettier-plugin-tailwindcss": "^0.8.0", - "reka-ui": "^2.9.7", - "tailwind-merge": "^3.6.0", - "tailwindcss": "^4.3.0", - "three": "^0.166.1", - "tw-animate-css": "^1.4.0", - "typescript": "^6.0.3", - "v-calendar": "^3.1.2", - "vaul-vue": "^0.4.0", - "vee-validate": "^4.15.1", - "vite": "^8.0.13", - "vite-plugin-dts": "^4.5.4", - "vitest": "^4.1.7", - "vue": "^3.5.34", - "vue-router": "^5.0.7", - "vue-sonner": "^1.1.3", - "zod": "^3.23.8" - }, - "engines": { - "node": ">=22" - }, - "optionalDependencies": { - "@mkbabb/glass-ui": "file:../glass-ui" - }, - "peerDependencies": { - "vue": "^3.5.0" - } - }, - "../glass-ui": { - "optional": true - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/@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/generator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", - "@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-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-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/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.7" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.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.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", - "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/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emotion/babel-plugin": { - "version": "11.13.5", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", - "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.2", - "@emotion/memoize": "^0.9.0", - "@emotion/serialize": "^1.3.3", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/cache": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", - "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.9.0", - "@emotion/sheet": "^1.4.0", - "@emotion/utils": "^1.4.2", - "@emotion/weak-memoize": "^0.4.0", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/css": { - "version": "11.13.5", - "resolved": "https://registry.npmjs.org/@emotion/css/-/css-11.13.5.tgz", - "integrity": "sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@emotion/babel-plugin": "^11.13.5", - "@emotion/cache": "^11.13.5", - "@emotion/serialize": "^1.3.3", - "@emotion/sheet": "^1.4.0", - "@emotion/utils": "^1.4.2" - } - }, - "node_modules/@emotion/hash": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", - "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@emotion/memoize": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", - "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@emotion/serialize": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", - "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@emotion/hash": "^0.9.2", - "@emotion/memoize": "^0.9.0", - "@emotion/unitless": "^0.10.0", - "@emotion/utils": "^1.4.2", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/sheet": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", - "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@emotion/unitless": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", - "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@emotion/utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", - "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", - "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@floating-ui/core": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", - "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.11" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", - "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.5", - "@floating-ui/utils": "^0.2.11" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", - "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@floating-ui/vue": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@floating-ui/vue/-/vue-1.1.11.tgz", - "integrity": "sha512-HzHKCNVxnGS35r9fCHBc3+uCnjw9IWIlCPL683cGgM9Kgj2BiAl8x1mS7vtvP6F9S/e/q4O6MApwSHj8hNLGfw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.7.6", - "@floating-ui/utils": "^0.2.11", - "vue-demi": ">=0.13.0" - } - }, - "node_modules/@floating-ui/vue/node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/@iconify-json/radix-icons": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@iconify-json/radix-icons/-/radix-icons-1.2.6.tgz", - "integrity": "sha512-izgVBJwk37dSvsma1QsRMfCWQ4FIImbBmJId1WUURzRZA5fFyKlCcG/nZC8se0KhOBWszo2mYgLmhKJv/DFPoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@iconify/types": "*" - } - }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@iconify/vue": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@iconify/vue/-/vue-4.3.0.tgz", - "integrity": "sha512-Xq0h6zMrHBbrW8jXJ9fISi+x8oDQllg5hTDkDuxnWiskJ63rpJu9CvJshj8VniHVTbsxCg9fVoPAaNp3RQI5OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@iconify/types": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/cyberalien" - }, - "peerDependencies": { - "vue": ">=3" - } - }, - "node_modules/@internationalized/date": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.12.2.tgz", - "integrity": "sha512-FY1Y+H64NDs+HAF6omlnWxm3mEpfgaCSWtL5l551ZZfImA+kGjPFgrnJrGjH6lfmLL0g8Z/mBu1R3kufeCp6Jw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - } - }, - "node_modules/@internationalized/number": { - "version": "3.6.7", - "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.7.tgz", - "integrity": "sha512-3ji1fcrT+FPAK86UqEhB/psHixYo6niWPJtt7+qRaYFynt/BaJG8GhAPimtWUpEiVSTq8ZM8L5psMxGquiB/Vg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - } - }, - "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.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "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/@juggle/resize-observer": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", - "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@lucide/vue": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/@lucide/vue/-/vue-1.17.0.tgz", - "integrity": "sha512-6Q1ZHgr5FbmJzKWe5BxlNdjLj2lbmuH1zwDtVzUJofX0w9UREwKgq4F4jwKqFYyyIS4Rj3FiJvDi2k6djukmmw==", - "dev": true, - "license": "ISC", - "peerDependencies": { - "vue": ">=3.0.1" - } - }, - "node_modules/@mapbox/geojson-rewind": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", - "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", - "dev": true, - "license": "ISC", - "dependencies": { - "get-stream": "^6.0.1", - "minimist": "^1.2.6" - }, - "bin": { - "geojson-rewind": "geojson-rewind" - } - }, - "node_modules/@mapbox/jsonlint-lines-primitives": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", - "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mapbox/mapbox-gl-supported": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-2.0.1.tgz", - "integrity": "sha512-HP6XvfNIzfoMVfyGjBckjiAOQK9WfX0ywdLubuPMPv+Vqf5fj0uCbgBQYpiqcWZT6cbyyRnTSXDheT1ugvF6UQ==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@mapbox/point-geometry": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", - "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@mapbox/tiny-sdf": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.2.0.tgz", - "integrity": "sha512-LVL4wgI9YAum5V+LNVQO6QgFBPw7/MIIY4XJPNsPDMrjEwcE+JfKk1LuIl8GnF197ejVdC9QdPaxrx5gfgdGXg==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/@mapbox/unitbezier": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", - "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/@mapbox/vector-tile": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", - "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@mapbox/point-geometry": "~0.1.0" - } - }, - "node_modules/@mapbox/whoots-js": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", - "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@microsoft/api-extractor": { - "version": "7.58.7", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.58.7.tgz", - "integrity": "sha512-yK6OycD46gIzLRpj6ueVUWPk1ACSpkN1LBo05gY1qPTylbWyUCanXfH7+VgkI5LJrJoRSQR5F04XuCffCXLOBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@microsoft/api-extractor-model": "7.33.8", - "@microsoft/tsdoc": "~0.16.0", - "@microsoft/tsdoc-config": "~0.18.1", - "@rushstack/node-core-library": "5.23.1", - "@rushstack/rig-package": "0.7.3", - "@rushstack/terminal": "0.24.0", - "@rushstack/ts-command-line": "5.3.9", - "diff": "~8.0.2", - "minimatch": "10.2.3", - "resolve": "~1.22.1", - "semver": "~7.7.4", - "source-map": "~0.6.1", - "typescript": "5.9.3" - }, - "bin": { - "api-extractor": "bin/api-extractor" - } - }, - "node_modules/@microsoft/api-extractor-model": { - "version": "7.33.8", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.33.8.tgz", - "integrity": "sha512-aIcoQggPyer3B6Ze3usz0YWC/oBwUHfRH5ETUsr+oT2BRA6SfTJl7IKPcPZkX4UR+PohowzW4uMxsvjrn8vm+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@microsoft/tsdoc": "~0.16.0", - "@microsoft/tsdoc-config": "~0.18.1", - "@rushstack/node-core-library": "5.23.1" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/diff": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", - "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@microsoft/tsdoc": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz", - "integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@microsoft/tsdoc-config": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.18.1.tgz", - "integrity": "sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@microsoft/tsdoc": "0.16.0", - "ajv": "~8.18.0", - "jju": "~1.4.0", - "resolve": "~1.22.2" - } - }, - "node_modules/@mkbabb/glass-ui": { - "resolved": "../glass-ui", - "link": true - }, - "node_modules/@mkbabb/parse-that": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@mkbabb/parse-that/-/parse-that-0.8.2.tgz", - "integrity": "sha512-0hs7OYm649Nm7n+44hQMMYIaTdjoaNP+cqEQaCGrmxnRCnvtLnha102gsSVjWjJiwYF624gdxPC/NKlsLckZMg==" - }, - "node_modules/@mkbabb/value.js": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@mkbabb/value.js/-/value.js-0.10.0.tgz", - "integrity": "sha512-3HWQzu+0vCQIpozqX2hDkni0hXFbHfNcaitvQiN40t8vjHM6yCSB1D5+Rk6bsUA3uUGUdMQ18Bv9oN8YUq53YQ==", - "license": "MIT", - "dependencies": { - "@mkbabb/parse-that": "^0.8.2" - }, - "engines": { - "node": ">=22" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", - "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.133.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", - "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "dev": true, - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", - "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", - "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", - "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", - "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", - "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", - "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", - "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", - "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", - "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", - "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", - "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", - "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", - "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "1.10.0", - "@emnapi/runtime": "1.10.0", - "@napi-rs/wasm-runtime": "^1.1.4" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", - "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", - "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/pluginutils": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", - "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rushstack/node-core-library": { - "version": "5.23.1", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.23.1.tgz", - "integrity": "sha512-wlKmIKIYCKuCASbITvOxLZXepPbwXvrv7S6ig6XNWFchSyhL/E2txmVXspHY49Wu2dzf7nI27a2k/yV5BA3EiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "~8.18.0", - "ajv-draft-04": "~1.0.0", - "ajv-formats": "~3.0.1", - "fs-extra": "~11.3.0", - "import-lazy": "~4.0.0", - "jju": "~1.4.0", - "resolve": "~1.22.1", - "semver": "~7.7.4" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@rushstack/problem-matcher": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.2.1.tgz", - "integrity": "sha512-gulfhBs6n+I5b7DvjKRfhMGyUejtSgOHTclF/eONr8hcgF1APEDjhxIsfdUYYMzC3rvLwGluqLjbwCFZ8nxrog==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@rushstack/rig-package": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.7.3.tgz", - "integrity": "sha512-aAA518n6wxxjCfnTAOjQnm7ngNE0FVHxHAw2pxKlIhxrMn0XQjGcXKF0oKWpjBgJOmsaJpVob/v+zr3zxgPWuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jju": "~1.4.0", - "resolve": "~1.22.1" - } - }, - "node_modules/@rushstack/terminal": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.24.0.tgz", - "integrity": "sha512-8ZQS4MMaGsv27EXCBiH7WMPkRZrffeDoIevs6z9TM5dzqiY6+Hn4evfK/G+gvgBTjfvfkHIZPQQmalmI2sM4TQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rushstack/node-core-library": "5.23.1", - "@rushstack/problem-matcher": "0.2.1", - "supports-color": "~8.1.1" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@rushstack/ts-command-line": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.3.9.tgz", - "integrity": "sha512-GIHqU+sRGQ3LGWAZu1O+9Yh++qwtyNIIGuNbcWHJjBTm2qRez0cwINUHZ+pQLR8UuzZDcMajrDaNbUYoaL/XtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rushstack/terminal": "0.24.0", - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "string-argv": "~0.3.1" - } - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@swc/helpers": { - "version": "0.5.23", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz", - "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@tailwindcss/node": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.0.tgz", - "integrity": "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.5", - "enhanced-resolve": "^5.21.0", - "jiti": "^2.6.1", - "lightningcss": "1.32.0", - "magic-string": "^0.30.21", - "source-map-js": "^1.2.1", - "tailwindcss": "4.3.0" - } - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.0.tgz", - "integrity": "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.3.0", - "@tailwindcss/oxide-darwin-arm64": "4.3.0", - "@tailwindcss/oxide-darwin-x64": "4.3.0", - "@tailwindcss/oxide-freebsd-x64": "4.3.0", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.0", - "@tailwindcss/oxide-linux-arm64-gnu": "4.3.0", - "@tailwindcss/oxide-linux-arm64-musl": "4.3.0", - "@tailwindcss/oxide-linux-x64-gnu": "4.3.0", - "@tailwindcss/oxide-linux-x64-musl": "4.3.0", - "@tailwindcss/oxide-wasm32-wasi": "4.3.0", - "@tailwindcss/oxide-win32-arm64-msvc": "4.3.0", - "@tailwindcss/oxide-win32-x64-msvc": "4.3.0" - } - }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.0.tgz", - "integrity": "sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.0.tgz", - "integrity": "sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.0.tgz", - "integrity": "sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.0.tgz", - "integrity": "sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.0.tgz", - "integrity": "sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.0.tgz", - "integrity": "sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.0.tgz", - "integrity": "sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.0.tgz", - "integrity": "sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.0.tgz", - "integrity": "sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.0.tgz", - "integrity": "sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.10.0", - "@emnapi/runtime": "^1.10.0", - "@emnapi/wasi-threads": "^1.2.1", - "@napi-rs/wasm-runtime": "^1.1.4", - "@tybys/wasm-util": "^0.10.1", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { - "version": "1.10.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "1.10.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { - "version": "2.8.1", - "dev": true, - "inBundle": true, - "license": "0BSD", - "optional": true - }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.0.tgz", - "integrity": "sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.0.tgz", - "integrity": "sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/postcss": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.0.tgz", - "integrity": "sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.3.0", - "@tailwindcss/oxide": "4.3.0", - "postcss": "^8.5.10", - "tailwindcss": "4.3.0" - } - }, - "node_modules/@tanstack/virtual-core": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.17.0.tgz", - "integrity": "sha512-gOxY/hFkPh/XQYhnThBHzkbkX3Ed+z/iushyz+R+JAr213aXxUDgQoTgTdrDpBSRsjFM73P/KfUyWmaF9WHMkQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/vue-virtual": { - "version": "3.13.28", - "resolved": "https://registry.npmjs.org/@tanstack/vue-virtual/-/vue-virtual-3.13.28.tgz", - "integrity": "sha512-A+jWpXtMpWXKhGLKQrXeC9mk1VgYeMWSJ+o0CTCEi+HLYMSQFdVmPG9lJz7d4XJyIkc5xVwZU9QY67QpScqnxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tanstack/virtual-core": "3.17.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "vue": "^2.7.0 || ^3.0.0" - } - }, - "node_modules/@tweenjs/tween.js": { - "version": "23.1.3", - "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", - "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", - "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/argparse": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", - "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } - }, - "node_modules/@types/d3": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", - "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-delaunay": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-zoom": "*" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", - "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-axis": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", - "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-brush": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", - "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-chord": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", - "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-collection": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@types/d3-collection/-/d3-collection-1.0.13.tgz", - "integrity": "sha512-v0Rgw3IZebRyamcwVmtTDCZ8OmQcj4siaYjNc7wGMZT7PmdSHawGsCOQMxyLvZ7lWjfohYLK0oXtilMOMgfY8A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-contour": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", - "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-dispatch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", - "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-dsv": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", - "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-fetch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", - "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-dsv": "*" - } - }, - "node_modules/@types/d3-force": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", - "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-format": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", - "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-hierarchy": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", - "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", - "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-polygon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", - "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-quadtree": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", - "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-random": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", - "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-sankey": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@types/d3-sankey/-/d3-sankey-0.12.5.tgz", - "integrity": "sha512-/3RZSew0cLAtzGQ+C89hq/Rp3H20QJuVRSqFy6RKLe7E0B8kd2iOS1oBsodrgds4PcNVpqWhdUEng/SHvBcJ6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-shape": "^1" - } - }, - "node_modules/@types/d3-sankey/node_modules/@types/d3-path": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.11.tgz", - "integrity": "sha512-4pQMp8ldf7UaB/gR8Fvvy69psNHkTpD/pVw3vmEi8iZAB9EPMBruB1JvHO4BIq9QkUUd2lV1F5YXpMNj7JPBpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-sankey/node_modules/@types/d3-shape": { - "version": "1.3.12", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.12.tgz", - "integrity": "sha512-8oMzcd4+poSLGgV0R1Q1rOlx/xdmozS4Xab7np0eamFFUYq71AU9pOCJEFnkXW2aI/oXdVYJzw6pssbSut7Z9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-path": "^1" - } - }, - "node_modules/@types/d3-scale": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", - "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-selection": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", - "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-shape": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", - "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", - "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-time-format": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", - "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-transition": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", - "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "node_modules/@types/dagre": { - "version": "0.7.54", - "resolved": "https://registry.npmjs.org/@types/dagre/-/dagre-0.7.54.tgz", - "integrity": "sha512-QjcRY+adGbYvBFS7cwv5txhVIwX1XXIUswWl+kSQTbI6NjgZydrZkEKX/etzVd7i+bCsCb40Z/xlBY5eoFuvWQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "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/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/jsesc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@types/jsesc/-/jsesc-2.5.1.tgz", - "integrity": "sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/leaflet": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.7.6.tgz", - "integrity": "sha512-Emkz3V08QnlelSbpT46OEAx+TBZYTOX2r1yM7W+hWg5+djHtQ1GbEXBDRLaqQDOYcDI51Ss0ayoqoKD4CtLUDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/lodash": { - "version": "4.17.24", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", - "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mapbox__point-geometry": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.4.tgz", - "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mapbox__vector-tile": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.4.tgz", - "integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/geojson": "*", - "@types/mapbox__point-geometry": "*", - "@types/pbf": "*" - } - }, - "node_modules/@types/node": { - "version": "24.12.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.4.tgz", - "integrity": "sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/pbf": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz", - "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/resize-observer-browser": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.11.tgz", - "integrity": "sha512-cNw5iH8JkMkb3QkCoe7DaZiawbDQEUX8t7iuQaRTyLOyQCR2h+ibBD4GJt7p5yhUHrlOeL7ZtbxNHeipqNsBzQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/stats.js": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz", - "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/supercluster": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-5.0.3.tgz", - "integrity": "sha512-XMSqQEr7YDuNtFwSgaHHOjsbi0ZGL62V9Js4CW45RBuRYlNWSW/KDqN+RFFE7HdHcGhJPtN0klKvw06r9Kg7rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/three": { - "version": "0.166.0", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.166.0.tgz", - "integrity": "sha512-FHMnpcdhdbdOOIYbfkTkUVpYMW53odxbTRwd0/xJpYnTzEsjnVnondGAvHZb4z06UW0vo6WPVuvH0/9qrxKx7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tweenjs/tween.js": "~23.1.2", - "@types/stats.js": "*", - "@types/webxr": "*", - "fflate": "~0.8.2", - "meshoptimizer": "~0.18.1" - } - }, - "node_modules/@types/throttle-debounce": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@types/throttle-debounce/-/throttle-debounce-5.0.2.tgz", - "integrity": "sha512-pDzSNulqooSKvSNcksnV72nk8p7gRqN8As71Sp28nov1IgmPKWbOEIwAWvBME5pPTtaXJAvG3O4oc76HlQ4kqQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/topojson": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@types/topojson/-/topojson-3.2.6.tgz", - "integrity": "sha512-ppfdlxjxofWJ66XdLgIlER/85RvpGyfOf8jrWf+3kVIjEatFxEZYD/Ea83jO672Xu1HRzd/ghwlbcZIUNHTskw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/geojson": "*", - "@types/topojson-client": "*", - "@types/topojson-server": "*", - "@types/topojson-simplify": "*", - "@types/topojson-specification": "*" - } - }, - "node_modules/@types/topojson-client": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@types/topojson-client/-/topojson-client-3.1.5.tgz", - "integrity": "sha512-C79rySTyPxnQNNguTZNI1Ct4D7IXgvyAs3p9HPecnl6mNrJ5+UhvGNYcZfpROYV2lMHI48kJPxwR+F9C6c7nmw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/geojson": "*", - "@types/topojson-specification": "*" - } - }, - "node_modules/@types/topojson-server": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/topojson-server/-/topojson-server-3.0.4.tgz", - "integrity": "sha512-5+ieK8ePfP+K2VH6Vgs1VCt+fO1U8XZHj0UsF+NktaF0DavAo1q3IvCBXgokk/xmtvoPltSUs6vxuR/zMdOE1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/geojson": "*", - "@types/topojson-specification": "*" - } - }, - "node_modules/@types/topojson-simplify": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/topojson-simplify/-/topojson-simplify-3.0.3.tgz", - "integrity": "sha512-sBO5UZ0O2dB0bNwo0vut2yLHhj3neUGi9uL7/ROdm8Gs6dtt4jcB9OGDKr+M2isZwQM2RuzVmifnMZpxj4IGNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/geojson": "*", - "@types/topojson-specification": "*" - } - }, - "node_modules/@types/topojson-specification": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/topojson-specification/-/topojson-specification-1.0.5.tgz", - "integrity": "sha512-C7KvcQh+C2nr6Y2Ub4YfgvWvWCgP2nOQMtfhlnwsRL4pYmmwzBS7HclGiS87eQfDOU/DLQpX6GEscviaz4yLIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", - "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/webxr": { - "version": "0.5.24", - "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz", - "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@unovis/dagre-layout": { - "version": "0.8.8-2", - "resolved": "https://registry.npmjs.org/@unovis/dagre-layout/-/dagre-layout-0.8.8-2.tgz", - "integrity": "sha512-ZfDvfcYtzzhZhgKZty8XDi+zQIotfRqfNVF5M3dFQ9d9C5MTaRdbeBnPUkNrmlLJGgQ42HMOE2ajZLfm2VlRhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unovis/graphlibrary": "^2.2.0-2", - "lodash-es": "^4.17.21" - } - }, - "node_modules/@unovis/graphlibrary": { - "version": "2.2.0-2", - "resolved": "https://registry.npmjs.org/@unovis/graphlibrary/-/graphlibrary-2.2.0-2.tgz", - "integrity": "sha512-HeEzpd/vDyWiIJt0rnh+2ICXUIuF2N0+Z9OJJiKg0DB+eFUcD+bk+9QPhYHwkFwfxdjDA9fHi1DZ/O/bbV58Nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash-es": "^4.17.21" - } - }, - "node_modules/@unovis/ts": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/@unovis/ts/-/ts-1.6.5.tgz", - "integrity": "sha512-4qeo0nKESrCX7vZr+zEGFjg2QbyjgxXN8//mPnvZi0e2mf+ZrjIRmHReHwO3u7fqMD7kgMMMD1ABJJFBcOempA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@emotion/css": "^11.7.1", - "@juggle/resize-observer": "^3.3.1", - "@types/d3": "^7.4.0", - "@types/d3-array": "~3.2.2", - "@types/d3-axis": "~3.0.6", - "@types/d3-brush": "~3.0.6", - "@types/d3-chord": "~3.0.6", - "@types/d3-collection": "^1.0.10", - "@types/d3-color": "~3.1.3", - "@types/d3-drag": "~3.0.7", - "@types/d3-ease": "~3.0.2", - "@types/d3-force": "~3.0.10", - "@types/d3-geo": "~3.1.0", - "@types/d3-hierarchy": "~3.1.7", - "@types/d3-interpolate": "~3.0.4", - "@types/d3-path": "~3.1.1", - "@types/d3-sankey": "^0.12.4", - "@types/d3-scale": "~4.0.9", - "@types/d3-selection": "~3.0.0", - "@types/d3-shape": "~3.1.7", - "@types/d3-timer": "~3.0.2", - "@types/d3-transition": "~3.0.9", - "@types/d3-zoom": "~3.0.8", - "@types/dagre": "^0.7.50", - "@types/geojson": "^7946.0.8", - "@types/leaflet": "1.7.6", - "@types/supercluster": "^5.0.2", - "@types/three": "^0.135.0", - "@types/throttle-debounce": "^5.0.0", - "@types/topojson": "^3.2.3", - "@types/topojson-client": "^3.0.0", - "@types/topojson-specification": "^1.0.2", - "@unovis/dagre-layout": "0.8.8-2", - "@unovis/graphlibrary": "2.2.0-2", - "d3": "^7.2.1", - "d3-array": "~3", - "d3-axis": "~3", - "d3-brush": "~3", - "d3-chord": "~3", - "d3-collection": "^1.0.7", - "d3-color": "~3", - "d3-drag": "~3", - "d3-ease": "~3", - "d3-force": "~3", - "d3-geo": "~3", - "d3-geo-projection": "^4.0.0", - "d3-hierarchy": "~3", - "d3-interpolate": "~3", - "d3-interpolate-path": "^2.2.3", - "d3-path": "~3", - "d3-sankey": "^0.12.3", - "d3-scale": "~4", - "d3-selection": "~3", - "d3-shape": "~3", - "d3-timer": "~3", - "d3-transition": "~3", - "d3-zoom": "~3", - "elkjs": "^0.10.0", - "geojson": "^0.5.0", - "leaflet": "1.7.1", - "maplibre-gl": "^2.1.9", - "striptags": "^3.2.0", - "supercluster": "^7.1.5", - "three": "^0.135.0", - "throttle-debounce": "^5.0.0", - "topojson-client": "^3.1.0", - "tslib": "^2.3.1", - "typescript": "~4.2.4" - } - }, - "node_modules/@unovis/ts/node_modules/@types/three": { - "version": "0.135.0", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.135.0.tgz", - "integrity": "sha512-l7WLhIHjhHMtlpyTSltPPAKLpiMwgMD1hXHj59AVUpYRoZP7Fd9NNOSRSvZBCPLpTHPYojgQvSJCoza9zoL7bg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@unovis/ts/node_modules/three": { - "version": "0.135.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.135.0.tgz", - "integrity": "sha512-kuEpuuxRzLv0MDsXai9huCxOSQPZ4vje6y0gn80SRmQvgz6/+rI0NAvCRAw56zYaWKMGMfqKWsxF9Qa2Z9xymQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@unovis/ts/node_modules/typescript": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", - "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/@unovis/vue": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/@unovis/vue/-/vue-1.6.5.tgz", - "integrity": "sha512-BSyEeuenhSCqo0kox4xe3bWMDUn0gfF4haggrVhhNWcp6pDmctniDebOP/8AFKlhPhfGJ6b39MdvoQNhXwc46A==", - "dev": true, - "license": "Apache-2.0", - "peerDependencies": { - "@unovis/ts": "1.6.5", - "vue": "^3" - } - }, - "node_modules/@vee-validate/zod": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/@vee-validate/zod/-/zod-4.15.1.tgz", - "integrity": "sha512-329Z4TDBE5Vx0FdbA8S4eR9iGCFFUNGbxjpQ20ff5b5wGueScjocUIx9JHPa79LTG06RnlUR4XogQsjN4tecKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^4.8.3", - "vee-validate": "4.15.1" - }, - "peerDependencies": { - "zod": "^3.24.0" - } - }, - "node_modules/@vitejs/plugin-vue": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.7.tgz", - "integrity": "sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "^1.0.1" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@vitest/expect": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.8.tgz", - "integrity": "sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.1.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.8", - "@vitest/utils": "4.1.8", - "chai": "^6.2.2", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.8.tgz", - "integrity": "sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.1.8", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/mocker/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/@vitest/pretty-format": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.8.tgz", - "integrity": "sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.8.tgz", - "integrity": "sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.1.8", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.8.tgz", - "integrity": "sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.8", - "@vitest/utils": "4.1.8", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.8.tgz", - "integrity": "sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.8.tgz", - "integrity": "sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.8", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils/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/@volar/language-core": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", - "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/source-map": "2.4.28" - } - }, - "node_modules/@volar/source-map": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", - "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@volar/typescript": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", - "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "2.4.28", - "path-browserify": "^1.0.1", - "vscode-uri": "^3.0.8" - } - }, - "node_modules/@vue-macros/common": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-3.1.2.tgz", - "integrity": "sha512-h9t4ArDdniO9ekYHAD95t9AZcAbb19lEGK+26iAjUODOIJKmObDNBSe4+6ELQAA3vtYiFPPBtHh7+cQCKi3Dng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-sfc": "^3.5.22", - "ast-kit": "^2.1.2", - "local-pkg": "^1.1.2", - "magic-string-ast": "^1.0.2", - "unplugin-utils": "^0.3.0" - }, - "engines": { - "node": ">=20.19.0" - }, - "funding": { - "url": "https://github.com/sponsors/vue-macros" - }, - "peerDependencies": { - "vue": "^2.7.0 || ^3.2.25" - }, - "peerDependenciesMeta": { - "vue": { - "optional": true - } - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.35.tgz", - "integrity": "sha512-BUmHaR1J+O+CKZ9uJucdVTEr1LHsdyvv7vG3eNRhK3CczEHeMd/LtsHAuD7PbrxvI2envCY2v7HI1vC1aBRzKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.3", - "@vue/shared": "3.5.35", - "entities": "^7.0.1", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-core/node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.35.tgz", - "integrity": "sha512-k+bprkXxuqhVajgTx5mUHuir7TwQzUKOWR40ng1ncAqQRPnrLngGGgqVEEhOnTMlc8btHYVKmrP8s5Qyg0hvYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.35", - "@vue/shared": "3.5.35" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.35.tgz", - "integrity": "sha512-G5VPMcXTSywXBgtFOZOnHKBxKSrwXUcvY1iaF5/hRcy7t0J6CH/d8ha9F4nzi00Fax1eLV0QHM7v4mQu68jydw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.3", - "@vue/compiler-core": "3.5.35", - "@vue/compiler-dom": "3.5.35", - "@vue/compiler-ssr": "3.5.35", - "@vue/shared": "3.5.35", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.21", - "postcss": "^8.5.15", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.35.tgz", - "integrity": "sha512-rGhAeXgdM7/ffTJGXT69rCCdTmjDewnFuUZfBQQHTdcEBeWdT5HCGY60y2ytLJr9/Dsu7IntUi5z/w0h6Rjnzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.35", - "@vue/shared": "3.5.35" - } - }, - "node_modules/@vue/compiler-vue2": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", - "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", - "dev": true, - "license": "MIT", - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, - "node_modules/@vue/devtools-api": { - "version": "7.7.9", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.9.tgz", - "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-kit": "^7.7.9" - } - }, - "node_modules/@vue/devtools-kit": { - "version": "7.7.9", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", - "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-shared": "^7.7.9", - "birpc": "^2.3.0", - "hookable": "^5.5.3", - "mitt": "^3.0.1", - "perfect-debounce": "^1.0.0", - "speakingurl": "^14.0.1", - "superjson": "^2.2.2" - } - }, - "node_modules/@vue/devtools-shared": { - "version": "7.7.9", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", - "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "rfdc": "^1.4.1" - } - }, - "node_modules/@vue/language-core": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz", - "integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "~2.4.11", - "@vue/compiler-dom": "^3.5.0", - "@vue/compiler-vue2": "^2.7.16", - "@vue/shared": "^3.5.0", - "alien-signals": "^0.4.9", - "minimatch": "^9.0.3", - "muggle-string": "^0.4.1", - "path-browserify": "^1.0.1" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@vue/language-core/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/@vue/language-core/node_modules/brace-expansion": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", - "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@vue/language-core/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/@vue/reactivity": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.35.tgz", - "integrity": "sha512-tVc+SsHConvh/Lz64qq1pP3rYArBmK42xonovEcxY74SQtvctZodG/zhq54P5dr38cVuw25d27cPNRdlMidpGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/shared": "3.5.35" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.35.tgz", - "integrity": "sha512-A/xFNX9loIcWDygeQuNCfKuh0CoYBzxhqEMNah5TSFg9Z53DrFYEN2qi5CU9necjM1OWYegYREUTHmXTmhfXtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.35", - "@vue/shared": "3.5.35" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.35.tgz", - "integrity": "sha512-odrJ1C391dbGnyDRh8U+rnP7J2amIEzfmRk5vXy7xi3aZhEXofTvpi0T4HJb6jlNqQZTNPR5MPHSB3RHNkIORA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.35", - "@vue/runtime-core": "3.5.35", - "@vue/shared": "3.5.35", - "csstype": "^3.2.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.35.tgz", - "integrity": "sha512-NkebSOYdB97wi8OQcO3HqzZSlymJi/aWsN/7h74OSVhRTm6qGs3Jp3e0rCXynmWwSlKeRrnlIug+ilYoHBmQDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.5.35", - "@vue/shared": "3.5.35" - }, - "peerDependencies": { - "vue": "3.5.35" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.35.tgz", - "integrity": "sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vueuse/core": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.3.0.tgz", - "integrity": "sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/web-bluetooth": "^0.0.21", - "@vueuse/metadata": "14.3.0", - "@vueuse/shared": "14.3.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vue": "^3.5.0" - } - }, - "node_modules/@vueuse/metadata": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.3.0.tgz", - "integrity": "sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.3.0.tgz", - "integrity": "sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vue": "^3.5.0" - } - }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.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": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-draft-04": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", - "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^8.5.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/alien-signals": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz", - "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/aria-hidden": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", - "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "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/ast-kit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.2.0.tgz", - "integrity": "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "pathe": "^2.0.3" - }, - "engines": { - "node": ">=20.19.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" - } - }, - "node_modules/ast-walker-scope": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.9.0.tgz", - "integrity": "sha512-IJdzo2vLiElBxKzwS36VsCue/62d6IdWjnPB2v3nuPKeWGynp6FF/CYoLa5i/3jXH/z97ZDdsXz6abpgM6w07A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.2", - "@babel/types": "^7.29.0", - "ast-kit": "^2.2.0" - }, - "engines": { - "node": ">=20.19.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/birpc": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", - "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "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/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/class-variance-authority": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", - "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "clsx": "^2.1.1" - }, - "funding": { - "url": "https://polar.sh/cva" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/compare-versions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", - "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", - "dev": true, - "license": "MIT" - }, - "node_modules/confbox": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", - "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/copy-anything": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", - "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-what": "^5.2.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cosmiconfig/node_modules/yaml": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", - "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/css-line-break": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", - "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "utrie": "^1.0.2" - } - }, - "node_modules/csscolorparser": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", - "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==", - "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/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/d3": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", - "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dev": true, - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-collection": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-array": "^3.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "dev": true, - "license": "ISC", - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", - "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", - "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo-projection": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-4.0.0.tgz", - "integrity": "sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==", - "dev": true, - "license": "ISC", - "dependencies": { - "commander": "7", - "d3-array": "1 - 3", - "d3-geo": "1.12.0 - 3" - }, - "bin": { - "geo2svg": "bin/geo2svg.js", - "geograticule": "bin/geograticule.js", - "geoproject": "bin/geoproject.js", - "geoquantize": "bin/geoquantize.js", - "geostitch": "bin/geostitch.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate-path": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/d3-interpolate-path/-/d3-interpolate-path-2.3.0.tgz", - "integrity": "sha512-tZYtGXxBmbgHsIc9Wms6LS5u4w6KbP8C09a4/ZYc4KLMYYqub57rRBUgpUr2CIarIrJEpdAWWxWQvofgaMpbKQ==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-sankey": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", - "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "1 - 2", - "d3-shape": "^1.2.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-array": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "internmap": "^1.0.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/d3-sankey/node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/d3-sankey/node_modules/internmap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", - "dev": true, - "license": "ISC" - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "dev": true, - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "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/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/date-fns-tz": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-2.0.1.tgz", - "integrity": "sha512-fJCG3Pwx8HUoLhkepdsP7Z5RsucUi+ZBOxyM5d0ZZ6c4SdYustq0VMmOu6Wf7bli+yS/Jwp91TOCqn9jMcVrUA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "date-fns": "2.x" - } - }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true, - "license": "MIT" - }, - "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/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/defu": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", - "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/delaunator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", - "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "robust-predicates": "^3.0.2" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", - "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/earcut": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", - "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/elkjs": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.10.2.tgz", - "integrity": "sha512-Yx3ORtbAFrXelYkAy2g0eYyVY8QG0XEmGdQXmy0eithKKjbWRfl3Xe884lfkszfBF6UKyIy4LwfcZ3AZc8oxFw==", - "dev": true, - "license": "EPL-2.0" - }, - "node_modules/embla-carousel": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz", - "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/embla-carousel-reactive-utils": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.6.0.tgz", - "integrity": "sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "embla-carousel": "8.6.0" - } - }, - "node_modules/embla-carousel-vue": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/embla-carousel-vue/-/embla-carousel-vue-8.6.0.tgz", - "integrity": "sha512-v8UO5UsyLocZnu/LbfQA7Dn2QHuZKurJY93VUmZYP//QRWoCWOsionmvLLAlibkET3pGPs7++03VhJKbWD7vhQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "embla-carousel": "8.6.0", - "embla-carousel-reactive-utils": "8.6.0" - }, - "peerDependencies": { - "vue": "^3.2.37" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.22.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.22.2.tgz", - "integrity": "sha512-0rxICaFZ7NQho/sHely2bvOPRP0Eu2B0NZ9zM54YvRvWMn7jfz3DmnOZDR9LlXDdDcqntAVc6Hfy4gr/tdH/Ag==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "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/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "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": "2.1.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", - "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", - "dev": true, - "license": "MIT" - }, - "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/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/exsolve": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", - "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", - "dev": true, - "license": "MIT" - }, - "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-plist": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/fast-plist/-/fast-plist-0.1.3.tgz", - "integrity": "sha512-d9cEfo/WcOezgPLAC/8t8wGb6YOD6JTCPMw2QcG2nAdFmyY+9rTUizCTaGjIZAloWENTEUMAPpkUAIJJJ0i96A==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fflate": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", - "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", - "dev": true, - "license": "MIT" - }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true, - "license": "MIT" - }, - "node_modules/fs-extra": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", - "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "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/geojson": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/geojson/-/geojson-0.5.0.tgz", - "integrity": "sha512-/Bx5lEn+qRF4TfQ5aLu6NH+UKtvIv7Lhc487y/c8BdludrCTpiWf9wyI0RTyqg49MFefIAvFDuEi5Dfd/zgNxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/geojson-vt": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", - "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gl-matrix": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.4.tgz", - "integrity": "sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "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/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/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/highlight.js": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", - "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/hookable": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", - "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", - "dev": true, - "license": "MIT" - }, - "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/html2canvas": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", - "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "css-line-break": "^2.1.0", - "text-segmentation": "^1.0.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "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/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "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": "BSD-3-Clause" - }, - "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/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC" - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/is-what": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", - "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "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/jiti": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", - "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsdom": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", - "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssstyle": "^4.2.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.5.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.16", - "parse5": "^7.2.1", - "rrweb-cssom": "^0.8.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^5.1.1", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.1.1", - "ws": "^8.18.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^3.0.0" - }, - "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-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "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/jsonfile": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/kdbush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", - "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==", - "dev": true, - "license": "ISC" - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kolorist": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/leaflet": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.7.1.tgz", - "integrity": "sha512-/xwPEBidtg69Q3HlqPdU3DnrXQOvQU/CCHA1tcDQVzOwm91YMYaILjNp7L4Eaw5Z4sOYdbBz6koWyibppd8Zqw==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/local-pkg": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz", - "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "mlly": "^1.7.4", - "pkg-types": "^2.3.0", - "quansync": "^0.2.11" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", - "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", - "dev": true, - "license": "MIT" - }, - "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/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/magic-string-ast": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-1.0.3.tgz", - "integrity": "sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==", - "dev": true, - "license": "MIT", - "dependencies": { - "magic-string": "^0.30.19" - }, - "engines": { - "node": ">=20.19.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" - } - }, - "node_modules/maplibre-gl": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-2.4.0.tgz", - "integrity": "sha512-csNFylzntPmHWidczfgCZpvbTSmhaWvLRj9e1ezUDBEPizGgshgm3ea1T5TCNEEBq0roauu7BPuRZjA3wO4KqA==", - "dev": true, - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@mapbox/geojson-rewind": "^0.5.2", - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/mapbox-gl-supported": "^2.0.1", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^2.0.5", - "@mapbox/unitbezier": "^0.0.1", - "@mapbox/vector-tile": "^1.3.1", - "@mapbox/whoots-js": "^3.1.0", - "@types/geojson": "^7946.0.10", - "@types/mapbox__point-geometry": "^0.1.2", - "@types/mapbox__vector-tile": "^1.3.0", - "@types/pbf": "^3.0.2", - "csscolorparser": "~1.0.3", - "earcut": "^2.2.4", - "geojson-vt": "^3.2.1", - "gl-matrix": "^3.4.3", - "global-prefix": "^3.0.0", - "murmurhash-js": "^1.0.0", - "pbf": "^3.2.1", - "potpack": "^1.0.2", - "quickselect": "^2.0.0", - "supercluster": "^7.1.5", - "tinyqueue": "^2.0.3", - "vt-pbf": "^3.1.3" - } - }, - "node_modules/meshoptimizer": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", - "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/minimatch": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.3.tgz", - "integrity": "sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "dev": true, - "license": "MIT" - }, - "node_modules/mlly": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", - "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.16.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.3" - } - }, - "node_modules/mlly/node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/mlly/node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/monaco-editor": { - "version": "0.50.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.50.0.tgz", - "integrity": "sha512-8CclLCmrRRh+sul7C08BmPBP3P8wVWfBHomsTcndxg5NRCEPfu/mc2AGU8k37ajjDVXcXFc12ORAMUkmk+lkFA==", - "dev": true, - "license": "MIT" - }, - "node_modules/monaco-themes": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/monaco-themes/-/monaco-themes-0.4.8.tgz", - "integrity": "sha512-QEDCwl5XUMPPpsg8TVNfi1VKIDtMsMTJAhUfxHSZ6hzkEfZgfTK2hicwyzkDKhAhrpMkHkwMtG13ynvdztJesw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-plist": "^0.1.3" - }, - "engines": { - "node": ">=22.0.0" - } - }, - "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/muggle-string": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", - "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/murmurhash-js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", - "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", - "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/nwsapi": { - "version": "2.2.23", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", - "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/obug": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], - "license": "MIT" - }, - "node_modules/ohash": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", - "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", - "dev": true, - "license": "MIT" - }, - "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/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "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": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/pbf": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.3.0.tgz", - "integrity": "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "ieee754": "^1.1.12", - "resolve-protobuf-schema": "^2.1.0" - }, - "bin": { - "pbf": "bin/pbf" - } - }, - "node_modules/perfect-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", - "dev": true, - "license": "MIT" - }, - "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": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-types": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", - "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.2.4", - "exsolve": "^1.0.8", - "pathe": "^2.0.3" - } - }, - "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", - "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.12", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/potpack": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", - "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/prettier": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", - "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-plugin-classnames": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/prettier-plugin-classnames/-/prettier-plugin-classnames-0.10.2.tgz", - "integrity": "sha512-t8X4dRoLqozJyiCaokDViFbIeXBzQFftXbzWz+6nyUbLReSgzJoBJeD2jDUPOYMWM7CoEBnOmeoa7hko9lUBQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "zod": "3.22.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@prettier/plugin-oxc": "*", - "prettier": "^3", - "prettier-plugin-astro": "*", - "prettier-plugin-svelte": "*" - }, - "peerDependenciesMeta": { - "@prettier/plugin-oxc": { - "optional": true - }, - "prettier-plugin-astro": { - "optional": true - }, - "prettier-plugin-svelte": { - "optional": true - } - } - }, - "node_modules/prettier-plugin-classnames/node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/prettier-plugin-merge": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/prettier-plugin-merge/-/prettier-plugin-merge-0.10.1.tgz", - "integrity": "sha512-dwz+TLE6sAIaoiZTS7mixu6JF85IfvccWrFMcaA4tpmu51TerUEW/WlI1u9h5ewU8Zxu89q08KKNHKCOe17iAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "diff": "5.2.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "prettier": "^3" - } - }, - "node_modules/prettier-plugin-organize-imports": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.3.0.tgz", - "integrity": "sha512-FxFz0qFhyBsGdIsb697f/EkvHzi5SZOhWAjxcx2dLt+Q532bAlhswcXGYB1yzjZ69kW8UoadFBw7TyNwlq96Iw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "prettier": ">=2.0", - "typescript": ">=2.9", - "vue-tsc": "^2.1.0 || 3" - }, - "peerDependenciesMeta": { - "vue-tsc": { - "optional": true - } - } - }, - "node_modules/prettier-plugin-tailwindcss": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.8.0.tgz", - "integrity": "sha512-V8ITGH87yuBDF6JpEZTOVlUz/saAwqb8f3HRgUj8Lh+tGCcrmorhsLpYqzygwFwK0PE2Ib6Mv3M7T/uE2tZV1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.19" - }, - "peerDependencies": { - "@ianvs/prettier-plugin-sort-imports": "*", - "@prettier/plugin-hermes": "*", - "@prettier/plugin-oxc": "*", - "@prettier/plugin-pug": "*", - "@shopify/prettier-plugin-liquid": "*", - "@trivago/prettier-plugin-sort-imports": "*", - "@zackad/prettier-plugin-twig": "*", - "prettier": "^3.0", - "prettier-plugin-astro": "*", - "prettier-plugin-css-order": "*", - "prettier-plugin-jsdoc": "*", - "prettier-plugin-marko": "*", - "prettier-plugin-multiline-arrays": "*", - "prettier-plugin-organize-attributes": "*", - "prettier-plugin-organize-imports": "*", - "prettier-plugin-sort-imports": "*", - "prettier-plugin-svelte": "*" - }, - "peerDependenciesMeta": { - "@ianvs/prettier-plugin-sort-imports": { - "optional": true - }, - "@prettier/plugin-hermes": { - "optional": true - }, - "@prettier/plugin-oxc": { - "optional": true - }, - "@prettier/plugin-pug": { - "optional": true - }, - "@shopify/prettier-plugin-liquid": { - "optional": true - }, - "@trivago/prettier-plugin-sort-imports": { - "optional": true - }, - "@zackad/prettier-plugin-twig": { - "optional": true - }, - "prettier-plugin-astro": { - "optional": true - }, - "prettier-plugin-css-order": { - "optional": true - }, - "prettier-plugin-jsdoc": { - "optional": true - }, - "prettier-plugin-marko": { - "optional": true - }, - "prettier-plugin-multiline-arrays": { - "optional": true - }, - "prettier-plugin-organize-attributes": { - "optional": true - }, - "prettier-plugin-organize-imports": { - "optional": true - }, - "prettier-plugin-sort-imports": { - "optional": true - }, - "prettier-plugin-svelte": { - "optional": true - } - } - }, - "node_modules/protocol-buffers-schema": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.1.tgz", - "integrity": "sha512-VG2K63Igkiv9p76tk1lilczEK1cT+kCjKtkdhw1dQZV3k3IXJbd3o6Ho8b9zJZaHSnT2hKe4I+ObmX9w6m5SmQ==", - "dev": true, - "license": "MIT" - }, - "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/quansync": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", - "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/antfu" - }, - { - "type": "individual", - "url": "https://github.com/sponsors/sxzz" - } - ], - "license": "MIT" - }, - "node_modules/quickselect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", - "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/reka-ui": { - "version": "2.9.9", - "resolved": "https://registry.npmjs.org/reka-ui/-/reka-ui-2.9.9.tgz", - "integrity": "sha512-/e+hdF9vP8E2kPrKR4RdgMQQsfpCr8l436Zn8GRWM3jKT9EG1lOO/UFMGBVEnrMLOVoJSjjmIFrej4tMOb+6qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.6.13", - "@floating-ui/vue": "^1.1.6", - "@internationalized/date": "^3.5.0", - "@internationalized/number": "^3.5.0", - "@tanstack/vue-virtual": "^3.12.0", - "@vueuse/core": "^14.1.0", - "@vueuse/shared": "^14.1.0", - "aria-hidden": "^1.2.4", - "defu": "^6.1.5", - "ohash": "^2.0.11" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/zernonia" - }, - "peerDependencies": { - "vue": ">= 3.4.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/resolve-protobuf-schema": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", - "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "protocol-buffers-schema": "^3.3.1" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/robust-predicates": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", - "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", - "dev": true, - "license": "Unlicense" - }, - "node_modules/rolldown": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", - "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.133.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.3", - "@rolldown/binding-darwin-arm64": "1.0.3", - "@rolldown/binding-darwin-x64": "1.0.3", - "@rolldown/binding-freebsd-x64": "1.0.3", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", - "@rolldown/binding-linux-arm64-gnu": "1.0.3", - "@rolldown/binding-linux-arm64-musl": "1.0.3", - "@rolldown/binding-linux-ppc64-gnu": "1.0.3", - "@rolldown/binding-linux-s390x-gnu": "1.0.3", - "@rolldown/binding-linux-x64-gnu": "1.0.3", - "@rolldown/binding-linux-x64-musl": "1.0.3", - "@rolldown/binding-openharmony-arm64": "1.0.3", - "@rolldown/binding-wasm32-wasi": "1.0.3", - "@rolldown/binding-win32-arm64-msvc": "1.0.3", - "@rolldown/binding-win32-x64-msvc": "1.0.3" - } - }, - "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/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "dev": true, - "license": "BSD-3-Clause" - }, - "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/scule": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", - "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", - "dev": true, - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "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/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "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/speakingurl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", - "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "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": "4.1.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", - "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/striptags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.2.0.tgz", - "integrity": "sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==", - "dev": true, - "license": "MIT" - }, - "node_modules/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/supercluster": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz", - "integrity": "sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==", - "dev": true, - "license": "ISC", - "dependencies": { - "kdbush": "^3.0.0" - } - }, - "node_modules/superjson": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", - "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "copy-anything": "^4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/tailwind-merge": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", - "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwindcss": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz", - "integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/tapable": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", - "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/text-segmentation": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", - "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "utrie": "^1.0.2" - } - }, - "node_modules/three": { - "version": "0.166.1", - "resolved": "https://registry.npmjs.org/three/-/three-0.166.1.tgz", - "integrity": "sha512-LtuafkKHHzm61AQA1be2MAYIw1IjmhOUxhBa0prrLpEMWbV7ijvxCRHjSgHPGp2493wLBzwKV46tA9nivLEgKg==", - "dev": true, - "license": "MIT" - }, - "node_modules/throttle-debounce": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", - "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.22" - } - }, - "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": "1.2.4", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", - "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyqueue": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", - "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==", - "dev": true, - "license": "ISC" - }, - "node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tldts": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", - "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^6.1.86" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/tldts-core": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", - "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/topojson-client": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", - "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", - "dev": true, - "license": "ISC", - "dependencies": { - "commander": "2" - }, - "bin": { - "topo2geo": "bin/topo2geo", - "topomerge": "bin/topomerge", - "topoquantize": "bin/topoquantize" - } - }, - "node_modules/topojson-client/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/tough-cookie": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", - "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^6.1.32" - }, - "engines": { - "node": ">=16" - } - }, - "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/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/tw-animate-css": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", - "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Wombosvideo" - } - }, - "node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", - "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ufo": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", - "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", - "dev": true, - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "dev": true, - "license": "MIT" - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unplugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.0.0.tgz", - "integrity": "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.5", - "picomatch": "^4.0.3", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/unplugin-utils": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.1.tgz", - "integrity": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==", - "dev": true, - "license": "MIT", - "dependencies": { - "pathe": "^2.0.3", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=20.19.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" - } - }, - "node_modules/utrie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", - "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "base64-arraybuffer": "^1.0.2" - } - }, - "node_modules/v-calendar": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/v-calendar/-/v-calendar-3.1.2.tgz", - "integrity": "sha512-QDWrnp4PWCpzUblctgo4T558PrHgHzDtQnTeUNzKxfNf29FkCeFpwGd9bKjAqktaa2aJLcyRl45T5ln1ku34kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/lodash": "^4.14.165", - "@types/resize-observer-browser": "^0.1.7", - "date-fns": "^2.16.1", - "date-fns-tz": "^2.0.0", - "lodash": "^4.17.20", - "vue-screen-utils": "^1.0.0-beta.13" - }, - "peerDependencies": { - "@popperjs/core": "^2.0.0", - "vue": "^3.2.0" - } - }, - "node_modules/vaul-vue": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/vaul-vue/-/vaul-vue-0.4.1.tgz", - "integrity": "sha512-A6jOWOZX5yvyo1qMn7IveoWN91mJI5L3BUKsIwkg6qrTGgHs1Sb1JF/vyLJgnbN1rH4OOOxFbtqL9A46bOyGUQ==", - "dev": true, - "dependencies": { - "@vueuse/core": "^10.8.0", - "reka-ui": "^2.0.0", - "vue": "^3.4.5" - }, - "peerDependencies": { - "reka-ui": "^2.0.0", - "vue": "^3.3.0" - } - }, - "node_modules/vaul-vue/node_modules/@types/web-bluetooth": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", - "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", - "dev": true, - "license": "MIT" - }, - "node_modules/vaul-vue/node_modules/@vueuse/core": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz", - "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "10.11.1", - "@vueuse/shared": "10.11.1", - "vue-demi": ">=0.14.8" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/vaul-vue/node_modules/@vueuse/core/node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/vaul-vue/node_modules/@vueuse/metadata": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.1.tgz", - "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/vaul-vue/node_modules/@vueuse/shared": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.1.tgz", - "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==", - "dev": true, - "license": "MIT", - "dependencies": { - "vue-demi": ">=0.14.8" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/vaul-vue/node_modules/@vueuse/shared/node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/vee-validate": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/vee-validate/-/vee-validate-4.15.1.tgz", - "integrity": "sha512-DkFsiTwEKau8VIxyZBGdO6tOudD+QoUBPuHj3e6QFqmbfCRj1ArmYWue9lEp6jLSWBIw4XPlDLjFIZNLdRAMSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-api": "^7.5.2", - "type-fest": "^4.8.3" - }, - "peerDependencies": { - "vue": "^3.4.26" - } - }, - "node_modules/vite": { - "version": "8.0.16", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", - "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.32.0", - "picomatch": "^4.0.4", - "postcss": "^8.5.15", - "rolldown": "1.0.3", - "tinyglobby": "^0.2.17" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.1.18", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-plugin-dts": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-4.5.4.tgz", - "integrity": "sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@microsoft/api-extractor": "^7.50.1", - "@rollup/pluginutils": "^5.1.4", - "@volar/typescript": "^2.4.11", - "@vue/language-core": "2.2.0", - "compare-versions": "^6.1.1", - "debug": "^4.4.0", - "kolorist": "^1.8.0", - "local-pkg": "^1.0.0", - "magic-string": "^0.30.17" - }, - "peerDependencies": { - "typescript": "*", - "vite": "*" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.8.tgz", - "integrity": "sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.1.8", - "@vitest/mocker": "4.1.8", - "@vitest/pretty-format": "4.1.8", - "@vitest/runner": "4.1.8", - "@vitest/snapshot": "4.1.8", - "@vitest/spy": "4.1.8", - "@vitest/utils": "4.1.8", - "es-module-lexer": "^2.0.0", - "expect-type": "^1.3.0", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^4.0.0-rc.1", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.1.0", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.8", - "@vitest/browser-preview": "4.1.8", - "@vitest/browser-webdriverio": "4.1.8", - "@vitest/coverage-istanbul": "4.1.8", - "@vitest/coverage-v8": "4.1.8", - "@vitest/ui": "4.1.8", - "happy-dom": "*", - "jsdom": "*", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/coverage-istanbul": { - "optional": true - }, - "@vitest/coverage-v8": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "vite": { - "optional": false - } - } - }, - "node_modules/vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/vt-pbf": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", - "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mapbox/point-geometry": "0.1.0", - "@mapbox/vector-tile": "^1.3.1", - "pbf": "^3.2.1" - } - }, - "node_modules/vue": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.35.tgz", - "integrity": "sha512-cx89fnr+0kVGHiNFG6y6s0bdjypJRFNZn6x3WPstNdQR1bi1mbB7h4v5IBGTsPJU3nK1+0Iqj3Zf+hZWMieR4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.35", - "@vue/compiler-sfc": "3.5.35", - "@vue/runtime-dom": "3.5.35", - "@vue/server-renderer": "3.5.35", - "@vue/shared": "3.5.35" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue-router": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-5.1.0.tgz", - "integrity": "sha512-HAbiLzLEHQwxPgvsbOJDAwtavszEgLwri6XfyrsPECIFez8+59xc9LofWVdc/HEaSRT822lJ8H9Ns38VVond5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/generator": "^8.0.0-rc.4", - "@vue-macros/common": "^3.1.1", - "@vue/devtools-api": "^8.1.2", - "ast-walker-scope": "^0.9.0", - "chokidar": "^5.0.0", - "json5": "^2.2.3", - "local-pkg": "^1.1.2", - "magic-string": "^0.30.21", - "mlly": "^1.8.2", - "muggle-string": "^0.4.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "scule": "^1.3.0", - "tinyglobby": "^0.2.16", - "unplugin": "^3.0.0", - "unplugin-utils": "^0.3.1", - "yaml": "^2.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "@pinia/colada": ">=0.21.2", - "@vue/compiler-sfc": "^3.5.34", - "pinia": "^3.0.4", - "vite": "^7.0.0 || ^8.0.0", - "vue": "^3.5.34" - }, - "peerDependenciesMeta": { - "@pinia/colada": { - "optional": true - }, - "@vue/compiler-sfc": { - "optional": true - }, - "pinia": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/vue-router/node_modules/@babel/generator": { - "version": "8.0.0-rc.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0-rc.6.tgz", - "integrity": "sha512-6mIzgVK8DgEzvIapoQwhXTMnnkuE4STQmVv9H03i/tZ2ml8oev3TRvZJgTenK2Bsq0YWNtzOrFdTyNzCMFtjJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^8.0.0-rc.6", - "@babel/types": "^8.0.0-rc.6", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "@types/jsesc": "^2.5.0", - "jsesc": "^3.0.2" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/vue-router/node_modules/@babel/helper-string-parser": { - "version": "8.0.0-rc.6", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0-rc.6.tgz", - "integrity": "sha512-BCkFy+zN6kXQed3YOT7aJl93NfDSzQc3pBfsvTVPs9gU9X3V0aefEF5kwBT0E+mDWH9QgKaZstYUQN9VdQZT4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/vue-router/node_modules/@babel/helper-validator-identifier": { - "version": "8.0.0-rc.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0-rc.6.tgz", - "integrity": "sha512-nVJ+1JcCgntv8d78rRo++o2wuODT0Irknx2BF8Np4Ft2CRgjLqIs4qzSZ8b66yGbBdMWGmZBO9WEZv1hhNiSpg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/vue-router/node_modules/@babel/parser": { - "version": "8.0.0-rc.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.0-rc.6.tgz", - "integrity": "sha512-rOS8IpdO7mQELkTPlCsTgPejO0bFuZdEDCGQJouYbYf9e1FLTym7Fei2pEjq8q7MWbX0ravcd7QQYKs1TxOuog==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^8.0.0-rc.6" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/vue-router/node_modules/@babel/types": { - "version": "8.0.0-rc.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0-rc.6.tgz", - "integrity": "sha512-p7/ABylAYlexb31wtRdIfH9L9A0Z2T/9H6zAqzqndkY2PLkvNNc580wGhp/gGKN4Sp9sQvSkhc6Oga8/O+wTyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^8.0.0-rc.6", - "@babel/helper-validator-identifier": "^8.0.0-rc.6" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/vue-router/node_modules/@vue/devtools-api": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.1.2.tgz", - "integrity": "sha512-vA0O112YqyDuNA1s7Yb2gCgToQ/OxOWiFDO5ThLCcDy0ldHnSd1dUTaSYhOldbqoNgumE4dxtGAoAaSUKUD1Zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-kit": "^8.1.2" - } - }, - "node_modules/vue-router/node_modules/@vue/devtools-kit": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.1.2.tgz", - "integrity": "sha512-f75/upc+GCyjXErpgPGz4582ujS0L/adAltGy+tqXMGUJpgAcfGr6CxnnhpZY8BHuMYt6KpbF8uaFrrQG66rGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-shared": "^8.1.2", - "birpc": "^2.6.1", - "hookable": "^5.5.3", - "perfect-debounce": "^2.0.0" - } - }, - "node_modules/vue-router/node_modules/@vue/devtools-shared": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.1.2.tgz", - "integrity": "sha512-X9RyVFYAdkBe4IUf5v48TxBF/6QPmF8CmWrDAjXzfUHrgQ/HGfTC1A6TqgXqZ03ye66l3AD51BAGD69IvKM9sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/vue-router/node_modules/perfect-debounce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", - "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/vue-screen-utils": { - "version": "1.0.0-beta.13", - "resolved": "https://registry.npmjs.org/vue-screen-utils/-/vue-screen-utils-1.0.0-beta.13.tgz", - "integrity": "sha512-EJ/8TANKhFj+LefDuOvZykwMr3rrLFPLNb++lNBqPOpVigT2ActRg6icH9RFQVm4nHwlHIHSGm5OY/Clar9yIg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/vue-sonner": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/vue-sonner/-/vue-sonner-1.3.2.tgz", - "integrity": "sha512-UbZ48E9VIya3ToiRHAZUbodKute/z/M1iT8/3fU8zEbwBRE11AKuHikssv18LMk2gTTr6eMQT4qf6JoLHWuj/A==", - "dev": true, - "license": "MIT" - }, - "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/webpack-virtual-modules": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", - "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", - "dev": true, - "license": "MIT" - }, - "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": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "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/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", - "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/yaml": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", - "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } + "name": "@mkbabb/keyframes.js", + "version": "3.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@mkbabb/keyframes.js", + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@mkbabb/parse-that": "^0.8.2", + "@mkbabb/value.js": "^0.10.0" + }, + "devDependencies": { + "@iconify-json/radix-icons": "^1.2.6", + "@iconify/vue": "^5.0.1", + "@lucide/vue": "^1.17.0", + "@microsoft/api-extractor": "^7.58.7", + "@tailwindcss/postcss": "^4.3.0", + "@types/node": "^25.9.1", + "@types/three": "^0.184.1", + "@unovis/ts": "^1.6.5", + "@unovis/vue": "^1.6.5", + "@vee-validate/zod": "^4.15.1", + "@vitejs/plugin-vue": "^6.0.7", + "@vueuse/core": "^14.3.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "embla-carousel-vue": "^8.6.0", + "highlight.js": "^11.11.1", + "html2canvas": "^1.4.1", + "jsdom": "^29.1.1", + "monaco-editor": "^0.55.1", + "monaco-themes": "^0.4.8", + "prettier": "^3.8.3", + "prettier-plugin-classnames": "^0.10.2", + "prettier-plugin-merge": "^0.10.1", + "prettier-plugin-organize-imports": "^4.3.0", + "prettier-plugin-tailwindcss": "^0.8.0", + "reka-ui": "^2.9.9", + "tailwind-merge": "^3.6.0", + "tailwindcss": "^4.3.0", + "three": "^0.184.0", + "tw-animate-css": "^1.4.0", + "typescript": "^6.0.3", + "v-calendar": "^3.1.2", + "vaul-vue": "^0.4.1", + "vee-validate": "^4.15.1", + "vite": "^8.0.16", + "vite-plugin-dts": "^5.0.2", + "vitest": "^4.1.8", + "vue": "^3.5.35", + "vue-router": "^5.1.0", + "vue-sonner": "^2.0.9", + "zod": "^3.25.76" + }, + "engines": { + "node": ">=22" + }, + "optionalDependencies": { + "@mkbabb/glass-ui": "file:../glass-ui" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "../glass-ui": { + "name": "@mkbabb/glass-ui", + "version": "3.1.1", + "license": "MIT", + "optional": true, + "devDependencies": { + "@lucide/vue": "^1.16.0", + "@mkbabb/keyframes.js": "^2.2.0", + "@mkbabb/value.js": "^0.10.0", + "@tailwindcss/postcss": "^4.3.0", + "@tailwindcss/vite": "^4.3.0", + "@types/node": "^24.12.3", + "@vitejs/plugin-vue": "^6.0.7", + "@vue/test-utils": "^2.4.10", + "@vueuse/core": "^14.3.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "embla-carousel-vue": "^8.6.0", + "happy-dom": "^20.9.0", + "reka-ui": "^2.9.7", + "tailwindcss": "^4.3.0", + "tw-animate-css": "^1.2.5", + "typescript": "^6.0.3", + "vaul-vue": "^0.4.0", + "vite": "^8.0.13", + "vitest": "^4.1.7", + "vue": "^3.5.34", + "vue-router": "^4.6.4", + "vue-tsc": "^3.3.1" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "@lucide/vue": "^1.16.0", + "@mkbabb/keyframes.js": "^2.2.0", + "@mkbabb/value.js": "^0.10.0", + "@vueuse/core": "^14.0", + "class-variance-authority": "^0.7", + "clsx": "^2.0", + "embla-carousel-vue": "^8.0", + "reka-ui": "^2.0", + "tailwindcss": "^4.0", + "tw-animate-css": "^1.2.5", + "vaul-vue": "^0.4", + "vue": "^3.5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz", + "integrity": "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", + "@csstools/css-calc": "^3.2.0", + "@csstools/css-color-parser": "^4.1.0", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz", + "integrity": "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.2.1", + "is-potential-custom-element-name": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/generational-cache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz", + "integrity": "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "dev": true, + "license": "MIT" + }, + "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/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@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-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-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/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.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.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "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/@bramus/specificity": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", + "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.0" + }, + "bin": { + "specificity": "bin/cli.js" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", + "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@csstools/css-calc": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", + "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.1.tgz", + "integrity": "sha512-eZ5XOtyhK+mggRafYUWzA0tvaYOFgdY8AkgQiCJF9qNAePnUo/zmsqqYubBBb3sQ8uNUaSKTY9s9klfRaAXL0g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^6.0.2", + "@csstools/css-calc": "^3.2.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.5.tgz", + "integrity": "sha512-oNjBvzLq2GPZtJphCjLqXow/cHySHSgtxvKZb7OqSZ/xHgw6NWNhfad+6AB9cLeVm6eA9d/qMll3JdEHjy6M+A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@dimforge/rapier3d-compat": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz", + "integrity": "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/css": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/css/-/css-11.13.5.tgz", + "integrity": "sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@exodus/bytes": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", + "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@floating-ui/vue": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@floating-ui/vue/-/vue-1.1.11.tgz", + "integrity": "sha512-HzHKCNVxnGS35r9fCHBc3+uCnjw9IWIlCPL683cGgM9Kgj2BiAl8x1mS7vtvP6F9S/e/q4O6MApwSHj8hNLGfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.6", + "@floating-ui/utils": "^0.2.11", + "vue-demi": ">=0.13.0" + } + }, + "node_modules/@floating-ui/vue/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@iconify-json/radix-icons": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@iconify-json/radix-icons/-/radix-icons-1.2.6.tgz", + "integrity": "sha512-izgVBJwk37dSvsma1QsRMfCWQ4FIImbBmJId1WUURzRZA5fFyKlCcG/nZC8se0KhOBWszo2mYgLmhKJv/DFPoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@iconify/vue": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@iconify/vue/-/vue-5.0.1.tgz", + "integrity": "sha512-aumwwooJlFJ5H5qYWB6ZTAyM0C8hpfcSVLB9/a3qnH1GGvIJ+FEbpEs4s/HfErYe/M5qZeLjwmESR5fFm3lXEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@iconify/types": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/cyberalien" + }, + "peerDependencies": { + "vue": ">=3.0.0" + } + }, + "node_modules/@internationalized/date": { + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.12.2.tgz", + "integrity": "sha512-FY1Y+H64NDs+HAF6omlnWxm3mEpfgaCSWtL5l551ZZfImA+kGjPFgrnJrGjH6lfmLL0g8Z/mBu1R3kufeCp6Jw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@internationalized/number": { + "version": "3.6.7", + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.7.tgz", + "integrity": "sha512-3ji1fcrT+FPAK86UqEhB/psHixYo6niWPJtt7+qRaYFynt/BaJG8GhAPimtWUpEiVSTq8ZM8L5psMxGquiB/Vg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "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.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "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/@juggle/resize-observer": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@lucide/vue": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@lucide/vue/-/vue-1.17.0.tgz", + "integrity": "sha512-6Q1ZHgr5FbmJzKWe5BxlNdjLj2lbmuH1zwDtVzUJofX0w9UREwKgq4F4jwKqFYyyIS4Rj3FiJvDi2k6djukmmw==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "vue": ">=3.0.1" + } + }, + "node_modules/@mapbox/geojson-rewind": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", + "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", + "dev": true, + "license": "ISC", + "dependencies": { + "get-stream": "^6.0.1", + "minimist": "^1.2.6" + }, + "bin": { + "geojson-rewind": "geojson-rewind" + } + }, + "node_modules/@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mapbox/mapbox-gl-supported": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-2.0.1.tgz", + "integrity": "sha512-HP6XvfNIzfoMVfyGjBckjiAOQK9WfX0ywdLubuPMPv+Vqf5fj0uCbgBQYpiqcWZT6cbyyRnTSXDheT1ugvF6UQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@mapbox/tiny-sdf": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.2.0.tgz", + "integrity": "sha512-LVL4wgI9YAum5V+LNVQO6QgFBPw7/MIIY4XJPNsPDMrjEwcE+JfKk1LuIl8GnF197ejVdC9QdPaxrx5gfgdGXg==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/@mapbox/unitbezier": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", + "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/@mapbox/vector-tile": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", + "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@mapbox/point-geometry": "~0.1.0" + } + }, + "node_modules/@mapbox/whoots-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", + "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@microsoft/api-extractor": { + "version": "7.58.7", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.58.7.tgz", + "integrity": "sha512-yK6OycD46gIzLRpj6ueVUWPk1ACSpkN1LBo05gY1qPTylbWyUCanXfH7+VgkI5LJrJoRSQR5F04XuCffCXLOBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/api-extractor-model": "7.33.8", + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.1", + "@rushstack/node-core-library": "5.23.1", + "@rushstack/rig-package": "0.7.3", + "@rushstack/terminal": "0.24.0", + "@rushstack/ts-command-line": "5.3.9", + "diff": "~8.0.2", + "minimatch": "10.2.3", + "resolve": "~1.22.1", + "semver": "~7.7.4", + "source-map": "~0.6.1", + "typescript": "5.9.3" + }, + "bin": { + "api-extractor": "bin/api-extractor" + } + }, + "node_modules/@microsoft/api-extractor-model": { + "version": "7.33.8", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.33.8.tgz", + "integrity": "sha512-aIcoQggPyer3B6Ze3usz0YWC/oBwUHfRH5ETUsr+oT2BRA6SfTJl7IKPcPZkX4UR+PohowzW4uMxsvjrn8vm+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.1", + "@rushstack/node-core-library": "5.23.1" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz", + "integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.18.1.tgz", + "integrity": "sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "0.16.0", + "ajv": "~8.18.0", + "jju": "~1.4.0", + "resolve": "~1.22.2" + } + }, + "node_modules/@mkbabb/glass-ui": { + "resolved": "../glass-ui", + "link": true + }, + "node_modules/@mkbabb/parse-that": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@mkbabb/parse-that/-/parse-that-0.8.2.tgz", + "integrity": "sha512-0hs7OYm649Nm7n+44hQMMYIaTdjoaNP+cqEQaCGrmxnRCnvtLnha102gsSVjWjJiwYF624gdxPC/NKlsLckZMg==" + }, + "node_modules/@mkbabb/value.js": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@mkbabb/value.js/-/value.js-0.10.0.tgz", + "integrity": "sha512-3HWQzu+0vCQIpozqX2hDkni0hXFbHfNcaitvQiN40t8vjHM6yCSB1D5+Rk6bsUA3uUGUdMQ18Bv9oN8YUq53YQ==", + "license": "MIT", + "dependencies": { + "@mkbabb/parse-that": "^0.8.2" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.133.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", + "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", + "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", + "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", + "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", + "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", + "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", + "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", + "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", + "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", + "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", + "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", + "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", + "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", + "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", + "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", + "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", + "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library": { + "version": "5.23.1", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.23.1.tgz", + "integrity": "sha512-wlKmIKIYCKuCASbITvOxLZXepPbwXvrv7S6ig6XNWFchSyhL/E2txmVXspHY49Wu2dzf7nI27a2k/yV5BA3EiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "~8.18.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~11.3.0", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.7.4" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/problem-matcher": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.2.1.tgz", + "integrity": "sha512-gulfhBs6n+I5b7DvjKRfhMGyUejtSgOHTclF/eONr8hcgF1APEDjhxIsfdUYYMzC3rvLwGluqLjbwCFZ8nxrog==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/rig-package": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.7.3.tgz", + "integrity": "sha512-aAA518n6wxxjCfnTAOjQnm7ngNE0FVHxHAw2pxKlIhxrMn0XQjGcXKF0oKWpjBgJOmsaJpVob/v+zr3zxgPWuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jju": "~1.4.0", + "resolve": "~1.22.1" + } + }, + "node_modules/@rushstack/terminal": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.24.0.tgz", + "integrity": "sha512-8ZQS4MMaGsv27EXCBiH7WMPkRZrffeDoIevs6z9TM5dzqiY6+Hn4evfK/G+gvgBTjfvfkHIZPQQmalmI2sM4TQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rushstack/node-core-library": "5.23.1", + "@rushstack/problem-matcher": "0.2.1", + "supports-color": "~8.1.1" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.3.9.tgz", + "integrity": "sha512-GIHqU+sRGQ3LGWAZu1O+9Yh++qwtyNIIGuNbcWHJjBTm2qRez0cwINUHZ+pQLR8UuzZDcMajrDaNbUYoaL/XtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rushstack/terminal": "0.24.0", + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "string-argv": "~0.3.1" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.23", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz", + "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.0.tgz", + "integrity": "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.21.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.0" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.0.tgz", + "integrity": "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.0", + "@tailwindcss/oxide-darwin-arm64": "4.3.0", + "@tailwindcss/oxide-darwin-x64": "4.3.0", + "@tailwindcss/oxide-freebsd-x64": "4.3.0", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.0", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.0", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.0", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.0", + "@tailwindcss/oxide-linux-x64-musl": "4.3.0", + "@tailwindcss/oxide-wasm32-wasi": "4.3.0", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.0", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.0" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.0.tgz", + "integrity": "sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.0.tgz", + "integrity": "sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.0.tgz", + "integrity": "sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.0.tgz", + "integrity": "sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.0.tgz", + "integrity": "sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.0.tgz", + "integrity": "sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.0.tgz", + "integrity": "sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.0.tgz", + "integrity": "sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.0.tgz", + "integrity": "sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.0.tgz", + "integrity": "sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.10.0", + "@emnapi/runtime": "^1.10.0", + "@emnapi/wasi-threads": "^1.2.1", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.10.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.10.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { + "version": "2.8.1", + "dev": true, + "inBundle": true, + "license": "0BSD", + "optional": true + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.0.tgz", + "integrity": "sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.0.tgz", + "integrity": "sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.0.tgz", + "integrity": "sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.3.0", + "@tailwindcss/oxide": "4.3.0", + "postcss": "^8.5.10", + "tailwindcss": "4.3.0" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.17.0.tgz", + "integrity": "sha512-gOxY/hFkPh/XQYhnThBHzkbkX3Ed+z/iushyz+R+JAr213aXxUDgQoTgTdrDpBSRsjFM73P/KfUyWmaF9WHMkQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/vue-virtual": { + "version": "3.13.28", + "resolved": "https://registry.npmjs.org/@tanstack/vue-virtual/-/vue-virtual-3.13.28.tgz", + "integrity": "sha512-A+jWpXtMpWXKhGLKQrXeC9mk1VgYeMWSJ+o0CTCEi+HLYMSQFdVmPG9lJz7d4XJyIkc5xVwZU9QY67QpScqnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tanstack/virtual-core": "3.17.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.0.0" + } + }, + "node_modules/@tweenjs/tween.js": { + "version": "23.1.3", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", + "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-collection": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@types/d3-collection/-/d3-collection-1.0.13.tgz", + "integrity": "sha512-v0Rgw3IZebRyamcwVmtTDCZ8OmQcj4siaYjNc7wGMZT7PmdSHawGsCOQMxyLvZ7lWjfohYLK0oXtilMOMgfY8A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-sankey": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@types/d3-sankey/-/d3-sankey-0.12.5.tgz", + "integrity": "sha512-/3RZSew0cLAtzGQ+C89hq/Rp3H20QJuVRSqFy6RKLe7E0B8kd2iOS1oBsodrgds4PcNVpqWhdUEng/SHvBcJ6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-shape": "^1" + } + }, + "node_modules/@types/d3-sankey/node_modules/@types/d3-path": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.11.tgz", + "integrity": "sha512-4pQMp8ldf7UaB/gR8Fvvy69psNHkTpD/pVw3vmEi8iZAB9EPMBruB1JvHO4BIq9QkUUd2lV1F5YXpMNj7JPBpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-sankey/node_modules/@types/d3-shape": { + "version": "1.3.12", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.12.tgz", + "integrity": "sha512-8oMzcd4+poSLGgV0R1Q1rOlx/xdmozS4Xab7np0eamFFUYq71AU9pOCJEFnkXW2aI/oXdVYJzw6pssbSut7Z9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-path": "^1" + } + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/dagre": { + "version": "0.7.54", + "resolved": "https://registry.npmjs.org/@types/dagre/-/dagre-0.7.54.tgz", + "integrity": "sha512-QjcRY+adGbYvBFS7cwv5txhVIwX1XXIUswWl+kSQTbI6NjgZydrZkEKX/etzVd7i+bCsCb40Z/xlBY5eoFuvWQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "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/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@types/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/leaflet": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.7.6.tgz", + "integrity": "sha512-Emkz3V08QnlelSbpT46OEAx+TBZYTOX2r1yM7W+hWg5+djHtQ1GbEXBDRLaqQDOYcDI51Ss0ayoqoKD4CtLUDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/lodash": { + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", + "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mapbox__point-geometry": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.4.tgz", + "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mapbox__vector-tile": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.4.tgz", + "integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*", + "@types/mapbox__point-geometry": "*", + "@types/pbf": "*" + } + }, + "node_modules/@types/node": { + "version": "25.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", + "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/pbf": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz", + "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/resize-observer-browser": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.11.tgz", + "integrity": "sha512-cNw5iH8JkMkb3QkCoe7DaZiawbDQEUX8t7iuQaRTyLOyQCR2h+ibBD4GJt7p5yhUHrlOeL7ZtbxNHeipqNsBzQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stats.js": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz", + "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/supercluster": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-5.0.3.tgz", + "integrity": "sha512-XMSqQEr7YDuNtFwSgaHHOjsbi0ZGL62V9Js4CW45RBuRYlNWSW/KDqN+RFFE7HdHcGhJPtN0klKvw06r9Kg7rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/three": { + "version": "0.184.1", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.184.1.tgz", + "integrity": "sha512-6q4VdiqVsrTRqmk62/BnlcAvIrnDM0zf2ZDVKI5kZiniWrSaOHaQzmbp+BNzoggc/8tgW412pL//wZIxu2PPTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@dimforge/rapier3d-compat": "~0.12.0", + "@tweenjs/tween.js": "~23.1.3", + "@types/stats.js": "*", + "@types/webxr": ">=0.5.17", + "fflate": "~0.8.2", + "meshoptimizer": "~1.1.1" + } + }, + "node_modules/@types/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@types/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-pDzSNulqooSKvSNcksnV72nk8p7gRqN8As71Sp28nov1IgmPKWbOEIwAWvBME5pPTtaXJAvG3O4oc76HlQ4kqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/topojson": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@types/topojson/-/topojson-3.2.6.tgz", + "integrity": "sha512-ppfdlxjxofWJ66XdLgIlER/85RvpGyfOf8jrWf+3kVIjEatFxEZYD/Ea83jO672Xu1HRzd/ghwlbcZIUNHTskw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*", + "@types/topojson-client": "*", + "@types/topojson-server": "*", + "@types/topojson-simplify": "*", + "@types/topojson-specification": "*" + } + }, + "node_modules/@types/topojson-client": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@types/topojson-client/-/topojson-client-3.1.5.tgz", + "integrity": "sha512-C79rySTyPxnQNNguTZNI1Ct4D7IXgvyAs3p9HPecnl6mNrJ5+UhvGNYcZfpROYV2lMHI48kJPxwR+F9C6c7nmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*", + "@types/topojson-specification": "*" + } + }, + "node_modules/@types/topojson-server": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/topojson-server/-/topojson-server-3.0.4.tgz", + "integrity": "sha512-5+ieK8ePfP+K2VH6Vgs1VCt+fO1U8XZHj0UsF+NktaF0DavAo1q3IvCBXgokk/xmtvoPltSUs6vxuR/zMdOE1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*", + "@types/topojson-specification": "*" + } + }, + "node_modules/@types/topojson-simplify": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/topojson-simplify/-/topojson-simplify-3.0.3.tgz", + "integrity": "sha512-sBO5UZ0O2dB0bNwo0vut2yLHhj3neUGi9uL7/ROdm8Gs6dtt4jcB9OGDKr+M2isZwQM2RuzVmifnMZpxj4IGNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*", + "@types/topojson-specification": "*" + } + }, + "node_modules/@types/topojson-specification": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/topojson-specification/-/topojson-specification-1.0.5.tgz", + "integrity": "sha512-C7KvcQh+C2nr6Y2Ub4YfgvWvWCgP2nOQMtfhlnwsRL4pYmmwzBS7HclGiS87eQfDOU/DLQpX6GEscviaz4yLIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/webxr": { + "version": "0.5.24", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz", + "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@unovis/dagre-layout": { + "version": "0.8.8-2", + "resolved": "https://registry.npmjs.org/@unovis/dagre-layout/-/dagre-layout-0.8.8-2.tgz", + "integrity": "sha512-ZfDvfcYtzzhZhgKZty8XDi+zQIotfRqfNVF5M3dFQ9d9C5MTaRdbeBnPUkNrmlLJGgQ42HMOE2ajZLfm2VlRhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@unovis/graphlibrary": "^2.2.0-2", + "lodash-es": "^4.17.21" + } + }, + "node_modules/@unovis/graphlibrary": { + "version": "2.2.0-2", + "resolved": "https://registry.npmjs.org/@unovis/graphlibrary/-/graphlibrary-2.2.0-2.tgz", + "integrity": "sha512-HeEzpd/vDyWiIJt0rnh+2ICXUIuF2N0+Z9OJJiKg0DB+eFUcD+bk+9QPhYHwkFwfxdjDA9fHi1DZ/O/bbV58Nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash-es": "^4.17.21" + } + }, + "node_modules/@unovis/ts": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@unovis/ts/-/ts-1.6.5.tgz", + "integrity": "sha512-4qeo0nKESrCX7vZr+zEGFjg2QbyjgxXN8//mPnvZi0e2mf+ZrjIRmHReHwO3u7fqMD7kgMMMD1ABJJFBcOempA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@emotion/css": "^11.7.1", + "@juggle/resize-observer": "^3.3.1", + "@types/d3": "^7.4.0", + "@types/d3-array": "~3.2.2", + "@types/d3-axis": "~3.0.6", + "@types/d3-brush": "~3.0.6", + "@types/d3-chord": "~3.0.6", + "@types/d3-collection": "^1.0.10", + "@types/d3-color": "~3.1.3", + "@types/d3-drag": "~3.0.7", + "@types/d3-ease": "~3.0.2", + "@types/d3-force": "~3.0.10", + "@types/d3-geo": "~3.1.0", + "@types/d3-hierarchy": "~3.1.7", + "@types/d3-interpolate": "~3.0.4", + "@types/d3-path": "~3.1.1", + "@types/d3-sankey": "^0.12.4", + "@types/d3-scale": "~4.0.9", + "@types/d3-selection": "~3.0.0", + "@types/d3-shape": "~3.1.7", + "@types/d3-timer": "~3.0.2", + "@types/d3-transition": "~3.0.9", + "@types/d3-zoom": "~3.0.8", + "@types/dagre": "^0.7.50", + "@types/geojson": "^7946.0.8", + "@types/leaflet": "1.7.6", + "@types/supercluster": "^5.0.2", + "@types/three": "^0.135.0", + "@types/throttle-debounce": "^5.0.0", + "@types/topojson": "^3.2.3", + "@types/topojson-client": "^3.0.0", + "@types/topojson-specification": "^1.0.2", + "@unovis/dagre-layout": "0.8.8-2", + "@unovis/graphlibrary": "2.2.0-2", + "d3": "^7.2.1", + "d3-array": "~3", + "d3-axis": "~3", + "d3-brush": "~3", + "d3-chord": "~3", + "d3-collection": "^1.0.7", + "d3-color": "~3", + "d3-drag": "~3", + "d3-ease": "~3", + "d3-force": "~3", + "d3-geo": "~3", + "d3-geo-projection": "^4.0.0", + "d3-hierarchy": "~3", + "d3-interpolate": "~3", + "d3-interpolate-path": "^2.2.3", + "d3-path": "~3", + "d3-sankey": "^0.12.3", + "d3-scale": "~4", + "d3-selection": "~3", + "d3-shape": "~3", + "d3-timer": "~3", + "d3-transition": "~3", + "d3-zoom": "~3", + "elkjs": "^0.10.0", + "geojson": "^0.5.0", + "leaflet": "1.7.1", + "maplibre-gl": "^2.1.9", + "striptags": "^3.2.0", + "supercluster": "^7.1.5", + "three": "^0.135.0", + "throttle-debounce": "^5.0.0", + "topojson-client": "^3.1.0", + "tslib": "^2.3.1", + "typescript": "~4.2.4" + } + }, + "node_modules/@unovis/ts/node_modules/@types/three": { + "version": "0.135.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.135.0.tgz", + "integrity": "sha512-l7WLhIHjhHMtlpyTSltPPAKLpiMwgMD1hXHj59AVUpYRoZP7Fd9NNOSRSvZBCPLpTHPYojgQvSJCoza9zoL7bg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@unovis/ts/node_modules/three": { + "version": "0.135.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.135.0.tgz", + "integrity": "sha512-kuEpuuxRzLv0MDsXai9huCxOSQPZ4vje6y0gn80SRmQvgz6/+rI0NAvCRAw56zYaWKMGMfqKWsxF9Qa2Z9xymQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@unovis/ts/node_modules/typescript": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", + "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@unovis/vue": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@unovis/vue/-/vue-1.6.5.tgz", + "integrity": "sha512-BSyEeuenhSCqo0kox4xe3bWMDUn0gfF4haggrVhhNWcp6pDmctniDebOP/8AFKlhPhfGJ6b39MdvoQNhXwc46A==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "@unovis/ts": "1.6.5", + "vue": "^3" + } + }, + "node_modules/@vee-validate/zod": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@vee-validate/zod/-/zod-4.15.1.tgz", + "integrity": "sha512-329Z4TDBE5Vx0FdbA8S4eR9iGCFFUNGbxjpQ20ff5b5wGueScjocUIx9JHPa79LTG06RnlUR4XogQsjN4tecKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^4.8.3", + "vee-validate": "4.15.1" + }, + "peerDependencies": { + "zod": "^3.24.0" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.7.tgz", + "integrity": "sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitest/expect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.8.tgz", + "integrity": "sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.8", + "@vitest/utils": "4.1.8", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.8.tgz", + "integrity": "sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.8", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker/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/@vitest/pretty-format": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.8.tgz", + "integrity": "sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.8.tgz", + "integrity": "sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.8", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.8.tgz", + "integrity": "sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.8", + "@vitest/utils": "4.1.8", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.8.tgz", + "integrity": "sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.8.tgz", + "integrity": "sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.8", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils/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/@volar/language-core": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", + "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", + "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", + "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue-macros/common": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-3.1.2.tgz", + "integrity": "sha512-h9t4ArDdniO9ekYHAD95t9AZcAbb19lEGK+26iAjUODOIJKmObDNBSe4+6ELQAA3vtYiFPPBtHh7+cQCKi3Dng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-sfc": "^3.5.22", + "ast-kit": "^2.1.2", + "local-pkg": "^1.1.2", + "magic-string-ast": "^1.0.2", + "unplugin-utils": "^0.3.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/vue-macros" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.2.25" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.35.tgz", + "integrity": "sha512-BUmHaR1J+O+CKZ9uJucdVTEr1LHsdyvv7vG3eNRhK3CczEHeMd/LtsHAuD7PbrxvI2envCY2v7HI1vC1aBRzKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@vue/shared": "3.5.35", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.35.tgz", + "integrity": "sha512-k+bprkXxuqhVajgTx5mUHuir7TwQzUKOWR40ng1ncAqQRPnrLngGGgqVEEhOnTMlc8btHYVKmrP8s5Qyg0hvYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.35", + "@vue/shared": "3.5.35" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.35.tgz", + "integrity": "sha512-G5VPMcXTSywXBgtFOZOnHKBxKSrwXUcvY1iaF5/hRcy7t0J6CH/d8ha9F4nzi00Fax1eLV0QHM7v4mQu68jydw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@vue/compiler-core": "3.5.35", + "@vue/compiler-dom": "3.5.35", + "@vue/compiler-ssr": "3.5.35", + "@vue/shared": "3.5.35", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.15", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.35.tgz", + "integrity": "sha512-rGhAeXgdM7/ffTJGXT69rCCdTmjDewnFuUZfBQQHTdcEBeWdT5HCGY60y2ytLJr9/Dsu7IntUi5z/w0h6Rjnzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.35", + "@vue/shared": "3.5.35" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.9.tgz", + "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.9" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", + "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.9", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", + "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.35.tgz", + "integrity": "sha512-tVc+SsHConvh/Lz64qq1pP3rYArBmK42xonovEcxY74SQtvctZodG/zhq54P5dr38cVuw25d27cPNRdlMidpGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.35" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.35.tgz", + "integrity": "sha512-A/xFNX9loIcWDygeQuNCfKuh0CoYBzxhqEMNah5TSFg9Z53DrFYEN2qi5CU9necjM1OWYegYREUTHmXTmhfXtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.35", + "@vue/shared": "3.5.35" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.35.tgz", + "integrity": "sha512-odrJ1C391dbGnyDRh8U+rnP7J2amIEzfmRk5vXy7xi3aZhEXofTvpi0T4HJb6jlNqQZTNPR5MPHSB3RHNkIORA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.35", + "@vue/runtime-core": "3.5.35", + "@vue/shared": "3.5.35", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.35.tgz", + "integrity": "sha512-NkebSOYdB97wi8OQcO3HqzZSlymJi/aWsN/7h74OSVhRTm6qGs3Jp3e0rCXynmWwSlKeRrnlIug+ilYoHBmQDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.35", + "@vue/shared": "3.5.35" + }, + "peerDependencies": { + "vue": "3.5.35" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.35.tgz", + "integrity": "sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.3.0.tgz", + "integrity": "sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "14.3.0", + "@vueuse/shared": "14.3.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@vueuse/metadata": { + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.3.0.tgz", + "integrity": "sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.3.0.tgz", + "integrity": "sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/ast-kit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.2.0.tgz", + "integrity": "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "pathe": "^2.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/ast-walker-scope": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.9.0.tgz", + "integrity": "sha512-IJdzo2vLiElBxKzwS36VsCue/62d6IdWjnPB2v3nuPKeWGynp6FF/CYoLa5i/3jXH/z97ZDdsXz6abpgM6w07A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.2", + "@babel/types": "^7.29.0", + "ast-kit": "^2.2.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "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/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "dev": true, + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/css-line-break": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", + "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "utrie": "^1.0.2" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==", + "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/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dev": true, + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo-projection": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-4.0.0.tgz", + "integrity": "sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==", + "dev": true, + "license": "ISC", + "dependencies": { + "commander": "7", + "d3-array": "1 - 3", + "d3-geo": "1.12.0 - 3" + }, + "bin": { + "geo2svg": "bin/geo2svg.js", + "geograticule": "bin/geograticule.js", + "geoproject": "bin/geoproject.js", + "geoquantize": "bin/geoquantize.js", + "geostitch": "bin/geostitch.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate-path": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-interpolate-path/-/d3-interpolate-path-2.3.0.tgz", + "integrity": "sha512-tZYtGXxBmbgHsIc9Wms6LS5u4w6KbP8C09a4/ZYc4KLMYYqub57rRBUgpUr2CIarIrJEpdAWWxWQvofgaMpbKQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "dev": true, + "license": "ISC" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", + "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/date-fns-tz": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-2.0.1.tgz", + "integrity": "sha512-fJCG3Pwx8HUoLhkepdsP7Z5RsucUi+ZBOxyM5d0ZZ6c4SdYustq0VMmOu6Wf7bli+yS/Jwp91TOCqn9jMcVrUA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "date-fns": "2.x" + } + }, + "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/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/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/delaunator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", + "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dompurify": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.7.tgz", + "integrity": "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==", + "dev": true, + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/earcut": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/elkjs": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.10.2.tgz", + "integrity": "sha512-Yx3ORtbAFrXelYkAy2g0eYyVY8QG0XEmGdQXmy0eithKKjbWRfl3Xe884lfkszfBF6UKyIy4LwfcZ3AZc8oxFw==", + "dev": true, + "license": "EPL-2.0" + }, + "node_modules/embla-carousel": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz", + "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/embla-carousel-reactive-utils": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.6.0.tgz", + "integrity": "sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.6.0" + } + }, + "node_modules/embla-carousel-vue": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-vue/-/embla-carousel-vue-8.6.0.tgz", + "integrity": "sha512-v8UO5UsyLocZnu/LbfQA7Dn2QHuZKurJY93VUmZYP//QRWoCWOsionmvLLAlibkET3pGPs7++03VhJKbWD7vhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "embla-carousel": "8.6.0", + "embla-carousel-reactive-utils": "8.6.0" + }, + "peerDependencies": { + "vue": "^3.2.37" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.22.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.22.2.tgz", + "integrity": "sha512-0rxICaFZ7NQho/sHely2bvOPRP0Eu2B0NZ9zM54YvRvWMn7jfz3DmnOZDR9LlXDdDcqntAVc6Hfy4gr/tdH/Ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, + "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/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "dev": true, + "license": "MIT" + }, + "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-plist": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/fast-plist/-/fast-plist-0.1.3.tgz", + "integrity": "sha512-d9cEfo/WcOezgPLAC/8t8wGb6YOD6JTCPMw2QcG2nAdFmyY+9rTUizCTaGjIZAloWENTEUMAPpkUAIJJJ0i96A==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fflate": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", + "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", + "dev": true, + "license": "MIT" + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true, + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "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/geojson": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/geojson/-/geojson-0.5.0.tgz", + "integrity": "sha512-/Bx5lEn+qRF4TfQ5aLu6NH+UKtvIv7Lhc487y/c8BdludrCTpiWf9wyI0RTyqg49MFefIAvFDuEi5Dfd/zgNxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/geojson-vt": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", + "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gl-matrix": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.4.tgz", + "integrity": "sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "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/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/highlight.js": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", + "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/html2canvas": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", + "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-line-break": "^2.1.0", + "text-segmentation": "^1.0.3" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "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/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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": "BSD-3-Clause" + }, + "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/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "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/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsdom": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz", + "integrity": "sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^5.1.11", + "@asamuzakjp/dom-selector": "^7.1.1", + "@bramus/specificity": "^2.4.2", + "@csstools/css-syntax-patches-for-csstree": "^1.1.3", + "@exodus/bytes": "^1.15.0", + "css-tree": "^3.2.1", + "data-urls": "^7.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.3.5", + "parse5": "^8.0.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.1", + "undici": "^7.25.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.1", + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.1", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "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-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "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/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kdbush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", + "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==", + "dev": true, + "license": "ISC" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/leaflet": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.7.1.tgz", + "integrity": "sha512-/xwPEBidtg69Q3HlqPdU3DnrXQOvQU/CCHA1tcDQVzOwm91YMYaILjNp7L4Eaw5Z4sOYdbBz6koWyibppd8Zqw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/local-pkg": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz", + "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "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/magic-string-ast": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-1.0.3.tgz", + "integrity": "sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.19" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/maplibre-gl": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-2.4.0.tgz", + "integrity": "sha512-csNFylzntPmHWidczfgCZpvbTSmhaWvLRj9e1ezUDBEPizGgshgm3ea1T5TCNEEBq0roauu7BPuRZjA3wO4KqA==", + "dev": true, + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@mapbox/geojson-rewind": "^0.5.2", + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/mapbox-gl-supported": "^2.0.1", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/tiny-sdf": "^2.0.5", + "@mapbox/unitbezier": "^0.0.1", + "@mapbox/vector-tile": "^1.3.1", + "@mapbox/whoots-js": "^3.1.0", + "@types/geojson": "^7946.0.10", + "@types/mapbox__point-geometry": "^0.1.2", + "@types/mapbox__vector-tile": "^1.3.0", + "@types/pbf": "^3.0.2", + "csscolorparser": "~1.0.3", + "earcut": "^2.2.4", + "geojson-vt": "^3.2.1", + "gl-matrix": "^3.4.3", + "global-prefix": "^3.0.0", + "murmurhash-js": "^1.0.0", + "pbf": "^3.2.1", + "potpack": "^1.0.2", + "quickselect": "^2.0.0", + "supercluster": "^7.1.5", + "tinyqueue": "^2.0.3", + "vt-pbf": "^3.1.3" + } + }, + "node_modules/marked": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", + "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/meshoptimizer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-1.1.1.tgz", + "integrity": "sha512-oRFNWJRDA/WTrVj7NWvqa5HqE1t9MYDj2VaWirQCzCCrAd2GHrqR/sQezCxiWATPNlKTcRaPRHPJwIRoPBAp5g==", + "dev": true, + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.3.tgz", + "integrity": "sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/monaco-editor": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.55.1.tgz", + "integrity": "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "dompurify": "3.2.7", + "marked": "14.0.0" + } + }, + "node_modules/monaco-themes": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/monaco-themes/-/monaco-themes-0.4.8.tgz", + "integrity": "sha512-QEDCwl5XUMPPpsg8TVNfi1VKIDtMsMTJAhUfxHSZ6hzkEfZgfTK2hicwyzkDKhAhrpMkHkwMtG13ynvdztJesw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-plist": "^0.1.3" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "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/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "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/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "dev": true, + "license": "MIT" + }, + "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/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "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": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pbf": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.3.0.tgz", + "integrity": "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + }, + "bin": { + "pbf": "bin/pbf" + } + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true, + "license": "MIT" + }, + "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": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", + "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.4", + "exsolve": "^1.0.8", + "pathe": "^2.0.3" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "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.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/prettier": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", + "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-classnames": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/prettier-plugin-classnames/-/prettier-plugin-classnames-0.10.2.tgz", + "integrity": "sha512-t8X4dRoLqozJyiCaokDViFbIeXBzQFftXbzWz+6nyUbLReSgzJoBJeD2jDUPOYMWM7CoEBnOmeoa7hko9lUBQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "zod": "3.22.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@prettier/plugin-oxc": "*", + "prettier": "^3", + "prettier-plugin-astro": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@prettier/plugin-oxc": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + } + } + }, + "node_modules/prettier-plugin-classnames/node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/prettier-plugin-merge": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/prettier-plugin-merge/-/prettier-plugin-merge-0.10.1.tgz", + "integrity": "sha512-dwz+TLE6sAIaoiZTS7mixu6JF85IfvccWrFMcaA4tpmu51TerUEW/WlI1u9h5ewU8Zxu89q08KKNHKCOe17iAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "diff": "5.2.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "prettier": "^3" + } + }, + "node_modules/prettier-plugin-organize-imports": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.3.0.tgz", + "integrity": "sha512-FxFz0qFhyBsGdIsb697f/EkvHzi5SZOhWAjxcx2dLt+Q532bAlhswcXGYB1yzjZ69kW8UoadFBw7TyNwlq96Iw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "prettier": ">=2.0", + "typescript": ">=2.9", + "vue-tsc": "^2.1.0 || 3" + }, + "peerDependenciesMeta": { + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.8.0.tgz", + "integrity": "sha512-V8ITGH87yuBDF6JpEZTOVlUz/saAwqb8f3HRgUj8Lh+tGCcrmorhsLpYqzygwFwK0PE2Ib6Mv3M7T/uE2tZV1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.19" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-hermes": "*", + "@prettier/plugin-oxc": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "@zackad/prettier-plugin-twig": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-multiline-arrays": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-hermes": { + "optional": true + }, + "@prettier/plugin-oxc": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "@zackad/prettier-plugin-twig": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-multiline-arrays": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + } + } + }, + "node_modules/protocol-buffers-schema": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.1.tgz", + "integrity": "sha512-VG2K63Igkiv9p76tk1lilczEK1cT+kCjKtkdhw1dQZV3k3IXJbd3o6Ho8b9zJZaHSnT2hKe4I+ObmX9w6m5SmQ==", + "dev": true, + "license": "MIT" + }, + "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/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/reka-ui": { + "version": "2.9.9", + "resolved": "https://registry.npmjs.org/reka-ui/-/reka-ui-2.9.9.tgz", + "integrity": "sha512-/e+hdF9vP8E2kPrKR4RdgMQQsfpCr8l436Zn8GRWM3jKT9EG1lOO/UFMGBVEnrMLOVoJSjjmIFrej4tMOb+6qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.6.13", + "@floating-ui/vue": "^1.1.6", + "@internationalized/date": "^3.5.0", + "@internationalized/number": "^3.5.0", + "@tanstack/vue-virtual": "^3.12.0", + "@vueuse/core": "^14.1.0", + "@vueuse/shared": "^14.1.0", + "aria-hidden": "^1.2.4", + "defu": "^6.1.5", + "ohash": "^2.0.11" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/zernonia" + }, + "peerDependencies": { + "vue": ">= 3.4.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "protocol-buffers-schema": "^3.3.1" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/robust-predicates": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/rolldown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", + "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.133.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.3", + "@rolldown/binding-darwin-arm64": "1.0.3", + "@rolldown/binding-darwin-x64": "1.0.3", + "@rolldown/binding-freebsd-x64": "1.0.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", + "@rolldown/binding-linux-arm64-gnu": "1.0.3", + "@rolldown/binding-linux-arm64-musl": "1.0.3", + "@rolldown/binding-linux-ppc64-gnu": "1.0.3", + "@rolldown/binding-linux-s390x-gnu": "1.0.3", + "@rolldown/binding-linux-x64-gnu": "1.0.3", + "@rolldown/binding-linux-x64-musl": "1.0.3", + "@rolldown/binding-openharmony-arm64": "1.0.3", + "@rolldown/binding-wasm32-wasi": "1.0.3", + "@rolldown/binding-win32-arm64-msvc": "1.0.3", + "@rolldown/binding-win32-x64-msvc": "1.0.3" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "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/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "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": "4.1.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", + "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/striptags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.2.0.tgz", + "integrity": "sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==", + "dev": true, + "license": "MIT" + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/supercluster": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz", + "integrity": "sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==", + "dev": true, + "license": "ISC", + "dependencies": { + "kdbush": "^3.0.0" + } + }, + "node_modules/superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/tailwind-merge": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", + "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz", + "integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/text-segmentation": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", + "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "utrie": "^1.0.2" + } + }, + "node_modules/three": { + "version": "0.184.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.184.0.tgz", + "integrity": "sha512-wtTRjG92pM5eUg/KuUnHsqSAlPM296brTOcLgMRqEeylYTh/CdtvKUvCyyCQTzFuStieWxvZb8mVTMvdPyUpxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.22" + } + }, + "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": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyqueue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==", + "dev": true, + "license": "ISC" + }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.2.tgz", + "integrity": "sha512-kCwffuaH8ntKtygnWe1b4BJKWiCUH30n5KfoTr6IchcXOwR7chAOFJxFrH3vjANafUYrIA4a7SDL+nn7SiR4Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.4.2" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.2.tgz", + "integrity": "sha512-nwEyF4vl4RSJjwSjBUmOSxc3BFPoIFdlRthJ6e+5v9P3bHNsoD06UjuqMUspqp7vsEZ1beaHi1km+optiE17yA==", + "dev": true, + "license": "MIT" + }, + "node_modules/topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "dev": true, + "license": "ISC", + "dependencies": { + "commander": "2" + }, + "bin": { + "topo2geo": "bin/topo2geo", + "topomerge": "bin/topomerge", + "topoquantize": "bin/topoquantize" + } + }, + "node_modules/topojson-client/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tw-animate-css": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", + "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Wombosvideo" + } + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.27.1.tgz", + "integrity": "sha512-UDdpiex+mzigiyrXrGbiUaF4HzTNhKbh2vRNFaTMzcqmLIPrZxaCtwo/1TMSuWoM1Xz3WiTo9KdgI3kRqYzJGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unplugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.0.0.tgz", + "integrity": "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/unplugin-dts": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unplugin-dts/-/unplugin-dts-1.0.2.tgz", + "integrity": "sha512-VbNiMD0LMl/t6nJueGtrCp79N7ZO1nquxj/FUybJDnKwZGsnW2wjdwBSzA3QEHujoxmxZIptsG43hL7LzXE96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.4", + "@volar/typescript": "^2.4.26", + "compare-versions": "^6.1.1", + "debug": "^4.4.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.1.1", + "magic-string": "^0.30.17", + "unplugin": "^2.3.2" + }, + "peerDependencies": { + "@microsoft/api-extractor": ">=7", + "@rspack/core": "^1", + "@vue/language-core": "~3.1.5", + "esbuild": "*", + "rolldown": "*", + "rollup": ">=3", + "typescript": ">=4", + "vite": ">=3", + "webpack": "^4 || ^5" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@rspack/core": { + "optional": true + }, + "@vue/language-core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "rolldown": { + "optional": true + }, + "rollup": { + "optional": true + }, + "vite": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/unplugin-dts/node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unplugin-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.1.tgz", + "integrity": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/utrie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", + "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "base64-arraybuffer": "^1.0.2" + } + }, + "node_modules/v-calendar": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/v-calendar/-/v-calendar-3.1.2.tgz", + "integrity": "sha512-QDWrnp4PWCpzUblctgo4T558PrHgHzDtQnTeUNzKxfNf29FkCeFpwGd9bKjAqktaa2aJLcyRl45T5ln1ku34kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/lodash": "^4.14.165", + "@types/resize-observer-browser": "^0.1.7", + "date-fns": "^2.16.1", + "date-fns-tz": "^2.0.0", + "lodash": "^4.17.20", + "vue-screen-utils": "^1.0.0-beta.13" + }, + "peerDependencies": { + "@popperjs/core": "^2.0.0", + "vue": "^3.2.0" + } + }, + "node_modules/vaul-vue": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/vaul-vue/-/vaul-vue-0.4.1.tgz", + "integrity": "sha512-A6jOWOZX5yvyo1qMn7IveoWN91mJI5L3BUKsIwkg6qrTGgHs1Sb1JF/vyLJgnbN1rH4OOOxFbtqL9A46bOyGUQ==", + "dev": true, + "dependencies": { + "@vueuse/core": "^10.8.0", + "reka-ui": "^2.0.0", + "vue": "^3.4.5" + }, + "peerDependencies": { + "reka-ui": "^2.0.0", + "vue": "^3.3.0" + } + }, + "node_modules/vaul-vue/node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/vaul-vue/node_modules/@vueuse/core": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz", + "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.11.1", + "@vueuse/shared": "10.11.1", + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vaul-vue/node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vaul-vue/node_modules/@vueuse/metadata": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.1.tgz", + "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vaul-vue/node_modules/@vueuse/shared": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.1.tgz", + "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vaul-vue/node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vee-validate": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/vee-validate/-/vee-validate-4.15.1.tgz", + "integrity": "sha512-DkFsiTwEKau8VIxyZBGdO6tOudD+QoUBPuHj3e6QFqmbfCRj1ArmYWue9lEp6jLSWBIw4XPlDLjFIZNLdRAMSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^7.5.2", + "type-fest": "^4.8.3" + }, + "peerDependencies": { + "vue": "^3.4.26" + } + }, + "node_modules/vite": { + "version": "8.0.16", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", + "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "1.0.3", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.18", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-dts": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-5.0.2.tgz", + "integrity": "sha512-lNeHS+dwGju6eRmNvZQt8Shwv9j3m98hbHse/lIbLq9q3yE2DcIOBBYQEVUF6tS0kOmv+VA9Z5FqmzFnGe4U8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "unplugin-dts": "1.0.2" + }, + "peerDependencies": { + "@microsoft/api-extractor": ">=7", + "rollup": ">=3", + "vite": ">=3" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "rollup": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.8.tgz", + "integrity": "sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.8", + "@vitest/mocker": "4.1.8", + "@vitest/pretty-format": "4.1.8", + "@vitest/runner": "4.1.8", + "@vitest/snapshot": "4.1.8", + "@vitest/spy": "4.1.8", + "@vitest/utils": "4.1.8", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.8", + "@vitest/browser-preview": "4.1.8", + "@vitest/browser-webdriverio": "4.1.8", + "@vitest/coverage-istanbul": "4.1.8", + "@vitest/coverage-v8": "4.1.8", + "@vitest/ui": "4.1.8", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vt-pbf": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", + "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mapbox/point-geometry": "0.1.0", + "@mapbox/vector-tile": "^1.3.1", + "pbf": "^3.2.1" + } + }, + "node_modules/vue": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.35.tgz", + "integrity": "sha512-cx89fnr+0kVGHiNFG6y6s0bdjypJRFNZn6x3WPstNdQR1bi1mbB7h4v5IBGTsPJU3nK1+0Iqj3Zf+hZWMieR4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.35", + "@vue/compiler-sfc": "3.5.35", + "@vue/runtime-dom": "3.5.35", + "@vue/server-renderer": "3.5.35", + "@vue/shared": "3.5.35" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-5.1.0.tgz", + "integrity": "sha512-HAbiLzLEHQwxPgvsbOJDAwtavszEgLwri6XfyrsPECIFez8+59xc9LofWVdc/HEaSRT822lJ8H9Ns38VVond5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/generator": "^8.0.0-rc.4", + "@vue-macros/common": "^3.1.1", + "@vue/devtools-api": "^8.1.2", + "ast-walker-scope": "^0.9.0", + "chokidar": "^5.0.0", + "json5": "^2.2.3", + "local-pkg": "^1.1.2", + "magic-string": "^0.30.21", + "mlly": "^1.8.2", + "muggle-string": "^0.4.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "scule": "^1.3.0", + "tinyglobby": "^0.2.16", + "unplugin": "^3.0.0", + "unplugin-utils": "^0.3.1", + "yaml": "^2.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@pinia/colada": ">=0.21.2", + "@vue/compiler-sfc": "^3.5.34", + "pinia": "^3.0.4", + "vite": "^7.0.0 || ^8.0.0", + "vue": "^3.5.34" + }, + "peerDependenciesMeta": { + "@pinia/colada": { + "optional": true + }, + "@vue/compiler-sfc": { + "optional": true + }, + "pinia": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/vue-router/node_modules/@babel/generator": { + "version": "8.0.0-rc.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0-rc.6.tgz", + "integrity": "sha512-6mIzgVK8DgEzvIapoQwhXTMnnkuE4STQmVv9H03i/tZ2ml8oev3TRvZJgTenK2Bsq0YWNtzOrFdTyNzCMFtjJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^8.0.0-rc.6", + "@babel/types": "^8.0.0-rc.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "@types/jsesc": "^2.5.0", + "jsesc": "^3.0.2" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/vue-router/node_modules/@babel/helper-string-parser": { + "version": "8.0.0-rc.6", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0-rc.6.tgz", + "integrity": "sha512-BCkFy+zN6kXQed3YOT7aJl93NfDSzQc3pBfsvTVPs9gU9X3V0aefEF5kwBT0E+mDWH9QgKaZstYUQN9VdQZT4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/vue-router/node_modules/@babel/helper-validator-identifier": { + "version": "8.0.0-rc.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0-rc.6.tgz", + "integrity": "sha512-nVJ+1JcCgntv8d78rRo++o2wuODT0Irknx2BF8Np4Ft2CRgjLqIs4qzSZ8b66yGbBdMWGmZBO9WEZv1hhNiSpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/vue-router/node_modules/@babel/parser": { + "version": "8.0.0-rc.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.0-rc.6.tgz", + "integrity": "sha512-rOS8IpdO7mQELkTPlCsTgPejO0bFuZdEDCGQJouYbYf9e1FLTym7Fei2pEjq8q7MWbX0ravcd7QQYKs1TxOuog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^8.0.0-rc.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/vue-router/node_modules/@babel/types": { + "version": "8.0.0-rc.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0-rc.6.tgz", + "integrity": "sha512-p7/ABylAYlexb31wtRdIfH9L9A0Z2T/9H6zAqzqndkY2PLkvNNc580wGhp/gGKN4Sp9sQvSkhc6Oga8/O+wTyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^8.0.0-rc.6", + "@babel/helper-validator-identifier": "^8.0.0-rc.6" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-api": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.1.2.tgz", + "integrity": "sha512-vA0O112YqyDuNA1s7Yb2gCgToQ/OxOWiFDO5ThLCcDy0ldHnSd1dUTaSYhOldbqoNgumE4dxtGAoAaSUKUD1Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.1.2" + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-kit": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.1.2.tgz", + "integrity": "sha512-f75/upc+GCyjXErpgPGz4582ujS0L/adAltGy+tqXMGUJpgAcfGr6CxnnhpZY8BHuMYt6KpbF8uaFrrQG66rGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.1.2", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "perfect-debounce": "^2.0.0" + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-shared": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.1.2.tgz", + "integrity": "sha512-X9RyVFYAdkBe4IUf5v48TxBF/6QPmF8CmWrDAjXzfUHrgQ/HGfTC1A6TqgXqZ03ye66l3AD51BAGD69IvKM9sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue-router/node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue-screen-utils": { + "version": "1.0.0-beta.13", + "resolved": "https://registry.npmjs.org/vue-screen-utils/-/vue-screen-utils-1.0.0-beta.13.tgz", + "integrity": "sha512-EJ/8TANKhFj+LefDuOvZykwMr3rrLFPLNb++lNBqPOpVigT2ActRg6icH9RFQVm4nHwlHIHSGm5OY/Clar9yIg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-sonner": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/vue-sonner/-/vue-sonner-2.0.9.tgz", + "integrity": "sha512-i6BokNlNDL93fpzNxN/LZSn6D6MzlO+i3qXt6iVZne3x1k7R46d5HlFB4P8tYydhgqOrRbIZEsnRd3kG7qGXyw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@nuxt/kit": "^4.0.3", + "@nuxt/schema": "^4.0.3", + "nuxt": "^4.0.3" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@nuxt/schema": { + "optional": true + }, + "nuxt": { + "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": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-url": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", + "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.11.0", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "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/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/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } + } } diff --git a/package.json b/package.json index ae96867..9e6da0f 100644 --- a/package.json +++ b/package.json @@ -66,11 +66,12 @@ }, "devDependencies": { "@iconify-json/radix-icons": "^1.2.6", - "@iconify/vue": "^4.1.2", - "@lucide/vue": "^1.16.0", + "@iconify/vue": "^5.0.1", + "@lucide/vue": "^1.17.0", + "@microsoft/api-extractor": "^7.58.7", "@tailwindcss/postcss": "^4.3.0", - "@types/node": "^24.12.4", - "@types/three": "^0.166.0", + "@types/node": "^25.9.1", + "@types/three": "^0.184.1", "@unovis/ts": "^1.6.5", "@unovis/vue": "^1.6.5", "@vee-validate/zod": "^4.15.1", @@ -81,29 +82,29 @@ "embla-carousel-vue": "^8.6.0", "highlight.js": "^11.11.1", "html2canvas": "^1.4.1", - "jsdom": "^26.1.0", - "monaco-editor": "^0.50.0", + "jsdom": "^29.1.1", + "monaco-editor": "^0.55.1", "monaco-themes": "^0.4.8", "prettier": "^3.8.3", - "prettier-plugin-classnames": "^0.10.1", + "prettier-plugin-classnames": "^0.10.2", "prettier-plugin-merge": "^0.10.1", "prettier-plugin-organize-imports": "^4.3.0", "prettier-plugin-tailwindcss": "^0.8.0", - "reka-ui": "^2.9.7", + "reka-ui": "^2.9.9", "tailwind-merge": "^3.6.0", "tailwindcss": "^4.3.0", - "three": "^0.166.1", + "three": "^0.184.0", "tw-animate-css": "^1.4.0", "typescript": "^6.0.3", "v-calendar": "^3.1.2", - "vaul-vue": "^0.4.0", + "vaul-vue": "^0.4.1", "vee-validate": "^4.15.1", - "vite": "^8.0.13", - "vite-plugin-dts": "^4.5.4", - "vitest": "^4.1.7", - "vue": "^3.5.34", - "vue-router": "^5.0.7", - "vue-sonner": "^1.1.3", - "zod": "^3.23.8" + "vite": "^8.0.16", + "vite-plugin-dts": "^5.0.2", + "vitest": "^4.1.8", + "vue": "^3.5.35", + "vue-router": "^5.1.0", + "vue-sonner": "^2.0.9", + "zod": "^3.25.76" } } diff --git a/vite.config.ts b/vite.config.ts index 951f547..5277d89 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -203,8 +203,17 @@ export default defineConfig((mode) => { // Pinning both `entryRoot` AND `compilerOptions.rootDir` // to the library entry's directory keeps emit and // stub-write in lockstep. + // + // vite-plugin-dts 5 (unplugin-dts): the roll-up option is + // `bundleTypes` (v4's `rollupTypes` is silently ignored — + // no validation error) and `@microsoft/api-extractor` + // moved from a bundled dependency to an OPTIONAL peer the + // consumer provides (devDependency here). Both are + // load-bearing: without either, the build stays green and + // emits per-module .d.ts but NO rolled-up keyframes.d.ts — + // the dts byte-check in CI is what catches it. dts({ - rollupTypes: true, + bundleTypes: true, include: ["src/"], entryRoot: "src/animation", compilerOptions: { From 5af8eb7f517dd241201f5ce384f2aa1334457c83 Mon Sep 17 00:00:00 2001 From: Mike Babb Date: Thu, 4 Jun 2026 12:14:12 -0400 Subject: [PATCH 02/11] =?UTF-8?q?feat(tranche-B=20W2):=20engine=20debt=20t?= =?UTF-8?q?ransposed=20=E2=80=94=20gestalt,=20net-deletion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit S1 rest-position contract: settle() is pure teardown (never paints); reset() is the explicit rewind (paint initial + settle); restPosition derives once from fillMode and completion paints the rest frame via paintRest(). Retires the group.ts TODO(HIGH) frame-0 repaint workaround, the _playReducedMotion fork, and the completion-resets-to-initial quirk (a fadeIn group no longer ends invisible). Reduced-motion IS the forwards-completion terminal path. S2 one managed-rAF driver + one reduced-motion gate: RAFPlayback gains drive(Tickable) + loop(asyncCb); Smooth/Spring become pure steppers (tickDt/settled), their _startLoop/_stopLoop byte-siblings deleted; Animation, AnimationGroup, and the WAAPI shadow tick all ride playback.loop — no module owns a raw rAF handle (handleId: any deleted). withReducedMotion(respect, snap, run) is THE gate every play path calls; the seven hand-written snap bodies are one-line closures. S3 typed Easing + explicit validation: interface Easing { fn, css? } replaces BOTH Symbol side channels (css-easing tag + DEFAULT_RENDERER). The renderer check is now a reference comparison (usesDefaultRenderer) — the Symbol tag was provably broken (bind drops symbol props), which had made every fromString animation 'custom transform' and the WAAPI path dead in practice; this resurrects WAAPI delegation. springTimingFunction returns Easing (one curve, two forms). await resolveEasing(name) replaces EasingResolvable (deleted, no alias): no pending state, no identity fallback, no esbuild-coupled dev-warn; unknown name throws UnknownEasingError, chunk-load failure rethrows named. Light engines accept callable|Easing only — a string throws AnimationOptionError. Option setters are fail-explicit via parseOption/AnimationOptionError: malformed present input throws; genuine omission defaults. Retires the CRITICAL + 4 HIGH + 9 MED/LOW setter TODOs (16 → 0). getTimingFunction gains CSS steps()/step-start/step-end (Easing Level 1 complete). S4 proof:boundary widened: every barrel light export bundled as its own entry (entry set PARSED from the barrel — self-enforcing), per-entry 0-value.js/0-engine asserts, dynamic-chunk presence behind loadAnimationEngine, and a source-grep complement for dormant static specifiers. Negative bite demonstrated (probe import → red → revert). S5 residuals: WAAPI rejects CSS-twinned easing across multiple segments (per-segment curve restart); group play() reentrancy guard; stop() resolves pending play promises (no hung awaits); scheduler.yield probed live with cached fallback; isNumericCarrier → instanceof ValueUnit; CSSKeyframesAnimation.from* dedupe via resolveTransform; renderer.ts (dead code) deleted; leaves↔value.js parity test. ScrollTimeline-native: KILL with rationale (native ScrollTimeline drives animations off-thread; our Timeline is a caller-polled sampling pipeline — the API does not fit the contract; recorded for FINAL). Tests: 297→300 (strict-options + resolve-easing + leaves-parity suites; old-contract tests rewritten). check:lib green, widened proof:boundary green, gh-pages builds. Net deletion: −3 modules, −16 TODOs. --- .../composables/useTimingFunctionEditor.ts | 8 +- demo/easing/useEasingDemo.ts | 6 +- scripts/proof-boundary.mjs | 266 ++++++++--- src/animation/CLAUDE.md | 114 +++-- src/animation/animations.ts | 5 +- src/animation/constants.ts | 40 +- src/animation/easing.ts | 77 +++ src/animation/engine.ts | 446 +++++++++++++----- src/animation/format.ts | 11 +- src/animation/group.ts | 187 ++++---- src/animation/index.ts | 7 + src/animation/internal/css-easing.ts | 30 -- src/animation/internal/easing-resolvable.ts | 127 ----- src/animation/internal/errors.ts | 71 +++ src/animation/internal/reduced-motion.ts | 19 + src/animation/internal/scheduler.ts | 38 +- src/animation/morph.ts | 26 +- src/animation/numeric.ts | 83 ++-- src/animation/playback.ts | 141 ++++-- src/animation/renderer.ts | 35 -- src/animation/smooth.ts | 106 ++--- src/animation/spring.ts | 136 +++--- src/animation/springTimingFunction.ts | 38 +- src/animation/timeline.ts | 67 ++- src/animation/utils.ts | 41 +- src/animation/waapi.ts | 64 +-- test/easing-resolvable.test.ts | 115 ----- test/engine-modern-web.test.ts | 12 +- test/group.test.ts | 1 - test/leaves-parity.test.ts | 41 ++ test/morph.test.ts | 29 +- test/numeric.test.ts | 52 +- test/presets.test.ts | 2 +- test/resolve-easing.test.ts | 65 +++ test/springTimingFunction.test.ts | 47 +- test/strict-options.test.ts | 139 ++++++ test/timeline.test.ts | 21 +- 37 files changed, 1662 insertions(+), 1051 deletions(-) create mode 100644 src/animation/easing.ts delete mode 100644 src/animation/internal/css-easing.ts delete mode 100644 src/animation/internal/easing-resolvable.ts create mode 100644 src/animation/internal/errors.ts delete mode 100644 src/animation/renderer.ts delete mode 100644 test/easing-resolvable.test.ts create mode 100644 test/leaves-parity.test.ts create mode 100644 test/resolve-easing.test.ts create mode 100644 test/strict-options.test.ts diff --git a/demo/@/components/custom/animation-controls/controls/composables/useTimingFunctionEditor.ts b/demo/@/components/custom/animation-controls/controls/composables/useTimingFunctionEditor.ts index a8f615d..6a073f6 100644 --- a/demo/@/components/custom/animation-controls/controls/composables/useTimingFunctionEditor.ts +++ b/demo/@/components/custom/animation-controls/controls/composables/useTimingFunctionEditor.ts @@ -117,9 +117,13 @@ export function useTimingFunctionEditor( const setAnimationTimingFunction = (timingFunction: TimingFunction) => { const animation = getAnimation(); - animation.options.timingFunction = timingFunction; + // The engine carries easing as a typed `Easing` ({ fn, css? }); + // wrap the bare callable once and share the reference across + // frames so WAAPI uniform-timing eligibility sees ONE easing. + const easing = { fn: timingFunction }; + animation.options.timingFunction = easing; animation.frames.forEach((frame) => { - frame.timingFunction = timingFunction; + frame.timingFunction = easing; }); }; diff --git a/demo/easing/useEasingDemo.ts b/demo/easing/useEasingDemo.ts index 34e202d..4a6afa4 100644 --- a/demo/easing/useEasingDemo.ts +++ b/demo/easing/useEasingDemo.ts @@ -292,9 +292,11 @@ export function useEasingDemo() { // Sync dummy animation's timing function watch(currentEasingFn, (fn) => { - dummyAnimation.options.timingFunction = fn; + // Typed easing: wrap the callable once, share the reference. + const easing = { fn }; + dummyAnimation.options.timingFunction = easing; dummyAnimation.frames.forEach((frame) => { - frame.timingFunction = fn; + frame.timingFunction = easing; }); }); diff --git a/scripts/proof-boundary.mjs b/scripts/proof-boundary.mjs index 63dcd8f..5941ee5 100644 --- a/scripts/proof-boundary.mjs +++ b/scripts/proof-boundary.mjs @@ -1,27 +1,47 @@ #!/usr/bin/env node /** - * proof:boundary — the value.js static/dynamic boundary gate (A inv α). + * proof:boundary — the value.js static/dynamic boundary gate (inv α). * - * The v2.2.0 KF-B1 release carved keyframes along the value.js seam: the light + * The KF-B1 release carved keyframes along the value.js seam: the light * physics/interpolation engines (`SpringProgress`, `SmoothProgress`, - * `NumericAnimation`, `ElementMorph`, the `Timeline` family) carry ZERO static - * import edge to `@mkbabb/value.js`; the heavy CSS-parsing engine sits behind - * `loadAnimationEngine()`'s dynamic `import("./engine")`. The CHANGELOG asserted - * "a spring-only bundle contains no value.js code" — nothing GATED it. + * `NumericAnimation`, `ElementMorph`, the `Timeline` family, `RAFPlayback`, + * the spring-stop helpers, and the `resolveEasing`/`toEasing` factories) + * carry ZERO static import edge to `@mkbabb/value.js`; the heavy + * CSS-parsing engine sits behind `loadAnimationEngine()`'s dynamic + * `import("./engine")`. * - * This gate proves it by construction: it bundles a SPRING-ONLY entry - * (`import { SpringProgress } from "src/animation/index.ts"`) from SOURCE with - * rolldown — re-running tree-shaking on the real module graph, NOT inspecting - * the pre-built dist — then asserts the entry chunk's STATIC module set: + * B.W2 widened the gate from a single spring-only entry (which left 5 of 7 + * light modules unproven — a static value.js edge in `numeric`/`smooth`/ + * `morph`/`timeline` that the spring graph did not reach passed GREEN) to + * the FULL light surface, with four assertions: * - * 1. contains 0 `@mkbabb/value.js` modules, and - * 2. contains 0 `src/animation/engine.ts` (the heavy engine reaches the - * bundle, if at all, only as a DYNAMIC import chunk). + * 1. PER-ENTRY NEGATIVE COVERAGE — every runtime value export on the + * package barrel is bundled as its own entry from SOURCE (re-running + * tree-shaking on the real module graph, never the pre-built dist), + * and each entry chunk's STATIC module set must contain 0 value.js + * modules and 0 `src/animation/engine.ts`. + * 2. SELF-ENFORCING ENTRY SET — the entry list is PARSED from the + * barrel's `export { … } from` statements, so a new light export is + * proven automatically; it cannot drift behind the gate. A sanity + * floor asserts the parse found the known core (a silently-empty + * parse fails the gate, not passes it). + * 3. DYNAMIC-CHUNK PRESENCE — bundling `loadAnimationEngine` must emit + * the heavy engine as a NON-ENTRY dynamic chunk: a build that drops + * the dynamic boundary (eager-importing the engine, or tree-shaking + * the accessor away) turns the gate red. + * 4. SOURCE-GREP COMPLEMENT — the light modules' SOURCE files must hold + * no static `from "@mkbabb/value.js"` specifier at all, catching the + * dead-but-armed import class (`void _probe`) that tree-shaking + * removes from the bundle graph before assertion 1 can see it. * - * value.js + parse-that are deliberately NOT externalized, so a reintroduced - * STATIC edge from any light module pulls their source into the entry chunk and - * turns the gate red. The negative test — add `import "@mkbabb/value.js"` to a - * light module (e.g. `spring.ts`) — must fail this gate. + * value.js + parse-that are deliberately NOT externalized, so a + * reintroduced STATIC edge bundles their source into the entry chunk and + * turns the gate red. The negative test — add `import "@mkbabb/value.js"` + * to any single light module — must fail this gate. + * + * A passing gate means: "no REACHABLE static value.js edge from any + * barrel-exported light entry, no static heavy-engine edge, the dynamic + * boundary intact, and no dormant static specifier in light source." */ import { rolldown } from "rolldown"; import fs from "node:fs"; @@ -29,8 +49,8 @@ import path from "node:path"; import { fileURLToPath } from "node:url"; const REPO = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); -const ENTRY_SRC = path.join(REPO, "src/animation/index.ts"); -const TMP_ENTRY = path.join(REPO, ".proof-spring-entry.mjs"); +const ANIM = path.join(REPO, "src/animation"); +const ENTRY_SRC = path.join(ANIM, "index.ts"); // A module ID belongs to value.js when it lives under the value.js package. const isValueJs = (id) => @@ -45,84 +65,202 @@ const rel = (id) => .replace(REPO + path.sep, "") .replace(/.*node_modules[\\/]/, "node_modules/"); -async function main() { +/** Parse the barrel's runtime value exports — the light surface the gate proves. */ +function parseLightExports() { + const src = fs.readFileSync(ENTRY_SRC, "utf8"); + const names = []; + for (const m of src.matchAll(/^export \{ ([^}]+) \} from "[^"]+";/gm)) { + for (const name of m[1].split(",").map((s) => s.trim())) { + if (name) names.push(name); + } + } + return names; +} + +/** Bundle one named export off the barrel; return the rolldown output. */ +async function bundleEntry(exportName, tmpName) { + const tmp = path.join(REPO, tmpName); fs.writeFileSync( - TMP_ENTRY, - `import { SpringProgress } from ${JSON.stringify(ENTRY_SRC)};\nexport default SpringProgress;\n`, + tmp, + `import { ${exportName} } from ${JSON.stringify(ENTRY_SRC)};\nexport default ${exportName};\n`, ); - - let output; try { const bundle = await rolldown({ - input: TMP_ENTRY, + input: tmp, // Only host-provided / unrelated externals. value.js + parse-that // stay NON-external so a reintroduced static edge bundles their - // source into the entry chunk (where this gate would catch it). + // source into the entry chunk (where this gate catches it). external: ["vue", "prettier"], treeshake: true, logLevel: "silent", }); - ({ output } = await bundle.generate({ format: "es" })); + const { output } = await bundle.generate({ format: "es" }); await bundle.close(); + return output; } finally { - fs.rmSync(TMP_ENTRY, { force: true }); - } - - const entry = output.find((o) => o.type === "chunk" && o.isEntry); - if (!entry) { - console.error("proof:boundary — FAIL: no entry chunk emitted."); - process.exit(2); + fs.rmSync(tmp, { force: true }); } +} - const staticModules = entry.moduleIds; - const valueJsStatic = staticModules.filter(isValueJs); - const engineStatic = staticModules.filter(isHeavyEngine); +async function main() { + const failures = []; - const chunks = output.filter((o) => o.type === "chunk"); - const dynamicChunks = chunks.filter((c) => !c.isEntry); + // ── 2. Self-enforcing entry set ──────────────────────────────────── + const lightExports = parseLightExports(); + const CORE = [ + "SpringProgress", + "SmoothProgress", + "NumericAnimation", + "ElementMorph", + "Timeline", + "RAFPlayback", + "resolveEasing", + ]; + for (const name of CORE) { + if (!lightExports.includes(name)) { + failures.push( + `barrel parse did not find core light export "${name}" — ` + + `the gate's entry derivation is broken (a silent empty ` + + `parse must fail, not pass).`, + ); + } + } - console.log("proof:boundary — spring-only entry static module graph"); - console.log(` entry chunk : ${entry.fileName}`); - console.log(` static modules : ${staticModules.length}`); - console.log(` value.js static edges : ${valueJsStatic.length}`); - console.log(` engine.ts static edges: ${engineStatic.length}`); + console.log("proof:boundary — light-surface static module graphs"); console.log( - ` dynamic import chunks : ${dynamicChunks.length}` + - (dynamicChunks.length - ? ` (${dynamicChunks.map((c) => c.fileName).join(", ")})` - : ""), + ` light entries (parsed from the barrel): ${lightExports.length}`, ); - const failures = []; - if (valueJsStatic.length > 0) { - failures.push( - `value.js is statically reachable from the spring-only entry via:\n ` + - valueJsStatic.map(rel).join("\n "), + // ── 1. Per-entry negative coverage ───────────────────────────────── + for (const name of lightExports) { + const output = await bundleEntry(name, `.proof-${name}-entry.mjs`); + const entry = output.find((o) => o.type === "chunk" && o.isEntry); + if (!entry) { + failures.push(`entry "${name}": no entry chunk emitted.`); + continue; + } + const valueJsStatic = entry.moduleIds.filter(isValueJs); + const engineStatic = entry.moduleIds.filter(isHeavyEngine); + const dynamicChunks = output.filter( + (o) => o.type === "chunk" && !o.isEntry, + ); + console.log( + ` ${name.padEnd(22)} static:${String(entry.moduleIds.length).padStart(3)} ` + + `value.js:${valueJsStatic.length} engine:${engineStatic.length} ` + + `dynamic-chunks:${dynamicChunks.length}`, ); + if (valueJsStatic.length > 0) { + failures.push( + `entry "${name}": value.js is statically reachable via:\n ` + + valueJsStatic.map(rel).join("\n "), + ); + } + if (engineStatic.length > 0) { + failures.push( + `entry "${name}": the heavy engine.ts is a STATIC input (must be dynamic-only) via:\n ` + + engineStatic.map(rel).join("\n "), + ); + } } - if (engineStatic.length > 0) { - failures.push( - `the heavy engine.ts is a STATIC input of the spring-only entry (must be dynamic-only) via:\n ` + - engineStatic.map(rel).join("\n "), + + // ── 3. Dynamic-chunk presence (the boundary itself) ──────────────── + { + const output = await bundleEntry( + "loadAnimationEngine", + ".proof-boundary-entry.mjs", + ); + const entry = output.find((o) => o.type === "chunk" && o.isEntry); + const dynamicEngine = output.filter( + (o) => + o.type === "chunk" && + !o.isEntry && + o.moduleIds.some(isHeavyEngine), + ); + const entryEngine = entry + ? entry.moduleIds.filter(isHeavyEngine) + : []; + console.log( + ` loadAnimationEngine dynamic engine chunks: ${dynamicEngine.length}` + + ` (static engine edges: ${entryEngine.length})`, ); + if (entryEngine.length > 0) { + failures.push( + "loadAnimationEngine: the heavy engine is a STATIC input of " + + "the accessor entry — the dynamic boundary collapsed.", + ); + } + if (dynamicEngine.length === 0) { + failures.push( + "loadAnimationEngine: the heavy engine did NOT emit as a " + + "dynamic chunk — the boundary was tree-shaken away or " + + "rewired; the accessor no longer reaches the engine.", + ); + } } - if (failures.length > 0) { - console.error( - "\nproof:boundary — FAIL (A inv α — the boundary is broken):", + // ── 4. Source-grep complement (dormant static specifiers) ────────── + { + // Heavy-side modules legitimately import value.js statically; every + // OTHER module under src/animation (the light surface + internal/) + // must not — even via a dead, tree-shaken import. + const HEAVY = new Set([ + "engine.ts", + "group.ts", + "waapi.ts", + "adapter.ts", + "constants.ts", + "utils.ts", + "format.ts", + "animations.ts", + ]); + const offenders = []; + const walk = (dir) => { + for (const e of fs.readdirSync(dir, { withFileTypes: true })) { + const p = path.join(dir, e.name); + if (e.isDirectory()) walk(p); + else if ( + e.name.endsWith(".ts") && + !HEAVY.has(e.name) && + /(^|\n)import\s[^;]*from\s+["']@mkbabb\/value\.js["']/.test( + // `import type` is erased at build — only VALUE + // imports arm a static edge. + fs + .readFileSync(p, "utf8") + .replace(/import\s+type\s[^;]*;/g, ""), + ) + ) { + offenders.push(rel(p)); + } + } + }; + walk(ANIM); + console.log( + ` source-grep complement: ${offenders.length} dormant static specifier(s)`, ); + if (offenders.length > 0) { + failures.push( + `light-surface source holds a static "@mkbabb/value.js" ` + + `specifier (dead-but-armed):\n ` + + offenders.join("\n "), + ); + } + } + + if (failures.length > 0) { + console.error("\nproof:boundary — FAIL (inv α — the boundary is broken):"); for (const f of failures) console.error(" ✗ " + f); console.error( - "\n A light module reintroduced a static value.js / engine edge. The KF-B1\n" + - " light/heavy boundary requires light engines to reach value.js ONLY through\n" + + "\n A light module reintroduced a static value.js / engine edge (or the\n" + + " dynamic boundary collapsed). Light engines reach value.js ONLY through\n" + ' the dynamic `import("./engine")`. Move the offending import behind it.', ); process.exit(1); } console.log( - "\nproof:boundary — PASS: the spring-only entry is value.js-free and pulls the\n" + - "heavy engine only dynamically. The KF-B1 boundary holds (A inv α).", + "\nproof:boundary — PASS: every barrel light entry is value.js-free, the\n" + + "heavy engine rides only the dynamic boundary, and no dormant static\n" + + "specifier sits in light source. inv α holds across the full light surface.", ); } diff --git a/src/animation/CLAUDE.md b/src/animation/CLAUDE.md index 50dd5c2..ba2ad90 100644 --- a/src/animation/CLAUDE.md +++ b/src/animation/CLAUDE.md @@ -8,10 +8,13 @@ Core animation engine. Library entry point is `index.ts` → `dist/keyframes.js` - **LIGHT (static)** — the physics/interpolation engines: `SpringProgress`, `SmoothProgress`, `NumericAnimation`, `ElementMorph`, the `Timeline` family, - `RAFPlayback`, and the spring-stop helpers (`springLinearStops`, - `springTimingFunction`). None carries a static import edge to - `@mkbabb/value.js`: they read leaf helpers (rAF + clamp/lerp/scale) from - `internal/leaves.ts` and accept easing as a callable `TimingFunction`. + `RAFPlayback`, the spring-stop helpers (`springLinearStops`, + `springTimingFunction`), and the easing factories (`resolveEasing`, + `toEasing`). None carries a static import edge to `@mkbabb/value.js`: they + read leaf helpers (rAF + clamp/lerp/scale) from `internal/leaves.ts` and + accept easing as a callable `TimingFunction` or a typed `Easing` + (`{ fn, css? }`); a string easing NAME is resolved once, up front, via + `await resolveEasing(name)` — the one dynamic edge. - **HEAVY (dynamic)** — the CSS-keyframe parsing engine in `engine.ts`: `Animation`, `CSSKeyframesAnimation`, `AnimationGroup`, `getAnimationId`, `getTimingFunction`, `resolveKeyframes`, and the option constants. These @@ -21,8 +24,11 @@ Core animation engine. Library entry point is `index.ts` → `dist/keyframes.js` Types stay whole on the static barrel (`import type` is erased under `verbatimModuleSyntax`). The boundary is gated in CI by `proof:boundary` -(`scripts/proof-boundary.mjs`): it bundles a spring-only entry and fails if any -light module reintroduces a static value.js / `engine.ts` edge. +(`scripts/proof-boundary.mjs`): it bundles EVERY light barrel export as its own +entry (the entry set is parsed from the barrel, self-enforcing), asserts zero +static value.js / `engine.ts` edges per entry, asserts the heavy engine emits +as a dynamic chunk behind `loadAnimationEngine`, and greps light source for +dormant static specifiers. ## Files @@ -37,22 +43,21 @@ animation/ ├── smooth.ts # SmoothProgress — exponential smoothing for progress values ├── spring.ts # SpringProgress — iOS-style spring physics tracker ├── springLinearStops.ts # spring → CSS linear() stops string -├── springTimingFunction.ts # spring → callable TimingFunction (tagged with its linear() equivalent) +├── springTimingFunction.ts # spring → typed Easing ({ fn, css: linear() } — one curve, two forms) ├── morph.ts # ElementMorph — position/scale interp between DOM rects (composes NumericAnimation) ├── timeline.ts # Timeline (abstract), ScrollTimeline, ManualTimeline -├── playback.ts # RAFPlayback — shared rAF lifecycle + the reduced-motion snap gate +├── playback.ts # RAFPlayback — THE managed rAF driver (play/drive/loop) every loop rides +├── easing.ts # resolveEasing(name) async factory + toEasing normalizer (light) ├── animations.ts # 30+ preset animations (fadeIn, bounce, shake, spinner, etc.) -├── constants.ts # Types + defaults (AnimationOptions, Vars, AnimationFrame, etc.) -├── utils.ts # Frame calculation, value interpolation, getTimingFunction -├── format.ts # Animation → CSS string serialization -├── renderer.ts # default DOM-style transform renderer +├── constants.ts # Types + defaults (Easing, AnimationOptions, Vars, AnimationFrame, etc.) +├── utils.ts # Frame calculation, value interpolation, getTimingFunction (CSS Easing L1 complete) +├── format.ts # Animation → CSS string serialization (Easing.css faithful) └── internal/ # value.js-free leaves (keep the light bundle clean) - ├── leaves.ts # clamp/scale/lerp + rAF shims (byte-equivalent to value.js) + ├── leaves.ts # clamp/scale/lerp + rAF shims (byte-equivalent to value.js; parity-tested) ├── binarySearch.ts # binarySearchRange for segment lookup - ├── easing-resolvable.ts # ONE shared string-easing-name resolver (eager-resolve + .ready() + dev-warn) - ├── reduced-motion.ts # ONE shared prefers-reduced-motion gate (SSR-safe) - ├── scheduler.ts # yieldToMain() — scheduler.yield() with a MessageChannel fallback - └── css-easing.ts # tag/read a TimingFunction's CSS easing string (spring linear()) + ├── errors.ts # AnimationOptionError / UnknownEasingError + parseOption (fail-explicit seam) + ├── reduced-motion.ts # ONE prefers-reduced-motion detector + the ONE withReducedMotion gate + └── scheduler.ts # yieldToMain() — live scheduler.yield probe + cached fallback ``` ## Classes @@ -61,12 +66,14 @@ animation/ Core engine. Manages keyframes, timing, interpolation, playback. - **Frame lifecycle**: `addFrame()` → `parse()` → `AnimationFrame[]` with precomputed `interpVars` -- **Playback**: `play()` / `pause()` / `resume()` / `stop()` / `reset()` -- **Config**: `setDuration()`, `setDelay()`, `setDirection()`, `setFillMode()`, `setTimingFunction()`, `setIterationCount()`, `setColorSpace()`, `setHueMethod()`, `setUseWAAPI()`, `setRespectReducedMotion()`, `setOptions()` (bulk), `setTargets()` -- **Interpolation**: `interpFrames(t, apply?, buffer?)` — samples all active frames at time `t` +- **Playback**: `play()` / `pause()` / `resume()` / `stop()` (halt, settle, never paints) / `reset()` (explicit rewind: paint initial + settle) / `settle()` (pure teardown) +- **Rest-position contract**: `restPosition` derives once from `fillMode` (forwards/both → final; none/backwards → initial); completion paints the rest frame via `paintRest()` then settles. Reduced-motion = "rest = final, paint, settle" — the same terminal path as a forwards completion. +- **Config**: `setDuration()`, `setDelay()`, `setDirection()`, `setFillMode()`, `setTimingFunction()`, `setIterationCount()`, `setColorSpace()`, `setHueMethod()`, `setUseWAAPI()`, `setRespectReducedMotion()`, `setOptions()` (bulk), `setTargets()` — ALL fail-explicit: malformed present input throws a typed `AnimationOptionError`; genuine omission defaults +- **Interpolation**: `interpFrames(t, apply?, buffer?)` — samples all active frames at time `t` (hot path reads `frame.timingFunction.fn`) - **Fill**: `fillForwards()` / `fillBackwards()` -- **Reduced motion**: with `respectReducedMotion: true`, `play()` snaps to the final frame in a single paint (`animationstart` → `animationend`) instead of running the rAF/WAAPI loop -- **Events**: dispatches `animationstart`, `animationiteration`, `animationend` on targets +- **Reduced motion**: with `respectReducedMotion: true`, `play()` snaps to the final frame in a single paint (`animationstart` → `animationend`) instead of running the rAF/WAAPI loop — routed through the ONE `withReducedMotion` gate +- **Events**: dispatches `animationstart`, `animationiteration`, `animationend` on targets (SSR-safe capability skip) +- **Loops**: `readonly playback: RAFPlayback` owns the rAF handle for the standalone play loop AND the WAAPI shadow tick ### `CSSKeyframesAnimation` extends `Animation` (`engine.ts`) Adds the CSS `@keyframes` parsing layer: `fromString(css)`, `fromKeyframes(map)`, `fromVars(vars[])`, `transform(vars)`. @@ -74,36 +81,43 @@ Adds the CSS `@keyframes` parsing layer: `fromString(css)`, `fromKeyframes(map)` ### `AnimationGroup` (`group.ts`) Composites multiple animations with layer blending (`replace` / `add` / `weighted`). -- Manages its own rAF loop; marks children `managed = true` +- Draw loop rides its `readonly playback: RAFPlayback`; marks children `managed = true` - `tick()` ticks children in batches, yielding to the main thread between batches for groups larger than `AnimationGroup.YIELD_BATCH` (INP relief) -- `respectReducedMotion = true` → `play()` composites every child's final frame once, no draw loop +- `respectReducedMotion = true` → `play()` composites every child's final frame once, no draw loop; `play()` is re-entrant (`_playingPromise` guard) +- Rest-position contract: completion `settle()`s (pure, leaves the rest frame painted by each child's fill); `reset()` is the explicit rewind (paint initial + settle); `stop()` = halt + rewind (transport semantics) ### `NumericAnimation>` (`numeric.ts`) -Zero-allocation keyframe interpolation over plain numeric objects. `at(progress)`, `updateKeyframe()`, managed `play()`. String easing names resolve through the shared `EasingResolvable`; `play()` routes its reduced-motion snap through `RAFPlayback`. +Zero-allocation keyframe interpolation over plain numeric objects. `at(progress)`, `updateKeyframe()`, managed `play()`. Accepts a callable `TimingFunction` or typed `Easing` only (a string name throws — resolve via `await resolveEasing(name)` first); `play()` routes its reduced-motion snap through `RAFPlayback`. ### `SmoothProgress` (`smooth.ts`), `SpringProgress` (`spring.ts`) -Progress trackers. `setTarget` → `tick()`/`tickDt(dt)` → `current`. Both honor `respectReducedMotion` via the shared `prefersReducedMotion()` gate. +Progress trackers — pure steppers implementing `Tickable` (`tickDt(dt)` + `settled`). `setTarget` → `tick()`/`tickDt(dt)` → `current`; the managed `.play()` loop delegates to `RAFPlayback.drive`. Snaps route through the ONE `withReducedMotion` gate. ### `ElementMorph` (`morph.ts`) -Interpolates position/scale between two DOM rects. Composes `NumericAnimation`, so it inherits the `EasingResolvable` + `RAFPlayback` reduced-motion behavior. +Interpolates position/scale between two DOM rects. Composes `NumericAnimation`, so it inherits the callable/`Easing`-only easing contract + the `RAFPlayback` reduced-motion behavior. ### `Timeline` (abstract), `ScrollTimeline`, `ManualTimeline` (`timeline.ts`) -Progress drivers; the caller owns the rAF loop. Pipeline: `sample() → clamp → easing → boundary snap → smoothing → progress`. String easing names resolve through the shared `EasingResolvable`. +Progress drivers; the caller owns the rAF loop. Pipeline: `sample() → clamp → easing → boundary snap → smoothing → progress`. Accepts a callable `TimingFunction` or typed `Easing` only (a string name throws). ### `RAFPlayback` (`playback.ts`) -Shared rAF playback lifecycle for the light interpolators. Owns the rAF handle AND the `prefers-reduced-motion` snap gate (`play(duration, onTick, { respectReducedMotion })` → `onTick(1)` once, no loop). Exported so consumers driving their own light playback get the same gate. - -## Boundary ergonomics — `EasingResolvable` (`internal/easing-resolvable.ts`) - -The light engines accept easing as a callable `TimingFunction` (value.js-free) -OR a string easing *name* from value.js's registry. A name resolves through the -dynamic `import("../engine")` boundary. `EasingResolvable` is the ONE shared -resolver (`numeric.ts` + `timeline.ts` consume it directly; `morph.ts` via -`numeric`): it eager-resolves the name at construction, exposes `.ready()` for -the rare first-synchronous-`.at()` case, and emits a one-time dev-only warning -(`warnIfPending`) if a name is read before it resolves — the wrong-until-ready -window is detectable, not silent. +THE managed rAF driver — no other module owns a rAF handle. Three shapes: +`play(duration, onTick, { respectReducedMotion })` (duration/progress loop with +the light reduced-motion snap), `drive(tickable, onFrame?)` (settle-based dt +loop over a `Tickable` — `SmoothProgress`/`SpringProgress`), and `loop(cb)` +(self-rescheduling async frame loop — `Animation`, `AnimationGroup`, the WAAPI +shadow tick). Exported so consumers driving their own light playback get the +same gate. + +## Boundary ergonomics — `resolveEasing` (`easing.ts`) + +The light engines accept easing as a callable `TimingFunction` or a typed +`Easing` (`{ fn, css? }`) — synchronous, value.js-free. A string easing *name* +from value.js's registry is resolved ONCE, explicitly, through the async +factory `await resolveEasing(name)` — the one dynamic `import("./engine")` +edge. Fail-explicit: an unknown name rejects with `UnknownEasingError`; a +chunk-load failure rethrows with the easing named; a string passed directly to +a light engine throws `AnimationOptionError`. No pending state, no identity +fallback, no resolver class. ## Playback Modes @@ -114,18 +128,24 @@ window is detectable, not silent. ## WAAPI Eligibility (`waapi.ts`) -Requires DOM targets, the default DOM-style renderer, a uniform timing function -across frames, no computed units (`vh`/`calc`/`var`/`cqw`), and no color -interpolation. Falls back to rAF silently. `toWAAPIOptions` emits the uniform -timing function's CSS easing string when it carries one (a spring's `linear()` -via `springTimingFunction`'s tag), otherwise bare `linear`. +Requires DOM targets, the default DOM-style renderer (a reference comparison +via `animation.usesDefaultRenderer()` — bind-proof, unlike the former Symbol +tag that `Function.prototype.bind` silently dropped, which had made every +`fromString` animation read as "custom transform" and the WAAPI path dead in +practice), a uniform timing function across frames, no CSS-twinned easing +across multiple segments (WAAPI restarts the curve per segment), no computed +units (`vh`/`calc`/`var`/`cqw`), and no color interpolation. Falls back to rAF +with a queryable `waapiIneligibleReason`. `toWAAPIOptions` emits +`Easing.css` when the uniform easing carries one (a spring's `linear()` from +`springTimingFunction`), otherwise bare `linear`. ## Key Types (`constants.ts`) - `Vars` — `{[key: string]: number | string | T}` - `TimingFunction` — `(t: number) => number` -- `AnimationFrame` — compiled frame: `ixs`, `time`, `flatVars`, `interpVars`, `allInterpVars`, `timingFunction` -- `AnimationOptions` — `{duration, delay, iterationCount, direction, fillMode, timingFunction, useWAAPI, respectReducedMotion, colorSpace, hueMethod?}` +- `Easing` — `{ fn: TimingFunction, css?: string }` — the typed easing value; `css` is the faithful CSS twin (spring `linear()`, `cubic-bezier()` literal) that flows through the type system instead of a Symbol tag +- `AnimationFrame` — compiled frame: `ixs`, `time`, `flatVars`, `interpVars`, `allInterpVars`, `timingFunction: Easing` +- `AnimationOptions` — `{duration, delay, iterationCount, direction, fillMode, timingFunction: Easing, useWAAPI, respectReducedMotion, colorSpace, hueMethod?}` - `BlendMode` — `'replace' | 'add' | 'weighted'` Defaults: 1000ms duration, 0 delay, 1 iteration, normal direction, forwards fill, easeInOutCubic, WAAPI on, reduced-motion off, oklab color space. diff --git a/src/animation/animations.ts b/src/animation/animations.ts index 0a2a40c..42996ba 100644 --- a/src/animation/animations.ts +++ b/src/animation/animations.ts @@ -14,7 +14,10 @@ export const fadeIn = (options?: InputAnimationOptions) => new CSSKeyframesAnimation({ duration: 700, timingFunction: "ease-in-out", - // TODO(LOW): In strict mode, remove blanket options merge fallback and validate explicit overrides. + // Preset-default + consumer-override merge: genuine-omission + // defaulting is the sanctioned contract; malformed PRESENT values + // throw in the setters (the fail-explicit seam), so the spread + // cannot mask bad input. ...(options ?? {}), }).fromString(fadeInKeyframes); diff --git a/src/animation/constants.ts b/src/animation/constants.ts index f3f0870..f95f265 100644 --- a/src/animation/constants.ts +++ b/src/animation/constants.ts @@ -32,13 +32,30 @@ export type TransformFunction = (v: V, t: number) => void; export type TimingFunction = (t: number) => number; +/** + * The typed easing value — a callable curve plus, when one exists, the CSS + * easing string that reproduces it (e.g. a spring's `linear()` stops). + * + * Replaces the former Symbol-on-a-closure side channel: the "this closure + * has a CSS twin" fact now flows through the type system, so wrapping or + * binding the callable can no longer silently drop it. `waapi.ts` reads + * `.css` to run the true curve on the compositor; everything else reads + * `.fn`. + */ +export interface Easing { + /** The callable curve — the hot-path interpolation function. */ + fn: TimingFunction; + /** CSS easing string that faithfully reproduces `fn`, when one exists. */ + css?: string; +} + export interface TemplateAnimationFrame { id: number; start: ValueUnit; vars: V; transform?: TransformFunction; - timingFunction?: TimingFunction; + timingFunction?: Easing; } export interface AnimationFrame { @@ -72,7 +89,7 @@ export interface AnimationFrame { transform: TransformFunction; - timingFunction: TimingFunction; + timingFunction: Easing; } export type AnimationOptions = { @@ -86,7 +103,7 @@ export type AnimationOptions = { fillMode: (typeof FILL_MODES)[number]; - timingFunction: TimingFunction; + timingFunction: Easing; useWAAPI: boolean; @@ -112,7 +129,12 @@ export type InputAnimationOptions = Partial<{ direction: (typeof DIRECTIONS)[number]; fillMode: (typeof FILL_MODES)[number]; - timingFunction: TimingFunction | TimingFunctionNames | undefined; + timingFunction: + | TimingFunction + | Easing + | TimingFunctionNames + | string + | undefined; /** When true (default), eligible animations may use the Web Animations API for compositor-thread execution. Set to false to force rAF. */ useWAAPI: boolean; @@ -131,7 +153,7 @@ export const defaultOptions: AnimationOptions = { iterationCount: 1, direction: "normal", fillMode: "forwards", - timingFunction: easeInOutCubic, + timingFunction: { fn: easeInOutCubic }, useWAAPI: true, respectReducedMotion: false, colorSpace: "oklab", @@ -144,8 +166,12 @@ export interface AnimationLayerConfig { zIndex: number; /** 0–1 for 'weighted' blend mode. Default: 1 */ weight: number; - /** Default: 'replace' (backward compat) */ - // TODO(MEDIUM): Drop backward-compat defaulting and require callers to choose blend mode explicitly. + /** + * Default: 'replace'. Defaulting on a genuinely-omitted blend mode is + * the sanctioned contract (the fail-explicit seam throws only on + * malformed PRESENT input, never on omission) — an unspecified layer + * blends by replacement, the least-surprising composite. + */ blendMode: BlendMode; /** Layer toggle. Default: true */ enabled: boolean; diff --git a/src/animation/easing.ts b/src/animation/easing.ts new file mode 100644 index 0000000..6e171c7 --- /dev/null +++ b/src/animation/easing.ts @@ -0,0 +1,77 @@ +/** + * Easing construction at the light/heavy boundary. + * + * The light engines (`NumericAnimation`, `ElementMorph`, the `Timeline` + * family) accept easing as a callable `TimingFunction` or a typed + * {@link Easing} — synchronous, value.js-free. A string easing *name* from + * value.js's registry is resolved ONCE, up front, through this module's + * async factory — the single dynamic `import("./engine")` edge — and the + * result is a plain callable the light engines consume with no pending + * state, no identity fallback, and no resolver class. + * + * This replaces the former `EasingResolvable` (an async resolver smuggled + * behind a sync API: identity-fallback-until-resolved, a dev-only warning + * coupled to the bundler's console-drop, and a silent-permanent-identity + * degradation on an unresolvable name — the fail-explicit violation). The + * seam moves from "every `.at()` checks pending" to "resolve the name once, + * explicitly, before construction." + */ +import type { Easing, TimingFunction } from "./constants"; +import { UnknownEasingError } from "./internal/errors"; + +/** + * Normalize a callable or typed easing to {@link Easing}. Synchronous and + * value.js-free — the light-engine input normalizer. + */ +export const toEasing = (input: TimingFunction | Easing): Easing => + typeof input === "function" ? { fn: input } : input; + +/** + * Names that are themselves valid CSS easing syntax — for these the + * resolved {@link Easing} carries `css` so a WAAPI delegation can run the + * native curve instead of falling back to bare `linear`. + */ +const CSS_NATIVE_EASING = + /^(linear|ease|ease-in|ease-out|ease-in-out)$|^cubic-bezier\(/; + +/** + * Resolve a string easing name (a value.js registry entry — `"easeOutCubic"`, + * `"ease-out-cubic"`, … — or a CSS `cubic-bezier()` literal) to a typed + * {@link Easing}. + * + * The lookup rides the dynamic engine boundary: `import("./engine")` loads + * the value.js-bearing easing registry only when a named easing is actually + * used, so a light-only consumer that never calls this stays value.js-free. + * + * Fail-explicit: an unresolvable name throws {@link UnknownEasingError}; + * an engine chunk-load failure rethrows with the failing easing named — + * never an unhandled rejection, never a silent identity fallback. + * + * ```ts + * const easing = await resolveEasing("easeOutCubic"); + * const anim = new NumericAnimation(frames, { timingFunction: easing }); + * ``` + */ +export async function resolveEasing(name: string): Promise { + let engine: typeof import("./engine"); + try { + engine = await import("./engine"); + } catch (cause) { + throw new Error( + `keyframes: the engine chunk failed to load while resolving ` + + `easing "${name}" — the easing registry is unreachable.`, + { cause }, + ); + } + + const fn = engine.getTimingFunction(name); + if (!fn) { + throw new UnknownEasingError(name); + } + + const easing: Easing = { fn }; + if (CSS_NATIVE_EASING.test(name)) { + easing.css = name; + } + return easing; +} diff --git a/src/animation/engine.ts b/src/animation/engine.ts index 537c40e..0788e89 100644 --- a/src/animation/engine.ts +++ b/src/animation/engine.ts @@ -13,14 +13,11 @@ * loads this graph. See `./index` for the boundary contract. */ import { - cancelAnimationFrame, clamp, convertToMs, - easeInOutCubic, isObject, parseCSSTime, parseCSSValueUnit, - requestAnimationFrame, scale, seekPreviousValue, sleep, @@ -29,16 +26,17 @@ import { type PropertyDescriptor, } from "@mkbabb/value.js"; import { binarySearchRange } from "./internal/binarySearch"; -import { prefersReducedMotion } from "./internal/reduced-motion"; +import { AnimationOptionError, parseOption } from "./internal/errors"; +import { withReducedMotion } from "./internal/reduced-motion"; +import { RAFPlayback } from "./playback"; import { resolveKeyframes } from "./adapter"; -import { defaultOptions } from "./constants"; +import { DIRECTIONS, FILL_MODES, defaultOptions } from "./constants"; import type { AnimationFrame, AnimationOptions, + Easing, InputAnimationOptions, TemplateAnimationFrame, - TimingFunction, - TimingFunctionNames, TransformFunction, Vars, } from "./constants"; @@ -54,6 +52,49 @@ import { } from "./utils"; import { isWAAPIEligible, playWAAPI } from "./waapi"; +/** `parseCSSTime` that converts a parse failure to `undefined` for the option seam. */ +const tryParseTime = (raw: string): number | undefined => { + try { + const parsed = parseCSSTime(raw); + return Number.isFinite(parsed) ? parsed : undefined; + } catch { + return undefined; + } +}; + +/** + * Resolve heavy-surface easing input — a callable, a typed `Easing`, a + * registry name, or a `cubic-bezier()` literal — to a typed `Easing`. + * Fail-explicit: unresolvable input throws; there is no silent fallback + * to a default curve. + */ +const resolveEasingOption = ( + option: string, + input: NonNullable, +): Easing => { + if (typeof input === "function") return { fn: input }; + if (typeof input === "object") { + if (typeof (input as Easing).fn === "function") { + return input as Easing; + } + throw new AnimationOptionError( + option, + input, + "an Easing must carry a callable `fn`", + ); + } + const fn = getTimingFunction(input); + if (!fn) { + throw new AnimationOptionError( + option, + input, + "unknown timing function — pass a callable TimingFunction, a " + + "typed Easing, a registry name, or a cubic-bezier() literal", + ); + } + return { fn }; +}; + const hasClone = (value: unknown): value is { clone: () => unknown } => { if (typeof value !== "object" || value == null) { return false; @@ -86,7 +127,12 @@ export class Animation { frames: AnimationFrame[] = []; - handleId: number | any = undefined; + /** + * THE rAF owner for this animation — the standalone rAF play loop and + * the WAAPI shadow tick both ride it, so `stop()` halts either + * uniformly and no raw rAF handle leaks onto the instance. + */ + readonly playback = new RAFPlayback(); startTime: number | undefined = undefined; pausedTime: number = 0; @@ -121,13 +167,32 @@ export class Animation { private _playingPromise: Promise | null = null; /** - * Pre-bound draw callback — allocated once to avoid creating a new - * closure on every requestAnimationFrame reschedule. + * Pre-bound frame callback — allocated once to avoid creating a new + * closure on every playback loop start. + */ + private _boundFrame = this._frame.bind(this); + + /** + * The instance's ONE default DOM-style renderer, allocated once. + * "Did the consumer supply a custom transform?" is a reference + * comparison against this single value ({@link usesDefaultRenderer}) — + * typed and bind-proof, unlike a Symbol tag on a closure, which + * `Function.prototype.bind` silently drops. */ - private _boundDraw = this.draw.bind(this); + protected readonly _defaultTransform: TransformFunction = (vars) => + transformTargetsStyle(vars, this.targets); + + /** True when `fn` is this instance's default DOM-style renderer. */ + usesDefaultRenderer(fn: TransformFunction | undefined): boolean { + return fn === this._defaultTransform; + } private dispatchAnimationEvent(type: string) { - // TODO(MEDIUM): Throw explicit capability errors when AnimationEvent/dispatchEvent is unavailable instead of silently skipping. + // SSR-safe capability contract: `AnimationEvent`/`dispatchEvent` are + // DOM capabilities — when absent (Node, non-element targets) the + // lifecycle proceeds without events rather than throwing, mirroring + // the off-DOM posture of `prefersReducedMotion()`. Event delivery is + // an observation channel, not a library-internal contract. if (typeof AnimationEvent === "undefined") return; for (const target of this.targets) { if (typeof target?.dispatchEvent !== "function") continue; @@ -178,7 +243,7 @@ export class Animation { start: number | string | ValueUnit, vars: Partial, transform?: TransformFunction, - timingFunction?: TimingFunction | TimingFunctionNames, + timingFunction?: InputAnimationOptions["timingFunction"], ): Animation { if (typeof start === "number") { start = String(start) + "%"; @@ -195,9 +260,12 @@ export class Animation { start: parsedStart, vars, transform, + // Genuine omission inherits the animation's easing; a present- + // but-unresolvable input throws (fail-explicit). timingFunction: - getTimingFunction(timingFunction) ?? - this.options.timingFunction, + timingFunction == null + ? this.options.timingFunction + : resolveEasingOption("timingFunction", timingFunction), } as TemplateAnimationFrame; this.convertFrameStart( @@ -392,42 +460,74 @@ export class Animation { return this; } + /** + * Option setters — the fail-explicit contract. + * + * Genuine omission (`undefined`/`null`) means "use the default" and is + * always accepted; present-but-malformed input THROWS a typed + * `AnimationOptionError` naming the option and the offending value. + * This is the same posture the layer API chose ("silent no-ops were + * hiding consumer bugs") applied to the whole options surface — no + * silent fallback, no silently-preserved previous value. + */ setTimingFunction(timingFunction: InputAnimationOptions["timingFunction"]) { - // TODO(HIGH): Remove implicit timing-function defaulting here; reject unknown timing functions explicitly. this.options.timingFunction = - getTimingFunction(timingFunction) ?? easeInOutCubic; + timingFunction == null + ? defaultOptions.timingFunction + : resolveEasingOption("timingFunction", timingFunction); return this; } setIterationCount(iterationCount: InputAnimationOptions["iterationCount"]) { + if (iterationCount == null) { + this.options.iterationCount = defaultOptions.iterationCount; + return this; + } if ( - !iterationCount || iterationCount === "infinite" || iterationCount === "∞" || - iterationCount === "Infinity" + iterationCount === "Infinity" || + iterationCount === Infinity ) { this.options.iterationCount = Infinity; - } else if (typeof iterationCount === "string") { - const parsed = parseFloat(iterationCount.trim()); - // TODO(CRITICAL): Replace silent invalid-input no-op with explicit error for malformed iterationCount strings. - if (isNaN(parsed) || parsed < 0) return this; - this.options.iterationCount = parsed; - } else { - // TODO(HIGH): Replace silent invalid-input no-op with explicit error for invalid numeric iterationCount values. - if (isNaN(iterationCount) || iterationCount < 0) return this; - this.options.iterationCount = iterationCount; + return this; } + this.options.iterationCount = parseOption( + "iterationCount", + iterationCount, + (raw) => { + const n = + typeof raw === "string" + ? Number.parseFloat(raw.trim()) + : (raw as number); + return typeof n === "number" && !Number.isNaN(n) && n >= 0 + ? n + : undefined; + }, + 'expected a non-negative count, "infinite", or Infinity', + ); return this; } setDuration(duration: InputAnimationOptions["duration"]) { - if (typeof duration === "string") { - duration = parseCSSTime(duration); - } - - const d = duration ?? this.options.duration; - // TODO(HIGH): Stop silently preserving previous duration on invalid input; throw a validation error. - if (!isFinite(d) || d <= 0) return this; + // Genuine omission: keep the current duration (the constructor + // always seeds the default; a bare `setDuration()` is a no-op). + if (duration == null) return this; + + const d = parseOption( + "duration", + duration, + (raw) => { + const n = + typeof raw === "string" + ? tryParseTime(raw) + : (raw as number); + return typeof n === "number" && isFinite(n) && n > 0 + ? n + : undefined; + }, + "expected a positive duration in milliseconds or a CSS time string", + ); const prevDuration = this.options.duration; const ratio = d / prevDuration; @@ -444,17 +544,37 @@ export class Animation { } setDelay(delay: InputAnimationOptions["delay"]) { - if (typeof delay === "string") { - delay = parseCSSTime(delay); + if (delay == null) { + this.options.delay = defaultOptions.delay; + return this; } - // TODO(MEDIUM): Avoid implicit delay defaulting on undefined input in strict mode; require explicit intent. - this.options.delay = delay ?? 0; + this.options.delay = parseOption( + "delay", + delay, + (raw) => { + const n = + typeof raw === "string" + ? tryParseTime(raw) + : (raw as number); + // Negative delays are valid CSS (start mid-animation). + return typeof n === "number" && isFinite(n) ? n : undefined; + }, + "expected a delay in milliseconds or a CSS time string", + ); return this; } setDirection(direction: InputAnimationOptions["direction"]) { - // TODO(MEDIUM): Avoid implicit direction fallback; reject missing direction when strict option validation is enabled. - this.options.direction = direction ?? "normal"; + if (direction == null) { + direction = defaultOptions.direction; + } else if (!DIRECTIONS.includes(direction)) { + throw new AnimationOptionError( + "direction", + direction, + `expected one of: ${DIRECTIONS.join(", ")}`, + ); + } + this.options.direction = direction; // Immediately update reversed flag so mid-iteration direction changes take effect this.reversed = false; @@ -471,27 +591,58 @@ export class Animation { } setFillMode(fillMode: InputAnimationOptions["fillMode"]) { - // TODO(MEDIUM): Avoid implicit fill-mode fallback; reject missing fill mode when strict option validation is enabled. - this.options.fillMode = fillMode ?? "forwards"; + if (fillMode == null) { + fillMode = defaultOptions.fillMode; + } else if (!FILL_MODES.includes(fillMode)) { + throw new AnimationOptionError( + "fillMode", + fillMode, + `expected one of: ${FILL_MODES.join(", ")}`, + ); + } + this.options.fillMode = fillMode; return this; } setUseWAAPI(useWAAPI: InputAnimationOptions["useWAAPI"]) { - // TODO(LOW): Avoid implicit WAAPI opt-in defaulting here; validate explicit policy selection upstream. - this.options.useWAAPI = useWAAPI ?? true; + if (useWAAPI == null) { + this.options.useWAAPI = defaultOptions.useWAAPI; + return this; + } + if (typeof useWAAPI !== "boolean") { + throw new AnimationOptionError( + "useWAAPI", + useWAAPI, + "expected a boolean", + ); + } + this.options.useWAAPI = useWAAPI; return this; } setRespectReducedMotion( respectReducedMotion: InputAnimationOptions["respectReducedMotion"], ) { - this.options.respectReducedMotion = respectReducedMotion ?? false; + if (respectReducedMotion == null) { + this.options.respectReducedMotion = + defaultOptions.respectReducedMotion; + return this; + } + if (typeof respectReducedMotion !== "boolean") { + throw new AnimationOptionError( + "respectReducedMotion", + respectReducedMotion, + "expected a boolean", + ); + } + this.options.respectReducedMotion = respectReducedMotion; return this; } setColorSpace(colorSpace: InputAnimationOptions["colorSpace"]) { - // TODO(MEDIUM): Avoid implicit color-space fallback; require explicit color-space selection in strict mode. - this.options.colorSpace = colorSpace ?? "oklab"; + // Type-enforced at the boundary (value.js's ColorSpace union); + // genuine omission defaults to the perceptual default. + this.options.colorSpace = colorSpace ?? defaultOptions.colorSpace; return this; } @@ -537,6 +688,30 @@ export class Animation { this.interpFrames(0, true); } + /** + * Where the playhead rests after a completed play — derived ONCE from + * `fillMode` (forwards/both → final; none/backwards → initial). This is + * the explicit rest-position contract: completion paints the rest frame + * per this derivation, and the reduced-motion snap is "rest = final, + * paint it, settle" — the same path a `fillMode: forwards` completion + * takes, not a separate code path. + */ + get restPosition(): "initial" | "final" { + return this.options.fillMode === "forwards" || + this.options.fillMode === "both" + ? "final" + : "initial"; + } + + /** Paint the rest frame per the fill contract. */ + paintRest() { + if (this.restPosition === "final") { + this.fillForwards(); + } else { + this.fillBackwards(); + } + } + /** * Stateless progress query. Maps [0,1] from first keyframe to last, * regardless of playback direction. `apply=true` invokes transform callbacks. @@ -595,7 +770,7 @@ export class Animation { const processFrame = (frame: AnimationFrame) => { const { start, stop } = frame.time; const scaled = scale(t, start, stop, 0, 1); - const eased = frame.timingFunction(scaled); + const eased = frame.timingFunction.fn(scaled); for (const iv of frame.allInterpVars) { lerpValue(eased, iv); @@ -657,17 +832,9 @@ export class Animation { } async onEnd() { - if ( - this.options.fillMode === "forwards" || - this.options.fillMode === "both" - ) { - this.fillForwards(); - } else if ( - this.options.fillMode === "none" || - this.options.fillMode === "backwards" - ) { - this.fillBackwards(); - } + // Completion paints the rest frame per the fill contract — the one + // place "where does the playhead rest?" is decided. + this.paintRest(); this.startTime = undefined; @@ -706,69 +873,74 @@ export class Animation { return this.t; } - async draw(t: number) { - if (this.managed) { - throw new Error( - "Animation.draw() called on a managed animation — the AnimationGroup owns the rAF loop. Call group.play()/pause()/stop() instead.", - ); - } - + /** + * One frame of the standalone rAF play path, driven by the shared + * `RAFPlayback.loop`. Returns whether the loop should continue. + */ + private async _frame(t: number): Promise { t = await this.tick(t); if (this.paused) { - return; + return false; } this.interpFrames(t, true); if (!this.done) { - this.handleId = requestAnimationFrame(this._boundDraw); - } else { - this.reset(); - if (this.resolvePromise) { - this.resolvePromise(); - } + return true; } + + // Completion: `onEnd` (inside tick) already painted the rest frame + // per the fill contract — settle is pure teardown, never a repaint. + this.settle(); + this._resolvePlay(); + return false; + } + + private _resolvePlay() { + const resolve = this.resolvePromise; + this.resolvePromise = null; + resolve?.(); } - /** Internal rAF-based play loop. */ + /** Internal rAF-based play loop — loop ownership rides `this.playback`. */ private _playRAF(): Promise { return new Promise((resolve) => { this.resolvePromise = resolve; - this.handleId = requestAnimationFrame(this._boundDraw); + this.playback.loop(this._boundFrame); }); } /** * Play via the Web Animations API. WAAPI handles visuals on the - * compositor thread; a shadow rAF loop in `playWAAPI` drives - * `tick()` so events, iteration count, pause/resume, and other - * lifecycle state stay coherent with the rAF path. + * compositor thread; a shadow loop in `playWAAPI` (riding + * `this.playback`) drives `tick()` so events, iteration count, + * pause/resume, and other lifecycle state stay coherent with the + * rAF path. * * No silent fallback — eligibility is decided once in `play()` * before this is invoked, and runtime errors propagate. */ private async _playWAAPI(): Promise { await playWAAPI(this); - this.reset(); + this.settle(); } /** - * `prefers-reduced-motion` snap: jump to the final frame in a single - * paint — no rAF/WAAPI loop. The lifecycle stays observable - * (`animationstart` → fill final → `animationend`) so consumers' event - * wiring is identical to a completed normal play. + * `prefers-reduced-motion` snap: rest = final, paint it, settle — the + * SAME terminal path a `fillMode: forwards` completion takes, with the + * motion elided. The lifecycle stays observable (`animationstart` → + * final paint → `animationend`) so consumers' event wiring is identical + * to a completed normal play. */ private async _playReducedMotion(): Promise { this.started = true; this.dispatchAnimationEvent("animationstart"); - // The visually-complete end state — the same frame a forwards fill - // settles on. Reduced-motion shows the result without the motion. this.fillForwards(); this.iteration = 0; this.done = true; this.dispatchAnimationEvent("animationend"); - this.reset(); + this.settle(); } async play(): Promise { @@ -780,24 +952,27 @@ export class Animation { if (this._playingPromise) return this._playingPromise; - let result: Promise; - if (this.options.respectReducedMotion && prefersReducedMotion()) { + const result = withReducedMotion( + this.options.respectReducedMotion, // Reduced-motion wins over WAAPI/rAF — snap to the final frame. - this.waapiIneligibleReason = undefined; - result = this._playReducedMotion(); - } else if (this.options.useWAAPI) { - const elig = isWAAPIEligible(this); - if (elig.eligible) { + () => { this.waapiIneligibleReason = undefined; - result = this._playWAAPI(); - } else { - this.waapiIneligibleReason = elig.reason; - result = this._playRAF(); - } - } else { - this.waapiIneligibleReason = undefined; - result = this._playRAF(); - } + return this._playReducedMotion(); + }, + () => { + if (this.options.useWAAPI) { + const elig = isWAAPIEligible(this); + if (elig.eligible) { + this.waapiIneligibleReason = undefined; + return this._playWAAPI(); + } + this.waapiIneligibleReason = elig.reason; + return this._playRAF(); + } + this.waapiIneligibleReason = undefined; + return this._playRAF(); + }, + ); this._playingPromise = result; result.finally(() => { @@ -819,14 +994,20 @@ export class Animation { resume() { if (this.started && this.paused) { this.paused = false; - this.handleId = requestAnimationFrame(this._boundDraw); + this.playback.loop(this._boundFrame); } return this; } + /** + * Halt playback where it stands: cancel the loop, settle state, and + * resolve any pending `play()` promise. Never paints — `reset()` is + * the explicit rewind. + */ stop() { - cancelAnimationFrame(this.handleId); - this.reset(); + this.playback.stop(); + this.settle(); + this._resolvePlay(); } playing() { @@ -838,7 +1019,14 @@ export class Animation { return this.reversed ? this.options.duration - this.t : this.t; } - reset() { + /** + * Pure state teardown — flags, clocks, iteration. NEVER paints. This is + * the terminal half of the rest-position contract: completion paints + * the rest frame (via `onEnd` → `paintRest`) and then settles; the + * reduced-motion snap paints final and then settles. Settling is + * orthogonal to where the pixels rest. + */ + settle() { this.done = false; this.started = false; this.paused = false; @@ -851,6 +1039,19 @@ export class Animation { return this; } + /** + * Explicit rewind: paint the INITIAL frame, then settle. This is the + * user-facing "return to start" — rest position `initial`, painted + * deliberately — distinct from `settle()`, which tears down state and + * leaves the pixels where they rest. + */ + reset() { + if (this.started && this.frames.length > 0) { + this.fillBackwards(); + } + return this.settle(); + } + setTargets(...targets: HTMLElement[]) { this.targets = targets; @@ -882,10 +1083,22 @@ export class CSSKeyframesAnimation extends Animation { this.unflatten = false; } - fromVars(vars: V[], transform?: TransformFunction) { + /** + * One transform-resolution seam for the three `from*` entry points: + * a supplied transform is the consumer's renderer (vars arrive + * unflattened); genuine omission resolves to the instance's ONE + * default DOM-style renderer, which keeps WAAPI eligibility a + * reference comparison (`usesDefaultRenderer`). + */ + private resolveTransform( + transform: TransformFunction | undefined, + ): TransformFunction { this.unflatten = transform != null; - // TODO(MEDIUM): Require an explicit transform strategy instead of defaulting to instance transform. - transform ??= this.transform.bind(this); + return transform ?? this._defaultTransform; + } + + fromVars(vars: V[], transform?: TransformFunction) { + transform = this.resolveTransform(transform); for (let i = 0; i < vars.length; i++) { const v = vars[i]!; @@ -902,9 +1115,7 @@ export class CSSKeyframesAnimation extends Animation { keyframes: Map> | Record>, transform?: TransformFunction, ) { - this.unflatten = transform != null; - // TODO(MEDIUM): Require an explicit transform strategy instead of defaulting to instance transform. - transform ??= this.transform.bind(this); + transform = this.resolveTransform(transform); if (isObject(keyframes)) { keyframes = new Map(Object.entries(keyframes)); @@ -933,9 +1144,7 @@ export class CSSKeyframesAnimation extends Animation { propertyRegistry: Map = new Map(); fromString(keyframes: string, transform?: TransformFunction) { - this.unflatten = transform != null; - // TODO(MEDIUM): Require an explicit transform strategy instead of defaulting to instance transform. - transform ??= this.transform.bind(this); + transform = this.resolveTransform(transform); // Single grammar in value.js handles every input shape: // bare @keyframes, @property + @keyframes, .class + @@ -953,10 +1162,7 @@ export class CSSKeyframesAnimation extends Animation { ]), ) as Record; const tfText = resolved.timingFunctions.get(percent); - const resolvedTF = tfText - ? getTimingFunction(tfText as TimingFunctionNames) - : undefined; - this.addFrame(percent, frame as Partial, transform, resolvedTF); + this.addFrame(percent, frame as Partial, transform, tfText); } this.parse(); diff --git a/src/animation/format.ts b/src/animation/format.ts index 4167354..63cdf65 100644 --- a/src/animation/format.ts +++ b/src/animation/format.ts @@ -63,10 +63,15 @@ export function animationOptionsToString( const duration = reverseCSSTime(options.duration); css += ` animation-duration: ${duration};\n`; + // A CSS-twinned easing serializes as its faithful CSS string (a + // spring's `linear()`, a `cubic-bezier()` literal); otherwise reverse- + // look-up the callable in the registry, falling back to `linear`. let timingFunctionName = - Object.entries(timingFunctions) - .filter(([_name, func]) => func === options.timingFunction) - .map(([name]) => name)?.[0] ?? "linear"; + options.timingFunction.css ?? + (Object.entries(timingFunctions) + .filter(([_name, func]) => func === options.timingFunction.fn) + .map(([name]) => name)?.[0] ?? + "linear"); timingFunctionName = camelCaseToHyphen(timingFunctionName); diff --git a/src/animation/group.ts b/src/animation/group.ts index 5b556f5..eaf8296 100644 --- a/src/animation/group.ts +++ b/src/animation/group.ts @@ -1,11 +1,8 @@ -import { type ValueUnit } from "@mkbabb/value.js"; -import { - cancelAnimationFrame, - lerp, - requestAnimationFrame, -} from "./internal/leaves"; -import { prefersReducedMotion } from "./internal/reduced-motion"; +import { ValueUnit } from "@mkbabb/value.js"; +import { lerp } from "./internal/leaves"; +import { withReducedMotion } from "./internal/reduced-motion"; import { yieldToMain } from "./internal/scheduler"; +import { RAFPlayback } from "./playback"; import { Animation, getAnimationId } from "./engine"; import type { AnimationLayerConfig, @@ -14,16 +11,13 @@ import type { } from "./constants"; import { defaultLayerConfig } from "./constants"; -const isNumericCarrier = (value: unknown): value is { value: number } => { - if (typeof value !== "object" || value == null) { - return false; - } - - return ( - "value" in value && - typeof (value as { value?: unknown }).value === "number" - ); -}; +/** + * Typed blend-carrier guard — the group is heavy-side (it statically + * composes the engine), so the real `ValueUnit` class is available for an + * `instanceof` check instead of structural duck-typing on `{ value }`. + */ +const isNumericUnit = (value: unknown): value is ValueUnit => + value instanceof ValueUnit && typeof value.value === "number"; export interface AnimationGroupEntry { animation: Animation; @@ -69,14 +63,16 @@ export class AnimationGroup { lastTickTime: number = 0; - handleId: number | any = undefined; + /** THE rAF owner for the group's draw loop. */ + readonly playback = new RAFPlayback(); resolvePromise: ((value: void | PromiseLike) => void) | null = null; + private _playingPromise: Promise | null = null; /** - * Pre-bound draw callback — allocated once in constructor to avoid - * creating a new closure on every requestAnimationFrame reschedule. + * Pre-bound frame callback — allocated once in constructor to avoid + * creating a new closure on every playback loop start. */ - private _boundDraw: (t: number) => void; + private _boundFrame: (t: number) => Promise; /** * Cached entries array, sorted by layer zIndex. Rebuilt on demand @@ -86,7 +82,7 @@ export class AnimationGroup { private _entriesDirty = true; constructor(...inputs: (Animation | AnimationGroupInput)[]) { - this._boundDraw = this.draw.bind(this); + this._boundFrame = this._frame.bind(this); const animations: Animation[] = []; @@ -243,8 +239,8 @@ export class AnimationGroup { const incoming = val; // Accumulate numeric ValueUnit values if ( - isNumericCarrier(existing) && - isNumericCarrier(incoming) + isNumericUnit(existing) && + isNumericUnit(incoming) ) { existing.value = existing.value + incoming.value; @@ -267,8 +263,8 @@ export class AnimationGroup { const existing = groupedValues[key]; const incoming = val; if ( - isNumericCarrier(existing) && - isNumericCarrier(incoming) + isNumericUnit(existing) && + isNumericUnit(incoming) ) { existing.value = lerp( existing.value, @@ -393,15 +389,16 @@ export class AnimationGroup { } /** - * Main animation frame callback. Ticks all children, then renders + * One frame of the group's draw loop, driven by the shared + * `RAFPlayback.loop`. Ticks all children, then renders * (single-target: grouped blending; multi-target: per-child). - * Reschedules itself via rAF until done. + * Returns whether the loop should continue. */ - async draw(t: number) { + private async _frame(t: number): Promise { await this.tick(t); if (this.paused) { - return; + return false; } if (this.singleTarget) { @@ -416,45 +413,63 @@ export class AnimationGroup { } if (!this.done) { - this.handleId = requestAnimationFrame(this._boundDraw); - } else { - this.reset(); - if (this.resolvePromise) { - this.resolvePromise(); - } + return true; } + + // Completion: every child's `onEnd` already painted its rest frame + // per its fill contract, and the composite above rendered the + // blended result — settle is pure teardown, never a repaint. (The + // former completion-path `reset()` repainted frame 0, so a fadeIn + // group ended invisible — the quirk the rest-position contract + // retires.) + this.settle(); + this._resolvePlay(); + return false; + } + + private _resolvePlay() { + const resolve = this.resolvePromise; + this.resolvePromise = null; + resolve?.(); } /** * Start the animation group. Returns a promise that resolves * when all child animations complete (or on explicit stop/reset). + * Re-entrant: a `play()` while one is in flight returns the same + * promise rather than leaking a second draw loop. * * Under `respectReducedMotion` + an active `prefers-reduced-motion` * query, snaps every child to its final frame in a single composite — * no rAF draw loop — then settles exactly as a completed play would. */ - async play() { - if (this.respectReducedMotion && prefersReducedMotion()) { - return this._playReducedMotion(); - } - return new Promise((resolve) => { - this.resolvePromise = resolve; - this.handleId = requestAnimationFrame(this._boundDraw); + async play(): Promise { + if (this._playingPromise) return this._playingPromise; + + const result = withReducedMotion( + this.respectReducedMotion, + () => this._playReducedMotion(), + () => + new Promise((resolve) => { + this.resolvePromise = resolve; + this.playback.loop(this._boundFrame); + }), + ); + + this._playingPromise = result; + result.finally(() => { + this._playingPromise = null; }); + return result; } /** - * `prefers-reduced-motion` snap for the group: advance every child to its - * final frame, composite a single paint, then settle child + group state - * for replay — no rAF loop, no motion. The final frame STAYS on the - * target(s): reduced motion shows the END state, matching + * `prefers-reduced-motion` snap for the group: rest = final, paint it, + * settle — the SAME terminal path a completed play takes, with the + * motion elided. Every child advances to its final frame, one composite + * paints, and `settle()` (pure teardown, never a repaint) readies the + * group for replay. The final frame stays on the target(s), matching * `Animation._playReducedMotion`. - * - * Deliberately does NOT route through `reset()` — `reset()` repaints every - * child to frame 0 (`interpFrames(0, true)`, the fillBackwards - * cube-cutoff workaround), which would clobber the snapped final frame and - * leave, e.g., a `fadeIn` group invisible. The child `Animation.reset()` - * clears state flags only and does not repaint, so it is safe here. */ private _playReducedMotion(): Promise { this.onStart(); @@ -474,16 +489,7 @@ export class AnimationGroup { this.transformFramesGrouped(now); } - // Settle for replay WITHOUT reset()'s frame-0 repaint, so the final - // frame survives on the target(s). - for (const entry of this.getEntries()) { - entry.animation.managed = false; - entry.animation.reset(); - } - this.started = false; - this.done = false; - this.paused = false; - this.lastTickTime = 0; + this.settle(); return Promise.resolve(); } @@ -521,30 +527,30 @@ export class AnimationGroup { } if (this.paused) { - // Stop the rAF loop immediately — don't wait for draw() to self-terminate - cancelAnimationFrame(this.handleId); - this.handleId = undefined; + // Stop the loop immediately — don't wait for the frame callback + // to self-terminate + this.playback.stop(); // Render final frame so the visual matches the pause moment this.render(); } else { // Resume: restart the draw loop - this.handleId = requestAnimationFrame(this._boundDraw); + this.playback.loop(this._boundFrame); } return this; } - reset() { - // Apply fillBackwards first so targets snap to their initial frame - // before clearing animation state (prevents visual glitches like cube cutoff) - // TODO(HIGH): Remove visual-glitch workaround sequencing and define explicit reset/fill contract. + /** + * Pure state teardown — never paints. The group analogue of + * `Animation.settle()`: releases every child (`managed = false`, + * `child.settle()`) and clears the group's own playback flags. + * Completion and the reduced-motion snap both end here, leaving the + * rest frame (per each child's fill contract) on the target(s). + */ + settle() { for (const entry of this.getEntries()) { - const anim = entry.animation; - if (anim.started && anim.frames.length > 0) { - anim.interpFrames(0, true); - } - anim.managed = false; - anim.reset(); + entry.animation.managed = false; + entry.animation.settle(); } this.started = false; @@ -555,10 +561,33 @@ export class AnimationGroup { return this; } + /** + * Explicit rewind: paint every started child back to its INITIAL + * frame, then settle. This is the user-facing "return to start" — + * rest position `initial` painted deliberately, not a completion side + * effect. (Completion does NOT come here; it settles where the fill + * contract rested the pixels.) + */ + reset() { + for (const entry of this.getEntries()) { + const anim = entry.animation; + if (anim.started && anim.frames.length > 0) { + anim.interpFrames(0, true); + } + } + + return this.settle(); + } + + /** + * Halt the draw loop, rewind to the initial frame (the transport-stop + * semantic the demo's controls expect), and resolve any pending + * `play()` promise. + */ stop() { - cancelAnimationFrame(this.handleId); - this.handleId = undefined; + this.playback.stop(); this.reset(); + this._resolvePlay(); return this; } diff --git a/src/animation/index.ts b/src/animation/index.ts index 26a9cc1..93e8282 100644 --- a/src/animation/index.ts +++ b/src/animation/index.ts @@ -46,6 +46,12 @@ export type { MorphRect, ElementMorphOptions } from "./morph"; export { Timeline, ScrollTimeline, ManualTimeline } from "./timeline"; export type { TimelineOptions, ScrollTimelineOptions } from "./timeline"; export { RAFPlayback } from "./playback"; +export type { RAFPlaybackOptions, Tickable } from "./playback"; +// Easing construction at the boundary: `toEasing` normalizes a callable / +// typed Easing synchronously (value.js-free); `resolveEasing` resolves a +// string name through the dynamic engine boundary, fail-explicit. +export { resolveEasing, toEasing } from "./easing"; +export { AnimationOptionError, UnknownEasingError } from "./internal/errors"; // ── TYPE surface (erased; no runtime edge) ─────────────────────────────── // The animation-domain types consumers should prefer over redefining their @@ -55,6 +61,7 @@ export type { TimingFunction, TimingFunctionNames, TransformFunction, + Easing, AnimationOptions, InputAnimationOptions, TemplateAnimationFrame, diff --git a/src/animation/internal/css-easing.ts b/src/animation/internal/css-easing.ts deleted file mode 100644 index 56336c4..0000000 --- a/src/animation/internal/css-easing.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type { TimingFunction } from "../constants"; - -/** - * A `TimingFunction` is an opaque `(t) => number` closure — the WAAPI - * delegation path cannot recover a CSS easing string from it. When a closure - * HAS a faithful CSS representation, we tag it here so the compositor can run - * the real curve instead of falling back to bare `linear`. The mechanism is - * general (any CSS easing string — `linear()`, `cubic-bezier()`, `steps()`); - * today only `springTimingFunction` tags its closure (with a `linear()`). - * - * Value.js-free: only a `Symbol` + a type import (erased). Keeping it in - * `internal/` lets the LIGHT producer (`springTimingFunction`) and the HEAVY - * consumer (`waapi.ts`) share the tag without coupling their modules. - */ -const CSS_EASING = Symbol.for("keyframes.cssEasing"); - -/** Tag a `TimingFunction` with the CSS easing string (e.g. a `linear()`) that reproduces it. Returns the same closure. */ -export function tagCSSEasing(fn: F, css: string): F { - (fn as unknown as Record)[CSS_EASING] = css; - return fn; -} - -/** Read a `TimingFunction`'s CSS easing string tag, or `undefined` if it carries none. */ -export function getCSSEasing( - fn: TimingFunction | undefined, -): string | undefined { - if (typeof fn !== "function") return undefined; - const tagged = (fn as TimingFunction & Record)[CSS_EASING]; - return typeof tagged === "string" ? tagged : undefined; -} diff --git a/src/animation/internal/easing-resolvable.ts b/src/animation/internal/easing-resolvable.ts deleted file mode 100644 index 5d87167..0000000 --- a/src/animation/internal/easing-resolvable.ts +++ /dev/null @@ -1,127 +0,0 @@ -import type { TimingFunction, TimingFunctionNames } from "../constants"; - -/** Identity easing — the value.js-free fallback used before a named easing resolves. */ -const identity: TimingFunction = (t: number) => t; - -/** - * One shared resolver for the string-easing-name boundary seam. - * - * keyframes' light engines (`NumericAnimation`, `ElementMorph`, the - * `Timeline` family) accept easing as EITHER a callable `TimingFunction` - * (value.js-free, used directly) OR a string easing *name* from value.js's - * registry. A name can only be resolved through the heavy engine — value.js - * owns the easing registry — so resolution rides the dynamic - * `import("../engine")` boundary: the ONLY value.js edge, taken once, - * lazily, when a named easing is actually used. - * - * This collapses the formerly hand-rolled copies of that dance (one in - * `numeric.ts`, one in `timeline.ts`; `morph.ts` delegates to `numeric`) - * into a single contract: - * - * - **callable easing** → resolved synchronously at construction; `.fn` is - * the callable, `.ready()` is a no-op, nothing is imported. - * - **string name** → `.fn` is the identity fallback until resolution lands. - * Resolution is kicked off EAGERLY in the constructor (fire-and-forget), - * so by the first `.play()` / the next frame it is almost always already - * resolved. `.ready()` awaits it for the rare consumer that needs the - * eased value on the very first synchronous `.at()`. - * - * Value.js-free: this module imports value.js NOWHERE statically — only the - * dynamic `import("../engine")` inside `ready()` reaches it, so a light-only - * consumer's static graph never pulls value.js. (`import type` above is - * erased under `verbatimModuleSyntax`.) - */ -export class EasingResolvable { - private _fn: TimingFunction; - private _pendingName: TimingFunctionNames | null = null; - private _ready: Promise | null = null; - private readonly _onResolved: ((fn: TimingFunction) => void) | undefined; - private _warned = false; - - /** - * @param easing callable `TimingFunction`, string easing *name*, or omitted (identity). - * @param onResolved invoked once when a pending name resolves — for consumers - * that cache the easing by value (e.g. `NumericAnimation` - * rebuilds its segments). Consumers that read `.fn` live - * each frame (e.g. `Timeline`) need no callback. - */ - constructor( - easing: TimingFunction | TimingFunctionNames | undefined, - onResolved?: (fn: TimingFunction) => void, - ) { - this._onResolved = onResolved; - - if (typeof easing === "function") { - // Callable — used directly. No engine load, value.js-free path. - this._fn = easing; - } else if (typeof easing === "string") { - // String name — identity fallback until resolved through the - // engine boundary. Eager-resolve now (fire-and-forget) so the - // named curve lands by the first frame, shrinking the - // silent-fallback window to a same-tick synchronous `.at()`. - this._fn = identity; - this._pendingName = easing; - void this.ready(); - } else { - this._fn = identity; - } - } - - /** The current easing — the resolved callable, or the identity fallback while a name is pending. */ - get fn(): TimingFunction { - return this._fn; - } - - /** True while a string easing name has not yet resolved through the engine. */ - get pending(): boolean { - return this._pendingName !== null; - } - - /** - * Resolve a pending string easing name through the dynamic engine - * boundary. Memoized — the `await import("../engine")` and - * `getTimingFunction` lookup run at most once. A no-op (resolved promise) - * for a callable / omitted easing. - */ - ready(): Promise { - if (this._pendingName === null) return Promise.resolve(); - if (this._ready) return this._ready; - - const name = this._pendingName; - // Direct dynamic import of the engine module — the ONLY value.js - // edge, reached only when a named easing is actually used. - this._ready = import("../engine").then((engine) => { - const resolved = engine.getTimingFunction(name); - if (resolved) { - this._fn = resolved; - this._onResolved?.(resolved); - } - this._pendingName = null; - }); - return this._ready; - } - - /** - * Dev-only signal for the residual window: a synchronous read of the - * easing (a stateless `.at()` / `tick()`) while a name is still pending - * means the caller is interpolating with the identity fallback, not the - * named curve. Warns ONCE per instance (every-frame noise is useless). - * - * Stripped from the published bundle by the production - * `esbuild.drop: ["console"]`, so it is genuinely dev-only — a - * browser-timing degradation hint, not a library-internal contract - * violation (those throw). The primary remediation is the eager-resolve - * above; this only surfaces the rare same-tick synchronous access. - */ - warnIfPending(context: string): void { - if (this._pendingName !== null && !this._warned) { - this._warned = true; - console.warn( - `[keyframes] ${context}: easing "${this._pendingName}" is still ` + - `resolving — interpolating with the identity fallback until it ` + - `lands. \`await .ready()\` before the first synchronous \`.at()\` ` + - `to interpolate with the named curve from the first frame.`, - ); - } - } -} diff --git a/src/animation/internal/errors.ts b/src/animation/internal/errors.ts new file mode 100644 index 0000000..139c1dd --- /dev/null +++ b/src/animation/internal/errors.ts @@ -0,0 +1,71 @@ +/** + * Typed option-validation errors — the fail-explicit seam. + * + * The engine's option setters and the light engines' easing inputs THROW on + * malformed input rather than silently defaulting or no-oping — the posture + * the layer API already chose ("silent no-ops were hiding consumer bugs", + * `group.ts` setLayerConfig). Defaulting happens only for genuine + * `undefined`: an omitted option means "use the default"; a + * present-but-malformed option is a consumer bug and surfaces as one of + * these. + * + * Value.js-free: light modules import these without touching the boundary. + */ + +const repr = (value: unknown): string => { + if (typeof value === "string") return JSON.stringify(value); + if (typeof value === "function") { + return `[function ${(value as { name?: string }).name || "anonymous"}]`; + } + return String(value); +}; + +/** Thrown when an animation option receives malformed (non-undefined) input. */ +export class AnimationOptionError extends Error { + readonly option: string; + readonly value: unknown; + + constructor(option: string, value: unknown, reason: string) { + super( + `Invalid value for animation option "${option}": ` + + `${repr(value)} — ${reason}`, + ); + this.name = "AnimationOptionError"; + this.option = option; + this.value = value; + } +} + +/** Thrown when a string easing name cannot be resolved through the registry. */ +export class UnknownEasingError extends Error { + readonly easingName: string; + + constructor(easingName: string) { + super( + `Unknown easing name ${repr(easingName)} — not a value.js ` + + `registry entry or cubic-bezier() literal. Pass a callable ` + + `TimingFunction (or a typed Easing), or resolve the name ` + + `first via \`await resolveEasing(name)\`.`, + ); + this.name = "UnknownEasingError"; + this.easingName = easingName; + } +} + +/** + * Parse-or-throw seam for option setters: `parse` returns the parsed value + * or `undefined` for malformed input, which converts to a thrown + * `AnimationOptionError` carrying the option name + offending value. + */ +export function parseOption( + option: string, + raw: unknown, + parse: (raw: unknown) => T | undefined, + reason: string, +): T { + const parsed = parse(raw); + if (parsed === undefined) { + throw new AnimationOptionError(option, raw, reason); + } + return parsed; +} diff --git a/src/animation/internal/reduced-motion.ts b/src/animation/internal/reduced-motion.ts index 619fba7..955e66c 100644 --- a/src/animation/internal/reduced-motion.ts +++ b/src/animation/internal/reduced-motion.ts @@ -29,3 +29,22 @@ export function prefersReducedMotion(): boolean { } return window.matchMedia("(prefers-reduced-motion: reduce)").matches; } + +/** + * THE reduced-motion gate — every play path in the engine routes through + * this one contract instead of hand-writing the + * `if (respect && prefersReducedMotion()) …` dance per surface. + * + * `snap` is the surface's one-line "jump to the terminal state, emit once, + * no loop" closure; `run` is its normal animated path. Detection was + * unified by `prefersReducedMotion()`; this unifies the *response* so the + * seven formerly hand-written snap bodies (which had already drifted — + * one carried a repaint bug) collapse to per-surface one-liners. + */ +export function withReducedMotion( + respect: boolean | undefined, + snap: () => T, + run: () => T, +): T { + return respect && prefersReducedMotion() ? snap() : run(); +} diff --git a/src/animation/internal/scheduler.ts b/src/animation/internal/scheduler.ts index df34736..f4d042a 100644 --- a/src/animation/internal/scheduler.ts +++ b/src/animation/internal/scheduler.ts @@ -14,10 +14,29 @@ /** * Yield to the main thread, resolving on the next scheduler turn. * - * Strategy is feature-detected per call (a cheap check) rather than cached, - * so the active scheduler is always honored: native `scheduler.yield()` → - * `MessageChannel` macrotask → `setTimeout(0)`. + * The native `scheduler.yield` is probed LIVE on each call (two cheap + * checks) — a polyfill or late-installed scheduler is always honored. + * The fallback choice (`MessageChannel` vs `setTimeout`) IS cached: those + * capabilities are fixed for the environment's lifetime, so re-detecting + * them on every yield of a large batched group is pure overhead. */ +let fallback: (() => Promise) | null = null; + +const detectFallback = (): (() => Promise) => { + if (typeof MessageChannel === "function") { + return () => + new Promise((resolve) => { + const channel = new MessageChannel(); + channel.port1.onmessage = () => { + channel.port1.close(); + resolve(); + }; + channel.port2.postMessage(undefined); + }); + } + return () => new Promise((resolve) => setTimeout(resolve, 0)); +}; + export function yieldToMain(): Promise { const scheduler = ( globalThis as { scheduler?: { yield?: () => Promise } } @@ -25,15 +44,6 @@ export function yieldToMain(): Promise { if (scheduler && typeof scheduler.yield === "function") { return scheduler.yield(); } - if (typeof MessageChannel === "function") { - return new Promise((resolve) => { - const channel = new MessageChannel(); - channel.port1.onmessage = () => { - channel.port1.close(); - resolve(); - }; - channel.port2.postMessage(undefined); - }); - } - return new Promise((resolve) => setTimeout(resolve, 0)); + fallback ??= detectFallback(); + return fallback(); } diff --git a/src/animation/morph.ts b/src/animation/morph.ts index 45df43c..9ef64a3 100644 --- a/src/animation/morph.ts +++ b/src/animation/morph.ts @@ -1,5 +1,5 @@ import { NumericAnimation } from "./numeric"; -import type { TimingFunction, TimingFunctionNames } from "./constants"; +import type { Easing, TimingFunction } from "./constants"; export interface MorphRect { x: number; @@ -10,13 +10,12 @@ export interface MorphRect { export interface ElementMorphOptions { /** - * Easing as a callable `TimingFunction`, OR a string easing *name* - * from value.js's registry (`"ease-out-cubic"`, `"easeOutCubic"`, …). - * `ElementMorph` composes `NumericAnimation`, so a callable keeps the - * path value.js-free while a string name resolves LAZILY through the - * dynamic engine boundary on the first `.play()` (or `await .ready()`). + * Easing as a callable `TimingFunction` or a typed `Easing` — + * synchronous and value.js-free (`ElementMorph` composes + * `NumericAnimation`, which enforces the same contract). Resolve a + * string name first via `await resolveEasing(name)`. */ - timingFunction?: TimingFunction | TimingFunctionNames; + timingFunction?: TimingFunction | Easing; /** Playback duration in milliseconds. Required for `.play()`. */ duration?: number; transformOrigin?: string; @@ -49,7 +48,7 @@ const toRect = (source: HTMLElement | MorphRect): MorphRect => { export class ElementMorph { private animation!: NumericAnimation; private transformOrigin: string; - private timingFunction: TimingFunction | TimingFunctionNames | undefined; + private timingFunction: TimingFunction | Easing | undefined; private duration: number; constructor( @@ -84,17 +83,6 @@ export class ElementMorph { return this; } - /** - * Resolve a pending string easing *name* through the dynamic engine - * boundary. No-op for callable / omitted easing. Stateless `.at()` / - * `.toCSSTransform()` consumers that pass a name can `await .ready()` - * first to interpolate with the resolved easing; `.play()` awaits it - * automatically before the first frame. - */ - ready(): Promise { - return this.animation.ready(); - } - /** Get raw transform values at the given progress [0, 1]. */ at(progress: number): MorphValues { return this.animation.at(progress); diff --git a/src/animation/numeric.ts b/src/animation/numeric.ts index 9f852ac..6382b1e 100644 --- a/src/animation/numeric.ts +++ b/src/animation/numeric.ts @@ -1,8 +1,9 @@ +import { toEasing } from "./easing"; import { binarySearchRange } from "./internal/binarySearch"; -import { EasingResolvable } from "./internal/easing-resolvable"; +import { AnimationOptionError } from "./internal/errors"; import { clamp, lerp, scale } from "./internal/leaves"; import { RAFPlayback } from "./playback"; -import type { TimingFunction, TimingFunctionNames } from "./constants"; +import type { Easing, TimingFunction } from "./constants"; interface NumericSegment> { startPos: number; @@ -15,24 +16,19 @@ interface NumericSegment> { export interface NumericAnimationOptions { /** - * Easing as a callable `TimingFunction`, OR a string easing *name* - * from value.js's registry (`"ease-out-cubic"`, `"easeOutCubic"`, - * `"linear"`, …). + * Easing as a callable `TimingFunction` or a typed `Easing` — both + * synchronous and value.js-free, so this engine never touches the + * dynamic boundary. * - * A **callable** is used directly and keeps this engine value.js-free — - * no dynamic import, nothing pulled into the static graph. + * A string easing *name* is NOT accepted here (fail-explicit: it + * throws). Resolve a name once, up front, through the async factory: * - * A **string name** is resolved through the dynamic engine boundary via - * the shared `EasingResolvable` contract: resolution is kicked off - * EAGERLY at construction (an `await import("./engine")` looks the name - * up via `getTimingFunction`), so the value.js-bearing easing registry - * loads only when a named easing is actually used and the named curve - * lands by the first frame. Until it lands, `.at()` interpolates with the - * identity fallback and emits a one-time dev-only warning; `await - * .ready()` first to interpolate with the named curve from the very first - * synchronous `.at()`. + * ```ts + * const easing = await resolveEasing("easeOutCubic"); + * new NumericAnimation(frames, { timingFunction: easing }); + * ``` */ - timingFunction?: TimingFunction | TimingFunctionNames | undefined; + timingFunction?: TimingFunction | Easing | undefined; /** Playback duration in milliseconds. Required for `.play()`. */ duration?: number | undefined; /** Explicit positions as percentages [0-100]. Auto-distributes if omitted. */ @@ -74,10 +70,9 @@ export class NumericAnimation> { private _duration: number; private _respectReducedMotion: boolean; - // The one shared string-easing-name resolver (eager-resolve + memoized - // `.ready()` + dev-warn + identity fallback). Holds the live easing the - // segments capture by value; rebuilds them on resolution via the callback. - private _easing: EasingResolvable; + // The resolved easing callable — synchronous from construction. The + // linear default mirrors CSS `linear`: interpolation without easing. + private _easingFn: TimingFunction; // Shared rAF lifecycle for `.play()` / `.stop()`. private _playback = new RAFPlayback(); @@ -91,13 +86,19 @@ export class NumericAnimation> { this._duration = options?.duration ?? 0; this._respectReducedMotion = options?.respectReducedMotion ?? false; - // Segments capture the easing by value at build time, so a resolved - // name must rebuild them. Eager-resolve is kicked off inside the - // resolver's constructor; the callback fires on the later microtask - // once `this.segments` already exists (the import is always async). - this._easing = new EasingResolvable(options?.timingFunction, () => { - this.segments = this.buildSegments(); - }); + const easing = options?.timingFunction; + if (typeof easing === "string") { + // Fail-explicit: a string name needs the async registry — + // never a silent identity fallback. + throw new AnimationOptionError( + "timingFunction", + easing, + "NumericAnimation accepts a callable TimingFunction or a " + + "typed Easing; resolve a string name first via " + + "`await resolveEasing(name)`.", + ); + } + this._easingFn = easing == null ? (t) => t : toEasing(easing).fn; if (options?.positions) { if (options.positions.length !== keyframes.length) { @@ -137,26 +138,10 @@ export class NumericAnimation> { keys, startVals: keys.map((k) => start[k] as number), stopVals: keys.map((k) => stop[k] as number), - timingFunction: this._easing.fn, + timingFunction: this._easingFn, }; } - /** - * Resolve a pending string easing *name* through the dynamic engine - * boundary. A no-op (resolved promise) when easing was supplied as a - * callable or omitted. Memoized via the shared `EasingResolvable` — the - * `await import("./engine")` and `getTimingFunction` lookup run at most - * once per instance. - * - * Resolution is already kicked off eagerly at construction; `.play()` - * awaits this before the first frame, and stateless `.at()` consumers - * that pass a name can `await animation.ready()` first to interpolate - * with the resolved easing rather than the identity fallback. - */ - ready(): Promise { - return this._easing.ready(); - } - /** * Map [0, 1] progress to interpolated values. Zero allocation — * returns the same pre-allocated result object on every call. @@ -165,10 +150,6 @@ export class NumericAnimation> { * last segment if progress is past the final stop position. */ at(progress: number): T { - // A synchronous `.at()` while a string easing name is still resolving - // interpolates with the identity fallback — surface it once in dev. - this._easing.warnIfPending("NumericAnimation.at()"); - const p = clamp(progress, 0, 1) * 100; // O(log N) segment lookup @@ -239,10 +220,6 @@ export class NumericAnimation> { onFrame?: NumericFrameCallback, duration?: number, ): Promise { - // Resolve a pending string easing name before the first frame. - // No-op (and no engine load) for callable / undefined easing. - await this.ready(); - const dur = duration ?? this._duration; // Reduced-motion snap (snap to final keyframe, no rAF loop) is owned // by the shared RAFPlayback gate — passed through, not re-implemented. diff --git a/src/animation/playback.ts b/src/animation/playback.ts index a90e7a6..102cb00 100644 --- a/src/animation/playback.ts +++ b/src/animation/playback.ts @@ -3,7 +3,7 @@ import { clamp, requestAnimationFrame, } from "./internal/leaves"; -import { prefersReducedMotion } from "./internal/reduced-motion"; +import { withReducedMotion } from "./internal/reduced-motion"; /** Per-playback options for {@link RAFPlayback.play}. */ export interface RAFPlaybackOptions { @@ -23,15 +23,35 @@ export interface RAFPlaybackOptions { } /** - * Shared rAF playback lifecycle for stateless interpolators - * (`NumericAnimation`, `ElementMorph`). Owns the rAF handle, start - * timestamp, resolve callback, AND the `prefers-reduced-motion` gate so the - * interpolator classes don't each reimplement the same loop or the same - * reduced-motion snap. + * A dt-driven stepper the {@link RAFPlayback.drive} loop can own: + * `SmoothProgress` and `SpringProgress` implement it directly. The driver + * steps `tickDt(dt)` once per frame until `settled` flips true. + */ +export interface Tickable { + /** Advance the stepper by `dt` milliseconds. */ + tickDt(dt: number): void; + /** True when the stepper has converged — the driver stops the loop. */ + readonly settled: boolean; +} + +/** + * THE managed rAF driver. Owns the rAF handle, start timestamp, dt clock, + * and resolve callback for every loop in the engine, in three shapes: + * + * - {@link play} — duration-based progress loop (`NumericAnimation`, + * `ElementMorph`), with the light reduced-motion snap gate built in. + * - {@link drive} — settle-based dt loop over a {@link Tickable} + * (`SmoothProgress`, `SpringProgress`): steps until the stepper settles, + * auto-stopping; idempotent so target re-seats can re-arm it. + * - {@link loop} — self-rescheduling frame loop over an async callback + * (`Animation`, `AnimationGroup`, the WAAPI shadow tick): the callback + * returns `true` to continue; rescheduling waits for the (possibly + * async) callback to complete, so a slow frame never double-schedules. * - * Not used by the full `Animation` class — that engine has a richer - * lifecycle (iteration, direction, fill modes, events) that doesn't - * factor into this primitive; it carries its own reduced-motion snap. + * The formerly hand-rolled copies of this lifecycle — `SmoothProgress` / + * `SpringProgress` `_startLoop`/`_stopLoop` byte-siblings, the + * `AnimationGroup` draw loop, `Animation._playRAF`, and the WAAPI shadow + * loop — all delegate here. No other module owns a rAF handle. */ export class RAFPlayback { // `requestAnimationFrame` returns `number` in browsers but the @@ -40,8 +60,14 @@ export class RAFPlayback { // `NodeJS.Timeout`. Either suffices as an opaque cancel handle. private _rafId: ReturnType | null = null; private _startTime: number | undefined = undefined; + private _lastFrameT: number = 0; private _resolve: (() => void) | null = null; + /** True while this driver owns a scheduled rAF callback. */ + get running(): boolean { + return this._rafId !== null; + } + /** * Drive `onTick(progress)` once per frame for `duration` ms. * `progress` is clamped to [0, 1]; the loop terminates after the @@ -64,37 +90,89 @@ export class RAFPlayback { this.stop(); - // Reduced-motion: snap to the final frame in a single paint. - if (options?.respectReducedMotion && prefersReducedMotion()) { - onTick(1); - return Promise.resolve(); - } + return withReducedMotion( + options?.respectReducedMotion, + // Reduced-motion: snap to the final frame in a single paint. + () => { + onTick(1); + return Promise.resolve(); + }, + () => + new Promise((resolve) => { + this._resolve = resolve; + this._startTime = undefined; - return new Promise((resolve) => { - this._resolve = resolve; - this._startTime = undefined; + const tick = (now: number) => { + if (this._startTime === undefined) + this._startTime = now; + const progress = clamp( + (now - this._startTime) / duration, + 0, + 1, + ); + onTick(progress); - const tick = (now: number) => { - if (this._startTime === undefined) this._startTime = now; - const progress = clamp( - (now - this._startTime) / duration, - 0, - 1, - ); - onTick(progress); + if (progress < 1) { + this._rafId = requestAnimationFrame(tick); + } else { + this._cleanup(); + } + }; - if (progress < 1) { this._rafId = requestAnimationFrame(tick); - } else { + }), + ); + } + + /** + * Drive a {@link Tickable}'s dt-stepper once per frame until it + * settles, invoking `onFrame` after each step. Idempotent — a call + * while the loop is already running is a no-op, so consumers re-arm + * freely on every target re-seat. The loop auto-stops on settle. + */ + drive(tickable: Tickable, onFrame?: () => void): void { + if (this._rafId !== null) return; + this._lastFrameT = 0; + + const frame = (now: number): void => { + const dt = this._lastFrameT ? now - this._lastFrameT : 16.667; + this._lastFrameT = now; + tickable.tickDt(dt); + onFrame?.(); + if (tickable.settled) { + this._cleanup(); + return; + } + this._rafId = requestAnimationFrame(frame); + }; + + this._rafId = requestAnimationFrame(frame); + } + + /** + * Self-rescheduling frame loop over an async callback. `cb(now)` + * returns `true` to continue; the next frame is scheduled only after + * the callback (and any awaited work inside it) completes. `stop()` + * between frames halts the loop — the in-flight callback finishes, + * no further frame is scheduled. + */ + loop(cb: (now: number) => boolean | Promise): void { + this.stop(); + + const frame = (now: number): void => { + void Promise.resolve(cb(now)).then((cont) => { + if (cont && this._rafId !== null) { + this._rafId = requestAnimationFrame(frame); + } else if (!cont) { this._cleanup(); } - }; + }); + }; - this._rafId = requestAnimationFrame(tick); - }); + this._rafId = requestAnimationFrame(frame); } - /** Cancel a running playback. The play promise resolves immediately. */ + /** Cancel a running playback. A pending play promise resolves immediately. */ stop(): void { if (this._rafId !== null) { cancelAnimationFrame(this._rafId); @@ -105,6 +183,7 @@ export class RAFPlayback { private _cleanup(): void { this._rafId = null; this._startTime = undefined; + this._lastFrameT = 0; const resolve = this._resolve; this._resolve = null; resolve?.(); diff --git a/src/animation/renderer.ts b/src/animation/renderer.ts deleted file mode 100644 index 1d0f3a7..0000000 --- a/src/animation/renderer.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { Vars } from "./constants"; -import { transformTargetsStyle } from "./utils"; - -/** - * Maps interpolated values onto targets each frame. The default - * renderer writes inline styles via `transformTargetsStyle`; custom - * renderers (e.g. canvas, WebGL) replace it by passing a custom - * `transform` to the Animation constructor. - */ -export type Renderer = (vars: V, t: number) => void; - -/** - * Symbol used to tag the default DOM-style renderer. WAAPI eligibility - * inspects this marker to detect whether the user supplied a custom - * transform — function-identity comparison is fragile under bundling - * and re-imports, so we use a globally-shared Symbol. - */ -export const DEFAULT_RENDERER = Symbol.for("keyframes.defaultRenderer"); - -/** - * Create the default DOM-style renderer for `targets`. Tagged with - * `DEFAULT_RENDERER` so the WAAPI driver can recognise it. - */ -export const createDOMStyleRenderer = ( - targets: HTMLElement[], -): Renderer => { - const fn: Renderer = (vars, _t) => - transformTargetsStyle(vars, targets); - (fn as any)[DEFAULT_RENDERER] = true; - return fn; -}; - -/** Type guard: is this the default DOM-style renderer? */ -export const isDefaultRenderer = (fn: unknown): boolean => - typeof fn === "function" && (fn as any)[DEFAULT_RENDERER] === true; diff --git a/src/animation/smooth.ts b/src/animation/smooth.ts index fae631f..846f69f 100644 --- a/src/animation/smooth.ts +++ b/src/animation/smooth.ts @@ -1,5 +1,5 @@ -import { cancelAnimationFrame, requestAnimationFrame } from "./internal/leaves"; -import { prefersReducedMotion } from "./internal/reduced-motion"; +import { withReducedMotion } from "./internal/reduced-motion"; +import { RAFPlayback } from "./playback"; export interface SmoothProgressOptions { /** Damping factor (0, 1]. Higher = faster convergence. Default 0.1 */ @@ -46,13 +46,12 @@ export class SmoothProgress { private currentValue: number; private isSettled: boolean; - // Managed rAF lifecycle for `.play()` / `.stop()`. Symmetric with - // `NumericAnimation.play(onFrame)`: the engine owns the loop so - // consumers never reimplement rAF glue. Auto-stops on settle; + // Managed playback for `.play()` / `.stop()` — loop ownership delegates + // to the shared RAFPlayback driver (this class is a pure stepper: it + // implements `Tickable` via `tickDt`/`settled`). Auto-stops on settle; // `setTarget()` while `onFrame` is attached and the loop is idle // auto-resumes the loop. - private _rafId: ReturnType | null = null; - private _lastFrameT: number = 0; + private _playback = new RAFPlayback(); private _onFrame: SmoothFrameCallback | undefined = undefined; constructor(options?: Partial) { @@ -81,24 +80,28 @@ export class SmoothProgress { const delta = Math.abs(target - this.targetValue); if (delta > 0 && delta >= this.options.targetEpsilon) { this.targetValue = target; - // Reduced-motion: snap directly to target rather than damping. - // The settled state stays true and any bound `onFrame` fires - // once with the new value. - if (this.options.respectReducedMotion && prefersReducedMotion()) { - this.currentValue = target; - this.isSettled = true; - this._onFrame?.(target); - return; - } - this.isSettled = false; - // Auto-resume the managed loop if `.play()` attached a - // callback and the loop has idled after a prior settle. - if (this._onFrame && this._rafId === null) { - this._startLoop(); - } + withReducedMotion( + this.options.respectReducedMotion, + // Snap directly to target — settled stays true, any bound + // `onFrame` fires once with the new value, no loop. + () => this._snapSettled(), + () => { + this.isSettled = false; + // Auto-resume the managed loop if `.play()` attached a + // callback and the loop idled after a prior settle. + if (this._onFrame) this._startLoop(); + }, + ); } } + /** Reduced-motion snap: jump to target, settle, emit once. */ + private _snapSettled(): void { + this.currentValue = this.targetValue; + this.isSettled = true; + this._onFrame?.(this.currentValue); + } + /** Advance one step using fixed damping. Returns current value. */ tick(): number { if (this.isSettled) return this.currentValue; @@ -147,7 +150,7 @@ export class SmoothProgress { snap(): void { this.currentValue = this.targetValue; this.isSettled = true; - this._stopLoop(); + this._playback.stop(); } /** Reset to a specific value (default 0). */ @@ -156,7 +159,7 @@ export class SmoothProgress { this.targetValue = v; this.currentValue = v; this.isSettled = true; - this._stopLoop(); + this._playback.stop(); } /** @@ -173,19 +176,18 @@ export class SmoothProgress { */ play(onFrame?: SmoothFrameCallback): void { this._onFrame = onFrame; - // Reduced-motion: short-circuit to immediate target snap. No rAF - // loop spawned; the callback fires once with the target value. - if (this.options.respectReducedMotion && prefersReducedMotion()) { - this.currentValue = this.targetValue; - this.isSettled = true; - onFrame?.(this.currentValue); - return; - } - if (this.isSettled) { - onFrame?.(this.currentValue); - return; - } - this._startLoop(); + withReducedMotion( + this.options.respectReducedMotion, + // Short-circuit to an immediate target snap — one emit, no loop. + () => this._snapSettled(), + () => { + if (this.isSettled) { + onFrame?.(this.currentValue); + return; + } + this._startLoop(); + }, + ); } /** @@ -194,31 +196,15 @@ export class SmoothProgress { */ stop(): void { this._onFrame = undefined; - this._stopLoop(); + this._playback.stop(); } + /** + * Arm the shared driver: it steps `tickDt(dt)` once per frame until + * `settled` flips true, emitting `onFrame` per step. Idempotent — + * the driver no-ops while already running. + */ private _startLoop(): void { - if (this._rafId !== null) return; - this._lastFrameT = 0; - const frame = (now: number): void => { - const dt = this._lastFrameT ? now - this._lastFrameT : 16.667; - this._lastFrameT = now; - const v = this.tickDt(dt); - this._onFrame?.(v); - if (this.isSettled) { - this._stopLoop(); - return; - } - this._rafId = requestAnimationFrame(frame); - }; - this._rafId = requestAnimationFrame(frame); - } - - private _stopLoop(): void { - if (this._rafId !== null) { - cancelAnimationFrame(this._rafId); - this._rafId = null; - } - this._lastFrameT = 0; + this._playback.drive(this, () => this._onFrame?.(this.currentValue)); } } diff --git a/src/animation/spring.ts b/src/animation/spring.ts index 4414374..ca8cb81 100644 --- a/src/animation/spring.ts +++ b/src/animation/spring.ts @@ -1,5 +1,5 @@ -import { cancelAnimationFrame, requestAnimationFrame } from "./internal/leaves"; -import { prefersReducedMotion } from "./internal/reduced-motion"; +import { withReducedMotion } from "./internal/reduced-motion"; +import { RAFPlayback } from "./playback"; /** * iOS-style spring physics options. The pair `(response, dampingFraction)` @@ -103,10 +103,11 @@ export class SpringProgress { private subscribers: Set = new Set(); private disposed: boolean = false; - // Managed rAF lifecycle for `.play()` / `.stop()`. Symmetric with + // Managed playback for `.play()` / `.stop()` — loop ownership delegates + // to the shared RAFPlayback driver (this class is a pure stepper: it + // implements `Tickable` via `tickDt`/`settled`). Symmetric with // `SmoothProgress.play(onFrame)`. - private _rafId: ReturnType | null = null; - private _lastFrameT: number = 0; + private _playback = new RAFPlayback(); private _onFrame: SpringFrameCallback | undefined = undefined; constructor(options?: Partial) { @@ -166,29 +167,33 @@ export class SpringProgress { private reseatTarget(target: number): void { this.targetValue = target; - // Reduced-motion: snap to target with zero velocity. - if (this.options.respectReducedMotion && prefersReducedMotion()) { - this.currentValue = target; - this.currentVelocity = 0; - this.isSettled = true; - this.originValue = target; - this.originVelocity = 0; - this.elapsed = 0; - this.emit(); - this._stopLoop(); - return; - } + withReducedMotion( + this.options.respectReducedMotion, + // Snap to target with zero velocity — one emit, no loop. + () => this._snapSettled(), + () => { + // Re-seat origin to current state; reset elapsed clock. + this.originValue = this.currentValue; + this.originVelocity = this.currentVelocity; + this.elapsed = 0; + this.isSettled = false; + + // Auto-resume the managed loop if `.play()` attached a callback. + if (this._onFrame) this._startLoop(); + }, + ); + } - // Re-seat origin to current state; reset elapsed clock. - this.originValue = this.currentValue; - this.originVelocity = this.currentVelocity; + /** Reduced-motion snap: jump to target at zero velocity, settle, emit once. */ + private _snapSettled(): void { + this.currentValue = this.targetValue; + this.currentVelocity = 0; + this.originValue = this.targetValue; + this.originVelocity = 0; this.elapsed = 0; - this.isSettled = false; - - // Auto-resume the managed loop if `.play()` attached a callback. - if (this._onFrame && this._rafId === null) { - this._startLoop(); - } + this.isSettled = true; + this.emit(); + this._playback.stop(); } /** @@ -208,6 +213,15 @@ export class SpringProgress { return this.currentValue; } + /** + * Millisecond-clock sibling of {@link tick} — the {@link Tickable} + * surface the shared `RAFPlayback.drive` loop steps. The spring math is + * in seconds; rAF (and the driver) deal in milliseconds. + */ + tickDt(dt: number): number { + return this.tick(dt / 1000); + } + /** * Evaluate the solver at elapsed time `t` (seconds) from the most * recent target re-seat. Equivalent to `tick(t - elapsed)` but @@ -297,14 +311,7 @@ export class SpringProgress { /** Immediately set value = target, zero velocity. */ snap(): void { - this.currentValue = this.targetValue; - this.currentVelocity = 0; - this.originValue = this.targetValue; - this.originVelocity = 0; - this.elapsed = 0; - this.isSettled = true; - this.emit(); - this._stopLoop(); + this._snapSettled(); } /** Reset position + velocity to a specified value (default 0). */ @@ -319,7 +326,7 @@ export class SpringProgress { this.elapsed = 0; this.isSettled = vel === 0; this.emit(); - this._stopLoop(); + this._playback.stop(); } // ── Subscribe / dispose ────────────────────────────────────────── @@ -346,7 +353,7 @@ export class SpringProgress { /** Tear down the spring. Cancels the rAF loop and clears subscribers. */ dispose(): void { this.disposed = true; - this._stopLoop(); + this._playback.stop(); this.subscribers.clear(); } @@ -362,49 +369,34 @@ export class SpringProgress { play(onFrame?: SpringFrameCallback): void { if (this.disposed) return; this._onFrame = onFrame; - if (this.options.respectReducedMotion && prefersReducedMotion()) { - this.currentValue = this.targetValue; - this.currentVelocity = 0; - this.isSettled = true; - onFrame?.(this.currentValue, this.currentVelocity); - return; - } - if (this.isSettled) { - onFrame?.(this.currentValue, this.currentVelocity); - return; - } - this._startLoop(); + withReducedMotion( + this.options.respectReducedMotion, + // Snap to target at zero velocity — one emit, no loop. + () => this._snapSettled(), + () => { + if (this.isSettled) { + onFrame?.(this.currentValue, this.currentVelocity); + return; + } + this._startLoop(); + }, + ); } /** Cancel the managed rAF loop and detach the per-frame callback. */ stop(): void { this._onFrame = undefined; - this._stopLoop(); + this._playback.stop(); } + /** + * Arm the shared driver: it steps `tickDt(dt)` once per frame until + * `settled` flips true, emitting `onFrame` per step. Idempotent — + * the driver no-ops while already running. + */ private _startLoop(): void { - if (this._rafId !== null) return; - this._lastFrameT = 0; - const frame = (now: number): void => { - const dtMs = this._lastFrameT ? now - this._lastFrameT : 16.667; - this._lastFrameT = now; - // Spring math is in seconds; rAF gives milliseconds. - this.tick(dtMs / 1000); - this._onFrame?.(this.currentValue, this.currentVelocity); - if (this.isSettled) { - this._stopLoop(); - return; - } - this._rafId = requestAnimationFrame(frame); - }; - this._rafId = requestAnimationFrame(frame); - } - - private _stopLoop(): void { - if (this._rafId !== null) { - cancelAnimationFrame(this._rafId); - this._rafId = null; - } - this._lastFrameT = 0; + this._playback.drive(this, () => + this._onFrame?.(this.currentValue, this.currentVelocity), + ); } } diff --git a/src/animation/springTimingFunction.ts b/src/animation/springTimingFunction.ts index 3c3e1a2..ebc7da3 100644 --- a/src/animation/springTimingFunction.ts +++ b/src/animation/springTimingFunction.ts @@ -1,5 +1,4 @@ -import type { TimingFunction } from "./constants"; -import { tagCSSEasing } from "./internal/css-easing"; +import type { Easing, TimingFunction } from "./constants"; import { SpringProgress } from "./spring"; import { springLinearStops, @@ -39,20 +38,21 @@ export interface SpringTimingFunctionOptions { } /** - * Sample a `SpringProgress(target=1, initial=0)` solver and return a - * pure `TimingFunction` — `(t: number) => number` over t∈[0,1] — that - * `ElementMorph`, `NumericAnimation`, and `Animation.addFrame` accept - * directly (anywhere a `TimingFunction` is taken). + * Sample a `SpringProgress(target=1, initial=0)` solver and return a typed + * {@link Easing}: `.fn` is the callable curve — `(t: number) => number` + * over t∈[0,1] — that `ElementMorph`, `NumericAnimation`, and + * `Animation.addFrame` accept directly, and `.css` is the CSS `linear()` + * string that reproduces it (same solver, same preset), so a WAAPI + * delegation runs the true overshoot/settle on the compositor. * * This is the JS-easing sibling of `springLinearStops`: same solver, * same `(response, dampingFraction)` surface, same default * `maxDuration = response * 4`. Where `springLinearStops` emits a CSS - * `linear()` string for stylesheets/tokens, this returns a closure for - * code paths that drive interpolation directly and cannot consume a - * `linear()` string. + * `linear()` string for stylesheets/tokens, this returns the typed pair + * for code paths that drive interpolation directly. * - * The returned curve satisfies `f(0) = 0` and `f(1) = 1` exactly. - * Interior values may exceed 1 for ζ < 1 (overshoot) — e.g. the bouncy + * The curve satisfies `fn(0) = 0` and `fn(1) = 1` exactly. Interior + * values may exceed 1 for ζ < 1 (overshoot) — e.g. the bouncy * `response 0.5 / ζ 0.45` preset peaks at ≈ 1.205 mid-curve — which is * the whole point: feeding this into `ElementMorph` produces the * canonical iOS spring overshoot without hand-rolling stops or a @@ -64,7 +64,7 @@ export interface SpringTimingFunctionOptions { */ export function springTimingFunction( opts: SpringTimingFunctionOptions, -): TimingFunction { +): Easing { const sampleCount = opts.sampleCount ?? 64; const settleThreshold = opts.settleThreshold ?? 1e-3; const maxDuration = opts.maxDuration ?? opts.response * 4; @@ -92,7 +92,7 @@ export function springTimingFunction( samples[sampleCount] = 1; spring.dispose(); - const easing: TimingFunction = (t: number): number => { + const fn: TimingFunction = (t: number): number => { if (t <= 0) return 0; if (t >= 1) return 1; const x = t * sampleCount; @@ -103,10 +103,12 @@ export function springTimingFunction( return a + (b - a) * frac; }; - // Tag the closure with its CSS `linear()` equivalent (same solver, same - // preset), so an `Animation` eased by this spring can run the real - // overshoot/settle on the compositor via WAAPI instead of falling back to - // bare `linear`. The JS easing and the CSS string describe ONE curve. + // Pair the callable with its CSS `linear()` equivalent (same solver, + // same preset) as a typed Easing, so an `Animation` eased by this spring + // can run the real overshoot/settle on the compositor via WAAPI instead + // of falling back to bare `linear`. The JS easing and the CSS string + // describe ONE curve — and the pairing flows through the type system, + // not a Symbol tag that wrapping/binding would silently drop. const stopOpts: SpringLinearStopsOptions = { response: opts.response, dampingFraction: opts.dampingFraction, @@ -114,5 +116,5 @@ export function springTimingFunction( if (opts.settleThreshold !== undefined) stopOpts.settleThreshold = opts.settleThreshold; if (opts.maxDuration !== undefined) stopOpts.maxDuration = opts.maxDuration; - return tagCSSEasing(easing, springLinearStops(stopOpts)); + return { fn, css: springLinearStops(stopOpts) }; } diff --git a/src/animation/timeline.ts b/src/animation/timeline.ts index 130611e..9ec1a27 100644 --- a/src/animation/timeline.ts +++ b/src/animation/timeline.ts @@ -1,24 +1,24 @@ -import { EasingResolvable } from "./internal/easing-resolvable"; +import { toEasing } from "./easing"; +import { AnimationOptionError } from "./internal/errors"; import { SmoothProgress } from "./smooth"; import type { SmoothProgressOptions } from "./smooth"; -import type { TimingFunction, TimingFunctionNames } from "./constants"; +import type { Easing, TimingFunction } from "./constants"; export interface TimelineOptions { /** - * Easing as a callable `TimingFunction`, OR a string easing *name* - * from value.js's registry (`"ease-out-cubic"`, `"easeOutCubic"`, …). + * Easing as a callable `TimingFunction` or a typed `Easing` — both + * synchronous and value.js-free, so the `Timeline` family never touches + * the dynamic boundary. * - * A **callable** is applied directly and keeps `Timeline` value.js-free. + * A string easing *name* is NOT accepted here (fail-explicit: it + * throws). Resolve a name once, up front, through the async factory: * - * A **string name** is resolved through the dynamic engine boundary via - * the shared `EasingResolvable` contract: the constructor kicks off an - * eager `await import(...)` and the resolved easing is applied once it - * lands (subsequent `tick()`s use it). Until then `tick()` runs with the - * identity easing and emits a one-time dev-only warning. Consumers that - * need the eased value on the very first `tick()` can - * `await timeline.ready()` first. + * ```ts + * const easing = await resolveEasing("ease-out-cubic"); + * new ScrollTimeline({ easing }); + * ``` */ - easing?: TimingFunction | TimingFunctionNames | undefined; + easing?: TimingFunction | Easing | undefined; /** SmoothProgress config. `false` disables smoothing. Default: enabled. */ smoothing?: Partial | false | undefined; /** @@ -35,17 +35,28 @@ const clamp01 = (v: number): number => Math.max(0, Math.min(1, v)); export abstract class Timeline { private smoother: SmoothProgress | null; - // The one shared string-easing-name resolver (eager-resolve + memoized - // `.ready()` + dev-warn + identity fallback). `applyPipeline` reads - // `.fn` live each tick, so a resolved name takes effect with no callback. - private _easing: EasingResolvable; + // The resolved easing callable — synchronous from construction. The + // identity default means "no easing applied" for the omitted case. + private _easingFn: TimingFunction; private currentProgress: number = 0; private boundaryEpsilon: number; constructor(options?: TimelineOptions) { this.boundaryEpsilon = options?.boundaryEpsilon ?? 0.005; - this._easing = new EasingResolvable(options?.easing); + const easing = options?.easing; + if (typeof easing === "string") { + // Fail-explicit: a string name needs the async registry — + // never a silent identity fallback. + throw new AnimationOptionError( + "easing", + easing, + "Timeline accepts a callable TimingFunction or a typed " + + "Easing; resolve a string name first via " + + "`await resolveEasing(name)`.", + ); + } + this._easingFn = easing == null ? (t) => t : toEasing(easing).fn; if (options?.smoothing === false) { this.smoother = null; @@ -58,17 +69,6 @@ export abstract class Timeline { } } - /** - * Resolve a pending string easing *name* through the dynamic engine - * boundary. No-op (resolved promise) for callable / omitted easing. - * Resolution is already kicked off eagerly at construction; `await - * timeline.ready()` before the first `tick()` to apply the eased value - * immediately rather than letting it land asynchronously. - */ - ready(): Promise { - return this._easing.ready(); - } - /** Subclass returns raw [0,1] progress from its source. */ protected abstract sample(): number; @@ -79,14 +79,9 @@ export abstract class Timeline { * time-step method. */ private applyPipeline(): number { - // A `tick()` while a string easing name is still resolving applies the - // identity fallback — surface it once in dev. - this._easing.warnIfPending("Timeline.tick()"); - let raw = clamp01(this.sample()); - // `.fn` is the identity fallback until a name resolves, so applying it - // unconditionally is a no-op for the omitted-easing case. - raw = this._easing.fn(raw); + // The identity default makes this a no-op for the omitted-easing case. + raw = this._easingFn(raw); // Snap to exact boundary when within epsilon — prevents oscillation // from micro-jitter alternating between snap and lerp each frame. diff --git a/src/animation/utils.ts b/src/animation/utils.ts index 2e99dd0..a208539 100644 --- a/src/animation/utils.ts +++ b/src/animation/utils.ts @@ -6,11 +6,13 @@ import { flattenObject, FunctionValue, lerpColorValue, + jumpTerms, lerpComputedValue, lerpNumericValue, lerpValue, normalizeValueUnits, prepareInterpVar, + steppedEase, timingFunctions, tryParse, unflattenObjectToString, @@ -90,6 +92,12 @@ const applyPropertyContext = ( const CUBIC_BEZIER_LITERAL = /^\s*cubic-bezier\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)\s*$/i; +/** + * Match a CSS `steps(n[, position])` literal per CSS Easing Level 1. + */ +const STEPS_LITERAL = + /^\s*steps\s*\(\s*(\d+)\s*(?:,\s*(jump-start|jump-end|jump-none|jump-both|start|end|both)\s*)?\)\s*$/i; + /** * Resolve a timing-function input to a callable `TimingFunction`. * @@ -99,13 +107,12 @@ const CUBIC_BEZIER_LITERAL = * `easeOutCubic`, `linear`, etc.) — looked up in the registry * - a CSS `cubic-bezier(x1, y1, x2, y2)` literal string — * parsed to control points and resolved via `CSSCubicBezier` + * - a CSS `steps(n[, position])` literal plus the `step-start` / + * `step-end` keywords — resolved via `steppedEase`, so the full + * CSS Easing Level 1 vocabulary round-trips through `fromString` * - `undefined` or a name/literal the registry can't find — - * returns `undefined` so callers can fall back to their - * default (usually `easeInOutCubic`) - * - * Higher-arity factory entries (`steps`, `step-start`, `step-end`) - * live in the registry but require construction arguments; they - * return `undefined` here so callers can invoke them explicitly. + * returns `undefined` so callers can decide (the option setters + * throw a typed `AnimationOptionError`, fail-explicit) */ export const getTimingFunction = ( timingFunction: TimingFunction | TimingFunctionNames | string | undefined, @@ -129,6 +136,19 @@ export const getTimingFunction = ( } } + // CSS `steps(n[, position])` literal + the step keywords. + const stepsMatch = timingFunction.match(STEPS_LITERAL); + if (stepsMatch) { + const count = Number.parseInt(stepsMatch[1]!, 10); + const term = (stepsMatch[2]?.toLowerCase() ?? + "end") as (typeof jumpTerms)[number]; + if (count > 0 && (jumpTerms as readonly string[]).includes(term)) { + return steppedEase(count, term); + } + } + if (timingFunction === "step-start") return steppedEase(1, "jump-start"); + if (timingFunction === "step-end") return steppedEase(1, "jump-end"); + const resolved = timingFunctions[timingFunction as TimingFunctionNames]; if (typeof resolved === "function" && resolved.length <= 1) { return resolved as TimingFunction; @@ -295,10 +315,10 @@ export function calcFrameTime( /** * Default DOM-style renderer used by `Animation.transform` when no - * user-supplied transform is provided. Marked with the - * `keyframes.defaultRenderer` Symbol so the WAAPI eligibility check - * can detect "user supplied a custom transform" without resorting to - * fragile function-identity comparisons. + * user-supplied transform is provided. "Is this the default renderer?" + * is decided by reference comparison against the Animation instance's + * one `_defaultTransform` (`usesDefaultRenderer`) — typed and + * bind-proof, not a Symbol tag a wrapper would silently drop. */ export function transformTargetsStyle( vars: V, @@ -315,4 +335,3 @@ export function transformTargetsStyle( }); }); } -(transformTargetsStyle as any)[Symbol.for("keyframes.defaultRenderer")] = true; diff --git a/src/animation/waapi.ts b/src/animation/waapi.ts index c681837..330aa34 100644 --- a/src/animation/waapi.ts +++ b/src/animation/waapi.ts @@ -1,5 +1,4 @@ import { COMPUTED_UNITS, unflattenObjectToString } from "@mkbabb/value.js"; -import { getCSSEasing } from "./internal/css-easing"; import type { Animation } from "./engine"; import type { Vars } from "./constants"; @@ -9,11 +8,6 @@ const isComputedUnit = ( typeof unit === "string" && (COMPUTED_UNITS as readonly string[]).includes(unit); -const DEFAULT_RENDERER = Symbol.for("keyframes.defaultRenderer"); - -const isDefaultTransform = (fn: unknown): boolean => - typeof fn === "function" && (fn as any)[DEFAULT_RENDERER] === true; - export type WAAPIEligibility = | { eligible: true } | { eligible: false; reason: string }; @@ -52,7 +46,12 @@ export function isWAAPIEligible( } for (const frame of animation.frames) { - if (!isDefaultTransform(frame.transform)) { + // Reference comparison against the instance's ONE default renderer — + // typed and bind-proof, unlike the former Symbol tag (which + // `Function.prototype.bind` silently dropped, making every + // CSSKeyframesAnimation read as "custom transform" and the whole + // WAAPI path dead in practice). + if (!animation.usesDefaultRenderer(frame.transform)) { return { eligible: false, reason: "custom transform function (not the default DOM renderer)", @@ -70,6 +69,17 @@ export function isWAAPIEligible( }; } } + // WAAPI applies its single easing PER SEGMENT (between consecutive + // keyframe stops). A CSS-twinned easing (a spring's `linear()`) + // across 2+ segments would restart the curve at every stop — + // silently wrong on the compositor — so it stays on the rAF path, + // which runs the true curve across the whole span. + if (firstTF.css !== undefined) { + return { + eligible: false, + reason: "CSS-twinned easing across multiple segments (WAAPI restarts the curve per segment)", + }; + } } for (const frame of animation.frames) { @@ -159,21 +169,16 @@ export function toWAAPIOptions( } // WAAPI exposes ONE easing per animation. When the uniform timing - // function carries a CSS easing string — today a spring's `linear()` - // stops, which `springTimingFunction` tags its closure with — emit it so - // the compositor runs the true curve between the sampled keyframe - // endpoints. Otherwise fall back to bare `linear` (the keyframe stops - // carry whatever intent JS interpolation baked in). Eligibility already - // guaranteed a uniform timing function, so reading frame 0's is enough. - // - // NOTE: WAAPI applies this easing PER SEGMENT (between consecutive - // keyframe stops). For the dominant spring case — a 2-stop from→to — that - // is the whole animation. A spring across 3+ stops would restart the curve - // each segment; uniform-timing eligibility plus the typical 2-stop spring - // keep that edge rare. + // function carries a CSS twin — `Easing.css`, e.g. a spring's `linear()` + // stops from `springTimingFunction` — emit it so the compositor runs the + // true curve between the sampled keyframe endpoints. Otherwise fall back + // to bare `linear` (the keyframe stops carry whatever intent JS + // interpolation baked in). Eligibility already guaranteed a uniform + // timing function AND rejects a CSS-twinned easing across multiple + // segments (per-segment curve restart), so reading frame 0's is enough. const uniformTiming = animation.frames[0]?.timingFunction ?? animation.options.timingFunction; - const easing = getCSSEasing(uniformTiming) ?? "linear"; + const easing = uniformTiming.css ?? "linear"; return { duration: opts.duration, @@ -206,14 +211,14 @@ export async function playWAAPI( (target) => target.animate(keyframes, options), ); - // Shadow rAF tick — drives lifecycle (onStart / iteration / + // Shadow tick loop — drives lifecycle (onStart / iteration / // onEnd / events / pause / resume) so WAAPI playback has the // same observable state as the rAF path. No interpFrames calls; - // WAAPI handles the visuals. - let cancelled = false; - const tickLoop = (now: number) => { - if (cancelled || animation.done) return; - animation.tick(now); + // WAAPI handles the visuals. Rides the animation's own RAFPlayback + // driver so `stop()` halts it uniformly with every other loop. + animation.playback.loop(async (now: number) => { + if (animation.done) return false; + await animation.tick(now); if (animation.paused) { for (const wa of waAnimations) wa.pause(); } else { @@ -221,13 +226,12 @@ export async function playWAAPI( if (wa.playState === "paused") wa.play(); } } - animation.handleId = requestAnimationFrame(tickLoop); - }; - animation.handleId = requestAnimationFrame(tickLoop); + return !animation.done; + }); try { await Promise.all(waAnimations.map((wa) => wa.finished)); } finally { - cancelled = true; + animation.playback.stop(); } } diff --git a/test/easing-resolvable.test.ts b/test/easing-resolvable.test.ts deleted file mode 100644 index 93947ea..0000000 --- a/test/easing-resolvable.test.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { afterEach, describe, expect, it, vi } from "vitest"; -import { easeOutCubic } from "@mkbabb/value.js"; -import { EasingResolvable } from "../src/animation/internal/easing-resolvable"; -import { NumericAnimation } from "../src/animation/numeric"; -import { ManualTimeline } from "../src/animation/timeline"; - -// A macrotask flush — long enough for the dynamic `import("../engine")` + the -// `getTimingFunction` lookup to land WITHOUT any explicit `.ready()`/`.play()`, -// proving the eager-resolve-on-construct path. -const flush = (): Promise => new Promise((r) => setTimeout(r, 50)); - -describe("EasingResolvable contract", () => { - afterEach(() => vi.restoreAllMocks()); - - it("callable easing resolves synchronously — not pending, never warns", () => { - const warn = vi.spyOn(console, "warn").mockImplementation(() => {}); - const r = new EasingResolvable(easeOutCubic); - expect(r.pending).toBe(false); - expect(r.fn(0.5)).toBeCloseTo(easeOutCubic(0.5), 10); - r.warnIfPending("test"); - expect(warn).not.toHaveBeenCalled(); - }); - - it("omitted easing is the identity fallback — not pending", () => { - const r = new EasingResolvable(undefined); - expect(r.pending).toBe(false); - expect(r.fn(0.42)).toBe(0.42); - }); - - it("string name is pending with the identity fallback until resolved", () => { - const r = new EasingResolvable("ease-out-cubic"); - expect(r.pending).toBe(true); - expect(r.fn(0.5)).toBeCloseTo(0.5, 10); - }); - - it("eager-resolves on construct — no explicit ready()/play() needed", async () => { - const r = new EasingResolvable("ease-out-cubic"); - await flush(); - expect(r.pending).toBe(false); - expect(r.fn(0.5)).toBeCloseTo(easeOutCubic(0.5), 10); - }); - - it("warnIfPending fires ONCE per instance while a name is pending", () => { - const warn = vi.spyOn(console, "warn").mockImplementation(() => {}); - const r = new EasingResolvable("ease-out-cubic"); - r.warnIfPending("ctx"); - r.warnIfPending("ctx"); - r.warnIfPending("ctx"); - expect(warn).toHaveBeenCalledTimes(1); - expect(String(warn.mock.calls[0]![0])).toContain("ease-out-cubic"); - }); - - it("does not warn once the name has resolved", async () => { - const r = new EasingResolvable("ease-out-cubic"); - await r.ready(); - const warn = vi.spyOn(console, "warn").mockImplementation(() => {}); - r.warnIfPending("ctx"); - expect(warn).not.toHaveBeenCalled(); - }); - - it("fires the onResolved callback once when a name lands", async () => { - const seen: Array<(t: number) => number> = []; - const r = new EasingResolvable("ease-out-cubic", (fn) => seen.push(fn)); - await r.ready(); - expect(seen).toHaveLength(1); - expect(seen[0]!(0.5)).toBeCloseTo(easeOutCubic(0.5), 10); - }); -}); - -describe("EasingResolvable integration — the silent-fallback window is closed + detectable", () => { - afterEach(() => vi.restoreAllMocks()); - - it("NumericAnimation.at() with a pending name is DETECTABLE via the dev-warn", () => { - const warn = vi.spyOn(console, "warn").mockImplementation(() => {}); - const anim = new NumericAnimation([{ x: 0 }, { x: 100 }], { - timingFunction: "ease-out-cubic", - }); - // Synchronous `.at()` before resolution → identity fallback + ONE warn. - expect(anim.at(0.5).x).toBeCloseTo(50); - anim.at(0.5); - anim.at(0.5); - expect(warn).toHaveBeenCalledTimes(1); - expect(String(warn.mock.calls[0]![0])).toContain( - "NumericAnimation.at()", - ); - }); - - it("NumericAnimation eager-resolves the named curve without play()/ready()", async () => { - const anim = new NumericAnimation([{ x: 0 }, { x: 100 }], { - timingFunction: "ease-out-cubic", - }); - await flush(); - // Resolved purely by the eager construct — no `.ready()`/`.play()`. - expect(anim.at(0.5).x).toBeCloseTo(100 * easeOutCubic(0.5), 6); - }); - - it("Timeline.tick() with a pending name is DETECTABLE via the dev-warn", () => { - const warn = vi.spyOn(console, "warn").mockImplementation(() => {}); - const tl = new ManualTimeline({ easing: "ease-out-cubic" }); - tl.set(0.5); - expect(tl.tick()).toBeCloseTo(0.5, 10); - tl.tick(); - expect(warn).toHaveBeenCalledTimes(1); - expect(String(warn.mock.calls[0]![0])).toContain("Timeline.tick()"); - }); - - it("a callable easing never warns (the value.js-free path)", () => { - const warn = vi.spyOn(console, "warn").mockImplementation(() => {}); - const anim = new NumericAnimation([{ x: 0 }, { x: 100 }], { - timingFunction: easeOutCubic, - }); - anim.at(0.5); - expect(warn).not.toHaveBeenCalled(); - }); -}); diff --git a/test/engine-modern-web.test.ts b/test/engine-modern-web.test.ts index fc3ad6d..5c346f4 100644 --- a/test/engine-modern-web.test.ts +++ b/test/engine-modern-web.test.ts @@ -3,7 +3,6 @@ import { RAFPlayback } from "../src/animation/playback"; import { CSSKeyframesAnimation } from "../src/animation/engine"; import { AnimationGroup } from "../src/animation/group"; import { springTimingFunction } from "../src/animation/springTimingFunction"; -import { getCSSEasing } from "../src/animation/internal/css-easing"; import { toWAAPIOptions } from "../src/animation/waapi"; import { yieldToMain } from "../src/animation/internal/scheduler"; @@ -192,16 +191,15 @@ describe("yieldToMain + AnimationGroup tick batching", () => { // ── WAAPI spring linear() widening (LAND) ───────────────────────────────── describe("WAAPI spring linear() widening", () => { - it("springTimingFunction tags its closure with a CSS linear() string", () => { + it("springTimingFunction carries its CSS linear() twin on the typed Easing", () => { const tf = springTimingFunction({ response: 0.5, dampingFraction: 0.5, }); - const css = getCSSEasing(tf); - expect(css).toMatch(/^linear\(/); - // The tag does not change the closure's numeric behavior. - expect(tf(0)).toBe(0); - expect(tf(1)).toBe(1); + expect(tf.css).toMatch(/^linear\(/); + // The pairing does not change the callable's numeric behavior. + expect(tf.fn(0)).toBe(0); + expect(tf.fn(1)).toBe(1); }); it("toWAAPIOptions emits the spring linear() instead of bare linear", () => { diff --git a/test/group.test.ts b/test/group.test.ts index 8f2c128..e878960 100644 --- a/test/group.test.ts +++ b/test/group.test.ts @@ -230,7 +230,6 @@ describe("AnimationGroup lifecycle", () => { const a = createOpacityAnim("a"); const group = new AnimationGroup(a); group.started = true; - group.handleId = 999; group.stop(); diff --git a/test/leaves-parity.test.ts b/test/leaves-parity.test.ts new file mode 100644 index 0000000..349209f --- /dev/null +++ b/test/leaves-parity.test.ts @@ -0,0 +1,41 @@ +/** + * `internal/leaves.ts` is a deliberate byte-copy of value.js's + * `clamp`/`lerp`/`scale` so the light engines carry no static value.js + * edge. A byte-copy can silently drift from its canonical source — this + * parity sweep is the gate that catches it (tests are heavy-side, so + * importing value.js here is fine). + */ +import { describe, expect, it } from "vitest"; +import { + clamp as vClamp, + lerp as vLerp, + scale as vScale, +} from "@mkbabb/value.js"; +import { clamp, lerp, scale } from "../src/animation/internal/leaves"; + +const GRID = [ + -10, -1, -0.5, 0, 0.001, 0.25, 0.5, 0.75, 0.999, 1, 1.5, 2, 10, 1e6, +]; + +describe("internal/leaves ↔ value.js parity", () => { + it("clamp matches value.js across the grid", () => { + for (const v of GRID) { + expect(clamp(v, 0, 1)).toBe(vClamp(v, 0, 1)); + expect(clamp(v, -5, 5)).toBe(vClamp(v, -5, 5)); + } + }); + + it("lerp matches value.js across the grid", () => { + for (const t of GRID) { + expect(lerp(0, 100, t)).toBe(vLerp(0, 100, t)); + expect(lerp(-50, 50, t)).toBe(vLerp(-50, 50, t)); + } + }); + + it("scale matches value.js across the grid", () => { + for (const v of GRID) { + expect(scale(v, 0, 10, 0, 1)).toBe(vScale(v, 0, 10, 0, 1)); + expect(scale(v, -1, 1, 0, 100)).toBe(vScale(v, -1, 1, 0, 100)); + } + }); +}); diff --git a/test/morph.test.ts b/test/morph.test.ts index 4ba3a0e..f3bf700 100644 --- a/test/morph.test.ts +++ b/test/morph.test.ts @@ -1,5 +1,7 @@ import { describe, expect, it } from "vitest"; import { easeOutCubic } from "@mkbabb/value.js"; +import { resolveEasing } from "../src/animation/easing"; +import { AnimationOptionError } from "../src/animation/internal/errors"; import { ElementMorph } from "../src/animation/morph"; import type { MorphRect } from "../src/animation/morph"; @@ -75,19 +77,19 @@ describe("ElementMorph", () => { expect(el.style.transformOrigin).toBe("center center"); }); - it("string-name easing interpolates as linear until ready() resolves", () => { - const morph = new ElementMorph(from, to, { - timingFunction: "ease-out-cubic", - }); - // Before resolution: linear fallback (midpoint is half the delta). - expect(morph.at(0.5).translateX).toBeCloseTo(100); + it("throws AnimationOptionError on a string easing name (fail-explicit)", () => { + expect( + () => + new ElementMorph(from, to, { + // @ts-expect-error — string names are rejected by the type AND at runtime + timingFunction: "ease-out-cubic", + }), + ).toThrow(AnimationOptionError); }); - it("ready() resolves a string-name easing through the engine boundary", async () => { - const morph = new ElementMorph(from, to, { - timingFunction: "ease-out-cubic", - }); - await morph.ready(); + it("applies an easing resolved up front via resolveEasing", async () => { + const easing = await resolveEasing("ease-out-cubic"); + const morph = new ElementMorph(from, to, { timingFunction: easing }); // Endpoints stay exact, midpoint follows the eased curve. expect(morph.at(0).translateX).toBeCloseTo(0); expect(morph.at(1).translateX).toBeCloseTo(200); @@ -95,9 +97,10 @@ describe("ElementMorph", () => { expect(morph.at(0.5).translateX).toBeGreaterThan(120); }); - it("play() resolves a string-name easing and lands on the destination", async () => { + it("play() with a resolved easing lands on the destination", async () => { + const easing = await resolveEasing("easeOutCubic"); const morph = new ElementMorph(from, to, { - timingFunction: "easeOutCubic", + timingFunction: easing, duration: 50, }); const el = document.createElement("div"); diff --git a/test/numeric.test.ts b/test/numeric.test.ts index 92de766..603d920 100644 --- a/test/numeric.test.ts +++ b/test/numeric.test.ts @@ -1,5 +1,7 @@ import { describe, expect, it } from "vitest"; import { easeOutCubic, linear } from "@mkbabb/value.js"; +import { resolveEasing } from "../src/animation/easing"; +import { AnimationOptionError } from "../src/animation/internal/errors"; import { NumericAnimation } from "../src/animation/numeric"; describe("NumericAnimation", () => { @@ -121,21 +123,22 @@ describe("NumericAnimation", () => { }); }); -describe("NumericAnimation lazy string-name easing", () => { - it("string name interpolates as linear until ready() resolves", () => { - const anim = new NumericAnimation([{ x: 0 }, { x: 100 }], { - timingFunction: "ease-out-cubic", - }); - // Before resolution: linear fallback. - expect(anim.at(0.5).x).toBeCloseTo(50); +describe("NumericAnimation easing construction (fail-explicit + resolveEasing)", () => { + it("throws AnimationOptionError on a string easing name", () => { + expect( + () => + new NumericAnimation([{ x: 0 }, { x: 100 }], { + // @ts-expect-error — string names are rejected by the type AND at runtime + timingFunction: "ease-out-cubic", + }), + ).toThrow(AnimationOptionError); }); - it("ready() resolves a kebab-case name through the engine boundary", async () => { + it("resolveEasing resolves a kebab-case name the engine applies", async () => { + const easing = await resolveEasing("ease-out-cubic"); const anim = new NumericAnimation([{ x: 0 }, { x: 100 }], { - timingFunction: "ease-out-cubic", + timingFunction: easing, }); - await anim.ready(); - // After resolution: eased curve, endpoints exact, midpoint eased. expect(anim.at(0).x).toBeCloseTo(0); expect(anim.at(1).x).toBeCloseTo(100); expect(anim.at(0.5).x).toBeCloseTo(100 * easeOutCubic(0.5)); @@ -143,17 +146,18 @@ describe("NumericAnimation lazy string-name easing", () => { expect(anim.at(0.5).x).toBeGreaterThan(60); }); - it("ready() resolves a camelCase name (easeOutCubic)", async () => { + it("resolveEasing resolves a camelCase name (easeOutCubic)", async () => { + const easing = await resolveEasing("easeOutCubic"); const anim = new NumericAnimation([{ x: 0 }, { x: 100 }], { - timingFunction: "easeOutCubic", + timingFunction: easing, }); - await anim.ready(); expect(anim.at(0.5).x).toBeCloseTo(100 * easeOutCubic(0.5)); }); - it("play() resolves the name before the first frame and reaches the endpoint", async () => { + it("play() with a resolved easing reaches the endpoint", async () => { + const easing = await resolveEasing("ease-out-cubic"); const anim = new NumericAnimation([{ x: 0 }, { x: 100 }], { - timingFunction: "ease-out-cubic", + timingFunction: easing, duration: 50, }); const frames: number[] = []; @@ -161,29 +165,23 @@ describe("NumericAnimation lazy string-name easing", () => { expect(frames.length).toBeGreaterThan(1); // Final frame lands exactly on the endpoint. expect(frames[frames.length - 1]).toBeCloseTo(100); - // The easing was applied — at least one mid frame is above the - // linear value for the same progress (ease-out front-loads). - // (We can't read progress directly, but a non-linear curve means - // intermediate x values are not a straight ramp.) }); - it("'linear' name resolves to the identity ramp", async () => { + it("'linear' resolves to the identity ramp and carries its CSS twin", async () => { + const easing = await resolveEasing("linear"); + expect(easing.css).toBe("linear"); const anim = new NumericAnimation([{ x: 0 }, { x: 100 }], { - timingFunction: "linear", + timingFunction: easing, }); - await anim.ready(); expect(anim.at(0.25).x).toBeCloseTo(100 * linear(0.25)); expect(anim.at(0.5).x).toBeCloseTo(50); }); - it("ready() is a no-op for callable easing (resolves immediately)", async () => { + it("a callable easing is applied synchronously", () => { const doubleSpeed = (t: number) => Math.min(t * 2, 1); const anim = new NumericAnimation([{ x: 0 }, { x: 100 }], { timingFunction: doubleSpeed, }); - // Callable is applied synchronously — no resolution needed. - expect(anim.at(0.25).x).toBeCloseTo(50); - await anim.ready(); expect(anim.at(0.25).x).toBeCloseTo(50); }); }); diff --git a/test/presets.test.ts b/test/presets.test.ts index 1cd675d..013c255 100644 --- a/test/presets.test.ts +++ b/test/presets.test.ts @@ -57,7 +57,7 @@ describe("animation presets", () => { it("typewriter: steppedEase timing function works", () => { const anim = typewriter(); expect(anim.frames.length).toBeGreaterThan(0); - expect(typeof anim.options.timingFunction).toBe("function"); + expect(typeof anim.options.timingFunction.fn).toBe("function"); }); it("spinner: border-radius shorthand parses", () => { diff --git a/test/resolve-easing.test.ts b/test/resolve-easing.test.ts new file mode 100644 index 0000000..20fd7ba --- /dev/null +++ b/test/resolve-easing.test.ts @@ -0,0 +1,65 @@ +import { describe, expect, it } from "vitest"; +import { easeOutCubic } from "@mkbabb/value.js"; +import { resolveEasing, toEasing } from "../src/animation/easing"; +import { UnknownEasingError } from "../src/animation/internal/errors"; + +describe("resolveEasing (the explicit async easing factory)", () => { + it("resolves a kebab-case registry name to a typed Easing", async () => { + const easing = await resolveEasing("ease-out-cubic"); + expect(typeof easing.fn).toBe("function"); + expect(easing.fn(0.5)).toBeCloseTo(easeOutCubic(0.5), 10); + // A non-CSS-native registry name carries no CSS twin. + expect(easing.css).toBeUndefined(); + }); + + it("resolves a camelCase registry name", async () => { + const easing = await resolveEasing("easeOutCubic"); + expect(easing.fn(0.5)).toBeCloseTo(easeOutCubic(0.5), 10); + }); + + it("attaches the CSS twin for CSS-native names", async () => { + const easing = await resolveEasing("ease-in-out"); + expect(easing.css).toBe("ease-in-out"); + expect(typeof easing.fn).toBe("function"); + }); + + it("resolves a cubic-bezier() literal with its CSS twin", async () => { + const easing = await resolveEasing("cubic-bezier(0.4, 0, 0.2, 1)"); + expect(easing.css).toBe("cubic-bezier(0.4, 0, 0.2, 1)"); + expect(easing.fn(0)).toBeCloseTo(0, 10); + expect(easing.fn(1)).toBeCloseTo(1, 10); + // Mid-curve is distinctly non-linear for this material-style bezier. + expect(easing.fn(0.5)).toBeGreaterThan(0.6); + }); + + it("resolves a steps() literal", async () => { + const easing = await resolveEasing("steps(4, jump-end)"); + expect(typeof easing.fn).toBe("function"); + // A 4-step jump-end staircase is flat at the start of each tread. + expect(easing.fn(0)).toBe(0); + expect(easing.fn(1)).toBe(1); + }); + + it("REJECTS an unknown name with UnknownEasingError (fail-explicit)", async () => { + await expect(resolveEasing("not-a-real-easing")).rejects.toThrow( + UnknownEasingError, + ); + await expect(resolveEasing("not-a-real-easing")).rejects.toThrow( + /not-a-real-easing/, + ); + }); +}); + +describe("toEasing (the sync light-engine normalizer)", () => { + it("wraps a bare callable", () => { + const fn = (t: number) => t * t; + const easing = toEasing(fn); + expect(easing.fn).toBe(fn); + expect(easing.css).toBeUndefined(); + }); + + it("passes a typed Easing through unchanged", () => { + const input = { fn: (t: number) => t, css: "linear" }; + expect(toEasing(input)).toBe(input); + }); +}); diff --git a/test/springTimingFunction.test.ts b/test/springTimingFunction.test.ts index e85859f..2142e6f 100644 --- a/test/springTimingFunction.test.ts +++ b/test/springTimingFunction.test.ts @@ -1,29 +1,29 @@ import { describe, expect, it } from "vitest"; import { springTimingFunction } from "../src/animation/springTimingFunction"; import { ElementMorph } from "../src/animation/morph"; -import type { TimingFunction } from "../src/animation/constants"; +import type { Easing } from "../src/animation/constants"; describe("springTimingFunction", () => { - it("anchors f(0) = 0 and f(1) = 1 exactly", () => { - const f = springTimingFunction({ + it("anchors fn(0) = 0 and fn(1) = 1 exactly", () => { + const { fn } = springTimingFunction({ response: 0.5, dampingFraction: 0.86, }); - expect(f(0)).toBe(0); - expect(f(1)).toBe(1); + expect(fn(0)).toBe(0); + expect(fn(1)).toBe(1); }); it("clamps out-of-range input to the endpoints", () => { - const f = springTimingFunction({ + const { fn } = springTimingFunction({ response: 0.5, dampingFraction: 0.86, }); - expect(f(-0.5)).toBe(0); - expect(f(2)).toBe(1); + expect(fn(-0.5)).toBe(0); + expect(fn(2)).toBe(1); }); it("rises monotonically up to its peak", () => { - const f = springTimingFunction({ + const { fn } = springTimingFunction({ response: 0.5, dampingFraction: 0.45, sampleCount: 200, @@ -32,7 +32,7 @@ describe("springTimingFunction", () => { let peakT = 0; let peakV = -Infinity; for (let i = 0; i <= 200; i++) { - const v = f(i / 200); + const v = fn(i / 200); if (v > peakV) { peakV = v; peakT = i / 200; @@ -41,7 +41,7 @@ describe("springTimingFunction", () => { let prev = -Infinity; for (let i = 0; i <= 200; i++) { const t = (peakT * i) / 200; - const v = f(t); + const v = fn(t); expect(v).toBeGreaterThanOrEqual(prev - 1e-9); prev = v; } @@ -50,7 +50,7 @@ describe("springTimingFunction", () => { it("preserves the analytic overshoot for the bouncy 0.5/0.45 preset (≈ +20%)", () => { const response = 0.5; const dampingFraction = 0.45; - const f = springTimingFunction({ + const { fn } = springTimingFunction({ response, dampingFraction, sampleCount: 256, @@ -58,7 +58,7 @@ describe("springTimingFunction", () => { let sampledPeak = -Infinity; for (let i = 0; i <= 256; i++) { - sampledPeak = Math.max(sampledPeak, f(i / 256)); + sampledPeak = Math.max(sampledPeak, fn(i / 256)); } // Closed-form first-overshoot peak of the damped harmonic @@ -74,25 +74,36 @@ describe("springTimingFunction", () => { }); it("does not overshoot for a critically damped preset (ζ = 1)", () => { - const f = springTimingFunction({ + const { fn } = springTimingFunction({ response: 0.5, dampingFraction: 1, sampleCount: 200, }); for (let i = 0; i <= 200; i++) { - expect(f(i / 200)).toBeLessThanOrEqual(1 + 1e-6); + expect(fn(i / 200)).toBeLessThanOrEqual(1 + 1e-6); } }); - it("returns a value that ElementMorph accepts as a TimingFunction", () => { - const f: TimingFunction = springTimingFunction({ + it("carries its CSS linear() twin on the typed Easing", () => { + const easing = springTimingFunction({ + response: 0.5, + dampingFraction: 0.5, + }); + expect(easing.css).toMatch(/^linear\(/); + // The pairing does not change the callable's numeric behavior. + expect(easing.fn(0)).toBe(0); + expect(easing.fn(1)).toBe(1); + }); + + it("is accepted by ElementMorph directly as a typed Easing", () => { + const easing: Easing = springTimingFunction({ response: 0.5, dampingFraction: 0.45, }); const morph = new ElementMorph( { x: 0, y: 0, width: 100, height: 100 }, { x: 200, y: 0, width: 100, height: 100 }, - { timingFunction: f, duration: 600 }, + { timingFunction: easing, duration: 600 }, ); // Mid-flight the spring overshoots, so translateX exceeds the // 200px destination delta before settling back to it. diff --git a/test/strict-options.test.ts b/test/strict-options.test.ts new file mode 100644 index 0000000..f82df73 --- /dev/null +++ b/test/strict-options.test.ts @@ -0,0 +1,139 @@ +/** + * The fail-explicit option contract (B.W2) — malformed PRESENT input + * THROWS a typed `AnimationOptionError`; genuine omission (`undefined`) + * defaults. These are the bites of the invariant A declared + * ("a value.js-internal resolution failure throws") and B honors. + */ +import { describe, expect, it } from "vitest"; +import { Animation } from "../src/animation/engine"; +import { AnimationOptionError } from "../src/animation/internal/errors"; +import { defaultOptions } from "../src/animation/constants"; + +describe("strict option validation (AnimationOptionError)", () => { + it("setIterationCount throws on a malformed string", () => { + const anim = new Animation(); + expect(() => anim.setIterationCount("abc")).toThrow( + AnimationOptionError, + ); + expect(() => anim.setIterationCount("abc")).toThrow(/iterationCount/); + }); + + it("setIterationCount throws on a negative number", () => { + const anim = new Animation(); + expect(() => anim.setIterationCount(-3)).toThrow(AnimationOptionError); + }); + + it("setIterationCount accepts 'infinite' and genuine omission defaults", () => { + const anim = new Animation(); + anim.setIterationCount("infinite"); + expect(anim.options.iterationCount).toBe(Infinity); + anim.setIterationCount(undefined); + expect(anim.options.iterationCount).toBe( + defaultOptions.iterationCount, + ); + }); + + it("setDuration throws on non-positive and malformed input", () => { + const anim = new Animation(); + expect(() => anim.setDuration(-5)).toThrow(AnimationOptionError); + expect(() => anim.setDuration(0)).toThrow(AnimationOptionError); + expect(() => anim.setDuration("garbage")).toThrow( + AnimationOptionError, + ); + // The previous duration survives the throw — no silent half-write. + expect(anim.options.duration).toBe(defaultOptions.duration); + }); + + it("setDuration accepts a CSS time string", () => { + const anim = new Animation(); + anim.setDuration("2s"); + expect(anim.options.duration).toBe(2000); + }); + + it("setTimingFunction throws on an unknown name (never silent-defaults)", () => { + const anim = new Animation(); + expect(() => anim.setTimingFunction("bogus-easing")).toThrow( + AnimationOptionError, + ); + }); + + it("setTimingFunction resolves registry names, beziers, steps, and typed Easings", () => { + const anim = new Animation(); + anim.setTimingFunction("ease-out-cubic"); + expect(typeof anim.options.timingFunction.fn).toBe("function"); + + anim.setTimingFunction("cubic-bezier(0.4, 0, 0.2, 1)"); + expect(anim.options.timingFunction.fn(1)).toBeCloseTo(1, 10); + + anim.setTimingFunction("steps(4)"); + expect(anim.options.timingFunction.fn(1)).toBe(1); + + const typed = { fn: (t: number) => t, css: "linear" }; + anim.setTimingFunction(typed); + expect(anim.options.timingFunction).toBe(typed); + }); + + it("setDelay throws on malformed input, allows negative CSS delays", () => { + const anim = new Animation(); + expect(() => anim.setDelay("garbage")).toThrow(AnimationOptionError); + anim.setDelay(-100); + expect(anim.options.delay).toBe(-100); + }); + + it("setDirection / setFillMode throw on unknown literals", () => { + const anim = new Animation(); + expect(() => + anim.setDirection("sideways" as never), + ).toThrow(AnimationOptionError); + expect(() => anim.setFillMode("everything" as never)).toThrow( + AnimationOptionError, + ); + }); + + it("setUseWAAPI / setRespectReducedMotion throw on non-booleans", () => { + const anim = new Animation(); + expect(() => anim.setUseWAAPI("yes" as never)).toThrow( + AnimationOptionError, + ); + expect(() => anim.setRespectReducedMotion(1 as never)).toThrow( + AnimationOptionError, + ); + }); + + it("the error carries the option name and offending value", () => { + const anim = new Animation(); + try { + anim.setIterationCount("abc"); + expect.unreachable("should have thrown"); + } catch (e) { + const err = e as AnimationOptionError; + expect(err.name).toBe("AnimationOptionError"); + expect(err.option).toBe("iterationCount"); + expect(err.value).toBe("abc"); + } + }); +}); + +describe("the rest-position contract (settle vs reset)", () => { + it("settle() is pure teardown — flags clear, no paint requirement", () => { + const anim = new Animation({ duration: 100 }); + anim.started = true; + anim.t = 50; + anim.settle(); + expect(anim.started).toBe(false); + expect(anim.t).toBe(0); + expect(anim.done).toBe(false); + }); + + it("restPosition derives from fillMode", () => { + const anim = new Animation(); + anim.setFillMode("forwards"); + expect(anim.restPosition).toBe("final"); + anim.setFillMode("both"); + expect(anim.restPosition).toBe("final"); + anim.setFillMode("none"); + expect(anim.restPosition).toBe("initial"); + anim.setFillMode("backwards"); + expect(anim.restPosition).toBe("initial"); + }); +}); diff --git a/test/timeline.test.ts b/test/timeline.test.ts index c28c520..eb829d2 100644 --- a/test/timeline.test.ts +++ b/test/timeline.test.ts @@ -4,6 +4,8 @@ import { ScrollTimeline, } from "../src/animation/timeline"; import { easeOutCubic } from "@mkbabb/value.js"; +import { resolveEasing } from "../src/animation/easing"; +import { AnimationOptionError } from "../src/animation/internal/errors"; describe("ManualTimeline", () => { it("returns set value immediately (no smoothing)", () => { @@ -27,19 +29,22 @@ describe("ManualTimeline", () => { expect(p).toBeCloseTo(easeOutCubic(0.5), 10); }); - it("resolves a string-name easing lazily via the engine boundary", async () => { - const tl = new ManualTimeline({ easing: "ease-out-cubic" }); - await tl.ready(); + it("applies an easing resolved up front via resolveEasing", async () => { + const easing = await resolveEasing("ease-out-cubic"); + const tl = new ManualTimeline({ easing }); tl.set(0.5); const p = tl.tick(); expect(p).toBeCloseTo(easeOutCubic(0.5), 10); }); - it("string-name easing is identity until ready() resolves", () => { - // No await — resolution has not landed, so tick() applies identity. - const tl = new ManualTimeline({ easing: "ease-out-cubic" }); - tl.set(0.5); - expect(tl.tick()).toBeCloseTo(0.5, 10); + it("throws AnimationOptionError on a string easing name (fail-explicit)", () => { + expect( + () => + new ManualTimeline({ + // @ts-expect-error — string names are rejected by the type AND at runtime + easing: "ease-out-cubic", + }), + ).toThrow(AnimationOptionError); }); it("supports smoothing when explicitly enabled", () => { From 7fc60e5d666fdfc0e57a6ffe2ae9bee3785eee82 Mon Sep 17 00:00:00 2001 From: Mike Babb Date: Thu, 4 Jun 2026 12:36:57 -0400 Subject: [PATCH 03/11] fix(tranche-B W2 review): WAAPI lifecycle + rest-paint + gate bite (16 findings) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adversarial review (26 agents, find→verify) of 5af8eb7 confirmed 16 real defects; this resolves them. WAAPI lifecycle cluster (HIGH ×4) — newly LIVE because W2 resurrected the delegation path (the old Symbol-tag renderer check was bind-broken, so every CSSKeyframesAnimation fell to rAF; usesDefaultRenderer fixed it): - stop()/reset() now cancel the compositor animations (_waAnimations, _cancelWAAPI) AND resolve the awaited play() promise — cancel rejects wa.finished, playWAAPI swallows the AbortError as a halt. Was: hung promise + orphaned compositor paint on the default playback path. - resume() is WAAPI-mode-aware: nudges the still-installed shadow loop's wa.play() instead of starting a SECOND rAF _frame loop that orphaned the paused compositor animation. WAAPI fidelity (HIGH+MED) — eligibility now REQUIRES a faithful CSS twin (.css): a bespoke callable (easeInOutCubic default, easeOutCubic, a user closure) has no CSS twin and would run BARE LINEAR on the compositor — a silent visual regression — so it stays on the true-curve rAF path. cssTwinFor centralizes the twin logic (CSS keyword / cubic-bezier() / steps()); resolveEasing + resolveEasingOption attach it. Uniform-timing check compares .fn identity, not the Easing wrapper. Rest-position (MED) — standalone _frame() no longer interpFrames(duration) after onEnd painted the rest frame: a fillMode:none animation rests at its INITIAL frame instead of being clobbered to final. (test: paint sequence.) Fail-explicit blast radius (HIGH+MED) — fromString stays LENIENT (an unknown per-keyframe animation-timing-function falls back to inherited, not throw); the explicit setter API stays strict. Demo control handlers guard the strict setters (trySetOption) so mid-keystroke input no longer throws uncaught. RAFPlayback.loop (HIGH) — generation counter: a stop()+restart while an async frame is in flight can no longer re-arm a second rAF chain. format.ts (LOW) — Easing.css serializes VERBATIM (camelCaseToHyphen only on the registry-name fallback; a linear()/cubic-bezier() css is already CSS). proof:boundary gate bite (HIGH ×2 + MED + LOW) — the headline negative test was broken: bare `import "@mkbabb/value.js"` and `export … from "@mkbabb/value.js"` re-exports both PASSED. Source-grep now matches import|export + bare side-effect imports (both negative bites demonstrated red→revert). Barrel parse handles multi-line export blocks + inline `type` modifiers, so springTimingFunction (reflowed multi-line) is proven. B.W4 (loading perf): inline bootstrap → demo/app/main.ts (real graph root); splash removed (instant critical-CSS paint); demo/app/loaf-observer.ts (dev-only LoAF, DCE'd from prod). advancedChunks migration + a pinned preload-helper micro-chunk stop rolldown parking vite's preload helper inside vendor-monaco (which made the 4 MB editor a STATIC entry import). scripts/demo-smoke.mjs defines + proves inv γ (the demo cannot ship blank). Tests 300→309 (waapi-lifecycle suite). check:lib + widened proof:boundary + gh-pages + demo-smoke all green. --- .../controls/AnimationControlsControls.vue | 23 +- demo/app/index.html | 50 +--- demo/app/loaf-observer.ts | 83 ++++++ demo/app/main.ts | 34 +++ scripts/demo-smoke.mjs | 239 ++++++++++++++++++ scripts/proof-boundary.mjs | 48 ++-- src/animation/easing.ts | 28 +- src/animation/engine.ts | 80 +++++- src/animation/format.ts | 26 +- src/animation/playback.ts | 15 ++ src/animation/waapi.ts | 34 ++- test/waapi-lifecycle.test.ts | 235 +++++++++++++++++ vite.config.ts | 91 ++++++- 13 files changed, 885 insertions(+), 101 deletions(-) create mode 100644 demo/app/loaf-observer.ts create mode 100644 demo/app/main.ts create mode 100644 scripts/demo-smoke.mjs create mode 100644 test/waapi-lifecycle.test.ts diff --git a/demo/@/components/custom/animation-controls/controls/AnimationControlsControls.vue b/demo/@/components/custom/animation-controls/controls/AnimationControlsControls.vue index fcf8348..966a287 100644 --- a/demo/@/components/custom/animation-controls/controls/AnimationControlsControls.vue +++ b/demo/@/components/custom/animation-controls/controls/AnimationControlsControls.vue @@ -12,7 +12,7 @@ label="duration" label-class="font-mono text-base text-muted-foreground" tooltip="Animation length (e.g. 5s, 200ms)" - @update:model-value="(v) => { animation.setDuration(v); storedAnimationOptions.animationOptions.duration = v; }" + @update:model-value="(v) => { trySetOption(() => animation.setDuration(v)); storedAnimationOptions.animationOptions.duration = v; }" /> void) => { + try { + apply(); + } catch (e) { + if ((e as Error)?.name !== "AnimationOptionError") throw e; + // malformed-in-progress input — ignore until it parses + } +}; + const { timingFunctionsAnd, convertedFromName, diff --git a/demo/app/index.html b/demo/app/index.html index 9ea2c17..615963b 100644 --- a/demo/app/index.html +++ b/demo/app/index.html @@ -35,49 +35,17 @@ } })(); - + + - -
- -
-
keyframes.js
-
-
+ +
diff --git a/demo/app/loaf-observer.ts b/demo/app/loaf-observer.ts new file mode 100644 index 0000000..866e8dc --- /dev/null +++ b/demo/app/loaf-observer.ts @@ -0,0 +1,83 @@ +/** + * Dev-only Long Animation Frames (LoAF) observer — the causal half of the + * engine's `scheduler.yield()` INP-relief claim (B.W4 §4, the two-tranche + * chronic finally landed with its consumers: the prod-perf measurement and + * the demo bench). + * + * Records every long animation frame over `thresholdMs` with its duration, + * blocking duration, and best-effort script attribution, and exposes the + * ring on `window.__kfLoaf` so the Playwright >50ms-trace gate and the + * bench can read it. Chromium-only by API (`long-animation-frame` is not + * Baseline); feature-detected so every other engine no-ops. + */ + +export interface LoAFRecord { + /** Entry start time (ms, performance clock). */ + ts: number; + /** Total frame duration (ms). */ + duration: number; + /** Main-thread blocking duration (ms). */ + blocking: number; + /** Best-effort attribution — the first script's source URL or invoker. */ + source: string; +} + +interface LoAFScriptAttribution { + sourceURL?: string; + invoker?: string; +} + +interface LoAFEntry extends PerformanceEntry { + blockingDuration?: number; + scripts?: LoAFScriptAttribution[]; +} + +declare global { + interface Window { + __kfLoaf?: LoAFRecord[]; + } +} + +/** + * Start observing long animation frames. Returns a disconnect handle, or + * `undefined` when the API is unavailable (non-Chromium, SSR). + */ +export function observeLongAnimationFrames( + thresholdMs = 50, +): (() => void) | undefined { + if ( + typeof window === "undefined" || + typeof PerformanceObserver === "undefined" || + !PerformanceObserver.supportedEntryTypes?.includes( + "long-animation-frame", + ) + ) { + return undefined; + } + + const records: LoAFRecord[] = (window.__kfLoaf ??= []); + + const observer = new PerformanceObserver((list) => { + for (const entry of list.getEntries() as LoAFEntry[]) { + if (entry.duration < thresholdMs) continue; + const script = entry.scripts?.[0]; + records.push({ + ts: entry.startTime, + duration: entry.duration, + blocking: entry.blockingDuration ?? 0, + source: + script?.sourceURL || script?.invoker || "(unattributed)", + }); + // Dev console signal — the observer itself is dev-only (DCE'd + // from production by main.ts's import.meta.env.DEV guard). + console.debug( + `[kf:loaf] ${entry.duration.toFixed(1)}ms frame ` + + `(blocking ${(entry.blockingDuration ?? 0).toFixed(1)}ms) — ` + + (script?.sourceURL || script?.invoker || "unattributed"), + ); + } + }); + + observer.observe({ type: "long-animation-frame", buffered: true }); + return () => observer.disconnect(); +} diff --git a/demo/app/main.ts b/demo/app/main.ts new file mode 100644 index 0000000..8c5e221 --- /dev/null +++ b/demo/app/main.ts @@ -0,0 +1,34 @@ +/** + * The demo's real module-graph root. + * + * The bootstrap formerly lived as an inline `","message":"Syntax not understood"},{"index":"38","line":" ","message":"Syntax not understood"},{"index":"41","line":" ","message":"Syntax not understood"},{"index":"42","line":" ","message":"Syntax not understood"},{"index":"43","line":" ","message":"Syntax not understood"},{"index":"44","line":" ","message":"Syntax not understood"},{"index":"45","line":" ","message":"Syntax not understood"},{"index":"46","line":" ","message":"Syntax not understood"},{"index":"47","line":" ","message":"Syntax not understood"},{"index":"83","line":" ","message":"Syntax not understood"},{"index":"84","line":" ","message":"Syntax not understood"},{"index":"85","line":" ","message":"Syntax not understood"},{"index":"87","line":" ","message":"Syntax not understood"},{"index":"88","line":" ","message":"Syntax not understood"},{"index":"92","line":"
","message":"Syntax not understood"},{"index":"93","line":" ","message":"Syntax not understood"},{"index":"94","line":"","message":"Syntax not understood"}]}},"hreflang":{"id":"hreflang","title":"Document has a valid `hreflang`","description":"hreflang links tell search engines what version of a page they should list in search results for a given language or region. [Learn more about `hreflang`](https://developer.chrome.com/docs/lighthouse/seo/hreflang/).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"source","valueType":"code","subItemsHeading":{"key":"reason","valueType":"text"},"label":""}],"items":[]}},"canonical":{"id":"canonical","title":"Document has a valid `rel=canonical`","description":"Canonical links suggest which URL to show in search results. [Learn more about canonical links](https://developer.chrome.com/docs/lighthouse/seo/canonical/).","score":null,"scoreDisplayMode":"notApplicable"},"structured-data":{"id":"structured-data","title":"Structured data is valid","description":"Run the [Structured Data Testing Tool](https://developers.google.com/search/docs/appearance/structured-data/) to validate structured data. [Learn more about Structured Data](https://developer.chrome.com/docs/lighthouse/seo/structured-data/).","score":null,"scoreDisplayMode":"manual"},"bf-cache":{"id":"bf-cache","title":"Page prevented back/forward cache restoration","description":"Many navigations are performed by going back to a previous page, or forwards again. The back/forward cache (bfcache) can speed up these return navigations. [Learn more about the bfcache](https://developer.chrome.com/docs/lighthouse/performance/bf-cache/)","score":0,"scoreDisplayMode":"binary","displayValue":"1 failure reason","details":{"type":"table","headings":[{"key":"reason","valueType":"text","subItemsHeading":{"key":"frameUrl","valueType":"url"},"label":"Failure reason"},{"key":"failureType","valueType":"text","label":"Failure type"}],"items":[{"reason":"Internal error.","failureType":"Not actionable","subItems":{"type":"subitems","items":[{"frameUrl":"http://localhost:5177/#/amiga?anim=Rotations"}]},"protocolReason":"IgnoreEventAndEvict"}]},"guidanceLevel":4},"cache-insight":{"id":"cache-insight","title":"Use efficient cache lifetimes","description":"A long cache lifetime can speed up repeat visits to your page. [Learn more about caching](https://developer.chrome.com/docs/performance/insights/cache).","score":0,"scoreDisplayMode":"metricSavings","displayValue":"Est savings of 1,504 KiB","metricSavings":{"FCP":700,"LCP":1200},"details":{"type":"table","headings":[{"key":"url","valueType":"url","label":"Request"},{"key":"cacheLifetimeMs","valueType":"ms","label":"Cache TTL","displayUnit":"duration"},{"key":"totalBytes","valueType":"bytes","label":"Transfer Size","displayUnit":"kb","granularity":1}],"items":[{"url":"http://localhost:5177/assets/vendor-three-Bjkinzx-.js","cacheLifetimeMs":0,"totalBytes":533162,"wastedBytes":533162},{"url":"http://localhost:5177/assets/vendor-reka-ui-CVUb_gFh.js","cacheLifetimeMs":0,"totalBytes":338377,"wastedBytes":338377},{"url":"http://localhost:5177/assets/index-he4Ow9Yj.css","cacheLifetimeMs":0,"totalBytes":286596,"wastedBytes":286596},{"url":"http://localhost:5177/assets/index-CZlNYAJp.js","cacheLifetimeMs":0,"totalBytes":241054,"wastedBytes":241054},{"url":"http://localhost:5177/assets/engine-DiS0VYfs.js","cacheLifetimeMs":0,"totalBytes":124362,"wastedBytes":124362},{"url":"http://localhost:5177/assets/vendor-lucide-ItTK6Wyo.js","cacheLifetimeMs":0,"totalBytes":8789,"wastedBytes":8789},{"url":"http://localhost:5177/assets/AmigaScene-CyaOqR74.js","cacheLifetimeMs":0,"totalBytes":3762,"wastedBytes":3762},{"url":"http://localhost:5177/assets/preload-helper-kNaey6uv.js","cacheLifetimeMs":0,"totalBytes":1382,"wastedBytes":1382},{"url":"http://localhost:5177/assets/cube-icon-sm-CqZgfax4.png","cacheLifetimeMs":0,"totalBytes":1315,"wastedBytes":1315},{"url":"http://localhost:5177/assets/rolldown-runtime-QTnfLwEv.js","cacheLifetimeMs":0,"totalBytes":868,"wastedBytes":868}],"sortedBy":["wastedBytes"],"skipSumming":["cacheLifetimeMs"],"debugData":{"type":"debugdata","wastedBytes":1539667}},"guidanceLevel":3},"cls-culprits-insight":{"id":"cls-culprits-insight","title":"Layout shift culprits","description":"Layout shifts occur when elements move absent any user interaction. [Investigate the causes of layout shifts](https://developer.chrome.com/docs/performance/insights/cls-culprit), such as elements being added, removed, or their fonts changing as the page loads.","score":1,"scoreDisplayMode":"informative","metricSavings":{"CLS":0},"details":{"type":"list","items":[{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"extra"},"label":"Element"},{"key":"score","valueType":"numeric","subItemsHeading":{"key":"cause","valueType":"text"},"granularity":0.001,"label":"Layout shift score"}],"items":[{"node":{"type":"text","value":"Total"},"score":0.000008},{"node":{"type":"node","lhId":"page-1-svg","path":"1,HTML,1,BODY,1,DIV,0,DIV,0,DIV,0,DIV,0,DIV,1,DIV,2,svg","selector":"div.glass-dock > div.dock-layers > div.dock-layer > svg.lucide","boundingRect":{"top":44,"bottom":68,"left":744,"right":768,"width":24,"height":24},"snippet":"","nodeLabel":"div.glass-dock > div.dock-layers > div.dock-layer > svg.lucide"},"score":0.000008,"subItems":{"type":"subitems","items":[{"extra":{"type":"url","value":"https://fonts.gstatic.com/s/instrumentserif/v5/jizBRFtNs2ka5fXjeivQ4LroWlx-6zUTjnTLgNs.woff2"},"cause":"Web font"},{"extra":{"type":"url","value":"https://fonts.gstatic.com/s/instrumentserif/v5/jizHRFtNs2ka5fXjeivQ4LroWlx-6zAjjH7Motmp5g.woff2"},"cause":"Web font"}]}}]}]},"guidanceLevel":3},"document-latency-insight":{"id":"document-latency-insight","title":"Document request latency","description":"Your first network request is the most important. [Reduce its latency](https://developer.chrome.com/docs/performance/insights/document-latency) by avoiding redirects, ensuring a fast server response, and enabling text compression.","score":0.5,"scoreDisplayMode":"metricSavings","displayValue":"Est savings of 3 KiB","metricSavings":{"FCP":0,"LCP":0},"details":{"type":"checklist","items":{"noRedirects":{"label":"Avoids redirects","value":true},"serverResponseIsFast":{"label":"Server responds quickly (observed 0 ms)","value":true},"usesCompression":{"label":"No compression applied","value":false}},"debugData":{"type":"debugdata","redirectDuration":0,"serverResponseTime":0,"uncompressedResponseBytes":2828,"wastedBytes":2828}},"guidanceLevel":3},"dom-size-insight":{"id":"dom-size-insight","title":"Optimize DOM size","description":"A large DOM can increase the duration of style calculations and layout reflows, impacting page responsiveness. A large DOM will also increase memory usage. [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/performance/insights/dom-size).","score":1,"scoreDisplayMode":"numeric","numericValue":520,"numericUnit":"element","metricSavings":{"INP":0},"details":{"type":"table","headings":[{"key":"statistic","valueType":"text","label":"Statistic"},{"key":"node","valueType":"node","label":"Element"},{"key":"value","valueType":"numeric","label":"Value"}],"items":[{"statistic":"Total elements","value":{"type":"numeric","granularity":1,"value":520}},{"statistic":"DOM depth","node":{"type":"node","lhId":"page-6-path","path":"1,HTML,1,BODY,1,DIV,1,DIV,3,DIV,0,DIV,0,DIV,0,DIV,0,DIV,0,DIV,0,DIV,1,DIV,0,DIV,0,DIV,0,DIV,0,DIV,0,DIV,0,DIV,0,DIV,3,DIV,1,BUTTON,1,svg,0,path","selector":"div.labeled-field > button.glass-wash > svg.lucide > path","boundingRect":{"top":197,"bottom":201,"left":741,"right":749,"width":8,"height":4},"snippet":"","nodeLabel":"div.labeled-field > button.glass-wash > svg.lucide > path"},"value":{"type":"numeric","granularity":1,"value":22}},{"statistic":"Most children","node":{"type":"node","lhId":"page-5-BODY","path":"1,HTML,1,BODY","selector":"body","boundingRect":{"top":0,"bottom":900,"left":0,"right":1440,"width":1440,"height":900},"snippet":"","nodeLabel":"body"},"value":{"type":"numeric","granularity":1,"value":20}}],"debugData":{"type":"debugdata","totalElements":520,"maxChildren":20,"maxDepth":22}},"guidanceLevel":3},"duplicated-javascript-insight":{"id":"duplicated-javascript-insight","title":"Duplicated JavaScript","description":"Remove large, [duplicate JavaScript modules](https://developer.chrome.com/docs/performance/insights/duplicated-javascript) from bundles to reduce unnecessary bytes consumed by network activity.","score":1,"scoreDisplayMode":"metricSavings","metricSavings":{"FCP":0,"LCP":0},"details":{"type":"table","headings":[{"key":"source","valueType":"code","subItemsHeading":{"key":"url","valueType":"url"},"label":"Source"},{"key":"wastedBytes","valueType":"bytes","subItemsHeading":{"key":"sourceTransferBytes"},"granularity":10,"label":"Duplicated bytes"}],"items":[],"debugData":{"type":"debugdata","wastedBytes":0}},"guidanceLevel":2},"font-display-insight":{"id":"font-display-insight","title":"Font display","description":"Consider setting [font-display](https://developer.chrome.com/docs/performance/insights/font-display) to swap or optional to ensure text is consistently visible. swap can be further optimized to mitigate layout shifts with [font metric overrides](https://developer.chrome.com/blog/font-fallbacks).","score":1,"scoreDisplayMode":"metricSavings","metricSavings":{"INP":0},"details":{"type":"table","headings":[{"key":"url","valueType":"url","label":"URL"},{"key":"wastedMs","valueType":"ms","label":"Est Savings"}],"items":[],"skipSumming":["wastedMs"]},"guidanceLevel":3},"forced-reflow-insight":{"id":"forced-reflow-insight","title":"Forced reflow","description":"A forced reflow occurs when JavaScript queries geometric properties (such as offsetWidth) after styles have been invalidated by a change to the DOM state. This can result in poor performance. Learn more about [forced reflows](https://developer.chrome.com/docs/performance/insights/forced-reflow) and possible mitigations.","score":1,"scoreDisplayMode":"numeric","details":{"type":"list","items":[{"type":"table","headings":[{"key":"source","valueType":"source-location","label":"Source"},{"key":"reflowTime","valueType":"ms","granularity":1,"label":"Total reflow time"}],"items":[]}]},"guidanceLevel":3},"image-delivery-insight":{"id":"image-delivery-insight","title":"Improve image delivery","description":"Reducing the download time of images can improve the perceived load time of the page and LCP. [Learn more about optimizing image size](https://developer.chrome.com/docs/performance/insights/image-delivery)","score":1,"scoreDisplayMode":"metricSavings","metricSavings":{"FCP":0,"LCP":0},"details":{"type":"table","headings":[{"key":"node","valueType":"node","label":""},{"key":"url","valueType":"url","label":"URL","subItemsHeading":{"key":"reason","valueType":"text"}},{"key":"totalBytes","valueType":"bytes","label":"Resource Size"},{"key":"wastedBytes","valueType":"bytes","label":"Est Savings","subItemsHeading":{"key":"wastedBytes","valueType":"bytes"}}],"items":[],"debugData":{"type":"debugdata","wastedBytes":0}},"guidanceLevel":3},"inp-breakdown-insight":{"id":"inp-breakdown-insight","title":"INP breakdown","description":"Start investigating [how to improve INP](https://developer.chrome.com/docs/performance/insights/inp-breakdown) by looking at the longest subpart.","score":null,"scoreDisplayMode":"notApplicable","guidanceLevel":3},"lcp-breakdown-insight":{"id":"lcp-breakdown-insight","title":"LCP breakdown","description":"Each [subpart has specific improvement strategies](https://developer.chrome.com/docs/performance/insights/lcp-breakdown). Ideally, most of the LCP time should be spent on loading the resources, not within delays.","score":1,"scoreDisplayMode":"informative","metricSavings":{"LCP":0},"details":{"type":"list","items":[{"type":"table","headings":[{"key":"label","valueType":"text","label":"Subpart"},{"key":"duration","valueType":"ms","label":"Duration"}],"items":[{"subpart":"timeToFirstByte","label":"Time to first byte","duration":0.999},{"subpart":"elementRenderDelay","label":"Element render delay","duration":299.601}]},{"type":"node","lhId":"page-0-DIV","path":"1,HTML,1,BODY,1,DIV,1,DIV,3,DIV,0,DIV,0,DIV,0,DIV,4,DIV,0,DIV","selector":"div.controls-pane > div.controls-content > div.flex-shrink-0 > div.rounded-card","boundingRect":{"top":425,"bottom":611,"left":59,"right":1357,"width":1298,"height":186},"snippet":"
","nodeLabel":"Play\nReverse"}]},"guidanceLevel":3},"lcp-discovery-insight":{"id":"lcp-discovery-insight","title":"LCP request discovery","description":"[Optimize LCP](https://developer.chrome.com/docs/performance/insights/lcp-discovery) by making the LCP image discoverable from the HTML immediately, and avoiding lazy-loading","score":null,"scoreDisplayMode":"notApplicable","guidanceLevel":3},"legacy-javascript-insight":{"id":"legacy-javascript-insight","title":"Legacy JavaScript","description":"Polyfills and transforms enable older browsers to use new JavaScript features. However, many aren't necessary for modern browsers. Consider modifying your JavaScript build process to not transpile [Baseline](https://web.dev/articles/baseline-and-polyfills) features, unless you know you must support older browsers. [Learn why most sites can deploy ES6+ code without transpiling](https://developer.chrome.com/docs/performance/insights/legacy-javascript)","score":1,"scoreDisplayMode":"metricSavings","metricSavings":{"FCP":0,"LCP":0},"details":{"type":"table","headings":[{"key":"url","valueType":"url","subItemsHeading":{"key":"location","valueType":"source-location"},"label":"URL"},{"key":null,"valueType":"code","subItemsHeading":{"key":"signal"},"label":""},{"key":"wastedBytes","valueType":"bytes","label":"Wasted bytes"}],"items":[],"debugData":{"type":"debugdata","wastedBytes":0}},"guidanceLevel":2},"modern-http-insight":{"id":"modern-http-insight","title":"Modern HTTP","description":"HTTP/2 and HTTP/3 offer many benefits over HTTP/1.1, such as multiplexing. [Learn more about using modern HTTP](https://developer.chrome.com/docs/performance/insights/modern-http).","score":1,"scoreDisplayMode":"metricSavings","metricSavings":{"FCP":0,"LCP":0},"details":{"type":"table","headings":[{"key":"url","valueType":"url","label":"URL"},{"key":"protocol","valueType":"text","label":"Protocol"}],"items":[]},"guidanceLevel":3},"network-dependency-tree-insight":{"id":"network-dependency-tree-insight","title":"Network dependency tree","description":"[Avoid chaining critical requests](https://developer.chrome.com/docs/performance/insights/network-dependency-tree) by reducing the length of chains, reducing the download size of resources, or deferring the download of unnecessary resources to improve page load.","score":0,"scoreDisplayMode":"numeric","metricSavings":{"LCP":0},"details":{"type":"list","items":[{"type":"list-section","value":{"type":"network-tree","chains":{"DE7DB99EC46383FA2A500696C60E864F":{"url":"http://localhost:5177/#/amiga","navStartToEndTime":5,"transferSize":4390,"isLongest":true,"children":{"5093.2":{"url":"http://localhost:5177/assets/index-CZlNYAJp.js","navStartToEndTime":9,"transferSize":241054,"isLongest":true,"children":{}}}}},"longestChain":{"duration":9}}},{"type":"list-section","title":"Preconnected origins","description":"[preconnect](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/) hints help the browser establish a connection earlier in the page load, saving time when the first request for that origin is made. The following are the origins that the page preconnected to.","value":{"type":"table","headings":[{"key":"origin","valueType":"text","subItemsHeading":{"key":"warning"},"label":"Origin"},{"key":"source","valueType":"node","label":"Source"}],"items":[{"origin":"https://fonts.googleapis.com/","source":{"type":"node","lhId":"page-2-LINK","path":"1,HTML,0,HEAD,5,LINK","selector":"head > link","boundingRect":{"top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"snippet":"","nodeLabel":"head > link"},"subItems":{"type":"subitems","items":[]}},{"origin":"https://fonts.gstatic.com/","source":{"type":"node","lhId":"page-3-LINK","path":"1,HTML,0,HEAD,6,LINK","selector":"head > link","boundingRect":{"top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"snippet":"","nodeLabel":"head > link"},"subItems":{"type":"subitems","items":[]}}]}},{"type":"list-section","title":"Preconnect candidates","description":"Add [preconnect](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/) hints to your most important origins, but try to use no more than 4.","value":{"type":"text","value":"No additional origins are good candidates for preconnecting"}}]},"guidanceLevel":1},"render-blocking-insight":{"id":"render-blocking-insight","title":"Render-blocking requests","description":"Requests are blocking the page's initial render, which may delay LCP. [Deferring or inlining](https://developer.chrome.com/docs/performance/insights/render-blocking) can move these network requests out of the critical path.","score":1,"scoreDisplayMode":"metricSavings","metricSavings":{"FCP":0,"LCP":0},"details":{"type":"table","headings":[{"key":"url","valueType":"url","label":"URL"},{"key":"totalBytes","valueType":"bytes","label":"Transfer Size"},{"key":"wastedMs","valueType":"timespanMs","label":"Duration"}],"items":[]},"guidanceLevel":3},"third-parties-insight":{"id":"third-parties-insight","title":"3rd parties","description":"3rd party code can significantly impact load performance. [Reduce and defer loading of 3rd party code](https://developer.chrome.com/docs/performance/insights/third-parties) to prioritize your page's content.","score":1,"scoreDisplayMode":"informative","details":{"type":"table","headings":[{"key":"entity","valueType":"text","label":"3rd party","subItemsHeading":{"key":"url","valueType":"url"}},{"key":"transferSize","granularity":1,"valueType":"bytes","label":"Transfer size","subItemsHeading":{"key":"transferSize"}},{"key":"mainThreadTime","granularity":1,"valueType":"ms","label":"Main thread time","subItemsHeading":{"key":"mainThreadTime"}}],"items":[{"entity":"Google Fonts","mainThreadTime":0,"transferSize":31351,"subItems":{"type":"subitems","items":[{"url":"https://fonts.gstatic.com/s/instrumentserif/v5/jizHRFtNs2ka5fXjeivQ4LroWlx-6zAjjH7Motmp5g.woff2","mainThreadTime":0,"transferSize":15711},{"url":"https://fonts.gstatic.com/s/instrumentserif/v5/jizBRFtNs2ka5fXjeivQ4LroWlx-6zUTjnTLgNs.woff2","mainThreadTime":0,"transferSize":15067},{"url":"https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&display=swap","mainThreadTime":0,"transferSize":573}]}}],"isEntityGrouped":true},"guidanceLevel":3},"viewport-insight":{"id":"viewport-insight","title":"Optimize viewport for mobile","description":"Tap interactions may be [delayed by up to 300 ms](https://developer.chrome.com/docs/performance/insights/viewport) if the viewport is not optimized for mobile.","score":1,"scoreDisplayMode":"numeric","metricSavings":{"INP":0},"details":{"type":"table","headings":[{"key":"node","valueType":"node","label":""}],"items":[{"node":{"type":"node","lhId":"page-4-META","path":"1,HTML,0,HEAD,2,META","selector":"head > meta","boundingRect":{"top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"snippet":"","nodeLabel":"head > meta"}}]},"guidanceLevel":3}},"configSettings":{"output":"json","maxWaitForFcp":30000,"maxWaitForLoad":45000,"pauseAfterFcpMs":1000,"pauseAfterLoadMs":1000,"networkQuietThresholdMs":1000,"cpuQuietThresholdMs":1000,"formFactor":"desktop","throttling":{"rttMs":40,"throughputKbps":10240,"requestLatencyMs":562.5,"downloadThroughputKbps":1474.5600000000002,"uploadThroughputKbps":675,"cpuSlowdownMultiplier":1},"throttlingMethod":"simulate","screenEmulation":{"mobile":false,"width":1440,"height":900,"deviceScaleFactor":1,"disabled":false},"emulatedUserAgent":"Mozilla/5.0 (Linux; Android 11; moto g power (2022)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Mobile Safari/537.36","auditMode":false,"gatherMode":false,"clearStorageTypes":["file_systems","shader_cache","service_workers","cache_storage"],"disableStorageReset":false,"debugNavigation":false,"channel":"node","usePassiveGathering":false,"disableFullPageScreenshot":false,"skipAboutBlank":false,"blankPage":"about:blank","ignoreStatusCode":false,"locale":"en-US","blockedUrlPatterns":null,"additionalTraceCategories":null,"extraHeaders":null,"precomputedLanternData":null,"onlyAudits":null,"onlyCategories":["performance","accessibility","best-practices","seo"],"skipAudits":null},"categories":{"performance":{"title":"Performance","supportedModes":["navigation","timespan","snapshot"],"auditRefs":[{"id":"first-contentful-paint","weight":10,"group":"metrics","acronym":"FCP"},{"id":"largest-contentful-paint","weight":25,"group":"metrics","acronym":"LCP"},{"id":"total-blocking-time","weight":30,"group":"metrics","acronym":"TBT"},{"id":"cumulative-layout-shift","weight":25,"group":"metrics","acronym":"CLS"},{"id":"speed-index","weight":10,"group":"metrics","acronym":"SI"},{"id":"cache-insight","weight":0,"group":"insights"},{"id":"cls-culprits-insight","weight":0,"group":"insights"},{"id":"document-latency-insight","weight":0,"group":"insights"},{"id":"dom-size-insight","weight":0,"group":"insights"},{"id":"duplicated-javascript-insight","weight":0,"group":"insights"},{"id":"font-display-insight","weight":0,"group":"insights"},{"id":"forced-reflow-insight","weight":0,"group":"insights"},{"id":"image-delivery-insight","weight":0,"group":"insights"},{"id":"inp-breakdown-insight","weight":0,"group":"insights"},{"id":"lcp-breakdown-insight","weight":0,"group":"insights"},{"id":"lcp-discovery-insight","weight":0,"group":"insights"},{"id":"legacy-javascript-insight","weight":0,"group":"insights"},{"id":"modern-http-insight","weight":0,"group":"insights"},{"id":"network-dependency-tree-insight","weight":0,"group":"insights"},{"id":"render-blocking-insight","weight":0,"group":"insights"},{"id":"third-parties-insight","weight":0,"group":"insights"},{"id":"viewport-insight","weight":0,"group":"insights"},{"id":"interactive","weight":0,"group":"hidden","acronym":"TTI"},{"id":"max-potential-fid","weight":0,"group":"hidden"},{"id":"unminified-css","weight":0,"group":"diagnostics"},{"id":"unminified-javascript","weight":0,"group":"diagnostics"},{"id":"unused-css-rules","weight":0,"group":"diagnostics"},{"id":"unused-javascript","weight":0,"group":"diagnostics"},{"id":"total-byte-weight","weight":0,"group":"diagnostics"},{"id":"user-timings","weight":0,"group":"diagnostics"},{"id":"bootup-time","weight":0,"group":"diagnostics"},{"id":"mainthread-work-breakdown","weight":0,"group":"diagnostics"},{"id":"long-tasks","weight":0,"group":"diagnostics"},{"id":"non-composited-animations","weight":0,"group":"diagnostics"},{"id":"unsized-images","weight":0,"group":"diagnostics"},{"id":"bf-cache","weight":0,"group":"diagnostics"},{"id":"network-requests","weight":0,"group":"hidden"},{"id":"network-rtt","weight":0,"group":"hidden"},{"id":"network-server-latency","weight":0,"group":"hidden"},{"id":"main-thread-tasks","weight":0,"group":"hidden"},{"id":"diagnostics","weight":0,"group":"hidden"},{"id":"metrics","weight":0,"group":"hidden"},{"id":"screenshot-thumbnails","weight":0,"group":"hidden"},{"id":"final-screenshot","weight":0,"group":"hidden"},{"id":"script-treemap-data","weight":0,"group":"hidden"},{"id":"resource-summary","weight":0,"group":"hidden"},{"id":"redirects","weight":0,"group":"hidden"},{"id":"server-response-time","weight":0,"group":"hidden"},{"id":"layout-shifts","weight":0,"group":"hidden"}],"id":"performance","score":0.89},"accessibility":{"title":"Accessibility","description":"These checks highlight opportunities to [improve the accessibility of your web app](https://developer.chrome.com/docs/lighthouse/accessibility/). Automatic detection can only detect a subset of issues and does not guarantee the accessibility of your web app, so [manual testing](https://web.dev/articles/how-to-review) is also encouraged.","manualDescription":"These items address areas which an automated testing tool cannot cover. Learn more in our guide on [conducting an accessibility review](https://web.dev/articles/how-to-review).","supportedModes":["navigation","snapshot"],"auditRefs":[{"id":"accesskeys","weight":0,"group":"a11y-navigation"},{"id":"aria-allowed-attr","weight":10,"group":"a11y-aria"},{"id":"aria-command-name","weight":7,"group":"a11y-aria"},{"id":"aria-conditional-attr","weight":7,"group":"a11y-aria"},{"id":"aria-deprecated-role","weight":1,"group":"a11y-aria"},{"id":"aria-dialog-name","weight":0,"group":"a11y-aria"},{"id":"aria-hidden-body","weight":10,"group":"a11y-aria"},{"id":"aria-hidden-focus","weight":7,"group":"a11y-aria"},{"id":"aria-input-field-name","weight":7,"group":"a11y-aria"},{"id":"aria-meter-name","weight":0,"group":"a11y-aria"},{"id":"aria-progressbar-name","weight":0,"group":"a11y-aria"},{"id":"aria-prohibited-attr","weight":7,"group":"a11y-aria"},{"id":"aria-required-attr","weight":10,"group":"a11y-aria"},{"id":"aria-required-children","weight":0,"group":"a11y-aria"},{"id":"aria-required-parent","weight":0,"group":"a11y-aria"},{"id":"aria-roles","weight":10,"group":"a11y-aria"},{"id":"aria-text","weight":0,"group":"a11y-aria"},{"id":"aria-toggle-field-name","weight":0,"group":"a11y-aria"},{"id":"aria-tooltip-name","weight":0,"group":"a11y-aria"},{"id":"aria-treeitem-name","weight":0,"group":"a11y-aria"},{"id":"aria-valid-attr-value","weight":10,"group":"a11y-aria"},{"id":"aria-valid-attr","weight":10,"group":"a11y-aria"},{"id":"button-name","weight":10,"group":"a11y-names-labels"},{"id":"bypass","weight":0,"group":"a11y-navigation"},{"id":"color-contrast","weight":7,"group":"a11y-color-contrast"},{"id":"definition-list","weight":0,"group":"a11y-tables-lists"},{"id":"dlitem","weight":0,"group":"a11y-tables-lists"},{"id":"document-title","weight":7,"group":"a11y-names-labels"},{"id":"duplicate-id-aria","weight":0,"group":"a11y-aria"},{"id":"form-field-multiple-labels","weight":0,"group":"a11y-names-labels"},{"id":"frame-title","weight":0,"group":"a11y-names-labels"},{"id":"heading-order","weight":0,"group":"a11y-navigation"},{"id":"html-has-lang","weight":7,"group":"a11y-language"},{"id":"html-lang-valid","weight":7,"group":"a11y-language"},{"id":"html-xml-lang-mismatch","weight":0,"group":"a11y-language"},{"id":"image-alt","weight":10,"group":"a11y-names-labels"},{"id":"input-button-name","weight":0,"group":"a11y-names-labels"},{"id":"input-image-alt","weight":0,"group":"a11y-names-labels"},{"id":"label","weight":10,"group":"a11y-names-labels"},{"id":"link-in-text-block","weight":0,"group":"a11y-color-contrast"},{"id":"link-name","weight":0,"group":"a11y-names-labels"},{"id":"list","weight":7,"group":"a11y-tables-lists"},{"id":"listitem","weight":0,"group":"a11y-tables-lists"},{"id":"meta-refresh","weight":0,"group":"a11y-best-practices"},{"id":"meta-viewport","weight":10,"group":"a11y-best-practices"},{"id":"object-alt","weight":0,"group":"a11y-names-labels"},{"id":"select-name","weight":0,"group":"a11y-names-labels"},{"id":"skip-link","weight":0,"group":"a11y-names-labels"},{"id":"tabindex","weight":7,"group":"a11y-navigation"},{"id":"target-size","weight":7,"group":"a11y-best-practices"},{"id":"td-headers-attr","weight":0,"group":"a11y-tables-lists"},{"id":"th-has-data-cells","weight":0,"group":"a11y-tables-lists"},{"id":"valid-lang","weight":0,"group":"a11y-language"},{"id":"video-caption","weight":0,"group":"a11y-audio-video"},{"id":"landmark-one-main","weight":3,"group":"a11y-best-practices"},{"id":"autocomplete-valid","weight":0,"group":"a11y-best-practices"},{"id":"presentation-role-conflict","weight":0,"group":"a11y-best-practices"},{"id":"svg-img-alt","weight":0,"group":"a11y-best-practices"},{"id":"focusable-controls","weight":0},{"id":"interactive-element-affordance","weight":0},{"id":"logical-tab-order","weight":0},{"id":"visual-order-follows-dom","weight":0},{"id":"focus-traps","weight":0},{"id":"managed-focus","weight":0},{"id":"use-landmarks","weight":0},{"id":"offscreen-content-hidden","weight":0},{"id":"custom-controls-labels","weight":0},{"id":"custom-controls-roles","weight":0},{"id":"table-duplicate-name","weight":0,"group":"a11y-best-practices"},{"id":"empty-heading","weight":0,"group":"a11y-best-practices"},{"id":"aria-allowed-role","weight":0,"group":"a11y-best-practices"},{"id":"image-redundant-alt","weight":0,"group":"a11y-names-labels"},{"id":"identical-links-same-purpose","weight":0,"group":"a11y-best-practices"},{"id":"label-content-name-mismatch","weight":0,"group":"hidden"},{"id":"table-fake-caption","weight":0,"group":"hidden"},{"id":"td-has-header","weight":0,"group":"hidden"}],"id":"accessibility","score":0.79},"best-practices":{"title":"Best Practices","supportedModes":["navigation","timespan","snapshot"],"auditRefs":[{"id":"is-on-https","weight":5,"group":"best-practices-trust-safety"},{"id":"redirects-http","weight":0,"group":"best-practices-trust-safety"},{"id":"geolocation-on-start","weight":1,"group":"best-practices-trust-safety"},{"id":"notification-on-start","weight":1,"group":"best-practices-trust-safety"},{"id":"csp-xss","weight":0,"group":"best-practices-trust-safety"},{"id":"has-hsts","weight":0,"group":"best-practices-trust-safety"},{"id":"origin-isolation","weight":0,"group":"best-practices-trust-safety"},{"id":"clickjacking-mitigation","weight":0,"group":"best-practices-trust-safety"},{"id":"trusted-types-xss","weight":0,"group":"best-practices-trust-safety"},{"id":"paste-preventing-inputs","weight":3,"group":"best-practices-ux"},{"id":"image-aspect-ratio","weight":1,"group":"best-practices-ux"},{"id":"image-size-responsive","weight":1,"group":"best-practices-ux"},{"id":"doctype","weight":1,"group":"best-practices-browser-compat"},{"id":"charset","weight":1,"group":"best-practices-browser-compat"},{"id":"baseline","weight":0,"group":"best-practices-browser-compat"},{"id":"js-libraries","weight":0,"group":"best-practices-general"},{"id":"deprecations","weight":5,"group":"best-practices-general"},{"id":"third-party-cookies","weight":5,"group":"best-practices-general"},{"id":"errors-in-console","weight":1,"group":"best-practices-general"},{"id":"valid-source-maps","weight":0,"group":"best-practices-general"},{"id":"inspector-issues","weight":1,"group":"best-practices-general"}],"id":"best-practices","score":1},"seo":{"title":"SEO","description":"These checks ensure that your page is following basic search engine optimization advice. There are many additional factors Lighthouse does not score here that may affect your search ranking, including performance on [Core Web Vitals](https://web.dev/explore/vitals). [Learn more about Google Search Essentials](https://support.google.com/webmasters/answer/35769).","manualDescription":"Run these additional validators on your site to check additional SEO best practices.","supportedModes":["navigation","snapshot"],"auditRefs":[{"id":"is-crawlable","weight":4.043478260869565,"group":"seo-crawl"},{"id":"document-title","weight":1,"group":"seo-content"},{"id":"meta-description","weight":1,"group":"seo-content"},{"id":"http-status-code","weight":1,"group":"seo-crawl"},{"id":"link-text","weight":1,"group":"seo-content"},{"id":"crawlable-anchors","weight":1,"group":"seo-crawl"},{"id":"robots-txt","weight":1,"group":"seo-crawl"},{"id":"image-alt","weight":1,"group":"seo-content"},{"id":"hreflang","weight":1,"group":"seo-content"},{"id":"canonical","weight":0,"group":"seo-content"},{"id":"structured-data","weight":0}],"id":"seo","score":0.75}},"categoryGroups":{"metrics":{"title":"Metrics"},"insights":{"title":"Insights","description":"These insights are also available in the Chrome DevTools Performance Panel - [record a trace](https://developer.chrome.com/docs/devtools/performance/reference) to view more detailed information."},"diagnostics":{"title":"Diagnostics","description":"More information about the performance of your application. These numbers don't [directly affect](https://developer.chrome.com/docs/lighthouse/performance/performance-scoring/) the Performance score."},"a11y-best-practices":{"title":"Best practices","description":"These items highlight common accessibility best practices."},"a11y-color-contrast":{"title":"Contrast","description":"These are opportunities to improve the legibility of your content."},"a11y-names-labels":{"title":"Names and labels","description":"These are opportunities to improve the semantics of the controls in your application. This may enhance the experience for users of assistive technology, like a screen reader."},"a11y-navigation":{"title":"Navigation","description":"These are opportunities to improve keyboard navigation in your application."},"a11y-aria":{"title":"ARIA","description":"These are opportunities to improve the usage of ARIA in your application which may enhance the experience for users of assistive technology, like a screen reader."},"a11y-language":{"title":"Internationalization and localization","description":"These are opportunities to improve the interpretation of your content by users in different locales."},"a11y-audio-video":{"title":"Audio and video","description":"These are opportunities to provide alternative content for audio and video. This may improve the experience for users with hearing or vision impairments."},"a11y-tables-lists":{"title":"Tables and lists","description":"These are opportunities to improve the experience of reading tabular or list data using assistive technology, like a screen reader."},"seo-mobile":{"title":"Mobile Friendly","description":"Make sure your pages are mobile friendly so users don’t have to pinch or zoom in order to read the content pages. [Learn how to make pages mobile-friendly](https://developers.google.com/search/mobile-sites/)."},"seo-content":{"title":"Content Best Practices","description":"Format your HTML in a way that enables crawlers to better understand your app’s content."},"seo-crawl":{"title":"Crawling and Indexing","description":"To appear in search results, crawlers need access to your app."},"best-practices-trust-safety":{"title":"Trust and Safety"},"best-practices-ux":{"title":"User Experience"},"best-practices-browser-compat":{"title":"Browser Compatibility"},"best-practices-general":{"title":"General"},"webmcp":{"title":"WebMCP","description":"Audits validating WebMCP integration."},"agent-accessibility":{"title":"Agent Accessibility","description":"These audits highlight best practices for improving the accessibility of the website for AI agents."},"hidden":{"title":""}},"stackPacks":[],"entities":[{"name":"localhost","origins":["http://localhost:5177"],"isFirstParty":true,"isUnrecognized":true},{"name":"Google Fonts","homepage":"https://fonts.google.com/","origins":["https://fonts.googleapis.com","https://fonts.gstatic.com"],"category":"cdn"}],"fullPageScreenshot":{"screenshot":{"data":"data:image/webp;base64,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","width":1440,"height":900},"nodes":{"page-0-DIV":{"id":"","top":425,"bottom":611,"left":59,"right":1357,"width":1298,"height":186},"page-1-svg":{"id":"","top":44,"bottom":68,"left":744,"right":768,"width":24,"height":24},"page-2-LINK":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-3-LINK":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-4-META":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-5-BODY":{"id":"","top":0,"bottom":900,"left":0,"right":1440,"width":1440,"height":900},"page-6-path":{"id":"","top":197,"bottom":201,"left":741,"right":749,"width":8,"height":4},"page-7-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-8-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-9-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-10-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-11-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-12-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-13-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-14-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-15-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-16-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-17-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-18-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-19-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-20-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-21-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-22-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-23-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-24-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-25-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-26-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-27-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-28-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-29-DIV":{"id":"reka-tabs-v-276-content-controls","top":70,"bottom":413,"left":59,"right":783,"width":724,"height":343},"page-30-SPAN":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"page-31-DIV":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-0-SPAN":{"id":"","top":450,"bottom":466,"left":72,"right":88,"width":16,"height":16},"1-1-BUTTON":{"id":"","top":179,"bottom":219,"left":306,"right":766,"width":460,"height":40},"1-2-BUTTON":{"id":"","top":251,"bottom":291,"left":76,"right":294,"width":218,"height":40},"1-3-BUTTON":{"id":"","top":299,"bottom":339,"left":76,"right":294,"width":218,"height":40},"1-4-BUTTON":{"id":"","top":468,"bottom":508,"left":76,"right":294,"width":218,"height":40},"1-5-BUTTON":{"id":"","top":540,"bottom":564,"left":306,"right":350,"width":44,"height":24},"1-6-IMG":{"id":"","top":46,"bottom":66,"left":672,"right":692,"width":20,"height":20},"1-7-INPUT":{"id":"","top":107,"bottom":147,"left":76,"right":294,"width":218,"height":40},"1-8-INPUT":{"id":"","top":107,"bottom":147,"left":306,"right":766,"width":460,"height":40},"1-9-INPUT":{"id":"","top":179,"bottom":219,"left":76,"right":294,"width":218,"height":40},"1-10-INPUT":{"id":"","top":516,"bottom":556,"left":76,"right":294,"width":218,"height":40},"1-11-HTML":{"id":"","top":0,"bottom":900,"left":0,"right":1440,"width":1440,"height":900},"1-12-BUTTON":{"id":"reka-popover-trigger-v-4","top":16,"bottom":40,"left":1424,"right":1448,"width":24,"height":24},"1-13-SPAN":{"id":"","top":42,"bottom":70,"left":698,"right":738,"width":41,"height":28},"1-14-DIV":{"id":"","top":29,"bottom":83,"left":665,"right":775,"width":111,"height":54},"1-15-LABEL":{"id":"","top":85,"bottom":105,"left":76,"right":155,"width":79,"height":20},"1-16-LABEL":{"id":"","top":85,"bottom":105,"left":306,"right":355,"width":49,"height":20},"1-17-LABEL":{"id":"","top":157,"bottom":177,"left":76,"right":175,"width":98,"height":20},"1-18-LABEL":{"id":"","top":157,"bottom":177,"left":306,"right":395,"width":89,"height":20},"1-19-LABEL":{"id":"","top":229,"bottom":249,"left":76,"right":165,"width":89,"height":20},"1-20-LABEL":{"id":"","top":247,"bottom":271,"left":306,"right":365,"width":59,"height":24},"1-21-LABEL":{"id":"","top":446,"bottom":465,"left":76,"right":116,"width":40,"height":19},"1-22-LABEL":{"id":"","top":444,"bottom":468,"left":306,"right":766,"width":460,"height":24},"1-23-LABEL":{"id":"","top":518,"bottom":537,"left":306,"right":362,"width":56,"height":19},"1-24-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-25-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-26-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-27-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-28-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-29-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-30-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-31-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-32-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-33-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-34-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-35-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-36-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-37-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-38-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-39-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-40-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-41-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-42-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-43-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-44-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-45-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-46-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-47-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-48-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-49-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-50-LABEL":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-51-INPUT":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-52-INPUT":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-53-INPUT":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-54-INPUT":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-55-INPUT":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-56-INPUT":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-57-INPUT":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-58-INPUT":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-59-INPUT":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-60-INPUT":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-61-INPUT":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-62-INPUT":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-63-IMG":{"id":"","top":40,"bottom":60,"left":886,"right":906,"width":20,"height":20},"1-64-DIV":{"id":"","top":0,"bottom":900,"left":0,"right":1440,"width":1440,"height":900},"1-65-LINK":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-66-LINK":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-67-LINK":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-68-LINK":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-69-LINK":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-70-LINK":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-71-LINK":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-72-LINK":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-73-LINK":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-74-LINK":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-75-LINK":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-76-META":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-77-META":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0},"1-78-META":{"id":"","top":0,"bottom":0,"left":0,"right":0,"width":0,"height":0}}},"timing":{"entries":[{"startTime":31339.43,"name":"lh:config","duration":54.09,"entryType":"measure"},{"startTime":31339.65,"name":"lh:config:resolveArtifactsToDefns","duration":0.4,"entryType":"measure"},{"startTime":31393.56,"name":"lh:runner:gather","duration":6125.38,"entryType":"measure"},{"startTime":31433.56,"name":"lh:driver:connect","duration":1.34,"entryType":"measure"},{"startTime":31434.91,"name":"lh:driver:navigate","duration":27.3,"entryType":"measure"},{"startTime":31462.26,"name":"lh:gather:getBenchmarkIndex","duration":1000.92,"entryType":"measure"},{"startTime":32463.18,"name":"lh:gather:getVersion","duration":0.34,"entryType":"measure"},{"startTime":32463.53,"name":"lh:gather:getDevicePixelRatio","duration":0.42,"entryType":"measure"},{"startTime":32463.98,"name":"lh:prepare:navigationMode","duration":16.88,"entryType":"measure"},{"startTime":32464.24,"name":"lh:gather:getVersion","duration":0.21,"entryType":"measure"},{"startTime":32470.41,"name":"lh:storage:clearDataForOrigin","duration":3.63,"entryType":"measure"},{"startTime":32474.06,"name":"lh:storage:clearBrowserCaches","duration":6.18,"entryType":"measure"},{"startTime":32480.49,"name":"lh:gather:prepareThrottlingAndNetwork","duration":0.38,"entryType":"measure"},{"startTime":32490.15,"name":"lh:driver:navigate","duration":2612.99,"entryType":"measure"},{"startTime":35415.35,"name":"lh:computed:NetworkRecords","duration":0.25,"entryType":"measure"},{"startTime":35415.63,"name":"lh:gather:getArtifact:DevtoolsLog","duration":0,"entryType":"measure"},{"startTime":35415.64,"name":"lh:gather:getArtifact:Trace","duration":0,"entryType":"measure"},{"startTime":35415.64,"name":"lh:gather:getArtifact:Accessibility","duration":90.39,"entryType":"measure"},{"startTime":35506.05,"name":"lh:gather:getArtifact:AnchorElements","duration":4.17,"entryType":"measure"},{"startTime":35510.24,"name":"lh:gather:getArtifact:ConsoleMessages","duration":0.01,"entryType":"measure"},{"startTime":35510.24,"name":"lh:gather:getArtifact:CSSUsage","duration":118.23,"entryType":"measure"},{"startTime":35628.49,"name":"lh:gather:getArtifact:Doctype","duration":0.43,"entryType":"measure"},{"startTime":35628.92,"name":"lh:gather:getArtifact:Inputs","duration":3.2,"entryType":"measure"},{"startTime":35632.14,"name":"lh:gather:getArtifact:ImageElements","duration":79.81,"entryType":"measure"},{"startTime":35711.96,"name":"lh:gather:getArtifact:InspectorIssues","duration":0.04,"entryType":"measure"},{"startTime":35712.01,"name":"lh:gather:getArtifact:JsUsage","duration":0.01,"entryType":"measure"},{"startTime":35712.01,"name":"lh:gather:getArtifact:LinkElements","duration":1.66,"entryType":"measure"},{"startTime":35713.63,"name":"lh:computed:MainResource","duration":0.03,"entryType":"measure"},{"startTime":35713.68,"name":"lh:gather:getArtifact:MainDocumentContent","duration":0.36,"entryType":"measure"},{"startTime":35714.04,"name":"lh:gather:getArtifact:MetaElements","duration":1.03,"entryType":"measure"},{"startTime":35715.08,"name":"lh:gather:getArtifact:NetworkUserAgent","duration":0.01,"entryType":"measure"},{"startTime":35715.09,"name":"lh:gather:getArtifact:RobotsTxt","duration":2.04,"entryType":"measure"},{"startTime":35717.14,"name":"lh:gather:getArtifact:Scripts","duration":0.01,"entryType":"measure"},{"startTime":35717.15,"name":"lh:gather:getArtifact:SourceMaps","duration":0,"entryType":"measure"},{"startTime":35717.16,"name":"lh:gather:getArtifact:Stacks","duration":3.95,"entryType":"measure"},{"startTime":35717.16,"name":"lh:gather:collectStacks","duration":3.94,"entryType":"measure"},{"startTime":35721.11,"name":"lh:gather:getArtifact:Stylesheets","duration":9.55,"entryType":"measure"},{"startTime":35730.69,"name":"lh:gather:getArtifact:TraceElements","duration":236.17,"entryType":"measure"},{"startTime":35730.7,"name":"lh:computed:TraceEngineResult","duration":201.07,"entryType":"measure"},{"startTime":35730.7,"name":"lh:computed:ProcessedTrace","duration":29.57,"entryType":"measure"},{"startTime":35761.7,"name":"lh:computed:TraceEngineResult:total","duration":162.56,"entryType":"measure"},{"startTime":35761.71,"name":"lh:computed:TraceEngineResult:parse","duration":119.28,"entryType":"measure"},{"startTime":35761.77,"name":"lh:computed:TraceEngineResult:parse:handleEvent","duration":57.58,"entryType":"measure"},{"startTime":35819.36,"name":"lh:computed:TraceEngineResult:parse:Meta:finalize","duration":1.32,"entryType":"measure"},{"startTime":35820.69,"name":"lh:computed:TraceEngineResult:parse:AnimationFrames:finalize","duration":1.35,"entryType":"measure"},{"startTime":35822.06,"name":"lh:computed:TraceEngineResult:parse:Animations:finalize","duration":1.58,"entryType":"measure"},{"startTime":35823.66,"name":"lh:computed:TraceEngineResult:parse:Samples:finalize","duration":1.31,"entryType":"measure"},{"startTime":35824.98,"name":"lh:computed:TraceEngineResult:parse:AuctionWorklets:finalize","duration":1.29,"entryType":"measure"},{"startTime":35826.28,"name":"lh:computed:TraceEngineResult:parse:NetworkRequests:finalize","duration":1.46,"entryType":"measure"},{"startTime":35827.75,"name":"lh:computed:TraceEngineResult:parse:Renderer:finalize","duration":10.86,"entryType":"measure"},{"startTime":35838.63,"name":"lh:computed:TraceEngineResult:parse:Flows:finalize","duration":4.21,"entryType":"measure"},{"startTime":35842.86,"name":"lh:computed:TraceEngineResult:parse:AsyncJSCalls:finalize","duration":1.35,"entryType":"measure"},{"startTime":35844.22,"name":"lh:computed:TraceEngineResult:parse:DOMStats:finalize","duration":1.27,"entryType":"measure"},{"startTime":35845.49,"name":"lh:computed:TraceEngineResult:parse:UserTimings:finalize","duration":1.28,"entryType":"measure"},{"startTime":35846.78,"name":"lh:computed:TraceEngineResult:parse:ExtensionTraceData:finalize","duration":1.31,"entryType":"measure"},{"startTime":35848.09,"name":"lh:computed:TraceEngineResult:parse:LayerTree:finalize","duration":2.22,"entryType":"measure"},{"startTime":35850.32,"name":"lh:computed:TraceEngineResult:parse:Frames:finalize","duration":4.18,"entryType":"measure"},{"startTime":35854.5,"name":"lh:computed:TraceEngineResult:parse:GPU:finalize","duration":1.32,"entryType":"measure"},{"startTime":35855.84,"name":"lh:computed:TraceEngineResult:parse:ImagePainting:finalize","duration":1.44,"entryType":"measure"},{"startTime":35857.28,"name":"lh:computed:TraceEngineResult:parse:Initiators:finalize","duration":1.39,"entryType":"measure"},{"startTime":35858.68,"name":"lh:computed:TraceEngineResult:parse:Invalidations:finalize","duration":1.28,"entryType":"measure"},{"startTime":35859.96,"name":"lh:computed:TraceEngineResult:parse:PageLoadMetrics:finalize","duration":1.33,"entryType":"measure"},{"startTime":35861.3,"name":"lh:computed:TraceEngineResult:parse:LargestImagePaint:finalize","duration":1.3,"entryType":"measure"},{"startTime":35862.59,"name":"lh:computed:TraceEngineResult:parse:LargestTextPaint:finalize","duration":1.28,"entryType":"measure"},{"startTime":35863.88,"name":"lh:computed:TraceEngineResult:parse:Screenshots:finalize","duration":6.35,"entryType":"measure"},{"startTime":35870.24,"name":"lh:computed:TraceEngineResult:parse:LayoutShifts:finalize","duration":1.47,"entryType":"measure"},{"startTime":35871.71,"name":"lh:computed:TraceEngineResult:parse:Memory:finalize","duration":1.31,"entryType":"measure"},{"startTime":35873.04,"name":"lh:computed:TraceEngineResult:parse:PageFrames:finalize","duration":1.3,"entryType":"measure"},{"startTime":35874.35,"name":"lh:computed:TraceEngineResult:parse:Scripts:finalize","duration":1.31,"entryType":"measure"},{"startTime":35875.67,"name":"lh:computed:TraceEngineResult:parse:SelectorStats:finalize","duration":1.28,"entryType":"measure"},{"startTime":35876.96,"name":"lh:computed:TraceEngineResult:parse:UserInteractions:finalize","duration":1.3,"entryType":"measure"},{"startTime":35878.26,"name":"lh:computed:TraceEngineResult:parse:Workers:finalize","duration":1.28,"entryType":"measure"},{"startTime":35879.55,"name":"lh:computed:TraceEngineResult:parse:Warnings:finalize","duration":1.32,"entryType":"measure"},{"startTime":35880.87,"name":"lh:computed:TraceEngineResult:parse:handler.data()","duration":0.12,"entryType":"measure"},{"startTime":35880.99,"name":"lh:computed:TraceEngineResult:insights","duration":43.27,"entryType":"measure"},{"startTime":35881.02,"name":"lh:computed:TraceEngineResult:insights:CLSCulprits","duration":0.1,"entryType":"measure"},{"startTime":35881.12,"name":"lh:computed:TraceEngineResult:insights:Cache","duration":0.01,"entryType":"measure"},{"startTime":35881.14,"name":"lh:computed:TraceEngineResult:insights:CharacterSet","duration":0.01,"entryType":"measure"},{"startTime":35881.14,"name":"lh:computed:TraceEngineResult:insights:DOMSize","duration":0.03,"entryType":"measure"},{"startTime":35881.17,"name":"lh:computed:TraceEngineResult:insights:DocumentLatency","duration":0,"entryType":"measure"},{"startTime":35881.17,"name":"lh:computed:TraceEngineResult:insights:DuplicatedJavaScript","duration":0.02,"entryType":"measure"},{"startTime":35881.19,"name":"lh:computed:TraceEngineResult:insights:FontDisplay","duration":0.01,"entryType":"measure"},{"startTime":35881.21,"name":"lh:computed:TraceEngineResult:insights:ForcedReflow","duration":0.01,"entryType":"measure"},{"startTime":35881.22,"name":"lh:computed:TraceEngineResult:insights:INPBreakdown","duration":0.01,"entryType":"measure"},{"startTime":35881.22,"name":"lh:computed:TraceEngineResult:insights:ImageDelivery","duration":0.01,"entryType":"measure"},{"startTime":35881.23,"name":"lh:computed:TraceEngineResult:insights:LCPBreakdown","duration":0,"entryType":"measure"},{"startTime":35881.24,"name":"lh:computed:TraceEngineResult:insights:LCPDiscovery","duration":0,"entryType":"measure"},{"startTime":35881.24,"name":"lh:computed:TraceEngineResult:insights:LegacyJavaScript","duration":0.01,"entryType":"measure"},{"startTime":35881.25,"name":"lh:computed:TraceEngineResult:insights:ModernHTTP","duration":0.01,"entryType":"measure"},{"startTime":35881.27,"name":"lh:computed:TraceEngineResult:insights:NetworkDependencyTree","duration":0.01,"entryType":"measure"},{"startTime":35881.28,"name":"lh:computed:TraceEngineResult:insights:RenderBlocking","duration":0.01,"entryType":"measure"},{"startTime":35881.28,"name":"lh:computed:TraceEngineResult:insights:SlowCSSSelector","duration":0.01,"entryType":"measure"},{"startTime":35881.29,"name":"lh:computed:TraceEngineResult:insights:ThirdParties","duration":1.16,"entryType":"measure"},{"startTime":35882.45,"name":"lh:computed:TraceEngineResult:insights:Viewport","duration":0.07,"entryType":"measure"},{"startTime":35882.53,"name":"lh:computed:TraceEngineResult:insights:createLanternContext","duration":8.88,"entryType":"measure"},{"startTime":35891.44,"name":"lh:computed:TraceEngineResult:insights:CLSCulprits","duration":0.29,"entryType":"measure"},{"startTime":35891.74,"name":"lh:computed:TraceEngineResult:insights:Cache","duration":0.28,"entryType":"measure"},{"startTime":35892.02,"name":"lh:computed:TraceEngineResult:insights:CharacterSet","duration":0.02,"entryType":"measure"},{"startTime":35892.05,"name":"lh:computed:TraceEngineResult:insights:DOMSize","duration":0.03,"entryType":"measure"},{"startTime":35892.08,"name":"lh:computed:TraceEngineResult:insights:DocumentLatency","duration":0.03,"entryType":"measure"},{"startTime":35892.11,"name":"lh:computed:TraceEngineResult:insights:DuplicatedJavaScript","duration":0.03,"entryType":"measure"},{"startTime":35892.14,"name":"lh:computed:TraceEngineResult:insights:FontDisplay","duration":0.01,"entryType":"measure"},{"startTime":35892.15,"name":"lh:computed:TraceEngineResult:insights:ForcedReflow","duration":0.01,"entryType":"measure"},{"startTime":35892.16,"name":"lh:computed:TraceEngineResult:insights:INPBreakdown","duration":0.01,"entryType":"measure"},{"startTime":35892.16,"name":"lh:computed:TraceEngineResult:insights:ImageDelivery","duration":0.02,"entryType":"measure"},{"startTime":35892.18,"name":"lh:computed:TraceEngineResult:insights:LCPBreakdown","duration":0.03,"entryType":"measure"},{"startTime":35892.21,"name":"lh:computed:TraceEngineResult:insights:LCPDiscovery","duration":0.01,"entryType":"measure"},{"startTime":35892.22,"name":"lh:computed:TraceEngineResult:insights:LegacyJavaScript","duration":24.79,"entryType":"measure"},{"startTime":35917.02,"name":"lh:computed:TraceEngineResult:insights:ModernHTTP","duration":0.32,"entryType":"measure"},{"startTime":35917.34,"name":"lh:computed:TraceEngineResult:insights:NetworkDependencyTree","duration":0.24,"entryType":"measure"},{"startTime":35917.58,"name":"lh:computed:TraceEngineResult:insights:RenderBlocking","duration":0.02,"entryType":"measure"},{"startTime":35917.6,"name":"lh:computed:TraceEngineResult:insights:SlowCSSSelector","duration":0.01,"entryType":"measure"},{"startTime":35917.6,"name":"lh:computed:TraceEngineResult:insights:ThirdParties","duration":6.4,"entryType":"measure"},{"startTime":35924.01,"name":"lh:computed:TraceEngineResult:insights:Viewport","duration":0.17,"entryType":"measure"},{"startTime":35935.84,"name":"lh:computed:CumulativeLayoutShift","duration":9.15,"entryType":"measure"},{"startTime":35966.88,"name":"lh:gather:getArtifact:ViewportDimensions","duration":0.33,"entryType":"measure"},{"startTime":35967.21,"name":"lh:gather:getArtifact:FullPageScreenshot","duration":1084.12,"entryType":"measure"},{"startTime":37050.26,"name":"lh:gather:getVersion","duration":0.33,"entryType":"measure"},{"startTime":37051.34,"name":"lh:gather:getArtifact:BFCacheFailures","duration":283.75,"entryType":"measure"},{"startTime":37519.02,"name":"lh:runner:audit","duration":164.48,"entryType":"measure"},{"startTime":37519.03,"name":"lh:runner:auditing","duration":164.43,"entryType":"measure"},{"startTime":37519.28,"name":"lh:audit:is-on-https","duration":0.32,"entryType":"measure"},{"startTime":37519.66,"name":"lh:audit:redirects-http","duration":0.17,"entryType":"measure"},{"startTime":37519.88,"name":"lh:audit:first-contentful-paint","duration":6.34,"entryType":"measure"},{"startTime":37519.95,"name":"lh:computed:FirstContentfulPaint","duration":6.04,"entryType":"measure"},{"startTime":37519.97,"name":"lh:computed:ProcessedNavigation","duration":1.03,"entryType":"measure"},{"startTime":37521.03,"name":"lh:computed:LanternFirstContentfulPaint","duration":4.96,"entryType":"measure"},{"startTime":37521.05,"name":"lh:computed:PageDependencyGraph","duration":4.47,"entryType":"measure"},{"startTime":37525.54,"name":"lh:computed:LoadSimulator","duration":0.12,"entryType":"measure"},{"startTime":37525.55,"name":"lh:computed:NetworkAnalysis","duration":0.09,"entryType":"measure"},{"startTime":37526.28,"name":"lh:audit:largest-contentful-paint","duration":0.56,"entryType":"measure"},{"startTime":37526.33,"name":"lh:computed:LargestContentfulPaint","duration":0.37,"entryType":"measure"},{"startTime":37526.34,"name":"lh:computed:LanternLargestContentfulPaint","duration":0.35,"entryType":"measure"},{"startTime":37526.88,"name":"lh:audit:speed-index","duration":30.55,"entryType":"measure"},{"startTime":37526.92,"name":"lh:computed:SpeedIndex","duration":30.24,"entryType":"measure"},{"startTime":37526.93,"name":"lh:computed:LanternSpeedIndex","duration":30.22,"entryType":"measure"},{"startTime":37526.93,"name":"lh:computed:Speedline","duration":29.8,"entryType":"measure"},{"startTime":37557.46,"name":"lh:audit:screenshot-thumbnails","duration":0.03,"entryType":"measure"},{"startTime":37557.49,"name":"lh:audit:final-screenshot","duration":1.28,"entryType":"measure"},{"startTime":37557.5,"name":"lh:computed:Screenshots","duration":1.26,"entryType":"measure"},{"startTime":37558.84,"name":"lh:audit:total-blocking-time","duration":0.69,"entryType":"measure"},{"startTime":37558.9,"name":"lh:computed:TotalBlockingTime","duration":0.47,"entryType":"measure"},{"startTime":37558.91,"name":"lh:computed:LanternTotalBlockingTime","duration":0.46,"entryType":"measure"},{"startTime":37558.92,"name":"lh:computed:LanternInteractive","duration":0.25,"entryType":"measure"},{"startTime":37559.57,"name":"lh:audit:max-potential-fid","duration":0.95,"entryType":"measure"},{"startTime":37559.62,"name":"lh:computed:MaxPotentialFID","duration":0.21,"entryType":"measure"},{"startTime":37559.62,"name":"lh:computed:LanternMaxPotentialFID","duration":0.2,"entryType":"measure"},{"startTime":37560.57,"name":"lh:audit:cumulative-layout-shift","duration":0.14,"entryType":"measure"},{"startTime":37560.76,"name":"lh:audit:errors-in-console","duration":0.18,"entryType":"measure"},{"startTime":37560.81,"name":"lh:computed:JSBundles","duration":0,"entryType":"measure"},{"startTime":37560.99,"name":"lh:audit:server-response-time","duration":0.21,"entryType":"measure"},{"startTime":37561.03,"name":"lh:computed:NavigationInsights","duration":0.01,"entryType":"measure"},{"startTime":37561.23,"name":"lh:audit:interactive","duration":0.15,"entryType":"measure"},{"startTime":37561.27,"name":"lh:computed:Interactive","duration":0.01,"entryType":"measure"},{"startTime":37561.43,"name":"lh:audit:user-timings","duration":1.87,"entryType":"measure"},{"startTime":37561.46,"name":"lh:computed:UserTimings","duration":1.73,"entryType":"measure"},{"startTime":37563.33,"name":"lh:audit:redirects","duration":0.64,"entryType":"measure"},{"startTime":37564.03,"name":"lh:audit:image-aspect-ratio","duration":0.18,"entryType":"measure"},{"startTime":37564.25,"name":"lh:audit:image-size-responsive","duration":0.23,"entryType":"measure"},{"startTime":37564.3,"name":"lh:computed:ImageRecords","duration":0.03,"entryType":"measure"},{"startTime":37564.53,"name":"lh:audit:deprecations","duration":0.15,"entryType":"measure"},{"startTime":37564.73,"name":"lh:audit:third-party-cookies","duration":0.14,"entryType":"measure"},{"startTime":37564.92,"name":"lh:audit:mainthread-work-breakdown","duration":8.07,"entryType":"measure"},{"startTime":37564.98,"name":"lh:computed:MainThreadTasks","duration":7.32,"entryType":"measure"},{"startTime":37573.06,"name":"lh:audit:bootup-time","duration":3.6,"entryType":"measure"},{"startTime":37574.24,"name":"lh:computed:TBTImpactTasks","duration":1.94,"entryType":"measure"},{"startTime":37576.67,"name":"lh:audit:diagnostics","duration":0.26,"entryType":"measure"},{"startTime":37576.93,"name":"lh:audit:network-requests","duration":0.25,"entryType":"measure"},{"startTime":37576.94,"name":"lh:computed:EntityClassification","duration":0.12,"entryType":"measure"},{"startTime":37577.23,"name":"lh:audit:network-rtt","duration":0.19,"entryType":"measure"},{"startTime":37577.46,"name":"lh:audit:network-server-latency","duration":0.15,"entryType":"measure"},{"startTime":37577.62,"name":"lh:audit:main-thread-tasks","duration":0.13,"entryType":"measure"},{"startTime":37577.74,"name":"lh:audit:metrics","duration":1.54,"entryType":"measure"},{"startTime":37577.75,"name":"lh:computed:TimingSummary","duration":1.51,"entryType":"measure"},{"startTime":37577.77,"name":"lh:computed:FirstContentfulPaintAllFrames","duration":0.02,"entryType":"measure"},{"startTime":37577.8,"name":"lh:computed:LargestContentfulPaintAllFrames","duration":0.01,"entryType":"measure"},{"startTime":37577.83,"name":"lh:computed:LCPBreakdown","duration":1.4,"entryType":"measure"},{"startTime":37577.83,"name":"lh:computed:TimeToFirstByte","duration":0.03,"entryType":"measure"},{"startTime":37577.86,"name":"lh:computed:LCPImageRecord","duration":1.35,"entryType":"measure"},{"startTime":37579.29,"name":"lh:audit:resource-summary","duration":0.19,"entryType":"measure"},{"startTime":37579.3,"name":"lh:computed:ResourceSummary","duration":0.07,"entryType":"measure"},{"startTime":37579.53,"name":"lh:audit:layout-shifts","duration":0.22,"entryType":"measure"},{"startTime":37579.79,"name":"lh:audit:long-tasks","duration":1.13,"entryType":"measure"},{"startTime":37580.95,"name":"lh:audit:non-composited-animations","duration":0.25,"entryType":"measure"},{"startTime":37581.25,"name":"lh:audit:unsized-images","duration":0.18,"entryType":"measure"},{"startTime":37581.49,"name":"lh:audit:valid-source-maps","duration":0.2,"entryType":"measure"},{"startTime":37581.73,"name":"lh:audit:csp-xss","duration":0.14,"entryType":"measure"},{"startTime":37581.91,"name":"lh:audit:has-hsts","duration":0.14,"entryType":"measure"},{"startTime":37582.08,"name":"lh:audit:origin-isolation","duration":0.14,"entryType":"measure"},{"startTime":37582.25,"name":"lh:audit:clickjacking-mitigation","duration":0.14,"entryType":"measure"},{"startTime":37582.43,"name":"lh:audit:trusted-types-xss","duration":0.13,"entryType":"measure"},{"startTime":37582.56,"name":"lh:audit:script-treemap-data","duration":5.52,"entryType":"measure"},{"startTime":37582.57,"name":"lh:computed:ModuleDuplication","duration":0.01,"entryType":"measure"},{"startTime":37582.58,"name":"lh:computed:UnusedJavascriptSummary","duration":0.01,"entryType":"measure"},{"startTime":37582.6,"name":"lh:computed:UnusedJavascriptSummary","duration":0,"entryType":"measure"},{"startTime":37582.6,"name":"lh:computed:UnusedJavascriptSummary","duration":0.77,"entryType":"measure"},{"startTime":37583.38,"name":"lh:computed:UnusedJavascriptSummary","duration":0.01,"entryType":"measure"},{"startTime":37583.39,"name":"lh:computed:UnusedJavascriptSummary","duration":1.08,"entryType":"measure"},{"startTime":37584.48,"name":"lh:computed:UnusedJavascriptSummary","duration":0.03,"entryType":"measure"},{"startTime":37584.51,"name":"lh:computed:UnusedJavascriptSummary","duration":1.38,"entryType":"measure"},{"startTime":37585.9,"name":"lh:computed:UnusedJavascriptSummary","duration":0.42,"entryType":"measure"},{"startTime":37586.33,"name":"lh:computed:UnusedJavascriptSummary","duration":0.01,"entryType":"measure"},{"startTime":37586.34,"name":"lh:computed:UnusedJavascriptSummary","duration":0.02,"entryType":"measure"},{"startTime":37586.37,"name":"lh:computed:UnusedJavascriptSummary","duration":1.68,"entryType":"measure"},{"startTime":37588.15,"name":"lh:audit:accesskeys","duration":0.16,"entryType":"measure"},{"startTime":37588.36,"name":"lh:audit:aria-allowed-attr","duration":0.8,"entryType":"measure"},{"startTime":37589.42,"name":"lh:audit:aria-allowed-role","duration":0.98,"entryType":"measure"},{"startTime":37590.51,"name":"lh:audit:aria-command-name","duration":1.02,"entryType":"measure"},{"startTime":37591.64,"name":"lh:audit:aria-conditional-attr","duration":0.98,"entryType":"measure"},{"startTime":37592.67,"name":"lh:audit:aria-deprecated-role","duration":0.91,"entryType":"measure"},{"startTime":37593.64,"name":"lh:audit:aria-dialog-name","duration":0.2,"entryType":"measure"},{"startTime":37593.9,"name":"lh:audit:aria-hidden-body","duration":0.95,"entryType":"measure"},{"startTime":37594.91,"name":"lh:audit:aria-hidden-focus","duration":0.97,"entryType":"measure"},{"startTime":37595.94,"name":"lh:audit:aria-input-field-name","duration":0.91,"entryType":"measure"},{"startTime":37596.91,"name":"lh:audit:aria-meter-name","duration":0.21,"entryType":"measure"},{"startTime":37597.18,"name":"lh:audit:aria-progressbar-name","duration":0.24,"entryType":"measure"},{"startTime":37597.47,"name":"lh:audit:aria-prohibited-attr","duration":1.13,"entryType":"measure"},{"startTime":37598.67,"name":"lh:audit:aria-required-attr","duration":1.05,"entryType":"measure"},{"startTime":37599.79,"name":"lh:audit:aria-required-children","duration":0.27,"entryType":"measure"},{"startTime":37600.12,"name":"lh:audit:aria-required-parent","duration":0.27,"entryType":"measure"},{"startTime":37600.44,"name":"lh:audit:aria-roles","duration":0.93,"entryType":"measure"},{"startTime":37601.43,"name":"lh:audit:aria-text","duration":0.31,"entryType":"measure"},{"startTime":37601.8,"name":"lh:audit:aria-toggle-field-name","duration":0.32,"entryType":"measure"},{"startTime":37602.18,"name":"lh:audit:aria-tooltip-name","duration":0.36,"entryType":"measure"},{"startTime":37602.59,"name":"lh:audit:aria-treeitem-name","duration":0.35,"entryType":"measure"},{"startTime":37603,"name":"lh:audit:aria-valid-attr-value","duration":0.92,"entryType":"measure"},{"startTime":37604.08,"name":"lh:audit:aria-valid-attr","duration":0.96,"entryType":"measure"},{"startTime":37605.09,"name":"lh:audit:button-name","duration":1.28,"entryType":"measure"},{"startTime":37606.47,"name":"lh:audit:bypass","duration":0.59,"entryType":"measure"},{"startTime":37607.13,"name":"lh:audit:color-contrast","duration":0.98,"entryType":"measure"},{"startTime":37608.17,"name":"lh:audit:definition-list","duration":0.44,"entryType":"measure"},{"startTime":37608.67,"name":"lh:audit:dlitem","duration":5.4,"entryType":"measure"},{"startTime":37614.13,"name":"lh:audit:document-title","duration":0.93,"entryType":"measure"},{"startTime":37615.12,"name":"lh:audit:duplicate-id-aria","duration":0.36,"entryType":"measure"},{"startTime":37615.53,"name":"lh:audit:empty-heading","duration":0.38,"entryType":"measure"},{"startTime":37615.96,"name":"lh:audit:form-field-multiple-labels","duration":0.84,"entryType":"measure"},{"startTime":37616.86,"name":"lh:audit:frame-title","duration":0.38,"entryType":"measure"},{"startTime":37617.28,"name":"lh:audit:heading-order","duration":0.43,"entryType":"measure"},{"startTime":37617.77,"name":"lh:audit:html-has-lang","duration":1.28,"entryType":"measure"},{"startTime":37619.12,"name":"lh:audit:html-lang-valid","duration":1.16,"entryType":"measure"},{"startTime":37620.33,"name":"lh:audit:html-xml-lang-mismatch","duration":0.59,"entryType":"measure"},{"startTime":37621,"name":"lh:audit:identical-links-same-purpose","duration":0.56,"entryType":"measure"},{"startTime":37621.61,"name":"lh:audit:image-alt","duration":1.05,"entryType":"measure"},{"startTime":37622.72,"name":"lh:audit:image-redundant-alt","duration":0.9,"entryType":"measure"},{"startTime":37623.67,"name":"lh:audit:input-button-name","duration":0.43,"entryType":"measure"},{"startTime":37624.14,"name":"lh:audit:input-image-alt","duration":0.45,"entryType":"measure"},{"startTime":37624.64,"name":"lh:audit:label-content-name-mismatch","duration":0.46,"entryType":"measure"},{"startTime":37625.15,"name":"lh:audit:label","duration":0.84,"entryType":"measure"},{"startTime":37626.04,"name":"lh:audit:landmark-one-main","duration":0.9,"entryType":"measure"},{"startTime":37627,"name":"lh:audit:link-name","duration":0.53,"entryType":"measure"},{"startTime":37627.58,"name":"lh:audit:link-in-text-block","duration":0.6,"entryType":"measure"},{"startTime":37628.23,"name":"lh:audit:list","duration":1.11,"entryType":"measure"},{"startTime":37629.42,"name":"lh:audit:listitem","duration":0.76,"entryType":"measure"},{"startTime":37630.24,"name":"lh:audit:meta-refresh","duration":0.79,"entryType":"measure"},{"startTime":37631.1,"name":"lh:audit:meta-viewport","duration":1.15,"entryType":"measure"},{"startTime":37632.31,"name":"lh:audit:object-alt","duration":0.52,"entryType":"measure"},{"startTime":37632.88,"name":"lh:audit:select-name","duration":0.53,"entryType":"measure"},{"startTime":37633.46,"name":"lh:audit:skip-link","duration":0.5,"entryType":"measure"},{"startTime":37634.01,"name":"lh:audit:tabindex","duration":0.78,"entryType":"measure"},{"startTime":37634.85,"name":"lh:audit:table-duplicate-name","duration":0.59,"entryType":"measure"},{"startTime":37635.49,"name":"lh:audit:table-fake-caption","duration":2.45,"entryType":"measure"},{"startTime":37637.99,"name":"lh:audit:target-size","duration":0.79,"entryType":"measure"},{"startTime":37638.83,"name":"lh:audit:td-has-header","duration":0.69,"entryType":"measure"},{"startTime":37639.58,"name":"lh:audit:td-headers-attr","duration":0.74,"entryType":"measure"},{"startTime":37640.37,"name":"lh:audit:th-has-data-cells","duration":0.69,"entryType":"measure"},{"startTime":37641.11,"name":"lh:audit:valid-lang","duration":0.66,"entryType":"measure"},{"startTime":37641.83,"name":"lh:audit:video-caption","duration":0.67,"entryType":"measure"},{"startTime":37642.51,"name":"lh:audit:custom-controls-labels","duration":0.01,"entryType":"measure"},{"startTime":37642.52,"name":"lh:audit:custom-controls-roles","duration":0,"entryType":"measure"},{"startTime":37642.52,"name":"lh:audit:focus-traps","duration":0,"entryType":"measure"},{"startTime":37642.53,"name":"lh:audit:focusable-controls","duration":0,"entryType":"measure"},{"startTime":37642.53,"name":"lh:audit:interactive-element-affordance","duration":0,"entryType":"measure"},{"startTime":37642.53,"name":"lh:audit:logical-tab-order","duration":0,"entryType":"measure"},{"startTime":37642.54,"name":"lh:audit:managed-focus","duration":0,"entryType":"measure"},{"startTime":37642.54,"name":"lh:audit:offscreen-content-hidden","duration":0,"entryType":"measure"},{"startTime":37642.55,"name":"lh:audit:use-landmarks","duration":0,"entryType":"measure"},{"startTime":37642.55,"name":"lh:audit:visual-order-follows-dom","duration":0,"entryType":"measure"},{"startTime":37642.6,"name":"lh:audit:autocomplete-valid","duration":0.29,"entryType":"measure"},{"startTime":37642.94,"name":"lh:audit:presentation-role-conflict","duration":0.59,"entryType":"measure"},{"startTime":37643.58,"name":"lh:audit:svg-img-alt","duration":0.57,"entryType":"measure"},{"startTime":37644.19,"name":"lh:audit:total-byte-weight","duration":0.31,"entryType":"measure"},{"startTime":37644.54,"name":"lh:audit:unminified-css","duration":6.41,"entryType":"measure"},{"startTime":37650.99,"name":"lh:audit:unminified-javascript","duration":13.04,"entryType":"measure"},{"startTime":37664.08,"name":"lh:audit:unused-css-rules","duration":0.63,"entryType":"measure"},{"startTime":37664.14,"name":"lh:computed:UnusedCSS","duration":0.24,"entryType":"measure"},{"startTime":37664.74,"name":"lh:audit:unused-javascript","duration":0.49,"entryType":"measure"},{"startTime":37665.29,"name":"lh:audit:doctype","duration":0.15,"entryType":"measure"},{"startTime":37665.48,"name":"lh:audit:charset","duration":0.16,"entryType":"measure"},{"startTime":37665.69,"name":"lh:audit:geolocation-on-start","duration":0.17,"entryType":"measure"},{"startTime":37665.91,"name":"lh:audit:inspector-issues","duration":0.15,"entryType":"measure"},{"startTime":37666.09,"name":"lh:audit:js-libraries","duration":0.11,"entryType":"measure"},{"startTime":37666.26,"name":"lh:audit:notification-on-start","duration":0.16,"entryType":"measure"},{"startTime":37666.46,"name":"lh:audit:paste-preventing-inputs","duration":0.15,"entryType":"measure"},{"startTime":37666.65,"name":"lh:audit:baseline","duration":1.34,"entryType":"measure"},{"startTime":37668.04,"name":"lh:audit:meta-description","duration":0.15,"entryType":"measure"},{"startTime":37668.24,"name":"lh:audit:http-status-code","duration":0.14,"entryType":"measure"},{"startTime":37668.43,"name":"lh:audit:link-text","duration":0.14,"entryType":"measure"},{"startTime":37668.62,"name":"lh:audit:crawlable-anchors","duration":0.15,"entryType":"measure"},{"startTime":37668.82,"name":"lh:audit:is-crawlable","duration":0.24,"entryType":"measure"},{"startTime":37669.1,"name":"lh:audit:robots-txt","duration":0.62,"entryType":"measure"},{"startTime":37669.77,"name":"lh:audit:hreflang","duration":0.15,"entryType":"measure"},{"startTime":37669.97,"name":"lh:audit:canonical","duration":0.15,"entryType":"measure"},{"startTime":37670.15,"name":"lh:audit:structured-data","duration":0.1,"entryType":"measure"},{"startTime":37670.3,"name":"lh:audit:bf-cache","duration":0.19,"entryType":"measure"},{"startTime":37670.53,"name":"lh:audit:cache-insight","duration":0.22,"entryType":"measure"},{"startTime":37670.8,"name":"lh:audit:cls-culprits-insight","duration":0.33,"entryType":"measure"},{"startTime":37671.18,"name":"lh:audit:document-latency-insight","duration":0.18,"entryType":"measure"},{"startTime":37671.41,"name":"lh:audit:dom-size-insight","duration":0.18,"entryType":"measure"},{"startTime":37671.64,"name":"lh:audit:duplicated-javascript-insight","duration":0.14,"entryType":"measure"},{"startTime":37671.84,"name":"lh:audit:font-display-insight","duration":0.27,"entryType":"measure"},{"startTime":37672.16,"name":"lh:audit:forced-reflow-insight","duration":0.21,"entryType":"measure"},{"startTime":37672.42,"name":"lh:audit:image-delivery-insight","duration":0.21,"entryType":"measure"},{"startTime":37672.68,"name":"lh:audit:inp-breakdown-insight","duration":0.14,"entryType":"measure"},{"startTime":37672.87,"name":"lh:audit:lcp-breakdown-insight","duration":0.18,"entryType":"measure"},{"startTime":37673.1,"name":"lh:audit:lcp-discovery-insight","duration":0.14,"entryType":"measure"},{"startTime":37673.3,"name":"lh:audit:legacy-javascript-insight","duration":0.19,"entryType":"measure"},{"startTime":37673.53,"name":"lh:audit:modern-http-insight","duration":0.14,"entryType":"measure"},{"startTime":37673.72,"name":"lh:audit:network-dependency-tree-insight","duration":0.22,"entryType":"measure"},{"startTime":37673.99,"name":"lh:audit:render-blocking-insight","duration":0.17,"entryType":"measure"},{"startTime":37674.21,"name":"lh:audit:third-parties-insight","duration":9.04,"entryType":"measure"},{"startTime":37683.3,"name":"lh:audit:viewport-insight","duration":0.15,"entryType":"measure"},{"startTime":37683.46,"name":"lh:runner:generate","duration":0.04,"entryType":"measure"}],"total":6289.86},"i18n":{"rendererFormattedStrings":{"calculatorLink":"See calculator.","collapseView":"Collapse view","crcInitialNavigation":"Initial Navigation","crcLongestDurationLabel":"Maximum critical path latency:","dropdownCopyJSON":"Copy JSON","dropdownDarkTheme":"Toggle Dark Theme","dropdownPrintExpanded":"Print Expanded","dropdownPrintSummary":"Print Summary","dropdownSaveGist":"Save as Gist","dropdownSaveHTML":"Save as HTML","dropdownSaveJSON":"Save as JSON","dropdownViewUnthrottledTrace":"View Unthrottled Trace","dropdownViewer":"Open in Viewer","errorLabel":"Error!","errorMissingAuditInfo":"Report error: no audit information","expandView":"Expand view","firstPartyChipLabel":"1st party","footerIssue":"File an issue","hide":"Hide","labDataTitle":"Lab Data","lsPerformanceCategoryDescription":"[Lighthouse](https://developers.google.com/web/tools/lighthouse/) analysis of the current page on an emulated mobile network. Values are estimated and may vary.","manualAuditsGroupTitle":"Additional items to manually check","notApplicableAuditsGroupTitle":"Not applicable","openInANewTabTooltip":"Open in a new tab","opportunityResourceColumnLabel":"Opportunity","opportunitySavingsColumnLabel":"Estimated Savings","passedAuditsGroupTitle":"Passed audits","runtimeAnalysisWindow":"Initial page load","runtimeAnalysisWindowSnapshot":"Point-in-time snapshot","runtimeAnalysisWindowTimespan":"User interactions timespan","runtimeCustom":"Custom throttling","runtimeDesktopEmulation":"Emulated Desktop","runtimeMobileEmulation":"Emulated Moto G Power","runtimeNoEmulation":"No emulation","runtimeSettingsAxeVersion":"Axe version","runtimeSettingsBenchmark":"Unthrottled CPU/Memory Power","runtimeSettingsCPUThrottling":"CPU throttling","runtimeSettingsDevice":"Device","runtimeSettingsNetworkThrottling":"Network throttling","runtimeSettingsScreenEmulation":"Screen emulation","runtimeSettingsUANetwork":"User agent (network)","runtimeSingleLoad":"Single page session","runtimeSingleLoadTooltip":"This data is taken from a single page session, as opposed to field data summarizing many sessions.","runtimeSlow4g":"Slow 4G throttling","runtimeUnknown":"Unknown","show":"Show","showRelevantAudits":"Show audits relevant to:","snippetCollapseButtonLabel":"Collapse snippet","snippetExpandButtonLabel":"Expand snippet","thirdPartyResourcesLabel":"Show 3rd-party resources","throttlingProvided":"Provided by environment","toplevelWarningsMessage":"There were issues affecting this run of Lighthouse:","unattributable":"Unattributable","unscoredLabel":"Unscored","unscoredTitle":"This audit does not contribute to the overall category score.","varianceDisclaimer":"Values are estimated and may vary. The [performance score is calculated](https://developer.chrome.com/docs/lighthouse/performance/performance-scoring/) directly from these metrics.","viewTraceLabel":"View Trace","viewTreemapLabel":"View Treemap","warningAuditsGroupTitle":"Passed audits but with warnings","warningHeader":"Warnings: "},"icuMessagePaths":{"core/audits/is-on-https.js | title":["audits[is-on-https].title"],"core/audits/is-on-https.js | description":["audits[is-on-https].description"],"core/audits/is-on-https.js | columnInsecureURL":["audits[is-on-https].details.headings[0].label"],"core/audits/is-on-https.js | columnResolution":["audits[is-on-https].details.headings[1].label"],"core/audits/redirects-http.js | title":["audits[redirects-http].title"],"core/audits/redirects-http.js | description":["audits[redirects-http].description"],"core/lib/i18n/i18n.js | firstContentfulPaintMetric":["audits[first-contentful-paint].title"],"core/audits/metrics/first-contentful-paint.js | description":["audits[first-contentful-paint].description"],"core/lib/i18n/i18n.js | seconds":[{"values":{"timeInMs":1188.2020000000002},"path":"audits[first-contentful-paint].displayValue"},{"values":{"timeInMs":1848.436},"path":"audits[largest-contentful-paint].displayValue"},{"values":{"timeInMs":1188.2020000000002},"path":"audits[speed-index].displayValue"},{"values":{"timeInMs":1851.786},"path":"audits.interactive.displayValue"},{"values":{"timeInMs":367.50500000000187},"path":"audits[mainthread-work-breakdown].displayValue"},{"values":{"timeInMs":252.64500000000893},"path":"audits[bootup-time].displayValue"}],"core/lib/i18n/i18n.js | largestContentfulPaintMetric":["audits[largest-contentful-paint].title"],"core/audits/metrics/largest-contentful-paint.js | description":["audits[largest-contentful-paint].description"],"core/lib/i18n/i18n.js | speedIndexMetric":["audits[speed-index].title"],"core/audits/metrics/speed-index.js | description":["audits[speed-index].description"],"core/lib/i18n/i18n.js | totalBlockingTimeMetric":["audits[total-blocking-time].title"],"core/audits/metrics/total-blocking-time.js | description":["audits[total-blocking-time].description"],"core/lib/i18n/i18n.js | ms":[{"values":{"timeInMs":9.5},"path":"audits[total-blocking-time].displayValue"},{"values":{"timeInMs":67},"path":"audits[max-potential-fid].displayValue"},{"values":{"timeInMs":0.0246},"path":"audits[network-rtt].displayValue"},{"values":{"timeInMs":19.479549999999996},"path":"audits[network-server-latency].displayValue"}],"core/lib/i18n/i18n.js | maxPotentialFIDMetric":["audits[max-potential-fid].title"],"core/audits/metrics/max-potential-fid.js | description":["audits[max-potential-fid].description"],"core/lib/i18n/i18n.js | cumulativeLayoutShiftMetric":["audits[cumulative-layout-shift].title"],"core/audits/metrics/cumulative-layout-shift.js | description":["audits[cumulative-layout-shift].description"],"core/audits/errors-in-console.js | title":["audits[errors-in-console].title"],"core/audits/errors-in-console.js | description":["audits[errors-in-console].description"],"core/lib/i18n/i18n.js | columnSource":["audits[errors-in-console].details.headings[0].label","audits.deprecations.details.headings[1].label","audits[geolocation-on-start].details.headings[0].label","audits[notification-on-start].details.headings[0].label","audits.baseline.details.headings[2].label","audits[forced-reflow-insight].details.items[0].headings[0].label"],"core/lib/i18n/i18n.js | columnDescription":["audits[errors-in-console].details.headings[1].label","audits[csp-xss].details.headings[0].label","audits[has-hsts].details.headings[0].label","audits[origin-isolation].details.headings[0].label","audits[clickjacking-mitigation].details.headings[0].label","audits[trusted-types-xss].details.headings[0].label"],"core/audits/server-response-time.js | title":["audits[server-response-time].title"],"core/audits/server-response-time.js | description":["audits[server-response-time].description"],"core/audits/server-response-time.js | displayValue":[{"values":{"timeInMs":0},"path":"audits[server-response-time].displayValue"}],"core/lib/i18n/i18n.js | columnURL":["audits[server-response-time].details.headings[0].label","audits[image-aspect-ratio].details.headings[1].label","audits[image-size-responsive].details.headings[1].label","audits[third-party-cookies].details.headings[1].label","audits[bootup-time].details.headings[0].label","audits[network-rtt].details.headings[0].label","audits[network-server-latency].details.headings[0].label","audits[long-tasks].details.headings[0].label","audits[unsized-images].details.headings[1].label","audits[valid-source-maps].details.headings[0].label","audits[total-byte-weight].details.headings[0].label","audits[unused-javascript].details.headings[0].label","audits[font-display-insight].details.headings[0].label","audits[image-delivery-insight].details.headings[1].label","audits[legacy-javascript-insight].details.headings[0].label","audits[modern-http-insight].details.headings[0].label","audits[render-blocking-insight].details.headings[0].label"],"core/lib/i18n/i18n.js | columnTimeSpent":["audits[server-response-time].details.headings[1].label","audits[mainthread-work-breakdown].details.headings[1].label","audits[network-rtt].details.headings[1].label","audits[network-server-latency].details.headings[1].label"],"core/lib/i18n/i18n.js | interactiveMetric":["audits.interactive.title"],"core/audits/metrics/interactive.js | description":["audits.interactive.description"],"core/audits/user-timings.js | title":["audits[user-timings].title"],"core/audits/user-timings.js | description":["audits[user-timings].description"],"core/lib/i18n/i18n.js | columnName":["audits[user-timings].details.headings[0].label","audits[third-party-cookies].details.headings[0].label","audits[non-composited-animations].details.headings[1].label"],"core/audits/user-timings.js | columnType":["audits[user-timings].details.headings[1].label"],"core/lib/i18n/i18n.js | columnStartTime":["audits[user-timings].details.headings[2].label","audits[long-tasks].details.headings[1].label"],"core/lib/i18n/i18n.js | columnDuration":["audits[user-timings].details.headings[3].label","audits[long-tasks].details.headings[2].label","audits[lcp-breakdown-insight].details.items[0].headings[1].label","audits[render-blocking-insight].details.headings[2].label"],"core/audits/redirects.js | title":["audits.redirects.title"],"core/audits/redirects.js | description":["audits.redirects.description"],"core/audits/image-aspect-ratio.js | title":["audits[image-aspect-ratio].title"],"core/audits/image-aspect-ratio.js | description":["audits[image-aspect-ratio].description"],"core/audits/image-aspect-ratio.js | columnDisplayed":["audits[image-aspect-ratio].details.headings[2].label"],"core/audits/image-aspect-ratio.js | columnActual":["audits[image-aspect-ratio].details.headings[3].label"],"core/audits/image-size-responsive.js | title":["audits[image-size-responsive].title"],"core/audits/image-size-responsive.js | description":["audits[image-size-responsive].description"],"core/audits/image-size-responsive.js | columnDisplayed":["audits[image-size-responsive].details.headings[2].label"],"core/audits/image-size-responsive.js | columnActual":["audits[image-size-responsive].details.headings[3].label"],"core/audits/image-size-responsive.js | columnExpected":["audits[image-size-responsive].details.headings[4].label"],"core/audits/deprecations.js | title":["audits.deprecations.title"],"core/audits/deprecations.js | description":["audits.deprecations.description"],"core/audits/deprecations.js | columnDeprecate":["audits.deprecations.details.headings[0].label"],"core/audits/third-party-cookies.js | title":["audits[third-party-cookies].title"],"core/audits/third-party-cookies.js | description":["audits[third-party-cookies].description"],"core/audits/mainthread-work-breakdown.js | title":["audits[mainthread-work-breakdown].title"],"core/audits/mainthread-work-breakdown.js | description":["audits[mainthread-work-breakdown].description"],"core/audits/mainthread-work-breakdown.js | columnCategory":["audits[mainthread-work-breakdown].details.headings[0].label"],"core/audits/bootup-time.js | title":["audits[bootup-time].title"],"core/audits/bootup-time.js | description":["audits[bootup-time].description"],"core/audits/bootup-time.js | columnTotal":["audits[bootup-time].details.headings[1].label"],"core/audits/bootup-time.js | columnScriptEval":["audits[bootup-time].details.headings[2].label"],"core/audits/bootup-time.js | columnScriptParse":["audits[bootup-time].details.headings[3].label"],"core/audits/network-rtt.js | title":["audits[network-rtt].title"],"core/audits/network-rtt.js | description":["audits[network-rtt].description"],"core/audits/network-server-latency.js | title":["audits[network-server-latency].title"],"core/audits/network-server-latency.js | description":["audits[network-server-latency].description"],"core/lib/i18n/i18n.js | columnResourceType":["audits[resource-summary].details.headings[0].label"],"core/lib/i18n/i18n.js | columnRequests":["audits[resource-summary].details.headings[1].label"],"core/lib/i18n/i18n.js | columnTransferSize":["audits[resource-summary].details.headings[2].label","audits[total-byte-weight].details.headings[1].label","audits[unused-javascript].details.headings[1].label","audits[cache-insight].details.headings[2].label","audits[render-blocking-insight].details.headings[1].label"],"core/lib/i18n/i18n.js | total":["audits[resource-summary].details.items[0].label","audits[cls-culprits-insight].details.items[0].items[0].node.value"],"core/lib/i18n/i18n.js | scriptResourceType":["audits[resource-summary].details.items[1].label"],"core/lib/i18n/i18n.js | stylesheetResourceType":["audits[resource-summary].details.items[2].label"],"core/lib/i18n/i18n.js | fontResourceType":["audits[resource-summary].details.items[3].label"],"core/lib/i18n/i18n.js | documentResourceType":["audits[resource-summary].details.items[4].label"],"core/lib/i18n/i18n.js | imageResourceType":["audits[resource-summary].details.items[5].label"],"core/lib/i18n/i18n.js | otherResourceType":["audits[resource-summary].details.items[6].label"],"core/lib/i18n/i18n.js | mediaResourceType":["audits[resource-summary].details.items[7].label"],"core/lib/i18n/i18n.js | thirdPartyResourceType":["audits[resource-summary].details.items[8].label"],"core/audits/layout-shifts.js | title":["audits[layout-shifts].title"],"core/audits/layout-shifts.js | description":["audits[layout-shifts].description"],"core/audits/layout-shifts.js | displayValueShiftsFound":[{"values":{"shiftCount":1},"path":"audits[layout-shifts].displayValue"}],"core/lib/i18n/i18n.js | columnElement":["audits[layout-shifts].details.headings[0].label","audits[non-composited-animations].details.headings[0].label","audits[cls-culprits-insight].details.items[0].headings[0].label","audits[dom-size-insight].details.headings[1].label"],"core/audits/layout-shifts.js | columnScore":["audits[layout-shifts].details.headings[1].label"],"core/audits/layout-shifts.js | rootCauseFontChanges":["audits[layout-shifts].details.items[0].subItems.items[0].cause","audits[layout-shifts].details.items[0].subItems.items[1].cause"],"core/audits/long-tasks.js | title":["audits[long-tasks].title"],"core/audits/long-tasks.js | description":["audits[long-tasks].description"],"core/audits/long-tasks.js | displayValue":[{"values":{"itemCount":2},"path":"audits[long-tasks].displayValue"}],"core/audits/non-composited-animations.js | title":["audits[non-composited-animations].title"],"core/audits/non-composited-animations.js | description":["audits[non-composited-animations].description"],"core/audits/non-composited-animations.js | displayValue":[{"values":{"itemCount":1},"path":"audits[non-composited-animations].displayValue"}],"core/audits/non-composited-animations.js | filterMayMovePixels":["audits[non-composited-animations].details.items[0].subItems.items[0].failureReason"],"core/audits/unsized-images.js | title":["audits[unsized-images].title"],"core/audits/unsized-images.js | description":["audits[unsized-images].description"],"core/audits/valid-source-maps.js | failureTitle":["audits[valid-source-maps].title"],"core/audits/valid-source-maps.js | description":["audits[valid-source-maps].description"],"core/audits/valid-source-maps.js | columnMapURL":["audits[valid-source-maps].details.headings[1].label"],"core/audits/valid-source-maps.js | missingSourceMapErrorMessage":["audits[valid-source-maps].details.items[0].subItems.items[0].error"],"core/audits/csp-xss.js | title":["audits[csp-xss].title"],"core/audits/csp-xss.js | description":["audits[csp-xss].description"],"core/audits/csp-xss.js | columnDirective":["audits[csp-xss].details.headings[1].label"],"core/audits/csp-xss.js | columnSeverity":["audits[csp-xss].details.headings[2].label"],"core/lib/i18n/i18n.js | itemSeverityHigh":["audits[csp-xss].details.items[0].severity","audits[has-hsts].details.items[0].severity","audits[origin-isolation].details.items[0].severity","audits[clickjacking-mitigation].details.items[0].severity","audits[trusted-types-xss].details.items[0].severity"],"core/audits/csp-xss.js | noCsp":["audits[csp-xss].details.items[0].description"],"core/audits/has-hsts.js | title":["audits[has-hsts].title"],"core/audits/has-hsts.js | description":["audits[has-hsts].description"],"core/audits/has-hsts.js | columnDirective":["audits[has-hsts].details.headings[1].label"],"core/audits/has-hsts.js | columnSeverity":["audits[has-hsts].details.headings[2].label"],"core/audits/has-hsts.js | noHsts":["audits[has-hsts].details.items[0].description"],"core/audits/origin-isolation.js | title":["audits[origin-isolation].title"],"core/audits/origin-isolation.js | description":["audits[origin-isolation].description"],"core/audits/origin-isolation.js | columnDirective":["audits[origin-isolation].details.headings[1].label"],"core/audits/origin-isolation.js | columnSeverity":["audits[origin-isolation].details.headings[2].label"],"core/audits/origin-isolation.js | noCoop":["audits[origin-isolation].details.items[0].description"],"core/audits/clickjacking-mitigation.js | title":["audits[clickjacking-mitigation].title"],"core/audits/clickjacking-mitigation.js | description":["audits[clickjacking-mitigation].description"],"core/audits/clickjacking-mitigation.js | columnSeverity":["audits[clickjacking-mitigation].details.headings[1].label"],"core/audits/clickjacking-mitigation.js | noClickjackingMitigation":["audits[clickjacking-mitigation].details.items[0].description"],"core/audits/trusted-types-xss.js | title":["audits[trusted-types-xss].title"],"core/audits/trusted-types-xss.js | description":["audits[trusted-types-xss].description"],"core/audits/trusted-types-xss.js | columnSeverity":["audits[trusted-types-xss].details.headings[1].label"],"core/audits/trusted-types-xss.js | noTrustedTypesToMitigateXss":["audits[trusted-types-xss].details.items[0].description"],"core/audits/accessibility/accesskeys.js | title":["audits.accesskeys.title"],"core/audits/accessibility/accesskeys.js | description":["audits.accesskeys.description"],"core/audits/accessibility/aria-allowed-attr.js | title":["audits[aria-allowed-attr].title"],"core/audits/accessibility/aria-allowed-attr.js | description":["audits[aria-allowed-attr].description"],"core/lib/i18n/i18n.js | columnFailingElem":["audits[aria-allowed-attr].details.headings[0].label","audits[aria-command-name].details.headings[0].label","audits[aria-conditional-attr].details.headings[0].label","audits[aria-deprecated-role].details.headings[0].label","audits[aria-hidden-body].details.headings[0].label","audits[aria-hidden-focus].details.headings[0].label","audits[aria-input-field-name].details.headings[0].label","audits[aria-prohibited-attr].details.headings[0].label","audits[aria-required-attr].details.headings[0].label","audits[aria-roles].details.headings[0].label","audits[aria-valid-attr-value].details.headings[0].label","audits[aria-valid-attr].details.headings[0].label","audits[button-name].details.headings[0].label","audits[color-contrast].details.headings[0].label","audits[document-title].details.headings[0].label","audits[html-has-lang].details.headings[0].label","audits[html-lang-valid].details.headings[0].label","audits[image-alt].details.headings[0].label","audits.label.details.headings[0].label","audits[landmark-one-main].details.headings[0].label","audits.list.details.headings[0].label","audits[meta-viewport].details.headings[0].label","audits.tabindex.details.headings[0].label","audits[target-size].details.headings[0].label","audits[paste-preventing-inputs].details.headings[0].label"],"core/audits/accessibility/aria-allowed-role.js | title":["audits[aria-allowed-role].title"],"core/audits/accessibility/aria-allowed-role.js | description":["audits[aria-allowed-role].description"],"core/audits/accessibility/aria-command-name.js | title":["audits[aria-command-name].title"],"core/audits/accessibility/aria-command-name.js | description":["audits[aria-command-name].description"],"core/audits/accessibility/aria-conditional-attr.js | title":["audits[aria-conditional-attr].title"],"core/audits/accessibility/aria-conditional-attr.js | description":["audits[aria-conditional-attr].description"],"core/audits/accessibility/aria-deprecated-role.js | title":["audits[aria-deprecated-role].title"],"core/audits/accessibility/aria-deprecated-role.js | description":["audits[aria-deprecated-role].description"],"core/audits/accessibility/aria-dialog-name.js | title":["audits[aria-dialog-name].title"],"core/audits/accessibility/aria-dialog-name.js | description":["audits[aria-dialog-name].description"],"core/audits/accessibility/aria-hidden-body.js | title":["audits[aria-hidden-body].title"],"core/audits/accessibility/aria-hidden-body.js | description":["audits[aria-hidden-body].description"],"core/audits/accessibility/aria-hidden-focus.js | title":["audits[aria-hidden-focus].title"],"core/audits/accessibility/aria-hidden-focus.js | description":["audits[aria-hidden-focus].description"],"core/audits/accessibility/aria-input-field-name.js | failureTitle":["audits[aria-input-field-name].title"],"core/audits/accessibility/aria-input-field-name.js | description":["audits[aria-input-field-name].description"],"core/audits/accessibility/aria-meter-name.js | title":["audits[aria-meter-name].title"],"core/audits/accessibility/aria-meter-name.js | description":["audits[aria-meter-name].description"],"core/audits/accessibility/aria-progressbar-name.js | title":["audits[aria-progressbar-name].title"],"core/audits/accessibility/aria-progressbar-name.js | description":["audits[aria-progressbar-name].description"],"core/audits/accessibility/aria-prohibited-attr.js | title":["audits[aria-prohibited-attr].title"],"core/audits/accessibility/aria-prohibited-attr.js | description":["audits[aria-prohibited-attr].description"],"core/audits/accessibility/aria-required-attr.js | title":["audits[aria-required-attr].title"],"core/audits/accessibility/aria-required-attr.js | description":["audits[aria-required-attr].description"],"core/audits/accessibility/aria-required-children.js | title":["audits[aria-required-children].title"],"core/audits/accessibility/aria-required-children.js | description":["audits[aria-required-children].description"],"core/audits/accessibility/aria-required-parent.js | title":["audits[aria-required-parent].title"],"core/audits/accessibility/aria-required-parent.js | description":["audits[aria-required-parent].description"],"core/audits/accessibility/aria-roles.js | title":["audits[aria-roles].title"],"core/audits/accessibility/aria-roles.js | description":["audits[aria-roles].description"],"core/audits/accessibility/aria-text.js | title":["audits[aria-text].title"],"core/audits/accessibility/aria-text.js | description":["audits[aria-text].description"],"core/audits/accessibility/aria-toggle-field-name.js | title":["audits[aria-toggle-field-name].title"],"core/audits/accessibility/aria-toggle-field-name.js | description":["audits[aria-toggle-field-name].description"],"core/audits/accessibility/aria-tooltip-name.js | title":["audits[aria-tooltip-name].title"],"core/audits/accessibility/aria-tooltip-name.js | description":["audits[aria-tooltip-name].description"],"core/audits/accessibility/aria-treeitem-name.js | title":["audits[aria-treeitem-name].title"],"core/audits/accessibility/aria-treeitem-name.js | description":["audits[aria-treeitem-name].description"],"core/audits/accessibility/aria-valid-attr-value.js | title":["audits[aria-valid-attr-value].title"],"core/audits/accessibility/aria-valid-attr-value.js | description":["audits[aria-valid-attr-value].description"],"core/audits/accessibility/aria-valid-attr.js | title":["audits[aria-valid-attr].title"],"core/audits/accessibility/aria-valid-attr.js | description":["audits[aria-valid-attr].description"],"core/audits/accessibility/button-name.js | failureTitle":["audits[button-name].title"],"core/audits/accessibility/button-name.js | description":["audits[button-name].description"],"core/audits/accessibility/bypass.js | title":["audits.bypass.title"],"core/audits/accessibility/bypass.js | description":["audits.bypass.description"],"core/audits/accessibility/color-contrast.js | title":["audits[color-contrast].title"],"core/audits/accessibility/color-contrast.js | description":["audits[color-contrast].description"],"core/audits/accessibility/definition-list.js | title":["audits[definition-list].title"],"core/audits/accessibility/definition-list.js | description":["audits[definition-list].description"],"core/audits/accessibility/dlitem.js | title":["audits.dlitem.title"],"core/audits/accessibility/dlitem.js | description":["audits.dlitem.description"],"core/audits/accessibility/document-title.js | title":["audits[document-title].title"],"core/audits/accessibility/document-title.js | description":["audits[document-title].description"],"core/audits/accessibility/duplicate-id-aria.js | title":["audits[duplicate-id-aria].title"],"core/audits/accessibility/duplicate-id-aria.js | description":["audits[duplicate-id-aria].description"],"core/audits/accessibility/empty-heading.js | title":["audits[empty-heading].title"],"core/audits/accessibility/empty-heading.js | description":["audits[empty-heading].description"],"core/audits/accessibility/form-field-multiple-labels.js | title":["audits[form-field-multiple-labels].title"],"core/audits/accessibility/form-field-multiple-labels.js | description":["audits[form-field-multiple-labels].description"],"core/audits/accessibility/frame-title.js | title":["audits[frame-title].title"],"core/audits/accessibility/frame-title.js | description":["audits[frame-title].description"],"core/audits/accessibility/heading-order.js | title":["audits[heading-order].title"],"core/audits/accessibility/heading-order.js | description":["audits[heading-order].description"],"core/audits/accessibility/html-has-lang.js | title":["audits[html-has-lang].title"],"core/audits/accessibility/html-has-lang.js | description":["audits[html-has-lang].description"],"core/audits/accessibility/html-lang-valid.js | title":["audits[html-lang-valid].title"],"core/audits/accessibility/html-lang-valid.js | description":["audits[html-lang-valid].description"],"core/audits/accessibility/html-xml-lang-mismatch.js | title":["audits[html-xml-lang-mismatch].title"],"core/audits/accessibility/html-xml-lang-mismatch.js | description":["audits[html-xml-lang-mismatch].description"],"core/audits/accessibility/identical-links-same-purpose.js | title":["audits[identical-links-same-purpose].title"],"core/audits/accessibility/identical-links-same-purpose.js | description":["audits[identical-links-same-purpose].description"],"core/audits/accessibility/image-alt.js | failureTitle":["audits[image-alt].title"],"core/audits/accessibility/image-alt.js | description":["audits[image-alt].description"],"core/audits/accessibility/image-redundant-alt.js | title":["audits[image-redundant-alt].title"],"core/audits/accessibility/image-redundant-alt.js | description":["audits[image-redundant-alt].description"],"core/audits/accessibility/input-button-name.js | title":["audits[input-button-name].title"],"core/audits/accessibility/input-button-name.js | description":["audits[input-button-name].description"],"core/audits/accessibility/input-image-alt.js | title":["audits[input-image-alt].title"],"core/audits/accessibility/input-image-alt.js | description":["audits[input-image-alt].description"],"core/audits/accessibility/label-content-name-mismatch.js | title":["audits[label-content-name-mismatch].title"],"core/audits/accessibility/label-content-name-mismatch.js | description":["audits[label-content-name-mismatch].description"],"core/audits/accessibility/label.js | failureTitle":["audits.label.title"],"core/audits/accessibility/label.js | description":["audits.label.description"],"core/audits/accessibility/landmark-one-main.js | failureTitle":["audits[landmark-one-main].title"],"core/audits/accessibility/landmark-one-main.js | description":["audits[landmark-one-main].description"],"core/audits/accessibility/link-name.js | title":["audits[link-name].title"],"core/audits/accessibility/link-name.js | description":["audits[link-name].description"],"core/audits/accessibility/link-in-text-block.js | title":["audits[link-in-text-block].title"],"core/audits/accessibility/link-in-text-block.js | description":["audits[link-in-text-block].description"],"core/audits/accessibility/list.js | title":["audits.list.title"],"core/audits/accessibility/list.js | description":["audits.list.description"],"core/audits/accessibility/listitem.js | title":["audits.listitem.title"],"core/audits/accessibility/listitem.js | description":["audits.listitem.description"],"core/audits/accessibility/meta-refresh.js | title":["audits[meta-refresh].title"],"core/audits/accessibility/meta-refresh.js | description":["audits[meta-refresh].description"],"core/audits/accessibility/meta-viewport.js | title":["audits[meta-viewport].title"],"core/audits/accessibility/meta-viewport.js | description":["audits[meta-viewport].description"],"core/audits/accessibility/object-alt.js | title":["audits[object-alt].title"],"core/audits/accessibility/object-alt.js | description":["audits[object-alt].description"],"core/audits/accessibility/select-name.js | title":["audits[select-name].title"],"core/audits/accessibility/select-name.js | description":["audits[select-name].description"],"core/audits/accessibility/skip-link.js | title":["audits[skip-link].title"],"core/audits/accessibility/skip-link.js | description":["audits[skip-link].description"],"core/audits/accessibility/tabindex.js | title":["audits.tabindex.title"],"core/audits/accessibility/tabindex.js | description":["audits.tabindex.description"],"core/audits/accessibility/table-duplicate-name.js | title":["audits[table-duplicate-name].title"],"core/audits/accessibility/table-duplicate-name.js | description":["audits[table-duplicate-name].description"],"core/audits/accessibility/table-fake-caption.js | title":["audits[table-fake-caption].title"],"core/audits/accessibility/table-fake-caption.js | description":["audits[table-fake-caption].description"],"core/audits/accessibility/target-size.js | title":["audits[target-size].title"],"core/audits/accessibility/target-size.js | description":["audits[target-size].description"],"core/audits/accessibility/td-has-header.js | title":["audits[td-has-header].title"],"core/audits/accessibility/td-has-header.js | description":["audits[td-has-header].description"],"core/audits/accessibility/td-headers-attr.js | title":["audits[td-headers-attr].title"],"core/audits/accessibility/td-headers-attr.js | description":["audits[td-headers-attr].description"],"core/audits/accessibility/th-has-data-cells.js | title":["audits[th-has-data-cells].title"],"core/audits/accessibility/th-has-data-cells.js | description":["audits[th-has-data-cells].description"],"core/audits/accessibility/valid-lang.js | title":["audits[valid-lang].title"],"core/audits/accessibility/valid-lang.js | description":["audits[valid-lang].description"],"core/audits/accessibility/video-caption.js | title":["audits[video-caption].title"],"core/audits/accessibility/video-caption.js | description":["audits[video-caption].description"],"core/audits/accessibility/autocomplete-valid.js | title":["audits[autocomplete-valid].title"],"core/audits/accessibility/autocomplete-valid.js | description":["audits[autocomplete-valid].description"],"core/audits/accessibility/presentation-role-conflict.js | title":["audits[presentation-role-conflict].title"],"core/audits/accessibility/presentation-role-conflict.js | description":["audits[presentation-role-conflict].description"],"core/audits/accessibility/svg-img-alt.js | title":["audits[svg-img-alt].title"],"core/audits/accessibility/svg-img-alt.js | description":["audits[svg-img-alt].description"],"core/audits/byte-efficiency/total-byte-weight.js | title":["audits[total-byte-weight].title"],"core/audits/byte-efficiency/total-byte-weight.js | description":["audits[total-byte-weight].description"],"core/audits/byte-efficiency/total-byte-weight.js | displayValue":[{"values":{"totalBytes":1576723},"path":"audits[total-byte-weight].displayValue"}],"core/audits/byte-efficiency/unminified-css.js | title":["audits[unminified-css].title"],"core/audits/byte-efficiency/unminified-css.js | description":["audits[unminified-css].description"],"core/audits/byte-efficiency/unminified-javascript.js | title":["audits[unminified-javascript].title"],"core/audits/byte-efficiency/unminified-javascript.js | description":["audits[unminified-javascript].description"],"core/audits/byte-efficiency/unused-css-rules.js | title":["audits[unused-css-rules].title"],"core/audits/byte-efficiency/unused-css-rules.js | description":["audits[unused-css-rules].description"],"core/audits/byte-efficiency/unused-javascript.js | title":["audits[unused-javascript].title"],"core/audits/byte-efficiency/unused-javascript.js | description":["audits[unused-javascript].description"],"core/lib/i18n/i18n.js | displayValueByteSavings":[{"values":{"wastedBytes":530883},"path":"audits[unused-javascript].displayValue"},{"values":{"wastedBytes":1539667},"path":"audits[cache-insight].displayValue"},{"values":{"wastedBytes":2828},"path":"audits[document-latency-insight].displayValue"}],"core/lib/i18n/i18n.js | columnWastedBytes":["audits[unused-javascript].details.headings[2].label","audits[font-display-insight].details.headings[1].label","audits[image-delivery-insight].details.headings[3].label"],"core/audits/dobetterweb/doctype.js | title":["audits.doctype.title"],"core/audits/dobetterweb/doctype.js | description":["audits.doctype.description"],"core/audits/dobetterweb/charset.js | title":["audits.charset.title"],"core/audits/dobetterweb/charset.js | description":["audits.charset.description"],"core/audits/dobetterweb/geolocation-on-start.js | title":["audits[geolocation-on-start].title"],"core/audits/dobetterweb/geolocation-on-start.js | description":["audits[geolocation-on-start].description"],"core/audits/dobetterweb/inspector-issues.js | title":["audits[inspector-issues].title"],"core/audits/dobetterweb/inspector-issues.js | description":["audits[inspector-issues].description"],"core/audits/dobetterweb/inspector-issues.js | columnIssueType":["audits[inspector-issues].details.headings[0].label"],"core/audits/dobetterweb/js-libraries.js | title":["audits[js-libraries].title"],"core/audits/dobetterweb/js-libraries.js | description":["audits[js-libraries].description"],"core/audits/dobetterweb/notification-on-start.js | title":["audits[notification-on-start].title"],"core/audits/dobetterweb/notification-on-start.js | description":["audits[notification-on-start].description"],"core/audits/dobetterweb/paste-preventing-inputs.js | title":["audits[paste-preventing-inputs].title"],"core/audits/dobetterweb/paste-preventing-inputs.js | description":["audits[paste-preventing-inputs].description"],"core/audits/baseline.js | title":["audits.baseline.title"],"core/audits/baseline.js | description":[{"values":{"date":"2026-05-01"},"path":"audits.baseline.description"}],"core/audits/baseline.js | columnFeature":["audits.baseline.details.headings[0].label"],"core/audits/baseline.js | columnStatus":["audits.baseline.details.headings[1].label"],"core/audits/seo/meta-description.js | failureTitle":["audits[meta-description].title"],"core/audits/seo/meta-description.js | description":["audits[meta-description].description"],"core/audits/seo/http-status-code.js | title":["audits[http-status-code].title"],"core/audits/seo/http-status-code.js | description":["audits[http-status-code].description"],"core/audits/seo/link-text.js | title":["audits[link-text].title"],"core/audits/seo/link-text.js | description":["audits[link-text].description"],"core/audits/seo/crawlable-anchors.js | title":["audits[crawlable-anchors].title"],"core/audits/seo/crawlable-anchors.js | description":["audits[crawlable-anchors].description"],"core/audits/seo/crawlable-anchors.js | columnFailingLink":["audits[crawlable-anchors].details.headings[0].label"],"core/audits/seo/is-crawlable.js | title":["audits[is-crawlable].title"],"core/audits/seo/is-crawlable.js | description":["audits[is-crawlable].description"],"core/audits/seo/robots-txt.js | failureTitle":["audits[robots-txt].title"],"core/audits/seo/robots-txt.js | description":["audits[robots-txt].description"],"core/audits/seo/robots-txt.js | displayValueValidationError":[{"values":{"itemCount":90},"path":"audits[robots-txt].displayValue"}],"core/audits/seo/hreflang.js | title":["audits.hreflang.title"],"core/audits/seo/hreflang.js | description":["audits.hreflang.description"],"core/audits/seo/canonical.js | title":["audits.canonical.title"],"core/audits/seo/canonical.js | description":["audits.canonical.description"],"core/audits/seo/manual/structured-data.js | title":["audits[structured-data].title"],"core/audits/seo/manual/structured-data.js | description":["audits[structured-data].description"],"core/audits/bf-cache.js | failureTitle":["audits[bf-cache].title"],"core/audits/bf-cache.js | description":["audits[bf-cache].description"],"core/audits/bf-cache.js | displayValue":[{"values":{"itemCount":1},"path":"audits[bf-cache].displayValue"}],"core/audits/bf-cache.js | failureReasonColumn":["audits[bf-cache].details.headings[0].label"],"core/audits/bf-cache.js | failureTypeColumn":["audits[bf-cache].details.headings[1].label"],"node_modules/@paulirish/trace_engine/panels/application/components/BackForwardCacheStrings.js | internalError":["audits[bf-cache].details.items[0].reason"],"core/audits/bf-cache.js | notActionableFailureType":["audits[bf-cache].details.items[0].failureType"],"node_modules/@paulirish/trace_engine/models/trace/insights/Cache.js | title":["audits[cache-insight].title"],"node_modules/@paulirish/trace_engine/models/trace/insights/Cache.js | description":["audits[cache-insight].description"],"node_modules/@paulirish/trace_engine/models/trace/insights/Cache.js | requestColumn":["audits[cache-insight].details.headings[0].label"],"core/lib/i18n/i18n.js | columnCacheTTL":["audits[cache-insight].details.headings[1].label"],"node_modules/@paulirish/trace_engine/models/trace/insights/CLSCulprits.js | title":["audits[cls-culprits-insight].title"],"node_modules/@paulirish/trace_engine/models/trace/insights/CLSCulprits.js | description":["audits[cls-culprits-insight].description"],"core/audits/insights/cls-culprits-insight.js | columnScore":["audits[cls-culprits-insight].details.items[0].headings[1].label"],"node_modules/@paulirish/trace_engine/models/trace/insights/CLSCulprits.js | webFont":["audits[cls-culprits-insight].details.items[0].items[1].subItems.items[0].cause","audits[cls-culprits-insight].details.items[0].items[1].subItems.items[1].cause"],"node_modules/@paulirish/trace_engine/models/trace/insights/DocumentLatency.js | title":["audits[document-latency-insight].title"],"node_modules/@paulirish/trace_engine/models/trace/insights/DocumentLatency.js | description":["audits[document-latency-insight].description"],"node_modules/@paulirish/trace_engine/models/trace/insights/DocumentLatency.js | passingRedirects":["audits[document-latency-insight].details.items.noRedirects.label"],"node_modules/@paulirish/trace_engine/models/trace/insights/DocumentLatency.js | passingServerResponseTime":[{"values":{"PH1":"0 ms"},"path":"audits[document-latency-insight].details.items.serverResponseIsFast.label"}],"node_modules/@paulirish/trace_engine/models/trace/insights/DocumentLatency.js | failedTextCompression":["audits[document-latency-insight].details.items.usesCompression.label"],"node_modules/@paulirish/trace_engine/models/trace/insights/DOMSize.js | title":["audits[dom-size-insight].title"],"node_modules/@paulirish/trace_engine/models/trace/insights/DOMSize.js | description":["audits[dom-size-insight].description"],"node_modules/@paulirish/trace_engine/models/trace/insights/DOMSize.js | statistic":["audits[dom-size-insight].details.headings[0].label"],"node_modules/@paulirish/trace_engine/models/trace/insights/DOMSize.js | value":["audits[dom-size-insight].details.headings[2].label"],"node_modules/@paulirish/trace_engine/models/trace/insights/DOMSize.js | totalElements":["audits[dom-size-insight].details.items[0].statistic"],"node_modules/@paulirish/trace_engine/models/trace/insights/DOMSize.js | maxDOMDepth":["audits[dom-size-insight].details.items[1].statistic"],"node_modules/@paulirish/trace_engine/models/trace/insights/DOMSize.js | maxChildren":["audits[dom-size-insight].details.items[2].statistic"],"node_modules/@paulirish/trace_engine/models/trace/insights/DuplicatedJavaScript.js | title":["audits[duplicated-javascript-insight].title"],"node_modules/@paulirish/trace_engine/models/trace/insights/DuplicatedJavaScript.js | description":["audits[duplicated-javascript-insight].description"],"node_modules/@paulirish/trace_engine/models/trace/insights/DuplicatedJavaScript.js | columnSource":["audits[duplicated-javascript-insight].details.headings[0].label"],"node_modules/@paulirish/trace_engine/models/trace/insights/DuplicatedJavaScript.js | columnDuplicatedBytes":["audits[duplicated-javascript-insight].details.headings[1].label"],"node_modules/@paulirish/trace_engine/models/trace/insights/FontDisplay.js | title":["audits[font-display-insight].title"],"node_modules/@paulirish/trace_engine/models/trace/insights/FontDisplay.js | description":["audits[font-display-insight].description"],"node_modules/@paulirish/trace_engine/models/trace/insights/ForcedReflow.js | title":["audits[forced-reflow-insight].title"],"node_modules/@paulirish/trace_engine/models/trace/insights/ForcedReflow.js | description":["audits[forced-reflow-insight].description"],"node_modules/@paulirish/trace_engine/models/trace/insights/ForcedReflow.js | totalReflowTime":["audits[forced-reflow-insight].details.items[0].headings[1].label"],"node_modules/@paulirish/trace_engine/models/trace/insights/ImageDelivery.js | title":["audits[image-delivery-insight].title"],"node_modules/@paulirish/trace_engine/models/trace/insights/ImageDelivery.js | description":["audits[image-delivery-insight].description"],"core/lib/i18n/i18n.js | columnResourceSize":["audits[image-delivery-insight].details.headings[2].label"],"node_modules/@paulirish/trace_engine/models/trace/insights/INPBreakdown.js | title":["audits[inp-breakdown-insight].title"],"node_modules/@paulirish/trace_engine/models/trace/insights/INPBreakdown.js | description":["audits[inp-breakdown-insight].description"],"node_modules/@paulirish/trace_engine/models/trace/insights/LCPBreakdown.js | title":["audits[lcp-breakdown-insight].title"],"node_modules/@paulirish/trace_engine/models/trace/insights/LCPBreakdown.js | description":["audits[lcp-breakdown-insight].description"],"node_modules/@paulirish/trace_engine/models/trace/insights/LCPBreakdown.js | subpart":["audits[lcp-breakdown-insight].details.items[0].headings[0].label"],"node_modules/@paulirish/trace_engine/models/trace/insights/LCPBreakdown.js | timeToFirstByte":["audits[lcp-breakdown-insight].details.items[0].items[0].label"],"node_modules/@paulirish/trace_engine/models/trace/insights/LCPBreakdown.js | elementRenderDelay":["audits[lcp-breakdown-insight].details.items[0].items[1].label"],"node_modules/@paulirish/trace_engine/models/trace/insights/LCPDiscovery.js | title":["audits[lcp-discovery-insight].title"],"node_modules/@paulirish/trace_engine/models/trace/insights/LCPDiscovery.js | description":["audits[lcp-discovery-insight].description"],"node_modules/@paulirish/trace_engine/models/trace/insights/LegacyJavaScript.js | title":["audits[legacy-javascript-insight].title"],"node_modules/@paulirish/trace_engine/models/trace/insights/LegacyJavaScript.js | description":["audits[legacy-javascript-insight].description"],"node_modules/@paulirish/trace_engine/models/trace/insights/LegacyJavaScript.js | columnWastedBytes":["audits[legacy-javascript-insight].details.headings[2].label"],"node_modules/@paulirish/trace_engine/models/trace/insights/ModernHTTP.js | title":["audits[modern-http-insight].title"],"node_modules/@paulirish/trace_engine/models/trace/insights/ModernHTTP.js | description":["audits[modern-http-insight].description"],"node_modules/@paulirish/trace_engine/models/trace/insights/ModernHTTP.js | protocol":["audits[modern-http-insight].details.headings[1].label"],"node_modules/@paulirish/trace_engine/models/trace/insights/NetworkDependencyTree.js | title":["audits[network-dependency-tree-insight].title"],"node_modules/@paulirish/trace_engine/models/trace/insights/NetworkDependencyTree.js | description":["audits[network-dependency-tree-insight].description"],"node_modules/@paulirish/trace_engine/models/trace/insights/NetworkDependencyTree.js | preconnectOriginsTableTitle":["audits[network-dependency-tree-insight].details.items[1].title"],"node_modules/@paulirish/trace_engine/models/trace/insights/NetworkDependencyTree.js | preconnectOriginsTableDescription":["audits[network-dependency-tree-insight].details.items[1].description"],"node_modules/@paulirish/trace_engine/models/trace/insights/NetworkDependencyTree.js | columnOrigin":["audits[network-dependency-tree-insight].details.items[1].value.headings[0].label"],"node_modules/@paulirish/trace_engine/models/trace/insights/NetworkDependencyTree.js | columnSource":["audits[network-dependency-tree-insight].details.items[1].value.headings[1].label"],"node_modules/@paulirish/trace_engine/models/trace/insights/NetworkDependencyTree.js | estSavingTableTitle":["audits[network-dependency-tree-insight].details.items[2].title"],"node_modules/@paulirish/trace_engine/models/trace/insights/NetworkDependencyTree.js | estSavingTableDescription":["audits[network-dependency-tree-insight].details.items[2].description"],"node_modules/@paulirish/trace_engine/models/trace/insights/NetworkDependencyTree.js | noPreconnectCandidates":["audits[network-dependency-tree-insight].details.items[2].value.value"],"node_modules/@paulirish/trace_engine/models/trace/insights/RenderBlocking.js | title":["audits[render-blocking-insight].title"],"node_modules/@paulirish/trace_engine/models/trace/insights/RenderBlocking.js | description":["audits[render-blocking-insight].description"],"node_modules/@paulirish/trace_engine/models/trace/insights/ThirdParties.js | title":["audits[third-parties-insight].title"],"node_modules/@paulirish/trace_engine/models/trace/insights/ThirdParties.js | description":["audits[third-parties-insight].description"],"node_modules/@paulirish/trace_engine/models/trace/insights/ThirdParties.js | columnThirdParty":["audits[third-parties-insight].details.headings[0].label"],"node_modules/@paulirish/trace_engine/models/trace/insights/ThirdParties.js | columnTransferSize":["audits[third-parties-insight].details.headings[1].label"],"node_modules/@paulirish/trace_engine/models/trace/insights/ThirdParties.js | columnMainThreadTime":["audits[third-parties-insight].details.headings[2].label"],"node_modules/@paulirish/trace_engine/models/trace/insights/Viewport.js | title":["audits[viewport-insight].title"],"node_modules/@paulirish/trace_engine/models/trace/insights/Viewport.js | description":["audits[viewport-insight].description"],"core/config/default-config.js | performanceCategoryTitle":["categories.performance.title"],"core/config/default-config.js | a11yCategoryTitle":["categories.accessibility.title"],"core/config/default-config.js | a11yCategoryDescription":["categories.accessibility.description"],"core/config/default-config.js | a11yCategoryManualDescription":["categories.accessibility.manualDescription"],"core/config/default-config.js | bestPracticesCategoryTitle":["categories[best-practices].title"],"core/config/default-config.js | seoCategoryTitle":["categories.seo.title"],"core/config/default-config.js | seoCategoryDescription":["categories.seo.description"],"core/config/default-config.js | seoCategoryManualDescription":["categories.seo.manualDescription"],"core/config/default-config.js | metricGroupTitle":["categoryGroups.metrics.title"],"core/config/default-config.js | insightsGroupTitle":["categoryGroups.insights.title"],"core/config/default-config.js | insightsGroupDescription":["categoryGroups.insights.description"],"core/config/default-config.js | diagnosticsGroupTitle":["categoryGroups.diagnostics.title"],"core/config/default-config.js | diagnosticsGroupDescription":["categoryGroups.diagnostics.description"],"core/config/default-config.js | a11yBestPracticesGroupTitle":["categoryGroups[a11y-best-practices].title"],"core/config/default-config.js | a11yBestPracticesGroupDescription":["categoryGroups[a11y-best-practices].description"],"core/config/default-config.js | a11yColorContrastGroupTitle":["categoryGroups[a11y-color-contrast].title"],"core/config/default-config.js | a11yColorContrastGroupDescription":["categoryGroups[a11y-color-contrast].description"],"core/config/default-config.js | a11yNamesLabelsGroupTitle":["categoryGroups[a11y-names-labels].title"],"core/config/default-config.js | a11yNamesLabelsGroupDescription":["categoryGroups[a11y-names-labels].description"],"core/config/default-config.js | a11yNavigationGroupTitle":["categoryGroups[a11y-navigation].title"],"core/config/default-config.js | a11yNavigationGroupDescription":["categoryGroups[a11y-navigation].description"],"core/config/default-config.js | a11yAriaGroupTitle":["categoryGroups[a11y-aria].title"],"core/config/default-config.js | a11yAriaGroupDescription":["categoryGroups[a11y-aria].description"],"core/config/default-config.js | a11yLanguageGroupTitle":["categoryGroups[a11y-language].title"],"core/config/default-config.js | a11yLanguageGroupDescription":["categoryGroups[a11y-language].description"],"core/config/default-config.js | a11yAudioVideoGroupTitle":["categoryGroups[a11y-audio-video].title"],"core/config/default-config.js | a11yAudioVideoGroupDescription":["categoryGroups[a11y-audio-video].description"],"core/config/default-config.js | a11yTablesListsVideoGroupTitle":["categoryGroups[a11y-tables-lists].title"],"core/config/default-config.js | a11yTablesListsVideoGroupDescription":["categoryGroups[a11y-tables-lists].description"],"core/config/default-config.js | seoMobileGroupTitle":["categoryGroups[seo-mobile].title"],"core/config/default-config.js | seoMobileGroupDescription":["categoryGroups[seo-mobile].description"],"core/config/default-config.js | seoContentGroupTitle":["categoryGroups[seo-content].title"],"core/config/default-config.js | seoContentGroupDescription":["categoryGroups[seo-content].description"],"core/config/default-config.js | seoCrawlingGroupTitle":["categoryGroups[seo-crawl].title"],"core/config/default-config.js | seoCrawlingGroupDescription":["categoryGroups[seo-crawl].description"],"core/config/default-config.js | bestPracticesTrustSafetyGroupTitle":["categoryGroups[best-practices-trust-safety].title"],"core/config/default-config.js | bestPracticesUXGroupTitle":["categoryGroups[best-practices-ux].title"],"core/config/default-config.js | bestPracticesBrowserCompatGroupTitle":["categoryGroups[best-practices-browser-compat].title"],"core/config/default-config.js | bestPracticesGeneralGroupTitle":["categoryGroups[best-practices-general].title"],"core/config/default-config.js | webmcpGroupTitle":["categoryGroups.webmcp.title"],"core/config/default-config.js | webmcpGroupDescription":["categoryGroups.webmcp.description"],"core/config/default-config.js | agentAccessibilityGroupTitle":["categoryGroups[agent-accessibility].title"],"core/config/default-config.js | agentAccessibilityGroupDescription":["categoryGroups[agent-accessibility].description"]}}} \ No newline at end of file diff --git a/docs/tranches/B/audit/lighthouse/after-prod/amiga-mobile.json b/docs/tranches/B/audit/lighthouse/after-prod/amiga-mobile.json new file mode 100644 index 0000000..cc61433 --- /dev/null +++ b/docs/tranches/B/audit/lighthouse/after-prod/amiga-mobile.json @@ -0,0 +1 @@ +{"lighthouseVersion":"13.3.0","requestedUrl":"http://localhost:5177/#/amiga","mainDocumentUrl":"http://localhost:5177/","finalDisplayedUrl":"http://localhost:5177/#/amiga?anim=Rotations","finalUrl":"http://localhost:5177/","fetchTime":"2026-06-04T17:05:58.654Z","gatherMode":"navigation","runWarnings":[],"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/148.0.0.0 Safari/537.36","environment":{"networkUserAgent":"Mozilla/5.0 (Linux; Android 11; moto g power (2022)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Mobile Safari/537.36","hostUserAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/148.0.0.0 Safari/537.36","benchmarkIndex":4410,"credits":{"axe-core":"4.12.0"}},"audits":{"is-on-https":{"id":"is-on-https","title":"Uses HTTPS","description":"All sites should be protected with HTTPS, even ones that don't handle sensitive data. This includes avoiding [mixed content](https://developers.google.com/web/fundamentals/security/prevent-mixed-content/what-is-mixed-content), where some resources are loaded over HTTP despite the initial request being served over HTTPS. HTTPS prevents intruders from tampering with or passively listening in on the communications between your app and your users, and is a prerequisite for HTTP/2 and many new web platform APIs. [Learn more about HTTPS](https://developer.chrome.com/docs/lighthouse/pwa/is-on-https/).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"url","valueType":"url","label":"Insecure URL"},{"key":"resolution","valueType":"text","label":"Request Resolution"}],"items":[]}},"redirects-http":{"id":"redirects-http","title":"Redirects HTTP traffic to HTTPS","description":"Make sure that you redirect all HTTP traffic to HTTPS in order to enable secure web features for all your users. [Learn more](https://developer.chrome.com/docs/lighthouse/pwa/redirects-http/).","score":null,"scoreDisplayMode":"notApplicable"},"first-contentful-paint":{"id":"first-contentful-paint","title":"First Contentful Paint","description":"First Contentful Paint marks the time at which the first text or image is painted. [Learn more about the First Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/first-contentful-paint/).","score":0.03,"scoreDisplayMode":"numeric","numericValue":6174.735449999999,"numericUnit":"millisecond","displayValue":"6.2 s","scoringOptions":{"p10":1800,"median":3000}},"largest-contentful-paint":{"id":"largest-contentful-paint","title":"Largest Contentful Paint","description":"Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)","score":0,"scoreDisplayMode":"numeric","numericValue":10248.480599999999,"numericUnit":"millisecond","displayValue":"10.2 s","scoringOptions":{"p10":2500,"median":4000}},"speed-index":{"id":"speed-index","title":"Speed Index","description":"Speed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).","score":0.44,"scoreDisplayMode":"numeric","numericValue":6174.735449999999,"numericUnit":"millisecond","displayValue":"6.2 s","scoringOptions":{"p10":3387,"median":5800}},"screenshot-thumbnails":{"id":"screenshot-thumbnails","title":"Screenshot Thumbnails","description":"This is what the load of your site looked like.","score":1,"scoreDisplayMode":"informative","details":{"type":"filmstrip","scale":3000,"items":[{"timing":375,"timestamp":233178420555,"data":"data:image/jpeg;base64,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"},{"timing":750,"timestamp":233178795555,"data":"data:image/jpeg;base64,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"},{"timing":1125,"timestamp":233179170555,"data":"data:image/jpeg;base64,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"},{"timing":1500,"timestamp":233179545555,"data":"data:image/jpeg;base64,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"},{"timing":1875,"timestamp":233179920555,"data":"data:image/jpeg;base64,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"},{"timing":2250,"timestamp":233180295555,"data":"data:image/jpeg;base64,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"},{"timing":2625,"timestamp":233180670555,"data":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAD4AHwDASIAAhEBAxEB/8QAHQAAAgMBAQEBAQAAAAAAAAAAAAMBAgUEBgcICf/EAEUQAAEDAQUEBgcECAUFAQAAAAECAxEABAUSITETQVFhBhQiMlKRU2JxgZKh0QcVsfAjJDM0QlVy0hdWlJXBFkaTouGj/8QAGAEBAQEBAQAAAAAAAAAAAAAAAAECAwT/xAAfEQEBAQEAAgIDAQAAAAAAAAAAARECAxIEIRMxQSL/2gAMAwEAAhEDEQA/APzqIAAAISDKUnVJ4nlTWm8ZMkdrvmcleyl6mZxTlj8fq10aWZUZQQCnwjh+FRVk7BOeJeNOSSEggDzo/VgIBdCRmBhGR461exJsakO9cceQoiG9mkGDxVO7QQM853QeSiumbOZlTna73YGfzyomzgghTmIZJOAZDzrnV3j7a9BeKLD92v7BthK0FOFSQnEZA3h470qyg7tJoMb9VAgF3CMwMIyPHWpxWczKnDi73YGfzyrctdluFb1pW1ailsKVsENkglGM4cUg54YJ48iDXQbD0ZxWoC3Od5KUDFPZJSSpPZGmYg8OeQeaxWcQQpzEnJJwDIedRNljCC7hGYGEa8daUsIg4STn7oqABhPtoH4rOZJU7Ku92Bn88qnFZ5BCnMScknAMh516Xoc1cq7DaVXolpb4Vo4qITy+YJ3c64rPZLjWlgO2lxOJbm0UFBJSmexqDOQ4b6zOttjr34fTjnvZ9sb9ViP0uHWMI1461CkJWFKbVJPfBEEjkK9Bed2XMzcqbSzbItS2QttGOQteNKSmIkQnEZMAnyHnWSBaG8KiBIknL21pyJIIIggFOSCdEjgrnUJKkiGlJbGpDmRJ4+ymPgYoCZnPD6Tny41vLR0WW2wVC9HnNmA4WsISFbx2s+fDOiPO5gkEAKGakjRI4jnTWnIy1Cskz/H7aSIAATIQDKUnUHieVNWlKJCziWr9oE6edBcoaMqxqSkZKymDw51JaQCQXCFASRGg460kKSCCJxJySeAoBQAEgKwgyBOhoG7NsxDpOLu9nvfOjZtgElw4Rko4dD50vEkzM9rvc6MSQQROJOSTwFA3ZIBwlZxASRGg460bNsxDhOLu9nX50mUAYQFYRmBO+pxAzM9rvc6KYW24JLhwjJRw6Hzo2KQcJcOIZkRu460vEkEETiTkk8BUdiMICsIzAnfRDA03lDphXd7Ovzqdm2ASXTCclHDofOl4gZmZV3udGISCJxJySeAoG7JMxjOKJiN3HWgKbbTKCSVZJUf4uUUn9HGGFYZmJ31ZICyczjXkrLvcuVAtSgZJJAGSjvQeA5VBKU5OLU0dQEaEcfbUyZSQQFDJBOiRwVzoSVJENKS2N4cyJPH2UBqSZxTlj8fq12WNdnavQLtje0YSpRUjMzrGhG+N9ceYJBASoZlI0SPEOdOMbd4zJBJE78/yaDUZRYcDZFifdnZ4iUqgQTjiDvyHnpV3UWMqWlq73kNFK0g4FFf7SUmSSAcOWnHWuIWJpVzKtptTQfS7g2BWMah4gOHP/wCmuCoNm8mrGthSbBYLS27jSQpSVRhw9oZk74jfWX1S0egd+A0qigb1S0egd+A0dUtHoHfgNKooLrs7yE4ltOJHEpIp90uWVq3tLt7Zds6ZKkATJjKcxlMb65gSDIMGmHJ0kAE4QqOcUGwTYFpQGLA/siGlLJQVFRBOPPUAzuO6ua9LKwUtG77PaAVFalhSFdkYjhHwgH30+67ost4WBbzl62azWlJV+ieUE4gAIzJGs/mDWTamgxaXmkuJdS2spDiNFAGJHI0EKsz6QSplwAbyk1Fn/eGv6h+NUpyM7Qwo6qIJPHOg5+IwzP8AD6Tny40EYsy3t/WBiOVGWZJIA7x3oPAUEpT+0Wpo7gjQjjVAICQEyEAykHUHieVOcxdZXhzViOlKOaiZxEiMfj9Wuuy2hdkvIPtISpaFKISomN+sEUHOswc0BOUxnUCSCQiQMzrlWxZ78tTCClKmFAhlJKgomGjKYO7nEf8ANVcvq0uWNNmWtothDiCe2FKxqCjiMycwNfnUGSTBIKYIqMQ8Irea6R2tl1S2urJJe2xELMq36nfnO/PhWbeFqXbnGlvKaBbaS0MIVmEiBM76DjxDwijEPCKtgHpE+R+lGAekT5H6UEBYB7qT7ZoQVqdGCSsmBGZNTgG5xPz+ldN12p+77wbfYSC8iQAqd4jcQfnVHMswc0BPLOhIKgopRISJJE5CYz8xWy1flqYShLamE4VNKPfOLZlRAMmCJUctMhERVHr5tL22xLaAeQtCwnGAQtYWcgYGYGnvmoMknCqFIEjcZqzKiq0tlWuIVqqvu07TGhTKDtQ7lj1w4d5899ZTSSi1NhQzxCqFAmUkEYgOwToketzqUFSQQypKBOYc1n6VXcoYZnVPpOfLjQoYiJbL/rAxHLKgnOSCAlQzKBokeIc6eY6w8NSqQD7/AM+dc4jCkJkIBlIOoPE8q62mDabctvGlGa1FR0AAJPyFA5NpsQuddmXd5N4bXGm2bYiE5dgoiD7dc64K0W7A+sM4niA4ppCd+S8UeWE0qw2O121LqrPmGoxSqNTA+dQcdFbSOj15rQogJxBSQE7QZhQJmdAMt9Y2NfiV50EUVO0X4ledG0X4ledBABJgCTThm6pKSJwhOu+NKVtFwRjVByOetVoPWXdeXRhi6GWLbcz1otqSFOOlagCe1lksGIKcsu7zMxe149GHrrebu653bPbVQUOFaylOecS4fnP/ADXmNu4YlRMZCTRtlcaCyVoDSkFpJWTkuTI03e75nlFkgi0WdJ1BEjhnSw+4O6og6ZGizmbQ1/UPxqhWWcqIA7yt7Z4CgkD9ossncEbxxyqRMogjEB2CdAPW51LZUkHYlKROYc1n6UEHMkk4iRBX4/VpxB6y5BKQCqSNwpOckEBKgJKBokeIc6eVAPugk4VEgn30HQ5abQ2lAcDmEtgI2i1ZoBkDUZSMqrt3VIee2RKFKAcXiXBUZIkzqYJ9xrVsvSi+7CwyxZbbgaZjBhSk6JKRqOB38jqKLw6V31eFgesVptCFWZ5WJaA0hOczuGWedQZn3jaArFiXOIrnaL7xEE97WMq59oj0Dfmr61TAr8mjAr8mgvtEegb81fWjaI9A35q+tUwK/JowK/JoLFaDkWUpHFJM/Mmn2CyM2i8EMWi0Js7SgTtFaaSPZOQ99KBcU2G1OQ2DMFWQ91KeUFL7OgECg1HLrsyGUrbt1ndWUtqwBxIzUogpzORAgncJOeWdhdVmWbRs7WhSmUOrISRHZOUGc5n6TWNRVG3cl2smz/eV5pV93Ic2eWWNQgkTuyOQ1PIAqGapbbl4Y2G9k0pwFKJnCJ0muYqMBMnCMwKvZv3hr+sfjWJzZb1a1b9ZC9yhhmdU+k5jhxoUAojE2X/WBiOWVGUGVEAd5W9s8B+FCiB+0WWTuCd445VtkCMCYnBPZnWefKuhScVoeKhISST50g94knESIKxoseEc6cpWC0OSMiSCKBiFObJawGwhJAzQNTu0rYa6P305YGbamxp6q7hKXClAHaUEieEk/jwMYi1ShKA4otpkhJ0BOuXuHlVRI0XFKNxVw3w3arKxaLKGTaFISlS20wnErCCrLLPjS2bmvd55lpmyoWp1vaiEogJwlWZ3ZAmDnWNHrUR6wqDUtl32+xWbb2ppptPZgFKCSFYoOQ07Cqz+sL4N/wDjT9KXHrUQPEKByi6WkuKQ2WyYkJTrwyzpDyQleWhAIqyQj+JR9wqjisap0GgoK0UUVREUyzfvDX9Q/GqUyz/vDX9Q/GgWJxIiMUdidAPW51LWLCdiUgTntNZ5cqruV2ZB1T6TmPxoUAT2my8fEndyyoJOpBGEgSUDRA8Q50xxRS+4UKIOI5gxShGBMTgxdme9PPlXWxaBZbx2ymm3ghZOBYlJ11BoE7d30q/iNG3d9Kv4jXf96pKG0rsVmWEIQgSnTCqSffOczUuXslYUOo2RM44wtJEYlYo03aDgNIoM/bu+lX8Ro27vpV/Ea77de3WrI4wmy2dlK3UuktoCe6CAMgOP5Mk5lAzbu+lX8Ro27vpV/EaXRQM27vpV/EaNu76VfxGl0UDNu76VfxGjbu+lX8RpdFAzbu+lX8RqWVKXaWipRUcQzJnfUFyWEt4RkrFJ19lFn/eGv6h+NArcrtEAd5Xo+Q/ChRAIxrLJ8Kd/PKpE4kRGKOxOketzqWsWE7LBE57TWeXKgjVRJIUoiCsaLHhHOnhJdww0qTllOXtpKR2yCMJGZQNEDxV22a77bedscZu+zP2pxAJwtIKiEgxOXuolsk2kFhQBOydOExEZnmMqDZ1AlOzcJAmQMjy9tSuyPNrUhxJQtJKVJVkQRqDVerL5VNNiQwo4f0ToxaZd325UbBQBOyd7JiIzPMZVHVl8qOrL5U02JNnUCU7NwkCZjI8vbQGFHD+hdGLTLu+3Ko6svlR1ZfKmmxOwUATsneyYIjM+zKp6uoEp2bkgTMZez21Xqy+VHVl8qabEhhRwnYu9rTLu+3KjYKgnYu9nIiNfZlUdWXyo6svlTTYt1Zc4dm5MTMZez21ACmgF7JYJ0Kh3OZqOrL5VVgEWhCTvUEkct4qrpWUKlJIPeTvc5j8aFAEjGgvHindyyqy4BVnAGqvR8h+FVUQD2llk+FOc88qCzUdnDJRPZJ1J58q9B0Y6T2voxelrfsjTLu2BQtDgMayCINYCJxyTiUcisaKHAc6rbV4HXIGZUfxqWSzKz3xz5Obz1NlaVtvNVutj9qtAl59anF4RAkmTSOso4KrJ2i/Eaaw2++FbIFRG4a0yRefH/OY0eso4Ko6yjgquCztrctGycWWoBKioHIATpVbQh5gpxqBSsYkqBkKFT6/TX47mtHrKOCqOso4KrJ2i/EabtDssW/SrjPrGj1lHBVHWUcFVk7RfiNens/RV612GyWiyXjZsTzW0Wh6W8GpInMGACTMeySJYesZ3WUcFUdZRwVXVeXRu02Gwu2o3jYX0NDtJaU5iBxJEQpAz7U8MsyDAN2riTaLhattlVebrws7j74TZP0SMKiICyoSIAUSAYBOXZNMPWOLrKeBpLSsVqbUd6x+NZ+0X4jXVYFlT7c6hY/GhJi65xpiJI7E6EetzqG8RB2QSoTntNZ+lS5EqkEgntDes8RVFBJI2iFOncUbhwqqujvxGEjPB4PWqLYjG64J/iOfvoajslMlBMJJ1J4HlTHUqXaloSJUVkADjNBw7FfKrNpebUFNqKSN4MV6mz3MwlsbaVr3mYFZt63f1QpW2SWlZZ7jXOeTnq49PfxfJ4+fesxty0N2jbApU5BBxAKBkRocqW6HnV4nFYlaSTT6K3jh7WzNc2xXypyUAIwnMVeiqyVsE8TRsE8TTaKBWwTxNXaCmceyccRjSUKwmJSdR7KtV2kBUlUxy30HPsE8TT7IkJfaA8Y/GmlCCO7HMGqsjDamwdyxp7amrZijmqu1EHNXo+X/FUJw6uFj1QJnnV1zjTABUe4Dooc+dQ2FEHZBKxOZc1n6VUSjvySCo6qGihwHOnJcDNv2kZJcmPfSE5KiMMZ4PB61NfbUpeNHbSskiNfKn7WXLseuacS6gLbUFJOhFZPSC0o2aWEkFc4jyrGQX2wrBtEDQxIqhbckgoVIzOVcefFl17fL8298esmajEeXlRiPLyqdmvLsKz0y1o2a4JwKgZHLSuzxbUYjy8qMR5eVTsnJjAqYmIo2a8uwrPTLWhtRiPLyoxHl5VOzXBOBUDXLSjZOTGBUxMRQ2oxHl5U5lUgpyxTw1pWzXl2FZ6Za0bNcE4FQNctKmEtjoifzFLaVitbZGmMVVSXlGFJcJA0IOlSyhSVocIhIIInKeQpIt61RyJVIJBPaG9Z4iqKwkjaJU6dxRoBwqyzmTiiP4vR8ufCqk4csew9WJnnVZfvW5/sg6DXZdrFkHR6w2otpwqftKNo44d5Uo55ndoN0Cu0fZh0IGnRa6f9OmvY0VUeP/AMMehH+Vrp/06a+Y9P8Aodc9036tmxXPdbFncQlbYNhaVloRJTJzB319+rwv2sWDbXVZrcnvWdzAr+lX/wBA86D4Y9dDLeabpudaRphu9mfLDXGpiyJJSq6bpB3g3cz/AG16uqOtNuiHEJUOYoPLbKx/yq6P9vZ/to2Ni/lV0f7ez/bW6u67OpUgrTyBqPupjxu+Y+lBh7Gxfyq6P9vZ/to2Vj/lV0f7ez/bW591MeN3zH0pzNhYaghGI8VZ0GEzYGHo2dzXSRuP3eyAP/Wu9m5LGc37tugcQm72c/8A0rXruuSwm8r3sljEjbOBJI3DefKaD3nRf7Neij1w2J68ejl1u2p1GNSjZUJMHMCABuitQ/Zh0IP/AGtdP+nTXsEpCUhKRAAgCpoPG/4X9B/8q3R/p015XpD9gPQu9rxVa2LM5d4UkBTNmVCCRvAMxlGQgZTqTX1yigKKKKArgv6wi87mtljIBLrZCZ0CtUnziu+ig/OSklKilQIUDBB3VFb/AE6u/wC7+k1rQlJDbp2yJ4KzPzke6sCDQFFQslOGELUSoJASmdTTurveiX5U1bzZJSqKZ1d70S/KlwaIK9z9lF37a97RblpBRZ28KSdylcPcD514aDX2b7ObALD0ZYWpJDlpJeVPA5J+QB99B6iiiigKKKKAopVltDNrszVosziXWHUBba0mQpJEgimmg8J0u6YvWO2OWG6wgON5OPKEwrgkaZcTPsrzJ6Y39GVv/wDxb/trI6T3gbm6YXim2IIJeccSDliSuSkjlB+VZ6OklhEYmsUEkHIZ5cuVQK6WX9el4OIdtdpC3G04UnZoGXuFeSVfVvC42w+BP0r0Fuv+7y04F2ZLhUrECoAwOFeHetre0MQM9aD0Vmv28W0kIfAnM/o0/SnjpBeZ0fH/AI0/SvMIt7YBz3V02C90WW1tvBak4Z7SRJEiJAOuulBvuX9ezZhb2ExMKaSP+Kz3b6t8k7YfAn6Vx2u9WDZ0NIdU6oLUsrIiJAyHlXG1eLbdoacxEYFBWWuRoPSWe13nib6ztG0uDEkqaCcQ4jLMV9IubpR0hfSzZmLaAAkJSNi3CQMvDXzl2+ULbWhV6ddSt7aJSFOEIEHXGBxGk6V6fode9lF4oaccSgrEJJO/hWe7ZzbG+OZ11JXuF9IekF3vhT1pZtaU95tTQAPsIANe7uK9Gb4u1u1sApCslIOqFDUV8+6S3hZ2A44+uEA4sS4GHkPz7q3/ALK0uHoyp9xBQi0WhTrYO9MJTPslJrpJ/jnr+1y5uzXsqKKxr56U3HctqTZr2vWx2O0KQHA284EkpJIBjhIPlUafzys163hZmEt2W8LW2wD2Qh5SQTwgGm/ft7jFN6W8R3v1hfY9mdFFRTrP0gvNDyVm2PvOFMBLqysKTxz0rs/6rtxAIW2UnIHDqeFFFBVfSa2qkLLeXfy7v1pBvy0KIyQVHNIg9ocdaKKA+/XokYCg5Awczw1o+/LSJlKBh7+R7PzzoooD78tEgAIxHNIg9ocdcqj79eIkYCnQKg5nhrRRQMb6QWtsmA2CnvZd35504dKrfkAW5OaRh7w48qKKCtq6WXi+yEm0kIHZCgMweAnSuA37ewBSm8rakJGaRaFw2OWdFFBH35e8pAvO3EkdkdYX2xxOdcTrr1rdU86pVqcUe048olU8JNFFB//Z"},{"timing":3000,"timestamp":233181045555,"data":"data:image/jpeg;base64,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"}]}},"final-screenshot":{"id":"final-screenshot","title":"Final Screenshot","description":"The last screenshot captured of the pageload.","score":1,"scoreDisplayMode":"informative","details":{"type":"screenshot","timing":2819,"timestamp":233180864474,"data":"data:image/jpeg;base64,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"}},"total-blocking-time":{"id":"total-blocking-time","title":"Total Blocking Time","description":"Sum of all time periods between FCP and Time to Interactive, when task length exceeded 50ms, expressed in milliseconds. [Learn more about the Total Blocking Time metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-total-blocking-time/).","score":0.65,"scoreDisplayMode":"numeric","numericValue":423,"numericUnit":"millisecond","displayValue":"420 ms","scoringOptions":{"p10":200,"median":600}},"max-potential-fid":{"id":"max-potential-fid","title":"Max Potential First Input Delay","description":"The maximum potential First Input Delay that your users could experience is the duration of the longest task. [Learn more about the Maximum Potential First Input Delay metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-max-potential-fid/).","score":0.01,"scoreDisplayMode":"numeric","numericValue":751,"numericUnit":"millisecond","displayValue":"750 ms"},"cumulative-layout-shift":{"id":"cumulative-layout-shift","title":"Cumulative Layout Shift","description":"Cumulative Layout Shift measures the movement of visible elements within the viewport. [Learn more about the Cumulative Layout Shift metric](https://web.dev/articles/cls).","score":1,"scoreDisplayMode":"numeric","numericValue":0,"numericUnit":"unitless","displayValue":"0","scoringOptions":{"p10":0.1,"median":0.25},"details":{"type":"debugdata","items":[{"cumulativeLayoutShiftMainFrame":0,"newEngineResult":{"cumulativeLayoutShift":0,"cumulativeLayoutShiftMainFrame":0},"newEngineResultDiffered":false}]}},"errors-in-console":{"id":"errors-in-console","title":"No browser errors logged to the console","description":"Errors logged to the console indicate unresolved problems. They can come from network request failures and other browser concerns. [Learn more about this errors in console diagnostic audit](https://developer.chrome.com/docs/lighthouse/best-practices/errors-in-console/)","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"sourceLocation","valueType":"source-location","label":"Source"},{"key":"description","valueType":"code","label":"Description"}],"items":[]}},"server-response-time":{"id":"server-response-time","title":"Initial server response time was short","description":"Keep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).","score":1,"scoreDisplayMode":"metricSavings","numericValue":0,"numericUnit":"millisecond","displayValue":"Root document took 0 ms","metricSavings":{"FCP":0,"LCP":0},"details":{"type":"opportunity","headings":[{"key":"url","valueType":"url","label":"URL"},{"key":"responseTime","valueType":"timespanMs","label":"Time Spent"}],"items":[{"url":"http://localhost:5177/#/amiga","responseTime":0}],"overallSavingsMs":0},"guidanceLevel":1},"interactive":{"id":"interactive","title":"Time to Interactive","description":"Time to Interactive is the amount of time it takes for the page to become fully interactive. [Learn more about the Time to Interactive metric](https://developer.chrome.com/docs/lighthouse/performance/interactive/).","score":0.25,"scoreDisplayMode":"numeric","numericValue":10293.5306,"numericUnit":"millisecond","displayValue":"10.3 s"},"user-timings":{"id":"user-timings","title":"User Timing marks and measures","description":"Consider instrumenting your app with the User Timing API to measure your app's real-world performance during key user experiences. [Learn more about User Timing marks](https://developer.chrome.com/docs/lighthouse/performance/user-timings/).","score":null,"scoreDisplayMode":"notApplicable","details":{"type":"table","headings":[{"key":"name","valueType":"text","label":"Name"},{"key":"timingType","valueType":"text","label":"Type"},{"key":"startTime","valueType":"ms","granularity":0.01,"label":"Start Time"},{"key":"duration","valueType":"ms","granularity":0.01,"label":"Duration"}],"items":[]},"guidanceLevel":2},"redirects":{"id":"redirects","title":"Avoid multiple page redirects","description":"Redirects introduce additional delays before the page can be loaded. [Learn how to avoid page redirects](https://developer.chrome.com/docs/lighthouse/performance/redirects/).","score":1,"scoreDisplayMode":"metricSavings","numericValue":0,"numericUnit":"millisecond","displayValue":"","metricSavings":{"LCP":0,"FCP":0},"details":{"type":"opportunity","headings":[],"items":[],"overallSavingsMs":0},"guidanceLevel":2},"image-aspect-ratio":{"id":"image-aspect-ratio","title":"Displays images with correct aspect ratio","description":"Image display dimensions should match natural aspect ratio. [Learn more about image aspect ratio](https://developer.chrome.com/docs/lighthouse/best-practices/image-aspect-ratio/).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","label":""},{"key":"url","valueType":"url","label":"URL"},{"key":"displayedAspectRatio","valueType":"text","label":"Aspect Ratio (Displayed)"},{"key":"actualAspectRatio","valueType":"text","label":"Aspect Ratio (Actual)"}],"items":[]}},"image-size-responsive":{"id":"image-size-responsive","title":"Serves images with appropriate resolution","description":"Image natural dimensions should be proportional to the display size and the pixel ratio to maximize image clarity. [Learn how to provide responsive images](https://web.dev/articles/serve-responsive-images).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","label":""},{"key":"url","valueType":"url","label":"URL"},{"key":"displayedSize","valueType":"text","label":"Displayed size"},{"key":"actualSize","valueType":"text","label":"Actual size"},{"key":"expectedSize","valueType":"text","label":"Expected size"}],"items":[]}},"deprecations":{"id":"deprecations","title":"Avoids deprecated APIs","description":"Deprecated APIs will eventually be removed from the browser. [Learn more about deprecated APIs](https://developer.chrome.com/docs/lighthouse/best-practices/deprecations/).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"value","valueType":"text","label":"Deprecation / Warning"},{"key":"source","valueType":"source-location","label":"Source"}],"items":[]}},"third-party-cookies":{"id":"third-party-cookies","title":"Avoids third-party cookies","description":"Third-party cookies may be blocked in some contexts. [Learn more about preparing for third-party cookie restrictions](https://privacysandbox.google.com/cookies/prepare/overview).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"name","valueType":"text","label":"Name"},{"key":"url","valueType":"url","label":"URL"}],"items":[]}},"mainthread-work-breakdown":{"id":"mainthread-work-breakdown","title":"Minimize main-thread work","description":"Consider reducing the time spent parsing, compiling and executing JS. You may find delivering smaller JS payloads helps with this. [Learn how to minimize main-thread work](https://developer.chrome.com/docs/lighthouse/performance/mainthread-work-breakdown/)","score":0,"scoreDisplayMode":"metricSavings","numericValue":2400.491999999832,"numericUnit":"millisecond","displayValue":"2.4 s","metricSavings":{"TBT":400},"details":{"type":"table","headings":[{"key":"groupLabel","valueType":"text","label":"Category"},{"key":"duration","valueType":"ms","granularity":1,"label":"Time Spent"}],"items":[{"group":"scriptEvaluation","groupLabel":"Script Evaluation","duration":1965.975999999836},{"group":"other","groupLabel":"Other","duration":249.75599999999613},{"group":"styleLayout","groupLabel":"Style & Layout","duration":102.48400000000004},{"group":"paintCompositeRender","groupLabel":"Rendering","duration":42.883999999999766},{"group":"garbageCollection","groupLabel":"Garbage Collection","duration":29.644000000000027},{"group":"parseHTML","groupLabel":"Parse HTML & CSS","duration":6.667999999999999},{"group":"scriptParseCompile","groupLabel":"Script Parsing & Compilation","duration":3.08}],"sortedBy":["duration"]},"guidanceLevel":1},"bootup-time":{"id":"bootup-time","title":"Reduce JavaScript execution time","description":"Consider reducing the time spent parsing, compiling, and executing JS. You may find delivering smaller JS payloads helps with this. [Learn how to reduce Javascript execution time](https://developer.chrome.com/docs/lighthouse/performance/bootup-time/).","score":0,"scoreDisplayMode":"metricSavings","numericValue":1941.2519999999959,"numericUnit":"millisecond","displayValue":"1.9 s","metricSavings":{"TBT":800},"details":{"type":"table","headings":[{"key":"url","valueType":"url","label":"URL"},{"key":"total","granularity":1,"valueType":"ms","label":"Total CPU Time"},{"key":"scripting","granularity":1,"valueType":"ms","label":"Script Evaluation"},{"key":"scriptParseCompile","granularity":1,"valueType":"ms","label":"Script Parse"}],"items":[{"url":"http://localhost:5177/assets/AmigaScene-CyaOqR74.js","total":1594.8079999999622,"scripting":1540.1959999999622,"scriptParseCompile":0.032},{"url":"http://localhost:5177/assets/index-CZlNYAJp.js","total":592.1760000000339,"scripting":398.2480000000337,"scriptParseCompile":0.672},{"url":"Unattributable","total":111.69200000000205,"scripting":2.104,"scriptParseCompile":0}],"summary":{"wastedMs":1941.2519999999959},"sortedBy":["total"]},"guidanceLevel":1},"diagnostics":{"id":"diagnostics","title":"Diagnostics","description":"Collection of useful page vitals.","score":1,"scoreDisplayMode":"informative","details":{"type":"debugdata","items":[{"numRequests":20,"numScripts":8,"numStylesheets":2,"numFonts":2,"numTasks":2074,"numTasksOver10ms":2,"numTasksOver25ms":2,"numTasksOver50ms":2,"numTasksOver100ms":1,"numTasksOver500ms":0,"rtt":0.013349999999999999,"throughput":1102122497.847757,"maxRtt":0.02475,"maxServerLatency":29.2601,"totalByteWeight":1576724,"totalTaskTime":600.1229999999878,"mainDocumentTransferSize":4390}]}},"network-requests":{"id":"network-requests","title":"Network Requests","description":"Lists the network requests that were made during page load.","score":1,"scoreDisplayMode":"informative","details":{"type":"table","headings":[{"key":"url","valueType":"url","label":"URL"},{"key":"protocol","valueType":"text","label":"Protocol"},{"key":"networkRequestTime","valueType":"ms","granularity":1,"label":"Network Request Time"},{"key":"networkEndTime","valueType":"ms","granularity":1,"label":"Network End Time"},{"key":"transferSize","valueType":"bytes","displayUnit":"kb","granularity":1,"label":"Transfer Size"},{"key":"resourceSize","valueType":"bytes","displayUnit":"kb","granularity":1,"label":"Resource Size"},{"key":"statusCode","valueType":"text","label":"Status Code"},{"key":"mimeType","valueType":"text","label":"MIME Type"},{"key":"resourceType","valueType":"text","label":"Resource Type"}],"items":[{"url":"http://localhost:5177/","sessionTargetType":"page","protocol":"http/1.1","rendererStartTime":0,"networkRequestTime":0.28700000047683716,"networkEndTime":1.0940000116825104,"finished":true,"transferSize":4390,"resourceSize":4221,"statusCode":200,"mimeType":"text/html","resourceType":"Document","priority":"VeryHigh","experimentalFromMainFrame":true,"entity":"localhost"},{"url":"http://localhost:5177/assets/index-CZlNYAJp.js","sessionTargetType":"page","protocol":"http/1.1","rendererStartTime":3.7730000019073486,"networkRequestTime":4.048000007867813,"networkEndTime":6.187000006437302,"finished":true,"transferSize":241054,"resourceSize":240852,"statusCode":200,"mimeType":"text/javascript","resourceType":"Script","priority":"High","experimentalFromMainFrame":true,"entity":"localhost"},{"url":"http://localhost:5177/assets/rolldown-runtime-QTnfLwEv.js","sessionTargetType":"page","protocol":"http/1.1","rendererStartTime":3.8920000195503235,"networkRequestTime":4.124000012874603,"networkEndTime":5.381999999284744,"finished":true,"transferSize":868,"resourceSize":694,"statusCode":200,"mimeType":"text/javascript","resourceType":"Script","priority":"High","isLinkPreload":true,"experimentalFromMainFrame":true,"entity":"localhost"},{"url":"http://localhost:5177/assets/preload-helper-kNaey6uv.js","sessionTargetType":"page","protocol":"http/1.1","rendererStartTime":3.9180000126361847,"networkRequestTime":4.240000009536743,"networkEndTime":5.348000019788742,"finished":true,"transferSize":1382,"resourceSize":1208,"statusCode":200,"mimeType":"text/javascript","resourceType":"Script","priority":"High","isLinkPreload":true,"experimentalFromMainFrame":true,"entity":"localhost"},{"url":"http://localhost:5177/assets/vendor-reka-ui-CVUb_gFh.js","sessionTargetType":"page","protocol":"http/1.1","rendererStartTime":3.9610000252723694,"networkRequestTime":4.312000006437302,"networkEndTime":6.8219999969005585,"finished":true,"transferSize":338377,"resourceSize":338157,"statusCode":200,"mimeType":"text/javascript","resourceType":"Script","priority":"High","isLinkPreload":true,"experimentalFromMainFrame":true,"entity":"localhost"},{"url":"http://localhost:5177/assets/vendor-lucide-ItTK6Wyo.js","sessionTargetType":"page","protocol":"http/1.1","rendererStartTime":3.9809999763965607,"networkRequestTime":4.369000017642975,"networkEndTime":5.945999979972839,"finished":true,"transferSize":8789,"resourceSize":8614,"statusCode":200,"mimeType":"text/javascript","resourceType":"Script","priority":"High","isLinkPreload":true,"experimentalFromMainFrame":true,"entity":"localhost"},{"url":"http://localhost:5177/assets/engine-DiS0VYfs.js","sessionTargetType":"page","protocol":"http/1.1","rendererStartTime":4.003999978303909,"networkRequestTime":4.450999975204468,"networkEndTime":6.316000014543533,"finished":true,"transferSize":124362,"resourceSize":124178,"statusCode":200,"mimeType":"text/javascript","resourceType":"Script","priority":"High","isLinkPreload":true,"experimentalFromMainFrame":true,"entity":"localhost"},{"url":"https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&display=swap","sessionTargetType":"page","protocol":"h2","rendererStartTime":4.358000010251999,"networkRequestTime":5.66499999165535,"networkEndTime":37.541999995708466,"finished":true,"transferSize":574,"resourceSize":1815,"statusCode":200,"mimeType":"text/css","resourceType":"Stylesheet","priority":"VeryLow","experimentalFromMainFrame":true,"entity":"Google Fonts"},{"url":"http://localhost:5177/assets/index-he4Ow9Yj.css","sessionTargetType":"page","protocol":"http/1.1","rendererStartTime":5.023000001907349,"networkRequestTime":6.479000002145767,"networkEndTime":7.90200001001358,"finished":true,"transferSize":286596,"resourceSize":286392,"statusCode":200,"mimeType":"text/css","resourceType":"Stylesheet","priority":"VeryLow","experimentalFromMainFrame":true,"entity":"localhost"},{"url":"data:image/svg+xml,%3Csvg width='200' height='200' viewBox='0 0 200 200' xmlns='http://www.w3.org/2…","sessionTargetType":"page","protocol":"data","rendererStartTime":36.648999989032745,"networkRequestTime":36.648999989032745,"networkEndTime":36.7320000231266,"finished":true,"transferSize":0,"resourceSize":318,"statusCode":200,"mimeType":"image/svg+xml","resourceType":"Image","priority":"Low","experimentalFromMainFrame":true},{"url":"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 2 2'%3E%3Cpath d='M1 2V0h…","sessionTargetType":"page","protocol":"data","rendererStartTime":54.96999999880791,"networkRequestTime":54.96999999880791,"networkEndTime":55.01800000667572,"finished":true,"transferSize":0,"resourceSize":124,"statusCode":200,"mimeType":"image/svg+xml","resourceType":"Image","priority":"Low","experimentalFromMainFrame":true},{"url":"http://localhost:5177/assets/cube-icon-sm-CqZgfax4.png","sessionTargetType":"page","protocol":"http/1.1","rendererStartTime":109.94299998879433,"networkRequestTime":110.18299999833107,"networkEndTime":111.01100000739098,"finished":true,"transferSize":1315,"resourceSize":1147,"statusCode":200,"mimeType":"image/png","resourceType":"Image","priority":"Low","experimentalFromMainFrame":true,"entity":"localhost"},{"url":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAIGNIUk0AAHomAACAhAAA+gAAAIDoA…","sessionTargetType":"page","protocol":"data","rendererStartTime":110.14399999380112,"networkRequestTime":110.14399999380112,"networkEndTime":110.25499999523163,"finished":true,"transferSize":0,"resourceSize":2671,"statusCode":200,"mimeType":"image/png","resourceType":"Image","priority":"Low","experimentalFromMainFrame":true},{"url":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoA…","sessionTargetType":"page","protocol":"data","rendererStartTime":110.28600001335144,"networkRequestTime":110.28600001335144,"networkEndTime":110.36300000548363,"finished":true,"transferSize":0,"resourceSize":1561,"statusCode":200,"mimeType":"image/png","resourceType":"Image","priority":"Low","experimentalFromMainFrame":true},{"url":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='32'%20height='32'%20viewBox…","sessionTargetType":"page","protocol":"data","rendererStartTime":110.85699999332428,"networkRequestTime":110.85699999332428,"networkEndTime":110.9360000193119,"finished":true,"transferSize":0,"resourceSize":362,"statusCode":200,"mimeType":"image/svg+xml","resourceType":"Image","priority":"Low","experimentalFromMainFrame":true},{"url":"http://localhost:5177/assets/AmigaScene-CyaOqR74.js","sessionTargetType":"page","protocol":"http/1.1","rendererStartTime":113.69200000166893,"networkRequestTime":113.94200000166893,"networkEndTime":114.82100000977516,"finished":true,"transferSize":3762,"resourceSize":3588,"statusCode":200,"mimeType":"text/javascript","resourceType":"Script","priority":"High","experimentalFromMainFrame":true,"entity":"localhost"},{"url":"https://fonts.gstatic.com/s/instrumentserif/v5/jizBRFtNs2ka5fXjeivQ4LroWlx-6zUTjnTLgNs.woff2","sessionTargetType":"page","protocol":"h3","rendererStartTime":120.22600001096725,"networkRequestTime":121.21000000834465,"networkEndTime":145.85400000214577,"finished":true,"transferSize":15067,"resourceSize":15040,"statusCode":200,"mimeType":"font/woff2","resourceType":"Font","priority":"VeryHigh","experimentalFromMainFrame":true,"entity":"Google Fonts"},{"url":"https://fonts.gstatic.com/s/instrumentserif/v5/jizHRFtNs2ka5fXjeivQ4LroWlx-6zAjjH7Motmp5g.woff2","sessionTargetType":"page","protocol":"h3","rendererStartTime":120.3929999768734,"networkRequestTime":121.28400000929832,"networkEndTime":146.7920000255108,"finished":true,"transferSize":15711,"resourceSize":15684,"statusCode":200,"mimeType":"font/woff2","resourceType":"Font","priority":"VeryHigh","experimentalFromMainFrame":true,"entity":"Google Fonts"},{"url":"http://localhost:5177/assets/vendor-three-Bjkinzx-.js","sessionTargetType":"page","protocol":"http/1.1","rendererStartTime":122.40299999713898,"networkRequestTime":122.58600002527237,"networkEndTime":124.625,"finished":true,"transferSize":533162,"resourceSize":532915,"statusCode":200,"mimeType":"text/javascript","resourceType":"Script","priority":"High","experimentalFromMainFrame":true,"entity":"localhost"},{"url":"http://localhost:5177/assets/cube-icon-sm-CqZgfax4.png","sessionTargetType":"page","protocol":"http/1.1","rendererStartTime":510.0320000052452,"networkRequestTime":510.1870000064373,"networkEndTime":511.41100001335144,"finished":true,"transferSize":1315,"resourceSize":1147,"statusCode":200,"mimeType":"image/png","resourceType":"Other","priority":"High","experimentalFromMainFrame":true,"entity":"localhost"}],"debugData":{"type":"debugdata","networkStartTimeTs":233178045801,"initiators":[{"type":"parser","url":"http://localhost:5177/","lineNumber":40,"columnNumber":73},{"type":"parser","url":"http://localhost:5177/","lineNumber":41,"columnNumber":89},{"type":"parser","url":"http://localhost:5177/","lineNumber":42,"columnNumber":87},{"type":"parser","url":"http://localhost:5177/","lineNumber":43,"columnNumber":87},{"type":"parser","url":"http://localhost:5177/","lineNumber":44,"columnNumber":86},{"type":"parser","url":"http://localhost:5177/","lineNumber":45,"columnNumber":79},{"type":"parser","url":"http://localhost:5177/","lineNumber":20,"columnNumber":10},{"type":"parser","url":"http://localhost:5177/","lineNumber":82,"columnNumber":116},{"type":"parser","url":"http://localhost:5177/assets/index-he4Ow9Yj.css"},{"type":"parser","url":"http://localhost:5177/assets/index-he4Ow9Yj.css"},{"type":"parser","url":"https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&display=swap"},{"type":"parser","url":"https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&display=swap"},{"type":"script","url":"http://localhost:5177/assets/AmigaScene-CyaOqR74.js","lineNumber":0,"columnNumber":279}]}}},"network-rtt":{"id":"network-rtt","title":"Network Round Trip Times","description":"Network round trip times (RTT) have a large impact on performance. If the RTT to an origin is high, it's an indication that servers closer to the user could improve performance. [Learn more about the Round Trip Time](https://hpbn.co/primer-on-latency-and-bandwidth/).","score":1,"scoreDisplayMode":"informative","numericValue":0.02475,"numericUnit":"millisecond","displayValue":"0 ms","details":{"type":"table","headings":[{"key":"origin","valueType":"text","label":"URL"},{"key":"rtt","valueType":"ms","granularity":1,"label":"Time Spent"}],"items":[{"origin":"https://fonts.gstatic.com","rtt":0.02475},{"origin":"https://fonts.googleapis.com","rtt":0.016900000000000002},{"origin":"http://localhost:5177","rtt":0.013349999999999999}],"sortedBy":["rtt"]}},"network-server-latency":{"id":"network-server-latency","title":"Server Backend Latencies","description":"Server latencies can impact web performance. If the server latency of an origin is high, it's an indication the server is overloaded or has poor backend performance. [Learn more about server response time](https://hpbn.co/primer-on-web-performance/#analyzing-the-resource-waterfall).","score":1,"scoreDisplayMode":"informative","numericValue":29.2601,"numericUnit":"millisecond","displayValue":"30 ms","details":{"type":"table","headings":[{"key":"origin","valueType":"text","label":"URL"},{"key":"serverResponseTime","valueType":"ms","granularity":1,"label":"Time Spent"}],"items":[{"origin":"https://fonts.googleapis.com","serverResponseTime":29.2601},{"origin":"https://fonts.gstatic.com","serverResponseTime":22.69325},{"origin":"http://localhost:5177","serverResponseTime":0.74515}],"sortedBy":["serverResponseTime"]}},"main-thread-tasks":{"id":"main-thread-tasks","title":"Tasks","description":"Lists the toplevel main thread tasks that executed during page load.","score":1,"scoreDisplayMode":"informative","details":{"type":"table","headings":[{"key":"startTime","valueType":"ms","granularity":1,"label":"Start Time"},{"key":"duration","valueType":"ms","granularity":1,"label":"End Time"}],"items":[{"duration":8.454,"startTime":11.407},{"duration":97.423,"startTime":19.862},{"duration":375.253,"startTime":128.047},{"duration":5.085,"startTime":503.62}]}},"metrics":{"id":"metrics","title":"Metrics","description":"Collects all available metrics.","score":1,"scoreDisplayMode":"informative","numericValue":10294,"numericUnit":"millisecond","details":{"type":"debugdata","items":[{"firstContentfulPaint":6175,"largestContentfulPaint":10248,"interactive":10294,"speedIndex":6175,"totalBlockingTime":423,"maxPotentialFID":751,"cumulativeLayoutShift":0,"cumulativeLayoutShiftMainFrame":0,"lcpLoadDelay":679,"lcpLoadDuration":680,"timeToFirstByte":451,"observedTimeOrigin":0,"observedTimeOriginTs":233178045555,"observedNavigationStart":0,"observedNavigationStartTs":233178045555,"observedFirstPaint":24,"observedFirstPaintTs":233178069492,"observedFirstContentfulPaint":141,"observedFirstContentfulPaintTs":233178186158,"observedFirstContentfulPaintAllFrames":141,"observedFirstContentfulPaintAllFramesTs":233178186158,"observedLargestContentfulPaint":557,"observedLargestContentfulPaintTs":233178602822,"observedLargestContentfulPaintAllFrames":557,"observedLargestContentfulPaintAllFramesTs":233178602822,"observedTraceEnd":2832,"observedTraceEndTs":233180877811,"observedLoad":120,"observedLoadTs":233178165644,"observedDomContentLoaded":116,"observedDomContentLoadedTs":233178161534,"observedCumulativeLayoutShift":0,"observedCumulativeLayoutShiftMainFrame":0,"observedFirstVisualChange":10,"observedFirstVisualChangeTs":233178055555,"observedLastVisualChange":543,"observedLastVisualChangeTs":233178588555,"observedSpeedIndex":264,"observedSpeedIndexTs":233178309950},{"lcpInvalidated":false}]}},"resource-summary":{"id":"resource-summary","title":"Resources Summary","description":"Aggregates all network requests and groups them by type","score":1,"scoreDisplayMode":"informative","details":{"type":"table","headings":[{"key":"label","valueType":"text","label":"Resource Type"},{"key":"requestCount","valueType":"numeric","label":"Requests"},{"key":"transferSize","valueType":"bytes","label":"Transfer Size"}],"items":[{"resourceType":"total","label":"Total","requestCount":15,"transferSize":1576724},{"resourceType":"script","label":"Script","requestCount":8,"transferSize":1251756},{"resourceType":"stylesheet","label":"Stylesheet","requestCount":2,"transferSize":287170},{"resourceType":"font","label":"Font","requestCount":2,"transferSize":30778},{"resourceType":"document","label":"Document","requestCount":1,"transferSize":4390},{"resourceType":"image","label":"Image","requestCount":1,"transferSize":1315},{"resourceType":"other","label":"Other","requestCount":1,"transferSize":1315},{"resourceType":"media","label":"Media","requestCount":0,"transferSize":0},{"resourceType":"third-party","label":"Third-party","requestCount":3,"transferSize":31352}]}},"layout-shifts":{"id":"layout-shifts","title":"Avoid large layout shifts","description":"These are the largest layout shifts observed on the page. Each table item represents a single layout shift, and shows the element that shifted the most. Below each item are possible root causes that led to the layout shift. Some of these layout shifts may not be included in the CLS metric value due to [windowing](https://web.dev/articles/cls#what_is_cls). [Learn how to improve CLS](https://web.dev/articles/optimize-cls)","score":null,"scoreDisplayMode":"notApplicable","metricSavings":{"CLS":0},"details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"extra"},"label":"Element"},{"key":"score","valueType":"numeric","subItemsHeading":{"key":"cause","valueType":"text"},"granularity":0.001,"label":"Layout shift score"}],"items":[]},"guidanceLevel":2},"long-tasks":{"id":"long-tasks","title":"Avoid long main-thread tasks","description":"Lists the longest tasks on the main thread, useful for identifying worst contributors to input delay. [Learn how to avoid long main-thread tasks](https://web.dev/articles/optimize-long-tasks)","score":1,"scoreDisplayMode":"informative","displayValue":"2 long tasks found","metricSavings":{"TBT":400},"details":{"type":"table","headings":[{"key":"url","valueType":"url","label":"URL"},{"key":"startTime","valueType":"ms","granularity":1,"label":"Start Time"},{"key":"duration","valueType":"ms","granularity":1,"label":"Duration"}],"items":[{"url":"http://localhost:5177/assets/AmigaScene-CyaOqR74.js","duration":751,"startTime":9947.980599999999},{"url":"http://localhost:5177/assets/index-CZlNYAJp.js","duration":195,"startTime":6901.4902999999995}],"sortedBy":["duration"],"skipSumming":["startTime"],"debugData":{"type":"debugdata","urls":["http://localhost:5177/assets/AmigaScene-CyaOqR74.js","http://localhost:5177/assets/index-CZlNYAJp.js"],"tasks":[{"urlIndex":0,"startTime":9948,"duration":751,"other":751,"scriptEvaluation":0},{"urlIndex":1,"startTime":6901.5,"duration":195,"other":195,"scriptEvaluation":0,"styleLayout":0}]}},"guidanceLevel":1},"non-composited-animations":{"id":"non-composited-animations","title":"Avoid non-composited animations","description":"Animations which are not composited can be janky and increase CLS. [Learn how to avoid non-composited animations](https://developer.chrome.com/docs/lighthouse/performance/non-composited-animations/)","score":1,"scoreDisplayMode":"informative","displayValue":"1 animated element found","metricSavings":{"CLS":0},"details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"failureReason","valueType":"text"},"label":"Element"},{"key":null,"valueType":"text","subItemsHeading":{"key":"animation","valueType":"text"},"label":"Name"}],"items":[{"node":{"type":"node","lhId":"page-5-DIV","path":"1,HTML,1,BODY,1,DIV,1,DIV,3,DIV,0,DIV,0,DIV,0,DIV,0,DIV,0,DIV,0,DIV,1,DIV,0,DIV","selector":"div.flex > div.pl-4 > div.flex-1 > div#reka-tabs-v-270-content-controls","boundingRect":{"top":93,"bottom":436,"left":28,"right":372,"width":344,"height":343},"snippet":"
","nodeLabel":"duration\ndelay\niterations\ndirection\nalternate\nfill mode\nforwards\neasing\nease-in…"},"subItems":{"type":"subitems","items":[{"failureReason":"Filter-related property may move pixels","animation":"enter"}]}}]},"guidanceLevel":2},"unsized-images":{"id":"unsized-images","title":"Image elements have explicit `width` and `height`","description":"Set an explicit width and height on image elements to reduce layout shifts and improve CLS. [Learn how to set image dimensions](https://web.dev/articles/optimize-cls#images_without_dimensions)","score":1,"scoreDisplayMode":"metricSavings","metricSavings":{"CLS":0},"details":{"type":"table","headings":[{"key":"node","valueType":"node","label":""},{"key":"url","valueType":"url","label":"URL"}],"items":[]},"guidanceLevel":4},"valid-source-maps":{"id":"valid-source-maps","title":"Missing source maps for large first-party JavaScript","description":"Source maps translate minified code to the original source code. This helps developers debug in production. In addition, Lighthouse is able to provide further insights. Consider deploying source maps to take advantage of these benefits. [Learn more about source maps](https://developer.chrome.com/docs/devtools/javascript/source-maps/).","score":0,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"scriptUrl","valueType":"url","subItemsHeading":{"key":"error"},"label":"URL"},{"key":"sourceMapUrl","valueType":"url","label":"Map URL"}],"items":[{"scriptUrl":"http://localhost:5177/assets/vendor-three-Bjkinzx-.js","subItems":{"type":"subitems","items":[{"error":"Large JavaScript file is missing a source map"}]}}]}},"csp-xss":{"id":"csp-xss","title":"Ensure CSP is effective against XSS attacks","description":"A strong Content Security Policy (CSP) significantly reduces the risk of cross-site scripting (XSS) attacks. [Learn how to use a CSP to prevent XSS](https://developer.chrome.com/docs/lighthouse/best-practices/csp-xss/)","score":1,"scoreDisplayMode":"informative","details":{"type":"table","headings":[{"key":"description","valueType":"text","subItemsHeading":{"key":"description"},"label":"Description"},{"key":"directive","valueType":"code","subItemsHeading":{"key":"directive"},"label":"Directive"},{"key":"severity","valueType":"text","subItemsHeading":{"key":"severity"},"label":"Severity"}],"items":[{"severity":"High","description":"No CSP found in enforcement mode"}]}},"has-hsts":{"id":"has-hsts","title":"Use a strong HSTS policy","description":"Deployment of the HSTS header significantly reduces the risk of downgrading HTTP connections and eavesdropping attacks. A rollout in stages, starting with a low max-age is recommended. [Learn more about using a strong HSTS policy.](https://developer.chrome.com/docs/lighthouse/best-practices/has-hsts)","score":1,"scoreDisplayMode":"informative","details":{"type":"table","headings":[{"key":"description","valueType":"text","subItemsHeading":{"key":"description"},"label":"Description"},{"key":"directive","valueType":"code","subItemsHeading":{"key":"directive"},"label":"Directive"},{"key":"severity","valueType":"text","subItemsHeading":{"key":"severity"},"label":"Severity"}],"items":[{"severity":"High","description":"No HSTS header found"}]}},"origin-isolation":{"id":"origin-isolation","title":"Ensure proper origin isolation with COOP","description":"The Cross-Origin-Opener-Policy (COOP) can be used to isolate the top-level window from other documents such as pop-ups. [Learn more about deploying the COOP header.](https://web.dev/articles/why-coop-coep#coop)","score":1,"scoreDisplayMode":"informative","details":{"type":"table","headings":[{"key":"description","valueType":"text","subItemsHeading":{"key":"description"},"label":"Description"},{"key":"directive","valueType":"code","subItemsHeading":{"key":"directive"},"label":"Directive"},{"key":"severity","valueType":"text","subItemsHeading":{"key":"severity"},"label":"Severity"}],"items":[{"description":"No COOP header found","severity":"High"}]}},"clickjacking-mitigation":{"id":"clickjacking-mitigation","title":"Mitigate clickjacking with XFO or CSP","description":"The `X-Frame-Options` (XFO) header or the `frame-ancestors` directive in the `Content-Security-Policy` (CSP) header control where a page can be embedded. These can mitigate clickjacking attacks by blocking some or all sites from embedding the page. [Learn more about mitigating clickjacking](https://developer.chrome.com/docs/lighthouse/best-practices/clickjacking-mitigation).","score":1,"scoreDisplayMode":"informative","details":{"type":"table","headings":[{"key":"description","valueType":"text","subItemsHeading":{"key":"description"},"label":"Description"},{"key":"severity","valueType":"text","subItemsHeading":{"key":"severity"},"label":"Severity"}],"items":[{"severity":"High","description":"No frame control policy found"}]}},"trusted-types-xss":{"id":"trusted-types-xss","title":"Mitigate DOM-based XSS with Trusted Types","description":"The `require-trusted-types-for` directive in the `Content-Security-Policy` (CSP) header instructs user agents to control the data passed to DOM XSS sink functions. [Learn more about mitigating DOM-based XSS with Trusted Types](https://developer.chrome.com/docs/lighthouse/best-practices/trusted-types-xss).","score":1,"scoreDisplayMode":"informative","details":{"type":"table","headings":[{"key":"description","valueType":"text","subItemsHeading":{"key":"description"},"label":"Description"},{"key":"severity","valueType":"text","subItemsHeading":{"key":"severity"},"label":"Severity"}],"items":[{"severity":"High","description":"No `Content-Security-Policy` header with Trusted Types directive found"}]}},"script-treemap-data":{"id":"script-treemap-data","title":"Script Treemap Data","description":"Used for treemap app","score":1,"scoreDisplayMode":"informative","details":{"type":"treemap-data","nodes":[{"name":"http://localhost:5177/","resourceBytes":561,"encodedBytes":562,"children":[{"name":"(inline) (function() {\n …","resourceBytes":529,"unusedBytes":0},{"name":"(inline) this.media='all…","resourceBytes":16,"unusedBytes":0},{"name":"(inline) this.media='all…","resourceBytes":16,"unusedBytes":0}]},{"name":"http://localhost:5177/assets/index-CZlNYAJp.js","resourceBytes":240787,"encodedBytes":240892,"unusedBytes":87357},{"name":"http://localhost:5177/assets/rolldown-runtime-QTnfLwEv.js","resourceBytes":694,"encodedBytes":706,"unusedBytes":371},{"name":"http://localhost:5177/assets/vendor-reka-ui-CVUb_gFh.js","resourceBytes":338153,"encodedBytes":338215,"unusedBytes":168656},{"name":"http://localhost:5177/assets/vendor-lucide-ItTK6Wyo.js","resourceBytes":8614,"encodedBytes":8627,"unusedBytes":0},{"name":"http://localhost:5177/assets/preload-helper-kNaey6uv.js","resourceBytes":1208,"encodedBytes":1220,"unusedBytes":279},{"name":"http://localhost:5177/assets/engine-DiS0VYfs.js","resourceBytes":124164,"encodedBytes":124200,"unusedBytes":60403},{"name":"http://localhost:5177/assets/AmigaScene-CyaOqR74.js","resourceBytes":3588,"encodedBytes":3600,"unusedBytes":236},{"name":"http://localhost:5177/assets/vendor-three-Bjkinzx-.js","resourceBytes":532915,"encodedBytes":533000,"unusedBytes":214425}]}},"accesskeys":{"id":"accesskeys","title":"`[accesskey]` values are unique","description":"Access keys let users quickly focus a part of the page. For proper navigation, each access key must be unique. [Learn more about access keys](https://dequeuniversity.com/rules/axe/4.11/accesskeys).","score":null,"scoreDisplayMode":"notApplicable"},"aria-allowed-attr":{"id":"aria-allowed-attr","title":"`[aria-*]` attributes match their roles","description":"Each ARIA `role` supports a specific subset of `aria-*` attributes. Mismatching these invalidates the `aria-*` attributes. [Learn how to match ARIA attributes to their roles](https://dequeuniversity.com/rules/axe/4.11/aria-allowed-attr).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"aria-allowed-role":{"id":"aria-allowed-role","title":"Uses ARIA roles only on compatible elements","description":"Many HTML elements can only be assigned certain ARIA roles. Using ARIA roles where they are not allowed can interfere with the accessibility of the web page. [Learn more about ARIA roles](https://dequeuniversity.com/rules/axe/4.11/aria-allowed-role).","score":null,"scoreDisplayMode":"notApplicable"},"aria-command-name":{"id":"aria-command-name","title":"`button`, `link`, and `menuitem` elements have accessible names","description":"When an element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn how to make command elements more accessible](https://dequeuniversity.com/rules/axe/4.11/aria-command-name).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"aria-conditional-attr":{"id":"aria-conditional-attr","title":"ARIA attributes are used as specified for the element's role","description":"Some ARIA attributes are only allowed on an element under certain conditions. [Learn more about conditional ARIA attributes](https://dequeuniversity.com/rules/axe/4.11/aria-conditional-attr).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"aria-deprecated-role":{"id":"aria-deprecated-role","title":"Deprecated ARIA roles were not used","description":"Deprecated ARIA roles may not be processed correctly by assistive technology. [Learn more about deprecated ARIA roles](https://dequeuniversity.com/rules/axe/4.11/aria-deprecated-role).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"aria-dialog-name":{"id":"aria-dialog-name","title":"Elements with `role=\"dialog\"` or `role=\"alertdialog\"` have accessible names.","description":"ARIA dialog elements without accessible names may prevent screen readers users from discerning the purpose of these elements. [Learn how to make ARIA dialog elements more accessible](https://dequeuniversity.com/rules/axe/4.11/aria-dialog-name).","score":null,"scoreDisplayMode":"notApplicable"},"aria-hidden-body":{"id":"aria-hidden-body","title":"`[aria-hidden=\"true\"]` is not present on the document ``","description":"Assistive technologies, like screen readers, work inconsistently when `aria-hidden=\"true\"` is set on the document ``. [Learn how `aria-hidden` affects the document body](https://dequeuniversity.com/rules/axe/4.11/aria-hidden-body).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"aria-hidden-focus":{"id":"aria-hidden-focus","title":"`[aria-hidden=\"true\"]` elements do not contain focusable descendents","description":"Focusable descendents within an `[aria-hidden=\"true\"]` element prevent those interactive elements from being available to users of assistive technologies like screen readers. [Learn how `aria-hidden` affects focusable elements](https://dequeuniversity.com/rules/axe/4.11/aria-hidden-focus).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"aria-input-field-name":{"id":"aria-input-field-name","title":"ARIA input fields do not have accessible names","description":"When an input field doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn more about input field labels](https://dequeuniversity.com/rules/axe/4.11/aria-input-field-name).","score":0,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[{"node":{"type":"node","lhId":"1-0-SPAN","path":"1,HTML,1,BODY,1,DIV,1,DIV,3,DIV,0,DIV,0,DIV,0,DIV,4,DIV,0,DIV,0,DIV,0,DIV,0,DIV,0,DIV,0,SPAN,1,SPAN","selector":"div.w-full > div.touch-gate-target > span.glass-slider > span.slider-thumb","boundingRect":{"top":473,"bottom":489,"left":41,"right":57,"width":16,"height":16},"snippet":"","nodeLabel":"div.w-full > div.touch-gate-target > span.glass-slider > span.slider-thumb","explanation":"Fix any of the following:\n aria-label attribute does not exist or is empty\n aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty\n Element has no title attribute"}}],"debugData":{"type":"debugdata","impact":"serious","tags":["cat.aria","wcag2a","wcag412","TTv5","TT5.c","EN-301-549","EN-9.4.1.2","ACT","RGAAv4","RGAA-11.1.1"]}}},"aria-meter-name":{"id":"aria-meter-name","title":"ARIA `meter` elements have accessible names","description":"When a meter element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn how to name `meter` elements](https://dequeuniversity.com/rules/axe/4.11/aria-meter-name).","score":null,"scoreDisplayMode":"notApplicable"},"aria-progressbar-name":{"id":"aria-progressbar-name","title":"ARIA `progressbar` elements have accessible names","description":"When a `progressbar` element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn how to label `progressbar` elements](https://dequeuniversity.com/rules/axe/4.11/aria-progressbar-name).","score":null,"scoreDisplayMode":"notApplicable"},"aria-prohibited-attr":{"id":"aria-prohibited-attr","title":"Elements use only permitted ARIA attributes","description":"Using ARIA attributes in roles where they are prohibited can mean that important information is not communicated to users of assistive technologies. [Learn more about prohibited ARIA roles](https://dequeuniversity.com/rules/axe/4.11/aria-prohibited-attr).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"aria-required-attr":{"id":"aria-required-attr","title":"`[role]`s have all required `[aria-*]` attributes","description":"Some ARIA roles have required attributes that describe the state of the element to screen readers. [Learn more about roles and required attributes](https://dequeuniversity.com/rules/axe/4.11/aria-required-attr).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"aria-required-children":{"id":"aria-required-children","title":"Elements with an ARIA `[role]` that require children to contain a specific `[role]` have all required children.","description":"Some ARIA parent roles must contain specific child roles to perform their intended accessibility functions. [Learn more about roles and required children elements](https://dequeuniversity.com/rules/axe/4.11/aria-required-children).","score":null,"scoreDisplayMode":"notApplicable"},"aria-required-parent":{"id":"aria-required-parent","title":"`[role]`s are contained by their required parent element","description":"Some ARIA child roles must be contained by specific parent roles to properly perform their intended accessibility functions. [Learn more about ARIA roles and required parent element](https://dequeuniversity.com/rules/axe/4.11/aria-required-parent).","score":null,"scoreDisplayMode":"notApplicable"},"aria-roles":{"id":"aria-roles","title":"`[role]` values are valid","description":"ARIA roles must have valid values in order to perform their intended accessibility functions. [Learn more about valid ARIA roles](https://dequeuniversity.com/rules/axe/4.11/aria-roles).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"aria-text":{"id":"aria-text","title":"Elements with the `role=text` attribute do not have focusable descendents.","description":"Adding `role=text` around a text node split by markup enables VoiceOver to treat it as one phrase, but the element's focusable descendents will not be announced. [Learn more about the `role=text` attribute](https://dequeuniversity.com/rules/axe/4.11/aria-text).","score":null,"scoreDisplayMode":"notApplicable"},"aria-toggle-field-name":{"id":"aria-toggle-field-name","title":"ARIA toggle fields have accessible names","description":"When a toggle field doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn more about toggle fields](https://dequeuniversity.com/rules/axe/4.11/aria-toggle-field-name).","score":null,"scoreDisplayMode":"notApplicable"},"aria-tooltip-name":{"id":"aria-tooltip-name","title":"ARIA `tooltip` elements have accessible names","description":"When a tooltip element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn how to name `tooltip` elements](https://dequeuniversity.com/rules/axe/4.11/aria-tooltip-name).","score":null,"scoreDisplayMode":"notApplicable"},"aria-treeitem-name":{"id":"aria-treeitem-name","title":"ARIA `treeitem` elements have accessible names","description":"When a `treeitem` element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. [Learn more about labeling `treeitem` elements](https://dequeuniversity.com/rules/axe/4.11/aria-treeitem-name).","score":null,"scoreDisplayMode":"notApplicable"},"aria-valid-attr-value":{"id":"aria-valid-attr-value","title":"`[aria-*]` attributes have valid values","description":"Assistive technologies, like screen readers, can't interpret ARIA attributes with invalid values. [Learn more about valid values for ARIA attributes](https://dequeuniversity.com/rules/axe/4.11/aria-valid-attr-value).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"aria-valid-attr":{"id":"aria-valid-attr","title":"`[aria-*]` attributes are valid and not misspelled","description":"Assistive technologies, like screen readers, can't interpret ARIA attributes with invalid names. [Learn more about valid ARIA attributes](https://dequeuniversity.com/rules/axe/4.11/aria-valid-attr).","score":1,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[]}},"button-name":{"id":"button-name","title":"Buttons do not have an accessible name","description":"When a button doesn't have an accessible name, screen readers announce it as \"button\", making it unusable for users who rely on screen readers. [Learn how to make buttons more accessible](https://dequeuniversity.com/rules/axe/4.11/button-name).","score":0,"scoreDisplayMode":"binary","details":{"type":"table","headings":[{"key":"node","valueType":"node","subItemsHeading":{"key":"relatedNode","valueType":"node"},"label":"Failing Elements"}],"items":[{"node":{"type":"node","lhId":"1-1-BUTTON","path":"1,HTML,1,BODY,1,DIV,1,DIV,3,DIV,0,DIV,0,DIV,0,DIV,0,DIV,0,DIV,0,DIV,1,DIV,0,DIV,0,DIV,0,DIV,0,DIV,0,DIV,0,DIV,0,DIV,3,DIV,1,BUTTON","selector":"div.panel-row > div.panel-content > div.labeled-field > button.glass-wash","boundingRect":{"top":202,"bottom":242,"left":258,"right":355,"width":97,"height":40},"snippet":"