[READ-ONLY] Mirror of https://github.com/FoxxMD/multi-scrobbler. Scrobble plays from multiple sources to multiple clients docs.multi-scrobbler.app
deezer docker jellyfin koito lastfm listenbrainz maloja mopidy mpris music music-assistant plex scrobble self-hosted spotify subsonic tautulli youtube-music
0

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request #498 from FoxxMD/storybook

feat: Add storybook and initial ui design POC

authored by

Matt Foxx and committed by
GitHub
(Mar 20, 2026, 9:40 AM EDT) 1b182d89 345e60b7

+11593 -466
+3 -1
.dockerignore
··· 28 28 **/act/* 29 29 tmp-* 30 30 .env 31 - *.env 31 + *.env 32 + .storybook 33 + .stories
+3
.gitignore
··· 148 148 **/generated-sources.* 149 149 .github/act/out 150 150 tmp-* 151 + 152 + *storybook.log 153 + storybook-static
+45
.storybook/main.ts
··· 1 + import { defineMain } from "@storybook/react-vite/node"; 2 + import { mergeConfig } from "vite"; 3 + 4 + 5 + export default defineMain({ 6 + "stories": [ 7 + "../src/**/*.mdx", 8 + "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)" 9 + ], 10 + "addons": [ 11 + "@chromatic-com/storybook", 12 + "@storybook/addon-vitest", 13 + "@storybook/addon-a11y", 14 + "@storybook/addon-docs", 15 + "@storybook/addon-onboarding" 16 + ], 17 + features: { 18 + // https://github.com/storybookjs/storybook/discussions/33279 19 + sidebarOnboardingChecklist: false, 20 + }, 21 + "framework": "@storybook/react-vite", 22 + viteFinal: async (config) => { 23 + return mergeConfig(config, { 24 + optimizeDeps: { 25 + include: ["@storybook/addon-docs"], 26 + }, 27 + plugins: [ 28 + { 29 + name: "fix-mdx-react-shim", 30 + enforce: "pre", 31 + resolveId(source: any) { 32 + if ( 33 + source.startsWith("file://") && 34 + source.includes("mdx-react-shim.js") 35 + ) { 36 + // Convert file:///... path to normal filesystem path for Vite 37 + return new URL(source).pathname; 38 + } 39 + return null; 40 + }, 41 + }, 42 + ], 43 + }); 44 + }, 45 + });
+6
.storybook/manager.ts
··· 1 + import { addons } from 'storybook/manager-api'; 2 + import { themes } from 'storybook/theming'; 3 + 4 + addons.setConfig({ 5 + theme: themes.dark, 6 + });
+28
.storybook/preview.ts
··· 1 + import addonDocs from "@storybook/addon-docs"; 2 + import addonA11y from "@storybook/addon-a11y"; 3 + import { definePreview } from "@storybook/react-vite"; 4 + 5 + import { themes } from 'storybook/theming'; 6 + 7 + export default definePreview({ 8 + parameters: { 9 + controls: { 10 + matchers: { 11 + color: /(background|color)$/i, 12 + date: /Date$/i, 13 + }, 14 + }, 15 + 16 + a11y: { 17 + // 'todo' - show a11y violations in the test UI only 18 + // 'error' - fail CI on a11y violations 19 + // 'off' - skip a11y checks entirely 20 + test: 'todo' 21 + }, 22 + docs: { 23 + theme: themes.dark, 24 + }, 25 + }, 26 + 27 + addons: [addonA11y(), addonDocs()] 28 + });
+1 -2
docsite/tsconfig.json
··· 4 4 "compilerOptions": { 5 5 "baseUrl": ".", 6 6 "resolveJsonModule": true, 7 - // Extending "@tsconfig/docusaurus/tsconfig.json".types with "docusaurus-json-schema-plugin" 8 - "types": ["node", "@docusaurus/module-type-aliases", "@docusaurus/theme-classic", "docusaurus-json-schema-plugin","docusaurus-plugin-sass"] 7 + "types": ["node", "@docusaurus/module-type-aliases", "@docusaurus/theme-classic","docusaurus-plugin-sass"] 9 8 } 10 9 }
+4 -1
eslint.config.js
··· 1 + // For more info, see https://github.com/storybookjs/eslint-plugin-storybook#configuration-flat-config-format 2 + import storybook from "eslint-plugin-storybook"; 3 + 1 4 // @ts-check 2 5 3 6 import eslint from '@eslint/js'; ··· 33 36 "arrow-body-style": ["warn", "as-needed"], 34 37 "@typescript-eslint/no-explicit-any": "warn" 35 38 } 36 - }); 39 + }, storybook.configs["flat/recommended"]);
+7317 -203
package-lock.json
··· 15 15 "@atproto/api": "^0.18.0", 16 16 "@atproto/oauth-client-node": "^0.3.10", 17 17 "@awaitjs/express": "^0.6.3", 18 + "@chakra-ui/react": "^3.34.0", 18 19 "@curvenote/ansi-to-react": "^7.0.0", 19 20 "@donedeal0/superdiff": "^1.1.1", 21 + "@emotion/react": "^11.14.0", 20 22 "@ewanc26/tid": "^1.0.2", 21 23 "@fortawesome/fontawesome-svg-core": "^6.4.2", 22 24 "@fortawesome/free-solid-svg-icons": "^6.4.2", ··· 73 75 "jest-diff": "^30.2.0", 74 76 "json5": "^2.2.3", 75 77 "jsondiffpatch": "^0.7.3", 78 + "jsondiffpatch-react": "^1.0.8", 76 79 "keyv": "^5.5.0", 77 80 "kodi-api": "^0.2.1", 78 81 "lastfm-ts-api": "^2.6.0", ··· 81 84 "mpd-api": "^1.1.2", 82 85 "musicbrainz-api": "^0.27.0", 83 86 "nanoid": "^3.3.1", 87 + "next-themes": "^0.4.6", 84 88 "node-object-hash": "^3.1.1", 85 89 "normalize-url": "^8.0.1", 86 90 "ntfy": "^1.7.6", ··· 93 97 "prom-client": "^15.1.3", 94 98 "react": "^18.2.0", 95 99 "react-dom": "^18.2.0", 100 + "react-error-boundary": "^6.1.1", 101 + "react-icons": "^5.6.0", 96 102 "react-redux": "^8.1.2", 97 103 "react-router-dom": "^6.15.0", 98 104 "round-robin-js": "^3.0.10", 99 105 "sass": "^1.93.3", 100 106 "serialize-error": "^13.0.1", 107 + "shiki": "^4.0.2", 101 108 "spotify-web-api-node": "^5.0.2", 102 109 "superagent": "^8.0.9", 103 110 "tailwindcss": "^4.1.16", ··· 114 121 "youtubei.js": "^15.0.1" 115 122 }, 116 123 "devDependencies": { 124 + "@chromatic-com/storybook": "^5.0.1", 117 125 "@dbus-types/notifications": "^0.0.5", 118 126 "@eslint/js": "^8.56.0", 119 127 "@faker-js/faker": "^9.0.1", 120 128 "@gr2m/net-interceptor": "^1.0.0", 121 129 "@istanbuljs/nyc-config-typescript": "^1.0.2", 130 + "@storybook/addon-a11y": "10.1.11", 131 + "@storybook/addon-docs": "10.1.11", 132 + "@storybook/addon-onboarding": "10.1.11", 133 + "@storybook/addon-vitest": "10.1.11", 134 + "@storybook/react-vite": "10.1.11", 122 135 "@testing-library/jest-dom": "^5.17.0", 123 136 "@testing-library/react": "^13.4.0", 124 137 "@testing-library/user-event": "^13.5.0", ··· 135 148 "@types/jest": "^27.5.2", 136 149 "@types/jscodeshift": "^0.11.6", 137 150 "@types/mocha": "^9.1.0", 138 - "@types/node": "^18.0.0", 151 + "@types/node": "^20.19.2", 139 152 "@types/object-hash": "^3.0.0", 140 153 "@types/passport": "^1.0.12", 141 154 "@types/react": "^18.2.18", ··· 146 159 "@types/superagent": "^8.1.9", 147 160 "@types/xml2js": "^0.4.11", 148 161 "@vitejs/plugin-react": "^4.2.1", 162 + "@vitest/browser-playwright": "^4.1.0", 163 + "@vitest/coverage-v8": "^4.1.0", 149 164 "chai": "^4.3.6", 150 165 "chai-as-promised": "^7.1.1", 151 166 "eslint": "^8.56.0", 152 167 "eslint-plugin-prefer-arrow-functions": "^3.2.4", 168 + "eslint-plugin-storybook": "10.1.11", 153 169 "git-cliff": "^2.12.0", 154 170 "mocha": "^10.3.0", 155 171 "mockdate": "^3.0.5", 156 172 "msw": "^2.12.10", 157 173 "nodemon": "^3.0.3", 174 + "playwright": "^1.58.2", 158 175 "sinon": "^21.0.2", 176 + "storybook": "^10.2.0", 159 177 "ts-essentials": "^9.1.2", 160 - "typescript": "5.5.4", 178 + "typescript": "^5.9.3", 161 179 "typescript-eslint": "^7.0.1", 162 180 "vite": "^5.2.12", 181 + "vitest": "^4.1.0", 163 182 "with-local-tmp-dir": "^6.0.0" 164 183 }, 165 184 "engines": { ··· 173 192 "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==", 174 193 "dev": true 175 194 }, 176 - "node_modules/@ampproject/remapping": { 177 - "version": "2.3.0", 178 - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 179 - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 180 - "dev": true, 195 + "node_modules/@ark-ui/react": { 196 + "version": "5.34.1", 197 + "resolved": "https://registry.npmjs.org/@ark-ui/react/-/react-5.34.1.tgz", 198 + "integrity": "sha512-RJlXCvsHzbK9LVxUVtaSD5pyF1PL8IUR1rHHkf0H0Sa397l6kOFE4EH7MCSj3pDumj2NsmKDVeVgfkfG0KCuEw==", 199 + "license": "MIT", 181 200 "dependencies": { 182 - "@jridgewell/gen-mapping": "^0.3.5", 183 - "@jridgewell/trace-mapping": "^0.3.24" 201 + "@internationalized/date": "3.11.0", 202 + "@zag-js/accordion": "1.35.3", 203 + "@zag-js/anatomy": "1.35.3", 204 + "@zag-js/angle-slider": "1.35.3", 205 + "@zag-js/async-list": "1.35.3", 206 + "@zag-js/auto-resize": "1.35.3", 207 + "@zag-js/avatar": "1.35.3", 208 + "@zag-js/carousel": "1.35.3", 209 + "@zag-js/cascade-select": "1.35.3", 210 + "@zag-js/checkbox": "1.35.3", 211 + "@zag-js/clipboard": "1.35.3", 212 + "@zag-js/collapsible": "1.35.3", 213 + "@zag-js/collection": "1.35.3", 214 + "@zag-js/color-picker": "1.35.3", 215 + "@zag-js/color-utils": "1.35.3", 216 + "@zag-js/combobox": "1.35.3", 217 + "@zag-js/core": "1.35.3", 218 + "@zag-js/date-picker": "1.35.3", 219 + "@zag-js/date-utils": "1.35.3", 220 + "@zag-js/dialog": "1.35.3", 221 + "@zag-js/dom-query": "1.35.3", 222 + "@zag-js/drawer": "1.35.3", 223 + "@zag-js/editable": "1.35.3", 224 + "@zag-js/file-upload": "1.35.3", 225 + "@zag-js/file-utils": "1.35.3", 226 + "@zag-js/floating-panel": "1.35.3", 227 + "@zag-js/focus-trap": "1.35.3", 228 + "@zag-js/highlight-word": "1.35.3", 229 + "@zag-js/hover-card": "1.35.3", 230 + "@zag-js/i18n-utils": "1.35.3", 231 + "@zag-js/image-cropper": "1.35.3", 232 + "@zag-js/json-tree-utils": "1.35.3", 233 + "@zag-js/listbox": "1.35.3", 234 + "@zag-js/marquee": "1.35.3", 235 + "@zag-js/menu": "1.35.3", 236 + "@zag-js/navigation-menu": "1.35.3", 237 + "@zag-js/number-input": "1.35.3", 238 + "@zag-js/pagination": "1.35.3", 239 + "@zag-js/password-input": "1.35.3", 240 + "@zag-js/pin-input": "1.35.3", 241 + "@zag-js/popover": "1.35.3", 242 + "@zag-js/presence": "1.35.3", 243 + "@zag-js/progress": "1.35.3", 244 + "@zag-js/qr-code": "1.35.3", 245 + "@zag-js/radio-group": "1.35.3", 246 + "@zag-js/rating-group": "1.35.3", 247 + "@zag-js/react": "1.35.3", 248 + "@zag-js/scroll-area": "1.35.3", 249 + "@zag-js/select": "1.35.3", 250 + "@zag-js/signature-pad": "1.35.3", 251 + "@zag-js/slider": "1.35.3", 252 + "@zag-js/splitter": "1.35.3", 253 + "@zag-js/steps": "1.35.3", 254 + "@zag-js/switch": "1.35.3", 255 + "@zag-js/tabs": "1.35.3", 256 + "@zag-js/tags-input": "1.35.3", 257 + "@zag-js/timer": "1.35.3", 258 + "@zag-js/toast": "1.35.3", 259 + "@zag-js/toggle": "1.35.3", 260 + "@zag-js/toggle-group": "1.35.3", 261 + "@zag-js/tooltip": "1.35.3", 262 + "@zag-js/tour": "1.35.3", 263 + "@zag-js/tree-view": "1.35.3", 264 + "@zag-js/types": "1.35.3", 265 + "@zag-js/utils": "1.35.3" 184 266 }, 185 - "engines": { 186 - "node": ">=6.0.0" 267 + "peerDependencies": { 268 + "react": ">=18.0.0", 269 + "react-dom": ">=18.0.0" 187 270 } 188 271 }, 189 272 "node_modules/@astronautlabs/mdns": { ··· 531 614 } 532 615 }, 533 616 "node_modules/@babel/code-frame": { 534 - "version": "7.26.2", 535 - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", 536 - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", 537 - "dev": true, 617 + "version": "7.29.0", 618 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", 619 + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", 620 + "license": "MIT", 538 621 "dependencies": { 539 - "@babel/helper-validator-identifier": "^7.25.9", 622 + "@babel/helper-validator-identifier": "^7.28.5", 540 623 "js-tokens": "^4.0.0", 541 - "picocolors": "^1.0.0" 624 + "picocolors": "^1.1.1" 542 625 }, 543 626 "engines": { 544 627 "node": ">=6.9.0" 545 628 } 546 629 }, 547 630 "node_modules/@babel/compat-data": { 548 - "version": "7.26.2", 549 - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", 550 - "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", 631 + "version": "7.29.0", 632 + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", 633 + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", 551 634 "dev": true, 635 + "license": "MIT", 552 636 "engines": { 553 637 "node": ">=6.9.0" 554 638 } 555 639 }, 556 640 "node_modules/@babel/core": { 557 - "version": "7.26.0", 558 - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", 559 - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", 641 + "version": "7.29.0", 642 + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", 643 + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", 560 644 "dev": true, 645 + "license": "MIT", 561 646 "dependencies": { 562 - "@ampproject/remapping": "^2.2.0", 563 - "@babel/code-frame": "^7.26.0", 564 - "@babel/generator": "^7.26.0", 565 - "@babel/helper-compilation-targets": "^7.25.9", 566 - "@babel/helper-module-transforms": "^7.26.0", 567 - "@babel/helpers": "^7.26.0", 568 - "@babel/parser": "^7.26.0", 569 - "@babel/template": "^7.25.9", 570 - "@babel/traverse": "^7.25.9", 571 - "@babel/types": "^7.26.0", 647 + "@babel/code-frame": "^7.29.0", 648 + "@babel/generator": "^7.29.0", 649 + "@babel/helper-compilation-targets": "^7.28.6", 650 + "@babel/helper-module-transforms": "^7.28.6", 651 + "@babel/helpers": "^7.28.6", 652 + "@babel/parser": "^7.29.0", 653 + "@babel/template": "^7.28.6", 654 + "@babel/traverse": "^7.29.0", 655 + "@babel/types": "^7.29.0", 656 + "@jridgewell/remapping": "^2.3.5", 572 657 "convert-source-map": "^2.0.0", 573 658 "debug": "^4.1.0", 574 659 "gensync": "^1.0.0-beta.2", ··· 584 669 } 585 670 }, 586 671 "node_modules/@babel/generator": { 587 - "version": "7.26.2", 588 - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", 589 - "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", 590 - "dev": true, 672 + "version": "7.29.1", 673 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", 674 + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", 675 + "license": "MIT", 591 676 "dependencies": { 592 - "@babel/parser": "^7.26.2", 593 - "@babel/types": "^7.26.0", 594 - "@jridgewell/gen-mapping": "^0.3.5", 595 - "@jridgewell/trace-mapping": "^0.3.25", 677 + "@babel/parser": "^7.29.0", 678 + "@babel/types": "^7.29.0", 679 + "@jridgewell/gen-mapping": "^0.3.12", 680 + "@jridgewell/trace-mapping": "^0.3.28", 596 681 "jsesc": "^3.0.2" 597 682 }, 598 683 "engines": { ··· 600 685 } 601 686 }, 602 687 "node_modules/@babel/helper-compilation-targets": { 603 - "version": "7.25.9", 604 - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", 605 - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", 688 + "version": "7.28.6", 689 + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", 690 + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", 606 691 "dev": true, 692 + "license": "MIT", 607 693 "dependencies": { 608 - "@babel/compat-data": "^7.25.9", 609 - "@babel/helper-validator-option": "^7.25.9", 694 + "@babel/compat-data": "^7.28.6", 695 + "@babel/helper-validator-option": "^7.27.1", 610 696 "browserslist": "^4.24.0", 611 697 "lru-cache": "^5.1.1", 612 698 "semver": "^6.3.1" ··· 615 701 "node": ">=6.9.0" 616 702 } 617 703 }, 704 + "node_modules/@babel/helper-globals": { 705 + "version": "7.28.0", 706 + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", 707 + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", 708 + "license": "MIT", 709 + "engines": { 710 + "node": ">=6.9.0" 711 + } 712 + }, 618 713 "node_modules/@babel/helper-module-imports": { 619 - "version": "7.25.9", 620 - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", 621 - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", 622 - "dev": true, 714 + "version": "7.28.6", 715 + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", 716 + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", 717 + "license": "MIT", 623 718 "dependencies": { 624 - "@babel/traverse": "^7.25.9", 625 - "@babel/types": "^7.25.9" 719 + "@babel/traverse": "^7.28.6", 720 + "@babel/types": "^7.28.6" 626 721 }, 627 722 "engines": { 628 723 "node": ">=6.9.0" 629 724 } 630 725 }, 631 726 "node_modules/@babel/helper-module-transforms": { 632 - "version": "7.26.0", 633 - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", 634 - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", 727 + "version": "7.28.6", 728 + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", 729 + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", 635 730 "dev": true, 731 + "license": "MIT", 636 732 "dependencies": { 637 - "@babel/helper-module-imports": "^7.25.9", 638 - "@babel/helper-validator-identifier": "^7.25.9", 639 - "@babel/traverse": "^7.25.9" 733 + "@babel/helper-module-imports": "^7.28.6", 734 + "@babel/helper-validator-identifier": "^7.28.5", 735 + "@babel/traverse": "^7.28.6" 640 736 }, 641 737 "engines": { 642 738 "node": ">=6.9.0" ··· 655 751 } 656 752 }, 657 753 "node_modules/@babel/helper-string-parser": { 658 - "version": "7.25.9", 659 - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", 660 - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", 661 - "dev": true, 754 + "version": "7.27.1", 755 + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", 756 + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", 757 + "license": "MIT", 662 758 "engines": { 663 759 "node": ">=6.9.0" 664 760 } 665 761 }, 666 762 "node_modules/@babel/helper-validator-identifier": { 667 - "version": "7.25.9", 668 - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", 669 - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", 670 - "dev": true, 763 + "version": "7.28.5", 764 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", 765 + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", 766 + "license": "MIT", 671 767 "engines": { 672 768 "node": ">=6.9.0" 673 769 } 674 770 }, 675 771 "node_modules/@babel/helper-validator-option": { 676 - "version": "7.25.9", 677 - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", 678 - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", 772 + "version": "7.27.1", 773 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", 774 + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", 679 775 "dev": true, 776 + "license": "MIT", 680 777 "engines": { 681 778 "node": ">=6.9.0" 682 779 } 683 780 }, 684 781 "node_modules/@babel/helpers": { 685 - "version": "7.26.0", 686 - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", 687 - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", 782 + "version": "7.29.2", 783 + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", 784 + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", 688 785 "dev": true, 786 + "license": "MIT", 689 787 "dependencies": { 690 - "@babel/template": "^7.25.9", 691 - "@babel/types": "^7.26.0" 788 + "@babel/template": "^7.28.6", 789 + "@babel/types": "^7.29.0" 692 790 }, 693 791 "engines": { 694 792 "node": ">=6.9.0" 695 793 } 696 794 }, 697 795 "node_modules/@babel/parser": { 698 - "version": "7.26.2", 699 - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", 700 - "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", 701 - "dev": true, 796 + "version": "7.29.2", 797 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", 798 + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", 799 + "license": "MIT", 702 800 "dependencies": { 703 - "@babel/types": "^7.26.0" 801 + "@babel/types": "^7.29.0" 704 802 }, 705 803 "bin": { 706 804 "parser": "bin/babel-parser.js" ··· 751 849 } 752 850 }, 753 851 "node_modules/@babel/template": { 754 - "version": "7.25.9", 755 - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", 756 - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", 757 - "dev": true, 852 + "version": "7.28.6", 853 + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", 854 + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", 855 + "license": "MIT", 758 856 "dependencies": { 759 - "@babel/code-frame": "^7.25.9", 760 - "@babel/parser": "^7.25.9", 761 - "@babel/types": "^7.25.9" 857 + "@babel/code-frame": "^7.28.6", 858 + "@babel/parser": "^7.28.6", 859 + "@babel/types": "^7.28.6" 762 860 }, 763 861 "engines": { 764 862 "node": ">=6.9.0" 765 863 } 766 864 }, 767 865 "node_modules/@babel/traverse": { 768 - "version": "7.25.9", 769 - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", 770 - "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", 771 - "dev": true, 866 + "version": "7.29.0", 867 + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", 868 + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", 869 + "license": "MIT", 772 870 "dependencies": { 773 - "@babel/code-frame": "^7.25.9", 774 - "@babel/generator": "^7.25.9", 775 - "@babel/parser": "^7.25.9", 776 - "@babel/template": "^7.25.9", 777 - "@babel/types": "^7.25.9", 778 - "debug": "^4.3.1", 779 - "globals": "^11.1.0" 871 + "@babel/code-frame": "^7.29.0", 872 + "@babel/generator": "^7.29.0", 873 + "@babel/helper-globals": "^7.28.0", 874 + "@babel/parser": "^7.29.0", 875 + "@babel/template": "^7.28.6", 876 + "@babel/types": "^7.29.0", 877 + "debug": "^4.3.1" 780 878 }, 781 879 "engines": { 782 880 "node": ">=6.9.0" 783 881 } 784 882 }, 785 883 "node_modules/@babel/types": { 786 - "version": "7.26.0", 787 - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", 788 - "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", 789 - "dev": true, 884 + "version": "7.29.0", 885 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", 886 + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", 887 + "license": "MIT", 790 888 "dependencies": { 791 - "@babel/helper-string-parser": "^7.25.9", 792 - "@babel/helper-validator-identifier": "^7.25.9" 889 + "@babel/helper-string-parser": "^7.27.1", 890 + "@babel/helper-validator-identifier": "^7.28.5" 793 891 }, 794 892 "engines": { 795 893 "node": ">=6.9.0" ··· 803 901 "peer": true, 804 902 "engines": { 805 903 "node": ">= 18" 904 + } 905 + }, 906 + "node_modules/@bcoe/v8-coverage": { 907 + "version": "1.0.2", 908 + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", 909 + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", 910 + "dev": true, 911 + "license": "MIT", 912 + "engines": { 913 + "node": ">=18" 806 914 } 807 915 }, 808 916 "node_modules/@biomejs/biome": { ··· 960 1068 "node": ">=14.21.3" 961 1069 } 962 1070 }, 1071 + "node_modules/@blazediff/core": { 1072 + "version": "1.9.1", 1073 + "resolved": "https://registry.npmjs.org/@blazediff/core/-/core-1.9.1.tgz", 1074 + "integrity": "sha512-ehg3jIkYKulZh+8om/O25vkvSsXXwC+skXmyA87FFx6A/45eqOkZsBltMw/TVteb0mloiGT8oGRTcjRAz66zaA==", 1075 + "dev": true, 1076 + "license": "MIT" 1077 + }, 963 1078 "node_modules/@bufbuild/protobuf": { 964 1079 "version": "2.2.1", 965 1080 "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.1.tgz", 966 1081 "integrity": "sha512-gdWzq7eX017a1kZCU/bP/sbk4e0GZ6idjsXOcMrQwODCb/rx985fHJJ8+hCu79KpuG7PfZh7bo3BBjPH37JuZw==" 967 1082 }, 1083 + "node_modules/@chakra-ui/react": { 1084 + "version": "3.34.0", 1085 + "resolved": "https://registry.npmjs.org/@chakra-ui/react/-/react-3.34.0.tgz", 1086 + "integrity": "sha512-VLhpVwv5IVxhwajO10KnS1VQT4hDqQMQP/A796Ya+uVu8AdoSX+5HHyTLTkYIeXIDMe0xLqJfov04OBKbBchJA==", 1087 + "license": "MIT", 1088 + "dependencies": { 1089 + "@ark-ui/react": "^5.34.1", 1090 + "@emotion/is-prop-valid": "^1.4.0", 1091 + "@emotion/serialize": "^1.3.3", 1092 + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", 1093 + "@emotion/utils": "^1.4.2", 1094 + "@pandacss/is-valid-prop": "^1.4.2", 1095 + "csstype": "^3.2.3" 1096 + }, 1097 + "peerDependencies": { 1098 + "@emotion/react": ">=11", 1099 + "react": ">=18", 1100 + "react-dom": ">=18" 1101 + } 1102 + }, 1103 + "node_modules/@chromatic-com/storybook": { 1104 + "version": "5.0.1", 1105 + "resolved": "https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-5.0.1.tgz", 1106 + "integrity": "sha512-v80QBwVd8W6acH5NtDgFlUevIBaMZAh1pYpBiB40tuNzS242NTHeQHBDGYwIAbWKDnt1qfjJpcpL6pj5kAr4LA==", 1107 + "dev": true, 1108 + "license": "MIT", 1109 + "dependencies": { 1110 + "@neoconfetti/react": "^1.0.0", 1111 + "chromatic": "^13.3.4", 1112 + "filesize": "^10.0.12", 1113 + "jsonfile": "^6.1.0", 1114 + "strip-ansi": "^7.1.0" 1115 + }, 1116 + "engines": { 1117 + "node": ">=20.0.0", 1118 + "yarn": ">=1.22.18" 1119 + }, 1120 + "peerDependencies": { 1121 + "storybook": "^0.0.0-0 || ^10.1.0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0" 1122 + } 1123 + }, 1124 + "node_modules/@chromatic-com/storybook/node_modules/ansi-regex": { 1125 + "version": "6.2.2", 1126 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", 1127 + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", 1128 + "dev": true, 1129 + "license": "MIT", 1130 + "engines": { 1131 + "node": ">=12" 1132 + }, 1133 + "funding": { 1134 + "url": "https://github.com/chalk/ansi-regex?sponsor=1" 1135 + } 1136 + }, 1137 + "node_modules/@chromatic-com/storybook/node_modules/strip-ansi": { 1138 + "version": "7.2.0", 1139 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", 1140 + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", 1141 + "dev": true, 1142 + "license": "MIT", 1143 + "dependencies": { 1144 + "ansi-regex": "^6.2.2" 1145 + }, 1146 + "engines": { 1147 + "node": ">=12" 1148 + }, 1149 + "funding": { 1150 + "url": "https://github.com/chalk/strip-ansi?sponsor=1" 1151 + } 1152 + }, 968 1153 "node_modules/@curvenote/ansi-to-react": { 969 1154 "version": "7.0.0", 970 1155 "resolved": "https://registry.npmjs.org/@curvenote/ansi-to-react/-/ansi-to-react-7.0.0.tgz", ··· 1188 1373 "url": "https://github.com/sponsors/dword-design" 1189 1374 } 1190 1375 }, 1376 + "node_modules/@emnapi/core": { 1377 + "version": "1.9.0", 1378 + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.0.tgz", 1379 + "integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==", 1380 + "license": "MIT", 1381 + "optional": true, 1382 + "dependencies": { 1383 + "@emnapi/wasi-threads": "1.2.0", 1384 + "tslib": "^2.4.0" 1385 + } 1386 + }, 1387 + "node_modules/@emnapi/runtime": { 1388 + "version": "1.9.0", 1389 + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz", 1390 + "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==", 1391 + "license": "MIT", 1392 + "optional": true, 1393 + "dependencies": { 1394 + "tslib": "^2.4.0" 1395 + } 1396 + }, 1397 + "node_modules/@emnapi/wasi-threads": { 1398 + "version": "1.2.0", 1399 + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", 1400 + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", 1401 + "license": "MIT", 1402 + "optional": true, 1403 + "dependencies": { 1404 + "tslib": "^2.4.0" 1405 + } 1406 + }, 1407 + "node_modules/@emotion/babel-plugin": { 1408 + "version": "11.13.5", 1409 + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", 1410 + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", 1411 + "license": "MIT", 1412 + "dependencies": { 1413 + "@babel/helper-module-imports": "^7.16.7", 1414 + "@babel/runtime": "^7.18.3", 1415 + "@emotion/hash": "^0.9.2", 1416 + "@emotion/memoize": "^0.9.0", 1417 + "@emotion/serialize": "^1.3.3", 1418 + "babel-plugin-macros": "^3.1.0", 1419 + "convert-source-map": "^1.5.0", 1420 + "escape-string-regexp": "^4.0.0", 1421 + "find-root": "^1.1.0", 1422 + "source-map": "^0.5.7", 1423 + "stylis": "4.2.0" 1424 + } 1425 + }, 1426 + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { 1427 + "version": "1.9.0", 1428 + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", 1429 + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", 1430 + "license": "MIT" 1431 + }, 1432 + "node_modules/@emotion/babel-plugin/node_modules/source-map": { 1433 + "version": "0.5.7", 1434 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1435 + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", 1436 + "license": "BSD-3-Clause", 1437 + "engines": { 1438 + "node": ">=0.10.0" 1439 + } 1440 + }, 1441 + "node_modules/@emotion/cache": { 1442 + "version": "11.14.0", 1443 + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", 1444 + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", 1445 + "license": "MIT", 1446 + "dependencies": { 1447 + "@emotion/memoize": "^0.9.0", 1448 + "@emotion/sheet": "^1.4.0", 1449 + "@emotion/utils": "^1.4.2", 1450 + "@emotion/weak-memoize": "^0.4.0", 1451 + "stylis": "4.2.0" 1452 + } 1453 + }, 1454 + "node_modules/@emotion/hash": { 1455 + "version": "0.9.2", 1456 + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", 1457 + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", 1458 + "license": "MIT" 1459 + }, 1460 + "node_modules/@emotion/is-prop-valid": { 1461 + "version": "1.4.0", 1462 + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", 1463 + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", 1464 + "license": "MIT", 1465 + "dependencies": { 1466 + "@emotion/memoize": "^0.9.0" 1467 + } 1468 + }, 1469 + "node_modules/@emotion/memoize": { 1470 + "version": "0.9.0", 1471 + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", 1472 + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", 1473 + "license": "MIT" 1474 + }, 1475 + "node_modules/@emotion/react": { 1476 + "version": "11.14.0", 1477 + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", 1478 + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", 1479 + "license": "MIT", 1480 + "dependencies": { 1481 + "@babel/runtime": "^7.18.3", 1482 + "@emotion/babel-plugin": "^11.13.5", 1483 + "@emotion/cache": "^11.14.0", 1484 + "@emotion/serialize": "^1.3.3", 1485 + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", 1486 + "@emotion/utils": "^1.4.2", 1487 + "@emotion/weak-memoize": "^0.4.0", 1488 + "hoist-non-react-statics": "^3.3.1" 1489 + }, 1490 + "peerDependencies": { 1491 + "react": ">=16.8.0" 1492 + }, 1493 + "peerDependenciesMeta": { 1494 + "@types/react": { 1495 + "optional": true 1496 + } 1497 + } 1498 + }, 1499 + "node_modules/@emotion/serialize": { 1500 + "version": "1.3.3", 1501 + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", 1502 + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", 1503 + "license": "MIT", 1504 + "dependencies": { 1505 + "@emotion/hash": "^0.9.2", 1506 + "@emotion/memoize": "^0.9.0", 1507 + "@emotion/unitless": "^0.10.0", 1508 + "@emotion/utils": "^1.4.2", 1509 + "csstype": "^3.0.2" 1510 + } 1511 + }, 1512 + "node_modules/@emotion/sheet": { 1513 + "version": "1.4.0", 1514 + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", 1515 + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", 1516 + "license": "MIT" 1517 + }, 1518 + "node_modules/@emotion/unitless": { 1519 + "version": "0.10.0", 1520 + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", 1521 + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", 1522 + "license": "MIT" 1523 + }, 1524 + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { 1525 + "version": "1.2.0", 1526 + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", 1527 + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", 1528 + "license": "MIT", 1529 + "peerDependencies": { 1530 + "react": ">=16.8.0" 1531 + } 1532 + }, 1533 + "node_modules/@emotion/utils": { 1534 + "version": "1.4.2", 1535 + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", 1536 + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", 1537 + "license": "MIT" 1538 + }, 1539 + "node_modules/@emotion/weak-memoize": { 1540 + "version": "0.4.0", 1541 + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", 1542 + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", 1543 + "license": "MIT" 1544 + }, 1191 1545 "node_modules/@esbuild/aix-ppc64": { 1192 1546 "version": "0.23.1", 1193 1547 "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", ··· 1443 1797 "node": ">=18" 1444 1798 } 1445 1799 }, 1800 + "node_modules/@esbuild/netbsd-arm64": { 1801 + "version": "0.27.4", 1802 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", 1803 + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", 1804 + "cpu": [ 1805 + "arm64" 1806 + ], 1807 + "dev": true, 1808 + "license": "MIT", 1809 + "optional": true, 1810 + "os": [ 1811 + "netbsd" 1812 + ], 1813 + "peer": true, 1814 + "engines": { 1815 + "node": ">=18" 1816 + } 1817 + }, 1446 1818 "node_modules/@esbuild/netbsd-x64": { 1447 1819 "version": "0.23.1", 1448 1820 "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", ··· 1488 1860 "node": ">=18" 1489 1861 } 1490 1862 }, 1863 + "node_modules/@esbuild/openharmony-arm64": { 1864 + "version": "0.27.4", 1865 + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", 1866 + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", 1867 + "cpu": [ 1868 + "arm64" 1869 + ], 1870 + "dev": true, 1871 + "license": "MIT", 1872 + "optional": true, 1873 + "os": [ 1874 + "openharmony" 1875 + ], 1876 + "peer": true, 1877 + "engines": { 1878 + "node": ">=18" 1879 + } 1880 + }, 1491 1881 "node_modules/@esbuild/sunos-x64": { 1492 1882 "version": "0.23.1", 1493 1883 "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", ··· 1549 1939 } 1550 1940 }, 1551 1941 "node_modules/@eslint-community/eslint-utils": { 1552 - "version": "4.4.1", 1553 - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", 1554 - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", 1942 + "version": "4.9.1", 1943 + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", 1944 + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", 1555 1945 "dev": true, 1946 + "license": "MIT", 1556 1947 "dependencies": { 1557 1948 "eslint-visitor-keys": "^3.4.3" 1558 1949 }, ··· 1678 2069 "npm": ">=9.0.0" 1679 2070 } 1680 2071 }, 2072 + "node_modules/@floating-ui/core": { 2073 + "version": "1.7.5", 2074 + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", 2075 + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", 2076 + "license": "MIT", 2077 + "dependencies": { 2078 + "@floating-ui/utils": "^0.2.11" 2079 + } 2080 + }, 2081 + "node_modules/@floating-ui/dom": { 2082 + "version": "1.7.6", 2083 + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", 2084 + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", 2085 + "license": "MIT", 2086 + "dependencies": { 2087 + "@floating-ui/core": "^1.7.5", 2088 + "@floating-ui/utils": "^0.2.11" 2089 + } 2090 + }, 2091 + "node_modules/@floating-ui/utils": { 2092 + "version": "0.2.11", 2093 + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", 2094 + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", 2095 + "license": "MIT" 2096 + }, 1681 2097 "node_modules/@fortawesome/fontawesome-common-types": { 1682 2098 "version": "6.6.0", 1683 2099 "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.6.0.tgz", ··· 1946 2362 "@types/node": ">=18" 1947 2363 } 1948 2364 }, 2365 + "node_modules/@internationalized/date": { 2366 + "version": "3.11.0", 2367 + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.11.0.tgz", 2368 + "integrity": "sha512-BOx5huLAWhicM9/ZFs84CzP+V3gBW6vlpM02yzsdYC7TGlZJX1OJiEEHcSayF00Z+3jLlm4w79amvSt6RqKN3Q==", 2369 + "license": "Apache-2.0", 2370 + "dependencies": { 2371 + "@swc/helpers": "^0.5.0" 2372 + } 2373 + }, 2374 + "node_modules/@internationalized/number": { 2375 + "version": "3.6.5", 2376 + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.5.tgz", 2377 + "integrity": "sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g==", 2378 + "license": "Apache-2.0", 2379 + "dependencies": { 2380 + "@swc/helpers": "^0.5.0" 2381 + } 2382 + }, 1949 2383 "node_modules/@iovalkey/commands": { 1950 2384 "version": "0.1.0", 1951 2385 "resolved": "https://registry.npmjs.org/@iovalkey/commands/-/commands-0.1.0.tgz", ··· 2162 2596 "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" 2163 2597 } 2164 2598 }, 2165 - "node_modules/@jridgewell/gen-mapping": { 2166 - "version": "0.3.5", 2167 - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", 2168 - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", 2599 + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { 2600 + "version": "0.6.4", 2601 + "resolved": "https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.6.4.tgz", 2602 + "integrity": "sha512-6PyZBYKnnVNqOSB0YFly+62R7dmov8segT27A+RVTBVd4iAE6kbW9QBJGlyR2yG4D4ohzhZSTIu7BK1UTtmFFA==", 2603 + "dev": true, 2604 + "license": "MIT", 2169 2605 "dependencies": { 2170 - "@jridgewell/set-array": "^1.2.1", 2171 - "@jridgewell/sourcemap-codec": "^1.4.10", 2172 - "@jridgewell/trace-mapping": "^0.3.24" 2606 + "glob": "^13.0.1", 2607 + "react-docgen-typescript": "^2.2.2" 2608 + }, 2609 + "peerDependencies": { 2610 + "typescript": ">= 4.3.x", 2611 + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" 2173 2612 }, 2613 + "peerDependenciesMeta": { 2614 + "typescript": { 2615 + "optional": true 2616 + } 2617 + } 2618 + }, 2619 + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/balanced-match": { 2620 + "version": "4.0.4", 2621 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", 2622 + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", 2623 + "dev": true, 2624 + "license": "MIT", 2174 2625 "engines": { 2175 - "node": ">=6.0.0" 2626 + "node": "18 || 20 || >=22" 2627 + } 2628 + }, 2629 + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/brace-expansion": { 2630 + "version": "5.0.4", 2631 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", 2632 + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", 2633 + "dev": true, 2634 + "license": "MIT", 2635 + "dependencies": { 2636 + "balanced-match": "^4.0.2" 2637 + }, 2638 + "engines": { 2639 + "node": "18 || 20 || >=22" 2640 + } 2641 + }, 2642 + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/glob": { 2643 + "version": "13.0.6", 2644 + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", 2645 + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", 2646 + "dev": true, 2647 + "license": "BlueOak-1.0.0", 2648 + "dependencies": { 2649 + "minimatch": "^10.2.2", 2650 + "minipass": "^7.1.3", 2651 + "path-scurry": "^2.0.2" 2652 + }, 2653 + "engines": { 2654 + "node": "18 || 20 || >=22" 2655 + }, 2656 + "funding": { 2657 + "url": "https://github.com/sponsors/isaacs" 2658 + } 2659 + }, 2660 + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/minimatch": { 2661 + "version": "10.2.4", 2662 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", 2663 + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", 2664 + "dev": true, 2665 + "license": "BlueOak-1.0.0", 2666 + "dependencies": { 2667 + "brace-expansion": "^5.0.2" 2668 + }, 2669 + "engines": { 2670 + "node": "18 || 20 || >=22" 2671 + }, 2672 + "funding": { 2673 + "url": "https://github.com/sponsors/isaacs" 2674 + } 2675 + }, 2676 + "node_modules/@jridgewell/gen-mapping": { 2677 + "version": "0.3.13", 2678 + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", 2679 + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", 2680 + "license": "MIT", 2681 + "dependencies": { 2682 + "@jridgewell/sourcemap-codec": "^1.5.0", 2683 + "@jridgewell/trace-mapping": "^0.3.24" 2176 2684 } 2177 2685 }, 2178 2686 "node_modules/@jridgewell/remapping": { ··· 2193 2701 "node": ">=6.0.0" 2194 2702 } 2195 2703 }, 2196 - "node_modules/@jridgewell/set-array": { 2197 - "version": "1.2.1", 2198 - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 2199 - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 2200 - "engines": { 2201 - "node": ">=6.0.0" 2202 - } 2203 - }, 2204 2704 "node_modules/@jridgewell/sourcemap-codec": { 2205 2705 "version": "1.5.5", 2206 2706 "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", ··· 2208 2708 "license": "MIT" 2209 2709 }, 2210 2710 "node_modules/@jridgewell/trace-mapping": { 2211 - "version": "0.3.25", 2212 - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 2213 - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 2711 + "version": "0.3.31", 2712 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", 2713 + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", 2714 + "license": "MIT", 2214 2715 "dependencies": { 2215 2716 "@jridgewell/resolve-uri": "^3.1.0", 2216 2717 "@jridgewell/sourcemap-codec": "^1.4.14" ··· 2247 2748 "zod": ">= 3" 2248 2749 } 2249 2750 }, 2751 + "node_modules/@mdx-js/react": { 2752 + "version": "3.1.1", 2753 + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", 2754 + "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", 2755 + "dev": true, 2756 + "license": "MIT", 2757 + "dependencies": { 2758 + "@types/mdx": "^2.0.0" 2759 + }, 2760 + "funding": { 2761 + "type": "opencollective", 2762 + "url": "https://opencollective.com/unified" 2763 + }, 2764 + "peerDependencies": { 2765 + "@types/react": ">=16", 2766 + "react": ">=16" 2767 + } 2768 + }, 2250 2769 "node_modules/@mswjs/interceptors": { 2251 2770 "version": "0.41.3", 2252 2771 "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.3.tgz", ··· 2265 2784 "node": ">=18" 2266 2785 } 2267 2786 }, 2787 + "node_modules/@napi-rs/wasm-runtime": { 2788 + "version": "1.1.1", 2789 + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", 2790 + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", 2791 + "license": "MIT", 2792 + "optional": true, 2793 + "dependencies": { 2794 + "@emnapi/core": "^1.7.1", 2795 + "@emnapi/runtime": "^1.7.1", 2796 + "@tybys/wasm-util": "^0.10.1" 2797 + }, 2798 + "funding": { 2799 + "type": "github", 2800 + "url": "https://github.com/sponsors/Brooooooklyn" 2801 + } 2802 + }, 2803 + "node_modules/@neoconfetti/react": { 2804 + "version": "1.0.0", 2805 + "resolved": "https://registry.npmjs.org/@neoconfetti/react/-/react-1.0.0.tgz", 2806 + "integrity": "sha512-klcSooChXXOzIm+SE5IISIAn3bYzYfPjbX7D7HoqZL84oAfgREeSg5vSIaSFH+DaGzzvImTyWe1OyrJ67vik4A==", 2807 + "dev": true, 2808 + "license": "MIT" 2809 + }, 2268 2810 "node_modules/@nodelib/fs.scandir": { 2269 2811 "version": "2.1.5", 2270 2812 "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", ··· 2333 2875 "engines": { 2334 2876 "node": ">=8.0.0" 2335 2877 } 2878 + }, 2879 + "node_modules/@oxc-project/runtime": { 2880 + "version": "0.115.0", 2881 + "resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.115.0.tgz", 2882 + "integrity": "sha512-Rg8Wlt5dCbXhQnsXPrkOjL1DTSvXLgb2R/KYfnf1/K+R0k6UMLEmbQXPM+kwrWqSmWA2t0B1EtHy2/3zikQpvQ==", 2883 + "dev": true, 2884 + "license": "MIT", 2885 + "engines": { 2886 + "node": "^20.19.0 || >=22.12.0" 2887 + } 2888 + }, 2889 + "node_modules/@oxc-project/types": { 2890 + "version": "0.115.0", 2891 + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.115.0.tgz", 2892 + "integrity": "sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==", 2893 + "dev": true, 2894 + "license": "MIT", 2895 + "funding": { 2896 + "url": "https://github.com/sponsors/Boshen" 2897 + } 2898 + }, 2899 + "node_modules/@pandacss/is-valid-prop": { 2900 + "version": "1.9.0", 2901 + "resolved": "https://registry.npmjs.org/@pandacss/is-valid-prop/-/is-valid-prop-1.9.0.tgz", 2902 + "integrity": "sha512-AZvpXWGyjbHc8TC+YVloQ31Z2c4j2xMvYj6UfVxuZdB5w4c9+4N8wy5R7I/XswNh8e4cfUlkvsEGDXjhJRgypw==", 2903 + "license": "MIT" 2336 2904 }, 2337 2905 "node_modules/@parcel/watcher": { 2338 2906 "version": "2.4.1", ··· 2604 3172 "node": ">=14" 2605 3173 } 2606 3174 }, 3175 + "node_modules/@polka/url": { 3176 + "version": "1.0.0-next.29", 3177 + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", 3178 + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", 3179 + "dev": true, 3180 + "license": "MIT" 3181 + }, 2607 3182 "node_modules/@protobufjs/aspromise": { 2608 3183 "version": "1.1.2", 2609 3184 "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", ··· 2697 3272 "node": ">=14.0.0" 2698 3273 } 2699 3274 }, 3275 + "node_modules/@rolldown/binding-android-arm64": { 3276 + "version": "1.0.0-rc.9", 3277 + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.9.tgz", 3278 + "integrity": "sha512-lcJL0bN5hpgJfSIz/8PIf02irmyL43P+j1pTCfbD1DbLkmGRuFIA4DD3B3ZOvGqG0XiVvRznbKtN0COQVaKUTg==", 3279 + "cpu": [ 3280 + "arm64" 3281 + ], 3282 + "dev": true, 3283 + "license": "MIT", 3284 + "optional": true, 3285 + "os": [ 3286 + "android" 3287 + ], 3288 + "engines": { 3289 + "node": "^20.19.0 || >=22.12.0" 3290 + } 3291 + }, 3292 + "node_modules/@rolldown/binding-darwin-arm64": { 3293 + "version": "1.0.0-rc.9", 3294 + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.9.tgz", 3295 + "integrity": "sha512-J7Zk3kLYFsLtuH6U+F4pS2sYVzac0qkjcO5QxHS7OS7yZu2LRs+IXo+uvJ/mvpyUljDJ3LROZPoQfgBIpCMhdQ==", 3296 + "cpu": [ 3297 + "arm64" 3298 + ], 3299 + "dev": true, 3300 + "license": "MIT", 3301 + "optional": true, 3302 + "os": [ 3303 + "darwin" 3304 + ], 3305 + "engines": { 3306 + "node": "^20.19.0 || >=22.12.0" 3307 + } 3308 + }, 3309 + "node_modules/@rolldown/binding-darwin-x64": { 3310 + "version": "1.0.0-rc.9", 3311 + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.9.tgz", 3312 + "integrity": "sha512-iwtmmghy8nhfRGeNAIltcNXzD0QMNaaA5U/NyZc1Ia4bxrzFByNMDoppoC+hl7cDiUq5/1CnFthpT9n+UtfFyg==", 3313 + "cpu": [ 3314 + "x64" 3315 + ], 3316 + "dev": true, 3317 + "license": "MIT", 3318 + "optional": true, 3319 + "os": [ 3320 + "darwin" 3321 + ], 3322 + "engines": { 3323 + "node": "^20.19.0 || >=22.12.0" 3324 + } 3325 + }, 3326 + "node_modules/@rolldown/binding-freebsd-x64": { 3327 + "version": "1.0.0-rc.9", 3328 + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.9.tgz", 3329 + "integrity": "sha512-DLFYI78SCiZr5VvdEplsVC2Vx53lnA4/Ga5C65iyldMVaErr86aiqCoNBLl92PXPfDtUYjUh+xFFor40ueNs4Q==", 3330 + "cpu": [ 3331 + "x64" 3332 + ], 3333 + "dev": true, 3334 + "license": "MIT", 3335 + "optional": true, 3336 + "os": [ 3337 + "freebsd" 3338 + ], 3339 + "engines": { 3340 + "node": "^20.19.0 || >=22.12.0" 3341 + } 3342 + }, 3343 + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { 3344 + "version": "1.0.0-rc.9", 3345 + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.9.tgz", 3346 + "integrity": "sha512-CsjTmTwd0Hri6iTw/DRMK7kOZ7FwAkrO4h8YWKoX/kcj833e4coqo2wzIFywtch/8Eb5enQ/lwLM7w6JX1W5RQ==", 3347 + "cpu": [ 3348 + "arm" 3349 + ], 3350 + "dev": true, 3351 + "license": "MIT", 3352 + "optional": true, 3353 + "os": [ 3354 + "linux" 3355 + ], 3356 + "engines": { 3357 + "node": "^20.19.0 || >=22.12.0" 3358 + } 3359 + }, 3360 + "node_modules/@rolldown/binding-linux-arm64-gnu": { 3361 + "version": "1.0.0-rc.9", 3362 + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.9.tgz", 3363 + "integrity": "sha512-2x9O2JbSPxpxMDhP9Z74mahAStibTlrBMW0520+epJH5sac7/LwZW5Bmg/E6CXuEF53JJFW509uP+lSedaUNxg==", 3364 + "cpu": [ 3365 + "arm64" 3366 + ], 3367 + "dev": true, 3368 + "license": "MIT", 3369 + "optional": true, 3370 + "os": [ 3371 + "linux" 3372 + ], 3373 + "engines": { 3374 + "node": "^20.19.0 || >=22.12.0" 3375 + } 3376 + }, 3377 + "node_modules/@rolldown/binding-linux-arm64-musl": { 3378 + "version": "1.0.0-rc.9", 3379 + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.9.tgz", 3380 + "integrity": "sha512-JA1QRW31ogheAIRhIg9tjMfsYbglXXYGNPLdPEYrwFxdbkQCAzvpSCSHCDWNl4hTtrol8WeboCSEpjdZK8qrCg==", 3381 + "cpu": [ 3382 + "arm64" 3383 + ], 3384 + "dev": true, 3385 + "license": "MIT", 3386 + "optional": true, 3387 + "os": [ 3388 + "linux" 3389 + ], 3390 + "engines": { 3391 + "node": "^20.19.0 || >=22.12.0" 3392 + } 3393 + }, 3394 + "node_modules/@rolldown/binding-linux-ppc64-gnu": { 3395 + "version": "1.0.0-rc.9", 3396 + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.9.tgz", 3397 + "integrity": "sha512-aOKU9dJheda8Kj8Y3w9gnt9QFOO+qKPAl8SWd7JPHP+Cu0EuDAE5wokQubLzIDQWg2myXq2XhTpOVS07qqvT+w==", 3398 + "cpu": [ 3399 + "ppc64" 3400 + ], 3401 + "dev": true, 3402 + "license": "MIT", 3403 + "optional": true, 3404 + "os": [ 3405 + "linux" 3406 + ], 3407 + "engines": { 3408 + "node": "^20.19.0 || >=22.12.0" 3409 + } 3410 + }, 3411 + "node_modules/@rolldown/binding-linux-s390x-gnu": { 3412 + "version": "1.0.0-rc.9", 3413 + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.9.tgz", 3414 + "integrity": "sha512-OalO94fqj7IWRn3VdXWty75jC5dk4C197AWEuMhIpvVv2lw9fiPhud0+bW2ctCxb3YoBZor71QHbY+9/WToadA==", 3415 + "cpu": [ 3416 + "s390x" 3417 + ], 3418 + "dev": true, 3419 + "license": "MIT", 3420 + "optional": true, 3421 + "os": [ 3422 + "linux" 3423 + ], 3424 + "engines": { 3425 + "node": "^20.19.0 || >=22.12.0" 3426 + } 3427 + }, 3428 + "node_modules/@rolldown/binding-linux-x64-gnu": { 3429 + "version": "1.0.0-rc.9", 3430 + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.9.tgz", 3431 + "integrity": "sha512-cVEl1vZtBsBZna3YMjGXNvnYYrOJ7RzuWvZU0ffvJUexWkukMaDuGhUXn0rjnV0ptzGVkvc+vW9Yqy6h8YX4pg==", 3432 + "cpu": [ 3433 + "x64" 3434 + ], 3435 + "dev": true, 3436 + "license": "MIT", 3437 + "optional": true, 3438 + "os": [ 3439 + "linux" 3440 + ], 3441 + "engines": { 3442 + "node": "^20.19.0 || >=22.12.0" 3443 + } 3444 + }, 3445 + "node_modules/@rolldown/binding-linux-x64-musl": { 3446 + "version": "1.0.0-rc.9", 3447 + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.9.tgz", 3448 + "integrity": "sha512-UzYnKCIIc4heAKgI4PZ3dfBGUZefGCJ1TPDuLHoCzgrMYPb5Rv6TLFuYtyM4rWyHM7hymNdsg5ik2C+UD9VDbA==", 3449 + "cpu": [ 3450 + "x64" 3451 + ], 3452 + "dev": true, 3453 + "license": "MIT", 3454 + "optional": true, 3455 + "os": [ 3456 + "linux" 3457 + ], 3458 + "engines": { 3459 + "node": "^20.19.0 || >=22.12.0" 3460 + } 3461 + }, 3462 + "node_modules/@rolldown/binding-openharmony-arm64": { 3463 + "version": "1.0.0-rc.9", 3464 + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.9.tgz", 3465 + "integrity": "sha512-+6zoiF+RRyf5cdlFQP7nm58mq7+/2PFaY2DNQeD4B87N36JzfF/l9mdBkkmTvSYcYPE8tMh/o3cRlsx1ldLfog==", 3466 + "cpu": [ 3467 + "arm64" 3468 + ], 3469 + "dev": true, 3470 + "license": "MIT", 3471 + "optional": true, 3472 + "os": [ 3473 + "openharmony" 3474 + ], 3475 + "engines": { 3476 + "node": "^20.19.0 || >=22.12.0" 3477 + } 3478 + }, 3479 + "node_modules/@rolldown/binding-wasm32-wasi": { 3480 + "version": "1.0.0-rc.9", 3481 + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.9.tgz", 3482 + "integrity": "sha512-rgFN6sA/dyebil3YTlL2evvi/M+ivhfnyxec7AccTpRPccno/rPoNlqybEZQBkcbZu8Hy+eqNJCqfBR8P7Pg8g==", 3483 + "cpu": [ 3484 + "wasm32" 3485 + ], 3486 + "dev": true, 3487 + "license": "MIT", 3488 + "optional": true, 3489 + "dependencies": { 3490 + "@napi-rs/wasm-runtime": "^1.1.1" 3491 + }, 3492 + "engines": { 3493 + "node": ">=14.0.0" 3494 + } 3495 + }, 3496 + "node_modules/@rolldown/binding-win32-arm64-msvc": { 3497 + "version": "1.0.0-rc.9", 3498 + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.9.tgz", 3499 + "integrity": "sha512-lHVNUG/8nlF1IQk1C0Ci574qKYyty2goMiPlRqkC5R+3LkXDkL5Dhx8ytbxq35m+pkHVIvIxviD+TWLdfeuadA==", 3500 + "cpu": [ 3501 + "arm64" 3502 + ], 3503 + "dev": true, 3504 + "license": "MIT", 3505 + "optional": true, 3506 + "os": [ 3507 + "win32" 3508 + ], 3509 + "engines": { 3510 + "node": "^20.19.0 || >=22.12.0" 3511 + } 3512 + }, 3513 + "node_modules/@rolldown/binding-win32-x64-msvc": { 3514 + "version": "1.0.0-rc.9", 3515 + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.9.tgz", 3516 + "integrity": "sha512-G0oA4+w1iY5AGi5HcDTxWsoxF509hrFIPB2rduV5aDqS9FtDg1CAfa7V34qImbjfhIcA8C+RekocJZA96EarwQ==", 3517 + "cpu": [ 3518 + "x64" 3519 + ], 3520 + "dev": true, 3521 + "license": "MIT", 3522 + "optional": true, 3523 + "os": [ 3524 + "win32" 3525 + ], 3526 + "engines": { 3527 + "node": "^20.19.0 || >=22.12.0" 3528 + } 3529 + }, 3530 + "node_modules/@rolldown/pluginutils": { 3531 + "version": "1.0.0-rc.9", 3532 + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.9.tgz", 3533 + "integrity": "sha512-w6oiRWgEBl04QkFZgmW+jnU1EC9b57Oihi2ot3HNWIQRqgHp5PnYDia5iZ5FF7rpa4EQdiqMDXjlqKGXBhsoXw==", 3534 + "dev": true, 3535 + "license": "MIT" 3536 + }, 3537 + "node_modules/@rollup/pluginutils": { 3538 + "version": "5.3.0", 3539 + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", 3540 + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", 3541 + "dev": true, 3542 + "license": "MIT", 3543 + "dependencies": { 3544 + "@types/estree": "^1.0.0", 3545 + "estree-walker": "^2.0.2", 3546 + "picomatch": "^4.0.2" 3547 + }, 3548 + "engines": { 3549 + "node": ">=14.0.0" 3550 + }, 3551 + "peerDependencies": { 3552 + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" 3553 + }, 3554 + "peerDependenciesMeta": { 3555 + "rollup": { 3556 + "optional": true 3557 + } 3558 + } 3559 + }, 3560 + "node_modules/@rollup/pluginutils/node_modules/picomatch": { 3561 + "version": "4.0.3", 3562 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", 3563 + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", 3564 + "dev": true, 3565 + "license": "MIT", 3566 + "engines": { 3567 + "node": ">=12" 3568 + }, 3569 + "funding": { 3570 + "url": "https://github.com/sponsors/jonschlinkert" 3571 + } 3572 + }, 2700 3573 "node_modules/@rollup/rollup-android-arm-eabi": { 2701 3574 "version": "4.24.3", 2702 3575 "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.3.tgz", ··· 2953 3826 "dev": true, 2954 3827 "license": "MIT" 2955 3828 }, 3829 + "node_modules/@shikijs/core": { 3830 + "version": "4.0.2", 3831 + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.0.2.tgz", 3832 + "integrity": "sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw==", 3833 + "license": "MIT", 3834 + "dependencies": { 3835 + "@shikijs/primitive": "4.0.2", 3836 + "@shikijs/types": "4.0.2", 3837 + "@shikijs/vscode-textmate": "^10.0.2", 3838 + "@types/hast": "^3.0.4", 3839 + "hast-util-to-html": "^9.0.5" 3840 + }, 3841 + "engines": { 3842 + "node": ">=20" 3843 + } 3844 + }, 3845 + "node_modules/@shikijs/engine-javascript": { 3846 + "version": "4.0.2", 3847 + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.0.2.tgz", 3848 + "integrity": "sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag==", 3849 + "license": "MIT", 3850 + "dependencies": { 3851 + "@shikijs/types": "4.0.2", 3852 + "@shikijs/vscode-textmate": "^10.0.2", 3853 + "oniguruma-to-es": "^4.3.4" 3854 + }, 3855 + "engines": { 3856 + "node": ">=20" 3857 + } 3858 + }, 3859 + "node_modules/@shikijs/engine-oniguruma": { 3860 + "version": "4.0.2", 3861 + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.0.2.tgz", 3862 + "integrity": "sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg==", 3863 + "license": "MIT", 3864 + "dependencies": { 3865 + "@shikijs/types": "4.0.2", 3866 + "@shikijs/vscode-textmate": "^10.0.2" 3867 + }, 3868 + "engines": { 3869 + "node": ">=20" 3870 + } 3871 + }, 3872 + "node_modules/@shikijs/langs": { 3873 + "version": "4.0.2", 3874 + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.0.2.tgz", 3875 + "integrity": "sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg==", 3876 + "license": "MIT", 3877 + "dependencies": { 3878 + "@shikijs/types": "4.0.2" 3879 + }, 3880 + "engines": { 3881 + "node": ">=20" 3882 + } 3883 + }, 3884 + "node_modules/@shikijs/primitive": { 3885 + "version": "4.0.2", 3886 + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.0.2.tgz", 3887 + "integrity": "sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw==", 3888 + "license": "MIT", 3889 + "dependencies": { 3890 + "@shikijs/types": "4.0.2", 3891 + "@shikijs/vscode-textmate": "^10.0.2", 3892 + "@types/hast": "^3.0.4" 3893 + }, 3894 + "engines": { 3895 + "node": ">=20" 3896 + } 3897 + }, 3898 + "node_modules/@shikijs/themes": { 3899 + "version": "4.0.2", 3900 + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.0.2.tgz", 3901 + "integrity": "sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==", 3902 + "license": "MIT", 3903 + "dependencies": { 3904 + "@shikijs/types": "4.0.2" 3905 + }, 3906 + "engines": { 3907 + "node": ">=20" 3908 + } 3909 + }, 3910 + "node_modules/@shikijs/types": { 3911 + "version": "4.0.2", 3912 + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.0.2.tgz", 3913 + "integrity": "sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg==", 3914 + "license": "MIT", 3915 + "dependencies": { 3916 + "@shikijs/vscode-textmate": "^10.0.2", 3917 + "@types/hast": "^3.0.4" 3918 + }, 3919 + "engines": { 3920 + "node": ">=20" 3921 + } 3922 + }, 3923 + "node_modules/@shikijs/vscode-textmate": { 3924 + "version": "10.0.2", 3925 + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", 3926 + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", 3927 + "license": "MIT" 3928 + }, 2956 3929 "node_modules/@sinclair/typebox": { 2957 3930 "version": "0.34.41", 2958 3931 "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", ··· 3025 3998 } 3026 3999 }, 3027 4000 "node_modules/@standard-schema/spec": { 3028 - "version": "1.0.0", 3029 - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", 3030 - "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", 4001 + "version": "1.1.0", 4002 + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", 4003 + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", 3031 4004 "license": "MIT" 3032 4005 }, 3033 4006 "node_modules/@stdlib/error-tools-fmtprodmsg": { ··· 3212 4185 "url": "https://opencollective.com/stdlib" 3213 4186 } 3214 4187 }, 4188 + "node_modules/@storybook/addon-a11y": { 4189 + "version": "10.1.11", 4190 + "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-10.1.11.tgz", 4191 + "integrity": "sha512-3sr6HmcDgW1+TQAV9QtWBE3HlGyfFXVZY3RECTNLNH6fRC+rYQCItisvQIVxQpyftLSQ8EAMN9JQzs495MjWNg==", 4192 + "dev": true, 4193 + "license": "MIT", 4194 + "dependencies": { 4195 + "@storybook/global": "^5.0.0", 4196 + "axe-core": "^4.2.0" 4197 + }, 4198 + "funding": { 4199 + "type": "opencollective", 4200 + "url": "https://opencollective.com/storybook" 4201 + }, 4202 + "peerDependencies": { 4203 + "storybook": "^10.1.11" 4204 + } 4205 + }, 4206 + "node_modules/@storybook/addon-docs": { 4207 + "version": "10.1.11", 4208 + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-10.1.11.tgz", 4209 + "integrity": "sha512-Jwm291Fhim2eVcZIVlkG1B2skb0ZI9oru6nqMbJxceQZlvZmcIa4oxvS1oaMTKw2DJnCv97gLm57P/YvRZ8eUg==", 4210 + "dev": true, 4211 + "license": "MIT", 4212 + "dependencies": { 4213 + "@mdx-js/react": "^3.0.0", 4214 + "@storybook/csf-plugin": "10.1.11", 4215 + "@storybook/icons": "^2.0.0", 4216 + "@storybook/react-dom-shim": "10.1.11", 4217 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", 4218 + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", 4219 + "ts-dedent": "^2.0.0" 4220 + }, 4221 + "funding": { 4222 + "type": "opencollective", 4223 + "url": "https://opencollective.com/storybook" 4224 + }, 4225 + "peerDependencies": { 4226 + "storybook": "^10.1.11" 4227 + } 4228 + }, 4229 + "node_modules/@storybook/addon-onboarding": { 4230 + "version": "10.1.11", 4231 + "resolved": "https://registry.npmjs.org/@storybook/addon-onboarding/-/addon-onboarding-10.1.11.tgz", 4232 + "integrity": "sha512-DNJv0IDl5XBrY+PPgwnMXLyp3omPkMOS6xe8ejG3csT71B6+3VueL6m7Qivh6739SnAV0QBU5SQlpMA0gQUcSA==", 4233 + "dev": true, 4234 + "license": "MIT", 4235 + "funding": { 4236 + "type": "opencollective", 4237 + "url": "https://opencollective.com/storybook" 4238 + }, 4239 + "peerDependencies": { 4240 + "storybook": "^10.1.11" 4241 + } 4242 + }, 4243 + "node_modules/@storybook/addon-vitest": { 4244 + "version": "10.1.11", 4245 + "resolved": "https://registry.npmjs.org/@storybook/addon-vitest/-/addon-vitest-10.1.11.tgz", 4246 + "integrity": "sha512-YbZzeKO3v+Xr97/malT4DZIATkVZT5EHNYx3xzEfPVuk19dDETAVYXO+tzcqCQHsgdKQHkmd56vv8nN3J3/kvw==", 4247 + "dev": true, 4248 + "license": "MIT", 4249 + "dependencies": { 4250 + "@storybook/global": "^5.0.0", 4251 + "@storybook/icons": "^2.0.0" 4252 + }, 4253 + "funding": { 4254 + "type": "opencollective", 4255 + "url": "https://opencollective.com/storybook" 4256 + }, 4257 + "peerDependencies": { 4258 + "@vitest/browser": "^3.0.0 || ^4.0.0", 4259 + "@vitest/browser-playwright": "^4.0.0", 4260 + "@vitest/runner": "^3.0.0 || ^4.0.0", 4261 + "storybook": "^10.1.11", 4262 + "vitest": "^3.0.0 || ^4.0.0" 4263 + }, 4264 + "peerDependenciesMeta": { 4265 + "@vitest/browser": { 4266 + "optional": true 4267 + }, 4268 + "@vitest/browser-playwright": { 4269 + "optional": true 4270 + }, 4271 + "@vitest/runner": { 4272 + "optional": true 4273 + }, 4274 + "vitest": { 4275 + "optional": true 4276 + } 4277 + } 4278 + }, 4279 + "node_modules/@storybook/builder-vite": { 4280 + "version": "10.1.11", 4281 + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.1.11.tgz", 4282 + "integrity": "sha512-MMD09Ap7FyzDfWG961pkIMv/w684XXe1bBEi+wCEpHxvrgAd3j3A9w/Rqp9Am2uRDPCEdi1QgSzS3SGW3aGThQ==", 4283 + "dev": true, 4284 + "license": "MIT", 4285 + "dependencies": { 4286 + "@storybook/csf-plugin": "10.1.11", 4287 + "@vitest/mocker": "3.2.4", 4288 + "ts-dedent": "^2.0.0" 4289 + }, 4290 + "funding": { 4291 + "type": "opencollective", 4292 + "url": "https://opencollective.com/storybook" 4293 + }, 4294 + "peerDependencies": { 4295 + "storybook": "^10.1.11", 4296 + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" 4297 + } 4298 + }, 4299 + "node_modules/@storybook/csf-plugin": { 4300 + "version": "10.1.11", 4301 + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.1.11.tgz", 4302 + "integrity": "sha512-Ant0NhgqHKzQsseeVTSetZCuDHHs0W2HRkHt51Kg/sUl0T/sDtfVA+fWZT8nGzGZqYSFkxqYPWjauPmIhPtaRw==", 4303 + "dev": true, 4304 + "license": "MIT", 4305 + "dependencies": { 4306 + "unplugin": "^2.3.5" 4307 + }, 4308 + "funding": { 4309 + "type": "opencollective", 4310 + "url": "https://opencollective.com/storybook" 4311 + }, 4312 + "peerDependencies": { 4313 + "esbuild": "*", 4314 + "rollup": "*", 4315 + "storybook": "^10.1.11", 4316 + "vite": "*", 4317 + "webpack": "*" 4318 + }, 4319 + "peerDependenciesMeta": { 4320 + "esbuild": { 4321 + "optional": true 4322 + }, 4323 + "rollup": { 4324 + "optional": true 4325 + }, 4326 + "vite": { 4327 + "optional": true 4328 + }, 4329 + "webpack": { 4330 + "optional": true 4331 + } 4332 + } 4333 + }, 4334 + "node_modules/@storybook/global": { 4335 + "version": "5.0.0", 4336 + "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", 4337 + "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", 4338 + "dev": true, 4339 + "license": "MIT" 4340 + }, 4341 + "node_modules/@storybook/icons": { 4342 + "version": "2.0.1", 4343 + "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-2.0.1.tgz", 4344 + "integrity": "sha512-/smVjw88yK3CKsiuR71vNgWQ9+NuY2L+e8X7IMrFjexjm6ZR8ULrV2DRkTA61aV6ryefslzHEGDInGpnNeIocg==", 4345 + "dev": true, 4346 + "license": "MIT", 4347 + "peerDependencies": { 4348 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", 4349 + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" 4350 + } 4351 + }, 4352 + "node_modules/@storybook/react": { 4353 + "version": "10.1.11", 4354 + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.1.11.tgz", 4355 + "integrity": "sha512-rmMGmEwBaM2YpB8oDk2moM0MNjNMqtwyoPPZxjyruY9WVhYca8EDPGKEdRzUlb4qZJsTgLi7VU4eqg6LD/mL3Q==", 4356 + "dev": true, 4357 + "license": "MIT", 4358 + "dependencies": { 4359 + "@storybook/global": "^5.0.0", 4360 + "@storybook/react-dom-shim": "10.1.11", 4361 + "react-docgen": "^8.0.2" 4362 + }, 4363 + "funding": { 4364 + "type": "opencollective", 4365 + "url": "https://opencollective.com/storybook" 4366 + }, 4367 + "peerDependencies": { 4368 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", 4369 + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", 4370 + "storybook": "^10.1.11", 4371 + "typescript": ">= 4.9.x" 4372 + }, 4373 + "peerDependenciesMeta": { 4374 + "typescript": { 4375 + "optional": true 4376 + } 4377 + } 4378 + }, 4379 + "node_modules/@storybook/react-dom-shim": { 4380 + "version": "10.1.11", 4381 + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.1.11.tgz", 4382 + "integrity": "sha512-o8WPhRlZbORUWG9lAgDgJP0pi905VHJUFJr1Kp8980gHqtlemtnzjPxKy5vFwj6glNhAlK8SS8OOYzWP7hloTQ==", 4383 + "dev": true, 4384 + "license": "MIT", 4385 + "funding": { 4386 + "type": "opencollective", 4387 + "url": "https://opencollective.com/storybook" 4388 + }, 4389 + "peerDependencies": { 4390 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", 4391 + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", 4392 + "storybook": "^10.1.11" 4393 + } 4394 + }, 4395 + "node_modules/@storybook/react-vite": { 4396 + "version": "10.1.11", 4397 + "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-10.1.11.tgz", 4398 + "integrity": "sha512-qh1BCD25nIoiDfqwha+qBkl7pcG4WuzM+c8tsE63YEm8AFIbNKg5K8lVUoclF+4CpFz7IwBpWe61YUTDfp+91w==", 4399 + "dev": true, 4400 + "license": "MIT", 4401 + "dependencies": { 4402 + "@joshwooding/vite-plugin-react-docgen-typescript": "^0.6.3", 4403 + "@rollup/pluginutils": "^5.0.2", 4404 + "@storybook/builder-vite": "10.1.11", 4405 + "@storybook/react": "10.1.11", 4406 + "empathic": "^2.0.0", 4407 + "magic-string": "^0.30.0", 4408 + "react-docgen": "^8.0.0", 4409 + "resolve": "^1.22.8", 4410 + "tsconfig-paths": "^4.2.0" 4411 + }, 4412 + "funding": { 4413 + "type": "opencollective", 4414 + "url": "https://opencollective.com/storybook" 4415 + }, 4416 + "peerDependencies": { 4417 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", 4418 + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", 4419 + "storybook": "^10.1.11", 4420 + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" 4421 + } 4422 + }, 3215 4423 "node_modules/@supercharge/promise-pool": { 3216 4424 "version": "3.2.0", 3217 4425 "resolved": "https://registry.npmjs.org/@supercharge/promise-pool/-/promise-pool-3.2.0.tgz", ··· 3257 4465 "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 3258 4466 "license": "MIT" 3259 4467 }, 4468 + "node_modules/@swc/helpers": { 4469 + "version": "0.5.19", 4470 + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.19.tgz", 4471 + "integrity": "sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==", 4472 + "license": "Apache-2.0", 4473 + "dependencies": { 4474 + "tslib": "^2.8.0" 4475 + } 4476 + }, 3260 4477 "node_modules/@szmarczak/http-timer": { 3261 4478 "version": "4.0.6", 3262 4479 "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", ··· 3662 4879 "integrity": "sha512-RbwvSJQsuN9TB04AQbGULYfOGE/RnSFk/FLQ5b0NmDf5Kx2q/lABZbHQPKCO1vZ6Fiwkplu+yb9pGdLy1iGseQ==", 3663 4880 "dev": true 3664 4881 }, 4882 + "node_modules/@tybys/wasm-util": { 4883 + "version": "0.10.1", 4884 + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", 4885 + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", 4886 + "license": "MIT", 4887 + "optional": true, 4888 + "dependencies": { 4889 + "tslib": "^2.4.0" 4890 + } 4891 + }, 3665 4892 "node_modules/@types/aria-query": { 3666 4893 "version": "5.0.4", 3667 4894 "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", ··· 3701 4928 } 3702 4929 }, 3703 4930 "node_modules/@types/babel__traverse": { 3704 - "version": "7.20.6", 3705 - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", 3706 - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", 4931 + "version": "7.28.0", 4932 + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", 4933 + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", 3707 4934 "dev": true, 4935 + "license": "MIT", 3708 4936 "dependencies": { 3709 - "@babel/types": "^7.20.7" 4937 + "@babel/types": "^7.28.2" 3710 4938 } 3711 4939 }, 3712 4940 "node_modules/@types/body-parser": { ··· 3797 5025 "@types/ms": "*" 3798 5026 } 3799 5027 }, 5028 + "node_modules/@types/deep-eql": { 5029 + "version": "4.0.2", 5030 + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", 5031 + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", 5032 + "dev": true, 5033 + "license": "MIT" 5034 + }, 5035 + "node_modules/@types/doctrine": { 5036 + "version": "0.0.9", 5037 + "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz", 5038 + "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", 5039 + "dev": true, 5040 + "license": "MIT" 5041 + }, 3800 5042 "node_modules/@types/estree": { 3801 5043 "version": "1.0.6", 3802 5044 "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", ··· 3852 5094 "dependencies": { 3853 5095 "@types/jsonfile": "*", 3854 5096 "@types/node": "*" 5097 + } 5098 + }, 5099 + "node_modules/@types/hast": { 5100 + "version": "3.0.4", 5101 + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", 5102 + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", 5103 + "license": "MIT", 5104 + "dependencies": { 5105 + "@types/unist": "*" 3855 5106 } 3856 5107 }, 3857 5108 "node_modules/@types/hoist-non-react-statics": { ··· 3922 5173 "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", 3923 5174 "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" 3924 5175 }, 5176 + "node_modules/@types/mdast": { 5177 + "version": "4.0.4", 5178 + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", 5179 + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", 5180 + "license": "MIT", 5181 + "dependencies": { 5182 + "@types/unist": "*" 5183 + } 5184 + }, 5185 + "node_modules/@types/mdx": { 5186 + "version": "2.0.13", 5187 + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", 5188 + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", 5189 + "dev": true, 5190 + "license": "MIT" 5191 + }, 3925 5192 "node_modules/@types/methods": { 3926 5193 "version": "1.1.4", 3927 5194 "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", ··· 3946 5213 "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" 3947 5214 }, 3948 5215 "node_modules/@types/node": { 3949 - "version": "18.19.62", 3950 - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.62.tgz", 3951 - "integrity": "sha512-UOGhw+yZV/icyM0qohQVh3ktpY40Sp7tdTW7HxG3pTd7AiMrlFlAJNUrGK9t5mdW0+ViQcFV74zCSIx9ZJpncA==", 5216 + "version": "20.19.37", 5217 + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz", 5218 + "integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", 5219 + "license": "MIT", 3952 5220 "dependencies": { 3953 - "undici-types": "~5.26.4" 5221 + "undici-types": "~6.21.0" 3954 5222 } 3955 5223 }, 3956 5224 "node_modules/@types/object-hash": { ··· 3959 5227 "integrity": "sha512-fOBV8C1FIu2ELinoILQ+ApxcUKz4ngq+IWUYrxSGjXzzjUALijilampwkMgEtJ+h2njAW3pi853QpzNVCHB73w==", 3960 5228 "dev": true 3961 5229 }, 5230 + "node_modules/@types/parse-json": { 5231 + "version": "4.0.2", 5232 + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", 5233 + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", 5234 + "license": "MIT" 5235 + }, 3962 5236 "node_modules/@types/passport": { 3963 5237 "version": "1.0.17", 3964 5238 "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.17.tgz", ··· 4009 5283 "dependencies": { 4010 5284 "@types/react": "*" 4011 5285 } 5286 + }, 5287 + "node_modules/@types/resolve": { 5288 + "version": "1.20.6", 5289 + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", 5290 + "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==", 5291 + "dev": true, 5292 + "license": "MIT" 4012 5293 }, 4013 5294 "node_modules/@types/responselike": { 4014 5295 "version": "1.0.3", ··· 4106 5387 "@types/jest": "*" 4107 5388 } 4108 5389 }, 5390 + "node_modules/@types/unist": { 5391 + "version": "3.0.3", 5392 + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", 5393 + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", 5394 + "license": "MIT" 5395 + }, 4109 5396 "node_modules/@types/use-sync-external-store": { 4110 5397 "version": "0.0.3", 4111 5398 "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", ··· 4189 5476 } 4190 5477 } 4191 5478 }, 5479 + "node_modules/@typescript-eslint/project-service": { 5480 + "version": "8.57.1", 5481 + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.1.tgz", 5482 + "integrity": "sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==", 5483 + "dev": true, 5484 + "license": "MIT", 5485 + "dependencies": { 5486 + "@typescript-eslint/tsconfig-utils": "^8.57.1", 5487 + "@typescript-eslint/types": "^8.57.1", 5488 + "debug": "^4.4.3" 5489 + }, 5490 + "engines": { 5491 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 5492 + }, 5493 + "funding": { 5494 + "type": "opencollective", 5495 + "url": "https://opencollective.com/typescript-eslint" 5496 + }, 5497 + "peerDependencies": { 5498 + "typescript": ">=4.8.4 <6.0.0" 5499 + } 5500 + }, 5501 + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { 5502 + "version": "8.57.1", 5503 + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.1.tgz", 5504 + "integrity": "sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==", 5505 + "dev": true, 5506 + "license": "MIT", 5507 + "engines": { 5508 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 5509 + }, 5510 + "funding": { 5511 + "type": "opencollective", 5512 + "url": "https://opencollective.com/typescript-eslint" 5513 + } 5514 + }, 4192 5515 "node_modules/@typescript-eslint/scope-manager": { 4193 5516 "version": "7.18.0", 4194 5517 "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", ··· 4204 5527 "funding": { 4205 5528 "type": "opencollective", 4206 5529 "url": "https://opencollective.com/typescript-eslint" 5530 + } 5531 + }, 5532 + "node_modules/@typescript-eslint/tsconfig-utils": { 5533 + "version": "8.57.1", 5534 + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.1.tgz", 5535 + "integrity": "sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==", 5536 + "dev": true, 5537 + "license": "MIT", 5538 + "engines": { 5539 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 5540 + }, 5541 + "funding": { 5542 + "type": "opencollective", 5543 + "url": "https://opencollective.com/typescript-eslint" 5544 + }, 5545 + "peerDependencies": { 5546 + "typescript": ">=4.8.4 <6.0.0" 4207 5547 } 4208 5548 }, 4209 5549 "node_modules/@typescript-eslint/type-utils": { ··· 4352 5692 "node_modules/@ungap/structured-clone": { 4353 5693 "version": "1.2.0", 4354 5694 "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", 4355 - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", 4356 - "dev": true 5695 + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" 4357 5696 }, 4358 5697 "node_modules/@vitejs/plugin-react": { 4359 5698 "version": "4.3.3", ··· 4374 5713 "vite": "^4.2.0 || ^5.0.0" 4375 5714 } 4376 5715 }, 5716 + "node_modules/@vitest/browser": { 5717 + "version": "4.1.0", 5718 + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.1.0.tgz", 5719 + "integrity": "sha512-tG/iOrgbiHQks0ew7CdelUyNEHkv8NLrt+CqdTivIuoSnXvO7scWMn4Kqo78/UGY1NJ6Hv+vp8BvRnED/bjFdQ==", 5720 + "dev": true, 5721 + "license": "MIT", 5722 + "dependencies": { 5723 + "@blazediff/core": "1.9.1", 5724 + "@vitest/mocker": "4.1.0", 5725 + "@vitest/utils": "4.1.0", 5726 + "magic-string": "^0.30.21", 5727 + "pngjs": "^7.0.0", 5728 + "sirv": "^3.0.2", 5729 + "tinyrainbow": "^3.0.3", 5730 + "ws": "^8.19.0" 5731 + }, 5732 + "funding": { 5733 + "url": "https://opencollective.com/vitest" 5734 + }, 5735 + "peerDependencies": { 5736 + "vitest": "4.1.0" 5737 + } 5738 + }, 5739 + "node_modules/@vitest/browser-playwright": { 5740 + "version": "4.1.0", 5741 + "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.1.0.tgz", 5742 + "integrity": "sha512-2RU7pZELY9/aVMLmABNy1HeZ4FX23FXGY1jRuHLHgWa2zaAE49aNW2GLzebW+BmbTZIKKyFF1QXvk7DEWViUCQ==", 5743 + "dev": true, 5744 + "license": "MIT", 5745 + "dependencies": { 5746 + "@vitest/browser": "4.1.0", 5747 + "@vitest/mocker": "4.1.0", 5748 + "tinyrainbow": "^3.0.3" 5749 + }, 5750 + "funding": { 5751 + "url": "https://opencollective.com/vitest" 5752 + }, 5753 + "peerDependencies": { 5754 + "playwright": "*", 5755 + "vitest": "4.1.0" 5756 + }, 5757 + "peerDependenciesMeta": { 5758 + "playwright": { 5759 + "optional": false 5760 + } 5761 + } 5762 + }, 5763 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/aix-ppc64": { 5764 + "version": "0.27.4", 5765 + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", 5766 + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", 5767 + "cpu": [ 5768 + "ppc64" 5769 + ], 5770 + "dev": true, 5771 + "license": "MIT", 5772 + "optional": true, 5773 + "os": [ 5774 + "aix" 5775 + ], 5776 + "peer": true, 5777 + "engines": { 5778 + "node": ">=18" 5779 + } 5780 + }, 5781 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/android-arm": { 5782 + "version": "0.27.4", 5783 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", 5784 + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", 5785 + "cpu": [ 5786 + "arm" 5787 + ], 5788 + "dev": true, 5789 + "license": "MIT", 5790 + "optional": true, 5791 + "os": [ 5792 + "android" 5793 + ], 5794 + "peer": true, 5795 + "engines": { 5796 + "node": ">=18" 5797 + } 5798 + }, 5799 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/android-arm64": { 5800 + "version": "0.27.4", 5801 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", 5802 + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", 5803 + "cpu": [ 5804 + "arm64" 5805 + ], 5806 + "dev": true, 5807 + "license": "MIT", 5808 + "optional": true, 5809 + "os": [ 5810 + "android" 5811 + ], 5812 + "peer": true, 5813 + "engines": { 5814 + "node": ">=18" 5815 + } 5816 + }, 5817 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/android-x64": { 5818 + "version": "0.27.4", 5819 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", 5820 + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", 5821 + "cpu": [ 5822 + "x64" 5823 + ], 5824 + "dev": true, 5825 + "license": "MIT", 5826 + "optional": true, 5827 + "os": [ 5828 + "android" 5829 + ], 5830 + "peer": true, 5831 + "engines": { 5832 + "node": ">=18" 5833 + } 5834 + }, 5835 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/darwin-arm64": { 5836 + "version": "0.27.4", 5837 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", 5838 + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", 5839 + "cpu": [ 5840 + "arm64" 5841 + ], 5842 + "dev": true, 5843 + "license": "MIT", 5844 + "optional": true, 5845 + "os": [ 5846 + "darwin" 5847 + ], 5848 + "peer": true, 5849 + "engines": { 5850 + "node": ">=18" 5851 + } 5852 + }, 5853 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/darwin-x64": { 5854 + "version": "0.27.4", 5855 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", 5856 + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", 5857 + "cpu": [ 5858 + "x64" 5859 + ], 5860 + "dev": true, 5861 + "license": "MIT", 5862 + "optional": true, 5863 + "os": [ 5864 + "darwin" 5865 + ], 5866 + "peer": true, 5867 + "engines": { 5868 + "node": ">=18" 5869 + } 5870 + }, 5871 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/freebsd-arm64": { 5872 + "version": "0.27.4", 5873 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", 5874 + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", 5875 + "cpu": [ 5876 + "arm64" 5877 + ], 5878 + "dev": true, 5879 + "license": "MIT", 5880 + "optional": true, 5881 + "os": [ 5882 + "freebsd" 5883 + ], 5884 + "peer": true, 5885 + "engines": { 5886 + "node": ">=18" 5887 + } 5888 + }, 5889 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/freebsd-x64": { 5890 + "version": "0.27.4", 5891 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", 5892 + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", 5893 + "cpu": [ 5894 + "x64" 5895 + ], 5896 + "dev": true, 5897 + "license": "MIT", 5898 + "optional": true, 5899 + "os": [ 5900 + "freebsd" 5901 + ], 5902 + "peer": true, 5903 + "engines": { 5904 + "node": ">=18" 5905 + } 5906 + }, 5907 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-arm": { 5908 + "version": "0.27.4", 5909 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", 5910 + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", 5911 + "cpu": [ 5912 + "arm" 5913 + ], 5914 + "dev": true, 5915 + "license": "MIT", 5916 + "optional": true, 5917 + "os": [ 5918 + "linux" 5919 + ], 5920 + "peer": true, 5921 + "engines": { 5922 + "node": ">=18" 5923 + } 5924 + }, 5925 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-arm64": { 5926 + "version": "0.27.4", 5927 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", 5928 + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", 5929 + "cpu": [ 5930 + "arm64" 5931 + ], 5932 + "dev": true, 5933 + "license": "MIT", 5934 + "optional": true, 5935 + "os": [ 5936 + "linux" 5937 + ], 5938 + "peer": true, 5939 + "engines": { 5940 + "node": ">=18" 5941 + } 5942 + }, 5943 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-ia32": { 5944 + "version": "0.27.4", 5945 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", 5946 + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", 5947 + "cpu": [ 5948 + "ia32" 5949 + ], 5950 + "dev": true, 5951 + "license": "MIT", 5952 + "optional": true, 5953 + "os": [ 5954 + "linux" 5955 + ], 5956 + "peer": true, 5957 + "engines": { 5958 + "node": ">=18" 5959 + } 5960 + }, 5961 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-loong64": { 5962 + "version": "0.27.4", 5963 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", 5964 + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", 5965 + "cpu": [ 5966 + "loong64" 5967 + ], 5968 + "dev": true, 5969 + "license": "MIT", 5970 + "optional": true, 5971 + "os": [ 5972 + "linux" 5973 + ], 5974 + "peer": true, 5975 + "engines": { 5976 + "node": ">=18" 5977 + } 5978 + }, 5979 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-mips64el": { 5980 + "version": "0.27.4", 5981 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", 5982 + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", 5983 + "cpu": [ 5984 + "mips64el" 5985 + ], 5986 + "dev": true, 5987 + "license": "MIT", 5988 + "optional": true, 5989 + "os": [ 5990 + "linux" 5991 + ], 5992 + "peer": true, 5993 + "engines": { 5994 + "node": ">=18" 5995 + } 5996 + }, 5997 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-ppc64": { 5998 + "version": "0.27.4", 5999 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", 6000 + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", 6001 + "cpu": [ 6002 + "ppc64" 6003 + ], 6004 + "dev": true, 6005 + "license": "MIT", 6006 + "optional": true, 6007 + "os": [ 6008 + "linux" 6009 + ], 6010 + "peer": true, 6011 + "engines": { 6012 + "node": ">=18" 6013 + } 6014 + }, 6015 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-riscv64": { 6016 + "version": "0.27.4", 6017 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", 6018 + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", 6019 + "cpu": [ 6020 + "riscv64" 6021 + ], 6022 + "dev": true, 6023 + "license": "MIT", 6024 + "optional": true, 6025 + "os": [ 6026 + "linux" 6027 + ], 6028 + "peer": true, 6029 + "engines": { 6030 + "node": ">=18" 6031 + } 6032 + }, 6033 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-s390x": { 6034 + "version": "0.27.4", 6035 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", 6036 + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", 6037 + "cpu": [ 6038 + "s390x" 6039 + ], 6040 + "dev": true, 6041 + "license": "MIT", 6042 + "optional": true, 6043 + "os": [ 6044 + "linux" 6045 + ], 6046 + "peer": true, 6047 + "engines": { 6048 + "node": ">=18" 6049 + } 6050 + }, 6051 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-x64": { 6052 + "version": "0.27.4", 6053 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", 6054 + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", 6055 + "cpu": [ 6056 + "x64" 6057 + ], 6058 + "dev": true, 6059 + "license": "MIT", 6060 + "optional": true, 6061 + "os": [ 6062 + "linux" 6063 + ], 6064 + "peer": true, 6065 + "engines": { 6066 + "node": ">=18" 6067 + } 6068 + }, 6069 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/netbsd-x64": { 6070 + "version": "0.27.4", 6071 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", 6072 + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", 6073 + "cpu": [ 6074 + "x64" 6075 + ], 6076 + "dev": true, 6077 + "license": "MIT", 6078 + "optional": true, 6079 + "os": [ 6080 + "netbsd" 6081 + ], 6082 + "peer": true, 6083 + "engines": { 6084 + "node": ">=18" 6085 + } 6086 + }, 6087 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/openbsd-arm64": { 6088 + "version": "0.27.4", 6089 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", 6090 + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", 6091 + "cpu": [ 6092 + "arm64" 6093 + ], 6094 + "dev": true, 6095 + "license": "MIT", 6096 + "optional": true, 6097 + "os": [ 6098 + "openbsd" 6099 + ], 6100 + "peer": true, 6101 + "engines": { 6102 + "node": ">=18" 6103 + } 6104 + }, 6105 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/openbsd-x64": { 6106 + "version": "0.27.4", 6107 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", 6108 + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", 6109 + "cpu": [ 6110 + "x64" 6111 + ], 6112 + "dev": true, 6113 + "license": "MIT", 6114 + "optional": true, 6115 + "os": [ 6116 + "openbsd" 6117 + ], 6118 + "peer": true, 6119 + "engines": { 6120 + "node": ">=18" 6121 + } 6122 + }, 6123 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/sunos-x64": { 6124 + "version": "0.27.4", 6125 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", 6126 + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", 6127 + "cpu": [ 6128 + "x64" 6129 + ], 6130 + "dev": true, 6131 + "license": "MIT", 6132 + "optional": true, 6133 + "os": [ 6134 + "sunos" 6135 + ], 6136 + "peer": true, 6137 + "engines": { 6138 + "node": ">=18" 6139 + } 6140 + }, 6141 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/win32-arm64": { 6142 + "version": "0.27.4", 6143 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", 6144 + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", 6145 + "cpu": [ 6146 + "arm64" 6147 + ], 6148 + "dev": true, 6149 + "license": "MIT", 6150 + "optional": true, 6151 + "os": [ 6152 + "win32" 6153 + ], 6154 + "peer": true, 6155 + "engines": { 6156 + "node": ">=18" 6157 + } 6158 + }, 6159 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/win32-ia32": { 6160 + "version": "0.27.4", 6161 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", 6162 + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", 6163 + "cpu": [ 6164 + "ia32" 6165 + ], 6166 + "dev": true, 6167 + "license": "MIT", 6168 + "optional": true, 6169 + "os": [ 6170 + "win32" 6171 + ], 6172 + "peer": true, 6173 + "engines": { 6174 + "node": ">=18" 6175 + } 6176 + }, 6177 + "node_modules/@vitest/browser-playwright/node_modules/@esbuild/win32-x64": { 6178 + "version": "0.27.4", 6179 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", 6180 + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", 6181 + "cpu": [ 6182 + "x64" 6183 + ], 6184 + "dev": true, 6185 + "license": "MIT", 6186 + "optional": true, 6187 + "os": [ 6188 + "win32" 6189 + ], 6190 + "peer": true, 6191 + "engines": { 6192 + "node": ">=18" 6193 + } 6194 + }, 6195 + "node_modules/@vitest/browser-playwright/node_modules/@vitest/mocker": { 6196 + "version": "4.1.0", 6197 + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.0.tgz", 6198 + "integrity": "sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==", 6199 + "dev": true, 6200 + "license": "MIT", 6201 + "dependencies": { 6202 + "@vitest/spy": "4.1.0", 6203 + "estree-walker": "^3.0.3", 6204 + "magic-string": "^0.30.21" 6205 + }, 6206 + "funding": { 6207 + "url": "https://opencollective.com/vitest" 6208 + }, 6209 + "peerDependencies": { 6210 + "msw": "^2.4.9", 6211 + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" 6212 + }, 6213 + "peerDependenciesMeta": { 6214 + "msw": { 6215 + "optional": true 6216 + }, 6217 + "vite": { 6218 + "optional": true 6219 + } 6220 + } 6221 + }, 6222 + "node_modules/@vitest/browser-playwright/node_modules/@vitest/spy": { 6223 + "version": "4.1.0", 6224 + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.0.tgz", 6225 + "integrity": "sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==", 6226 + "dev": true, 6227 + "license": "MIT", 6228 + "funding": { 6229 + "url": "https://opencollective.com/vitest" 6230 + } 6231 + }, 6232 + "node_modules/@vitest/browser-playwright/node_modules/detect-libc": { 6233 + "version": "2.1.2", 6234 + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", 6235 + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", 6236 + "dev": true, 6237 + "license": "Apache-2.0", 6238 + "optional": true, 6239 + "peer": true, 6240 + "engines": { 6241 + "node": ">=8" 6242 + } 6243 + }, 6244 + "node_modules/@vitest/browser-playwright/node_modules/esbuild": { 6245 + "version": "0.27.4", 6246 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", 6247 + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", 6248 + "dev": true, 6249 + "hasInstallScript": true, 6250 + "license": "MIT", 6251 + "optional": true, 6252 + "peer": true, 6253 + "bin": { 6254 + "esbuild": "bin/esbuild" 6255 + }, 6256 + "engines": { 6257 + "node": ">=18" 6258 + }, 6259 + "optionalDependencies": { 6260 + "@esbuild/aix-ppc64": "0.27.4", 6261 + "@esbuild/android-arm": "0.27.4", 6262 + "@esbuild/android-arm64": "0.27.4", 6263 + "@esbuild/android-x64": "0.27.4", 6264 + "@esbuild/darwin-arm64": "0.27.4", 6265 + "@esbuild/darwin-x64": "0.27.4", 6266 + "@esbuild/freebsd-arm64": "0.27.4", 6267 + "@esbuild/freebsd-x64": "0.27.4", 6268 + "@esbuild/linux-arm": "0.27.4", 6269 + "@esbuild/linux-arm64": "0.27.4", 6270 + "@esbuild/linux-ia32": "0.27.4", 6271 + "@esbuild/linux-loong64": "0.27.4", 6272 + "@esbuild/linux-mips64el": "0.27.4", 6273 + "@esbuild/linux-ppc64": "0.27.4", 6274 + "@esbuild/linux-riscv64": "0.27.4", 6275 + "@esbuild/linux-s390x": "0.27.4", 6276 + "@esbuild/linux-x64": "0.27.4", 6277 + "@esbuild/netbsd-arm64": "0.27.4", 6278 + "@esbuild/netbsd-x64": "0.27.4", 6279 + "@esbuild/openbsd-arm64": "0.27.4", 6280 + "@esbuild/openbsd-x64": "0.27.4", 6281 + "@esbuild/openharmony-arm64": "0.27.4", 6282 + "@esbuild/sunos-x64": "0.27.4", 6283 + "@esbuild/win32-arm64": "0.27.4", 6284 + "@esbuild/win32-ia32": "0.27.4", 6285 + "@esbuild/win32-x64": "0.27.4" 6286 + } 6287 + }, 6288 + "node_modules/@vitest/browser-playwright/node_modules/estree-walker": { 6289 + "version": "3.0.3", 6290 + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", 6291 + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", 6292 + "dev": true, 6293 + "license": "MIT", 6294 + "dependencies": { 6295 + "@types/estree": "^1.0.0" 6296 + } 6297 + }, 6298 + "node_modules/@vitest/browser-playwright/node_modules/lightningcss": { 6299 + "version": "1.32.0", 6300 + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", 6301 + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", 6302 + "dev": true, 6303 + "license": "MPL-2.0", 6304 + "optional": true, 6305 + "peer": true, 6306 + "dependencies": { 6307 + "detect-libc": "^2.0.3" 6308 + }, 6309 + "engines": { 6310 + "node": ">= 12.0.0" 6311 + }, 6312 + "funding": { 6313 + "type": "opencollective", 6314 + "url": "https://opencollective.com/parcel" 6315 + }, 6316 + "optionalDependencies": { 6317 + "lightningcss-android-arm64": "1.32.0", 6318 + "lightningcss-darwin-arm64": "1.32.0", 6319 + "lightningcss-darwin-x64": "1.32.0", 6320 + "lightningcss-freebsd-x64": "1.32.0", 6321 + "lightningcss-linux-arm-gnueabihf": "1.32.0", 6322 + "lightningcss-linux-arm64-gnu": "1.32.0", 6323 + "lightningcss-linux-arm64-musl": "1.32.0", 6324 + "lightningcss-linux-x64-gnu": "1.32.0", 6325 + "lightningcss-linux-x64-musl": "1.32.0", 6326 + "lightningcss-win32-arm64-msvc": "1.32.0", 6327 + "lightningcss-win32-x64-msvc": "1.32.0" 6328 + } 6329 + }, 6330 + "node_modules/@vitest/browser-playwright/node_modules/lightningcss-android-arm64": { 6331 + "version": "1.32.0", 6332 + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", 6333 + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", 6334 + "cpu": [ 6335 + "arm64" 6336 + ], 6337 + "dev": true, 6338 + "license": "MPL-2.0", 6339 + "optional": true, 6340 + "os": [ 6341 + "android" 6342 + ], 6343 + "peer": true, 6344 + "engines": { 6345 + "node": ">= 12.0.0" 6346 + }, 6347 + "funding": { 6348 + "type": "opencollective", 6349 + "url": "https://opencollective.com/parcel" 6350 + } 6351 + }, 6352 + "node_modules/@vitest/browser-playwright/node_modules/lightningcss-darwin-arm64": { 6353 + "version": "1.32.0", 6354 + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", 6355 + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", 6356 + "cpu": [ 6357 + "arm64" 6358 + ], 6359 + "dev": true, 6360 + "license": "MPL-2.0", 6361 + "optional": true, 6362 + "os": [ 6363 + "darwin" 6364 + ], 6365 + "peer": true, 6366 + "engines": { 6367 + "node": ">= 12.0.0" 6368 + }, 6369 + "funding": { 6370 + "type": "opencollective", 6371 + "url": "https://opencollective.com/parcel" 6372 + } 6373 + }, 6374 + "node_modules/@vitest/browser-playwright/node_modules/lightningcss-darwin-x64": { 6375 + "version": "1.32.0", 6376 + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", 6377 + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", 6378 + "cpu": [ 6379 + "x64" 6380 + ], 6381 + "dev": true, 6382 + "license": "MPL-2.0", 6383 + "optional": true, 6384 + "os": [ 6385 + "darwin" 6386 + ], 6387 + "peer": true, 6388 + "engines": { 6389 + "node": ">= 12.0.0" 6390 + }, 6391 + "funding": { 6392 + "type": "opencollective", 6393 + "url": "https://opencollective.com/parcel" 6394 + } 6395 + }, 6396 + "node_modules/@vitest/browser-playwright/node_modules/lightningcss-freebsd-x64": { 6397 + "version": "1.32.0", 6398 + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", 6399 + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", 6400 + "cpu": [ 6401 + "x64" 6402 + ], 6403 + "dev": true, 6404 + "license": "MPL-2.0", 6405 + "optional": true, 6406 + "os": [ 6407 + "freebsd" 6408 + ], 6409 + "peer": true, 6410 + "engines": { 6411 + "node": ">= 12.0.0" 6412 + }, 6413 + "funding": { 6414 + "type": "opencollective", 6415 + "url": "https://opencollective.com/parcel" 6416 + } 6417 + }, 6418 + "node_modules/@vitest/browser-playwright/node_modules/lightningcss-linux-arm-gnueabihf": { 6419 + "version": "1.32.0", 6420 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", 6421 + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", 6422 + "cpu": [ 6423 + "arm" 6424 + ], 6425 + "dev": true, 6426 + "license": "MPL-2.0", 6427 + "optional": true, 6428 + "os": [ 6429 + "linux" 6430 + ], 6431 + "peer": true, 6432 + "engines": { 6433 + "node": ">= 12.0.0" 6434 + }, 6435 + "funding": { 6436 + "type": "opencollective", 6437 + "url": "https://opencollective.com/parcel" 6438 + } 6439 + }, 6440 + "node_modules/@vitest/browser-playwright/node_modules/lightningcss-linux-arm64-gnu": { 6441 + "version": "1.32.0", 6442 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", 6443 + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", 6444 + "cpu": [ 6445 + "arm64" 6446 + ], 6447 + "dev": true, 6448 + "license": "MPL-2.0", 6449 + "optional": true, 6450 + "os": [ 6451 + "linux" 6452 + ], 6453 + "peer": true, 6454 + "engines": { 6455 + "node": ">= 12.0.0" 6456 + }, 6457 + "funding": { 6458 + "type": "opencollective", 6459 + "url": "https://opencollective.com/parcel" 6460 + } 6461 + }, 6462 + "node_modules/@vitest/browser-playwright/node_modules/lightningcss-linux-arm64-musl": { 6463 + "version": "1.32.0", 6464 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", 6465 + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", 6466 + "cpu": [ 6467 + "arm64" 6468 + ], 6469 + "dev": true, 6470 + "license": "MPL-2.0", 6471 + "optional": true, 6472 + "os": [ 6473 + "linux" 6474 + ], 6475 + "peer": true, 6476 + "engines": { 6477 + "node": ">= 12.0.0" 6478 + }, 6479 + "funding": { 6480 + "type": "opencollective", 6481 + "url": "https://opencollective.com/parcel" 6482 + } 6483 + }, 6484 + "node_modules/@vitest/browser-playwright/node_modules/lightningcss-linux-x64-gnu": { 6485 + "version": "1.32.0", 6486 + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", 6487 + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", 6488 + "cpu": [ 6489 + "x64" 6490 + ], 6491 + "dev": true, 6492 + "license": "MPL-2.0", 6493 + "optional": true, 6494 + "os": [ 6495 + "linux" 6496 + ], 6497 + "peer": true, 6498 + "engines": { 6499 + "node": ">= 12.0.0" 6500 + }, 6501 + "funding": { 6502 + "type": "opencollective", 6503 + "url": "https://opencollective.com/parcel" 6504 + } 6505 + }, 6506 + "node_modules/@vitest/browser-playwright/node_modules/lightningcss-linux-x64-musl": { 6507 + "version": "1.32.0", 6508 + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", 6509 + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", 6510 + "cpu": [ 6511 + "x64" 6512 + ], 6513 + "dev": true, 6514 + "license": "MPL-2.0", 6515 + "optional": true, 6516 + "os": [ 6517 + "linux" 6518 + ], 6519 + "peer": true, 6520 + "engines": { 6521 + "node": ">= 12.0.0" 6522 + }, 6523 + "funding": { 6524 + "type": "opencollective", 6525 + "url": "https://opencollective.com/parcel" 6526 + } 6527 + }, 6528 + "node_modules/@vitest/browser-playwright/node_modules/lightningcss-win32-arm64-msvc": { 6529 + "version": "1.32.0", 6530 + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", 6531 + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", 6532 + "cpu": [ 6533 + "arm64" 6534 + ], 6535 + "dev": true, 6536 + "license": "MPL-2.0", 6537 + "optional": true, 6538 + "os": [ 6539 + "win32" 6540 + ], 6541 + "peer": true, 6542 + "engines": { 6543 + "node": ">= 12.0.0" 6544 + }, 6545 + "funding": { 6546 + "type": "opencollective", 6547 + "url": "https://opencollective.com/parcel" 6548 + } 6549 + }, 6550 + "node_modules/@vitest/browser-playwright/node_modules/lightningcss-win32-x64-msvc": { 6551 + "version": "1.32.0", 6552 + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", 6553 + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", 6554 + "cpu": [ 6555 + "x64" 6556 + ], 6557 + "dev": true, 6558 + "license": "MPL-2.0", 6559 + "optional": true, 6560 + "os": [ 6561 + "win32" 6562 + ], 6563 + "peer": true, 6564 + "engines": { 6565 + "node": ">= 12.0.0" 6566 + }, 6567 + "funding": { 6568 + "type": "opencollective", 6569 + "url": "https://opencollective.com/parcel" 6570 + } 6571 + }, 6572 + "node_modules/@vitest/browser-playwright/node_modules/picomatch": { 6573 + "version": "4.0.3", 6574 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", 6575 + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", 6576 + "dev": true, 6577 + "license": "MIT", 6578 + "optional": true, 6579 + "peer": true, 6580 + "engines": { 6581 + "node": ">=12" 6582 + }, 6583 + "funding": { 6584 + "url": "https://github.com/sponsors/jonschlinkert" 6585 + } 6586 + }, 6587 + "node_modules/@vitest/browser-playwright/node_modules/vite": { 6588 + "version": "8.0.0", 6589 + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.0.tgz", 6590 + "integrity": "sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==", 6591 + "dev": true, 6592 + "license": "MIT", 6593 + "optional": true, 6594 + "peer": true, 6595 + "dependencies": { 6596 + "@oxc-project/runtime": "0.115.0", 6597 + "lightningcss": "^1.32.0", 6598 + "picomatch": "^4.0.3", 6599 + "postcss": "^8.5.8", 6600 + "rolldown": "1.0.0-rc.9", 6601 + "tinyglobby": "^0.2.15" 6602 + }, 6603 + "bin": { 6604 + "vite": "bin/vite.js" 6605 + }, 6606 + "engines": { 6607 + "node": "^20.19.0 || >=22.12.0" 6608 + }, 6609 + "funding": { 6610 + "url": "https://github.com/vitejs/vite?sponsor=1" 6611 + }, 6612 + "optionalDependencies": { 6613 + "fsevents": "~2.3.3" 6614 + }, 6615 + "peerDependencies": { 6616 + "@types/node": "^20.19.0 || >=22.12.0", 6617 + "@vitejs/devtools": "^0.0.0-alpha.31", 6618 + "esbuild": "^0.27.0", 6619 + "jiti": ">=1.21.0", 6620 + "less": "^4.0.0", 6621 + "sass": "^1.70.0", 6622 + "sass-embedded": "^1.70.0", 6623 + "stylus": ">=0.54.8", 6624 + "sugarss": "^5.0.0", 6625 + "terser": "^5.16.0", 6626 + "tsx": "^4.8.1", 6627 + "yaml": "^2.4.2" 6628 + }, 6629 + "peerDependenciesMeta": { 6630 + "@types/node": { 6631 + "optional": true 6632 + }, 6633 + "@vitejs/devtools": { 6634 + "optional": true 6635 + }, 6636 + "esbuild": { 6637 + "optional": true 6638 + }, 6639 + "jiti": { 6640 + "optional": true 6641 + }, 6642 + "less": { 6643 + "optional": true 6644 + }, 6645 + "sass": { 6646 + "optional": true 6647 + }, 6648 + "sass-embedded": { 6649 + "optional": true 6650 + }, 6651 + "stylus": { 6652 + "optional": true 6653 + }, 6654 + "sugarss": { 6655 + "optional": true 6656 + }, 6657 + "terser": { 6658 + "optional": true 6659 + }, 6660 + "tsx": { 6661 + "optional": true 6662 + }, 6663 + "yaml": { 6664 + "optional": true 6665 + } 6666 + } 6667 + }, 6668 + "node_modules/@vitest/browser/node_modules/@esbuild/aix-ppc64": { 6669 + "version": "0.27.4", 6670 + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", 6671 + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", 6672 + "cpu": [ 6673 + "ppc64" 6674 + ], 6675 + "dev": true, 6676 + "license": "MIT", 6677 + "optional": true, 6678 + "os": [ 6679 + "aix" 6680 + ], 6681 + "peer": true, 6682 + "engines": { 6683 + "node": ">=18" 6684 + } 6685 + }, 6686 + "node_modules/@vitest/browser/node_modules/@esbuild/android-arm": { 6687 + "version": "0.27.4", 6688 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", 6689 + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", 6690 + "cpu": [ 6691 + "arm" 6692 + ], 6693 + "dev": true, 6694 + "license": "MIT", 6695 + "optional": true, 6696 + "os": [ 6697 + "android" 6698 + ], 6699 + "peer": true, 6700 + "engines": { 6701 + "node": ">=18" 6702 + } 6703 + }, 6704 + "node_modules/@vitest/browser/node_modules/@esbuild/android-arm64": { 6705 + "version": "0.27.4", 6706 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", 6707 + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", 6708 + "cpu": [ 6709 + "arm64" 6710 + ], 6711 + "dev": true, 6712 + "license": "MIT", 6713 + "optional": true, 6714 + "os": [ 6715 + "android" 6716 + ], 6717 + "peer": true, 6718 + "engines": { 6719 + "node": ">=18" 6720 + } 6721 + }, 6722 + "node_modules/@vitest/browser/node_modules/@esbuild/android-x64": { 6723 + "version": "0.27.4", 6724 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", 6725 + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", 6726 + "cpu": [ 6727 + "x64" 6728 + ], 6729 + "dev": true, 6730 + "license": "MIT", 6731 + "optional": true, 6732 + "os": [ 6733 + "android" 6734 + ], 6735 + "peer": true, 6736 + "engines": { 6737 + "node": ">=18" 6738 + } 6739 + }, 6740 + "node_modules/@vitest/browser/node_modules/@esbuild/darwin-arm64": { 6741 + "version": "0.27.4", 6742 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", 6743 + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", 6744 + "cpu": [ 6745 + "arm64" 6746 + ], 6747 + "dev": true, 6748 + "license": "MIT", 6749 + "optional": true, 6750 + "os": [ 6751 + "darwin" 6752 + ], 6753 + "peer": true, 6754 + "engines": { 6755 + "node": ">=18" 6756 + } 6757 + }, 6758 + "node_modules/@vitest/browser/node_modules/@esbuild/darwin-x64": { 6759 + "version": "0.27.4", 6760 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", 6761 + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", 6762 + "cpu": [ 6763 + "x64" 6764 + ], 6765 + "dev": true, 6766 + "license": "MIT", 6767 + "optional": true, 6768 + "os": [ 6769 + "darwin" 6770 + ], 6771 + "peer": true, 6772 + "engines": { 6773 + "node": ">=18" 6774 + } 6775 + }, 6776 + "node_modules/@vitest/browser/node_modules/@esbuild/freebsd-arm64": { 6777 + "version": "0.27.4", 6778 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", 6779 + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", 6780 + "cpu": [ 6781 + "arm64" 6782 + ], 6783 + "dev": true, 6784 + "license": "MIT", 6785 + "optional": true, 6786 + "os": [ 6787 + "freebsd" 6788 + ], 6789 + "peer": true, 6790 + "engines": { 6791 + "node": ">=18" 6792 + } 6793 + }, 6794 + "node_modules/@vitest/browser/node_modules/@esbuild/freebsd-x64": { 6795 + "version": "0.27.4", 6796 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", 6797 + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", 6798 + "cpu": [ 6799 + "x64" 6800 + ], 6801 + "dev": true, 6802 + "license": "MIT", 6803 + "optional": true, 6804 + "os": [ 6805 + "freebsd" 6806 + ], 6807 + "peer": true, 6808 + "engines": { 6809 + "node": ">=18" 6810 + } 6811 + }, 6812 + "node_modules/@vitest/browser/node_modules/@esbuild/linux-arm": { 6813 + "version": "0.27.4", 6814 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", 6815 + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", 6816 + "cpu": [ 6817 + "arm" 6818 + ], 6819 + "dev": true, 6820 + "license": "MIT", 6821 + "optional": true, 6822 + "os": [ 6823 + "linux" 6824 + ], 6825 + "peer": true, 6826 + "engines": { 6827 + "node": ">=18" 6828 + } 6829 + }, 6830 + "node_modules/@vitest/browser/node_modules/@esbuild/linux-arm64": { 6831 + "version": "0.27.4", 6832 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", 6833 + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", 6834 + "cpu": [ 6835 + "arm64" 6836 + ], 6837 + "dev": true, 6838 + "license": "MIT", 6839 + "optional": true, 6840 + "os": [ 6841 + "linux" 6842 + ], 6843 + "peer": true, 6844 + "engines": { 6845 + "node": ">=18" 6846 + } 6847 + }, 6848 + "node_modules/@vitest/browser/node_modules/@esbuild/linux-ia32": { 6849 + "version": "0.27.4", 6850 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", 6851 + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", 6852 + "cpu": [ 6853 + "ia32" 6854 + ], 6855 + "dev": true, 6856 + "license": "MIT", 6857 + "optional": true, 6858 + "os": [ 6859 + "linux" 6860 + ], 6861 + "peer": true, 6862 + "engines": { 6863 + "node": ">=18" 6864 + } 6865 + }, 6866 + "node_modules/@vitest/browser/node_modules/@esbuild/linux-loong64": { 6867 + "version": "0.27.4", 6868 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", 6869 + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", 6870 + "cpu": [ 6871 + "loong64" 6872 + ], 6873 + "dev": true, 6874 + "license": "MIT", 6875 + "optional": true, 6876 + "os": [ 6877 + "linux" 6878 + ], 6879 + "peer": true, 6880 + "engines": { 6881 + "node": ">=18" 6882 + } 6883 + }, 6884 + "node_modules/@vitest/browser/node_modules/@esbuild/linux-mips64el": { 6885 + "version": "0.27.4", 6886 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", 6887 + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", 6888 + "cpu": [ 6889 + "mips64el" 6890 + ], 6891 + "dev": true, 6892 + "license": "MIT", 6893 + "optional": true, 6894 + "os": [ 6895 + "linux" 6896 + ], 6897 + "peer": true, 6898 + "engines": { 6899 + "node": ">=18" 6900 + } 6901 + }, 6902 + "node_modules/@vitest/browser/node_modules/@esbuild/linux-ppc64": { 6903 + "version": "0.27.4", 6904 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", 6905 + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", 6906 + "cpu": [ 6907 + "ppc64" 6908 + ], 6909 + "dev": true, 6910 + "license": "MIT", 6911 + "optional": true, 6912 + "os": [ 6913 + "linux" 6914 + ], 6915 + "peer": true, 6916 + "engines": { 6917 + "node": ">=18" 6918 + } 6919 + }, 6920 + "node_modules/@vitest/browser/node_modules/@esbuild/linux-riscv64": { 6921 + "version": "0.27.4", 6922 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", 6923 + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", 6924 + "cpu": [ 6925 + "riscv64" 6926 + ], 6927 + "dev": true, 6928 + "license": "MIT", 6929 + "optional": true, 6930 + "os": [ 6931 + "linux" 6932 + ], 6933 + "peer": true, 6934 + "engines": { 6935 + "node": ">=18" 6936 + } 6937 + }, 6938 + "node_modules/@vitest/browser/node_modules/@esbuild/linux-s390x": { 6939 + "version": "0.27.4", 6940 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", 6941 + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", 6942 + "cpu": [ 6943 + "s390x" 6944 + ], 6945 + "dev": true, 6946 + "license": "MIT", 6947 + "optional": true, 6948 + "os": [ 6949 + "linux" 6950 + ], 6951 + "peer": true, 6952 + "engines": { 6953 + "node": ">=18" 6954 + } 6955 + }, 6956 + "node_modules/@vitest/browser/node_modules/@esbuild/linux-x64": { 6957 + "version": "0.27.4", 6958 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", 6959 + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", 6960 + "cpu": [ 6961 + "x64" 6962 + ], 6963 + "dev": true, 6964 + "license": "MIT", 6965 + "optional": true, 6966 + "os": [ 6967 + "linux" 6968 + ], 6969 + "peer": true, 6970 + "engines": { 6971 + "node": ">=18" 6972 + } 6973 + }, 6974 + "node_modules/@vitest/browser/node_modules/@esbuild/netbsd-x64": { 6975 + "version": "0.27.4", 6976 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", 6977 + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", 6978 + "cpu": [ 6979 + "x64" 6980 + ], 6981 + "dev": true, 6982 + "license": "MIT", 6983 + "optional": true, 6984 + "os": [ 6985 + "netbsd" 6986 + ], 6987 + "peer": true, 6988 + "engines": { 6989 + "node": ">=18" 6990 + } 6991 + }, 6992 + "node_modules/@vitest/browser/node_modules/@esbuild/openbsd-arm64": { 6993 + "version": "0.27.4", 6994 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", 6995 + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", 6996 + "cpu": [ 6997 + "arm64" 6998 + ], 6999 + "dev": true, 7000 + "license": "MIT", 7001 + "optional": true, 7002 + "os": [ 7003 + "openbsd" 7004 + ], 7005 + "peer": true, 7006 + "engines": { 7007 + "node": ">=18" 7008 + } 7009 + }, 7010 + "node_modules/@vitest/browser/node_modules/@esbuild/openbsd-x64": { 7011 + "version": "0.27.4", 7012 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", 7013 + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", 7014 + "cpu": [ 7015 + "x64" 7016 + ], 7017 + "dev": true, 7018 + "license": "MIT", 7019 + "optional": true, 7020 + "os": [ 7021 + "openbsd" 7022 + ], 7023 + "peer": true, 7024 + "engines": { 7025 + "node": ">=18" 7026 + } 7027 + }, 7028 + "node_modules/@vitest/browser/node_modules/@esbuild/sunos-x64": { 7029 + "version": "0.27.4", 7030 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", 7031 + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", 7032 + "cpu": [ 7033 + "x64" 7034 + ], 7035 + "dev": true, 7036 + "license": "MIT", 7037 + "optional": true, 7038 + "os": [ 7039 + "sunos" 7040 + ], 7041 + "peer": true, 7042 + "engines": { 7043 + "node": ">=18" 7044 + } 7045 + }, 7046 + "node_modules/@vitest/browser/node_modules/@esbuild/win32-arm64": { 7047 + "version": "0.27.4", 7048 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", 7049 + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", 7050 + "cpu": [ 7051 + "arm64" 7052 + ], 7053 + "dev": true, 7054 + "license": "MIT", 7055 + "optional": true, 7056 + "os": [ 7057 + "win32" 7058 + ], 7059 + "peer": true, 7060 + "engines": { 7061 + "node": ">=18" 7062 + } 7063 + }, 7064 + "node_modules/@vitest/browser/node_modules/@esbuild/win32-ia32": { 7065 + "version": "0.27.4", 7066 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", 7067 + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", 7068 + "cpu": [ 7069 + "ia32" 7070 + ], 7071 + "dev": true, 7072 + "license": "MIT", 7073 + "optional": true, 7074 + "os": [ 7075 + "win32" 7076 + ], 7077 + "peer": true, 7078 + "engines": { 7079 + "node": ">=18" 7080 + } 7081 + }, 7082 + "node_modules/@vitest/browser/node_modules/@esbuild/win32-x64": { 7083 + "version": "0.27.4", 7084 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", 7085 + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", 7086 + "cpu": [ 7087 + "x64" 7088 + ], 7089 + "dev": true, 7090 + "license": "MIT", 7091 + "optional": true, 7092 + "os": [ 7093 + "win32" 7094 + ], 7095 + "peer": true, 7096 + "engines": { 7097 + "node": ">=18" 7098 + } 7099 + }, 7100 + "node_modules/@vitest/browser/node_modules/@vitest/mocker": { 7101 + "version": "4.1.0", 7102 + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.0.tgz", 7103 + "integrity": "sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==", 7104 + "dev": true, 7105 + "license": "MIT", 7106 + "dependencies": { 7107 + "@vitest/spy": "4.1.0", 7108 + "estree-walker": "^3.0.3", 7109 + "magic-string": "^0.30.21" 7110 + }, 7111 + "funding": { 7112 + "url": "https://opencollective.com/vitest" 7113 + }, 7114 + "peerDependencies": { 7115 + "msw": "^2.4.9", 7116 + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" 7117 + }, 7118 + "peerDependenciesMeta": { 7119 + "msw": { 7120 + "optional": true 7121 + }, 7122 + "vite": { 7123 + "optional": true 7124 + } 7125 + } 7126 + }, 7127 + "node_modules/@vitest/browser/node_modules/@vitest/spy": { 7128 + "version": "4.1.0", 7129 + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.0.tgz", 7130 + "integrity": "sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==", 7131 + "dev": true, 7132 + "license": "MIT", 7133 + "funding": { 7134 + "url": "https://opencollective.com/vitest" 7135 + } 7136 + }, 7137 + "node_modules/@vitest/browser/node_modules/detect-libc": { 7138 + "version": "2.1.2", 7139 + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", 7140 + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", 7141 + "dev": true, 7142 + "license": "Apache-2.0", 7143 + "optional": true, 7144 + "peer": true, 7145 + "engines": { 7146 + "node": ">=8" 7147 + } 7148 + }, 7149 + "node_modules/@vitest/browser/node_modules/esbuild": { 7150 + "version": "0.27.4", 7151 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", 7152 + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", 7153 + "dev": true, 7154 + "hasInstallScript": true, 7155 + "license": "MIT", 7156 + "optional": true, 7157 + "peer": true, 7158 + "bin": { 7159 + "esbuild": "bin/esbuild" 7160 + }, 7161 + "engines": { 7162 + "node": ">=18" 7163 + }, 7164 + "optionalDependencies": { 7165 + "@esbuild/aix-ppc64": "0.27.4", 7166 + "@esbuild/android-arm": "0.27.4", 7167 + "@esbuild/android-arm64": "0.27.4", 7168 + "@esbuild/android-x64": "0.27.4", 7169 + "@esbuild/darwin-arm64": "0.27.4", 7170 + "@esbuild/darwin-x64": "0.27.4", 7171 + "@esbuild/freebsd-arm64": "0.27.4", 7172 + "@esbuild/freebsd-x64": "0.27.4", 7173 + "@esbuild/linux-arm": "0.27.4", 7174 + "@esbuild/linux-arm64": "0.27.4", 7175 + "@esbuild/linux-ia32": "0.27.4", 7176 + "@esbuild/linux-loong64": "0.27.4", 7177 + "@esbuild/linux-mips64el": "0.27.4", 7178 + "@esbuild/linux-ppc64": "0.27.4", 7179 + "@esbuild/linux-riscv64": "0.27.4", 7180 + "@esbuild/linux-s390x": "0.27.4", 7181 + "@esbuild/linux-x64": "0.27.4", 7182 + "@esbuild/netbsd-arm64": "0.27.4", 7183 + "@esbuild/netbsd-x64": "0.27.4", 7184 + "@esbuild/openbsd-arm64": "0.27.4", 7185 + "@esbuild/openbsd-x64": "0.27.4", 7186 + "@esbuild/openharmony-arm64": "0.27.4", 7187 + "@esbuild/sunos-x64": "0.27.4", 7188 + "@esbuild/win32-arm64": "0.27.4", 7189 + "@esbuild/win32-ia32": "0.27.4", 7190 + "@esbuild/win32-x64": "0.27.4" 7191 + } 7192 + }, 7193 + "node_modules/@vitest/browser/node_modules/estree-walker": { 7194 + "version": "3.0.3", 7195 + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", 7196 + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", 7197 + "dev": true, 7198 + "license": "MIT", 7199 + "dependencies": { 7200 + "@types/estree": "^1.0.0" 7201 + } 7202 + }, 7203 + "node_modules/@vitest/browser/node_modules/lightningcss": { 7204 + "version": "1.32.0", 7205 + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", 7206 + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", 7207 + "dev": true, 7208 + "license": "MPL-2.0", 7209 + "optional": true, 7210 + "peer": true, 7211 + "dependencies": { 7212 + "detect-libc": "^2.0.3" 7213 + }, 7214 + "engines": { 7215 + "node": ">= 12.0.0" 7216 + }, 7217 + "funding": { 7218 + "type": "opencollective", 7219 + "url": "https://opencollective.com/parcel" 7220 + }, 7221 + "optionalDependencies": { 7222 + "lightningcss-android-arm64": "1.32.0", 7223 + "lightningcss-darwin-arm64": "1.32.0", 7224 + "lightningcss-darwin-x64": "1.32.0", 7225 + "lightningcss-freebsd-x64": "1.32.0", 7226 + "lightningcss-linux-arm-gnueabihf": "1.32.0", 7227 + "lightningcss-linux-arm64-gnu": "1.32.0", 7228 + "lightningcss-linux-arm64-musl": "1.32.0", 7229 + "lightningcss-linux-x64-gnu": "1.32.0", 7230 + "lightningcss-linux-x64-musl": "1.32.0", 7231 + "lightningcss-win32-arm64-msvc": "1.32.0", 7232 + "lightningcss-win32-x64-msvc": "1.32.0" 7233 + } 7234 + }, 7235 + "node_modules/@vitest/browser/node_modules/lightningcss-android-arm64": { 7236 + "version": "1.32.0", 7237 + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", 7238 + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", 7239 + "cpu": [ 7240 + "arm64" 7241 + ], 7242 + "dev": true, 7243 + "license": "MPL-2.0", 7244 + "optional": true, 7245 + "os": [ 7246 + "android" 7247 + ], 7248 + "peer": true, 7249 + "engines": { 7250 + "node": ">= 12.0.0" 7251 + }, 7252 + "funding": { 7253 + "type": "opencollective", 7254 + "url": "https://opencollective.com/parcel" 7255 + } 7256 + }, 7257 + "node_modules/@vitest/browser/node_modules/lightningcss-darwin-arm64": { 7258 + "version": "1.32.0", 7259 + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", 7260 + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", 7261 + "cpu": [ 7262 + "arm64" 7263 + ], 7264 + "dev": true, 7265 + "license": "MPL-2.0", 7266 + "optional": true, 7267 + "os": [ 7268 + "darwin" 7269 + ], 7270 + "peer": true, 7271 + "engines": { 7272 + "node": ">= 12.0.0" 7273 + }, 7274 + "funding": { 7275 + "type": "opencollective", 7276 + "url": "https://opencollective.com/parcel" 7277 + } 7278 + }, 7279 + "node_modules/@vitest/browser/node_modules/lightningcss-darwin-x64": { 7280 + "version": "1.32.0", 7281 + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", 7282 + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", 7283 + "cpu": [ 7284 + "x64" 7285 + ], 7286 + "dev": true, 7287 + "license": "MPL-2.0", 7288 + "optional": true, 7289 + "os": [ 7290 + "darwin" 7291 + ], 7292 + "peer": true, 7293 + "engines": { 7294 + "node": ">= 12.0.0" 7295 + }, 7296 + "funding": { 7297 + "type": "opencollective", 7298 + "url": "https://opencollective.com/parcel" 7299 + } 7300 + }, 7301 + "node_modules/@vitest/browser/node_modules/lightningcss-freebsd-x64": { 7302 + "version": "1.32.0", 7303 + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", 7304 + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", 7305 + "cpu": [ 7306 + "x64" 7307 + ], 7308 + "dev": true, 7309 + "license": "MPL-2.0", 7310 + "optional": true, 7311 + "os": [ 7312 + "freebsd" 7313 + ], 7314 + "peer": true, 7315 + "engines": { 7316 + "node": ">= 12.0.0" 7317 + }, 7318 + "funding": { 7319 + "type": "opencollective", 7320 + "url": "https://opencollective.com/parcel" 7321 + } 7322 + }, 7323 + "node_modules/@vitest/browser/node_modules/lightningcss-linux-arm-gnueabihf": { 7324 + "version": "1.32.0", 7325 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", 7326 + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", 7327 + "cpu": [ 7328 + "arm" 7329 + ], 7330 + "dev": true, 7331 + "license": "MPL-2.0", 7332 + "optional": true, 7333 + "os": [ 7334 + "linux" 7335 + ], 7336 + "peer": true, 7337 + "engines": { 7338 + "node": ">= 12.0.0" 7339 + }, 7340 + "funding": { 7341 + "type": "opencollective", 7342 + "url": "https://opencollective.com/parcel" 7343 + } 7344 + }, 7345 + "node_modules/@vitest/browser/node_modules/lightningcss-linux-arm64-gnu": { 7346 + "version": "1.32.0", 7347 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", 7348 + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", 7349 + "cpu": [ 7350 + "arm64" 7351 + ], 7352 + "dev": true, 7353 + "license": "MPL-2.0", 7354 + "optional": true, 7355 + "os": [ 7356 + "linux" 7357 + ], 7358 + "peer": true, 7359 + "engines": { 7360 + "node": ">= 12.0.0" 7361 + }, 7362 + "funding": { 7363 + "type": "opencollective", 7364 + "url": "https://opencollective.com/parcel" 7365 + } 7366 + }, 7367 + "node_modules/@vitest/browser/node_modules/lightningcss-linux-arm64-musl": { 7368 + "version": "1.32.0", 7369 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", 7370 + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", 7371 + "cpu": [ 7372 + "arm64" 7373 + ], 7374 + "dev": true, 7375 + "license": "MPL-2.0", 7376 + "optional": true, 7377 + "os": [ 7378 + "linux" 7379 + ], 7380 + "peer": true, 7381 + "engines": { 7382 + "node": ">= 12.0.0" 7383 + }, 7384 + "funding": { 7385 + "type": "opencollective", 7386 + "url": "https://opencollective.com/parcel" 7387 + } 7388 + }, 7389 + "node_modules/@vitest/browser/node_modules/lightningcss-linux-x64-gnu": { 7390 + "version": "1.32.0", 7391 + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", 7392 + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", 7393 + "cpu": [ 7394 + "x64" 7395 + ], 7396 + "dev": true, 7397 + "license": "MPL-2.0", 7398 + "optional": true, 7399 + "os": [ 7400 + "linux" 7401 + ], 7402 + "peer": true, 7403 + "engines": { 7404 + "node": ">= 12.0.0" 7405 + }, 7406 + "funding": { 7407 + "type": "opencollective", 7408 + "url": "https://opencollective.com/parcel" 7409 + } 7410 + }, 7411 + "node_modules/@vitest/browser/node_modules/lightningcss-linux-x64-musl": { 7412 + "version": "1.32.0", 7413 + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", 7414 + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", 7415 + "cpu": [ 7416 + "x64" 7417 + ], 7418 + "dev": true, 7419 + "license": "MPL-2.0", 7420 + "optional": true, 7421 + "os": [ 7422 + "linux" 7423 + ], 7424 + "peer": true, 7425 + "engines": { 7426 + "node": ">= 12.0.0" 7427 + }, 7428 + "funding": { 7429 + "type": "opencollective", 7430 + "url": "https://opencollective.com/parcel" 7431 + } 7432 + }, 7433 + "node_modules/@vitest/browser/node_modules/lightningcss-win32-arm64-msvc": { 7434 + "version": "1.32.0", 7435 + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", 7436 + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", 7437 + "cpu": [ 7438 + "arm64" 7439 + ], 7440 + "dev": true, 7441 + "license": "MPL-2.0", 7442 + "optional": true, 7443 + "os": [ 7444 + "win32" 7445 + ], 7446 + "peer": true, 7447 + "engines": { 7448 + "node": ">= 12.0.0" 7449 + }, 7450 + "funding": { 7451 + "type": "opencollective", 7452 + "url": "https://opencollective.com/parcel" 7453 + } 7454 + }, 7455 + "node_modules/@vitest/browser/node_modules/lightningcss-win32-x64-msvc": { 7456 + "version": "1.32.0", 7457 + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", 7458 + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", 7459 + "cpu": [ 7460 + "x64" 7461 + ], 7462 + "dev": true, 7463 + "license": "MPL-2.0", 7464 + "optional": true, 7465 + "os": [ 7466 + "win32" 7467 + ], 7468 + "peer": true, 7469 + "engines": { 7470 + "node": ">= 12.0.0" 7471 + }, 7472 + "funding": { 7473 + "type": "opencollective", 7474 + "url": "https://opencollective.com/parcel" 7475 + } 7476 + }, 7477 + "node_modules/@vitest/browser/node_modules/picomatch": { 7478 + "version": "4.0.3", 7479 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", 7480 + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", 7481 + "dev": true, 7482 + "license": "MIT", 7483 + "optional": true, 7484 + "peer": true, 7485 + "engines": { 7486 + "node": ">=12" 7487 + }, 7488 + "funding": { 7489 + "url": "https://github.com/sponsors/jonschlinkert" 7490 + } 7491 + }, 7492 + "node_modules/@vitest/browser/node_modules/vite": { 7493 + "version": "8.0.0", 7494 + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.0.tgz", 7495 + "integrity": "sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==", 7496 + "dev": true, 7497 + "license": "MIT", 7498 + "optional": true, 7499 + "peer": true, 7500 + "dependencies": { 7501 + "@oxc-project/runtime": "0.115.0", 7502 + "lightningcss": "^1.32.0", 7503 + "picomatch": "^4.0.3", 7504 + "postcss": "^8.5.8", 7505 + "rolldown": "1.0.0-rc.9", 7506 + "tinyglobby": "^0.2.15" 7507 + }, 7508 + "bin": { 7509 + "vite": "bin/vite.js" 7510 + }, 7511 + "engines": { 7512 + "node": "^20.19.0 || >=22.12.0" 7513 + }, 7514 + "funding": { 7515 + "url": "https://github.com/vitejs/vite?sponsor=1" 7516 + }, 7517 + "optionalDependencies": { 7518 + "fsevents": "~2.3.3" 7519 + }, 7520 + "peerDependencies": { 7521 + "@types/node": "^20.19.0 || >=22.12.0", 7522 + "@vitejs/devtools": "^0.0.0-alpha.31", 7523 + "esbuild": "^0.27.0", 7524 + "jiti": ">=1.21.0", 7525 + "less": "^4.0.0", 7526 + "sass": "^1.70.0", 7527 + "sass-embedded": "^1.70.0", 7528 + "stylus": ">=0.54.8", 7529 + "sugarss": "^5.0.0", 7530 + "terser": "^5.16.0", 7531 + "tsx": "^4.8.1", 7532 + "yaml": "^2.4.2" 7533 + }, 7534 + "peerDependenciesMeta": { 7535 + "@types/node": { 7536 + "optional": true 7537 + }, 7538 + "@vitejs/devtools": { 7539 + "optional": true 7540 + }, 7541 + "esbuild": { 7542 + "optional": true 7543 + }, 7544 + "jiti": { 7545 + "optional": true 7546 + }, 7547 + "less": { 7548 + "optional": true 7549 + }, 7550 + "sass": { 7551 + "optional": true 7552 + }, 7553 + "sass-embedded": { 7554 + "optional": true 7555 + }, 7556 + "stylus": { 7557 + "optional": true 7558 + }, 7559 + "sugarss": { 7560 + "optional": true 7561 + }, 7562 + "terser": { 7563 + "optional": true 7564 + }, 7565 + "tsx": { 7566 + "optional": true 7567 + }, 7568 + "yaml": { 7569 + "optional": true 7570 + } 7571 + } 7572 + }, 7573 + "node_modules/@vitest/coverage-v8": { 7574 + "version": "4.1.0", 7575 + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.0.tgz", 7576 + "integrity": "sha512-nDWulKeik2bL2Va/Wl4x7DLuTKAXa906iRFooIRPR+huHkcvp9QDkPQ2RJdmjOFrqOqvNfoSQLF68deE3xC3CQ==", 7577 + "dev": true, 7578 + "license": "MIT", 7579 + "dependencies": { 7580 + "@bcoe/v8-coverage": "^1.0.2", 7581 + "@vitest/utils": "4.1.0", 7582 + "ast-v8-to-istanbul": "^1.0.0", 7583 + "istanbul-lib-coverage": "^3.2.2", 7584 + "istanbul-lib-report": "^3.0.1", 7585 + "istanbul-reports": "^3.2.0", 7586 + "magicast": "^0.5.2", 7587 + "obug": "^2.1.1", 7588 + "std-env": "^4.0.0-rc.1", 7589 + "tinyrainbow": "^3.0.3" 7590 + }, 7591 + "funding": { 7592 + "url": "https://opencollective.com/vitest" 7593 + }, 7594 + "peerDependencies": { 7595 + "@vitest/browser": "4.1.0", 7596 + "vitest": "4.1.0" 7597 + }, 7598 + "peerDependenciesMeta": { 7599 + "@vitest/browser": { 7600 + "optional": true 7601 + } 7602 + } 7603 + }, 7604 + "node_modules/@vitest/expect": { 7605 + "version": "3.2.4", 7606 + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", 7607 + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", 7608 + "dev": true, 7609 + "license": "MIT", 7610 + "dependencies": { 7611 + "@types/chai": "^5.2.2", 7612 + "@vitest/spy": "3.2.4", 7613 + "@vitest/utils": "3.2.4", 7614 + "chai": "^5.2.0", 7615 + "tinyrainbow": "^2.0.0" 7616 + }, 7617 + "funding": { 7618 + "url": "https://opencollective.com/vitest" 7619 + } 7620 + }, 7621 + "node_modules/@vitest/expect/node_modules/@types/chai": { 7622 + "version": "5.2.3", 7623 + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", 7624 + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", 7625 + "dev": true, 7626 + "license": "MIT", 7627 + "dependencies": { 7628 + "@types/deep-eql": "*", 7629 + "assertion-error": "^2.0.1" 7630 + } 7631 + }, 7632 + "node_modules/@vitest/expect/node_modules/@vitest/pretty-format": { 7633 + "version": "3.2.4", 7634 + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", 7635 + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", 7636 + "dev": true, 7637 + "license": "MIT", 7638 + "dependencies": { 7639 + "tinyrainbow": "^2.0.0" 7640 + }, 7641 + "funding": { 7642 + "url": "https://opencollective.com/vitest" 7643 + } 7644 + }, 7645 + "node_modules/@vitest/expect/node_modules/@vitest/utils": { 7646 + "version": "3.2.4", 7647 + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", 7648 + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", 7649 + "dev": true, 7650 + "license": "MIT", 7651 + "dependencies": { 7652 + "@vitest/pretty-format": "3.2.4", 7653 + "loupe": "^3.1.4", 7654 + "tinyrainbow": "^2.0.0" 7655 + }, 7656 + "funding": { 7657 + "url": "https://opencollective.com/vitest" 7658 + } 7659 + }, 7660 + "node_modules/@vitest/expect/node_modules/assertion-error": { 7661 + "version": "2.0.1", 7662 + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", 7663 + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", 7664 + "dev": true, 7665 + "license": "MIT", 7666 + "engines": { 7667 + "node": ">=12" 7668 + } 7669 + }, 7670 + "node_modules/@vitest/expect/node_modules/chai": { 7671 + "version": "5.3.3", 7672 + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", 7673 + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", 7674 + "dev": true, 7675 + "license": "MIT", 7676 + "dependencies": { 7677 + "assertion-error": "^2.0.1", 7678 + "check-error": "^2.1.1", 7679 + "deep-eql": "^5.0.1", 7680 + "loupe": "^3.1.0", 7681 + "pathval": "^2.0.0" 7682 + }, 7683 + "engines": { 7684 + "node": ">=18" 7685 + } 7686 + }, 7687 + "node_modules/@vitest/expect/node_modules/check-error": { 7688 + "version": "2.1.3", 7689 + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", 7690 + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", 7691 + "dev": true, 7692 + "license": "MIT", 7693 + "engines": { 7694 + "node": ">= 16" 7695 + } 7696 + }, 7697 + "node_modules/@vitest/expect/node_modules/deep-eql": { 7698 + "version": "5.0.2", 7699 + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", 7700 + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", 7701 + "dev": true, 7702 + "license": "MIT", 7703 + "engines": { 7704 + "node": ">=6" 7705 + } 7706 + }, 7707 + "node_modules/@vitest/expect/node_modules/loupe": { 7708 + "version": "3.2.1", 7709 + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", 7710 + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", 7711 + "dev": true, 7712 + "license": "MIT" 7713 + }, 7714 + "node_modules/@vitest/expect/node_modules/pathval": { 7715 + "version": "2.0.1", 7716 + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", 7717 + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", 7718 + "dev": true, 7719 + "license": "MIT", 7720 + "engines": { 7721 + "node": ">= 14.16" 7722 + } 7723 + }, 7724 + "node_modules/@vitest/expect/node_modules/tinyrainbow": { 7725 + "version": "2.0.0", 7726 + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", 7727 + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", 7728 + "dev": true, 7729 + "license": "MIT", 7730 + "engines": { 7731 + "node": ">=14.0.0" 7732 + } 7733 + }, 7734 + "node_modules/@vitest/mocker": { 7735 + "version": "3.2.4", 7736 + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", 7737 + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", 7738 + "dev": true, 7739 + "license": "MIT", 7740 + "dependencies": { 7741 + "@vitest/spy": "3.2.4", 7742 + "estree-walker": "^3.0.3", 7743 + "magic-string": "^0.30.17" 7744 + }, 7745 + "funding": { 7746 + "url": "https://opencollective.com/vitest" 7747 + }, 7748 + "peerDependencies": { 7749 + "msw": "^2.4.9", 7750 + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" 7751 + }, 7752 + "peerDependenciesMeta": { 7753 + "msw": { 7754 + "optional": true 7755 + }, 7756 + "vite": { 7757 + "optional": true 7758 + } 7759 + } 7760 + }, 7761 + "node_modules/@vitest/mocker/node_modules/estree-walker": { 7762 + "version": "3.0.3", 7763 + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", 7764 + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", 7765 + "dev": true, 7766 + "license": "MIT", 7767 + "dependencies": { 7768 + "@types/estree": "^1.0.0" 7769 + } 7770 + }, 7771 + "node_modules/@vitest/pretty-format": { 7772 + "version": "4.1.0", 7773 + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.0.tgz", 7774 + "integrity": "sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==", 7775 + "dev": true, 7776 + "license": "MIT", 7777 + "dependencies": { 7778 + "tinyrainbow": "^3.0.3" 7779 + }, 7780 + "funding": { 7781 + "url": "https://opencollective.com/vitest" 7782 + } 7783 + }, 7784 + "node_modules/@vitest/runner": { 7785 + "version": "4.1.0", 7786 + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.0.tgz", 7787 + "integrity": "sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==", 7788 + "dev": true, 7789 + "license": "MIT", 7790 + "dependencies": { 7791 + "@vitest/utils": "4.1.0", 7792 + "pathe": "^2.0.3" 7793 + }, 7794 + "funding": { 7795 + "url": "https://opencollective.com/vitest" 7796 + } 7797 + }, 7798 + "node_modules/@vitest/snapshot": { 7799 + "version": "4.1.0", 7800 + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.0.tgz", 7801 + "integrity": "sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==", 7802 + "dev": true, 7803 + "license": "MIT", 7804 + "dependencies": { 7805 + "@vitest/pretty-format": "4.1.0", 7806 + "@vitest/utils": "4.1.0", 7807 + "magic-string": "^0.30.21", 7808 + "pathe": "^2.0.3" 7809 + }, 7810 + "funding": { 7811 + "url": "https://opencollective.com/vitest" 7812 + } 7813 + }, 7814 + "node_modules/@vitest/spy": { 7815 + "version": "3.2.4", 7816 + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", 7817 + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", 7818 + "dev": true, 7819 + "license": "MIT", 7820 + "dependencies": { 7821 + "tinyspy": "^4.0.3" 7822 + }, 7823 + "funding": { 7824 + "url": "https://opencollective.com/vitest" 7825 + } 7826 + }, 7827 + "node_modules/@vitest/utils": { 7828 + "version": "4.1.0", 7829 + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.0.tgz", 7830 + "integrity": "sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==", 7831 + "dev": true, 7832 + "license": "MIT", 7833 + "dependencies": { 7834 + "@vitest/pretty-format": "4.1.0", 7835 + "convert-source-map": "^2.0.0", 7836 + "tinyrainbow": "^3.0.3" 7837 + }, 7838 + "funding": { 7839 + "url": "https://opencollective.com/vitest" 7840 + } 7841 + }, 4377 7842 "node_modules/@vladfrangu/async_event_emitter": { 4378 7843 "version": "2.4.7", 4379 7844 "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.7.tgz", ··· 4404 7869 "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", 4405 7870 "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" 4406 7871 }, 7872 + "node_modules/@zag-js/accordion": { 7873 + "version": "1.35.3", 7874 + "resolved": "https://registry.npmjs.org/@zag-js/accordion/-/accordion-1.35.3.tgz", 7875 + "integrity": "sha512-wmw6yo5Zr6ShiKGTc5ICEOJCurWAOSGubIpGISiHi3cZ4tlxKF/vpATIUT3eq8xzdB56YK57yKCujs/WmwqqoA==", 7876 + "license": "MIT", 7877 + "dependencies": { 7878 + "@zag-js/anatomy": "1.35.3", 7879 + "@zag-js/core": "1.35.3", 7880 + "@zag-js/dom-query": "1.35.3", 7881 + "@zag-js/types": "1.35.3", 7882 + "@zag-js/utils": "1.35.3" 7883 + } 7884 + }, 7885 + "node_modules/@zag-js/anatomy": { 7886 + "version": "1.35.3", 7887 + "resolved": "https://registry.npmjs.org/@zag-js/anatomy/-/anatomy-1.35.3.tgz", 7888 + "integrity": "sha512-oqU9iLNNylrtJMBX5Xu4DsxnPNvtZLiobryv2oNtsDI1mi1Fca/XHghQC9K5aYT0qNsmHj1M3W5WAWTaOtPLkQ==", 7889 + "license": "MIT" 7890 + }, 7891 + "node_modules/@zag-js/angle-slider": { 7892 + "version": "1.35.3", 7893 + "resolved": "https://registry.npmjs.org/@zag-js/angle-slider/-/angle-slider-1.35.3.tgz", 7894 + "integrity": "sha512-HXRlmsbNEJSBT53fq9XQKL/vwZWwJC3nprskI7s4f/jy8a4uXPTlv7N7zuBYjew+ScTMzZah6fLWzUztBehmSg==", 7895 + "license": "MIT", 7896 + "dependencies": { 7897 + "@zag-js/anatomy": "1.35.3", 7898 + "@zag-js/core": "1.35.3", 7899 + "@zag-js/dom-query": "1.35.3", 7900 + "@zag-js/rect-utils": "1.35.3", 7901 + "@zag-js/types": "1.35.3", 7902 + "@zag-js/utils": "1.35.3" 7903 + } 7904 + }, 7905 + "node_modules/@zag-js/aria-hidden": { 7906 + "version": "1.35.3", 7907 + "resolved": "https://registry.npmjs.org/@zag-js/aria-hidden/-/aria-hidden-1.35.3.tgz", 7908 + "integrity": "sha512-dk5POebn10WneQfLrEgbTzwolaXWpCSHL6F3jCTinW9IbOx7BXghzJD21iU5Iun+y9CorqJPW3p7LplYNUMO5Q==", 7909 + "license": "MIT", 7910 + "dependencies": { 7911 + "@zag-js/dom-query": "1.35.3" 7912 + } 7913 + }, 7914 + "node_modules/@zag-js/async-list": { 7915 + "version": "1.35.3", 7916 + "resolved": "https://registry.npmjs.org/@zag-js/async-list/-/async-list-1.35.3.tgz", 7917 + "integrity": "sha512-SXX3wGzLK/maKS1PJ3XfLIGWbu0022f/OhcFsT1PbiHnoFZTH7h2fBhirrCBfy2TYFQ6r5uxgjkhPUNkuaeYnA==", 7918 + "license": "MIT", 7919 + "dependencies": { 7920 + "@zag-js/core": "1.35.3", 7921 + "@zag-js/utils": "1.35.3" 7922 + } 7923 + }, 7924 + "node_modules/@zag-js/auto-resize": { 7925 + "version": "1.35.3", 7926 + "resolved": "https://registry.npmjs.org/@zag-js/auto-resize/-/auto-resize-1.35.3.tgz", 7927 + "integrity": "sha512-ufG8HSqzLd9h5rnos8aumj8iORlRskeR/gbpJu1NHrnHBWIrpuXm6KJJR2oZhTFY1BUMMk8eYIBA2QkVuiJzWA==", 7928 + "license": "MIT", 7929 + "dependencies": { 7930 + "@zag-js/dom-query": "1.35.3" 7931 + } 7932 + }, 7933 + "node_modules/@zag-js/avatar": { 7934 + "version": "1.35.3", 7935 + "resolved": "https://registry.npmjs.org/@zag-js/avatar/-/avatar-1.35.3.tgz", 7936 + "integrity": "sha512-lbQ2Q4Va8AAScKULOHw2tCQez+0JRYGHSMFq6i+dJmeT3dlSgRanm69ra6K2po6hM9E4v6pRe+xOVE+9QMDnuA==", 7937 + "license": "MIT", 7938 + "dependencies": { 7939 + "@zag-js/anatomy": "1.35.3", 7940 + "@zag-js/core": "1.35.3", 7941 + "@zag-js/dom-query": "1.35.3", 7942 + "@zag-js/types": "1.35.3", 7943 + "@zag-js/utils": "1.35.3" 7944 + } 7945 + }, 7946 + "node_modules/@zag-js/carousel": { 7947 + "version": "1.35.3", 7948 + "resolved": "https://registry.npmjs.org/@zag-js/carousel/-/carousel-1.35.3.tgz", 7949 + "integrity": "sha512-F+b8HzUeZfB+xUkAkLG4r0Ubui8pj7pSgZhi26ZiWgsM7tsd7cD+xRMXkvPEITN5Fd5QCe3KlVBuE00w5byjmg==", 7950 + "license": "MIT", 7951 + "dependencies": { 7952 + "@zag-js/anatomy": "1.35.3", 7953 + "@zag-js/core": "1.35.3", 7954 + "@zag-js/dom-query": "1.35.3", 7955 + "@zag-js/scroll-snap": "1.35.3", 7956 + "@zag-js/types": "1.35.3", 7957 + "@zag-js/utils": "1.35.3" 7958 + } 7959 + }, 7960 + "node_modules/@zag-js/cascade-select": { 7961 + "version": "1.35.3", 7962 + "resolved": "https://registry.npmjs.org/@zag-js/cascade-select/-/cascade-select-1.35.3.tgz", 7963 + "integrity": "sha512-Nifdx77hEuAdXqr1wpZSPjLXqygRhq/WvnPjGhCeSqFPpy62uT4JZ3avyjUZ4I0UhvIpkleUcXtFwQ3cSMh4ww==", 7964 + "license": "MIT", 7965 + "dependencies": { 7966 + "@zag-js/anatomy": "1.35.3", 7967 + "@zag-js/collection": "1.35.3", 7968 + "@zag-js/core": "1.35.3", 7969 + "@zag-js/dismissable": "1.35.3", 7970 + "@zag-js/dom-query": "1.35.3", 7971 + "@zag-js/focus-visible": "1.35.3", 7972 + "@zag-js/popper": "1.35.3", 7973 + "@zag-js/rect-utils": "1.35.3", 7974 + "@zag-js/types": "1.35.3", 7975 + "@zag-js/utils": "1.35.3" 7976 + } 7977 + }, 7978 + "node_modules/@zag-js/checkbox": { 7979 + "version": "1.35.3", 7980 + "resolved": "https://registry.npmjs.org/@zag-js/checkbox/-/checkbox-1.35.3.tgz", 7981 + "integrity": "sha512-8XBt/Wg2zSQWqV2ZFqZBQUjYRkOYHA2O3IEi0VVYtds3S1n7Pu/HqkZT5qDw+E/SY2+X9Uyx4hO7h2XrlsiZQQ==", 7982 + "license": "MIT", 7983 + "dependencies": { 7984 + "@zag-js/anatomy": "1.35.3", 7985 + "@zag-js/core": "1.35.3", 7986 + "@zag-js/dom-query": "1.35.3", 7987 + "@zag-js/focus-visible": "1.35.3", 7988 + "@zag-js/types": "1.35.3", 7989 + "@zag-js/utils": "1.35.3" 7990 + } 7991 + }, 7992 + "node_modules/@zag-js/clipboard": { 7993 + "version": "1.35.3", 7994 + "resolved": "https://registry.npmjs.org/@zag-js/clipboard/-/clipboard-1.35.3.tgz", 7995 + "integrity": "sha512-obTwynBpp6c17fLHe5tg//FQ497QsyCEry+K3bTdlrivWW200wvfHxZ6RKVbKwDAwhH+ye0bI1xkYAId8j7sdA==", 7996 + "license": "MIT", 7997 + "dependencies": { 7998 + "@zag-js/anatomy": "1.35.3", 7999 + "@zag-js/core": "1.35.3", 8000 + "@zag-js/dom-query": "1.35.3", 8001 + "@zag-js/types": "1.35.3", 8002 + "@zag-js/utils": "1.35.3" 8003 + } 8004 + }, 8005 + "node_modules/@zag-js/collapsible": { 8006 + "version": "1.35.3", 8007 + "resolved": "https://registry.npmjs.org/@zag-js/collapsible/-/collapsible-1.35.3.tgz", 8008 + "integrity": "sha512-IweG8JOBCerJwLO6QzTZGEMlsYUmQfQSeD0jniFguMM8vcunvGVSrM+AaL8pDbmXd+snXokaGyJpGO3vzMW6Fw==", 8009 + "license": "MIT", 8010 + "dependencies": { 8011 + "@zag-js/anatomy": "1.35.3", 8012 + "@zag-js/core": "1.35.3", 8013 + "@zag-js/dom-query": "1.35.3", 8014 + "@zag-js/types": "1.35.3", 8015 + "@zag-js/utils": "1.35.3" 8016 + } 8017 + }, 8018 + "node_modules/@zag-js/collection": { 8019 + "version": "1.35.3", 8020 + "resolved": "https://registry.npmjs.org/@zag-js/collection/-/collection-1.35.3.tgz", 8021 + "integrity": "sha512-BYoWJ4b7ma2PgiuQbRSnP603f2DlK6se5JtViUHTamZScLLLWnWHuQ6zFa1KS5kiIkbb7CFM6/bJ3WNYLch8Ig==", 8022 + "license": "MIT", 8023 + "dependencies": { 8024 + "@zag-js/utils": "1.35.3" 8025 + } 8026 + }, 8027 + "node_modules/@zag-js/color-picker": { 8028 + "version": "1.35.3", 8029 + "resolved": "https://registry.npmjs.org/@zag-js/color-picker/-/color-picker-1.35.3.tgz", 8030 + "integrity": "sha512-i9roSgtqeA1b4Q+jWqnxjXB//BQXMP5m1FQ4YcZVq/0yT14A53JIknchuqrh3wC3yPsJMXFqCoKg+NET2+OVig==", 8031 + "license": "MIT", 8032 + "dependencies": { 8033 + "@zag-js/anatomy": "1.35.3", 8034 + "@zag-js/color-utils": "1.35.3", 8035 + "@zag-js/core": "1.35.3", 8036 + "@zag-js/dismissable": "1.35.3", 8037 + "@zag-js/dom-query": "1.35.3", 8038 + "@zag-js/popper": "1.35.3", 8039 + "@zag-js/types": "1.35.3", 8040 + "@zag-js/utils": "1.35.3" 8041 + } 8042 + }, 8043 + "node_modules/@zag-js/color-utils": { 8044 + "version": "1.35.3", 8045 + "resolved": "https://registry.npmjs.org/@zag-js/color-utils/-/color-utils-1.35.3.tgz", 8046 + "integrity": "sha512-vxkEVgz4YdSbdaPvjiRI1VsJAdwzu/dUNvzqOaiVcPDrHr/FFgmUbv0SOFjnfSb2QWGI8EDEMn02RW9ym+BzGw==", 8047 + "license": "MIT", 8048 + "dependencies": { 8049 + "@zag-js/utils": "1.35.3" 8050 + } 8051 + }, 8052 + "node_modules/@zag-js/combobox": { 8053 + "version": "1.35.3", 8054 + "resolved": "https://registry.npmjs.org/@zag-js/combobox/-/combobox-1.35.3.tgz", 8055 + "integrity": "sha512-s1qmttTGJTMjlDakL+uvWSEggpafKr1vhOeZCh8j+N4eFt9bLAwaffjuh/1JzWBvzovw7WoMVkizdTXPlN8oYg==", 8056 + "license": "MIT", 8057 + "dependencies": { 8058 + "@zag-js/anatomy": "1.35.3", 8059 + "@zag-js/aria-hidden": "1.35.3", 8060 + "@zag-js/collection": "1.35.3", 8061 + "@zag-js/core": "1.35.3", 8062 + "@zag-js/dismissable": "1.35.3", 8063 + "@zag-js/dom-query": "1.35.3", 8064 + "@zag-js/focus-visible": "1.35.3", 8065 + "@zag-js/popper": "1.35.3", 8066 + "@zag-js/types": "1.35.3", 8067 + "@zag-js/utils": "1.35.3" 8068 + } 8069 + }, 8070 + "node_modules/@zag-js/core": { 8071 + "version": "1.35.3", 8072 + "resolved": "https://registry.npmjs.org/@zag-js/core/-/core-1.35.3.tgz", 8073 + "integrity": "sha512-fGAHyqOYSEFmo52t7wI4dvbFfLyJmUlyf7wknsiUlzUHlrn3yv5PAZYZ2TibpOD1hwXIp4AoCjbiIPPZBxirZw==", 8074 + "license": "MIT", 8075 + "dependencies": { 8076 + "@zag-js/dom-query": "1.35.3", 8077 + "@zag-js/utils": "1.35.3" 8078 + } 8079 + }, 8080 + "node_modules/@zag-js/date-picker": { 8081 + "version": "1.35.3", 8082 + "resolved": "https://registry.npmjs.org/@zag-js/date-picker/-/date-picker-1.35.3.tgz", 8083 + "integrity": "sha512-4G10h6pzzLbd84SE2CKtqi6Z9wEBhSyx4GRSxxy3tsf5wAxnz4anRFat9CGwn2YVUYcUJpD+umYgBMPt6zGDnA==", 8084 + "license": "MIT", 8085 + "dependencies": { 8086 + "@zag-js/anatomy": "1.35.3", 8087 + "@zag-js/core": "1.35.3", 8088 + "@zag-js/date-utils": "1.35.3", 8089 + "@zag-js/dismissable": "1.35.3", 8090 + "@zag-js/dom-query": "1.35.3", 8091 + "@zag-js/live-region": "1.35.3", 8092 + "@zag-js/popper": "1.35.3", 8093 + "@zag-js/types": "1.35.3", 8094 + "@zag-js/utils": "1.35.3" 8095 + }, 8096 + "peerDependencies": { 8097 + "@internationalized/date": ">=3.0.0" 8098 + } 8099 + }, 8100 + "node_modules/@zag-js/date-utils": { 8101 + "version": "1.35.3", 8102 + "resolved": "https://registry.npmjs.org/@zag-js/date-utils/-/date-utils-1.35.3.tgz", 8103 + "integrity": "sha512-1co0FPpZ6nO5dN8sZtECkMYaf+3E5zu0KSIJZpZiXb4TgsZMDyHu7K7IsiKFHk9qmhuF6AdPpNxBju91pSXMFg==", 8104 + "license": "MIT", 8105 + "peerDependencies": { 8106 + "@internationalized/date": ">=3.0.0" 8107 + } 8108 + }, 8109 + "node_modules/@zag-js/dialog": { 8110 + "version": "1.35.3", 8111 + "resolved": "https://registry.npmjs.org/@zag-js/dialog/-/dialog-1.35.3.tgz", 8112 + "integrity": "sha512-byosV+aBHH5LoFKnjEgC7WdqJid7bP9UhgWLSC7+IXbxrif9Czg1YVp6ZlQM6Nx6uD1vnty4touI3P7D7CTKcw==", 8113 + "license": "MIT", 8114 + "dependencies": { 8115 + "@zag-js/anatomy": "1.35.3", 8116 + "@zag-js/aria-hidden": "1.35.3", 8117 + "@zag-js/core": "1.35.3", 8118 + "@zag-js/dismissable": "1.35.3", 8119 + "@zag-js/dom-query": "1.35.3", 8120 + "@zag-js/focus-trap": "1.35.3", 8121 + "@zag-js/remove-scroll": "1.35.3", 8122 + "@zag-js/types": "1.35.3", 8123 + "@zag-js/utils": "1.35.3" 8124 + } 8125 + }, 8126 + "node_modules/@zag-js/dismissable": { 8127 + "version": "1.35.3", 8128 + "resolved": "https://registry.npmjs.org/@zag-js/dismissable/-/dismissable-1.35.3.tgz", 8129 + "integrity": "sha512-XPk+lqmsZp2Z1yMb5K1yj/e7Sobv4D7zK66B1GS97lk9Xzz8vuSgsimcLy0p7RXQl3KL6H5L69inSuQa2exybQ==", 8130 + "license": "MIT", 8131 + "dependencies": { 8132 + "@zag-js/dom-query": "1.35.3", 8133 + "@zag-js/interact-outside": "1.35.3", 8134 + "@zag-js/utils": "1.35.3" 8135 + } 8136 + }, 8137 + "node_modules/@zag-js/dom-query": { 8138 + "version": "1.35.3", 8139 + "resolved": "https://registry.npmjs.org/@zag-js/dom-query/-/dom-query-1.35.3.tgz", 8140 + "integrity": "sha512-1RbFZoT4CjlHN9TUNse1++ZVOyKo45ktucTIT349o6HMsoWWKmTJDPvFkMBbmu/qY6XXn4dT+LJEp4bL3DR+Qw==", 8141 + "license": "MIT", 8142 + "dependencies": { 8143 + "@zag-js/types": "1.35.3" 8144 + } 8145 + }, 8146 + "node_modules/@zag-js/drawer": { 8147 + "version": "1.35.3", 8148 + "resolved": "https://registry.npmjs.org/@zag-js/drawer/-/drawer-1.35.3.tgz", 8149 + "integrity": "sha512-DN5bwa7bDCDaUSbNzFxMc2U/WmbLcXvPSQjyOpKI6CC3VbW2kKaOnjJ5qQG+W5YBO0FpmJBtaxRV7lke4sZH2w==", 8150 + "license": "MIT", 8151 + "dependencies": { 8152 + "@zag-js/anatomy": "1.35.3", 8153 + "@zag-js/aria-hidden": "1.35.3", 8154 + "@zag-js/core": "1.35.3", 8155 + "@zag-js/dismissable": "1.35.3", 8156 + "@zag-js/dom-query": "1.35.3", 8157 + "@zag-js/focus-trap": "1.35.3", 8158 + "@zag-js/remove-scroll": "1.35.3", 8159 + "@zag-js/types": "1.35.3", 8160 + "@zag-js/utils": "1.35.3" 8161 + } 8162 + }, 8163 + "node_modules/@zag-js/editable": { 8164 + "version": "1.35.3", 8165 + "resolved": "https://registry.npmjs.org/@zag-js/editable/-/editable-1.35.3.tgz", 8166 + "integrity": "sha512-HcjeacS61vQXfNT9IalZj/+oS45yW5bIDO2NjJWV7zNe5AG29NCceUnvBhy+hrUKPnKcjfDocdW5rCL+Lvs/CQ==", 8167 + "license": "MIT", 8168 + "dependencies": { 8169 + "@zag-js/anatomy": "1.35.3", 8170 + "@zag-js/core": "1.35.3", 8171 + "@zag-js/dom-query": "1.35.3", 8172 + "@zag-js/interact-outside": "1.35.3", 8173 + "@zag-js/types": "1.35.3", 8174 + "@zag-js/utils": "1.35.3" 8175 + } 8176 + }, 8177 + "node_modules/@zag-js/file-upload": { 8178 + "version": "1.35.3", 8179 + "resolved": "https://registry.npmjs.org/@zag-js/file-upload/-/file-upload-1.35.3.tgz", 8180 + "integrity": "sha512-oIYwnDct4ERo2mfmcxsBIJnlmpzjrzYx82SQsXWD3NGKx3cgdh2lwBX+ebItaLH1jkgzBa3z0TWxc6rfvcUXbw==", 8181 + "license": "MIT", 8182 + "dependencies": { 8183 + "@zag-js/anatomy": "1.35.3", 8184 + "@zag-js/core": "1.35.3", 8185 + "@zag-js/dom-query": "1.35.3", 8186 + "@zag-js/file-utils": "1.35.3", 8187 + "@zag-js/i18n-utils": "1.35.3", 8188 + "@zag-js/types": "1.35.3", 8189 + "@zag-js/utils": "1.35.3" 8190 + } 8191 + }, 8192 + "node_modules/@zag-js/file-utils": { 8193 + "version": "1.35.3", 8194 + "resolved": "https://registry.npmjs.org/@zag-js/file-utils/-/file-utils-1.35.3.tgz", 8195 + "integrity": "sha512-Tb05RCzx4swc156hd4jLiO7z+Gxg/HQ+JCds03jgTbrFJAz2D56YaMeI7gSDc1m4Xre3nyqQpSo9AeX5nzbE/w==", 8196 + "license": "MIT", 8197 + "dependencies": { 8198 + "@zag-js/i18n-utils": "1.35.3" 8199 + } 8200 + }, 8201 + "node_modules/@zag-js/floating-panel": { 8202 + "version": "1.35.3", 8203 + "resolved": "https://registry.npmjs.org/@zag-js/floating-panel/-/floating-panel-1.35.3.tgz", 8204 + "integrity": "sha512-nTZypcS0X46Oo1kpCQTnP5UlzjhypOAj3B4dq2z/3bAOC0TntYTnFkj8PbEJtExk7364xfMyxfgZOiv7Aqq01w==", 8205 + "license": "MIT", 8206 + "dependencies": { 8207 + "@zag-js/anatomy": "1.35.3", 8208 + "@zag-js/core": "1.35.3", 8209 + "@zag-js/dom-query": "1.35.3", 8210 + "@zag-js/popper": "1.35.3", 8211 + "@zag-js/rect-utils": "1.35.3", 8212 + "@zag-js/store": "1.35.3", 8213 + "@zag-js/types": "1.35.3", 8214 + "@zag-js/utils": "1.35.3" 8215 + } 8216 + }, 8217 + "node_modules/@zag-js/focus-trap": { 8218 + "version": "1.35.3", 8219 + "resolved": "https://registry.npmjs.org/@zag-js/focus-trap/-/focus-trap-1.35.3.tgz", 8220 + "integrity": "sha512-evErLlGFdDVCI8xipNS5k0rAvO+KFRA9g273bbfWAL1+mT54mcB/XHa85nC3QpPgMNrSh+6LUNq9fapyOGoyYg==", 8221 + "license": "MIT", 8222 + "dependencies": { 8223 + "@zag-js/dom-query": "1.35.3" 8224 + } 8225 + }, 8226 + "node_modules/@zag-js/focus-visible": { 8227 + "version": "1.35.3", 8228 + "resolved": "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-1.35.3.tgz", 8229 + "integrity": "sha512-g4F8PRGIoFoKBrHiQ1HQh5AjCS7brFRXHvpbDNb9+T11FGlF5Turb+6OVRoNV8MmiuqMltO2I28l36YsGc//uQ==", 8230 + "license": "MIT", 8231 + "dependencies": { 8232 + "@zag-js/dom-query": "1.35.3" 8233 + } 8234 + }, 8235 + "node_modules/@zag-js/highlight-word": { 8236 + "version": "1.35.3", 8237 + "resolved": "https://registry.npmjs.org/@zag-js/highlight-word/-/highlight-word-1.35.3.tgz", 8238 + "integrity": "sha512-K+mvEBbf3SUFjQeMeJQYb3cjri3x6sPaPhcKWayalelSLB/StWEGqcpmz+a6uUYrCUAK5kEi3Hn0YLGfn0GOig==", 8239 + "license": "MIT" 8240 + }, 8241 + "node_modules/@zag-js/hover-card": { 8242 + "version": "1.35.3", 8243 + "resolved": "https://registry.npmjs.org/@zag-js/hover-card/-/hover-card-1.35.3.tgz", 8244 + "integrity": "sha512-xVoKOtvrnzhYzciZ1csgiV76IQ4DRtx1lsJeFSrfg5MH0kYWeC/pcmm3yCd2+Qh/45J7DbSXeZneqxpyiF5Vvw==", 8245 + "license": "MIT", 8246 + "dependencies": { 8247 + "@zag-js/anatomy": "1.35.3", 8248 + "@zag-js/core": "1.35.3", 8249 + "@zag-js/dismissable": "1.35.3", 8250 + "@zag-js/dom-query": "1.35.3", 8251 + "@zag-js/popper": "1.35.3", 8252 + "@zag-js/types": "1.35.3", 8253 + "@zag-js/utils": "1.35.3" 8254 + } 8255 + }, 8256 + "node_modules/@zag-js/i18n-utils": { 8257 + "version": "1.35.3", 8258 + "resolved": "https://registry.npmjs.org/@zag-js/i18n-utils/-/i18n-utils-1.35.3.tgz", 8259 + "integrity": "sha512-k7UcNxbnC2jvGwCoHYAkFD3ZaRSMQNVHfuy8TujZQ+ci3IJovwgWLveZoRfFbXHkTLfhmbpE2tFXBdpwOVZutg==", 8260 + "license": "MIT", 8261 + "dependencies": { 8262 + "@zag-js/dom-query": "1.35.3" 8263 + } 8264 + }, 8265 + "node_modules/@zag-js/image-cropper": { 8266 + "version": "1.35.3", 8267 + "resolved": "https://registry.npmjs.org/@zag-js/image-cropper/-/image-cropper-1.35.3.tgz", 8268 + "integrity": "sha512-1PH6bg8JAQESHzNqjka2TJ0QGNBGBAO6rb7AZ+9CaCCLw0pIzbUJhqPMkwd9GhdWGKGP+e7wFitnjcT4W5Js8g==", 8269 + "license": "MIT", 8270 + "dependencies": { 8271 + "@zag-js/anatomy": "1.35.3", 8272 + "@zag-js/core": "1.35.3", 8273 + "@zag-js/dom-query": "1.35.3", 8274 + "@zag-js/types": "1.35.3", 8275 + "@zag-js/utils": "1.35.3" 8276 + } 8277 + }, 8278 + "node_modules/@zag-js/interact-outside": { 8279 + "version": "1.35.3", 8280 + "resolved": "https://registry.npmjs.org/@zag-js/interact-outside/-/interact-outside-1.35.3.tgz", 8281 + "integrity": "sha512-tOcuo/IztzpU7UKXtjVrLZtXzzcbhP4n2WynKwDRkTkq3mRCp61xXJp1csIBycI3JHm/CMeAEcPdRIioxIT/Zw==", 8282 + "license": "MIT", 8283 + "dependencies": { 8284 + "@zag-js/dom-query": "1.35.3", 8285 + "@zag-js/utils": "1.35.3" 8286 + } 8287 + }, 8288 + "node_modules/@zag-js/json-tree-utils": { 8289 + "version": "1.35.3", 8290 + "resolved": "https://registry.npmjs.org/@zag-js/json-tree-utils/-/json-tree-utils-1.35.3.tgz", 8291 + "integrity": "sha512-nOv2dPJf+1mxsobYiSlYt96hR1MK7iHKG1iDLoO5wLggS6GQA3ix1BerHJK0zdehoEZ71R45el5ghCG1HB9VzQ==", 8292 + "license": "MIT" 8293 + }, 8294 + "node_modules/@zag-js/listbox": { 8295 + "version": "1.35.3", 8296 + "resolved": "https://registry.npmjs.org/@zag-js/listbox/-/listbox-1.35.3.tgz", 8297 + "integrity": "sha512-FE6FOuBr6aWtOb8U8oDvAvcUzD6JKLXAe8WngiLFG+b2yyW4nlaz2AcKRG1bjjB066UMxMo9/+2p4D0Kf5Id1Q==", 8298 + "license": "MIT", 8299 + "dependencies": { 8300 + "@zag-js/anatomy": "1.35.3", 8301 + "@zag-js/collection": "1.35.3", 8302 + "@zag-js/core": "1.35.3", 8303 + "@zag-js/dom-query": "1.35.3", 8304 + "@zag-js/focus-visible": "1.35.3", 8305 + "@zag-js/types": "1.35.3", 8306 + "@zag-js/utils": "1.35.3" 8307 + } 8308 + }, 8309 + "node_modules/@zag-js/live-region": { 8310 + "version": "1.35.3", 8311 + "resolved": "https://registry.npmjs.org/@zag-js/live-region/-/live-region-1.35.3.tgz", 8312 + "integrity": "sha512-64rWcfggYpyr2Fn4pdrB/lljMgm3quwn9is+vdDN85Vv3WShKWoz08T4njidm0hwcIbzas0bRqQYWDLLsAoSJQ==", 8313 + "license": "MIT" 8314 + }, 8315 + "node_modules/@zag-js/marquee": { 8316 + "version": "1.35.3", 8317 + "resolved": "https://registry.npmjs.org/@zag-js/marquee/-/marquee-1.35.3.tgz", 8318 + "integrity": "sha512-bKZVpmAJWPDORP7WOWnS+65W5ZQBQmRs8zvV33ZfCpFbkXjhRiqKSzIj223/VOc2NEDjyWagz2vioAxrFYVzww==", 8319 + "license": "MIT", 8320 + "dependencies": { 8321 + "@zag-js/anatomy": "1.35.3", 8322 + "@zag-js/core": "1.35.3", 8323 + "@zag-js/dom-query": "1.35.3", 8324 + "@zag-js/types": "1.35.3", 8325 + "@zag-js/utils": "1.35.3" 8326 + } 8327 + }, 8328 + "node_modules/@zag-js/menu": { 8329 + "version": "1.35.3", 8330 + "resolved": "https://registry.npmjs.org/@zag-js/menu/-/menu-1.35.3.tgz", 8331 + "integrity": "sha512-KyY0EZXkIU57Mjt+Lg+pupiePk3LcnQcB3Gl05Vva61bNjBjdKV71qwCQru/OxPZEwYgPo46L7TDIb56kfK/VQ==", 8332 + "license": "MIT", 8333 + "dependencies": { 8334 + "@zag-js/anatomy": "1.35.3", 8335 + "@zag-js/core": "1.35.3", 8336 + "@zag-js/dismissable": "1.35.3", 8337 + "@zag-js/dom-query": "1.35.3", 8338 + "@zag-js/focus-visible": "1.35.3", 8339 + "@zag-js/popper": "1.35.3", 8340 + "@zag-js/rect-utils": "1.35.3", 8341 + "@zag-js/types": "1.35.3", 8342 + "@zag-js/utils": "1.35.3" 8343 + } 8344 + }, 8345 + "node_modules/@zag-js/navigation-menu": { 8346 + "version": "1.35.3", 8347 + "resolved": "https://registry.npmjs.org/@zag-js/navigation-menu/-/navigation-menu-1.35.3.tgz", 8348 + "integrity": "sha512-8cCHx0X/KjEpr2BaMOxJS5LiA6fs/CNqVTF/sTTgZAv7Dm+MH0yNuKm4kpPvcLaVeBpVE09bnyCHrNKzZes+Fw==", 8349 + "license": "MIT", 8350 + "dependencies": { 8351 + "@zag-js/anatomy": "1.35.3", 8352 + "@zag-js/core": "1.35.3", 8353 + "@zag-js/dismissable": "1.35.3", 8354 + "@zag-js/dom-query": "1.35.3", 8355 + "@zag-js/types": "1.35.3", 8356 + "@zag-js/utils": "1.35.3" 8357 + } 8358 + }, 8359 + "node_modules/@zag-js/number-input": { 8360 + "version": "1.35.3", 8361 + "resolved": "https://registry.npmjs.org/@zag-js/number-input/-/number-input-1.35.3.tgz", 8362 + "integrity": "sha512-uqawVybAcLcefVEHMVONuAA5kDSDPP5TsROr5PnAyFlhM1iD85+r3KAfCueoDX5w2X4ibbu9o2tdV6zTFKD/nQ==", 8363 + "license": "MIT", 8364 + "dependencies": { 8365 + "@internationalized/number": "3.6.5", 8366 + "@zag-js/anatomy": "1.35.3", 8367 + "@zag-js/core": "1.35.3", 8368 + "@zag-js/dom-query": "1.35.3", 8369 + "@zag-js/types": "1.35.3", 8370 + "@zag-js/utils": "1.35.3" 8371 + } 8372 + }, 8373 + "node_modules/@zag-js/pagination": { 8374 + "version": "1.35.3", 8375 + "resolved": "https://registry.npmjs.org/@zag-js/pagination/-/pagination-1.35.3.tgz", 8376 + "integrity": "sha512-fKm4s5KAd12RiCI/EDmmGKjPQ+i2qS/UsJPdMe65yb/4mY5OibwV2zyHcVeFsOD4gBZpnU6kYlDAGSttmLWLlQ==", 8377 + "license": "MIT", 8378 + "dependencies": { 8379 + "@zag-js/anatomy": "1.35.3", 8380 + "@zag-js/core": "1.35.3", 8381 + "@zag-js/dom-query": "1.35.3", 8382 + "@zag-js/types": "1.35.3", 8383 + "@zag-js/utils": "1.35.3" 8384 + } 8385 + }, 8386 + "node_modules/@zag-js/password-input": { 8387 + "version": "1.35.3", 8388 + "resolved": "https://registry.npmjs.org/@zag-js/password-input/-/password-input-1.35.3.tgz", 8389 + "integrity": "sha512-etd0gm6ELAm3y+cFhPU+TYm8khm9cL5Mg5m2DcZxu1Mqpj7JY0LsXZ8SFOdCZgTIHuMEhKBiYfnuyMAd4CJztA==", 8390 + "license": "MIT", 8391 + "dependencies": { 8392 + "@zag-js/anatomy": "1.35.3", 8393 + "@zag-js/core": "1.35.3", 8394 + "@zag-js/dom-query": "1.35.3", 8395 + "@zag-js/types": "1.35.3", 8396 + "@zag-js/utils": "1.35.3" 8397 + } 8398 + }, 8399 + "node_modules/@zag-js/pin-input": { 8400 + "version": "1.35.3", 8401 + "resolved": "https://registry.npmjs.org/@zag-js/pin-input/-/pin-input-1.35.3.tgz", 8402 + "integrity": "sha512-ZFt+WIHMdVlSg29BrQLFq5ijabiUO3tXMhoKhjjzTSe/tLqfNeu3UxFB6y/FYpn8+Cvn6xwvhu3lgnORYmI0zQ==", 8403 + "license": "MIT", 8404 + "dependencies": { 8405 + "@zag-js/anatomy": "1.35.3", 8406 + "@zag-js/core": "1.35.3", 8407 + "@zag-js/dom-query": "1.35.3", 8408 + "@zag-js/types": "1.35.3", 8409 + "@zag-js/utils": "1.35.3" 8410 + } 8411 + }, 8412 + "node_modules/@zag-js/popover": { 8413 + "version": "1.35.3", 8414 + "resolved": "https://registry.npmjs.org/@zag-js/popover/-/popover-1.35.3.tgz", 8415 + "integrity": "sha512-+MIEENPsbKPxzoNuDI/C5d5ZN9uxnfZ+MBDc5C5XSgjjg9FcvMXClNq7IFM1aZi24peRXg9cMNf//lApVRT37w==", 8416 + "license": "MIT", 8417 + "dependencies": { 8418 + "@zag-js/anatomy": "1.35.3", 8419 + "@zag-js/aria-hidden": "1.35.3", 8420 + "@zag-js/core": "1.35.3", 8421 + "@zag-js/dismissable": "1.35.3", 8422 + "@zag-js/dom-query": "1.35.3", 8423 + "@zag-js/focus-trap": "1.35.3", 8424 + "@zag-js/popper": "1.35.3", 8425 + "@zag-js/remove-scroll": "1.35.3", 8426 + "@zag-js/types": "1.35.3", 8427 + "@zag-js/utils": "1.35.3" 8428 + } 8429 + }, 8430 + "node_modules/@zag-js/popper": { 8431 + "version": "1.35.3", 8432 + "resolved": "https://registry.npmjs.org/@zag-js/popper/-/popper-1.35.3.tgz", 8433 + "integrity": "sha512-gpB7Xn9WtlfrUsIVbSgNQGDwgNOL/cSGt0Id3wEQKArmqVC704EWtPvXzOMMybBEdm8YW2hQrXuo+o66abI1Sg==", 8434 + "license": "MIT", 8435 + "dependencies": { 8436 + "@floating-ui/dom": "^1.7.5", 8437 + "@zag-js/dom-query": "1.35.3", 8438 + "@zag-js/utils": "1.35.3" 8439 + } 8440 + }, 8441 + "node_modules/@zag-js/presence": { 8442 + "version": "1.35.3", 8443 + "resolved": "https://registry.npmjs.org/@zag-js/presence/-/presence-1.35.3.tgz", 8444 + "integrity": "sha512-ev5E7+U9IZAGvEaflpdVLHaZl8ZaQMhGB3ypd0yKhPwXeM51obV8w3+5HjzTqHPl8TKuoHWL31YaiUBd5EuS6w==", 8445 + "license": "MIT", 8446 + "dependencies": { 8447 + "@zag-js/core": "1.35.3", 8448 + "@zag-js/dom-query": "1.35.3", 8449 + "@zag-js/types": "1.35.3" 8450 + } 8451 + }, 8452 + "node_modules/@zag-js/progress": { 8453 + "version": "1.35.3", 8454 + "resolved": "https://registry.npmjs.org/@zag-js/progress/-/progress-1.35.3.tgz", 8455 + "integrity": "sha512-u0GxQN1AfXMAgzYOUMxKQA12DyuAP0svh2S//KvOorTSv7d5hAa8nZXi2cEv5abYsyfKJ6/bc1Z56byzW1jVZw==", 8456 + "license": "MIT", 8457 + "dependencies": { 8458 + "@zag-js/anatomy": "1.35.3", 8459 + "@zag-js/core": "1.35.3", 8460 + "@zag-js/dom-query": "1.35.3", 8461 + "@zag-js/types": "1.35.3", 8462 + "@zag-js/utils": "1.35.3" 8463 + } 8464 + }, 8465 + "node_modules/@zag-js/qr-code": { 8466 + "version": "1.35.3", 8467 + "resolved": "https://registry.npmjs.org/@zag-js/qr-code/-/qr-code-1.35.3.tgz", 8468 + "integrity": "sha512-t0Ehwogr49vTNtWyNdQU2tYex7uJyfAn7N/5LgD7FXw8aa+RBMWZWlqjCUvHqJ929tVMrn+LIrQnZCcwNunalA==", 8469 + "license": "MIT", 8470 + "dependencies": { 8471 + "@zag-js/anatomy": "1.35.3", 8472 + "@zag-js/core": "1.35.3", 8473 + "@zag-js/dom-query": "1.35.3", 8474 + "@zag-js/types": "1.35.3", 8475 + "@zag-js/utils": "1.35.3", 8476 + "proxy-memoize": "3.0.1", 8477 + "uqr": "0.1.2" 8478 + } 8479 + }, 8480 + "node_modules/@zag-js/radio-group": { 8481 + "version": "1.35.3", 8482 + "resolved": "https://registry.npmjs.org/@zag-js/radio-group/-/radio-group-1.35.3.tgz", 8483 + "integrity": "sha512-kOzocjqWk3dXuRfyfsHwfw63Z99NHbc7rvVUutSsfXANXi+DFYZHuqdPUwMt+29LfaL15XTOfuGV+yUXDCgQHQ==", 8484 + "license": "MIT", 8485 + "dependencies": { 8486 + "@zag-js/anatomy": "1.35.3", 8487 + "@zag-js/core": "1.35.3", 8488 + "@zag-js/dom-query": "1.35.3", 8489 + "@zag-js/focus-visible": "1.35.3", 8490 + "@zag-js/types": "1.35.3", 8491 + "@zag-js/utils": "1.35.3" 8492 + } 8493 + }, 8494 + "node_modules/@zag-js/rating-group": { 8495 + "version": "1.35.3", 8496 + "resolved": "https://registry.npmjs.org/@zag-js/rating-group/-/rating-group-1.35.3.tgz", 8497 + "integrity": "sha512-BmhJZdbaTnd3nFWMY+nR+HF952UhWXfaXXxiBWptSLMBfAYImQTWBMrLgTHCSnVfmFATj4Gb7xQe79FQU8T5fA==", 8498 + "license": "MIT", 8499 + "dependencies": { 8500 + "@zag-js/anatomy": "1.35.3", 8501 + "@zag-js/core": "1.35.3", 8502 + "@zag-js/dom-query": "1.35.3", 8503 + "@zag-js/types": "1.35.3", 8504 + "@zag-js/utils": "1.35.3" 8505 + } 8506 + }, 8507 + "node_modules/@zag-js/react": { 8508 + "version": "1.35.3", 8509 + "resolved": "https://registry.npmjs.org/@zag-js/react/-/react-1.35.3.tgz", 8510 + "integrity": "sha512-x2PxYUCQ6OgOpUdmSkG5tbL9JWVqYRh42r4V2UeAdMh0MRwjAJtxjvAy50DZ8Sfia5o4UGdZMXJyDY2O7Pdhyw==", 8511 + "license": "MIT", 8512 + "dependencies": { 8513 + "@zag-js/core": "1.35.3", 8514 + "@zag-js/store": "1.35.3", 8515 + "@zag-js/types": "1.35.3", 8516 + "@zag-js/utils": "1.35.3" 8517 + }, 8518 + "peerDependencies": { 8519 + "react": ">=18.0.0", 8520 + "react-dom": ">=18.0.0" 8521 + } 8522 + }, 8523 + "node_modules/@zag-js/rect-utils": { 8524 + "version": "1.35.3", 8525 + "resolved": "https://registry.npmjs.org/@zag-js/rect-utils/-/rect-utils-1.35.3.tgz", 8526 + "integrity": "sha512-mt/oD3RXdyaX6ZPSd8BO13vvPBJ7QpVWieubE3O0WM3OPhU7ykDMRp/tR7cYMQrzUm04GlY9pbkmSSw2uABxlA==", 8527 + "license": "MIT" 8528 + }, 8529 + "node_modules/@zag-js/remove-scroll": { 8530 + "version": "1.35.3", 8531 + "resolved": "https://registry.npmjs.org/@zag-js/remove-scroll/-/remove-scroll-1.35.3.tgz", 8532 + "integrity": "sha512-e59z9SbEpPiw0qwNQa2cB5/h30ZCLREaHsCw1TKTANFhwg7v85k9Lq1H/G/49li1CAjmiaOU9BNGlDvbzpNETQ==", 8533 + "license": "MIT", 8534 + "dependencies": { 8535 + "@zag-js/dom-query": "1.35.3" 8536 + } 8537 + }, 8538 + "node_modules/@zag-js/scroll-area": { 8539 + "version": "1.35.3", 8540 + "resolved": "https://registry.npmjs.org/@zag-js/scroll-area/-/scroll-area-1.35.3.tgz", 8541 + "integrity": "sha512-IQwdUws/AckRIHK1z/wHdHurnOeGd8h8Dmspfh3VT7NkwTnxeJ4SW9di9smuD+d25eXkJRuX5zGEDHAyx2IaPQ==", 8542 + "license": "MIT", 8543 + "dependencies": { 8544 + "@zag-js/anatomy": "1.35.3", 8545 + "@zag-js/core": "1.35.3", 8546 + "@zag-js/dom-query": "1.35.3", 8547 + "@zag-js/types": "1.35.3", 8548 + "@zag-js/utils": "1.35.3" 8549 + } 8550 + }, 8551 + "node_modules/@zag-js/scroll-snap": { 8552 + "version": "1.35.3", 8553 + "resolved": "https://registry.npmjs.org/@zag-js/scroll-snap/-/scroll-snap-1.35.3.tgz", 8554 + "integrity": "sha512-NVa2yRm2DQnF6hTV9k7Xz7l8YCZBagZTiqSwNvWKUulKD1csjt2fpBxvUt2cK+1iQnLOey2ydhs7MMsAnXPbJA==", 8555 + "license": "MIT", 8556 + "dependencies": { 8557 + "@zag-js/dom-query": "1.35.3" 8558 + } 8559 + }, 8560 + "node_modules/@zag-js/select": { 8561 + "version": "1.35.3", 8562 + "resolved": "https://registry.npmjs.org/@zag-js/select/-/select-1.35.3.tgz", 8563 + "integrity": "sha512-ztszGHWvlbBDE0YT5LYPH+sMd6VH1ct5pH/M9VSzIUO6C5PARkW0NwSVQ1rCQJMj4sfvSE1gC1/r7urRzqEcUQ==", 8564 + "license": "MIT", 8565 + "dependencies": { 8566 + "@zag-js/anatomy": "1.35.3", 8567 + "@zag-js/collection": "1.35.3", 8568 + "@zag-js/core": "1.35.3", 8569 + "@zag-js/dismissable": "1.35.3", 8570 + "@zag-js/dom-query": "1.35.3", 8571 + "@zag-js/focus-visible": "1.35.3", 8572 + "@zag-js/popper": "1.35.3", 8573 + "@zag-js/types": "1.35.3", 8574 + "@zag-js/utils": "1.35.3" 8575 + } 8576 + }, 8577 + "node_modules/@zag-js/signature-pad": { 8578 + "version": "1.35.3", 8579 + "resolved": "https://registry.npmjs.org/@zag-js/signature-pad/-/signature-pad-1.35.3.tgz", 8580 + "integrity": "sha512-jvtxxzAQ8fre11zWUh6HflG4Ycr5z83Wba4pONRJbUE/vNgkJQ7yJgfyUl1QTlkn8Arfg2Zwoxu9GIq80HLZWg==", 8581 + "license": "MIT", 8582 + "dependencies": { 8583 + "@zag-js/anatomy": "1.35.3", 8584 + "@zag-js/core": "1.35.3", 8585 + "@zag-js/dom-query": "1.35.3", 8586 + "@zag-js/types": "1.35.3", 8587 + "@zag-js/utils": "1.35.3", 8588 + "perfect-freehand": "^1.2.3" 8589 + } 8590 + }, 8591 + "node_modules/@zag-js/slider": { 8592 + "version": "1.35.3", 8593 + "resolved": "https://registry.npmjs.org/@zag-js/slider/-/slider-1.35.3.tgz", 8594 + "integrity": "sha512-Th142JO4Fqla5AWhGrTW6CQicwvTw87PdVpur/WotQ7brlZIww5HipzEMh5eQJSWfwpKD4PI2bYK9V/ZE/mpXA==", 8595 + "license": "MIT", 8596 + "dependencies": { 8597 + "@zag-js/anatomy": "1.35.3", 8598 + "@zag-js/core": "1.35.3", 8599 + "@zag-js/dom-query": "1.35.3", 8600 + "@zag-js/types": "1.35.3", 8601 + "@zag-js/utils": "1.35.3" 8602 + } 8603 + }, 8604 + "node_modules/@zag-js/splitter": { 8605 + "version": "1.35.3", 8606 + "resolved": "https://registry.npmjs.org/@zag-js/splitter/-/splitter-1.35.3.tgz", 8607 + "integrity": "sha512-IsIbRwzjr5amGANEDsZDSToaSn8wHUWvS2l0XHmf3BiiguVApaZgQTlfqthVQC9hBHMOaGIXIW1CFUOrQYkvUQ==", 8608 + "license": "MIT", 8609 + "dependencies": { 8610 + "@zag-js/anatomy": "1.35.3", 8611 + "@zag-js/core": "1.35.3", 8612 + "@zag-js/dom-query": "1.35.3", 8613 + "@zag-js/types": "1.35.3", 8614 + "@zag-js/utils": "1.35.3" 8615 + } 8616 + }, 8617 + "node_modules/@zag-js/steps": { 8618 + "version": "1.35.3", 8619 + "resolved": "https://registry.npmjs.org/@zag-js/steps/-/steps-1.35.3.tgz", 8620 + "integrity": "sha512-TYIrqV+v9/ULhvrTRBtQFFvJQPPTWOmjFXxlIxDwozek5R4dCIyeUYt1/ChJEc2mNETocbfDVSTxRO1dwCFpwQ==", 8621 + "license": "MIT", 8622 + "dependencies": { 8623 + "@zag-js/anatomy": "1.35.3", 8624 + "@zag-js/core": "1.35.3", 8625 + "@zag-js/dom-query": "1.35.3", 8626 + "@zag-js/types": "1.35.3", 8627 + "@zag-js/utils": "1.35.3" 8628 + } 8629 + }, 8630 + "node_modules/@zag-js/store": { 8631 + "version": "1.35.3", 8632 + "resolved": "https://registry.npmjs.org/@zag-js/store/-/store-1.35.3.tgz", 8633 + "integrity": "sha512-7kEV4T/20DU36UIfVMzuDlLhWSSEy/vabmpiB700tcdD9BBBODTiSg3ZeljW17dQbvE545vZOFEjVf/cQ5LVGA==", 8634 + "license": "MIT", 8635 + "dependencies": { 8636 + "proxy-compare": "3.0.1" 8637 + } 8638 + }, 8639 + "node_modules/@zag-js/switch": { 8640 + "version": "1.35.3", 8641 + "resolved": "https://registry.npmjs.org/@zag-js/switch/-/switch-1.35.3.tgz", 8642 + "integrity": "sha512-EP/2cJ46sd+6C5x5+89jn/9NOpM05CRESYB4RMhOnTe/WFtcS4IpiYtVHFhikdXkvJoibm67O2EHep2Pm/Xj4w==", 8643 + "license": "MIT", 8644 + "dependencies": { 8645 + "@zag-js/anatomy": "1.35.3", 8646 + "@zag-js/core": "1.35.3", 8647 + "@zag-js/dom-query": "1.35.3", 8648 + "@zag-js/focus-visible": "1.35.3", 8649 + "@zag-js/types": "1.35.3", 8650 + "@zag-js/utils": "1.35.3" 8651 + } 8652 + }, 8653 + "node_modules/@zag-js/tabs": { 8654 + "version": "1.35.3", 8655 + "resolved": "https://registry.npmjs.org/@zag-js/tabs/-/tabs-1.35.3.tgz", 8656 + "integrity": "sha512-lZKlDmxE25miCikj9QZCCnL02SVV2K14KZy5bn7+XDgrWlfSNTpNTj8r5E3zGlSgio5pkTGou57ASqS7WaPDWg==", 8657 + "license": "MIT", 8658 + "dependencies": { 8659 + "@zag-js/anatomy": "1.35.3", 8660 + "@zag-js/core": "1.35.3", 8661 + "@zag-js/dom-query": "1.35.3", 8662 + "@zag-js/types": "1.35.3", 8663 + "@zag-js/utils": "1.35.3" 8664 + } 8665 + }, 8666 + "node_modules/@zag-js/tags-input": { 8667 + "version": "1.35.3", 8668 + "resolved": "https://registry.npmjs.org/@zag-js/tags-input/-/tags-input-1.35.3.tgz", 8669 + "integrity": "sha512-HqyoQ3DZFhByOGnDShFfxi6u0bIf7aSVTlwmAvcL+b2ZhyU6/wIMGc4WJE7BMx1NYWM/jNLHedvGExAI8R0kXQ==", 8670 + "license": "MIT", 8671 + "dependencies": { 8672 + "@zag-js/anatomy": "1.35.3", 8673 + "@zag-js/auto-resize": "1.35.3", 8674 + "@zag-js/core": "1.35.3", 8675 + "@zag-js/dom-query": "1.35.3", 8676 + "@zag-js/interact-outside": "1.35.3", 8677 + "@zag-js/live-region": "1.35.3", 8678 + "@zag-js/types": "1.35.3", 8679 + "@zag-js/utils": "1.35.3" 8680 + } 8681 + }, 8682 + "node_modules/@zag-js/timer": { 8683 + "version": "1.35.3", 8684 + "resolved": "https://registry.npmjs.org/@zag-js/timer/-/timer-1.35.3.tgz", 8685 + "integrity": "sha512-edmgitbRgsq+msxvVB4wc17Q5d5k63zMWaLJnWjUdDGAgEtM6/HNxwGb3riv46S2U3RgYxaaHTNZ/M7EE5mvYw==", 8686 + "license": "MIT", 8687 + "dependencies": { 8688 + "@zag-js/anatomy": "1.35.3", 8689 + "@zag-js/core": "1.35.3", 8690 + "@zag-js/dom-query": "1.35.3", 8691 + "@zag-js/types": "1.35.3", 8692 + "@zag-js/utils": "1.35.3" 8693 + } 8694 + }, 8695 + "node_modules/@zag-js/toast": { 8696 + "version": "1.35.3", 8697 + "resolved": "https://registry.npmjs.org/@zag-js/toast/-/toast-1.35.3.tgz", 8698 + "integrity": "sha512-whlR791GHdnMD21nNPsl2Dbql8+qu1wBZl75QzwYrjR8FlKjp8bhr3gXKzQEddcBXe9GPEFGvUs4iCyXsuTbpg==", 8699 + "license": "MIT", 8700 + "dependencies": { 8701 + "@zag-js/anatomy": "1.35.3", 8702 + "@zag-js/core": "1.35.3", 8703 + "@zag-js/dismissable": "1.35.3", 8704 + "@zag-js/dom-query": "1.35.3", 8705 + "@zag-js/types": "1.35.3", 8706 + "@zag-js/utils": "1.35.3" 8707 + } 8708 + }, 8709 + "node_modules/@zag-js/toggle": { 8710 + "version": "1.35.3", 8711 + "resolved": "https://registry.npmjs.org/@zag-js/toggle/-/toggle-1.35.3.tgz", 8712 + "integrity": "sha512-aFfHKuR4sKzglhkmWLA+0RTNPs9dfeqwtc96qljawGYfAYWJXkEPYK9dFfVa+arZ7L84xBi24QSLiTg7LGSFLw==", 8713 + "license": "MIT", 8714 + "dependencies": { 8715 + "@zag-js/anatomy": "1.35.3", 8716 + "@zag-js/core": "1.35.3", 8717 + "@zag-js/dom-query": "1.35.3", 8718 + "@zag-js/types": "1.35.3", 8719 + "@zag-js/utils": "1.35.3" 8720 + } 8721 + }, 8722 + "node_modules/@zag-js/toggle-group": { 8723 + "version": "1.35.3", 8724 + "resolved": "https://registry.npmjs.org/@zag-js/toggle-group/-/toggle-group-1.35.3.tgz", 8725 + "integrity": "sha512-Gn6JHzkQ4tlttjZcE0ZjIdxYkFeVp9VHrcMVizjJTkGZRmQ+kPZ5G/wOsZhIrvLX3Dw6Y0NkuBcP+jDHz/o3TA==", 8726 + "license": "MIT", 8727 + "dependencies": { 8728 + "@zag-js/anatomy": "1.35.3", 8729 + "@zag-js/core": "1.35.3", 8730 + "@zag-js/dom-query": "1.35.3", 8731 + "@zag-js/types": "1.35.3", 8732 + "@zag-js/utils": "1.35.3" 8733 + } 8734 + }, 8735 + "node_modules/@zag-js/tooltip": { 8736 + "version": "1.35.3", 8737 + "resolved": "https://registry.npmjs.org/@zag-js/tooltip/-/tooltip-1.35.3.tgz", 8738 + "integrity": "sha512-/pImDGYl79MfLdvEphj3rSvNdj2tLW4GwGEncgdLM/GKwQiEUjfi/9EJOfLYP23M4lOOnoW7orehJ9xeaXOAkA==", 8739 + "license": "MIT", 8740 + "dependencies": { 8741 + "@zag-js/anatomy": "1.35.3", 8742 + "@zag-js/core": "1.35.3", 8743 + "@zag-js/dom-query": "1.35.3", 8744 + "@zag-js/focus-visible": "1.35.3", 8745 + "@zag-js/popper": "1.35.3", 8746 + "@zag-js/types": "1.35.3", 8747 + "@zag-js/utils": "1.35.3" 8748 + } 8749 + }, 8750 + "node_modules/@zag-js/tour": { 8751 + "version": "1.35.3", 8752 + "resolved": "https://registry.npmjs.org/@zag-js/tour/-/tour-1.35.3.tgz", 8753 + "integrity": "sha512-DI2aCXmZaE9KcPZDs9itc2BO7ixLApJ/yVRfM69pXwVOrucdSeDDNPFkfbhj5XwB+9VjjZEkqWFHKntRIyPl5g==", 8754 + "license": "MIT", 8755 + "dependencies": { 8756 + "@zag-js/anatomy": "1.35.3", 8757 + "@zag-js/core": "1.35.3", 8758 + "@zag-js/dismissable": "1.35.3", 8759 + "@zag-js/dom-query": "1.35.3", 8760 + "@zag-js/focus-trap": "1.35.3", 8761 + "@zag-js/interact-outside": "1.35.3", 8762 + "@zag-js/popper": "1.35.3", 8763 + "@zag-js/types": "1.35.3", 8764 + "@zag-js/utils": "1.35.3" 8765 + } 8766 + }, 8767 + "node_modules/@zag-js/tree-view": { 8768 + "version": "1.35.3", 8769 + "resolved": "https://registry.npmjs.org/@zag-js/tree-view/-/tree-view-1.35.3.tgz", 8770 + "integrity": "sha512-DbHaLxSNa1goE3o3IsXxEdzp8P5dvmkk1rVWgNUUIhpA+44idEjSSNXJkHPl18Mk5blqSMVjK1EX91oqai01Vw==", 8771 + "license": "MIT", 8772 + "dependencies": { 8773 + "@zag-js/anatomy": "1.35.3", 8774 + "@zag-js/collection": "1.35.3", 8775 + "@zag-js/core": "1.35.3", 8776 + "@zag-js/dom-query": "1.35.3", 8777 + "@zag-js/types": "1.35.3", 8778 + "@zag-js/utils": "1.35.3" 8779 + } 8780 + }, 8781 + "node_modules/@zag-js/types": { 8782 + "version": "1.35.3", 8783 + "resolved": "https://registry.npmjs.org/@zag-js/types/-/types-1.35.3.tgz", 8784 + "integrity": "sha512-Fnm3AMs1lfb55hlkip/eJeWHOjFB3gSi1JkZlkkdltG2l7y/zsHkumPSe6jIKy+DRRIFKRCyXVTatbPN27bO3w==", 8785 + "license": "MIT", 8786 + "dependencies": { 8787 + "csstype": "3.2.3" 8788 + } 8789 + }, 8790 + "node_modules/@zag-js/utils": { 8791 + "version": "1.35.3", 8792 + "resolved": "https://registry.npmjs.org/@zag-js/utils/-/utils-1.35.3.tgz", 8793 + "integrity": "sha512-LHcC+9y6TFhDsIz9I3koYxONl2JFfx5yQDzc6ZEQO2cqzXedRcN0R9IPqNGCX7JuhGt14ctDkVCm1JWGP2J6Wg==", 8794 + "license": "MIT" 8795 + }, 4407 8796 "node_modules/abort-controller": { 4408 8797 "version": "3.0.0", 4409 8798 "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", ··· 4428 8817 } 4429 8818 }, 4430 8819 "node_modules/acorn": { 4431 - "version": "8.14.0", 4432 - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 4433 - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 8820 + "version": "8.16.0", 8821 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", 8822 + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", 8823 + "license": "MIT", 4434 8824 "bin": { 4435 8825 "acorn": "bin/acorn" 4436 8826 }, ··· 4678 9068 "node": ">=4" 4679 9069 } 4680 9070 }, 9071 + "node_modules/ast-v8-to-istanbul": { 9072 + "version": "1.0.0", 9073 + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.0.tgz", 9074 + "integrity": "sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==", 9075 + "dev": true, 9076 + "license": "MIT", 9077 + "dependencies": { 9078 + "@jridgewell/trace-mapping": "^0.3.31", 9079 + "estree-walker": "^3.0.3", 9080 + "js-tokens": "^10.0.0" 9081 + } 9082 + }, 9083 + "node_modules/ast-v8-to-istanbul/node_modules/estree-walker": { 9084 + "version": "3.0.3", 9085 + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", 9086 + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", 9087 + "dev": true, 9088 + "license": "MIT", 9089 + "dependencies": { 9090 + "@types/estree": "^1.0.0" 9091 + } 9092 + }, 9093 + "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { 9094 + "version": "10.0.0", 9095 + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", 9096 + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", 9097 + "dev": true, 9098 + "license": "MIT" 9099 + }, 4681 9100 "node_modules/asynckit": { 4682 9101 "version": "0.4.0", 4683 9102 "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", ··· 4773 9192 "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==", 4774 9193 "license": "MIT" 4775 9194 }, 9195 + "node_modules/axe-core": { 9196 + "version": "4.11.1", 9197 + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", 9198 + "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", 9199 + "dev": true, 9200 + "license": "MPL-2.0", 9201 + "engines": { 9202 + "node": ">=4" 9203 + } 9204 + }, 4776 9205 "node_modules/axios": { 4777 9206 "version": "1.11.0", 4778 9207 "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", ··· 4782 9211 "follow-redirects": "^1.15.6", 4783 9212 "form-data": "^4.0.4", 4784 9213 "proxy-from-env": "^1.1.0" 9214 + } 9215 + }, 9216 + "node_modules/babel-plugin-macros": { 9217 + "version": "3.1.0", 9218 + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", 9219 + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", 9220 + "license": "MIT", 9221 + "dependencies": { 9222 + "@babel/runtime": "^7.12.5", 9223 + "cosmiconfig": "^7.0.0", 9224 + "resolve": "^1.19.0" 9225 + }, 9226 + "engines": { 9227 + "node": ">=10", 9228 + "npm": ">=6" 4785 9229 } 4786 9230 }, 4787 9231 "node_modules/balanced-match": { ··· 4986 9430 "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 4987 9431 "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" 4988 9432 }, 9433 + "node_modules/bundle-name": { 9434 + "version": "4.1.0", 9435 + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", 9436 + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", 9437 + "dev": true, 9438 + "license": "MIT", 9439 + "dependencies": { 9440 + "run-applescript": "^7.0.0" 9441 + }, 9442 + "engines": { 9443 + "node": ">=18" 9444 + }, 9445 + "funding": { 9446 + "url": "https://github.com/sponsors/sindresorhus" 9447 + } 9448 + }, 4989 9449 "node_modules/bytes": { 4990 9450 "version": "3.1.2", 4991 9451 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", ··· 5113 9573 "version": "3.1.0", 5114 9574 "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 5115 9575 "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 5116 - "dev": true, 5117 9576 "engines": { 5118 9577 "node": ">=6" 5119 9578 } ··· 5156 9615 "protobufjs": "^6.8.8" 5157 9616 } 5158 9617 }, 9618 + "node_modules/ccount": { 9619 + "version": "2.0.1", 9620 + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", 9621 + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", 9622 + "license": "MIT", 9623 + "funding": { 9624 + "type": "github", 9625 + "url": "https://github.com/sponsors/wooorm" 9626 + } 9627 + }, 5159 9628 "node_modules/centra": { 5160 9629 "version": "2.7.0", 5161 9630 "resolved": "https://registry.npmjs.org/centra/-/centra-2.7.0.tgz", ··· 5209 9678 "url": "https://github.com/chalk/chalk?sponsor=1" 5210 9679 } 5211 9680 }, 9681 + "node_modules/character-entities-html4": { 9682 + "version": "2.1.0", 9683 + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", 9684 + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", 9685 + "license": "MIT", 9686 + "funding": { 9687 + "type": "github", 9688 + "url": "https://github.com/sponsors/wooorm" 9689 + } 9690 + }, 9691 + "node_modules/character-entities-legacy": { 9692 + "version": "3.0.0", 9693 + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", 9694 + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", 9695 + "license": "MIT", 9696 + "funding": { 9697 + "type": "github", 9698 + "url": "https://github.com/sponsors/wooorm" 9699 + } 9700 + }, 5212 9701 "node_modules/check-error": { 5213 9702 "version": "1.0.3", 5214 9703 "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", ··· 5257 9746 "node": ">= 6" 5258 9747 } 5259 9748 }, 9749 + "node_modules/chromatic": { 9750 + "version": "13.3.5", 9751 + "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-13.3.5.tgz", 9752 + "integrity": "sha512-MzPhxpl838qJUo0A55osCF2ifwPbjcIPeElr1d4SHcjnHoIcg7l1syJDrAYK/a+PcCBrOGi06jPNpQAln5hWgw==", 9753 + "dev": true, 9754 + "license": "MIT", 9755 + "bin": { 9756 + "chroma": "dist/bin.js", 9757 + "chromatic": "dist/bin.js", 9758 + "chromatic-cli": "dist/bin.js" 9759 + }, 9760 + "peerDependencies": { 9761 + "@chromatic-com/cypress": "^0.*.* || ^1.0.0", 9762 + "@chromatic-com/playwright": "^0.*.* || ^1.0.0" 9763 + }, 9764 + "peerDependenciesMeta": { 9765 + "@chromatic-com/cypress": { 9766 + "optional": true 9767 + }, 9768 + "@chromatic-com/playwright": { 9769 + "optional": true 9770 + } 9771 + } 9772 + }, 5260 9773 "node_modules/ci-info": { 5261 9774 "version": "3.9.0", 5262 9775 "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", ··· 5421 9934 "node": ">= 0.8" 5422 9935 } 5423 9936 }, 9937 + "node_modules/comma-separated-tokens": { 9938 + "version": "2.0.3", 9939 + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", 9940 + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", 9941 + "license": "MIT", 9942 + "funding": { 9943 + "type": "github", 9944 + "url": "https://github.com/sponsors/wooorm" 9945 + } 9946 + }, 5424 9947 "node_modules/commander": { 5425 9948 "version": "2.20.3", 5426 9949 "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", ··· 5539 10062 "node": ">= 0.10" 5540 10063 } 5541 10064 }, 10065 + "node_modules/cosmiconfig": { 10066 + "version": "7.1.0", 10067 + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", 10068 + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", 10069 + "license": "MIT", 10070 + "dependencies": { 10071 + "@types/parse-json": "^4.0.0", 10072 + "import-fresh": "^3.2.1", 10073 + "parse-json": "^5.0.0", 10074 + "path-type": "^4.0.0", 10075 + "yaml": "^1.10.0" 10076 + }, 10077 + "engines": { 10078 + "node": ">=10" 10079 + } 10080 + }, 10081 + "node_modules/cosmiconfig/node_modules/yaml": { 10082 + "version": "1.10.2", 10083 + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 10084 + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 10085 + "license": "ISC", 10086 + "engines": { 10087 + "node": ">= 6" 10088 + } 10089 + }, 5542 10090 "node_modules/croner": { 5543 10091 "version": "7.0.8", 5544 10092 "resolved": "https://registry.npmjs.org/croner/-/croner-7.0.8.tgz", ··· 5568 10116 "dev": true 5569 10117 }, 5570 10118 "node_modules/csstype": { 5571 - "version": "3.1.3", 5572 - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 5573 - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" 10119 + "version": "3.2.3", 10120 + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", 10121 + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", 10122 + "license": "MIT" 5574 10123 }, 5575 10124 "node_modules/date-fns": { 5576 10125 "version": "4.1.0", ··· 5618 10167 } 5619 10168 }, 5620 10169 "node_modules/debug": { 5621 - "version": "4.3.7", 5622 - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 5623 - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 10170 + "version": "4.4.3", 10171 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", 10172 + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", 10173 + "license": "MIT", 5624 10174 "dependencies": { 5625 10175 "ms": "^2.1.3" 5626 10176 }, ··· 5704 10254 "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 5705 10255 "dev": true 5706 10256 }, 10257 + "node_modules/default-browser": { 10258 + "version": "5.5.0", 10259 + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", 10260 + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", 10261 + "dev": true, 10262 + "license": "MIT", 10263 + "dependencies": { 10264 + "bundle-name": "^4.1.0", 10265 + "default-browser-id": "^5.0.0" 10266 + }, 10267 + "engines": { 10268 + "node": ">=18" 10269 + }, 10270 + "funding": { 10271 + "url": "https://github.com/sponsors/sindresorhus" 10272 + } 10273 + }, 10274 + "node_modules/default-browser-id": { 10275 + "version": "5.0.1", 10276 + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", 10277 + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", 10278 + "dev": true, 10279 + "license": "MIT", 10280 + "engines": { 10281 + "node": ">=18" 10282 + }, 10283 + "funding": { 10284 + "url": "https://github.com/sponsors/sindresorhus" 10285 + } 10286 + }, 5707 10287 "node_modules/default-require-extensions": { 5708 10288 "version": "3.0.1", 5709 10289 "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", ··· 5744 10324 "url": "https://github.com/sponsors/ljharb" 5745 10325 } 5746 10326 }, 10327 + "node_modules/define-lazy-prop": { 10328 + "version": "3.0.0", 10329 + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", 10330 + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", 10331 + "dev": true, 10332 + "license": "MIT", 10333 + "engines": { 10334 + "node": ">=12" 10335 + }, 10336 + "funding": { 10337 + "url": "https://github.com/sponsors/sindresorhus" 10338 + } 10339 + }, 5747 10340 "node_modules/define-properties": { 5748 10341 "version": "1.2.1", 5749 10342 "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", ··· 5801 10394 "version": "2.0.3", 5802 10395 "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", 5803 10396 "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", 5804 - "dev": true, 5805 10397 "engines": { 5806 10398 "node": ">=6" 5807 10399 } ··· 5827 10419 "node": ">=0.10" 5828 10420 } 5829 10421 }, 10422 + "node_modules/devlop": { 10423 + "version": "1.1.0", 10424 + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", 10425 + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", 10426 + "license": "MIT", 10427 + "dependencies": { 10428 + "dequal": "^2.0.0" 10429 + }, 10430 + "funding": { 10431 + "type": "github", 10432 + "url": "https://github.com/sponsors/wooorm" 10433 + } 10434 + }, 5830 10435 "node_modules/dezalgo": { 5831 10436 "version": "1.0.4", 5832 10437 "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", ··· 5860 10465 "node": ">=0.3.1" 5861 10466 } 5862 10467 }, 10468 + "node_modules/diff-match-patch": { 10469 + "version": "1.0.5", 10470 + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", 10471 + "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", 10472 + "license": "Apache-2.0" 10473 + }, 5863 10474 "node_modules/diff-sequences": { 5864 10475 "version": "27.5.1", 5865 10476 "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", ··· 6000 10611 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 6001 10612 "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" 6002 10613 }, 10614 + "node_modules/empathic": { 10615 + "version": "2.0.0", 10616 + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", 10617 + "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", 10618 + "dev": true, 10619 + "license": "MIT", 10620 + "engines": { 10621 + "node": ">=14" 10622 + } 10623 + }, 6003 10624 "node_modules/encodeurl": { 6004 10625 "version": "2.0.0", 6005 10626 "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", ··· 6029 10650 "node": ">=10.13.0" 6030 10651 } 6031 10652 }, 10653 + "node_modules/error-ex": { 10654 + "version": "1.3.4", 10655 + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", 10656 + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", 10657 + "license": "MIT", 10658 + "dependencies": { 10659 + "is-arrayish": "^0.2.1" 10660 + } 10661 + }, 6032 10662 "node_modules/es-define-property": { 6033 10663 "version": "1.0.1", 6034 10664 "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", ··· 6065 10695 "funding": { 6066 10696 "url": "https://github.com/sponsors/ljharb" 6067 10697 } 10698 + }, 10699 + "node_modules/es-module-lexer": { 10700 + "version": "2.0.0", 10701 + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", 10702 + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", 10703 + "dev": true, 10704 + "license": "MIT" 6068 10705 }, 6069 10706 "node_modules/es-object-atoms": { 6070 10707 "version": "1.1.1", ··· 6173 10810 "version": "4.0.0", 6174 10811 "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 6175 10812 "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 6176 - "dev": true, 6177 10813 "engines": { 6178 10814 "node": ">=10" 6179 10815 }, ··· 6249 10885 "eslint": ">=8.0.0" 6250 10886 } 6251 10887 }, 10888 + "node_modules/eslint-plugin-storybook": { 10889 + "version": "10.1.11", 10890 + "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-10.1.11.tgz", 10891 + "integrity": "sha512-mbq2r2kK5+AcLl0XDJ3to91JOgzCbHOqj+J3n+FRw6drk+M1boRqMShSoMMm0HdzXPLmlr7iur+qJ5ZuhH6ayQ==", 10892 + "dev": true, 10893 + "license": "MIT", 10894 + "dependencies": { 10895 + "@typescript-eslint/utils": "^8.8.1" 10896 + }, 10897 + "peerDependencies": { 10898 + "eslint": ">=8", 10899 + "storybook": "^10.1.11" 10900 + } 10901 + }, 10902 + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/scope-manager": { 10903 + "version": "8.57.1", 10904 + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.1.tgz", 10905 + "integrity": "sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==", 10906 + "dev": true, 10907 + "license": "MIT", 10908 + "dependencies": { 10909 + "@typescript-eslint/types": "8.57.1", 10910 + "@typescript-eslint/visitor-keys": "8.57.1" 10911 + }, 10912 + "engines": { 10913 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 10914 + }, 10915 + "funding": { 10916 + "type": "opencollective", 10917 + "url": "https://opencollective.com/typescript-eslint" 10918 + } 10919 + }, 10920 + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/types": { 10921 + "version": "8.57.1", 10922 + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.1.tgz", 10923 + "integrity": "sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==", 10924 + "dev": true, 10925 + "license": "MIT", 10926 + "engines": { 10927 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 10928 + }, 10929 + "funding": { 10930 + "type": "opencollective", 10931 + "url": "https://opencollective.com/typescript-eslint" 10932 + } 10933 + }, 10934 + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/typescript-estree": { 10935 + "version": "8.57.1", 10936 + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.1.tgz", 10937 + "integrity": "sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==", 10938 + "dev": true, 10939 + "license": "MIT", 10940 + "dependencies": { 10941 + "@typescript-eslint/project-service": "8.57.1", 10942 + "@typescript-eslint/tsconfig-utils": "8.57.1", 10943 + "@typescript-eslint/types": "8.57.1", 10944 + "@typescript-eslint/visitor-keys": "8.57.1", 10945 + "debug": "^4.4.3", 10946 + "minimatch": "^10.2.2", 10947 + "semver": "^7.7.3", 10948 + "tinyglobby": "^0.2.15", 10949 + "ts-api-utils": "^2.4.0" 10950 + }, 10951 + "engines": { 10952 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 10953 + }, 10954 + "funding": { 10955 + "type": "opencollective", 10956 + "url": "https://opencollective.com/typescript-eslint" 10957 + }, 10958 + "peerDependencies": { 10959 + "typescript": ">=4.8.4 <6.0.0" 10960 + } 10961 + }, 10962 + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/utils": { 10963 + "version": "8.57.1", 10964 + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.1.tgz", 10965 + "integrity": "sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==", 10966 + "dev": true, 10967 + "license": "MIT", 10968 + "dependencies": { 10969 + "@eslint-community/eslint-utils": "^4.9.1", 10970 + "@typescript-eslint/scope-manager": "8.57.1", 10971 + "@typescript-eslint/types": "8.57.1", 10972 + "@typescript-eslint/typescript-estree": "8.57.1" 10973 + }, 10974 + "engines": { 10975 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 10976 + }, 10977 + "funding": { 10978 + "type": "opencollective", 10979 + "url": "https://opencollective.com/typescript-eslint" 10980 + }, 10981 + "peerDependencies": { 10982 + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", 10983 + "typescript": ">=4.8.4 <6.0.0" 10984 + } 10985 + }, 10986 + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/visitor-keys": { 10987 + "version": "8.57.1", 10988 + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.1.tgz", 10989 + "integrity": "sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==", 10990 + "dev": true, 10991 + "license": "MIT", 10992 + "dependencies": { 10993 + "@typescript-eslint/types": "8.57.1", 10994 + "eslint-visitor-keys": "^5.0.0" 10995 + }, 10996 + "engines": { 10997 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 10998 + }, 10999 + "funding": { 11000 + "type": "opencollective", 11001 + "url": "https://opencollective.com/typescript-eslint" 11002 + } 11003 + }, 11004 + "node_modules/eslint-plugin-storybook/node_modules/balanced-match": { 11005 + "version": "4.0.4", 11006 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", 11007 + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", 11008 + "dev": true, 11009 + "license": "MIT", 11010 + "engines": { 11011 + "node": "18 || 20 || >=22" 11012 + } 11013 + }, 11014 + "node_modules/eslint-plugin-storybook/node_modules/brace-expansion": { 11015 + "version": "5.0.4", 11016 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", 11017 + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", 11018 + "dev": true, 11019 + "license": "MIT", 11020 + "dependencies": { 11021 + "balanced-match": "^4.0.2" 11022 + }, 11023 + "engines": { 11024 + "node": "18 || 20 || >=22" 11025 + } 11026 + }, 11027 + "node_modules/eslint-plugin-storybook/node_modules/eslint-visitor-keys": { 11028 + "version": "5.0.1", 11029 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", 11030 + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", 11031 + "dev": true, 11032 + "license": "Apache-2.0", 11033 + "engines": { 11034 + "node": "^20.19.0 || ^22.13.0 || >=24" 11035 + }, 11036 + "funding": { 11037 + "url": "https://opencollective.com/eslint" 11038 + } 11039 + }, 11040 + "node_modules/eslint-plugin-storybook/node_modules/minimatch": { 11041 + "version": "10.2.4", 11042 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", 11043 + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", 11044 + "dev": true, 11045 + "license": "BlueOak-1.0.0", 11046 + "dependencies": { 11047 + "brace-expansion": "^5.0.2" 11048 + }, 11049 + "engines": { 11050 + "node": "18 || 20 || >=22" 11051 + }, 11052 + "funding": { 11053 + "url": "https://github.com/sponsors/isaacs" 11054 + } 11055 + }, 11056 + "node_modules/eslint-plugin-storybook/node_modules/semver": { 11057 + "version": "7.7.4", 11058 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", 11059 + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", 11060 + "dev": true, 11061 + "license": "ISC", 11062 + "bin": { 11063 + "semver": "bin/semver.js" 11064 + }, 11065 + "engines": { 11066 + "node": ">=10" 11067 + } 11068 + }, 11069 + "node_modules/eslint-plugin-storybook/node_modules/ts-api-utils": { 11070 + "version": "2.4.0", 11071 + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", 11072 + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", 11073 + "dev": true, 11074 + "license": "MIT", 11075 + "engines": { 11076 + "node": ">=18.12" 11077 + }, 11078 + "peerDependencies": { 11079 + "typescript": ">=4.8.4" 11080 + } 11081 + }, 6252 11082 "node_modules/eslint-scope": { 6253 11083 "version": "7.2.2", 6254 11084 "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", ··· 6395 11225 "node": ">=4.0" 6396 11226 } 6397 11227 }, 11228 + "node_modules/estree-walker": { 11229 + "version": "2.0.2", 11230 + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 11231 + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 11232 + "dev": true, 11233 + "license": "MIT" 11234 + }, 6398 11235 "node_modules/esutils": { 6399 11236 "version": "2.0.3", 6400 11237 "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", ··· 6498 11335 "url": "https://github.com/sponsors/sindresorhus" 6499 11336 } 6500 11337 }, 11338 + "node_modules/expect-type": { 11339 + "version": "1.3.0", 11340 + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", 11341 + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", 11342 + "dev": true, 11343 + "license": "Apache-2.0", 11344 + "engines": { 11345 + "node": ">=12.0.0" 11346 + } 11347 + }, 6501 11348 "node_modules/express": { 6502 11349 "version": "4.21.1", 6503 11350 "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", ··· 6781 11628 "url": "https://github.com/sindresorhus/file-type?sponsor=1" 6782 11629 } 6783 11630 }, 11631 + "node_modules/filesize": { 11632 + "version": "10.1.6", 11633 + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz", 11634 + "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==", 11635 + "dev": true, 11636 + "license": "BSD-3-Clause", 11637 + "engines": { 11638 + "node": ">= 10.4.0" 11639 + } 11640 + }, 6784 11641 "node_modules/fill-range": { 6785 11642 "version": "7.1.1", 6786 11643 "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", ··· 6839 11696 "funding": { 6840 11697 "url": "https://github.com/avajs/find-cache-dir?sponsor=1" 6841 11698 } 11699 + }, 11700 + "node_modules/find-root": { 11701 + "version": "1.1.0", 11702 + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", 11703 + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", 11704 + "license": "MIT" 6842 11705 }, 6843 11706 "node_modules/find-up": { 6844 11707 "version": "5.0.0", ··· 7375 12238 "url": "https://github.com/sponsors/isaacs" 7376 12239 } 7377 12240 }, 7378 - "node_modules/globals": { 7379 - "version": "11.12.0", 7380 - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 7381 - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 7382 - "dev": true, 7383 - "engines": { 7384 - "node": ">=4" 7385 - } 7386 - }, 7387 12241 "node_modules/globby": { 7388 12242 "version": "11.1.0", 7389 12243 "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", ··· 7607 12461 "node": ">= 0.4" 7608 12462 } 7609 12463 }, 12464 + "node_modules/hast-util-to-html": { 12465 + "version": "9.0.5", 12466 + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", 12467 + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", 12468 + "license": "MIT", 12469 + "dependencies": { 12470 + "@types/hast": "^3.0.0", 12471 + "@types/unist": "^3.0.0", 12472 + "ccount": "^2.0.0", 12473 + "comma-separated-tokens": "^2.0.0", 12474 + "hast-util-whitespace": "^3.0.0", 12475 + "html-void-elements": "^3.0.0", 12476 + "mdast-util-to-hast": "^13.0.0", 12477 + "property-information": "^7.0.0", 12478 + "space-separated-tokens": "^2.0.0", 12479 + "stringify-entities": "^4.0.0", 12480 + "zwitch": "^2.0.4" 12481 + }, 12482 + "funding": { 12483 + "type": "opencollective", 12484 + "url": "https://opencollective.com/unified" 12485 + } 12486 + }, 12487 + "node_modules/hast-util-whitespace": { 12488 + "version": "3.0.0", 12489 + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", 12490 + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", 12491 + "license": "MIT", 12492 + "dependencies": { 12493 + "@types/hast": "^3.0.0" 12494 + }, 12495 + "funding": { 12496 + "type": "opencollective", 12497 + "url": "https://opencollective.com/unified" 12498 + } 12499 + }, 7610 12500 "node_modules/he": { 7611 12501 "version": "1.2.0", 7612 12502 "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", ··· 7674 12564 "version": "2.0.2", 7675 12565 "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", 7676 12566 "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", 7677 - "dev": true, 7678 - "peer": true 12567 + "dev": true 12568 + }, 12569 + "node_modules/html-void-elements": { 12570 + "version": "3.0.0", 12571 + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", 12572 + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", 12573 + "license": "MIT", 12574 + "funding": { 12575 + "type": "github", 12576 + "url": "https://github.com/sponsors/wooorm" 12577 + } 7679 12578 }, 7680 12579 "node_modules/http-cache-semantics": { 7681 12580 "version": "4.1.1", ··· 7840 12739 "version": "3.3.0", 7841 12740 "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 7842 12741 "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 7843 - "dev": true, 7844 12742 "dependencies": { 7845 12743 "parent-module": "^1.0.0", 7846 12744 "resolve-from": "^4.0.0" ··· 7959 12857 "url": "https://github.com/sponsors/ljharb" 7960 12858 } 7961 12859 }, 12860 + "node_modules/is-arrayish": { 12861 + "version": "0.2.1", 12862 + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 12863 + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", 12864 + "license": "MIT" 12865 + }, 7962 12866 "node_modules/is-bigint": { 7963 12867 "version": "1.0.4", 7964 12868 "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", ··· 8011 12915 "url": "https://github.com/sponsors/ljharb" 8012 12916 } 8013 12917 }, 12918 + "node_modules/is-core-module": { 12919 + "version": "2.16.1", 12920 + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", 12921 + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 12922 + "license": "MIT", 12923 + "dependencies": { 12924 + "hasown": "^2.0.2" 12925 + }, 12926 + "engines": { 12927 + "node": ">= 0.4" 12928 + }, 12929 + "funding": { 12930 + "url": "https://github.com/sponsors/ljharb" 12931 + } 12932 + }, 8014 12933 "node_modules/is-date-object": { 8015 12934 "version": "1.0.5", 8016 12935 "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", ··· 8076 12995 }, 8077 12996 "engines": { 8078 12997 "node": ">=0.10.0" 12998 + } 12999 + }, 13000 + "node_modules/is-inside-container": { 13001 + "version": "1.0.0", 13002 + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", 13003 + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", 13004 + "dev": true, 13005 + "license": "MIT", 13006 + "dependencies": { 13007 + "is-docker": "^3.0.0" 13008 + }, 13009 + "bin": { 13010 + "is-inside-container": "cli.js" 13011 + }, 13012 + "engines": { 13013 + "node": ">=14.16" 13014 + }, 13015 + "funding": { 13016 + "url": "https://github.com/sponsors/sindresorhus" 13017 + } 13018 + }, 13019 + "node_modules/is-inside-container/node_modules/is-docker": { 13020 + "version": "3.0.0", 13021 + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", 13022 + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", 13023 + "dev": true, 13024 + "license": "MIT", 13025 + "bin": { 13026 + "is-docker": "cli.js" 13027 + }, 13028 + "engines": { 13029 + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 13030 + }, 13031 + "funding": { 13032 + "url": "https://github.com/sponsors/sindresorhus" 8079 13033 } 8080 13034 }, 8081 13035 "node_modules/is-map": { ··· 8343 13297 "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", 8344 13298 "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", 8345 13299 "dev": true, 8346 - "peer": true, 8347 13300 "engines": { 8348 13301 "node": ">=8" 8349 13302 } ··· 8428 13381 "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", 8429 13382 "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", 8430 13383 "dev": true, 8431 - "peer": true, 8432 13384 "dependencies": { 8433 13385 "istanbul-lib-coverage": "^3.0.0", 8434 13386 "make-dir": "^4.0.0", ··· 8443 13395 "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", 8444 13396 "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", 8445 13397 "dev": true, 8446 - "peer": true, 8447 13398 "dependencies": { 8448 13399 "semver": "^7.5.3" 8449 13400 }, ··· 8459 13410 "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", 8460 13411 "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", 8461 13412 "dev": true, 8462 - "peer": true, 8463 13413 "bin": { 8464 13414 "semver": "bin/semver.js" 8465 13415 }, ··· 8483 13433 } 8484 13434 }, 8485 13435 "node_modules/istanbul-reports": { 8486 - "version": "3.1.7", 8487 - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", 8488 - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", 13436 + "version": "3.2.0", 13437 + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", 13438 + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", 8489 13439 "dev": true, 8490 - "peer": true, 13440 + "license": "BSD-3-Clause", 8491 13441 "dependencies": { 8492 13442 "html-escaper": "^2.0.0", 8493 13443 "istanbul-lib-report": "^3.0.0" ··· 8707 13657 } 8708 13658 }, 8709 13659 "node_modules/jsesc": { 8710 - "version": "3.0.2", 8711 - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", 8712 - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", 8713 - "dev": true, 13660 + "version": "3.1.0", 13661 + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", 13662 + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", 13663 + "license": "MIT", 8714 13664 "bin": { 8715 13665 "jsesc": "bin/jsesc" 8716 13666 }, ··· 8730 13680 "version": "3.0.1", 8731 13681 "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 8732 13682 "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 13683 + "license": "MIT" 13684 + }, 13685 + "node_modules/json-parse-even-better-errors": { 13686 + "version": "2.3.1", 13687 + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 13688 + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", 8733 13689 "license": "MIT" 8734 13690 }, 8735 13691 "node_modules/json-schema-traverse": { ··· 8789 13745 }, 8790 13746 "engines": { 8791 13747 "node": "^18.0.0 || >=20.0.0" 13748 + } 13749 + }, 13750 + "node_modules/jsondiffpatch-react": { 13751 + "version": "1.0.8", 13752 + "resolved": "https://registry.npmjs.org/jsondiffpatch-react/-/jsondiffpatch-react-1.0.8.tgz", 13753 + "integrity": "sha512-dbipCQLrCsIN3w1+F+AtIaU9CmcTzfeHQ74QqUW0qZHITpi6F2P5580TB2u1A943Wyod8+09NSxxDjy5gFnXzw==", 13754 + "license": "MIT", 13755 + "dependencies": { 13756 + "jsondiffpatch": "^0.4.1", 13757 + "yarn.lock": "^0.0.1-security" 13758 + }, 13759 + "peerDependencies": { 13760 + "react": "^16.8 || ^17 || ^18", 13761 + "react-dom": "^16.8 || ^17 || ^18" 13762 + } 13763 + }, 13764 + "node_modules/jsondiffpatch-react/node_modules/ansi-styles": { 13765 + "version": "3.2.1", 13766 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 13767 + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 13768 + "license": "MIT", 13769 + "dependencies": { 13770 + "color-convert": "^1.9.0" 13771 + }, 13772 + "engines": { 13773 + "node": ">=4" 13774 + } 13775 + }, 13776 + "node_modules/jsondiffpatch-react/node_modules/chalk": { 13777 + "version": "2.4.2", 13778 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 13779 + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 13780 + "license": "MIT", 13781 + "dependencies": { 13782 + "ansi-styles": "^3.2.1", 13783 + "escape-string-regexp": "^1.0.5", 13784 + "supports-color": "^5.3.0" 13785 + }, 13786 + "engines": { 13787 + "node": ">=4" 13788 + } 13789 + }, 13790 + "node_modules/jsondiffpatch-react/node_modules/color-convert": { 13791 + "version": "1.9.3", 13792 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 13793 + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 13794 + "license": "MIT", 13795 + "dependencies": { 13796 + "color-name": "1.1.3" 13797 + } 13798 + }, 13799 + "node_modules/jsondiffpatch-react/node_modules/color-name": { 13800 + "version": "1.1.3", 13801 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 13802 + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 13803 + "license": "MIT" 13804 + }, 13805 + "node_modules/jsondiffpatch-react/node_modules/escape-string-regexp": { 13806 + "version": "1.0.5", 13807 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 13808 + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 13809 + "license": "MIT", 13810 + "engines": { 13811 + "node": ">=0.8.0" 13812 + } 13813 + }, 13814 + "node_modules/jsondiffpatch-react/node_modules/has-flag": { 13815 + "version": "3.0.0", 13816 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 13817 + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 13818 + "license": "MIT", 13819 + "engines": { 13820 + "node": ">=4" 13821 + } 13822 + }, 13823 + "node_modules/jsondiffpatch-react/node_modules/jsondiffpatch": { 13824 + "version": "0.4.1", 13825 + "resolved": "https://registry.npmjs.org/jsondiffpatch/-/jsondiffpatch-0.4.1.tgz", 13826 + "integrity": "sha512-t0etAxTUk1w5MYdNOkZBZ8rvYYN5iL+2dHCCx/DpkFm/bW28M6y5nUS83D4XdZiHy35Fpaw6LBb+F88fHZnVCw==", 13827 + "license": "MIT", 13828 + "dependencies": { 13829 + "chalk": "^2.3.0", 13830 + "diff-match-patch": "^1.0.0" 13831 + }, 13832 + "bin": { 13833 + "jsondiffpatch": "bin/jsondiffpatch" 13834 + }, 13835 + "engines": { 13836 + "node": ">=8.17.0" 13837 + } 13838 + }, 13839 + "node_modules/jsondiffpatch-react/node_modules/supports-color": { 13840 + "version": "5.5.0", 13841 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 13842 + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 13843 + "license": "MIT", 13844 + "dependencies": { 13845 + "has-flag": "^3.0.0" 13846 + }, 13847 + "engines": { 13848 + "node": ">=4" 8792 13849 } 8793 13850 }, 8794 13851 "node_modules/jsonfile": { ··· 9185 14242 "node": ">=8" 9186 14243 } 9187 14244 }, 14245 + "node_modules/lines-and-columns": { 14246 + "version": "1.2.4", 14247 + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 14248 + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 14249 + "license": "MIT" 14250 + }, 9188 14251 "node_modules/locate-path": { 9189 14252 "version": "6.0.0", 9190 14253 "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", ··· 9290 14353 "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 9291 14354 "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 9292 14355 "dev": true, 14356 + "license": "ISC", 9293 14357 "dependencies": { 9294 14358 "yallist": "^3.0.2" 9295 14359 } ··· 9318 14382 "@jridgewell/sourcemap-codec": "^1.5.5" 9319 14383 } 9320 14384 }, 14385 + "node_modules/magicast": { 14386 + "version": "0.5.2", 14387 + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", 14388 + "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", 14389 + "dev": true, 14390 + "license": "MIT", 14391 + "dependencies": { 14392 + "@babel/parser": "^7.29.0", 14393 + "@babel/types": "^7.29.0", 14394 + "source-map-js": "^1.2.1" 14395 + } 14396 + }, 9321 14397 "node_modules/make-dir": { 9322 14398 "version": "3.1.0", 9323 14399 "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", ··· 9343 14419 "node": ">= 0.4" 9344 14420 } 9345 14421 }, 14422 + "node_modules/mdast-util-to-hast": { 14423 + "version": "13.2.1", 14424 + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", 14425 + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", 14426 + "license": "MIT", 14427 + "dependencies": { 14428 + "@types/hast": "^3.0.0", 14429 + "@types/mdast": "^4.0.0", 14430 + "@ungap/structured-clone": "^1.0.0", 14431 + "devlop": "^1.0.0", 14432 + "micromark-util-sanitize-uri": "^2.0.0", 14433 + "trim-lines": "^3.0.0", 14434 + "unist-util-position": "^5.0.0", 14435 + "unist-util-visit": "^5.0.0", 14436 + "vfile": "^6.0.0" 14437 + }, 14438 + "funding": { 14439 + "type": "opencollective", 14440 + "url": "https://opencollective.com/unified" 14441 + } 14442 + }, 9346 14443 "node_modules/media-typer": { 9347 14444 "version": "0.3.0", 9348 14445 "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", ··· 9391 14488 "node": ">= 0.6" 9392 14489 } 9393 14490 }, 14491 + "node_modules/micromark-util-character": { 14492 + "version": "2.1.1", 14493 + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", 14494 + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", 14495 + "funding": [ 14496 + { 14497 + "type": "GitHub Sponsors", 14498 + "url": "https://github.com/sponsors/unifiedjs" 14499 + }, 14500 + { 14501 + "type": "OpenCollective", 14502 + "url": "https://opencollective.com/unified" 14503 + } 14504 + ], 14505 + "license": "MIT", 14506 + "dependencies": { 14507 + "micromark-util-symbol": "^2.0.0", 14508 + "micromark-util-types": "^2.0.0" 14509 + } 14510 + }, 14511 + "node_modules/micromark-util-encode": { 14512 + "version": "2.0.1", 14513 + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", 14514 + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", 14515 + "funding": [ 14516 + { 14517 + "type": "GitHub Sponsors", 14518 + "url": "https://github.com/sponsors/unifiedjs" 14519 + }, 14520 + { 14521 + "type": "OpenCollective", 14522 + "url": "https://opencollective.com/unified" 14523 + } 14524 + ], 14525 + "license": "MIT" 14526 + }, 14527 + "node_modules/micromark-util-sanitize-uri": { 14528 + "version": "2.0.1", 14529 + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", 14530 + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", 14531 + "funding": [ 14532 + { 14533 + "type": "GitHub Sponsors", 14534 + "url": "https://github.com/sponsors/unifiedjs" 14535 + }, 14536 + { 14537 + "type": "OpenCollective", 14538 + "url": "https://opencollective.com/unified" 14539 + } 14540 + ], 14541 + "license": "MIT", 14542 + "dependencies": { 14543 + "micromark-util-character": "^2.0.0", 14544 + "micromark-util-encode": "^2.0.0", 14545 + "micromark-util-symbol": "^2.0.0" 14546 + } 14547 + }, 14548 + "node_modules/micromark-util-symbol": { 14549 + "version": "2.0.1", 14550 + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", 14551 + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", 14552 + "funding": [ 14553 + { 14554 + "type": "GitHub Sponsors", 14555 + "url": "https://github.com/sponsors/unifiedjs" 14556 + }, 14557 + { 14558 + "type": "OpenCollective", 14559 + "url": "https://opencollective.com/unified" 14560 + } 14561 + ], 14562 + "license": "MIT" 14563 + }, 14564 + "node_modules/micromark-util-types": { 14565 + "version": "2.0.2", 14566 + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", 14567 + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", 14568 + "funding": [ 14569 + { 14570 + "type": "GitHub Sponsors", 14571 + "url": "https://github.com/sponsors/unifiedjs" 14572 + }, 14573 + { 14574 + "type": "OpenCollective", 14575 + "url": "https://opencollective.com/unified" 14576 + } 14577 + ], 14578 + "license": "MIT" 14579 + }, 9394 14580 "node_modules/micromatch": { 9395 14581 "version": "4.0.8", 9396 14582 "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", ··· 9473 14659 } 9474 14660 }, 9475 14661 "node_modules/minipass": { 9476 - "version": "7.1.2", 9477 - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 9478 - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 14662 + "version": "7.1.3", 14663 + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", 14664 + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", 14665 + "license": "BlueOak-1.0.0", 9479 14666 "engines": { 9480 14667 "node": ">=16 || 14 >=14.17" 9481 14668 } ··· 9633 14820 "integrity": "sha512-DcIy3jISfjmFTlOpwDE2KDhBLcGuFIAMTvY23OMkCikJXRnDqqm1jaHG3/LVYkKjrUVzQhlABW31roGqv/esRw==", 9634 14821 "dependencies": { 9635 14822 "debug": "^4.1.1" 14823 + } 14824 + }, 14825 + "node_modules/mrmime": { 14826 + "version": "2.0.1", 14827 + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", 14828 + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", 14829 + "dev": true, 14830 + "license": "MIT", 14831 + "engines": { 14832 + "node": ">=10" 9636 14833 } 9637 14834 }, 9638 14835 "node_modules/ms": { ··· 9899 15096 } 9900 15097 }, 9901 15098 "node_modules/nanoid": { 9902 - "version": "3.3.7", 9903 - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 9904 - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 15099 + "version": "3.3.11", 15100 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", 15101 + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 9905 15102 "funding": [ 9906 15103 { 9907 15104 "type": "github", 9908 15105 "url": "https://github.com/sponsors/ai" 9909 15106 } 9910 15107 ], 15108 + "license": "MIT", 9911 15109 "bin": { 9912 15110 "nanoid": "bin/nanoid.cjs" 9913 15111 }, ··· 9927 15125 "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 9928 15126 "engines": { 9929 15127 "node": ">= 0.6" 15128 + } 15129 + }, 15130 + "node_modules/next-themes": { 15131 + "version": "0.4.6", 15132 + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", 15133 + "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", 15134 + "license": "MIT", 15135 + "peerDependencies": { 15136 + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", 15137 + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" 9930 15138 } 9931 15139 }, 9932 15140 "node_modules/node-addon-api": { ··· 10466 15674 "url": "https://github.com/sponsors/ljharb" 10467 15675 } 10468 15676 }, 15677 + "node_modules/obug": { 15678 + "version": "2.1.1", 15679 + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", 15680 + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", 15681 + "dev": true, 15682 + "funding": [ 15683 + "https://github.com/sponsors/sxzz", 15684 + "https://opencollective.com/debug" 15685 + ], 15686 + "license": "MIT" 15687 + }, 10469 15688 "node_modules/on-exit-leak-free": { 10470 15689 "version": "2.1.2", 10471 15690 "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", ··· 10501 15720 "wrappy": "1" 10502 15721 } 10503 15722 }, 15723 + "node_modules/oniguruma-parser": { 15724 + "version": "0.12.1", 15725 + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", 15726 + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", 15727 + "license": "MIT" 15728 + }, 15729 + "node_modules/oniguruma-to-es": { 15730 + "version": "4.3.5", 15731 + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.5.tgz", 15732 + "integrity": "sha512-Zjygswjpsewa0NLTsiizVuMQZbp0MDyM6lIt66OxsF21npUDlzpHi1Mgb/qhQdkb+dWFTzJmFbEWdvZgRho8eQ==", 15733 + "license": "MIT", 15734 + "dependencies": { 15735 + "oniguruma-parser": "^0.12.1", 15736 + "regex": "^6.1.0", 15737 + "regex-recursion": "^6.0.2" 15738 + } 15739 + }, 10504 15740 "node_modules/open": { 10505 15741 "version": "7.4.2", 10506 15742 "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", ··· 10681 15917 "version": "1.0.1", 10682 15918 "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 10683 15919 "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 10684 - "dev": true, 10685 15920 "dependencies": { 10686 15921 "callsites": "^3.0.0" 10687 15922 }, ··· 10689 15924 "node": ">=6" 10690 15925 } 10691 15926 }, 15927 + "node_modules/parse-json": { 15928 + "version": "5.2.0", 15929 + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 15930 + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 15931 + "license": "MIT", 15932 + "dependencies": { 15933 + "@babel/code-frame": "^7.0.0", 15934 + "error-ex": "^1.3.1", 15935 + "json-parse-even-better-errors": "^2.3.0", 15936 + "lines-and-columns": "^1.1.6" 15937 + }, 15938 + "engines": { 15939 + "node": ">=8" 15940 + }, 15941 + "funding": { 15942 + "url": "https://github.com/sponsors/sindresorhus" 15943 + } 15944 + }, 10692 15945 "node_modules/parse-ms": { 10693 15946 "version": "4.0.0", 10694 15947 "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", ··· 10859 16112 "node": ">=8" 10860 16113 } 10861 16114 }, 16115 + "node_modules/path-parse": { 16116 + "version": "1.0.7", 16117 + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 16118 + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 16119 + "license": "MIT" 16120 + }, 10862 16121 "node_modules/path-scurry": { 10863 - "version": "2.0.0", 10864 - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", 10865 - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", 16122 + "version": "2.0.2", 16123 + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", 16124 + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", 16125 + "license": "BlueOak-1.0.0", 10866 16126 "dependencies": { 10867 16127 "lru-cache": "^11.0.0", 10868 16128 "minipass": "^7.1.2" 10869 16129 }, 10870 16130 "engines": { 10871 - "node": "20 || >=22" 16131 + "node": "18 || 20 || >=22" 10872 16132 }, 10873 16133 "funding": { 10874 16134 "url": "https://github.com/sponsors/isaacs" ··· 10891 16151 "version": "4.0.0", 10892 16152 "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 10893 16153 "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 10894 - "dev": true, 10895 16154 "engines": { 10896 16155 "node": ">=8" 10897 16156 } 10898 16157 }, 16158 + "node_modules/pathe": { 16159 + "version": "2.0.3", 16160 + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", 16161 + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", 16162 + "dev": true, 16163 + "license": "MIT" 16164 + }, 10899 16165 "node_modules/pathval": { 10900 16166 "version": "1.1.1", 10901 16167 "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", ··· 10922 16188 "url": "https://github.com/sponsors/Borewit" 10923 16189 } 10924 16190 }, 16191 + "node_modules/perfect-freehand": { 16192 + "version": "1.2.3", 16193 + "resolved": "https://registry.npmjs.org/perfect-freehand/-/perfect-freehand-1.2.3.tgz", 16194 + "integrity": "sha512-bHZSfqDHGNlPpgH2yxXgPHlQSPpEbo+qg7li0M78J9vNAi2yjwLeA4x79BEQhX44lEWpCLSFCeRZwpw0niiXPA==", 16195 + "license": "MIT" 16196 + }, 10925 16197 "node_modules/phin": { 10926 16198 "version": "3.7.1", 10927 16199 "resolved": "https://registry.npmjs.org/phin/-/phin-3.7.1.tgz", ··· 11132 16404 "node": ">=8" 11133 16405 } 11134 16406 }, 16407 + "node_modules/playwright": { 16408 + "version": "1.58.2", 16409 + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", 16410 + "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", 16411 + "dev": true, 16412 + "license": "Apache-2.0", 16413 + "dependencies": { 16414 + "playwright-core": "1.58.2" 16415 + }, 16416 + "bin": { 16417 + "playwright": "cli.js" 16418 + }, 16419 + "engines": { 16420 + "node": ">=18" 16421 + }, 16422 + "optionalDependencies": { 16423 + "fsevents": "2.3.2" 16424 + } 16425 + }, 16426 + "node_modules/playwright-core": { 16427 + "version": "1.58.2", 16428 + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", 16429 + "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", 16430 + "dev": true, 16431 + "license": "Apache-2.0", 16432 + "bin": { 16433 + "playwright-core": "cli.js" 16434 + }, 16435 + "engines": { 16436 + "node": ">=18" 16437 + } 16438 + }, 16439 + "node_modules/playwright/node_modules/fsevents": { 16440 + "version": "2.3.2", 16441 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 16442 + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 16443 + "dev": true, 16444 + "hasInstallScript": true, 16445 + "license": "MIT", 16446 + "optional": true, 16447 + "os": [ 16448 + "darwin" 16449 + ], 16450 + "engines": { 16451 + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 16452 + } 16453 + }, 16454 + "node_modules/pngjs": { 16455 + "version": "7.0.0", 16456 + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", 16457 + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", 16458 + "dev": true, 16459 + "license": "MIT", 16460 + "engines": { 16461 + "node": ">=14.19.0" 16462 + } 16463 + }, 11135 16464 "node_modules/possible-typed-array-names": { 11136 16465 "version": "1.0.0", 11137 16466 "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", ··· 11142 16471 } 11143 16472 }, 11144 16473 "node_modules/postcss": { 11145 - "version": "8.4.47", 11146 - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", 11147 - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", 16474 + "version": "8.5.8", 16475 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", 16476 + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", 11148 16477 "funding": [ 11149 16478 { 11150 16479 "type": "opencollective", ··· 11159 16488 "url": "https://github.com/sponsors/ai" 11160 16489 } 11161 16490 ], 16491 + "license": "MIT", 11162 16492 "dependencies": { 11163 - "nanoid": "^3.3.7", 11164 - "picocolors": "^1.1.0", 16493 + "nanoid": "^3.3.11", 16494 + "picocolors": "^1.1.1", 11165 16495 "source-map-js": "^1.2.1" 11166 16496 }, 11167 16497 "engines": { ··· 11278 16608 "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 11279 16609 "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" 11280 16610 }, 16611 + "node_modules/property-information": { 16612 + "version": "7.1.0", 16613 + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", 16614 + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", 16615 + "license": "MIT", 16616 + "funding": { 16617 + "type": "github", 16618 + "url": "https://github.com/sponsors/wooorm" 16619 + } 16620 + }, 11281 16621 "node_modules/protobufjs": { 11282 16622 "version": "6.11.4", 11283 16623 "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", ··· 11315 16655 "node": ">= 0.10" 11316 16656 } 11317 16657 }, 16658 + "node_modules/proxy-compare": { 16659 + "version": "3.0.1", 16660 + "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-3.0.1.tgz", 16661 + "integrity": "sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q==", 16662 + "license": "MIT" 16663 + }, 11318 16664 "node_modules/proxy-from-env": { 11319 16665 "version": "1.1.0", 11320 16666 "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 11321 16667 "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 11322 16668 }, 16669 + "node_modules/proxy-memoize": { 16670 + "version": "3.0.1", 16671 + "resolved": "https://registry.npmjs.org/proxy-memoize/-/proxy-memoize-3.0.1.tgz", 16672 + "integrity": "sha512-VDdG/VYtOgdGkWJx7y0o7p+zArSf2383Isci8C+BP3YXgMYDoPd3cCBjw0JdWb6YBb9sFiOPbAADDVTPJnh+9g==", 16673 + "license": "MIT", 16674 + "dependencies": { 16675 + "proxy-compare": "^3.0.0" 16676 + } 16677 + }, 11323 16678 "node_modules/pstree.remy": { 11324 16679 "version": "1.1.8", 11325 16680 "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", ··· 11444 16799 "node": ">=0.10.0" 11445 16800 } 11446 16801 }, 16802 + "node_modules/react-docgen": { 16803 + "version": "8.0.3", 16804 + "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-8.0.3.tgz", 16805 + "integrity": "sha512-aEZ9qP+/M+58x2qgfSFEWH1BxLyHe5+qkLNJOZQb5iGS017jpbRnoKhNRrXPeA6RfBrZO5wZrT9DMC1UqE1f1w==", 16806 + "dev": true, 16807 + "license": "MIT", 16808 + "dependencies": { 16809 + "@babel/core": "^7.28.0", 16810 + "@babel/traverse": "^7.28.0", 16811 + "@babel/types": "^7.28.2", 16812 + "@types/babel__core": "^7.20.5", 16813 + "@types/babel__traverse": "^7.20.7", 16814 + "@types/doctrine": "^0.0.9", 16815 + "@types/resolve": "^1.20.2", 16816 + "doctrine": "^3.0.0", 16817 + "resolve": "^1.22.1", 16818 + "strip-indent": "^4.0.0" 16819 + }, 16820 + "engines": { 16821 + "node": "^20.9.0 || >=22" 16822 + } 16823 + }, 16824 + "node_modules/react-docgen-typescript": { 16825 + "version": "2.4.0", 16826 + "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.4.0.tgz", 16827 + "integrity": "sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==", 16828 + "dev": true, 16829 + "license": "MIT", 16830 + "peerDependencies": { 16831 + "typescript": ">= 4.3.x" 16832 + } 16833 + }, 16834 + "node_modules/react-docgen/node_modules/strip-indent": { 16835 + "version": "4.1.1", 16836 + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz", 16837 + "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", 16838 + "dev": true, 16839 + "license": "MIT", 16840 + "engines": { 16841 + "node": ">=12" 16842 + }, 16843 + "funding": { 16844 + "url": "https://github.com/sponsors/sindresorhus" 16845 + } 16846 + }, 11447 16847 "node_modules/react-dom": { 11448 16848 "version": "18.3.1", 11449 16849 "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", ··· 11454 16854 }, 11455 16855 "peerDependencies": { 11456 16856 "react": "^18.3.1" 16857 + } 16858 + }, 16859 + "node_modules/react-error-boundary": { 16860 + "version": "6.1.1", 16861 + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-6.1.1.tgz", 16862 + "integrity": "sha512-BrYwPOdXi5mqkk5lw+Uvt0ThHx32rCt3BkukS4X23A2AIWDPSGX6iaWTc0y9TU/mHDA/6qOSGel+B2ERkOvD1w==", 16863 + "license": "MIT", 16864 + "peerDependencies": { 16865 + "react": "^18.0.0 || ^19.0.0" 16866 + } 16867 + }, 16868 + "node_modules/react-icons": { 16869 + "version": "5.6.0", 16870 + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.6.0.tgz", 16871 + "integrity": "sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA==", 16872 + "license": "MIT", 16873 + "peerDependencies": { 16874 + "react": "*" 11457 16875 } 11458 16876 }, 11459 16877 "node_modules/react-is": { ··· 11686 17104 "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", 11687 17105 "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" 11688 17106 }, 17107 + "node_modules/regex": { 17108 + "version": "6.1.0", 17109 + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", 17110 + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", 17111 + "license": "MIT", 17112 + "dependencies": { 17113 + "regex-utilities": "^2.3.0" 17114 + } 17115 + }, 17116 + "node_modules/regex-recursion": { 17117 + "version": "6.0.2", 17118 + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", 17119 + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", 17120 + "license": "MIT", 17121 + "dependencies": { 17122 + "regex-utilities": "^2.3.0" 17123 + } 17124 + }, 17125 + "node_modules/regex-utilities": { 17126 + "version": "2.3.0", 17127 + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", 17128 + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", 17129 + "license": "MIT" 17130 + }, 11689 17131 "node_modules/regexp.prototype.flags": { 11690 17132 "version": "1.5.3", 11691 17133 "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", ··· 11746 17188 "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", 11747 17189 "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" 11748 17190 }, 17191 + "node_modules/resolve": { 17192 + "version": "1.22.11", 17193 + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", 17194 + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", 17195 + "license": "MIT", 17196 + "dependencies": { 17197 + "is-core-module": "^2.16.1", 17198 + "path-parse": "^1.0.7", 17199 + "supports-preserve-symlinks-flag": "^1.0.0" 17200 + }, 17201 + "bin": { 17202 + "resolve": "bin/resolve" 17203 + }, 17204 + "engines": { 17205 + "node": ">= 0.4" 17206 + }, 17207 + "funding": { 17208 + "url": "https://github.com/sponsors/ljharb" 17209 + } 17210 + }, 11749 17211 "node_modules/resolve-from": { 11750 17212 "version": "4.0.0", 11751 17213 "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 11752 17214 "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 11753 - "dev": true, 11754 17215 "engines": { 11755 17216 "node": ">=4" 11756 17217 } ··· 11837 17298 "url": "https://github.com/sponsors/isaacs" 11838 17299 } 11839 17300 }, 17301 + "node_modules/rolldown": { 17302 + "version": "1.0.0-rc.9", 17303 + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.9.tgz", 17304 + "integrity": "sha512-9EbgWge7ZH+yqb4d2EnELAntgPTWbfL8ajiTW+SyhJEC4qhBbkCKbqFV4Ge4zmu5ziQuVbWxb/XwLZ+RIO7E8Q==", 17305 + "dev": true, 17306 + "license": "MIT", 17307 + "dependencies": { 17308 + "@oxc-project/types": "=0.115.0", 17309 + "@rolldown/pluginutils": "1.0.0-rc.9" 17310 + }, 17311 + "bin": { 17312 + "rolldown": "bin/cli.mjs" 17313 + }, 17314 + "engines": { 17315 + "node": "^20.19.0 || >=22.12.0" 17316 + }, 17317 + "optionalDependencies": { 17318 + "@rolldown/binding-android-arm64": "1.0.0-rc.9", 17319 + "@rolldown/binding-darwin-arm64": "1.0.0-rc.9", 17320 + "@rolldown/binding-darwin-x64": "1.0.0-rc.9", 17321 + "@rolldown/binding-freebsd-x64": "1.0.0-rc.9", 17322 + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.9", 17323 + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.9", 17324 + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.9", 17325 + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.9", 17326 + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.9", 17327 + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.9", 17328 + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.9", 17329 + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.9", 17330 + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.9", 17331 + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.9", 17332 + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.9" 17333 + } 17334 + }, 11840 17335 "node_modules/rollup": { 11841 17336 "version": "4.24.3", 11842 17337 "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.3.tgz", ··· 11923 17418 "utf-8-validate": { 11924 17419 "optional": true 11925 17420 } 17421 + } 17422 + }, 17423 + "node_modules/run-applescript": { 17424 + "version": "7.1.0", 17425 + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", 17426 + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", 17427 + "dev": true, 17428 + "license": "MIT", 17429 + "engines": { 17430 + "node": ">=18" 17431 + }, 17432 + "funding": { 17433 + "url": "https://github.com/sponsors/sindresorhus" 11926 17434 } 11927 17435 }, 11928 17436 "node_modules/run-parallel": { ··· 12263 17771 "node": ">=8" 12264 17772 } 12265 17773 }, 17774 + "node_modules/shiki": { 17775 + "version": "4.0.2", 17776 + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.0.2.tgz", 17777 + "integrity": "sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ==", 17778 + "license": "MIT", 17779 + "dependencies": { 17780 + "@shikijs/core": "4.0.2", 17781 + "@shikijs/engine-javascript": "4.0.2", 17782 + "@shikijs/engine-oniguruma": "4.0.2", 17783 + "@shikijs/langs": "4.0.2", 17784 + "@shikijs/themes": "4.0.2", 17785 + "@shikijs/types": "4.0.2", 17786 + "@shikijs/vscode-textmate": "^10.0.2", 17787 + "@types/hast": "^3.0.4" 17788 + }, 17789 + "engines": { 17790 + "node": ">=20" 17791 + } 17792 + }, 12266 17793 "node_modules/side-channel": { 12267 17794 "version": "1.0.6", 12268 17795 "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", ··· 12280 17807 "url": "https://github.com/sponsors/ljharb" 12281 17808 } 12282 17809 }, 17810 + "node_modules/siginfo": { 17811 + "version": "2.0.0", 17812 + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", 17813 + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", 17814 + "dev": true, 17815 + "license": "ISC" 17816 + }, 12283 17817 "node_modules/signal-exit": { 12284 17818 "version": "4.1.0", 12285 17819 "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", ··· 12343 17877 "node": ">=0.3.1" 12344 17878 } 12345 17879 }, 17880 + "node_modules/sirv": { 17881 + "version": "3.0.2", 17882 + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", 17883 + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", 17884 + "dev": true, 17885 + "license": "MIT", 17886 + "dependencies": { 17887 + "@polka/url": "^1.0.0-next.24", 17888 + "mrmime": "^2.0.0", 17889 + "totalist": "^3.0.0" 17890 + }, 17891 + "engines": { 17892 + "node": ">=18" 17893 + } 17894 + }, 12346 17895 "node_modules/slash": { 12347 17896 "version": "2.0.0", 12348 17897 "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", ··· 12376 17925 "node": ">=0.10.0" 12377 17926 } 12378 17927 }, 17928 + "node_modules/space-separated-tokens": { 17929 + "version": "2.0.2", 17930 + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", 17931 + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", 17932 + "license": "MIT", 17933 + "funding": { 17934 + "type": "github", 17935 + "url": "https://github.com/sponsors/wooorm" 17936 + } 17937 + }, 12379 17938 "node_modules/spark-md5": { 12380 17939 "version": "3.0.2", 12381 17940 "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz", ··· 12444 18003 "dev": true, 12445 18004 "peer": true 12446 18005 }, 18006 + "node_modules/stackback": { 18007 + "version": "0.0.2", 18008 + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", 18009 + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", 18010 + "dev": true, 18011 + "license": "MIT" 18012 + }, 12447 18013 "node_modules/standard-as-callback": { 12448 18014 "version": "2.1.0", 12449 18015 "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", ··· 12458 18024 "node": ">= 0.8" 12459 18025 } 12460 18026 }, 18027 + "node_modules/std-env": { 18028 + "version": "4.0.0", 18029 + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", 18030 + "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", 18031 + "dev": true, 18032 + "license": "MIT" 18033 + }, 12461 18034 "node_modules/stop-iteration-iterator": { 12462 18035 "version": "1.0.0", 12463 18036 "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", ··· 12470 18043 "node": ">= 0.4" 12471 18044 } 12472 18045 }, 18046 + "node_modules/storybook": { 18047 + "version": "10.2.0", 18048 + "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.2.0.tgz", 18049 + "integrity": "sha512-fIQnFtpksRRgHR1CO1onGX3djaog4qsW/c5U8arqYTkUEr2TaWpn05mIJDOBoPJFlOdqFrB4Ttv0PZJxV7avhw==", 18050 + "dev": true, 18051 + "license": "MIT", 18052 + "dependencies": { 18053 + "@storybook/global": "^5.0.0", 18054 + "@storybook/icons": "^2.0.1", 18055 + "@testing-library/jest-dom": "^6.6.3", 18056 + "@testing-library/user-event": "^14.6.1", 18057 + "@vitest/expect": "3.2.4", 18058 + "@vitest/spy": "3.2.4", 18059 + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0", 18060 + "open": "^10.2.0", 18061 + "recast": "^0.23.5", 18062 + "semver": "^7.7.3", 18063 + "use-sync-external-store": "^1.5.0", 18064 + "ws": "^8.18.0" 18065 + }, 18066 + "bin": { 18067 + "storybook": "dist/bin/dispatcher.js" 18068 + }, 18069 + "funding": { 18070 + "type": "opencollective", 18071 + "url": "https://opencollective.com/storybook" 18072 + }, 18073 + "peerDependencies": { 18074 + "prettier": "^2 || ^3" 18075 + }, 18076 + "peerDependenciesMeta": { 18077 + "prettier": { 18078 + "optional": true 18079 + } 18080 + } 18081 + }, 18082 + "node_modules/storybook/node_modules/@testing-library/jest-dom": { 18083 + "version": "6.9.1", 18084 + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", 18085 + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", 18086 + "dev": true, 18087 + "license": "MIT", 18088 + "dependencies": { 18089 + "@adobe/css-tools": "^4.4.0", 18090 + "aria-query": "^5.0.0", 18091 + "css.escape": "^1.5.1", 18092 + "dom-accessibility-api": "^0.6.3", 18093 + "picocolors": "^1.1.1", 18094 + "redent": "^3.0.0" 18095 + }, 18096 + "engines": { 18097 + "node": ">=14", 18098 + "npm": ">=6", 18099 + "yarn": ">=1" 18100 + } 18101 + }, 18102 + "node_modules/storybook/node_modules/@testing-library/user-event": { 18103 + "version": "14.6.1", 18104 + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", 18105 + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", 18106 + "dev": true, 18107 + "license": "MIT", 18108 + "engines": { 18109 + "node": ">=12", 18110 + "npm": ">=6" 18111 + }, 18112 + "peerDependencies": { 18113 + "@testing-library/dom": ">=7.21.4" 18114 + } 18115 + }, 18116 + "node_modules/storybook/node_modules/ast-types": { 18117 + "version": "0.16.1", 18118 + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", 18119 + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", 18120 + "dev": true, 18121 + "license": "MIT", 18122 + "dependencies": { 18123 + "tslib": "^2.0.1" 18124 + }, 18125 + "engines": { 18126 + "node": ">=4" 18127 + } 18128 + }, 18129 + "node_modules/storybook/node_modules/dom-accessibility-api": { 18130 + "version": "0.6.3", 18131 + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", 18132 + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", 18133 + "dev": true, 18134 + "license": "MIT" 18135 + }, 18136 + "node_modules/storybook/node_modules/open": { 18137 + "version": "10.2.0", 18138 + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", 18139 + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", 18140 + "dev": true, 18141 + "license": "MIT", 18142 + "dependencies": { 18143 + "default-browser": "^5.2.1", 18144 + "define-lazy-prop": "^3.0.0", 18145 + "is-inside-container": "^1.0.0", 18146 + "wsl-utils": "^0.1.0" 18147 + }, 18148 + "engines": { 18149 + "node": ">=18" 18150 + }, 18151 + "funding": { 18152 + "url": "https://github.com/sponsors/sindresorhus" 18153 + } 18154 + }, 18155 + "node_modules/storybook/node_modules/recast": { 18156 + "version": "0.23.11", 18157 + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", 18158 + "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", 18159 + "dev": true, 18160 + "license": "MIT", 18161 + "dependencies": { 18162 + "ast-types": "^0.16.1", 18163 + "esprima": "~4.0.0", 18164 + "source-map": "~0.6.1", 18165 + "tiny-invariant": "^1.3.3", 18166 + "tslib": "^2.0.1" 18167 + }, 18168 + "engines": { 18169 + "node": ">= 4" 18170 + } 18171 + }, 18172 + "node_modules/storybook/node_modules/semver": { 18173 + "version": "7.7.4", 18174 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", 18175 + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", 18176 + "dev": true, 18177 + "license": "ISC", 18178 + "bin": { 18179 + "semver": "bin/semver.js" 18180 + }, 18181 + "engines": { 18182 + "node": ">=10" 18183 + } 18184 + }, 12473 18185 "node_modules/stream-split": { 12474 18186 "version": "1.1.0", 12475 18187 "resolved": "https://registry.npmjs.org/stream-split/-/stream-split-1.1.0.tgz", ··· 12548 18260 }, 12549 18261 "funding": { 12550 18262 "url": "https://github.com/chalk/strip-ansi?sponsor=1" 18263 + } 18264 + }, 18265 + "node_modules/stringify-entities": { 18266 + "version": "4.0.4", 18267 + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", 18268 + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", 18269 + "license": "MIT", 18270 + "dependencies": { 18271 + "character-entities-html4": "^2.0.0", 18272 + "character-entities-legacy": "^3.0.0" 18273 + }, 18274 + "funding": { 18275 + "type": "github", 18276 + "url": "https://github.com/sponsors/wooorm" 12551 18277 } 12552 18278 }, 12553 18279 "node_modules/strip-ansi": { ··· 12635 18361 "url": "https://github.com/sponsors/Borewit" 12636 18362 } 12637 18363 }, 18364 + "node_modules/stylis": { 18365 + "version": "4.2.0", 18366 + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", 18367 + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", 18368 + "license": "MIT" 18369 + }, 12638 18370 "node_modules/superagent": { 12639 18371 "version": "8.1.2", 12640 18372 "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", ··· 12711 18443 "node": ">=8" 12712 18444 } 12713 18445 }, 18446 + "node_modules/supports-preserve-symlinks-flag": { 18447 + "version": "1.0.0", 18448 + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 18449 + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 18450 + "license": "MIT", 18451 + "engines": { 18452 + "node": ">= 0.4" 18453 + }, 18454 + "funding": { 18455 + "url": "https://github.com/sponsors/ljharb" 18456 + } 18457 + }, 12714 18458 "node_modules/tagged-tag": { 12715 18459 "version": "1.0.0", 12716 18460 "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", ··· 12807 18551 "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 12808 18552 "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" 12809 18553 }, 18554 + "node_modules/tiny-invariant": { 18555 + "version": "1.3.3", 18556 + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", 18557 + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", 18558 + "dev": true, 18559 + "license": "MIT" 18560 + }, 18561 + "node_modules/tinybench": { 18562 + "version": "2.9.0", 18563 + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", 18564 + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", 18565 + "dev": true, 18566 + "license": "MIT" 18567 + }, 18568 + "node_modules/tinyexec": { 18569 + "version": "1.0.4", 18570 + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", 18571 + "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", 18572 + "dev": true, 18573 + "license": "MIT", 18574 + "engines": { 18575 + "node": ">=18" 18576 + } 18577 + }, 18578 + "node_modules/tinyglobby": { 18579 + "version": "0.2.15", 18580 + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", 18581 + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", 18582 + "dev": true, 18583 + "license": "MIT", 18584 + "dependencies": { 18585 + "fdir": "^6.5.0", 18586 + "picomatch": "^4.0.3" 18587 + }, 18588 + "engines": { 18589 + "node": ">=12.0.0" 18590 + }, 18591 + "funding": { 18592 + "url": "https://github.com/sponsors/SuperchupuDev" 18593 + } 18594 + }, 18595 + "node_modules/tinyglobby/node_modules/fdir": { 18596 + "version": "6.5.0", 18597 + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", 18598 + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", 18599 + "dev": true, 18600 + "license": "MIT", 18601 + "engines": { 18602 + "node": ">=12.0.0" 18603 + }, 18604 + "peerDependencies": { 18605 + "picomatch": "^3 || ^4" 18606 + }, 18607 + "peerDependenciesMeta": { 18608 + "picomatch": { 18609 + "optional": true 18610 + } 18611 + } 18612 + }, 18613 + "node_modules/tinyglobby/node_modules/picomatch": { 18614 + "version": "4.0.3", 18615 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", 18616 + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", 18617 + "dev": true, 18618 + "license": "MIT", 18619 + "engines": { 18620 + "node": ">=12" 18621 + }, 18622 + "funding": { 18623 + "url": "https://github.com/sponsors/jonschlinkert" 18624 + } 18625 + }, 18626 + "node_modules/tinyrainbow": { 18627 + "version": "3.1.0", 18628 + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", 18629 + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", 18630 + "dev": true, 18631 + "license": "MIT", 18632 + "engines": { 18633 + "node": ">=14.0.0" 18634 + } 18635 + }, 18636 + "node_modules/tinyspy": { 18637 + "version": "4.0.4", 18638 + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", 18639 + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", 18640 + "dev": true, 18641 + "license": "MIT", 18642 + "engines": { 18643 + "node": ">=14.0.0" 18644 + } 18645 + }, 12810 18646 "node_modules/tlds": { 12811 18647 "version": "1.261.0", 12812 18648 "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.261.0.tgz", ··· 12896 18732 "url": "https://github.com/sponsors/Borewit" 12897 18733 } 12898 18734 }, 18735 + "node_modules/totalist": { 18736 + "version": "3.0.1", 18737 + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", 18738 + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", 18739 + "dev": true, 18740 + "license": "MIT", 18741 + "engines": { 18742 + "node": ">=6" 18743 + } 18744 + }, 12899 18745 "node_modules/touch": { 12900 18746 "version": "3.1.1", 12901 18747 "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", ··· 12922 18768 "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 12923 18769 "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 12924 18770 }, 18771 + "node_modules/trim-lines": { 18772 + "version": "3.0.1", 18773 + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", 18774 + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", 18775 + "license": "MIT", 18776 + "funding": { 18777 + "type": "github", 18778 + "url": "https://github.com/sponsors/wooorm" 18779 + } 18780 + }, 12925 18781 "node_modules/ts_lru_map": { 12926 18782 "version": "1.0.2", 12927 18783 "resolved": "https://registry.npmjs.org/ts_lru_map/-/ts_lru_map-1.0.2.tgz", ··· 12937 18793 }, 12938 18794 "peerDependencies": { 12939 18795 "typescript": ">=4.2.0" 18796 + } 18797 + }, 18798 + "node_modules/ts-dedent": { 18799 + "version": "2.2.0", 18800 + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", 18801 + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", 18802 + "dev": true, 18803 + "license": "MIT", 18804 + "engines": { 18805 + "node": ">=6.10" 12940 18806 } 12941 18807 }, 12942 18808 "node_modules/ts-essentials": { ··· 13063 18929 "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==", 13064 18930 "license": "MIT" 13065 18931 }, 18932 + "node_modules/tsconfig-paths": { 18933 + "version": "4.2.0", 18934 + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", 18935 + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", 18936 + "dev": true, 18937 + "license": "MIT", 18938 + "dependencies": { 18939 + "json5": "^2.2.2", 18940 + "minimist": "^1.2.6", 18941 + "strip-bom": "^3.0.0" 18942 + }, 18943 + "engines": { 18944 + "node": ">=6" 18945 + } 18946 + }, 18947 + "node_modules/tsconfig-paths/node_modules/strip-bom": { 18948 + "version": "3.0.0", 18949 + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 18950 + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", 18951 + "dev": true, 18952 + "license": "MIT", 18953 + "engines": { 18954 + "node": ">=4" 18955 + } 18956 + }, 13066 18957 "node_modules/tslib": { 13067 18958 "version": "2.8.0", 13068 18959 "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", ··· 13152 19043 } 13153 19044 }, 13154 19045 "node_modules/typescript": { 13155 - "version": "5.5.4", 13156 - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", 13157 - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", 19046 + "version": "5.9.3", 19047 + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", 19048 + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", 19049 + "license": "Apache-2.0", 13158 19050 "bin": { 13159 19051 "tsc": "bin/tsc", 13160 19052 "tsserver": "bin/tsserver" ··· 13292 19184 } 13293 19185 }, 13294 19186 "node_modules/undici-types": { 13295 - "version": "5.26.5", 13296 - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 13297 - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" 19187 + "version": "6.21.0", 19188 + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", 19189 + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", 19190 + "license": "MIT" 13298 19191 }, 13299 19192 "node_modules/unicorn-magic": { 13300 19193 "version": "0.3.0", ··· 13309 19202 "url": "https://github.com/sponsors/sindresorhus" 13310 19203 } 13311 19204 }, 19205 + "node_modules/unist-util-is": { 19206 + "version": "6.0.1", 19207 + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", 19208 + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", 19209 + "license": "MIT", 19210 + "dependencies": { 19211 + "@types/unist": "^3.0.0" 19212 + }, 19213 + "funding": { 19214 + "type": "opencollective", 19215 + "url": "https://opencollective.com/unified" 19216 + } 19217 + }, 19218 + "node_modules/unist-util-position": { 19219 + "version": "5.0.0", 19220 + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", 19221 + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", 19222 + "license": "MIT", 19223 + "dependencies": { 19224 + "@types/unist": "^3.0.0" 19225 + }, 19226 + "funding": { 19227 + "type": "opencollective", 19228 + "url": "https://opencollective.com/unified" 19229 + } 19230 + }, 19231 + "node_modules/unist-util-stringify-position": { 19232 + "version": "4.0.0", 19233 + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", 19234 + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", 19235 + "license": "MIT", 19236 + "dependencies": { 19237 + "@types/unist": "^3.0.0" 19238 + }, 19239 + "funding": { 19240 + "type": "opencollective", 19241 + "url": "https://opencollective.com/unified" 19242 + } 19243 + }, 19244 + "node_modules/unist-util-visit": { 19245 + "version": "5.1.0", 19246 + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", 19247 + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", 19248 + "license": "MIT", 19249 + "dependencies": { 19250 + "@types/unist": "^3.0.0", 19251 + "unist-util-is": "^6.0.0", 19252 + "unist-util-visit-parents": "^6.0.0" 19253 + }, 19254 + "funding": { 19255 + "type": "opencollective", 19256 + "url": "https://opencollective.com/unified" 19257 + } 19258 + }, 19259 + "node_modules/unist-util-visit-parents": { 19260 + "version": "6.0.2", 19261 + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", 19262 + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", 19263 + "license": "MIT", 19264 + "dependencies": { 19265 + "@types/unist": "^3.0.0", 19266 + "unist-util-is": "^6.0.0" 19267 + }, 19268 + "funding": { 19269 + "type": "opencollective", 19270 + "url": "https://opencollective.com/unified" 19271 + } 19272 + }, 13312 19273 "node_modules/universalify": { 13313 19274 "version": "2.0.1", 13314 19275 "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", ··· 13325 19286 "node": ">= 0.8" 13326 19287 } 13327 19288 }, 19289 + "node_modules/unplugin": { 19290 + "version": "2.3.11", 19291 + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", 19292 + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", 19293 + "dev": true, 19294 + "license": "MIT", 19295 + "dependencies": { 19296 + "@jridgewell/remapping": "^2.3.5", 19297 + "acorn": "^8.15.0", 19298 + "picomatch": "^4.0.3", 19299 + "webpack-virtual-modules": "^0.6.2" 19300 + }, 19301 + "engines": { 19302 + "node": ">=18.12.0" 19303 + } 19304 + }, 19305 + "node_modules/unplugin/node_modules/picomatch": { 19306 + "version": "4.0.3", 19307 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", 19308 + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", 19309 + "dev": true, 19310 + "license": "MIT", 19311 + "engines": { 19312 + "node": ">=12" 19313 + }, 19314 + "funding": { 19315 + "url": "https://github.com/sponsors/jonschlinkert" 19316 + } 19317 + }, 13328 19318 "node_modules/until-async": { 13329 19319 "version": "3.0.2", 13330 19320 "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", ··· 13375 19365 "browserslist": ">= 4.21.0" 13376 19366 } 13377 19367 }, 19368 + "node_modules/uqr": { 19369 + "version": "0.1.2", 19370 + "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz", 19371 + "integrity": "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==", 19372 + "license": "MIT" 19373 + }, 13378 19374 "node_modules/uri-js": { 13379 19375 "version": "4.4.1", 13380 19376 "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", ··· 13385 19381 } 13386 19382 }, 13387 19383 "node_modules/use-sync-external-store": { 13388 - "version": "1.2.2", 13389 - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", 13390 - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", 19384 + "version": "1.6.0", 19385 + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", 19386 + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", 19387 + "license": "MIT", 13391 19388 "peerDependencies": { 13392 - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" 19389 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" 13393 19390 } 13394 19391 }, 13395 19392 "node_modules/util-deprecate": { ··· 13427 19424 "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 13428 19425 "engines": { 13429 19426 "node": ">= 0.8" 19427 + } 19428 + }, 19429 + "node_modules/vfile": { 19430 + "version": "6.0.3", 19431 + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", 19432 + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", 19433 + "license": "MIT", 19434 + "dependencies": { 19435 + "@types/unist": "^3.0.0", 19436 + "vfile-message": "^4.0.0" 19437 + }, 19438 + "funding": { 19439 + "type": "opencollective", 19440 + "url": "https://opencollective.com/unified" 19441 + } 19442 + }, 19443 + "node_modules/vfile-message": { 19444 + "version": "4.0.3", 19445 + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", 19446 + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", 19447 + "license": "MIT", 19448 + "dependencies": { 19449 + "@types/unist": "^3.0.0", 19450 + "unist-util-stringify-position": "^4.0.0" 19451 + }, 19452 + "funding": { 19453 + "type": "opencollective", 19454 + "url": "https://opencollective.com/unified" 13430 19455 } 13431 19456 }, 13432 19457 "node_modules/vite": { ··· 13877 19902 "@esbuild/win32-x64": "0.21.5" 13878 19903 } 13879 19904 }, 19905 + "node_modules/vitest": { 19906 + "version": "4.1.0", 19907 + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.0.tgz", 19908 + "integrity": "sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==", 19909 + "dev": true, 19910 + "license": "MIT", 19911 + "dependencies": { 19912 + "@vitest/expect": "4.1.0", 19913 + "@vitest/mocker": "4.1.0", 19914 + "@vitest/pretty-format": "4.1.0", 19915 + "@vitest/runner": "4.1.0", 19916 + "@vitest/snapshot": "4.1.0", 19917 + "@vitest/spy": "4.1.0", 19918 + "@vitest/utils": "4.1.0", 19919 + "es-module-lexer": "^2.0.0", 19920 + "expect-type": "^1.3.0", 19921 + "magic-string": "^0.30.21", 19922 + "obug": "^2.1.1", 19923 + "pathe": "^2.0.3", 19924 + "picomatch": "^4.0.3", 19925 + "std-env": "^4.0.0-rc.1", 19926 + "tinybench": "^2.9.0", 19927 + "tinyexec": "^1.0.2", 19928 + "tinyglobby": "^0.2.15", 19929 + "tinyrainbow": "^3.0.3", 19930 + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0", 19931 + "why-is-node-running": "^2.3.0" 19932 + }, 19933 + "bin": { 19934 + "vitest": "vitest.mjs" 19935 + }, 19936 + "engines": { 19937 + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" 19938 + }, 19939 + "funding": { 19940 + "url": "https://opencollective.com/vitest" 19941 + }, 19942 + "peerDependencies": { 19943 + "@edge-runtime/vm": "*", 19944 + "@opentelemetry/api": "^1.9.0", 19945 + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", 19946 + "@vitest/browser-playwright": "4.1.0", 19947 + "@vitest/browser-preview": "4.1.0", 19948 + "@vitest/browser-webdriverio": "4.1.0", 19949 + "@vitest/ui": "4.1.0", 19950 + "happy-dom": "*", 19951 + "jsdom": "*", 19952 + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" 19953 + }, 19954 + "peerDependenciesMeta": { 19955 + "@edge-runtime/vm": { 19956 + "optional": true 19957 + }, 19958 + "@opentelemetry/api": { 19959 + "optional": true 19960 + }, 19961 + "@types/node": { 19962 + "optional": true 19963 + }, 19964 + "@vitest/browser-playwright": { 19965 + "optional": true 19966 + }, 19967 + "@vitest/browser-preview": { 19968 + "optional": true 19969 + }, 19970 + "@vitest/browser-webdriverio": { 19971 + "optional": true 19972 + }, 19973 + "@vitest/ui": { 19974 + "optional": true 19975 + }, 19976 + "happy-dom": { 19977 + "optional": true 19978 + }, 19979 + "jsdom": { 19980 + "optional": true 19981 + }, 19982 + "vite": { 19983 + "optional": false 19984 + } 19985 + } 19986 + }, 19987 + "node_modules/vitest/node_modules/@esbuild/aix-ppc64": { 19988 + "version": "0.27.4", 19989 + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", 19990 + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", 19991 + "cpu": [ 19992 + "ppc64" 19993 + ], 19994 + "dev": true, 19995 + "license": "MIT", 19996 + "optional": true, 19997 + "os": [ 19998 + "aix" 19999 + ], 20000 + "peer": true, 20001 + "engines": { 20002 + "node": ">=18" 20003 + } 20004 + }, 20005 + "node_modules/vitest/node_modules/@esbuild/android-arm": { 20006 + "version": "0.27.4", 20007 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", 20008 + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", 20009 + "cpu": [ 20010 + "arm" 20011 + ], 20012 + "dev": true, 20013 + "license": "MIT", 20014 + "optional": true, 20015 + "os": [ 20016 + "android" 20017 + ], 20018 + "peer": true, 20019 + "engines": { 20020 + "node": ">=18" 20021 + } 20022 + }, 20023 + "node_modules/vitest/node_modules/@esbuild/android-arm64": { 20024 + "version": "0.27.4", 20025 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", 20026 + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", 20027 + "cpu": [ 20028 + "arm64" 20029 + ], 20030 + "dev": true, 20031 + "license": "MIT", 20032 + "optional": true, 20033 + "os": [ 20034 + "android" 20035 + ], 20036 + "peer": true, 20037 + "engines": { 20038 + "node": ">=18" 20039 + } 20040 + }, 20041 + "node_modules/vitest/node_modules/@esbuild/android-x64": { 20042 + "version": "0.27.4", 20043 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", 20044 + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", 20045 + "cpu": [ 20046 + "x64" 20047 + ], 20048 + "dev": true, 20049 + "license": "MIT", 20050 + "optional": true, 20051 + "os": [ 20052 + "android" 20053 + ], 20054 + "peer": true, 20055 + "engines": { 20056 + "node": ">=18" 20057 + } 20058 + }, 20059 + "node_modules/vitest/node_modules/@esbuild/darwin-arm64": { 20060 + "version": "0.27.4", 20061 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", 20062 + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", 20063 + "cpu": [ 20064 + "arm64" 20065 + ], 20066 + "dev": true, 20067 + "license": "MIT", 20068 + "optional": true, 20069 + "os": [ 20070 + "darwin" 20071 + ], 20072 + "peer": true, 20073 + "engines": { 20074 + "node": ">=18" 20075 + } 20076 + }, 20077 + "node_modules/vitest/node_modules/@esbuild/darwin-x64": { 20078 + "version": "0.27.4", 20079 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", 20080 + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", 20081 + "cpu": [ 20082 + "x64" 20083 + ], 20084 + "dev": true, 20085 + "license": "MIT", 20086 + "optional": true, 20087 + "os": [ 20088 + "darwin" 20089 + ], 20090 + "peer": true, 20091 + "engines": { 20092 + "node": ">=18" 20093 + } 20094 + }, 20095 + "node_modules/vitest/node_modules/@esbuild/freebsd-arm64": { 20096 + "version": "0.27.4", 20097 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", 20098 + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", 20099 + "cpu": [ 20100 + "arm64" 20101 + ], 20102 + "dev": true, 20103 + "license": "MIT", 20104 + "optional": true, 20105 + "os": [ 20106 + "freebsd" 20107 + ], 20108 + "peer": true, 20109 + "engines": { 20110 + "node": ">=18" 20111 + } 20112 + }, 20113 + "node_modules/vitest/node_modules/@esbuild/freebsd-x64": { 20114 + "version": "0.27.4", 20115 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", 20116 + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", 20117 + "cpu": [ 20118 + "x64" 20119 + ], 20120 + "dev": true, 20121 + "license": "MIT", 20122 + "optional": true, 20123 + "os": [ 20124 + "freebsd" 20125 + ], 20126 + "peer": true, 20127 + "engines": { 20128 + "node": ">=18" 20129 + } 20130 + }, 20131 + "node_modules/vitest/node_modules/@esbuild/linux-arm": { 20132 + "version": "0.27.4", 20133 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", 20134 + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", 20135 + "cpu": [ 20136 + "arm" 20137 + ], 20138 + "dev": true, 20139 + "license": "MIT", 20140 + "optional": true, 20141 + "os": [ 20142 + "linux" 20143 + ], 20144 + "peer": true, 20145 + "engines": { 20146 + "node": ">=18" 20147 + } 20148 + }, 20149 + "node_modules/vitest/node_modules/@esbuild/linux-arm64": { 20150 + "version": "0.27.4", 20151 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", 20152 + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", 20153 + "cpu": [ 20154 + "arm64" 20155 + ], 20156 + "dev": true, 20157 + "license": "MIT", 20158 + "optional": true, 20159 + "os": [ 20160 + "linux" 20161 + ], 20162 + "peer": true, 20163 + "engines": { 20164 + "node": ">=18" 20165 + } 20166 + }, 20167 + "node_modules/vitest/node_modules/@esbuild/linux-ia32": { 20168 + "version": "0.27.4", 20169 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", 20170 + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", 20171 + "cpu": [ 20172 + "ia32" 20173 + ], 20174 + "dev": true, 20175 + "license": "MIT", 20176 + "optional": true, 20177 + "os": [ 20178 + "linux" 20179 + ], 20180 + "peer": true, 20181 + "engines": { 20182 + "node": ">=18" 20183 + } 20184 + }, 20185 + "node_modules/vitest/node_modules/@esbuild/linux-loong64": { 20186 + "version": "0.27.4", 20187 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", 20188 + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", 20189 + "cpu": [ 20190 + "loong64" 20191 + ], 20192 + "dev": true, 20193 + "license": "MIT", 20194 + "optional": true, 20195 + "os": [ 20196 + "linux" 20197 + ], 20198 + "peer": true, 20199 + "engines": { 20200 + "node": ">=18" 20201 + } 20202 + }, 20203 + "node_modules/vitest/node_modules/@esbuild/linux-mips64el": { 20204 + "version": "0.27.4", 20205 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", 20206 + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", 20207 + "cpu": [ 20208 + "mips64el" 20209 + ], 20210 + "dev": true, 20211 + "license": "MIT", 20212 + "optional": true, 20213 + "os": [ 20214 + "linux" 20215 + ], 20216 + "peer": true, 20217 + "engines": { 20218 + "node": ">=18" 20219 + } 20220 + }, 20221 + "node_modules/vitest/node_modules/@esbuild/linux-ppc64": { 20222 + "version": "0.27.4", 20223 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", 20224 + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", 20225 + "cpu": [ 20226 + "ppc64" 20227 + ], 20228 + "dev": true, 20229 + "license": "MIT", 20230 + "optional": true, 20231 + "os": [ 20232 + "linux" 20233 + ], 20234 + "peer": true, 20235 + "engines": { 20236 + "node": ">=18" 20237 + } 20238 + }, 20239 + "node_modules/vitest/node_modules/@esbuild/linux-riscv64": { 20240 + "version": "0.27.4", 20241 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", 20242 + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", 20243 + "cpu": [ 20244 + "riscv64" 20245 + ], 20246 + "dev": true, 20247 + "license": "MIT", 20248 + "optional": true, 20249 + "os": [ 20250 + "linux" 20251 + ], 20252 + "peer": true, 20253 + "engines": { 20254 + "node": ">=18" 20255 + } 20256 + }, 20257 + "node_modules/vitest/node_modules/@esbuild/linux-s390x": { 20258 + "version": "0.27.4", 20259 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", 20260 + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", 20261 + "cpu": [ 20262 + "s390x" 20263 + ], 20264 + "dev": true, 20265 + "license": "MIT", 20266 + "optional": true, 20267 + "os": [ 20268 + "linux" 20269 + ], 20270 + "peer": true, 20271 + "engines": { 20272 + "node": ">=18" 20273 + } 20274 + }, 20275 + "node_modules/vitest/node_modules/@esbuild/linux-x64": { 20276 + "version": "0.27.4", 20277 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", 20278 + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", 20279 + "cpu": [ 20280 + "x64" 20281 + ], 20282 + "dev": true, 20283 + "license": "MIT", 20284 + "optional": true, 20285 + "os": [ 20286 + "linux" 20287 + ], 20288 + "peer": true, 20289 + "engines": { 20290 + "node": ">=18" 20291 + } 20292 + }, 20293 + "node_modules/vitest/node_modules/@esbuild/netbsd-x64": { 20294 + "version": "0.27.4", 20295 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", 20296 + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", 20297 + "cpu": [ 20298 + "x64" 20299 + ], 20300 + "dev": true, 20301 + "license": "MIT", 20302 + "optional": true, 20303 + "os": [ 20304 + "netbsd" 20305 + ], 20306 + "peer": true, 20307 + "engines": { 20308 + "node": ">=18" 20309 + } 20310 + }, 20311 + "node_modules/vitest/node_modules/@esbuild/openbsd-arm64": { 20312 + "version": "0.27.4", 20313 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", 20314 + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", 20315 + "cpu": [ 20316 + "arm64" 20317 + ], 20318 + "dev": true, 20319 + "license": "MIT", 20320 + "optional": true, 20321 + "os": [ 20322 + "openbsd" 20323 + ], 20324 + "peer": true, 20325 + "engines": { 20326 + "node": ">=18" 20327 + } 20328 + }, 20329 + "node_modules/vitest/node_modules/@esbuild/openbsd-x64": { 20330 + "version": "0.27.4", 20331 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", 20332 + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", 20333 + "cpu": [ 20334 + "x64" 20335 + ], 20336 + "dev": true, 20337 + "license": "MIT", 20338 + "optional": true, 20339 + "os": [ 20340 + "openbsd" 20341 + ], 20342 + "peer": true, 20343 + "engines": { 20344 + "node": ">=18" 20345 + } 20346 + }, 20347 + "node_modules/vitest/node_modules/@esbuild/sunos-x64": { 20348 + "version": "0.27.4", 20349 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", 20350 + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", 20351 + "cpu": [ 20352 + "x64" 20353 + ], 20354 + "dev": true, 20355 + "license": "MIT", 20356 + "optional": true, 20357 + "os": [ 20358 + "sunos" 20359 + ], 20360 + "peer": true, 20361 + "engines": { 20362 + "node": ">=18" 20363 + } 20364 + }, 20365 + "node_modules/vitest/node_modules/@esbuild/win32-arm64": { 20366 + "version": "0.27.4", 20367 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", 20368 + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", 20369 + "cpu": [ 20370 + "arm64" 20371 + ], 20372 + "dev": true, 20373 + "license": "MIT", 20374 + "optional": true, 20375 + "os": [ 20376 + "win32" 20377 + ], 20378 + "peer": true, 20379 + "engines": { 20380 + "node": ">=18" 20381 + } 20382 + }, 20383 + "node_modules/vitest/node_modules/@esbuild/win32-ia32": { 20384 + "version": "0.27.4", 20385 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", 20386 + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", 20387 + "cpu": [ 20388 + "ia32" 20389 + ], 20390 + "dev": true, 20391 + "license": "MIT", 20392 + "optional": true, 20393 + "os": [ 20394 + "win32" 20395 + ], 20396 + "peer": true, 20397 + "engines": { 20398 + "node": ">=18" 20399 + } 20400 + }, 20401 + "node_modules/vitest/node_modules/@esbuild/win32-x64": { 20402 + "version": "0.27.4", 20403 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", 20404 + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", 20405 + "cpu": [ 20406 + "x64" 20407 + ], 20408 + "dev": true, 20409 + "license": "MIT", 20410 + "optional": true, 20411 + "os": [ 20412 + "win32" 20413 + ], 20414 + "peer": true, 20415 + "engines": { 20416 + "node": ">=18" 20417 + } 20418 + }, 20419 + "node_modules/vitest/node_modules/@types/chai": { 20420 + "version": "5.2.3", 20421 + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", 20422 + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", 20423 + "dev": true, 20424 + "license": "MIT", 20425 + "dependencies": { 20426 + "@types/deep-eql": "*", 20427 + "assertion-error": "^2.0.1" 20428 + } 20429 + }, 20430 + "node_modules/vitest/node_modules/@vitest/expect": { 20431 + "version": "4.1.0", 20432 + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.0.tgz", 20433 + "integrity": "sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==", 20434 + "dev": true, 20435 + "license": "MIT", 20436 + "dependencies": { 20437 + "@standard-schema/spec": "^1.1.0", 20438 + "@types/chai": "^5.2.2", 20439 + "@vitest/spy": "4.1.0", 20440 + "@vitest/utils": "4.1.0", 20441 + "chai": "^6.2.2", 20442 + "tinyrainbow": "^3.0.3" 20443 + }, 20444 + "funding": { 20445 + "url": "https://opencollective.com/vitest" 20446 + } 20447 + }, 20448 + "node_modules/vitest/node_modules/@vitest/mocker": { 20449 + "version": "4.1.0", 20450 + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.0.tgz", 20451 + "integrity": "sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==", 20452 + "dev": true, 20453 + "license": "MIT", 20454 + "dependencies": { 20455 + "@vitest/spy": "4.1.0", 20456 + "estree-walker": "^3.0.3", 20457 + "magic-string": "^0.30.21" 20458 + }, 20459 + "funding": { 20460 + "url": "https://opencollective.com/vitest" 20461 + }, 20462 + "peerDependencies": { 20463 + "msw": "^2.4.9", 20464 + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" 20465 + }, 20466 + "peerDependenciesMeta": { 20467 + "msw": { 20468 + "optional": true 20469 + }, 20470 + "vite": { 20471 + "optional": true 20472 + } 20473 + } 20474 + }, 20475 + "node_modules/vitest/node_modules/@vitest/spy": { 20476 + "version": "4.1.0", 20477 + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.0.tgz", 20478 + "integrity": "sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==", 20479 + "dev": true, 20480 + "license": "MIT", 20481 + "funding": { 20482 + "url": "https://opencollective.com/vitest" 20483 + } 20484 + }, 20485 + "node_modules/vitest/node_modules/assertion-error": { 20486 + "version": "2.0.1", 20487 + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", 20488 + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", 20489 + "dev": true, 20490 + "license": "MIT", 20491 + "engines": { 20492 + "node": ">=12" 20493 + } 20494 + }, 20495 + "node_modules/vitest/node_modules/chai": { 20496 + "version": "6.2.2", 20497 + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", 20498 + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", 20499 + "dev": true, 20500 + "license": "MIT", 20501 + "engines": { 20502 + "node": ">=18" 20503 + } 20504 + }, 20505 + "node_modules/vitest/node_modules/detect-libc": { 20506 + "version": "2.1.2", 20507 + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", 20508 + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", 20509 + "dev": true, 20510 + "license": "Apache-2.0", 20511 + "engines": { 20512 + "node": ">=8" 20513 + } 20514 + }, 20515 + "node_modules/vitest/node_modules/esbuild": { 20516 + "version": "0.27.4", 20517 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", 20518 + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", 20519 + "dev": true, 20520 + "hasInstallScript": true, 20521 + "license": "MIT", 20522 + "optional": true, 20523 + "peer": true, 20524 + "bin": { 20525 + "esbuild": "bin/esbuild" 20526 + }, 20527 + "engines": { 20528 + "node": ">=18" 20529 + }, 20530 + "optionalDependencies": { 20531 + "@esbuild/aix-ppc64": "0.27.4", 20532 + "@esbuild/android-arm": "0.27.4", 20533 + "@esbuild/android-arm64": "0.27.4", 20534 + "@esbuild/android-x64": "0.27.4", 20535 + "@esbuild/darwin-arm64": "0.27.4", 20536 + "@esbuild/darwin-x64": "0.27.4", 20537 + "@esbuild/freebsd-arm64": "0.27.4", 20538 + "@esbuild/freebsd-x64": "0.27.4", 20539 + "@esbuild/linux-arm": "0.27.4", 20540 + "@esbuild/linux-arm64": "0.27.4", 20541 + "@esbuild/linux-ia32": "0.27.4", 20542 + "@esbuild/linux-loong64": "0.27.4", 20543 + "@esbuild/linux-mips64el": "0.27.4", 20544 + "@esbuild/linux-ppc64": "0.27.4", 20545 + "@esbuild/linux-riscv64": "0.27.4", 20546 + "@esbuild/linux-s390x": "0.27.4", 20547 + "@esbuild/linux-x64": "0.27.4", 20548 + "@esbuild/netbsd-arm64": "0.27.4", 20549 + "@esbuild/netbsd-x64": "0.27.4", 20550 + "@esbuild/openbsd-arm64": "0.27.4", 20551 + "@esbuild/openbsd-x64": "0.27.4", 20552 + "@esbuild/openharmony-arm64": "0.27.4", 20553 + "@esbuild/sunos-x64": "0.27.4", 20554 + "@esbuild/win32-arm64": "0.27.4", 20555 + "@esbuild/win32-ia32": "0.27.4", 20556 + "@esbuild/win32-x64": "0.27.4" 20557 + } 20558 + }, 20559 + "node_modules/vitest/node_modules/estree-walker": { 20560 + "version": "3.0.3", 20561 + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", 20562 + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", 20563 + "dev": true, 20564 + "license": "MIT", 20565 + "dependencies": { 20566 + "@types/estree": "^1.0.0" 20567 + } 20568 + }, 20569 + "node_modules/vitest/node_modules/lightningcss": { 20570 + "version": "1.32.0", 20571 + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", 20572 + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", 20573 + "dev": true, 20574 + "license": "MPL-2.0", 20575 + "dependencies": { 20576 + "detect-libc": "^2.0.3" 20577 + }, 20578 + "engines": { 20579 + "node": ">= 12.0.0" 20580 + }, 20581 + "funding": { 20582 + "type": "opencollective", 20583 + "url": "https://opencollective.com/parcel" 20584 + }, 20585 + "optionalDependencies": { 20586 + "lightningcss-android-arm64": "1.32.0", 20587 + "lightningcss-darwin-arm64": "1.32.0", 20588 + "lightningcss-darwin-x64": "1.32.0", 20589 + "lightningcss-freebsd-x64": "1.32.0", 20590 + "lightningcss-linux-arm-gnueabihf": "1.32.0", 20591 + "lightningcss-linux-arm64-gnu": "1.32.0", 20592 + "lightningcss-linux-arm64-musl": "1.32.0", 20593 + "lightningcss-linux-x64-gnu": "1.32.0", 20594 + "lightningcss-linux-x64-musl": "1.32.0", 20595 + "lightningcss-win32-arm64-msvc": "1.32.0", 20596 + "lightningcss-win32-x64-msvc": "1.32.0" 20597 + } 20598 + }, 20599 + "node_modules/vitest/node_modules/lightningcss-android-arm64": { 20600 + "version": "1.32.0", 20601 + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", 20602 + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", 20603 + "cpu": [ 20604 + "arm64" 20605 + ], 20606 + "dev": true, 20607 + "license": "MPL-2.0", 20608 + "optional": true, 20609 + "os": [ 20610 + "android" 20611 + ], 20612 + "engines": { 20613 + "node": ">= 12.0.0" 20614 + }, 20615 + "funding": { 20616 + "type": "opencollective", 20617 + "url": "https://opencollective.com/parcel" 20618 + } 20619 + }, 20620 + "node_modules/vitest/node_modules/lightningcss-darwin-arm64": { 20621 + "version": "1.32.0", 20622 + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", 20623 + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", 20624 + "cpu": [ 20625 + "arm64" 20626 + ], 20627 + "dev": true, 20628 + "license": "MPL-2.0", 20629 + "optional": true, 20630 + "os": [ 20631 + "darwin" 20632 + ], 20633 + "engines": { 20634 + "node": ">= 12.0.0" 20635 + }, 20636 + "funding": { 20637 + "type": "opencollective", 20638 + "url": "https://opencollective.com/parcel" 20639 + } 20640 + }, 20641 + "node_modules/vitest/node_modules/lightningcss-darwin-x64": { 20642 + "version": "1.32.0", 20643 + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", 20644 + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", 20645 + "cpu": [ 20646 + "x64" 20647 + ], 20648 + "dev": true, 20649 + "license": "MPL-2.0", 20650 + "optional": true, 20651 + "os": [ 20652 + "darwin" 20653 + ], 20654 + "engines": { 20655 + "node": ">= 12.0.0" 20656 + }, 20657 + "funding": { 20658 + "type": "opencollective", 20659 + "url": "https://opencollective.com/parcel" 20660 + } 20661 + }, 20662 + "node_modules/vitest/node_modules/lightningcss-freebsd-x64": { 20663 + "version": "1.32.0", 20664 + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", 20665 + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", 20666 + "cpu": [ 20667 + "x64" 20668 + ], 20669 + "dev": true, 20670 + "license": "MPL-2.0", 20671 + "optional": true, 20672 + "os": [ 20673 + "freebsd" 20674 + ], 20675 + "engines": { 20676 + "node": ">= 12.0.0" 20677 + }, 20678 + "funding": { 20679 + "type": "opencollective", 20680 + "url": "https://opencollective.com/parcel" 20681 + } 20682 + }, 20683 + "node_modules/vitest/node_modules/lightningcss-linux-arm-gnueabihf": { 20684 + "version": "1.32.0", 20685 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", 20686 + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", 20687 + "cpu": [ 20688 + "arm" 20689 + ], 20690 + "dev": true, 20691 + "license": "MPL-2.0", 20692 + "optional": true, 20693 + "os": [ 20694 + "linux" 20695 + ], 20696 + "engines": { 20697 + "node": ">= 12.0.0" 20698 + }, 20699 + "funding": { 20700 + "type": "opencollective", 20701 + "url": "https://opencollective.com/parcel" 20702 + } 20703 + }, 20704 + "node_modules/vitest/node_modules/lightningcss-linux-arm64-gnu": { 20705 + "version": "1.32.0", 20706 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", 20707 + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", 20708 + "cpu": [ 20709 + "arm64" 20710 + ], 20711 + "dev": true, 20712 + "license": "MPL-2.0", 20713 + "optional": true, 20714 + "os": [ 20715 + "linux" 20716 + ], 20717 + "engines": { 20718 + "node": ">= 12.0.0" 20719 + }, 20720 + "funding": { 20721 + "type": "opencollective", 20722 + "url": "https://opencollective.com/parcel" 20723 + } 20724 + }, 20725 + "node_modules/vitest/node_modules/lightningcss-linux-arm64-musl": { 20726 + "version": "1.32.0", 20727 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", 20728 + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", 20729 + "cpu": [ 20730 + "arm64" 20731 + ], 20732 + "dev": true, 20733 + "license": "MPL-2.0", 20734 + "optional": true, 20735 + "os": [ 20736 + "linux" 20737 + ], 20738 + "engines": { 20739 + "node": ">= 12.0.0" 20740 + }, 20741 + "funding": { 20742 + "type": "opencollective", 20743 + "url": "https://opencollective.com/parcel" 20744 + } 20745 + }, 20746 + "node_modules/vitest/node_modules/lightningcss-linux-x64-gnu": { 20747 + "version": "1.32.0", 20748 + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", 20749 + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", 20750 + "cpu": [ 20751 + "x64" 20752 + ], 20753 + "dev": true, 20754 + "license": "MPL-2.0", 20755 + "optional": true, 20756 + "os": [ 20757 + "linux" 20758 + ], 20759 + "engines": { 20760 + "node": ">= 12.0.0" 20761 + }, 20762 + "funding": { 20763 + "type": "opencollective", 20764 + "url": "https://opencollective.com/parcel" 20765 + } 20766 + }, 20767 + "node_modules/vitest/node_modules/lightningcss-linux-x64-musl": { 20768 + "version": "1.32.0", 20769 + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", 20770 + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", 20771 + "cpu": [ 20772 + "x64" 20773 + ], 20774 + "dev": true, 20775 + "license": "MPL-2.0", 20776 + "optional": true, 20777 + "os": [ 20778 + "linux" 20779 + ], 20780 + "engines": { 20781 + "node": ">= 12.0.0" 20782 + }, 20783 + "funding": { 20784 + "type": "opencollective", 20785 + "url": "https://opencollective.com/parcel" 20786 + } 20787 + }, 20788 + "node_modules/vitest/node_modules/lightningcss-win32-arm64-msvc": { 20789 + "version": "1.32.0", 20790 + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", 20791 + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", 20792 + "cpu": [ 20793 + "arm64" 20794 + ], 20795 + "dev": true, 20796 + "license": "MPL-2.0", 20797 + "optional": true, 20798 + "os": [ 20799 + "win32" 20800 + ], 20801 + "engines": { 20802 + "node": ">= 12.0.0" 20803 + }, 20804 + "funding": { 20805 + "type": "opencollective", 20806 + "url": "https://opencollective.com/parcel" 20807 + } 20808 + }, 20809 + "node_modules/vitest/node_modules/lightningcss-win32-x64-msvc": { 20810 + "version": "1.32.0", 20811 + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", 20812 + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", 20813 + "cpu": [ 20814 + "x64" 20815 + ], 20816 + "dev": true, 20817 + "license": "MPL-2.0", 20818 + "optional": true, 20819 + "os": [ 20820 + "win32" 20821 + ], 20822 + "engines": { 20823 + "node": ">= 12.0.0" 20824 + }, 20825 + "funding": { 20826 + "type": "opencollective", 20827 + "url": "https://opencollective.com/parcel" 20828 + } 20829 + }, 20830 + "node_modules/vitest/node_modules/picomatch": { 20831 + "version": "4.0.3", 20832 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", 20833 + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", 20834 + "dev": true, 20835 + "license": "MIT", 20836 + "engines": { 20837 + "node": ">=12" 20838 + }, 20839 + "funding": { 20840 + "url": "https://github.com/sponsors/jonschlinkert" 20841 + } 20842 + }, 20843 + "node_modules/vitest/node_modules/vite": { 20844 + "version": "8.0.0", 20845 + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.0.tgz", 20846 + "integrity": "sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==", 20847 + "dev": true, 20848 + "license": "MIT", 20849 + "dependencies": { 20850 + "@oxc-project/runtime": "0.115.0", 20851 + "lightningcss": "^1.32.0", 20852 + "picomatch": "^4.0.3", 20853 + "postcss": "^8.5.8", 20854 + "rolldown": "1.0.0-rc.9", 20855 + "tinyglobby": "^0.2.15" 20856 + }, 20857 + "bin": { 20858 + "vite": "bin/vite.js" 20859 + }, 20860 + "engines": { 20861 + "node": "^20.19.0 || >=22.12.0" 20862 + }, 20863 + "funding": { 20864 + "url": "https://github.com/vitejs/vite?sponsor=1" 20865 + }, 20866 + "optionalDependencies": { 20867 + "fsevents": "~2.3.3" 20868 + }, 20869 + "peerDependencies": { 20870 + "@types/node": "^20.19.0 || >=22.12.0", 20871 + "@vitejs/devtools": "^0.0.0-alpha.31", 20872 + "esbuild": "^0.27.0", 20873 + "jiti": ">=1.21.0", 20874 + "less": "^4.0.0", 20875 + "sass": "^1.70.0", 20876 + "sass-embedded": "^1.70.0", 20877 + "stylus": ">=0.54.8", 20878 + "sugarss": "^5.0.0", 20879 + "terser": "^5.16.0", 20880 + "tsx": "^4.8.1", 20881 + "yaml": "^2.4.2" 20882 + }, 20883 + "peerDependenciesMeta": { 20884 + "@types/node": { 20885 + "optional": true 20886 + }, 20887 + "@vitejs/devtools": { 20888 + "optional": true 20889 + }, 20890 + "esbuild": { 20891 + "optional": true 20892 + }, 20893 + "jiti": { 20894 + "optional": true 20895 + }, 20896 + "less": { 20897 + "optional": true 20898 + }, 20899 + "sass": { 20900 + "optional": true 20901 + }, 20902 + "sass-embedded": { 20903 + "optional": true 20904 + }, 20905 + "stylus": { 20906 + "optional": true 20907 + }, 20908 + "sugarss": { 20909 + "optional": true 20910 + }, 20911 + "terser": { 20912 + "optional": true 20913 + }, 20914 + "tsx": { 20915 + "optional": true 20916 + }, 20917 + "yaml": { 20918 + "optional": true 20919 + } 20920 + } 20921 + }, 13880 20922 "node_modules/vlc-client": { 13881 20923 "version": "1.1.1", 13882 20924 "resolved": "https://registry.npmjs.org/vlc-client/-/vlc-client-1.1.1.tgz", ··· 13889 20931 "version": "3.0.1", 13890 20932 "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 13891 20933 "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 20934 + }, 20935 + "node_modules/webpack-virtual-modules": { 20936 + "version": "0.6.2", 20937 + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", 20938 + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", 20939 + "dev": true, 20940 + "license": "MIT" 13892 20941 }, 13893 20942 "node_modules/whatwg-url": { 13894 20943 "version": "5.0.0", ··· 13973 21022 "url": "https://github.com/sponsors/ljharb" 13974 21023 } 13975 21024 }, 21025 + "node_modules/why-is-node-running": { 21026 + "version": "2.3.0", 21027 + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", 21028 + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", 21029 + "dev": true, 21030 + "license": "MIT", 21031 + "dependencies": { 21032 + "siginfo": "^2.0.0", 21033 + "stackback": "0.0.2" 21034 + }, 21035 + "bin": { 21036 + "why-is-node-running": "cli.js" 21037 + }, 21038 + "engines": { 21039 + "node": ">=8" 21040 + } 21041 + }, 13976 21042 "node_modules/with-local-tmp-dir": { 13977 21043 "version": "6.0.0", 13978 21044 "resolved": "https://registry.npmjs.org/with-local-tmp-dir/-/with-local-tmp-dir-6.0.0.tgz", ··· 14170 21236 } 14171 21237 } 14172 21238 }, 21239 + "node_modules/wsl-utils": { 21240 + "version": "0.1.0", 21241 + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", 21242 + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", 21243 + "dev": true, 21244 + "license": "MIT", 21245 + "dependencies": { 21246 + "is-wsl": "^3.1.0" 21247 + }, 21248 + "engines": { 21249 + "node": ">=18" 21250 + }, 21251 + "funding": { 21252 + "url": "https://github.com/sponsors/sindresorhus" 21253 + } 21254 + }, 21255 + "node_modules/wsl-utils/node_modules/is-wsl": { 21256 + "version": "3.1.1", 21257 + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", 21258 + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", 21259 + "dev": true, 21260 + "license": "MIT", 21261 + "dependencies": { 21262 + "is-inside-container": "^1.0.0" 21263 + }, 21264 + "engines": { 21265 + "node": ">=16" 21266 + }, 21267 + "funding": { 21268 + "url": "https://github.com/sponsors/sindresorhus" 21269 + } 21270 + }, 14173 21271 "node_modules/xml2js": { 14174 21272 "version": "0.6.1", 14175 21273 "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.1.tgz", ··· 14203 21301 "version": "3.1.1", 14204 21302 "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 14205 21303 "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 14206 - "dev": true 21304 + "dev": true, 21305 + "license": "ISC" 14207 21306 }, 14208 21307 "node_modules/yaml": { 14209 21308 "version": "2.6.0", ··· 14302 21401 "node": ">=8" 14303 21402 } 14304 21403 }, 21404 + "node_modules/yarn.lock": { 21405 + "version": "0.0.1-security", 21406 + "resolved": "https://registry.npmjs.org/yarn.lock/-/yarn.lock-0.0.1-security.tgz", 21407 + "integrity": "sha512-ZRX6v5zGCJMI1T2aO+BQxJggy1vvorXEwonQhWXIC+brO7lkDB3zWelVNAti183ddH6FmJP8z4UDCJnJlioK4Q==" 21408 + }, 14305 21409 "node_modules/yocto-queue": { 14306 21410 "version": "0.1.0", 14307 21411 "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", ··· 14379 21483 }, 14380 21484 "peerDependencies": { 14381 21485 "zod": "^3.18.0" 21486 + } 21487 + }, 21488 + "node_modules/zwitch": { 21489 + "version": "2.0.4", 21490 + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", 21491 + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", 21492 + "license": "MIT", 21493 + "funding": { 21494 + "type": "github", 21495 + "url": "https://github.com/sponsors/wooorm" 14382 21496 } 14383 21497 } 14384 21498 }
+24 -3
package.json
··· 22 22 "docs:netlify": "npm run -s docs:install && npm run -s docs:build", 23 23 "postinstall": "patch-package", 24 24 "install:parallel": "concurrently --kill-others-on-fail --names app,docs \"npm ci --no-audit\" \"npm run docs:install\"", 25 - "cliff": "git-cliff --unreleased" 25 + "cliff": "git-cliff --unreleased", 26 + "storybook": "storybook dev -p 6006", 27 + "build-storybook": "storybook build" 26 28 }, 27 29 "exports": { 28 30 ".": { ··· 51 53 "@atproto/api": "^0.18.0", 52 54 "@atproto/oauth-client-node": "^0.3.10", 53 55 "@awaitjs/express": "^0.6.3", 56 + "@chakra-ui/react": "^3.34.0", 54 57 "@curvenote/ansi-to-react": "^7.0.0", 55 58 "@donedeal0/superdiff": "^1.1.1", 59 + "@emotion/react": "^11.14.0", 56 60 "@ewanc26/tid": "^1.0.2", 57 61 "@fortawesome/fontawesome-svg-core": "^6.4.2", 58 62 "@fortawesome/free-solid-svg-icons": "^6.4.2", ··· 109 113 "jest-diff": "^30.2.0", 110 114 "json5": "^2.2.3", 111 115 "jsondiffpatch": "^0.7.3", 116 + "jsondiffpatch-react": "^1.0.8", 112 117 "keyv": "^5.5.0", 113 118 "kodi-api": "^0.2.1", 114 119 "lastfm-ts-api": "^2.6.0", ··· 117 122 "mpd-api": "^1.1.2", 118 123 "musicbrainz-api": "^0.27.0", 119 124 "nanoid": "^3.3.1", 125 + "next-themes": "^0.4.6", 120 126 "node-object-hash": "^3.1.1", 121 127 "normalize-url": "^8.0.1", 122 128 "ntfy": "^1.7.6", ··· 129 135 "prom-client": "^15.1.3", 130 136 "react": "^18.2.0", 131 137 "react-dom": "^18.2.0", 138 + "react-error-boundary": "^6.1.1", 139 + "react-icons": "^5.6.0", 132 140 "react-redux": "^8.1.2", 133 141 "react-router-dom": "^6.15.0", 134 142 "round-robin-js": "^3.0.10", 135 143 "sass": "^1.93.3", 136 144 "serialize-error": "^13.0.1", 145 + "shiki": "^4.0.2", 137 146 "spotify-web-api-node": "^5.0.2", 138 147 "superagent": "^8.0.9", 139 148 "tailwindcss": "^4.1.16", ··· 150 159 "youtubei.js": "^15.0.1" 151 160 }, 152 161 "devDependencies": { 162 + "@chromatic-com/storybook": "^5.0.1", 153 163 "@dbus-types/notifications": "^0.0.5", 154 164 "@eslint/js": "^8.56.0", 155 165 "@faker-js/faker": "^9.0.1", 156 166 "@gr2m/net-interceptor": "^1.0.0", 157 167 "@istanbuljs/nyc-config-typescript": "^1.0.2", 168 + "@storybook/addon-a11y": "10.1.11", 169 + "@storybook/addon-docs": "10.1.11", 170 + "@storybook/addon-onboarding": "10.1.11", 171 + "@storybook/addon-vitest": "10.1.11", 172 + "@storybook/react-vite": "10.1.11", 158 173 "@testing-library/jest-dom": "^5.17.0", 159 174 "@testing-library/react": "^13.4.0", 160 175 "@testing-library/user-event": "^13.5.0", ··· 171 186 "@types/jest": "^27.5.2", 172 187 "@types/jscodeshift": "^0.11.6", 173 188 "@types/mocha": "^9.1.0", 174 - "@types/node": "^18.0.0", 189 + "@types/node": "^20.19.2", 175 190 "@types/object-hash": "^3.0.0", 176 191 "@types/passport": "^1.0.12", 177 192 "@types/react": "^18.2.18", ··· 182 197 "@types/superagent": "^8.1.9", 183 198 "@types/xml2js": "^0.4.11", 184 199 "@vitejs/plugin-react": "^4.2.1", 200 + "@vitest/browser-playwright": "^4.1.0", 201 + "@vitest/coverage-v8": "^4.1.0", 185 202 "chai": "^4.3.6", 186 203 "chai-as-promised": "^7.1.1", 187 204 "eslint": "^8.56.0", 188 205 "eslint-plugin-prefer-arrow-functions": "^3.2.4", 206 + "eslint-plugin-storybook": "10.1.11", 189 207 "git-cliff": "^2.12.0", 190 208 "mocha": "^10.3.0", 191 209 "mockdate": "^3.0.5", 192 210 "msw": "^2.12.10", 193 211 "nodemon": "^3.0.3", 212 + "playwright": "^1.58.2", 194 213 "sinon": "^21.0.2", 214 + "storybook": "^10.2.0", 195 215 "ts-essentials": "^9.1.2", 196 - "typescript": "5.5.4", 216 + "typescript": "^5.9.3", 197 217 "typescript-eslint": "^7.0.1", 198 218 "vite": "^5.2.12", 219 + "vitest": "^4.1.0", 199 220 "with-local-tmp-dir": "^6.0.0" 200 221 }, 201 222 "browserslist": {
+1 -1
src/backend/common/AbstractComponent.ts
··· 27 27 import { hashObject } from "../utils/StringUtils.js"; 28 28 import { metaInvariantTransform, playContentInvariantTransform } from "../utils/PlayComparisonUtils.js"; 29 29 import { MSCache } from "./Cache.js"; 30 - import { jdiff } from "../utils/DataUtils.js"; 30 + import { jdiff } from "../../core/DataUtils.js"; 31 31 import ConsoleFormatter from "jsondiffpatch/formatters/console"; 32 32 33 33 const console = new ConsoleFormatter();
+1 -1
src/backend/common/Cache.ts
··· 13 13 import { projectDir } from './index.js'; 14 14 import path from 'path'; 15 15 import { cacheFunctions } from "@foxxmd/regex-buddy-core"; 16 - import { fileOrDirectoryIsWriteable } from '../utils.js'; 16 + import { fileOrDirectoryIsWriteable } from '../utils/FSUtils.js'; 17 17 import { asCacheAuthProvider, asCacheMetadataProvider, asCacheScrobbleProvider, CacheAuthProvider, CacheConfig, CacheConfigOptions, CacheMetadataProvider, CacheProvider, CacheScrobbleProvider } from './infrastructure/Atomic.js'; 18 18 import { Typeson } from 'typeson'; 19 19 import { builtin } from 'typeson-registry';
-12
src/backend/common/infrastructure/Atomic.ts
··· 184 184 export type ExpressResponse = Response<any, Record<string, any>>; 185 185 export type ExpressHandler = (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => Promise<void | Response<any, Record<string, any>>> 186 186 187 - export interface numberFormatOptions { 188 - toFixed: number, 189 - defaultVal?: any, 190 - prefix?: string, 191 - suffix?: string, 192 - round?: { 193 - type?: string, 194 - enable: boolean, 195 - indicate?: boolean, 196 - } 197 - } 198 - 199 187 export const DELIMITERS = [',','&','/','\\']; 200 188 export const DELIMITERS_NO_AMP = [',','/','\\']; 201 189 export const DELIMETERS_REGEX: RegExp = new RegExp(/[,&\/\\]/);
+2 -1
src/backend/common/vendor/LastfmApiClient.ts
··· 1 1 import dayjs, { Dayjs, ManipulateType } from "dayjs"; 2 2 import { BrainzMeta, PlayObject, PlayObjectLifecycleless, ScrobbleActionResult, UnixTimestamp, URLData, Writeable } from "../../../core/Atomic.js"; 3 3 import { nonEmptyStringOrDefault, splitByFirstFound } from "../../../core/StringUtils.js"; 4 - import { removeUndefinedKeys, sleep, writeFile } from "../../utils.js"; 4 + import { removeUndefinedKeys, sleep } from "../../utils.js"; 5 + import { writeFile } from '../../utils/FSUtils.js'; 5 6 import { objectIsEmpty, readJson } from '../../utils/DataUtils.js'; 6 7 import { isPortReachableConnect, joinedUrl, normalizeWebAddress } from "../../utils/NetworkUtils.js"; 7 8 import { getScrobbleTsSOCDate } from "../../utils/TimeUtils.js";
+1 -1
src/backend/common/vendor/ListenbrainzApiClient.ts
··· 4 4 import { BrainzMeta, PlayObject, PlayObjectLifecycleless, ScrobbleActionResult, UnixTimestamp, URLData } from "../../../core/Atomic.js"; 5 5 import { combinePartsToString, slice } from "../../../core/StringUtils.js"; 6 6 import { 7 - findDelimiters, 8 7 normalizeListenbrainzUrl, 9 8 normalizeStr, 10 9 parseArtistCredits, ··· 12 11 parseTrackCredits, 13 12 uniqueNormalizedStrArr, 14 13 } from "../../utils/StringUtils.js"; 14 + import { findDelimiters } from "../../../core/StringUtils.js"; 15 15 import { getScrobbleTsSOCDate } from "../../utils/TimeUtils.js"; 16 16 import { UpstreamError } from "../errors/UpstreamError.js"; 17 17 import { AbstractApiOptions, DEFAULT_RETRY_MULTIPLIER, DELIMITERS, FormatPlayObjectOptions, PagelessListensTimeRangeOptions, PagelessTimeRangeListens, PagelessTimeRangeListensResult } from "../infrastructure/Atomic.js";
+1 -1
src/backend/scrobblers/AbstractScrobbleClient.ts
··· 52 52 hasAcceptableTemporalAccuracy, 53 53 temporalAccuracyToString, 54 54 temporalPlayComparisonSummary, 55 - todayAwareFormat, 56 55 } from "../utils/TimeUtils.js"; 56 + import { todayAwareFormat } from "../../core/TimeUtils.js"; 57 57 import { WebhookPayload } from "../common/infrastructure/config/health/webhooks.js"; 58 58 import { AsyncTask, SimpleIntervalJob, Task, ToadScheduler } from "toad-scheduler"; 59 59 import { getRoot } from "../ioc.js";
+2 -1
src/backend/server/api.ts
··· 21 21 import AbstractScrobbleClient from "../scrobblers/AbstractScrobbleClient.js"; 22 22 import AbstractSource from "../sources/AbstractSource.js"; 23 23 import MemorySource from "../sources/MemorySource.js"; 24 - import { parseBool, sortByNewestPlayDate } from "../utils.js"; 24 + import { parseBool } from "../utils.js"; 25 + import { sortByNewestPlayDate } from '../../core/PlayUtils.js'; 25 26 import { setupAuthRoutes } from "./auth.js"; 26 27 import { setupDeezerRoutes } from "./deezerRoutes.js"; 27 28 import {setupLZEndpointRoutes} from "./endpointListenbrainzRoutes.js";
-3
src/backend/server/middleware.ts
··· 4 4 export const makeSourceCheckMiddle = (sources: any) => (required: boolean ): ExpressHandler => (req: any, res: any, next: any) => { 5 5 const { 6 6 query: { 7 - // @ts-expect-error TS(2525): Initializer provides no value for this binding ele... Remove this comment to see the full error message 8 7 name, 9 - // @ts-expect-error TS(2525): Initializer provides no value for this binding ele... Remove this comment to see the full error message 10 8 type 11 9 } = {} 12 10 } = req; ··· 30 28 export const makeClientCheckMiddle = (clients: any) => (required: boolean): ExpressHandler => (req: any, res: any, next: any) => { 31 29 const { 32 30 query: { 33 - // @ts-expect-error TS(2525): Initializer provides no value for this binding ele... Remove this comment to see the full error message 34 31 name 35 32 } = {} 36 33 } = req;
+4 -3
src/backend/sources/AbstractSource.ts
··· 24 24 import TupleMap from "../common/TupleMap.js"; 25 25 import { 26 26 difference, 27 - formatNumber, 28 27 genGroupId, 29 28 isDebugMode, 30 29 playObjDataMatch, 31 30 pollingBackoff, 32 31 sleep, 33 - sortByNewestPlayDate, 34 32 sortByOldestPlayDate, 35 33 } from "../utils.js"; 36 - import { timeToHumanTimestamp, todayAwareFormat } from "../utils/TimeUtils.js"; 34 + import { sortByNewestPlayDate } from '../../core/PlayUtils.js'; 35 + import { formatNumber } from '../../core/DataUtils.js'; 36 + import { timeToHumanTimestamp } from "../utils/TimeUtils.js"; 37 + import { todayAwareFormat } from "../../core/TimeUtils.js"; 37 38 import { getRoot } from '../ioc.js'; 38 39 import { componentFileLogger } from '../common/logging.js'; 39 40 import { WebhookPayload } from '../common/infrastructure/config/health/webhooks.js';
+2 -1
src/backend/sources/ChromecastSource.ts
··· 30 30 PlatformApplicationWithContext, 31 31 PlatformType 32 32 } from "../common/vendor/chromecast/interfaces.js"; 33 - import { difference, genGroupIdStr, isDebugMode, parseBool } from "../utils.js"; 33 + import { difference, isDebugMode, parseBool } from "../utils.js"; 34 + import { genGroupIdStr } from '../../core/PlayUtils.js'; 34 35 import { findCauseByReference } from "../utils/ErrorUtils.js"; 35 36 import { discoveryAvahi, discoveryNative } from "../utils/MDNSUtils.js"; 36 37 import { RecentlyPlayedOptions } from "./AbstractSource.js";
+2 -10
src/backend/sources/DeezerSource.ts
··· 6 6 import { PlayObject, PlayObjectLifecycleless } from "../../core/Atomic.js"; 7 7 import { DEFAULT_RETRY_MULTIPLIER, FormatPlayObjectOptions, InternalConfig } from "../common/infrastructure/Atomic.js"; 8 8 import { DeezerSourceConfig } from "../common/infrastructure/config/source/deezer.js"; 9 - import { parseRetryAfterSecsFromObj, sleep, sortByOldestPlayDate, writeFile, } from "../utils.js"; 9 + import { parseRetryAfterSecsFromObj, sleep, sortByOldestPlayDate, } from "../utils.js"; 10 + import { writeFile } from '../utils/FSUtils.js'; 10 11 import { readJson } from '../utils/DataUtils.js'; 11 12 import { joinedUrl } from "../utils/NetworkUtils.js"; 12 13 import AbstractSource, { RecentlyPlayedOptions } from "./AbstractSource.js"; ··· 61 62 const { 62 63 title: name, 63 64 artist: { 64 - // @ts-expect-error TS(2525): Initializer provides no value for this binding ele... Remove this comment to see the full error message 65 65 name: artistName, 66 66 } = {}, 67 67 duration, ··· 69 69 id, 70 70 link, 71 71 album: { 72 - // @ts-expect-error TS(2525): Initializer provides no value for this binding ele... Remove this comment to see the full error message 73 72 title: albumName, 74 73 } = {}, 75 74 } = obj; ··· 162 161 const { 163 162 body = {}, 164 163 body: { 165 - // @ts-expect-error TS(2525): Initializer provides no value for this binding ele... Remove this comment to see the full error message 166 164 error, 167 165 } = {} 168 166 } = resp; ··· 187 185 const { 188 186 message, 189 187 response: { 190 - // @ts-expect-error TS(2525): Initializer provides no value for this binding ele... Remove this comment to see the full error message 191 188 status, 192 189 body: { 193 190 "subsonic-response": { 194 - // @ts-expect-error TS(2525): Initializer provides no value for this binding ele... Remove this comment to see the full error message 195 191 status: ssStatus, 196 192 error: { 197 - // @ts-expect-error TS(2525): Initializer provides no value for this binding ele... Remove this comment to see the full error message 198 193 code, 199 - // @ts-expect-error TS(2525): Initializer provides no value for this binding ele... Remove this comment to see the full error message 200 194 message: ssMessage, 201 195 } = {}, 202 196 } = {}, 203 - // @ts-expect-error TS(2525): Initializer provides no value for this binding ele... Remove this comment to see the full error message 204 197 "subsonic-response": ssResp 205 198 } = {}, 206 - // @ts-expect-error TS(2525): Initializer provides no value for this binding ele... Remove this comment to see the full error message 207 199 text, 208 200 } = {}, 209 201 response,
+2 -1
src/backend/sources/JellyfinApiSource.ts
··· 55 55 PlayPlatformId, REPORTED_PLAYER_STATUSES 56 56 } from "../common/infrastructure/Atomic.js"; 57 57 import { JellyApiSourceConfig } from "../common/infrastructure/config/source/jellyfin.js"; 58 - import { genGroupIdStr, getPlatformIdFromData, isDebugMode, parseBool, } from "../utils.js"; 58 + import { getPlatformIdFromData, isDebugMode, parseBool, } from "../utils.js"; 59 + import { genGroupIdStr } from '../../core/PlayUtils.js'; 59 60 import { joinedUrl } from "../utils/NetworkUtils.js"; 60 61 import { hashObject, parseArrayFromMaybeString } from "../utils/StringUtils.js"; 61 62 import { MemoryPositionalSource } from "./MemoryPositionalSource.js";
+2 -2
src/backend/sources/MemorySource.ts
··· 13 13 import { SourceType, SourceConfig } from '../common/infrastructure/config/source/sources.js'; 14 14 import { PollingOptions } from "../common/infrastructure/config/common.js"; 15 15 import { 16 - formatNumber, 17 16 genGroupId, 18 - genGroupIdStr, 19 17 getPlatformIdFromData, 20 18 isDebugMode, 21 19 playObjDataMatch, 22 20 thresholdResultSummary, 23 21 } from "../utils.js"; 22 + import { genGroupIdStr } from '../../core/PlayUtils.js'; 23 + import { formatNumber } from '../../core/DataUtils.js'; 24 24 import { timePassesScrobbleThreshold, timeToHumanTimestamp } from "../utils/TimeUtils.js"; 25 25 import { PromisePool } from "@supercharge/promise-pool"; 26 26 import AbstractSource from "./AbstractSource.js";
+5 -2
src/backend/sources/PlayerState/AbstractPlayerState.ts
··· 13 13 ReportedPlayerStatus, 14 14 } from "../../common/infrastructure/Atomic.js"; 15 15 import { PollingOptions } from "../../common/infrastructure/config/common.js"; 16 - import { formatNumber, genGroupIdStr, playObjDataMatch, progressBar } from "../../utils.js"; 16 + import { playObjDataMatch, progressBar } from "../../utils.js"; 17 + import { genGroupIdStr } from '../../../core/PlayUtils.js'; 18 + import { formatNumber } from '../../../core/DataUtils.js'; 17 19 import { ListenProgress } from "./ListenProgress.js"; 18 20 import { ListenRange, ListenRangePositional } from "./ListenRange.js"; 19 - import { closeToPlayEnd, closeToPlayStart, repeatDurationPlayed, timeToHumanTimestamp, todayAwareFormat } from "../../utils/TimeUtils.js"; 21 + import { closeToPlayEnd, closeToPlayStart, repeatDurationPlayed, timeToHumanTimestamp } from "../../utils/TimeUtils.js"; 22 + import { todayAwareFormat } from "../../../core/TimeUtils.js"; 20 23 21 24 export interface PlayerStateIntervals { 22 25 staleInterval?: number
+2 -1
src/backend/sources/PlexApiSource.ts
··· 11 11 PlayerStateDataMaybePlay, 12 12 PlayPlatformId, REPORTED_PLAYER_STATUSES 13 13 } from "../common/infrastructure/Atomic.js"; 14 - import { genGroupIdStr, getFirstNonEmptyString, getPlatformIdFromData, isDebugMode, parseBool, } from "../utils.js"; 14 + import { getFirstNonEmptyString, getPlatformIdFromData, isDebugMode, parseBool, } from "../utils.js"; 15 + import { genGroupIdStr } from '../../core/PlayUtils.js'; 15 16 import { buildStatePlayerPlayIdententifyingInfo, hashObject, parseArrayFromMaybeString } from "../utils/StringUtils.js"; 16 17 import { GetSessionsMetadata } from "@lukehagar/plexjs/sdk/models/operations/getsessions.js"; 17 18 import { PlexAPI, HTTPClient, Fetcher } from "@lukehagar/plexjs";
+1 -1
src/backend/sources/SpotifySource.ts
··· 25 25 parseRetryAfterSecsFromObj, 26 26 sleep, 27 27 sortByOldestPlayDate, 28 - writeFile, 29 28 } from "../utils.js"; 29 + import { writeFile } from '../utils/FSUtils.js'; 30 30 import { readJson } from '../utils/DataUtils.js'; 31 31 import { findCauseByFunc } from "../utils/ErrorUtils.js"; 32 32 import { joinedUrl } from "../utils/NetworkUtils.js";
+3 -2
src/backend/sources/YTMusicSource.ts
··· 6 6 import { Innertube, UniversalCache, Parser, YTNodes, ApiResponse, IBrowseResponse, Log, SessionOptions } from 'youtubei.js'; 7 7 import { GenerateAuthUrlOpts, OAuth2Client } from 'google-auth-library'; 8 8 import {resolve} from 'path'; 9 - import { formatNumber, isDebugMode, parseBool, sleep } from "../utils.js"; 9 + import { isDebugMode, parseBool, sleep } from "../utils.js"; 10 + import { formatNumber } from '../../core/DataUtils.js'; 10 11 import { 11 12 getPlaysDiff, 12 13 humanReadableDiff, ··· 19 20 import AbstractSource, { RecentlyPlayedOptions } from "./AbstractSource.js"; 20 21 import { buildTrackString, truncateStringToLength } from "../../core/StringUtils.js"; 21 22 import { joinedUrl } from "../utils/NetworkUtils.js"; 22 - import { todayAwareFormat } from "../utils/TimeUtils.js"; 23 + import { todayAwareFormat } from "../../core/TimeUtils.js"; 23 24 import { parseArrayFromMaybeString, parseArtistCredits, parseCredits } from "../utils/StringUtils.js"; 24 25 import { baseFormatPlayObj } from "../utils/PlayTransformUtils.js"; 25 26
+1 -1
src/backend/tests/cache/cache.test.ts
··· 6 6 import withLocalTmpDir from 'with-local-tmp-dir'; 7 7 import path from 'path'; 8 8 import { initFileCache, initMemoryCache, initValkeyCache, MSCache } from "../../common/Cache.js"; 9 - import { generatePlay, generatePlayerStateData, generatePlays, normalizePlays } from "../utils/PlayTestUtils.js"; 9 + import { generatePlay, generatePlayerStateData, generatePlays, normalizePlays } from "../../../core/PlayTestUtils.js"; 10 10 import { ListenProgressPositional, ListenProgressTS } from "../../sources/PlayerState/ListenProgress.js"; 11 11 import { isPortReachableConnect } from "../../utils/NetworkUtils.js"; 12 12 import { getRoot } from "../../ioc.js";
+1 -1
src/backend/tests/component/transformers.test.ts
··· 7 7 import { ConditionalSearchAndReplaceRegExp, STAGE_TYPES, STAGE_TYPES_METADATA, STAGE_TYPES_USER, TRANSFORM_HOOK } from "../../common/infrastructure/Transform.js"; 8 8 9 9 import { isConditionalSearchAndReplace } from "../../utils/PlayTransformUtils.js"; 10 - import { asPlays, generateArtistsStr, generatePlay, normalizePlays } from "../utils/PlayTestUtils.js"; 10 + import { asPlays, generateArtistsStr, generatePlay, normalizePlays } from "../../../core/PlayTestUtils.js"; 11 11 import { WebhookPayload } from "../../common/infrastructure/config/health/webhooks.js"; 12 12 import { findCauseByMessage } from "../../utils/ErrorUtils.js"; 13 13 import NativeTransformer from "../../common/transforms/NativeTransformer.js";
+2 -2
src/backend/tests/jellyfin/jellyfin.test.ts
··· 5 5 import { JsonPlayObject, PlayMeta, PlayObject } from "../../../core/Atomic.js"; 6 6 7 7 import JellyfinApiSource from "../../sources/JellyfinApiSource.js"; 8 - import validSession from './validSession.json'; 8 + import validSession from './validSession.json' with { type: "json" }; 9 9 import { JellyApiData } from "../../common/infrastructure/config/source/jellyfin.js"; 10 - import { generatePlay } from "../utils/PlayTestUtils.js"; 10 + import { generatePlay } from "../../../core/PlayTestUtils.js"; 11 11 import { fakerJA } from "@faker-js/faker"; 12 12 import { 13 13 // @ts-expect-error weird typings?
+1 -1
src/backend/tests/lastfm/lastfm.test.ts
··· 1 1 import chai, { expect } from 'chai'; 2 2 import asPromised from 'chai-as-promised'; 3 3 import { after, before, describe, it } from 'mocha'; 4 - import { generateLastfmTrackObject, generateMbid, generatePlay } from "../utils/PlayTestUtils.js"; 4 + import { generateLastfmTrackObject, generateMbid, generatePlay } from "../../../core/PlayTestUtils.js"; 5 5 6 6 import LastfmApiClient, { playToClientPayload, formatPlayObj } from '../../common/vendor/LastfmApiClient.js'; 7 7 import { MockNetworkError, withRequestInterception } from '../utils/networking.js';
+1 -1
src/backend/tests/listenbrainz/listenbrainz.test.ts
··· 22 22 // incorrect mappings 23 23 import incorrectMultiArtistsTrackName from './incorrectlyMapped/multiArtistsInTrackName.json' with { type: "json" }; 24 24 import veryWrong from './incorrectlyMapped/veryWrong.json' with { type: "json" }; 25 - import { generatePlay } from "../utils/PlayTestUtils.js"; 25 + import { generatePlay } from "../../../core/PlayTestUtils.js"; 26 26 import { defaultLifecycle } from "../../utils/PlayTransformUtils.js"; 27 27 28 28 interface LZTestFixture {
+1 -1
src/backend/tests/musicbrainz/musicbrainz.test.ts
··· 12 12 import { MusicbrainzApiConfigData } from '../../common/infrastructure/Atomic.js'; 13 13 import { MockNetworkError, withRequestInterception } from '../utils/networking.js'; 14 14 import { http, HttpResponse, delay } from "msw"; 15 - import { generatePlay, withBrainz } from '../utils/PlayTestUtils.js'; 15 + import { generatePlay, withBrainz } from '../../../core/PlayTestUtils.js'; 16 16 import { intersect, missingMbidTypes } from '../../utils.js'; 17 17 import { defaultLifecycle } from '../../utils/PlayTransformUtils.js'; 18 18 import { CoverArtApiClient, CoverArtApiConfig } from '../../common/vendor/musicbrainz/CoverArtApiClient.js';
+1 -1
src/backend/tests/player/player.test.ts
··· 13 13 } from "../../common/infrastructure/Atomic.js"; 14 14 import { GenericPlayerState } from "../../sources/PlayerState/GenericPlayerState.js"; 15 15 import { playObjDataMatch } from "../../utils.js"; 16 - import { generatePlay } from "../utils/PlayTestUtils.js"; 16 + import { generatePlay } from "../../../core/PlayTestUtils.js"; 17 17 import { PositionalPlayerState } from "../../sources/PlayerState/PositionalPlayerState.js"; 18 18 import { ListenProgressPositional } from "../../sources/PlayerState/ListenProgress.js"; 19 19 import { ListenRangePositional } from "../../sources/PlayerState/ListenRange.js";
+1 -1
src/backend/tests/plays/playParsing.test.ts
··· 3 3 import asPromised from 'chai-as-promised'; 4 4 import { after, before, describe, it } from 'mocha'; 5 5 6 - import { asPlays, generateArtistsStr, generatePlay, normalizePlays } from "../utils/PlayTestUtils.js"; 6 + import { asPlays, generateArtistsStr, generatePlay, normalizePlays } from "../../../core/PlayTestUtils.js"; 7 7 import { parseArtistCredits, parseContextAwareStringList, parseCredits, parseTrackCredits, uniqueNormalizedStrArr } from "../../utils/StringUtils.js"; 8 8 import testData from '../utils/playTestData.json' with { type: "json" }; 9 9 import { intersect } from "../../utils.js";
+2 -2
src/backend/tests/plex/plex.test.ts
··· 4 4 import { describe, it } from 'mocha'; 5 5 import { JsonPlayObject, PlayMeta, PlayObject } from "../../../core/Atomic.js"; 6 6 7 - import validSessionResponse from './validSession.json'; 8 - import { generatePlay } from "../utils/PlayTestUtils.js"; 7 + import validSessionResponse from './validSession.json' with { type: "json" }; 8 + import { generatePlay } from "../../../core/PlayTestUtils.js"; 9 9 import { PlayerStateDataMaybePlay } from "../../common/infrastructure/Atomic.js"; 10 10 import { PlexApiData } from "../../common/infrastructure/config/source/plex.js"; 11 11 import PlexApiSource from "../../sources/PlexApiSource.js";
+3 -2
src/backend/tests/scrobbler/scrobblers.test.ts
··· 7 7 import { http, HttpResponse } from 'msw'; 8 8 import pEvent from 'p-event'; 9 9 import { PlayObject, SOURCE_SOT } from "../../../core/Atomic.js"; 10 - import { genGroupIdStr, sleep, sortByOldestPlayDate } from "../../utils.js"; 10 + import { sleep, sortByOldestPlayDate } from "../../utils.js"; 11 + import { genGroupIdStr } from '../../../core/PlayUtils.js'; 11 12 import mixedDuration from '../plays/mixedDuration.json' with { type: 'json' }; 12 13 import withDuration from '../plays/withDuration.json' with { type: 'json' }; 13 14 import { MockNetworkError, withRequestInterception } from "../utils/networking.js"; 14 - import { asPlays, generatePlay, generatePlayPlatformId, generatePlays, generateSourcePlayerObj, normalizePlays } from "../utils/PlayTestUtils.js"; 15 + import { asPlays, generatePlay, generatePlayPlatformId, generatePlays, generateSourcePlayerObj, normalizePlays } from "../../../core/PlayTestUtils.js"; 15 16 import MockDate from 'mockdate'; 16 17 17 18 import { NowPlayingScrobbler, TestAuthScrobbler, TestScrobbler } from "./TestScrobbler.js";
+2 -4
src/backend/tests/source/source.test.ts
··· 6 6 import pEvent from "p-event"; 7 7 import clone from 'clone'; 8 8 import { PlayObject } from "../../../core/Atomic.js"; 9 - import { generatePlay, generatePlayerStateData, generatePlays, normalizePlays } from "../utils/PlayTestUtils.js"; 9 + import { generatePlay, generatePlayerStateData, generatePlays, normalizePlays } from "../../../core/PlayTestUtils.js"; 10 10 import { TestMemoryPositionalSource, TestMemorySource, TestSource } from "./TestSource.js"; 11 - import spotifyPayload from '../plays/spotifyCurrentPlaybackState.json'; 11 + import spotifyPayload from '../plays/spotifyCurrentPlaybackState.json' with { type: "json" }; 12 12 import SpotifySource from "../../sources/SpotifySource.js"; 13 13 import MockDate from 'mockdate'; 14 14 import dayjs, { Dayjs } from "dayjs"; 15 15 import { REPORTED_PLAYER_STATUSES } from "../../common/infrastructure/Atomic.js"; 16 16 import { SourceConfig } from "../../common/infrastructure/config/source/sources.js"; 17 17 import MemorySource from "../../sources/MemorySource.js"; 18 - import { timePassesScrobbleThreshold } from "../../utils/TimeUtils.js"; 19 - import { DEFAULT_SCROBBLE_DURATION_THRESHOLD, DEFAULT_SCROBBLE_PERCENT_THRESHOLD } from "../../common/infrastructure/Atomic.js"; 20 18 import { RT_TICK_DEFAULT, setRtTick } from "../../sources/PlayerState/RealtimePlayer.js"; 21 19 import { sleep } from "../../utils.js"; 22 20 import DeezerInternalSource from "../../sources/DeezerInternalSource.js";
+1 -1
src/backend/tests/tealfm/tealfm.test.ts
··· 1 1 import chai, { expect } from 'chai'; 2 2 import asPromised from 'chai-as-promised'; 3 3 import { after, before, describe, it } from 'mocha'; 4 - import { generateLastfmTrackObject, generateMbid, generatePlay, generateTealPlayRecord } from "../utils/PlayTestUtils.js"; 4 + import { generateLastfmTrackObject, generateMbid, generatePlay, generateTealPlayRecord } from "../../../core/PlayTestUtils.js"; 5 5 import { AbstractBlueSkyApiClient, listRecordToPlay } from '../../common/vendor/bluesky/AbstractBlueSkyApiClient.js'; 6 6 import dayjs from 'dayjs'; 7 7
+1 -1
src/backend/tests/utilitiesTests/time.test.ts
··· 2 2 import { describe, it } from 'mocha'; 3 3 import { closeToPlayEnd, closeToPlayStart, repeatDurationPlayed, timePassesScrobbleThreshold } from '../../utils/TimeUtils.js'; 4 4 import { DEFAULT_CLOSE_POSITION_ABSOLUTE, DEFAULT_CLOSE_POSITION_PERCENT, DEFAULT_DURATION_REPEAT_ABSOLUTE, DEFAULT_DURATION_REPEAT_PERCENT, DEFAULT_SCROBBLE_DURATION_THRESHOLD, DEFAULT_SCROBBLE_PERCENT_THRESHOLD } from '../../common/infrastructure/Atomic.js'; 5 - import { generatePlay } from '../utils/PlayTestUtils.js'; 5 + import { generatePlay } from '../../../core/PlayTestUtils.js'; 6 6 7 7 describe('Play Position', function() { 8 8
+19 -8
src/backend/tests/utils/PlayTestUtils.ts src/core/PlayTestUtils.ts
··· 5 5 import relativeTime from "dayjs/plugin/relativeTime.js"; 6 6 import timezone from "dayjs/plugin/timezone.js"; 7 7 import utc from "dayjs/plugin/utc.js"; 8 - import { FEAT, JOINERS, JOINERS_FINAL, JsonPlayObject, MissingMbidType, ObjectPlayData, PlayMeta, PlayObject, SourcePlayerObj } from "../../../core/Atomic.js"; 9 - import { genGroupIdStr, getPlatformIdFromData, sortByNewestPlayDate } from "../../utils.js"; 10 - import { CALCULATED_PLAYER_STATUSES, NO_DEVICE, NO_USER, PlayerStateDataMaybePlay, PlayPlatformId, REPORTED_PLAYER_STATUSES, ReportedPlayerStatus, SINGLE_USER_PLATFORM_ID, SourceIdentifier } from '../../common/infrastructure/Atomic.js'; 11 - import { arrayListAnd } from '../../../core/StringUtils.js'; 12 - import { findDelimiters } from '../../utils/StringUtils.js'; 13 - import { ListRecord, ScrobbleRecord } from '../../common/infrastructure/config/client/tealfm.js'; 8 + import { FEAT, JOINERS, JOINERS_FINAL, JsonPlayObject, MissingMbidType, ObjectPlayData, PlayMeta, PlayObject, SourcePlayerObj } from "./Atomic.js"; 9 + import { genGroupIdStr } from './PlayUtils.js'; 10 + import { sortByNewestPlayDate } from './PlayUtils.js'; 11 + import { CALCULATED_PLAYER_STATUSES, NO_DEVICE, NO_USER, PlayerStateDataMaybePlay, PlayPlatformId, REPORTED_PLAYER_STATUSES, SINGLE_USER_PLATFORM_ID } from '../backend/common/infrastructure/Atomic.js'; 12 + import { arrayListAnd } from './StringUtils.js'; 13 + import { findDelimiters } from "./StringUtils.js"; 14 + import { ListRecord, ScrobbleRecord } from '../backend/common/infrastructure/config/client/tealfm.js'; 14 15 import { nanoid } from 'nanoid'; 15 - import { LastFMTrackObject } from '../../common/vendor/LastfmApiClient.js'; 16 + import { LastFMTrackObject } from '../backend/common/vendor/LastfmApiClient.js'; 16 17 import { MarkOptional } from 'ts-essentials'; 17 - import { defaultLifecycle } from '../../utils/PlayTransformUtils.js'; 18 + import { defaultLifecycle } from '../backend/utils/PlayTransformUtils.js'; 18 19 19 20 dayjs.extend(utc) 20 21 dayjs.extend(isBetween); ··· 180 181 } 181 182 } 182 183 } 184 + } 185 + 186 + export const generateJsonPlay = (...args: Parameters<typeof generatePlay>): JsonPlayObject => { 187 + const play = generatePlay(...args); 188 + return JSON.parse(JSON.stringify(play)); 189 + } 190 + 191 + export const generateJsonPlays = (...args: Parameters<typeof generatePlays>): JsonPlayObject[] => { 192 + const plays = generatePlays(...args); 193 + return JSON.parse(JSON.stringify(plays)); 183 194 } 184 195 185 196 export const withBrainz = (play: PlayObject, include: ('track' | 'artist' | 'album')[]): PlayObject => {
+1 -1
src/backend/tests/utils/playComparisons.test.ts
··· 3 3 import clone from "clone"; 4 4 import { describe, it } from 'mocha'; 5 5 import { genericSourcePlayMatch, playsAreAddedOnly, playsAreBumpedOnly, playsAreSortConsistent } from "../../utils/PlayComparisonUtils.js"; 6 - import { generatePlay, generatePlays } from "./PlayTestUtils.js"; 6 + import { generatePlay, generatePlays } from "../../../core/PlayTestUtils.js"; 7 7 import { PlayObject } from "../../../core/Atomic.js"; 8 8 9 9 const logger = loggerTest;
+1 -1
src/backend/tests/ytm/ytm.test.ts
··· 6 6 import YTMusicSource, { ytiHistoryResponseFromShelfToPlays, ytiHistoryResponseToListItems } from "../../sources/YTMusicSource.js"; 7 7 import ytHistoryRes from './ytres.json' with {type: 'json'}; 8 8 import EventEmitter from "events"; 9 - import { generatePlay, generatePlays, normalizePlays } from '../utils/PlayTestUtils.js'; 9 + import { generatePlay, generatePlays, normalizePlays } from '../../../core/PlayTestUtils.js'; 10 10 import { YTMusicSourceConfig } from '../../common/infrastructure/config/source/ytmusic.js'; 11 11 import { sleep } from '../../utils.js'; 12 12 import dayjs from 'dayjs';
+1 -134
src/backend/utils.ts
··· 4 4 import { Duration } from "dayjs/plugin/duration.js"; 5 5 import utc from 'dayjs/plugin/utc.js'; 6 6 import { Request } from "express"; 7 - import { accessSync, constants, promises } from "fs"; 8 7 // https://github.com/jfromaniello/url-join#in-nodejs 9 - import pathUtil from "path"; 10 8 import { TimeoutError, WebapiError } from "spotify-web-api-node/src/response-error.js"; 11 9 import { DEFAULT_MISSING_MBIDS_TYPES, DEFAULT_MISSING_TYPES, MissingMbidType, PlayObject } from "../core/Atomic.js"; 12 10 import { 13 11 asPlayerStateDataMaybePlay, 14 12 NO_DEVICE, 15 13 NO_USER, 16 - numberFormatOptions, 17 14 PlayerStateDataMaybePlay, 18 15 PlayPlatformId, 19 16 ProgressAwarePlayObject, ··· 21 18 RemoteIdentityParts, 22 19 ScrobbleThresholdResult, 23 20 } from "./common/infrastructure/Atomic.js"; 21 + import { genGroupIdStr } from '../core/PlayUtils.js'; 24 22 25 23 //const { default: Ajv } = AjvNS; 26 24 dayjs.extend(utc); 27 25 28 - export async function readText(path: any) { 29 - await promises.access(path, constants.R_OK); 30 - const data = await promises.readFile(path); 31 - return data.toString(); 32 - 33 - // return new Promise((resolve, reject) => { 34 - // fs.readFile(path, 'utf8', function (err, data) { 35 - // if (err) { 36 - // reject(err); 37 - // } 38 - // resolve(JSON.parse(data)); 39 - // }); 40 - // }); 41 - } 42 - 43 - export async function writeFile(path: any, text: any) { 44 - // await promises.access(path, constants.W_OK | constants.O_CREAT); 45 - try { 46 - await promises.writeFile(path, text, 'utf8'); 47 - } catch (e) { 48 - throw e; 49 - } 50 - 51 - // return new Promise((resolve, reject) => { 52 - // fs.readFile(path, 'utf8', function (err, data) { 53 - // if (err) { 54 - // reject(err); 55 - // } 56 - // resolve(JSON.parse(data)); 57 - // }); 58 - // }); 59 - } 60 - 61 - 62 26 export function sleep(ms: any) { 63 27 return new Promise(resolve => setTimeout(resolve, ms)); 64 28 } ··· 87 51 return aPlayDate.isAfter(bPlayDate) ? 1 : -1 88 52 }; 89 53 90 - /** sorts playObj formatted objects by playDate in descending (newest first) order */ 91 - export const sortByNewestPlayDate = (a: PlayObject, b: PlayObject) => { 92 - const { 93 - data: { 94 - playDate: aPlayDate 95 - } = {} 96 - } = a; 97 - const { 98 - data: { 99 - playDate: bPlayDate 100 - } = {} 101 - } = b; 102 - if(aPlayDate === undefined && bPlayDate === undefined) { 103 - return 0; 104 - } 105 - if(aPlayDate === undefined) { 106 - return 1; 107 - } 108 - if(bPlayDate === undefined) { 109 - return -1; 110 - } 111 - return aPlayDate.isBefore(bPlayDate) ? 1 : -1 112 - }; 113 - 114 54 export const setIntersection = (setA: any, setB: any) => { 115 55 const _intersection = new Set() 116 56 for (const elem of setB) { ··· 212 152 // } 213 153 const { 214 154 response: { 215 - // @ts-expect-error 216 155 headers, // returned in superagent error 217 156 } = {}, 218 157 retryAfter: ra // possible custom property we have set ··· 370 309 const groupId = genGroupId(play); 371 310 return genGroupIdStr(groupId); 372 311 }; 373 - export const genGroupIdStr = (id: PlayPlatformId) => { 374 - return `${id[0]}-${id[1]}`; 375 - } 376 312 export const genGroupId = (play: PlayObject): PlayPlatformId => [play.meta.deviceId ?? NO_DEVICE, play.meta.user ?? NO_USER]; 377 313 378 314 export const getPlatformIdFromData = (data: PlayObject | PlayerStateDataMaybePlay) => { ··· 382 318 return genGroupId(data); 383 319 } 384 320 385 - export const fileOrDirectoryIsWriteable = (location: string) => { 386 - const pathInfo = pathUtil.parse(location); 387 - const isDir = pathInfo.ext === ''; 388 - try { 389 - accessSync(location, constants.R_OK | constants.W_OK); 390 - return true; 391 - } catch (err: any) { 392 - const {code} = err; 393 - if (code === 'ENOENT') { 394 - // file doesn't exist, see if we can write to directory in which case we are good 395 - try { 396 - accessSync(pathInfo.dir, constants.R_OK | constants.W_OK) 397 - // we can write to dir 398 - return true; 399 - } catch (accessError: any) { 400 - if(accessError.code === 'EACCES') { 401 - // also can't access directory :( 402 - throw new Error(`No ${isDir ? 'directory' : 'file'} exists at ${location} and application does not have permission to write to the parent directory`); 403 - } else { 404 - throw new Error(`No ${isDir ? 'directory' : 'file'} exists at ${location} and application is unable to access the parent directory due to a system error`, {cause: accessError}); 405 - } 406 - } 407 - } else if(code === 'EACCES') { 408 - throw new Error(`${isDir ? 'Directory' : 'File'} exists at ${location} but application does not have permission to write to it.`); 409 - } else { 410 - throw new Error(`${isDir ? 'Directory' : 'File'} exists at ${location} but application is unable to access it due to a system error`, {cause: err}); 411 - } 412 - } 413 - } 414 - 415 321 export const mergeArr = (objValue: [], srcValue: []): (any[] | undefined) => { 416 322 if (Array.isArray(objValue)) { 417 323 return objValue.concat(srcValue); ··· 501 407 502 408 const bar = `[${progressText}${emptyProgressText}]${percentageText}`; 503 409 return bar; 504 - }; 505 - 506 - export const formatNumber = (val: number | string, options?: numberFormatOptions) => { 507 - const { 508 - toFixed = 2, 509 - defaultVal = null, 510 - prefix = '', 511 - suffix = '', 512 - round, 513 - } = options || {}; 514 - let parsedVal = typeof val === 'number' ? val : Number.parseFloat(val); 515 - if (Number.isNaN(parsedVal)) { 516 - return defaultVal; 517 - } 518 - if(!Number.isFinite(val)) { 519 - return 'Infinite'; 520 - } 521 - let prefixStr = prefix; 522 - const {enable = false, indicate = true, type = 'round'} = round || {}; 523 - if (enable && !Number.isInteger(parsedVal)) { 524 - switch (type) { 525 - case 'round': 526 - parsedVal = Math.round(parsedVal); 527 - break; 528 - case 'ceil': 529 - parsedVal = Math.ceil(parsedVal); 530 - break; 531 - case 'floor': 532 - parsedVal = Math.floor(parsedVal); 533 - } 534 - if (indicate) { 535 - prefixStr = `~${prefix}`; 536 - } 537 - } 538 - const localeString = parsedVal.toLocaleString(undefined, { 539 - minimumFractionDigits: toFixed, 540 - maximumFractionDigits: toFixed, 541 - }); 542 - return `${prefixStr}${localeString}${suffix}`; 543 410 }; 544 411 545 412 export const durationToNormalizedTime = (dur: Duration): { hours: number, minutes: number, seconds: number } => {
-8
src/backend/utils/DataUtils.ts
··· 1 1 import JSON5 from "json5"; 2 2 import { constants, promises } from "fs"; 3 3 import { MaybeLogger } from "../common/logging.js"; 4 - import { create as diffCreate } from 'jsondiffpatch'; 5 - 6 - export const jdiff = diffCreate({ 7 - propertyFilter(name, context) { 8 - return name !== 'lifecycle'; 9 - }, 10 - //omitRemovedValues: true 11 - }); 12 4 13 5 export const asArray = <T>(data: T | T[]): T[] => { 14 6 if (Array.isArray(data)) {
+65
src/backend/utils/FSUtils.ts
··· 1 + import { accessSync, constants } from "fs"; 2 + import { promises } from "node:fs"; 3 + import pathUtil from "path"; 4 + 5 + 6 + export async function readText(path: any) { 7 + await promises.access(path, constants.R_OK); 8 + const data = await promises.readFile(path); 9 + return data.toString(); 10 + 11 + // return new Promise((resolve, reject) => { 12 + // fs.readFile(path, 'utf8', function (err, data) { 13 + // if (err) { 14 + // reject(err); 15 + // } 16 + // resolve(JSON.parse(data)); 17 + // }); 18 + // }); 19 + }export async function writeFile(path: any, text: any) { 20 + // await promises.access(path, constants.W_OK | constants.O_CREAT); 21 + try { 22 + await promises.writeFile(path, text, 'utf8'); 23 + } catch (e) { 24 + throw e; 25 + } 26 + 27 + // return new Promise((resolve, reject) => { 28 + // fs.readFile(path, 'utf8', function (err, data) { 29 + // if (err) { 30 + // reject(err); 31 + // } 32 + // resolve(JSON.parse(data)); 33 + // }); 34 + // }); 35 + } 36 + export const fileOrDirectoryIsWriteable = (location: string) => { 37 + const pathInfo = pathUtil.parse(location); 38 + const isDir = pathInfo.ext === ''; 39 + try { 40 + accessSync(location, constants.R_OK | constants.W_OK); 41 + return true; 42 + } catch (err: any) { 43 + const { code } = err; 44 + if (code === 'ENOENT') { 45 + // file doesn't exist, see if we can write to directory in which case we are good 46 + try { 47 + accessSync(pathInfo.dir, constants.R_OK | constants.W_OK); 48 + // we can write to dir 49 + return true; 50 + } catch (accessError: any) { 51 + if (accessError.code === 'EACCES') { 52 + // also can't access directory :( 53 + throw new Error(`No ${isDir ? 'directory' : 'file'} exists at ${location} and application does not have permission to write to the parent directory`); 54 + } else { 55 + throw new Error(`No ${isDir ? 'directory' : 'file'} exists at ${location} and application is unable to access the parent directory due to a system error`, { cause: accessError }); 56 + } 57 + } 58 + } else if (code === 'EACCES') { 59 + throw new Error(`${isDir ? 'Directory' : 'File'} exists at ${location} but application does not have permission to write to it.`); 60 + } else { 61 + throw new Error(`${isDir ? 'Directory' : 'File'} exists at ${location} but application is unable to access it due to a system error`, { cause: err }); 62 + } 63 + } 64 + }; 65 +
+3 -2
src/backend/utils/ListenFetchUtils.ts
··· 4 4 import { PlayObject, UnixTimestamp } from "../../core/Atomic.js"; 5 5 import { CursorType, hasPagelessTimeRangeListens, hasPaginatedTimeRangeListens, PagelessListensTimeRangeOptions, PagelessTimeRangeListens, PagelessTimeRangeListensResult, PaginatedListensTimeRangeOptions, PaginatedTimeRangeCommonOptions, PaginatedTimeRangeListens, PaginatedTimeRangeListensResult, PaginatedTimeRangeOptions, PaginatedTimeRangeSource, REFRESH_STALE_DEFAULT, TimeRangeListensFetcher } from "../common/infrastructure/Atomic.js"; 6 6 import { loggerNoop, MaybeLogger } from "../common/logging.js"; 7 - import { sortByNewestPlayDate, sortByOldestPlayDate } from "../utils.js"; 8 - import { todayAwareFormat } from "./TimeUtils.js"; 7 + import { sortByOldestPlayDate } from "../utils.js"; 8 + import { sortByNewestPlayDate } from '../../core/PlayUtils.js'; 9 + import { todayAwareFormat } from "../../core/TimeUtils.js"; 9 10 import { playDateWithinDurationOfAny } from "./PlayComparisonUtils.js"; 10 11 11 12 export interface TimeRangeFetchOptions {
+1 -2
src/backend/utils/PlayTransformUtils.ts
··· 1 1 import { Logger, loggerTest } from "@foxxmd/logging"; 2 2 import { searchAndReplace as searchAndReplaceFunc, testMaybeRegex as testMaybeRegexFunc } from "@foxxmd/regex-buddy-core"; 3 - import { ObjectPlayData, PlayLifecycle, PlayObject, PlayObjectLifecycleless } from "../../core/Atomic.js"; 4 - import { buildTrackString } from "../../core/StringUtils.js"; 3 + import { PlayLifecycle, PlayObject, PlayObjectLifecycleless } from "../../core/Atomic.js"; 5 4 6 5 import { 7 6 ConditionalSearchAndReplaceRegExp,
+1 -1
src/backend/utils/RequestUtils.ts
··· 11 11 import { findCauseByFunc } from "./ErrorUtils.js"; 12 12 import { isSuperAgentResponseError } from "../common/errors/ErrorUtils.js"; 13 13 import { isNodeNetworkException, NodeNetworkException } from "../common/errors/NodeErrors.js"; 14 - import { formatNumber } from "../utils.js"; 14 + import { formatNumber } from '../../core/DataUtils.js'; 15 15 import { UpstreamError } from "../common/errors/UpstreamError.js"; 16 16 17 17 // typings from Formidable are all nuts.
+2 -15
src/backend/utils/StringUtils.ts
··· 2 2 import { hasher } from 'node-object-hash'; 3 3 import { PlayObject } from "../../core/Atomic.js"; 4 4 import { asPlayerStateData, DELIMITERS, DELIMITERS_NO_AMP, PlayerStateDataMaybePlay } from "../common/infrastructure/Atomic.js"; 5 - import { genGroupIdStr, getPlatformIdFromData, intersect, parseBool, parseBoolStrict, parseRegexSingleOrFail } from "../utils.js"; 5 + import { getPlatformIdFromData, intersect, parseBool, parseBoolStrict, parseRegexSingleOrFail } from "../utils.js"; 6 + import { genGroupIdStr } from '../../core/PlayUtils.js'; 6 7 import { buildTrackString } from "../../core/StringUtils.js"; 7 8 8 9 const {levenStrategy, diceStrategy} = strategies; ··· 227 228 } 228 229 return bypassed; 229 230 } 230 - export const containsDelimiters = (str: string) => null !== str.match(/[,&/\\]+/i) 231 - export const findDelimiters = (str: string, delimiters = DELIMITERS) => { 232 - const found: string[] = []; 233 - for (const d of delimiters) { 234 - if (str.indexOf(d) !== -1) { 235 - found.push(d); 236 - } 237 - } 238 - if (found.length === 0) { 239 - return undefined; 240 - } 241 - return found; 242 - } 243 - 244 231 export interface TrackSamenessResults { 245 232 naive: StringSamenessResult, 246 233 cleaned: StringSamenessResult,
+3 -10
src/backend/utils/TimeUtils.ts
··· 1 1 2 2 import dayjs, { Dayjs } from "dayjs"; 3 - import isToday from 'dayjs/plugin/isToday.js'; 3 + //import isToday from 'dayjs/plugin/isToday.js'; 4 4 import { 5 5 AcceptableTemporalDuringReference, 6 6 PlayObject, ··· 29 29 ScrobbleThresholdResult, 30 30 } from "../common/infrastructure/Atomic.js"; 31 31 import { ScrobbleThresholds } from "../common/infrastructure/config/source/index.js"; 32 - import { formatNumber } from "../utils.js"; 32 + import { formatNumber } from '../../core/DataUtils.js'; 33 33 34 - dayjs.extend(isToday); 34 + //dayjs.extend(isToday); 35 35 36 36 export const temporalPlayComparisonSummary = (data: TemporalPlayComparison, existingPlay?: PlayObject, candidatePlay?: PlayObject) => { 37 37 const parts: string[] = []; ··· 277 277 return date; 278 278 } 279 279 280 - export const todayAwareFormat = (date: Dayjs, opts: {fullFormat?: string, todayFormat?: string} = {}): string => { 281 - const { 282 - fullFormat, 283 - todayFormat = 'HH:mm:ssZ' 284 - } = opts; 285 - return date.format(date.isToday() ? todayFormat : fullFormat); 286 - }; 287 280 export const parseDurationFromTimestamp = (timestamp: any) => { 288 281 if (timestamp === null || timestamp === undefined) { 289 282 return undefined;
+72
src/client/components/ActivityDetail.tsx
··· 1 + import { ComponentProps, useState } from "react" 2 + import { Accordion, For, Span, Stack, Text, Box, AbsoluteCenter, Button, Separator, HStack, Flex, Badge, IconButton, Container, Icon } from '@chakra-ui/react'; 3 + import { ErrorLike, PlayActivity } from "../../core/Atomic"; 4 + import { PlayData } from "./PlayData"; 5 + import { ErrorAlert } from "./ErrorAlert"; 6 + import { AiOutlineExclamationCircle } from "react-icons/ai"; 7 + import { ActivityTimeline } from "./ActivityTimeline"; 8 + import { ExpandCollapse } from "./ExpandCollapse"; 9 + 10 + export interface ActivityDetailProps { 11 + activity: PlayActivity 12 + } 13 + 14 + export const ActivityDetails = (props: ActivityDetailProps) => { 15 + const { 16 + activity, 17 + activity: { 18 + error, 19 + play: { 20 + meta: { 21 + lifecycle: { 22 + original, 23 + scrobble 24 + } = {}, 25 + lifecycle 26 + } = {}, 27 + } = {} 28 + } 29 + } = props; 30 + 31 + const [collapsibleOpen, setCollapsibleOpen] = useState(undefined); 32 + 33 + return ( 34 + <Box> 35 + <Accordion.Root variant="enclosed" collapsible multiple> 36 + <Accordion.Item value="info"> 37 + <Accordion.ItemTrigger> 38 + <Accordion.ItemIndicator /> 39 + Play Data 40 + </Accordion.ItemTrigger> 41 + <Accordion.ItemContent> 42 + <Accordion.ItemBody> 43 + <PlayData play={original ?? activity.play} final={activity.play} /> 44 + </Accordion.ItemBody> 45 + </Accordion.ItemContent> 46 + </Accordion.Item> 47 + <Accordion.Item value="timeline"> 48 + <Flex justify="flex-start"> 49 + <Accordion.ItemTrigger> 50 + <Accordion.ItemIndicator /> 51 + Timeline {error !== undefined ? (<Icon size="sm" color="red.focusRing"> 52 + <AiOutlineExclamationCircle /> 53 + </Icon>) : null} 54 + </Accordion.ItemTrigger> 55 + <Stack style={{ 56 + paddingBlock: "var(--accordion-padding-y)", 57 + paddingInline: "var(--accordion-padding-x)" 58 + }} justify="flex-start" alignItems="flex-end"> 59 + <ExpandCollapse onClick={(val) => setCollapsibleOpen(val)} /> 60 + </Stack> 61 + </Flex> 62 + <Accordion.ItemContent> 63 + <Accordion.ItemBody> 64 + {scrobble !== undefined ? <ActivityTimeline play={activity.play} collapsibleOpen={collapsibleOpen} /> : null} 65 + </Accordion.ItemBody> 66 + </Accordion.ItemContent> 67 + </Accordion.Item> 68 + </Accordion.Root> 69 + {error !== undefined ? <ErrorAlert error={error} /> : null} 70 + </Box> 71 + ) 72 + }
+163
src/client/components/ActivityTimeline.tsx
··· 1 + import { ComponentProps, useState } from "react" 2 + import { Accordion, Timeline, Icon, Span, Stack, Heading, Card, Box, Tabs } from '@chakra-ui/react'; 3 + import { ErrorLike, JsonPlayObject, PlayActivity } from "../../core/Atomic"; 4 + import { PlayData } from "./PlayData"; 5 + import { ErrorAlert } from "./ErrorAlert"; 6 + import { IoMdCodeDownload } from "react-icons/io"; 7 + import { BiWrench } from "react-icons/bi"; 8 + import { IoMusicalNoteOutline } from "react-icons/io5"; 9 + import { PiMagnifyingGlassDuotone } from "react-icons/pi"; 10 + import { TbDatabaseEdit } from "react-icons/tb"; 11 + import { MdFiberNew } from "react-icons/md"; 12 + import { capitalize } from "../../core/StringUtils"; 13 + import { shortTodayAwareFormat, todayAwareFormat } from "../../core/TimeUtils"; 14 + import dayjs from "dayjs"; 15 + import { ChakraCodeBlockShort, ChakraPlainBlockShort } from "./CodeBlock"; 16 + import { TransformSteps } from "./TransformSteps"; 17 + import { ScrobbleMatchResult } from "./ScrobbleMatchResult"; 18 + import { ScrobbleActionResult } from "./ScrobbleActionResult"; 19 + import { ExpandCollapse } from "./ExpandCollapse"; 20 + import { MSCollapsible } from "./MSCollapsible"; 21 + import { TimelineErrorIcon } from "./timeline/TimelineIcon"; 22 + 23 + 24 + export interface ActivityDetailProps { 25 + play: JsonPlayObject 26 + collapsibleOpen?: boolean 27 + } 28 + 29 + export const ActivityTimeline = (props: ActivityDetailProps) => { 30 + const { 31 + play, 32 + collapsibleOpen 33 + } = props; 34 + const { 35 + data: { 36 + playDate 37 + }, 38 + meta: { 39 + source, 40 + lifecycle: { 41 + input, 42 + original, 43 + steps = [], 44 + scrobble: { 45 + match, 46 + payload, 47 + error 48 + } = {}, 49 + scrobble 50 + }, 51 + } = {} 52 + } = play; 53 + 54 + const [scrobbleCollapsibleOpen, setScrobbleCollapsibleOpen] = useState(false); 55 + 56 + return ( 57 + <Timeline.Root variant="subtle" size="lg"> 58 + <Timeline.Item> 59 + <Timeline.Connector> 60 + <Timeline.Separator /> 61 + <Timeline.Indicator> 62 + <Icon fontSize="lg"> 63 + <IoMdCodeDownload /> 64 + </Icon> 65 + </Timeline.Indicator> 66 + </Timeline.Connector> 67 + <Timeline.Content> 68 + <Timeline.Title> 69 + Discovered <Span color="fg.muted">new (Play) activity from</Span> 70 + <Span fontWeight="medium">{capitalize(source)}</Span> 71 + <Span color="fg.muted">at {shortTodayAwareFormat(dayjs(playDate))}</Span> 72 + </Timeline.Title> 73 + <Card.Root bgColor="bg.muted" size="sm" hideBelow="sm"> 74 + <Card.Body textStyle="sm"> 75 + <Tabs.Root size="sm" variant="outline" defaultValue="play"> 76 + <Tabs.List> 77 + <Tabs.Trigger value="play">Play</Tabs.Trigger> 78 + <Tabs.Trigger value="source">Source Data</Tabs.Trigger> 79 + </Tabs.List> 80 + <Tabs.Content value="play"> 81 + <PlayData play={original} /> 82 + </Tabs.Content> 83 + <Tabs.Content value="source"> 84 + <ChakraCodeBlockShort code={input} /> 85 + </Tabs.Content> 86 + </Tabs.Root> 87 + </Card.Body> 88 + </Card.Root> 89 + </Timeline.Content> 90 + </Timeline.Item> 91 + {steps.length > 0 ? ( 92 + <Timeline.Item> 93 + <Timeline.Connector> 94 + <Timeline.Separator /> 95 + <Timeline.Indicator> 96 + <Icon fontSize="lg"> 97 + <BiWrench /> 98 + </Icon> 99 + </Timeline.Indicator> 100 + </Timeline.Connector> 101 + <Timeline.Content gap="4"> 102 + <Timeline.Title> 103 + Transformed Play <Span color="fg.muted">using configured Rules</Span> 104 + </Timeline.Title> 105 + <Card.Root bgColor="bg.muted" size="sm"> 106 + <Card.Body textStyle="sm"> 107 + <TransformSteps steps={steps} original={original} collapsibleOpen={collapsibleOpen} /> 108 + </Card.Body> 109 + </Card.Root> 110 + </Timeline.Content> 111 + </Timeline.Item> 112 + ) : null} 113 + {match !== undefined ? ( 114 + <Timeline.Item> 115 + <Timeline.Connector> 116 + <Timeline.Separator /> 117 + <Timeline.Indicator> 118 + <Icon fontSize="lg" color={`${match.match ? 'orange' : 'green'}.focusRing`}> 119 + <PiMagnifyingGlassDuotone /> 120 + </Icon> 121 + </Timeline.Indicator> 122 + </Timeline.Connector> 123 + <Timeline.Content gap="4"> 124 + <Timeline.Title> 125 + <Span color="fg.muted">Found </Span>{match.match ? <Span color="orange.solid"> a duplicate Scrobble</Span> : 'no duplicate Scrobbles'} 126 + </Timeline.Title> 127 + <Card.Root bgColor="bg.muted" size="sm" hideBelow="sm"> 128 + <Card.Body textStyle="sm"> 129 + <MSCollapsible indicator="Show Details" defaultOpen={collapsibleOpen}> 130 + <ScrobbleMatchResult match={match} /> 131 + </MSCollapsible> 132 + </Card.Body> 133 + </Card.Root> 134 + </Timeline.Content> 135 + </Timeline.Item> 136 + ) : null} 137 + {payload !== undefined ? ( 138 + <Timeline.Item> 139 + <Timeline.Connector> 140 + <Timeline.Separator /> 141 + <Timeline.Indicator> 142 + {error !== undefined ? <TimelineErrorIcon /> : ( 143 + <Icon fontSize="sm"> 144 + <TbDatabaseEdit /> 145 + </Icon> 146 + )} 147 + </Timeline.Indicator> 148 + </Timeline.Connector> 149 + <Timeline.Content gap="4"> 150 + <Timeline.Title> 151 + <Span color="fg.muted">Attmpted to</Span> Scrobble 152 + </Timeline.Title> 153 + <Card.Root bgColor="bg.muted" size="sm"> 154 + <Card.Body textStyle="sm"> 155 + <ScrobbleActionResult result={scrobble} scrobbler="Koito" collapsibleOpen={collapsibleOpen} /> 156 + </Card.Body> 157 + </Card.Root> 158 + </Timeline.Content> 159 + </Timeline.Item> 160 + ) : null} 161 + </Timeline.Root> 162 + ) 163 + }
+26
src/client/components/ChakraClipboard.tsx
··· 1 + import { ComponentProps, useMemo } from 'react'; 2 + import { Clipboard, IconButton } from "@chakra-ui/react" 3 + import {safeStringify} from '../../core/StringUtils'; 4 + 5 + 6 + export const ChakraClip = (props: Omit<ComponentProps<typeof Clipboard.Root>, 'children' | 'value'> & {value: any}) => { 7 + const { 8 + value, 9 + ...rest 10 + } = props; 11 + const clipVal = useMemo(() => { 12 + if(typeof value === 'string') { 13 + return value; 14 + } 15 + return safeStringify(value); 16 + },[value]) 17 + return ( 18 + <Clipboard.Root value={clipVal} {...rest}> 19 + <Clipboard.Trigger asChild> 20 + <IconButton variant="surface" size="xs"> 21 + <Clipboard.Indicator /> 22 + </IconButton> 23 + </Clipboard.Trigger> 24 + </Clipboard.Root> 25 + ) 26 + }
+170
src/client/components/CodeBlock.tsx
··· 1 + import type { HighlighterGeneric } from "shiki" 2 + import { createShikiAdapter, CodeBlock, IconButton, ClientOnly, ScrollArea } from "@chakra-ui/react" 3 + import { useColorMode } from "./Color-Mode"; 4 + import { ComponentProps, PropsWithChildren, useMemo } from "react"; 5 + import { safeStringify } from "../../core/StringUtils"; 6 + import { MarkOptional } from "ts-essentials"; 7 + 8 + const shikiAdapter = createShikiAdapter<HighlighterGeneric<any, any>>({ 9 + async load() { 10 + const { createHighlighter } = await import("shiki") 11 + return createHighlighter({ 12 + langs: ["json", "plaintext"], 13 + themes: ["github-dark", "github-light"], 14 + }) 15 + }, 16 + theme: { 17 + light: "github-light", 18 + dark: "github-dark", 19 + }, 20 + }); 21 + 22 + export interface ChakraCodeBaseProps { 23 + language?: string 24 + title?: string 25 + maxHeight?: string 26 + maxLines?: number 27 + collapsedMaxHeight?: string 28 + } 29 + 30 + export type ChakraCodelessBlock = Omit<ComponentProps<typeof CodeBlock.Root>, 'code'> 31 + 32 + export type ChakraCodeBlockProps = Omit<ChakraCodelessBlock, 'children'> & ChakraCodeBaseProps & { 33 + code: string | object 34 + } 35 + 36 + const DEFAULT_MAX_HEIGHT = '70vh', 37 + DEFAULT_COLLAPSED_MAX_HEIGHT = '320px', 38 + DEFAULT_LANGUAGE = 'json'; 39 + 40 + export const ChakraCodeBlock = (props: ChakraCodeBlockProps) => { 41 + const { 42 + maxHeight = DEFAULT_MAX_HEIGHT, 43 + maxLines, 44 + collapsedMaxHeight = DEFAULT_COLLAPSED_MAX_HEIGHT, 45 + language = DEFAULT_LANGUAGE, 46 + code, 47 + ...rest 48 + } = props; 49 + 50 + const contentProps: ComponentProps<typeof CodeBlock.Content> = maxLines === undefined ? { maxHeight, overflowY: 'auto' } : { css: { "--code-block-max-height": collapsedMaxHeight } }; 51 + 52 + const codeVal = useMemo(() => { 53 + if (typeof code === 'string') { 54 + return code; 55 + } 56 + return safeStringify(code); 57 + }, [code]); 58 + 59 + return ( 60 + <CodeBlock.AdapterProvider value={shikiAdapter}> 61 + <ClientOnly fallback={<div>Loading...</div>}> 62 + {() => ( 63 + <CodeBlock.Root 64 + code={codeVal} 65 + language={language ?? 'json'} 66 + maxLines={maxLines} 67 + meta={{ wordWrap: true }} 68 + {...rest} 69 + > 70 + <CodeBlock.Header> 71 + <CodeBlock.Title>{props.title ?? ' '}</CodeBlock.Title> 72 + <CodeBlock.Control> 73 + <CodeBlock.CollapseTrigger asChild> 74 + <IconButton variant="ghost" size="2xs"> 75 + <CodeBlock.CollapseIndicator /> 76 + </IconButton> 77 + </CodeBlock.CollapseTrigger> 78 + <CodeBlock.CopyTrigger asChild> 79 + <IconButton variant="ghost" size="2xs"> 80 + <CodeBlock.CopyIndicator /> 81 + </IconButton> 82 + </CodeBlock.CopyTrigger> 83 + </CodeBlock.Control> 84 + </CodeBlock.Header> 85 + <CodeBlock.Content {...contentProps}> 86 + <CodeBlock.Code> 87 + <CodeBlock.CodeText /> 88 + </CodeBlock.Code> 89 + 90 + <CodeBlock.Overlay> 91 + <CodeBlock.CollapseTrigger> 92 + <CodeBlock.CollapseText textStyle="sm" /> 93 + </CodeBlock.CollapseTrigger> 94 + </CodeBlock.Overlay> 95 + </CodeBlock.Content> 96 + </CodeBlock.Root> 97 + )} 98 + </ClientOnly> 99 + </CodeBlock.AdapterProvider> 100 + ) 101 + } 102 + 103 + export const ChakraCodeBlockShort = (props: ChakraCodeBlockProps) => <ChakraCodeBlock maxLines={6} collapsedMaxHeight="10em" hideBelow="sm" {...props} />; 104 + 105 + export type ChakraPlainBlockProps = MarkOptional<ChakraCodelessBlock, 'children'> & ChakraCodeBaseProps & {code?: string | object}; 106 + 107 + export const ChakraPlainBlock = (props: ChakraPlainBlockProps) => { 108 + const { 109 + maxHeight = DEFAULT_MAX_HEIGHT, 110 + maxLines, 111 + collapsedMaxHeight = DEFAULT_COLLAPSED_MAX_HEIGHT, 112 + code, 113 + ...rest 114 + } = props; 115 + 116 + const contentProps: ComponentProps<typeof CodeBlock.Content> = maxLines === undefined ? { maxHeight, overflowY: 'auto' } : { css: { "--code-block-max-height": collapsedMaxHeight } }; 117 + 118 + const codeVal = useMemo(() => { 119 + if(code === undefined) { 120 + return ' '; 121 + } 122 + if (typeof code === 'string') { 123 + return code; 124 + } 125 + return safeStringify(code); 126 + }, [code]); 127 + 128 + let header: JSX.Element | null; 129 + if(props.title === undefined && maxLines === undefined) { 130 + header = null; 131 + } else { 132 + header = ( 133 + <CodeBlock.Header> 134 + <CodeBlock.Title>{props.title}</CodeBlock.Title> 135 + <CodeBlock.Control> 136 + {maxLines !== undefined ? ( 137 + <CodeBlock.CollapseTrigger asChild> 138 + <IconButton variant="ghost" size="2xs"> 139 + <CodeBlock.CollapseIndicator /> 140 + </IconButton> 141 + </CodeBlock.CollapseTrigger> 142 + ) : null} 143 + </CodeBlock.Control> 144 + </CodeBlock.Header> 145 + ); 146 + } 147 + 148 + return ( 149 + <CodeBlock.Root 150 + code={codeVal} 151 + language="plaintext" 152 + maxLines={maxLines} 153 + {...rest} 154 + > 155 + {header} 156 + <CodeBlock.Content {...contentProps}> 157 + <CodeBlock.Code> 158 + {props.children ?? <CodeBlock.CodeText />} 159 + </CodeBlock.Code> 160 + <CodeBlock.Overlay> 161 + <CodeBlock.CollapseTrigger> 162 + <CodeBlock.CollapseText textStyle="sm" /> 163 + </CodeBlock.CollapseTrigger> 164 + </CodeBlock.Overlay> 165 + </CodeBlock.Content> 166 + </CodeBlock.Root> 167 + ); 168 + } 169 + 170 + export const ChakraPlainBlockShort = (props: ChakraPlainBlockProps) => <ChakraPlainBlock maxLines={6} collapsedMaxHeight="10em" hideBelow="sm" {...props} />;
+108
src/client/components/Color-Mode.tsx
··· 1 + "use client" 2 + 3 + import type { IconButtonProps, SpanProps } from "@chakra-ui/react" 4 + import { ClientOnly, IconButton, Skeleton, Span } from "@chakra-ui/react" 5 + import { ThemeProvider, useTheme } from "next-themes" 6 + import type { ThemeProviderProps } from "next-themes" 7 + import * as React from "react" 8 + import { LuMoon, LuSun } from "react-icons/lu" 9 + 10 + export interface ColorModeProviderProps extends ThemeProviderProps {} 11 + 12 + export function ColorModeProvider(props: ColorModeProviderProps) { 13 + return ( 14 + <ThemeProvider attribute="class" disableTransitionOnChange {...props} /> 15 + ) 16 + } 17 + 18 + export type ColorMode = "light" | "dark" 19 + 20 + export interface UseColorModeReturn { 21 + colorMode: ColorMode 22 + setColorMode: (colorMode: ColorMode) => void 23 + toggleColorMode: () => void 24 + } 25 + 26 + export function useColorMode(): UseColorModeReturn { 27 + const { resolvedTheme, setTheme, forcedTheme } = useTheme() 28 + const colorMode = forcedTheme || resolvedTheme 29 + const toggleColorMode = () => { 30 + setTheme(resolvedTheme === "dark" ? "light" : "dark") 31 + } 32 + return { 33 + colorMode: colorMode as ColorMode, 34 + setColorMode: setTheme, 35 + toggleColorMode, 36 + } 37 + } 38 + 39 + export function useColorModeValue<T>(light: T, dark: T) { 40 + const { colorMode } = useColorMode() 41 + return colorMode === "dark" ? dark : light 42 + } 43 + 44 + export function ColorModeIcon() { 45 + const { colorMode } = useColorMode() 46 + return colorMode === "dark" ? <LuMoon /> : <LuSun /> 47 + } 48 + 49 + interface ColorModeButtonProps extends Omit<IconButtonProps, "aria-label"> {} 50 + 51 + export const ColorModeButton = React.forwardRef< 52 + HTMLButtonElement, 53 + ColorModeButtonProps 54 + >(function ColorModeButton(props, ref) { 55 + const { toggleColorMode } = useColorMode() 56 + return ( 57 + <ClientOnly fallback={<Skeleton boxSize="9" />}> 58 + <IconButton 59 + onClick={toggleColorMode} 60 + variant="ghost" 61 + aria-label="Toggle color mode" 62 + size="sm" 63 + ref={ref} 64 + {...props} 65 + css={{ 66 + _icon: { 67 + width: "5", 68 + height: "5", 69 + }, 70 + }} 71 + > 72 + <ColorModeIcon /> 73 + </IconButton> 74 + </ClientOnly> 75 + ) 76 + }) 77 + 78 + export const LightMode = React.forwardRef<HTMLSpanElement, SpanProps>( 79 + function LightMode(props, ref) { 80 + return ( 81 + <Span 82 + color="fg" 83 + display="contents" 84 + className="chakra-theme light" 85 + colorPalette="gray" 86 + colorScheme="light" 87 + ref={ref} 88 + {...props} 89 + /> 90 + ) 91 + }, 92 + ) 93 + 94 + export const DarkMode = React.forwardRef<HTMLSpanElement, SpanProps>( 95 + function DarkMode(props, ref) { 96 + return ( 97 + <Span 98 + color="fg" 99 + display="contents" 100 + className="chakra-theme dark" 101 + colorPalette="gray" 102 + colorScheme="dark" 103 + ref={ref} 104 + {...props} 105 + /> 106 + ) 107 + }, 108 + )
+14
src/client/components/DateDisplay.tsx
··· 1 + import { Text } from "@chakra-ui/react" 2 + import dayjs, {Dayjs} from 'dayjs'; 3 + import { shortTodayAwareFormat } from "../../core/TimeUtils"; 4 + 5 + export interface DateDisplayProps { 6 + date?: string | Dayjs 7 + prefix?: string 8 + } 9 + export const ShortDateDisplay = (props: DateDisplayProps) => { 10 + if(props.date === undefined) { 11 + return <Text textStyle="xs" color="fg.muted">(No Date)</Text> 12 + } 13 + return <Text textStyle="xs" color="fg.muted">{`${props.prefix !== undefined ? `${props.prefix} ` : ''}${shortTodayAwareFormat(typeof props.date === 'string' ? dayjs(props.date) : props.date)}`}</Text> 14 + }
+62
src/client/components/ErrorAlert.tsx
··· 1 + import { Alert, Accordion, Stack, Text, Box } from '@chakra-ui/react'; 2 + import { Fragment } from 'react'; 3 + import { ErrorLike } from '../../core/Atomic'; 4 + import { ChakraCodeBlock } from './CodeBlock'; 5 + import { ChakraClip } from './ChakraClipboard'; 6 + 7 + export interface ErrorAlertProps { 8 + error: ErrorLike 9 + } 10 + 11 + export const ErrorAlert = (props: ErrorAlertProps) => { 12 + 13 + let causes: ErrorData[] = []; 14 + if(props.error.cause !== undefined && typeof props.error.cause === 'object') { 15 + causes = walkError(props.error.cause as ErrorLike); 16 + } 17 + 18 + return ( 19 + <Box> 20 + <Alert.Root status="error"> 21 + <Alert.Indicator /> 22 + <Alert.Content> 23 + <Alert.Title>{props.error.name ?? 'Error'}</Alert.Title> 24 + <Alert.Description> 25 + <Stack> 26 + <Text>{props.error.message}</Text> 27 + {props.error.stack !== undefined ? <ChakraCodeBlock language="plaintext" code={props.error.stack} title="Stack" maxLines={6} collapsedMaxHeight="10em" hideBelow="sm"/> : null} 28 + {causes.map(x => ( 29 + <Fragment> 30 + <Text color="fg.muted">Caused By: {x.name ?? ''}{x.code !== undefined ? ` (${x.code}) ` : ''}{x.message}</Text> 31 + {x.stack !== undefined ? <ChakraCodeBlock language="plaintext" code={x.stack} title="Stack" maxLines={6} collapsedMaxHeight="10em" hideBelow="sm"/> : null} 32 + </Fragment> 33 + ))} 34 + </Stack> 35 + </Alert.Description> 36 + </Alert.Content> 37 + <ChakraClip value={props.error}/> 38 + </Alert.Root> 39 + </Box> 40 + ) 41 + } 42 + 43 + interface ErrorData { 44 + name?: string 45 + code?: string 46 + message?: string 47 + stack?: string 48 + } 49 + 50 + const walkError = (err: ErrorLike, errors: ErrorData[] = []): ErrorData[] => { 51 + const thisErr: ErrorData = { 52 + name: err.name, 53 + code: 'code' in err ? err.code : undefined, 54 + message: err.message, 55 + stack: err.stack 56 + }; 57 + errors.push(thisErr); 58 + if(err.cause !== undefined && typeof err.cause === 'object') { 59 + return walkError(err, errors); 60 + } 61 + return errors; 62 + }
+27
src/client/components/ErrorBoundary.tsx
··· 1 + import * as React from 'react'; 2 + import { Alert } from '@chakra-ui/react'; 3 + import { ErrorBoundary, getErrorMessage } from "react-error-boundary"; 4 + import { ChakraCodeBlock } from './CodeBlock'; 5 + 6 + export const MSErrorBoundary = (props: React.PropsWithChildren) => { 7 + return ( 8 + <ErrorBoundary 9 + 10 + fallbackRender={({ error, resetErrorBoundary }) => ( 11 + <Alert.Root status="error"> 12 + <Alert.Indicator /> 13 + <Alert.Content> 14 + <Alert.Title>Error while render</Alert.Title> 15 + <Alert.Description> 16 + <ChakraCodeBlock code={getErrorMessage(error)} language="plaintext" /> 17 + </Alert.Description> 18 + </Alert.Content> 19 + </Alert.Root> 20 + )} 21 + > 22 + {props.children} 23 + 24 + </ErrorBoundary> 25 + ) 26 + } 27 +
+33
src/client/components/ExpandCollapse.tsx
··· 1 + import { IconButton, HStack } from "@chakra-ui/react" 2 + import { ComponentProps, PropsWithChildren } from "react"; 3 + import { FaRegSquarePlus, FaRegSquareMinus } from "react-icons/fa6"; 4 + 5 + export interface ExpandCollapseProps { 6 + onClick: (val: boolean) => void, 7 + size?: string 8 + } 9 + 10 + export const ExpandCollapse = (props: ExpandCollapseProps) => { 11 + return ( 12 + <HStack gap="1"> 13 + <IconButton 14 + aria-label="Collapse All" 15 + variant="ghost" 16 + size="sm" 17 + style={{blockSize: '20px'}} 18 + onClick={() => props.onClick(false)} 19 + > 20 + <FaRegSquareMinus /> 21 + </IconButton> 22 + <IconButton 23 + aria-label="Expand All" 24 + variant="ghost" 25 + size="sm" 26 + style={{blockSize: '20px'}} 27 + onClick={() => props.onClick(true)} 28 + > 29 + <FaRegSquarePlus /> 30 + </IconButton> 31 + </HStack> 32 + ) 33 + }
+17
src/client/components/JsonDiff.css
··· 1 + .jsondiffpatch-added .jsondiffpatch-property-name, 2 + .jsondiffpatch-added .jsondiffpatch-value pre, 3 + .jsondiffpatch-modified .jsondiffpatch-right-value pre, 4 + .jsondiffpatch-textdiff-added { 5 + background: #0e2e1b; 6 + } 7 + 8 + .jsondiffpatch-deleted .jsondiffpatch-property-name, 9 + .jsondiffpatch-deleted pre, 10 + .jsondiffpatch-modified .jsondiffpatch-left-value pre, 11 + .jsondiffpatch-textdiff-deleted { 12 + background: #371516 ; 13 + } 14 + 15 + /* .jsondiffpatch-delta, .jsondiffpatch-delta ul { 16 + padding: 0 0 0 0; 17 + } */
+41
src/client/components/JsonDiff.tsx
··· 1 + import React, { ComponentProps } from 'react'; 2 + import JsonDiffReact from 'jsondiffpatch-react'; 3 + import { MSErrorBoundary } from './ErrorBoundary'; 4 + import { Delta } from 'jsondiffpatch'; 5 + import { MarkOptional } from 'ts-essentials'; 6 + import { jdiff } from '../../core/DataUtils'; 7 + import './JsonDiff.css'; 8 + 9 + type DiffableVal = [] | object | string; 10 + 11 + export interface JsonDiffReactProps { 12 + right: DiffableVal, 13 + left: DiffableVal 14 + show?: boolean, 15 + annotated?: boolean, 16 + tips?: any, 17 + objectHash?: CallableFunction, 18 + } 19 + 20 + export type JsonDiffPatchProps = MarkOptional<JsonDiffReactProps, 'right'> & { 21 + diff?: Delta | object 22 + } 23 + 24 + export const JsonDiffPatch = (props: JsonDiffPatchProps) => { 25 + const { 26 + right, 27 + diff, 28 + ...rest 29 + } = props; 30 + let realRight: DiffableVal; 31 + if (right !== undefined) { 32 + realRight = right; 33 + } else if (diff !== undefined) { 34 + realRight = jdiff.patch(props.left, diff as Delta) as DiffableVal; 35 + } else { 36 + throw new Error(`must provide either 'right' or 'diff'`); 37 + } 38 + return <MSErrorBoundary> 39 + <JsonDiffReact {...rest} right={realRight} /> 40 + </MSErrorBoundary> 41 + };
+93
src/client/components/List.tsx
··· 1 + import { Accordion, For, Span, Stack, Text, Box, AbsoluteCenter, Button, Separator, HStack, Flex, Badge, IconButton, Container } from '@chakra-ui/react'; 2 + import { JsonPlayObject, PlayActivity } from '../../core/Atomic'; 3 + import { ShortDateDisplay } from './DateDisplay'; 4 + import { TextMuted } from './TextMuted'; 5 + import { capitalize } from '../../core/StringUtils'; 6 + import { ComponentProps } from "react" 7 + import { VscDebugRestart } from "react-icons/vsc"; 8 + import { PlayData, PlayInfoContainer } from './PlayData'; 9 + import { ActivityDetails } from './ActivityDetail'; 10 + export interface ActivityLogProps { 11 + data: PlayActivity[] 12 + } 13 + 14 + export const CList = (props: ActivityLogProps) => { 15 + return ( 16 + <Stack gap="2"> 17 + <Box> 18 + <Flex direction="row" justify="space-between"> 19 + 20 + <Text fontWeight="semibold">Today</Text> 21 + 22 + <IconButton variant="ghost" size="xs" maxWidth="fit-content"> 23 + <VscDebugRestart /> 24 + </IconButton> 25 + </Flex> 26 + <Separator orientation="horizontal" height="4" /> 27 + </Box> 28 + <Accordion.Root variant="enclosed" collapsible multiple> 29 + {props.data.map((activity, index) => { 30 + const { play } = activity; 31 + return ( 32 + <Accordion.Item key={index} value={index.toString()}> 33 + <Flex justify="space-between"> 34 + <Accordion.ItemTrigger truncate cursor="pointer"> 35 + <Accordion.ItemIndicator /> 36 + <Stack gap="1" truncate> 37 + <Span>{play.data.track}</Span> 38 + <TextMuted truncate>{play.data.artists.join(' / ')}</TextMuted> 39 + <HStack gap="1"> 40 + <ShortDateDisplay date={play.data.playDate} prefix="Played" /><Separator orientation="vertical" height="4" /> 41 + <TextMuted>{play.meta?.source}</TextMuted> 42 + </HStack> 43 + </Stack> 44 + </Accordion.ItemTrigger> 45 + <Stack style={{ 46 + paddingBlock: "var(--accordion-padding-y)", 47 + paddingInline: "var(--accordion-padding-x)" 48 + }} justify="flex-start" alignItems="flex-end"> 49 + <StatusBadge maxWidth="fit-content" data={activity} /> 50 + {activity.status === 'error' ? <IconButton variant="ghost" size="xs" maxWidth="fit-content"> 51 + <VscDebugRestart /> 52 + </IconButton> : null} 53 + </Stack> 54 + 55 + </Flex> 56 + <Accordion.ItemContent> 57 + <Accordion.ItemBody borderTopColor="gray.border" > 58 + <ActivityDetails activity={activity}/> 59 + </Accordion.ItemBody> 60 + </Accordion.ItemContent> 61 + </Accordion.Item> 62 + ) 63 + })} 64 + </Accordion.Root> 65 + </Stack> 66 + ); 67 + } 68 + 69 + const StatusBadge = (props: ComponentProps<typeof Badge> & { data: PlayActivity }) => { 70 + 71 + const { data, ...rest } = props; 72 + 73 + let badgeColor = undefined, 74 + badgeText = capitalize(data.status); 75 + 76 + switch (data.status) { 77 + case 'queued': 78 + badgeColor = 'gray'; 79 + break; 80 + case 'scrobbled': 81 + badgeColor = 'green'; 82 + break; 83 + case 'error': 84 + badgeColor = 'red'; 85 + break; 86 + } 87 + 88 + return <Badge variant="surface" colorPalette={badgeColor} {...rest}>{badgeText}</Badge> 89 + } 90 + 91 + export const ListContainer = (props?: ComponentProps<typeof CList>) => { 92 + return <Container maxWidth="3xl"><CList {...props}/></Container> 93 + }
+55
src/client/components/MSCollapsible.tsx
··· 1 + import { Collapsible, Stack, Box } from "@chakra-ui/react" 2 + import { ComponentProps, PropsWithChildren, useState, useEffect } from "react"; 3 + import { LuChevronRight } from "react-icons/lu" 4 + 5 + //padding="0" borderWidth="0px" 6 + 7 + interface MSCollapsibleInternalProps { 8 + indicator?: string | JSX.Element 9 + boxProps?: object 10 + } 11 + 12 + export interface MSCollapsibleExternalProps { 13 + collapsibleOpen?: boolean 14 + } 15 + 16 + export type MSCollapsibleProps = PropsWithChildren<ComponentProps<typeof Collapsible.Root>> & MSCollapsibleInternalProps; 17 + 18 + export const MSCollapsible = (props: MSCollapsibleProps) => { 19 + const { 20 + indicator = 'Details', 21 + boxProps = {}, 22 + defaultOpen, 23 + ...rest 24 + } = props; 25 + 26 + const [open, setOpen] = useState(defaultOpen) 27 + 28 + useEffect(() => { 29 + setOpen(defaultOpen); 30 + }, [setOpen, defaultOpen]); 31 + 32 + return ( 33 + <Collapsible.Root open={open} onOpenChange={(val) => setOpen(val.open)} {...rest}> 34 + <Collapsible.Trigger 35 + paddingY="3" 36 + display="flex" 37 + gap="2" 38 + alignItems="center" 39 + > 40 + <Collapsible.Indicator 41 + transition="transform 0.2s" 42 + _open={{ transform: "rotate(90deg)" }} 43 + > 44 + <LuChevronRight /> 45 + </Collapsible.Indicator> 46 + {indicator} 47 + </Collapsible.Trigger> 48 + <Collapsible.Content> 49 + <Box {...boxProps}> 50 + {props.children} 51 + </Box> 52 + </Collapsible.Content> 53 + </Collapsible.Root> 54 + ) 55 + }
+225
src/client/components/PlayData.tsx
··· 1 + import React, { Fragment, useMemo, useState } from 'react'; 2 + import { EmptyState, DataList, HStack, Tag, Tabs, Wrap, Box, Flex, SegmentGroup, Stack, Text, Separator, IconButton, Container, SimpleGrid, Float } from "@chakra-ui/react" 3 + import { LuCode, LuText } from "react-icons/lu" 4 + import { JsonPlayObject } from '../../core/Atomic.js'; 5 + import { shortTodayAwareFormat } from '../../core/TimeUtils.js'; 6 + import dayjs from 'dayjs'; 7 + import { ChakraCodeBlock } from './CodeBlock.js'; 8 + import { TextMuted } from './TextMuted.js'; 9 + 10 + const EmptyPlayData = () => { 11 + return ( 12 + <EmptyState.Root size="sm"> 13 + <EmptyState.Content> 14 + <EmptyState.Indicator /> 15 + <EmptyState.Description> 16 + No Play object was provided. 17 + </EmptyState.Description> 18 + </EmptyState.Content> 19 + </EmptyState.Root> 20 + ); 21 + } 22 + 23 + export type DisplayDates = false | 'all' | 'played' | 'seen'; 24 + 25 + export interface PlayInfoProps { 26 + play?: JsonPlayObject 27 + final?: JsonPlayObject 28 + showCodeToggle?: boolean 29 + showCompare?: boolean 30 + compareDefault?: 'Initial' | 'Final' 31 + dates?: false | 'all' | 'played' | 'seen' 32 + } 33 + 34 + export const PlayData = (props?: PlayInfoProps) => { 35 + const { 36 + play, 37 + final, 38 + showCodeToggle = true, 39 + showCompare = true, 40 + compareDefault = 'Initial', 41 + dates = 'all' 42 + } = props ?? {}; 43 + 44 + if (play === undefined) { 45 + return <EmptyPlayData /> 46 + } 47 + 48 + const [codeMode, setCodeMode] = useState(false); 49 + 50 + let code: JSX.Element | null = null; 51 + 52 + const comparable = showCompare && final !== undefined; 53 + 54 + if (showCodeToggle) { 55 + code = ( 56 + <IconButton variant="outline" size="xs" onClick={() => setCodeMode(!codeMode)}> 57 + {codeMode ? <LuText /> : <LuCode />} 58 + </IconButton> 59 + ); 60 + } 61 + 62 + if (!comparable) { 63 + return (<Box position="relative"> 64 + <Float placement="top-end" offsetX="4" offsetY="2" hideBelow="sm" zIndex={100}>{code}</Float> 65 + {codeMode ? <ChakraCodeBlock code={play} /> : <PlayDataDataList play={play} dates={dates} />} 66 + </Box>); 67 + } 68 + 69 + return ( 70 + <Box position="relative"> 71 + <Float placement="top-end" offsetX="4" offsetY="2" hideBelow="sm" zIndex={100}>{code}</Float> 72 + <Tabs.Root size="sm" variant="outline" defaultValue={compareDefault}> 73 + <Tabs.List> 74 + <Tabs.Trigger value="Initial">Initial</Tabs.Trigger> 75 + <Tabs.Trigger value="Final">Final</Tabs.Trigger> 76 + </Tabs.List> 77 + <Tabs.Content value="Initial"> 78 + {codeMode ? <ChakraCodeBlock code={play} /> : <PlayDataDataList play={play} dates={dates} />} 79 + </Tabs.Content> 80 + <Tabs.Content value="Final"> 81 + {codeMode ? <ChakraCodeBlock code={final} /> : <PlayDataDataList play={final} dates={dates} />} 82 + </Tabs.Content> 83 + </Tabs.Root> 84 + </Box> 85 + ); 86 + } 87 + 88 + export const PlayDataDataList = (props: { play: JsonPlayObject, dates: DisplayDates }) => { 89 + 90 + const { 91 + play, 92 + dates 93 + } = props; 94 + 95 + 96 + let albumArtistElm: JSX.Element; 97 + 98 + if (play.data.albumArtists !== undefined && play.data.albumArtists.length > 0) { 99 + albumArtistElm = ( 100 + <DataList.Item> 101 + <DataList.ItemLabel>Album Artists</DataList.ItemLabel> 102 + <DataList.ItemValue> 103 + <HStack>{play.data.albumArtists.map((x, index) => { 104 + return ( 105 + <Tag.Root key={index}> 106 + <Tag.Label>{x}</Tag.Label> 107 + </Tag.Root> 108 + ); 109 + })}</HStack> 110 + </DataList.ItemValue> 111 + </DataList.Item> 112 + ); 113 + } 114 + 115 + const { 116 + data: { 117 + artists = [] 118 + } = {} 119 + } = play; 120 + 121 + return ( 122 + <Flex gap="4" wrap="wrap"> 123 + <Box> 124 + <DataList.Root> 125 + <DataList.Item> 126 + <DataList.ItemLabel flexShrink="1">Title</DataList.ItemLabel> 127 + <DataList.ItemValue>{play.data.track}</DataList.ItemValue> 128 + </DataList.Item> 129 + <DataList.Item> 130 + <DataList.ItemLabel>Artists</DataList.ItemLabel> 131 + <DataList.ItemValue> 132 + {artists.length === 0 ? <Text color="fg.muted">(No Artists)</Text> : 133 + <HStack>{play.data.artists.map((x, index) => { 134 + return ( 135 + <Tag.Root key={index}> 136 + <Tag.Label>{x}</Tag.Label> 137 + </Tag.Root> 138 + ); 139 + })}</HStack>} 140 + </DataList.ItemValue> 141 + </DataList.Item> 142 + {albumArtistElm} 143 + <DataList.Item> 144 + <DataList.ItemLabel>Album</DataList.ItemLabel> 145 + <DataList.ItemValue>{play.data.album}</DataList.ItemValue> 146 + </DataList.Item> 147 + </DataList.Root> 148 + </Box> 149 + <Box> 150 + <DataList.Root> 151 + <PlayDatesStack play={play} dates={dates} /> 152 + </DataList.Root> 153 + </Box> 154 + </Flex> 155 + ) 156 + } 157 + 158 + export const PlayInfoContainer = (props?: PlayInfoProps) => { 159 + return <Container maxWidth="lg"><PlayData {...props} /></Container> 160 + } 161 + 162 + export const PlayDatesStack = (props: { play: JsonPlayObject, dates: DisplayDates }) => { 163 + const { 164 + play, 165 + dates 166 + } = props; 167 + 168 + let datesItem: JSX.Element | null; 169 + if (dates === false) { 170 + datesItem = null; 171 + } else { 172 + const dateElements = []; 173 + if (dates.includes('played') || dates.includes('all')) { 174 + dateElements.push((<TextMuted>{`Played ${shortTodayAwareFormat(dayjs(play.data.playDate))}`}</TextMuted>)); 175 + if (play.data.playDateCompleted !== undefined) { 176 + dateElements.push((<TextMuted>{`Played Until ${shortTodayAwareFormat(dayjs(play.data.playDateCompleted))}`}</TextMuted>)); 177 + } 178 + } 179 + if (dates.includes('seen') || dates.includes('all')) { 180 + dateElements.push((<TextMuted>{`Seen ${shortTodayAwareFormat(dayjs(play.data.playDate))}`}</TextMuted>)); 181 + } 182 + datesItem = ( 183 + <DataList.Item> 184 + <DataList.ItemLabel>Dates</DataList.ItemLabel> 185 + <DataList.ItemValue> 186 + <Stack gap="1"> 187 + {dateElements} 188 + </Stack> 189 + </DataList.ItemValue> 190 + </DataList.Item> 191 + ) 192 + } 193 + 194 + return datesItem; 195 + } 196 + 197 + export const PlayDatesFooter = (props: { play: JsonPlayObject, dates: DisplayDates }) => { 198 + 199 + const { 200 + play, 201 + dates 202 + } = props; 203 + 204 + let dateElm: JSX.Element; 205 + 206 + if (dates !== false) { 207 + let playDate: JSX.Element, 208 + seenDate: JSX.Element; 209 + if (play.data.playDate !== undefined && ['all', 'played'].includes(dates)) { 210 + playDate = <Text textStyle="xs" color="fg.muted">{`Played ${shortTodayAwareFormat(dayjs(play.data.playDate))}`}</Text> 211 + } 212 + // TODO implement seenAt for play data 213 + if (play.data.playDateCompleted !== undefined && ['all', 'seen'].includes(dates)) { 214 + seenDate = <Text textStyle="xs" color="fg.muted">{`Seen ${shortTodayAwareFormat(dayjs(play.data.playDateCompleted))}`}</Text> 215 + } 216 + if (playDate !== undefined && seenDate !== undefined) { 217 + dateElm = <HStack gap="1">{playDate}<Separator orientation="vertical" height="4" />{seenDate}</HStack> 218 + } else if (playDate !== undefined) { 219 + dateElm = playDate; 220 + } else if (seenDate !== undefined) { 221 + dateElm = seenDate; 222 + } 223 + } 224 + return dateElm; 225 + }
+15
src/client/components/Provider.tsx
··· 1 + "use client" 2 + 3 + import { ChakraProvider, defaultSystem } from "@chakra-ui/react" 4 + import { 5 + ColorModeProvider, 6 + type ColorModeProviderProps, 7 + } from "./Color-Mode" 8 + 9 + export function Provider(props: ColorModeProviderProps) { 10 + return ( 11 + <ChakraProvider value={defaultSystem}> 12 + <ColorModeProvider {...props} /> 13 + </ChakraProvider> 14 + ) 15 + }
+113
src/client/components/ScrobbleActionResult.tsx
··· 1 + import { ComponentProps, Fragment } from "react" 2 + import { Timeline, Icon, Span, Stack, Heading, Tabs, DataList, Alert, List } from '@chakra-ui/react'; 3 + import { JsonPlayObject, LifecycleStep, PlayLifecycle, PlayMatchResult, ScrobbleResult } from "../../core/Atomic"; 4 + import { PlayData } from "./PlayData"; 5 + import { ErrorAlert } from "./ErrorAlert"; 6 + import { BiWrench } from "react-icons/bi"; 7 + import { IoMusicalNoteOutline } from "react-icons/io5"; 8 + import { HiOutlineCloudUpload, HiOutlineCloudDownload } from "react-icons/hi"; 9 + import { LuCheck, LuCircleX, LuX } from "react-icons/lu"; 10 + import { ChakraCodeBlockShort, ChakraPlainBlock, ChakraPlainBlockShort } from "./CodeBlock"; 11 + import { JsonDiffPatch } from "./JsonDiff"; 12 + import { formatNumber, jdiff } from "../../core/DataUtils"; 13 + import { capitalize } from "../../core/StringUtils"; 14 + import { MSCollapsible, MSCollapsibleExternalProps } from "./MSCollapsible"; 15 + import { TimelineErrorIcon } from "./timeline/TimelineIcon"; 16 + 17 + export interface ScrobbleActionResultProps extends MSCollapsibleExternalProps { 18 + result: ScrobbleResult, 19 + scrobbler?: string, 20 + } 21 + 22 + export const ScrobbleActionResult = (props: ScrobbleActionResultProps) => { 23 + 24 + const { 25 + result: { 26 + error, 27 + warnings = [], 28 + payload, 29 + response, 30 + mergedScrobble 31 + } = {}, 32 + scrobbler, 33 + collapsibleOpen 34 + } = props; 35 + 36 + let responseSuffix: JSX.Element, 37 + warningsElm: JSX.Element, 38 + errorElm: JSX.Element | null; 39 + 40 + if (warnings.length > 0) { 41 + warningsElm = <Span color="orange.solid">warnings</Span> 42 + } 43 + if (error !== undefined) { 44 + errorElm = <Span color="red.solid">an error</Span> 45 + } 46 + 47 + if (warningsElm !== undefined && errorElm !== undefined) { 48 + responseSuffix = <Fragment> with {warningsElm} and {errorElm}</Fragment>; 49 + } else if (warningsElm !== undefined || errorElm !== undefined) { 50 + responseSuffix = <Fragment> with {warningsElm ?? errorElm}</Fragment>; 51 + } 52 + 53 + return ( 54 + <Timeline.Root variant="subtle" css={{ "--timeline-separator-display": 'block' }}> 55 + <Timeline.Item> 56 + <Timeline.Connector> 57 + <Timeline.Separator /> 58 + <Timeline.Indicator> 59 + <Icon fontSize="lg"> 60 + <HiOutlineCloudUpload /> 61 + </Icon> 62 + </Timeline.Indicator> 63 + </Timeline.Connector> 64 + <Timeline.Content> 65 + <Timeline.Title> 66 + <Span color="fg.muted">Sent</Span> Scrobble Payload{scrobbler !== undefined ? <Fragment><Span color="fg.muted">to</Span> {capitalize(scrobbler)}</Fragment> : null} 67 + </Timeline.Title> 68 + <MSCollapsible indicator="Show Payload" defaultOpen={collapsibleOpen} hideBelow="sm"> 69 + <ChakraCodeBlockShort code={payload} language="json" maxLines={20} /> 70 + </MSCollapsible> 71 + </Timeline.Content> 72 + </Timeline.Item> 73 + {response !== undefined || error !== undefined ? ( 74 + <Timeline.Item> 75 + <Timeline.Connector> 76 + <Timeline.Separator /> 77 + <Timeline.Indicator> 78 + {error !== undefined ? <TimelineErrorIcon /> : ( 79 + <Icon fontSize="lg"> 80 + <HiOutlineCloudDownload /> 81 + </Icon> 82 + )} 83 + </Timeline.Indicator> 84 + </Timeline.Connector> 85 + <Timeline.Content> 86 + <Timeline.Title> 87 + <Span color="fg.muted">Received</Span> Response{scrobbler !== undefined ? <Fragment><Span color="fg.muted">from</Span> {capitalize(scrobbler)}</Fragment> : null}{responseSuffix !== undefined ? <Span> {responseSuffix}</Span> : null} 88 + </Timeline.Title> 89 + <MSCollapsible indicator="Show Response" defaultOpen={collapsibleOpen} hideBelow="sm"> 90 + <Stack gap="4"> 91 + {error !== undefined ? <ErrorAlert error={error} /> : null} 92 + {response !== undefined ? <ChakraCodeBlockShort code={response} language="json" maxLines={20} /> : null} 93 + {warnings.length > 0 ? ( 94 + <Alert.Root status="warning"> 95 + <Alert.Indicator /> 96 + <Alert.Content> 97 + <Alert.Title>Warnings in Response</Alert.Title> 98 + <Alert.Description> 99 + <List.Root> 100 + {warnings.map((x) => <List.Item>{x}</List.Item>)} 101 + </List.Root> 102 + </Alert.Description> 103 + </Alert.Content> 104 + </Alert.Root> 105 + ) : null} 106 + </Stack> 107 + </MSCollapsible> 108 + </Timeline.Content> 109 + </Timeline.Item> 110 + ) : null} 111 + </Timeline.Root> 112 + ) 113 + }
+74
src/client/components/ScrobbleMatchResult.tsx
··· 1 + import { ComponentProps, Fragment } from "react" 2 + import { Timeline, Icon, Span, Stack, Heading, Tabs, DataList, List } from '@chakra-ui/react'; 3 + import { JsonPlayObject, LifecycleStep, PlayMatchResult } from "../../core/Atomic"; 4 + import { PlayData } from "./PlayData"; 5 + import { ErrorAlert } from "./ErrorAlert"; 6 + import { BiWrench } from "react-icons/bi"; 7 + import { IoMusicalNoteOutline } from "react-icons/io5"; 8 + import { LuCheck, LuCircleX, LuX } from "react-icons/lu"; 9 + import { ChakraCodeBlockShort, ChakraPlainBlock, ChakraPlainBlockShort } from "./CodeBlock"; 10 + import { JsonDiffPatch } from "./JsonDiff"; 11 + import { formatNumber, jdiff } from "../../core/DataUtils"; 12 + 13 + export interface ScrobbleMatchResultProps { 14 + match: PlayMatchResult 15 + } 16 + 17 + export const ScrobbleMatchResult = (props: ScrobbleMatchResultProps) => { 18 + 19 + const { 20 + match: { 21 + closestMatchedPlay 22 + } = {}, 23 + match 24 + } = props; 25 + 26 + return ( 27 + <Tabs.Root defaultValue="result" lazyMount unmountOnExit> 28 + <Tabs.List> 29 + <Tabs.Trigger value="result">Results</Tabs.Trigger> 30 + <Tabs.Trigger value="closest">Closest Match</Tabs.Trigger> 31 + </Tabs.List> 32 + <Tabs.Content value="result"> 33 + <DataList.Root orientation="horizontal"> 34 + <DataList.Item> 35 + <DataList.ItemLabel flexShrink="1">Matched?</DataList.ItemLabel> 36 + <DataList.ItemValue><Icon fontSize="2xl"> 37 + {match.match ? <LuCheck /> : <LuX />} 38 + </Icon></DataList.ItemValue> 39 + </DataList.Item> 40 + <DataList.Item> 41 + <DataList.ItemLabel flexShrink="1">Score</DataList.ItemLabel> 42 + <DataList.ItemValue>{formatNumber(match.score)}</DataList.ItemValue> 43 + </DataList.Item> 44 + <DataList.Item> 45 + <DataList.ItemLabel flexShrink="1">Reason</DataList.ItemLabel> 46 + <DataList.ItemValue>{match.reason}</DataList.ItemValue> 47 + </DataList.Item> 48 + <DataList.Item> 49 + <DataList.ItemLabel flexShrink="1">Breakdown</DataList.ItemLabel> 50 + <DataList.ItemValue> 51 + <List.Root> 52 + {match.breakdowns.map((x) => { 53 + if (x.includes('Time Detail')) { 54 + const sub = x.substring(15).split('|'); 55 + return ( 56 + <List.Root ps="5"> 57 + {sub.map((y) => <List.Item>{y}</List.Item>)} 58 + </List.Root> 59 + 60 + ) 61 + } 62 + return <List.Item>{x}</List.Item> 63 + })} 64 + </List.Root> 65 + </DataList.ItemValue> 66 + </DataList.Item> 67 + </DataList.Root> 68 + </Tabs.Content> 69 + <Tabs.Content value="closest"> 70 + <PlayData play={closestMatchedPlay} /> 71 + </Tabs.Content> 72 + </Tabs.Root> 73 + ) 74 + }
+11
src/client/components/TextMuted.tsx
··· 1 + import { Text as ChakraText } from "@chakra-ui/react" 2 + import { ComponentProps } from "react" 3 + 4 + export const TextMuted = (props: ComponentProps<typeof ChakraText>) => { 5 + const { 6 + children, 7 + ...rest 8 + } = props; 9 + return <ChakraText textStyle="xs" color="fg.muted" {...rest}>{props.children} 10 + </ChakraText> 11 + }
+108
src/client/components/TransformSteps.tsx
··· 1 + import { ComponentProps, Fragment } from "react" 2 + import { Timeline, Icon, Span, Stack, Heading, Box } from '@chakra-ui/react'; 3 + import { JsonPlayObject, LifecycleStep } from "../../core/Atomic"; 4 + import { PlayData } from "./PlayData"; 5 + import { ErrorAlert } from "./ErrorAlert"; 6 + import { BiWrench } from "react-icons/bi"; 7 + import { MdMusicNote } from "react-icons/md"; 8 + import { ChakraCodeBlockShort, ChakraPlainBlockShort } from "./CodeBlock"; 9 + import { JsonDiffPatch } from "./JsonDiff"; 10 + import { jdiff } from "../../core/DataUtils"; 11 + import { MSCollapsible, MSCollapsibleExternalProps } from "./MSCollapsible"; 12 + 13 + export interface LifeycleStepsTimelineProps extends MSCollapsibleExternalProps { 14 + steps: LifecycleStep[] 15 + original: JsonPlayObject 16 + } 17 + 18 + export const TransformSteps = (props: LifeycleStepsTimelineProps) => { 19 + const { 20 + steps, 21 + original, 22 + collapsibleOpen 23 + } = props; 24 + 25 + let currentPlay: JsonPlayObject | false = JSON.parse(JSON.stringify(original)); 26 + 27 + return ( 28 + <Timeline.Root variant="subtle" css={{ "--timeline-separator-display": 'block' }}> 29 + {steps.map((x, index) => { 30 + const { 31 + patch, 32 + inputs, 33 + source, 34 + name 35 + } = x; 36 + let err: Error; 37 + const left = currentPlay !== false ? JSON.parse(JSON.stringify(currentPlay)) : false; 38 + if (currentPlay !== false && patch !== undefined) { 39 + try { 40 + currentPlay = jdiff.patch(currentPlay, patch) as JsonPlayObject; 41 + } catch (e) { 42 + err = new Error('Could not patch Play object', { cause: e }); 43 + currentPlay = false; 44 + } 45 + } else { 46 + currentPlay = false; 47 + } 48 + let diffElm: JSX.Element; 49 + if(left !== false && currentPlay !== false) { 50 + diffElm = <ChakraPlainBlockShort code={left}> 51 + <JsonDiffPatch left={left} right={currentPlay} /> 52 + </ChakraPlainBlockShort>; 53 + } else if(patch !== undefined) { 54 + diffElm = <ChakraCodeBlockShort code={patch} />; 55 + } 56 + const showAnyDetails = inputs !== undefined || diffElm !== undefined || err !== undefined; 57 + return <Timeline.Item> 58 + <Timeline.Connector> 59 + <Timeline.Separator /> 60 + <Timeline.Indicator> 61 + <Icon fontSize="lg"> 62 + <BiWrench /> 63 + </Icon> 64 + </Timeline.Indicator> 65 + </Timeline.Connector> 66 + <Timeline.Content> 67 + <Timeline.Title> 68 + {name} <Span color="fg.muted">with</Span> {source} 69 + </Timeline.Title> 70 + 71 + {showAnyDetails ? <MSCollapsible indicator="Show Details" defaultOpen={collapsibleOpen} hideBelow="sm"> 72 + <Stack gap="2"> 73 + {err !== undefined ? <ErrorAlert error={err} /> : null} 74 + {diffElm !== undefined ? <Fragment><Heading size="sm">Diff</Heading>{diffElm}</Fragment> : null } 75 + {inputs !== undefined ? ( 76 + <Fragment> 77 + <Heading size="sm">Inputs</Heading> 78 + <Stack gap="1"> 79 + {x.inputs.map((y) => { 80 + return <ChakraCodeBlockShort code={y.input} title={y.type} /> 81 + })} 82 + </Stack></Fragment>) : null} 83 + </Stack> 84 + </MSCollapsible> : null } 85 + </Timeline.Content> 86 + </Timeline.Item> 87 + })} 88 + {currentPlay !== false ? ( 89 + <Timeline.Item hideBelow="sm"> 90 + <Timeline.Connector> 91 + <Timeline.Separator /> 92 + <Timeline.Indicator> 93 + <Icon fontSize="lg"> 94 + <MdMusicNote /> 95 + </Icon> 96 + </Timeline.Indicator> 97 + </Timeline.Connector> 98 + <Timeline.Content> 99 + <Timeline.Title> 100 + Final Play<Span color="fg.muted">after all Transforms</Span> 101 + </Timeline.Title> 102 + <PlayData play={original} final={currentPlay} dates={false} compareDefault="Final" /> 103 + </Timeline.Content> 104 + </Timeline.Item> 105 + ) : null} 106 + </Timeline.Root> 107 + ) 108 + }
+8
src/client/components/timeline/TimelineIcon.tsx
··· 1 + import { AiOutlineExclamationCircle } from "react-icons/ai"; 2 + import { Icon } from '@chakra-ui/react'; 3 + 4 + export const TimelineErrorIcon = () => ( 5 + <Icon fontSize="lg" color="red.focusRing"> 6 + <AiOutlineExclamationCircle /> 7 + </Icon> 8 + )
+32 -9
src/core/Atomic.ts
··· 290 290 // lifecycle: PlayLifecycle 291 291 // } 292 292 293 + export type ErrorLike = Error | ErrorObject; 294 + 295 + export interface ScrobbleResult { 296 + match?: PlayMatchResult 297 + payload?: ScrobblePayload 298 + warnings?: string[] 299 + error?: Error | ErrorObject 300 + response?: ScrobbleResponse 301 + mergedScrobble?: PlayObjectLifecycleless 302 + } 303 + 293 304 export interface PlayLifecycle { 294 305 input?: object 295 306 original: PlayObjectLifecycleless 296 307 steps: LifecycleStep[] 297 - scrobble?: { 298 - match?: PlayMatchResult 299 - payload?: ScrobblePayload 300 - warnings?: string[] 301 - error?: Error | ErrorObject 302 - response?: ScrobbleResponse 303 - mergedScrobble?: PlayObjectLifecycleless 304 - } 308 + scrobble?: ScrobbleResult 305 309 } 306 310 307 311 export interface LifecycleStep { ··· 353 357 // meta: PlayMetaLifecycled 354 358 // } 355 359 360 + export interface PlayActivity { 361 + play: JsonPlayObject 362 + status: string 363 + error?: ErrorLike 364 + } 356 365 export interface JsonPlayObject extends AmbPlayObject { 357 366 data: JsonPlayData 358 367 } ··· 569 578 /** Number of SECONDS since 1970 */ 570 579 export type UnixTimestamp = number; 571 580 572 - export type Writeable<T> = { -readonly [P in keyof T]: T[P] }; 581 + export type Writeable<T> = { -readonly [P in keyof T]: T[P] }; 582 + 583 + export const SHORT_CALENDAR_NOTZ_FORMAT = 'MMM D HH:mm:ss'; 584 + export const SHORT_TODAY_NOTZ_FORMAT = 'HH:mm:ss'; 585 + export interface numberFormatOptions { 586 + toFixed: number; 587 + defaultVal?: any; 588 + prefix?: string; 589 + suffix?: string; 590 + round?: { 591 + type?: string; 592 + enable: boolean; 593 + indicate?: boolean; 594 + }; 595 + }
+45
src/core/DataUtils.ts
··· 1 + import { create as diffCreate } from "jsondiffpatch"; 2 + import { numberFormatOptions } from './Atomic.js'; 3 + 4 + 5 + export const jdiff = diffCreate({ 6 + propertyFilter(name, context) { 7 + return name !== 'lifecycle'; 8 + }, 9 + cloneDiffValues: true 10 + //omitRemovedValues: true 11 + });export const formatNumber = (val: number | string, options?: numberFormatOptions) => { 12 + const { 13 + toFixed = 2, defaultVal = null, prefix = '', suffix = '', round, 14 + } = options || {}; 15 + let parsedVal = typeof val === 'number' ? val : Number.parseFloat(val); 16 + if (Number.isNaN(parsedVal)) { 17 + return defaultVal; 18 + } 19 + if (!Number.isFinite(val)) { 20 + return 'Infinite'; 21 + } 22 + let prefixStr = prefix; 23 + const { enable = false, indicate = true, type = 'round' } = round || {}; 24 + if (enable && !Number.isInteger(parsedVal)) { 25 + switch (type) { 26 + case 'round': 27 + parsedVal = Math.round(parsedVal); 28 + break; 29 + case 'ceil': 30 + parsedVal = Math.ceil(parsedVal); 31 + break; 32 + case 'floor': 33 + parsedVal = Math.floor(parsedVal); 34 + } 35 + if (indicate) { 36 + prefixStr = `~${prefix}`; 37 + } 38 + } 39 + const localeString = parsedVal.toLocaleString(undefined, { 40 + minimumFractionDigits: toFixed, 41 + maximumFractionDigits: toFixed, 42 + }); 43 + return `${prefixStr}${localeString}${suffix}`; 44 + }; 45 +
+30
src/core/PlayUtils.ts
··· 1 + import { PlayPlatformId } from "../backend/common/infrastructure/Atomic.js"; 2 + import { PlayObject } from "./Atomic.js"; 3 + 4 + 5 + /** sorts playObj formatted objects by playDate in descending (newest first) order */ 6 + export const sortByNewestPlayDate = (a: PlayObject, b: PlayObject) => { 7 + const { 8 + data: { 9 + playDate: aPlayDate 10 + } = {} 11 + } = a; 12 + const { 13 + data: { 14 + playDate: bPlayDate 15 + } = {} 16 + } = b; 17 + if (aPlayDate === undefined && bPlayDate === undefined) { 18 + return 0; 19 + } 20 + if (aPlayDate === undefined) { 21 + return 1; 22 + } 23 + if (bPlayDate === undefined) { 24 + return -1; 25 + } 26 + return aPlayDate.isBefore(bPlayDate) ? 1 : -1; 27 + };export const genGroupIdStr = (id: PlayPlatformId) => { 28 + return `${id[0]}-${id[1]}`; 29 + }; 30 +
+17 -2
src/core/StringUtils.ts
··· 13 13 ScrobbleTsSOC, 14 14 TrackStringOptions 15 15 } from "./Atomic.js"; 16 - import { DELIMETERS_REGEX } from "../backend/common/infrastructure/Atomic.js"; 16 + import { DELIMETERS_REGEX, DELIMITERS } from "../backend/common/infrastructure/Atomic.js"; 17 17 import { parseRegexSingle } from "@foxxmd/regex-buddy-core"; 18 18 19 19 dayjs.extend(utc) ··· 287 287 const finalProper = spaced ? ` ${finalJoiner} ` : finalJoiner; 288 288 289 289 return [start.join(joinerProper), end].join(finalProper); 290 - } 290 + } 291 + 292 + export const safeStringify = (json: unknown) => JSON.stringify(json, null, 2); 293 + export const findDelimiters = (str: string, delimiters = DELIMITERS) => { 294 + const found: string[] = []; 295 + for (const d of delimiters) { 296 + if (str.indexOf(d) !== -1) { 297 + found.push(d); 298 + } 299 + } 300 + if (found.length === 0) { 301 + return undefined; 302 + } 303 + return found; 304 + };export const containsDelimiters = (str: string) => null !== str.match(/[,&/\\]+/i); 305 +
+16
src/core/TimeUtils.ts
··· 1 + import dayjs, { Dayjs } from "dayjs"; 2 + import isToday from 'dayjs/plugin/isToday.js'; 3 + import { SHORT_CALENDAR_NOTZ_FORMAT, SHORT_TODAY_NOTZ_FORMAT } from "./Atomic.js"; 4 + 5 + dayjs.extend(isToday); 6 + 7 + export const todayAwareFormat = (date: Dayjs, opts: { fullFormat?: string; todayFormat?: string; } = {}): string => { 8 + const { 9 + fullFormat, todayFormat = 'HH:mm:ssZ' 10 + } = opts; 11 + return date.format(date.isToday() ? todayFormat : fullFormat); 12 + }; 13 + 14 + export const shortTodayAwareFormat = (date: Dayjs): string => { 15 + return todayAwareFormat(date, {fullFormat: SHORT_CALENDAR_NOTZ_FORMAT, todayFormat: SHORT_TODAY_NOTZ_FORMAT}); 16 + }
src/core/tests/utils/fixtures.ts

This is a binary file and will not be displayed.

src/stories/.Button.stories.ts.swo

This is a binary file and will not be displayed.

+42
src/stories/ActivityTimeline.stories.tsx
··· 1 + import preview from "../../.storybook/preview.js"; 2 + import React from 'react'; 3 + 4 + import { fn } from 'storybook/test'; 5 + import { Container } from '@chakra-ui/react'; 6 + import { ActivityTimeline } from "../client/components/ActivityTimeline"; 7 + import {Provider} from "../client/components/Provider"; 8 + import { generateJsonPlays } from "../core/PlayTestUtils.js"; 9 + import { ErrorLike, JsonPlayObject, PlayLifecycle } from "../core/Atomic.js"; 10 + import { examplePlay, lastfmErrorExample } from "./storyUtils.js"; 11 + 12 + // More on how to set up stories at: https://storybook.js.org/docs/writing-stories#default-export 13 + const meta = preview.meta({ 14 + title: 'Examples/ActivityTimline', 15 + component: ActivityTimeline, 16 + parameters: { 17 + // Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/configure/story-layout 18 + layout: 'padded', 19 + }, 20 + // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs 21 + tags: ['autodocs'], 22 + // More on argTypes: https://storybook.js.org/docs/api/argtypes 23 + args: { 24 + play: examplePlay() 25 + }, 26 + decorators: [ 27 + (Story) => (<Provider><Container maxWidth="4xl"><Story/></Container></Provider>), 28 + ] 29 + // Use `fn` to spy on the onClick arg, which will appear in the actions panel once invoked: https://storybook.js.org/docs/essentials/actions#story-args 30 + }); 31 + 32 + // More on writing stories with args: https://storybook.js.org/docs/writing-stories/args 33 + export const ActivityTimelineStory = meta.story({ 34 + //render: function Render(args) { return (<ChakraProvider><MyList></MyList></ChakraProvider>) } 35 + }); 36 + 37 + export const ScrobbleError = meta.story({ 38 + args: { 39 + play: lastfmErrorExample() 40 + } 41 + }); 42 +
+58
src/stories/Button.stories.ts
··· 1 + import preview from "../../.storybook/preview.js"; 2 + 3 + import { fn } from 'storybook/test'; 4 + 5 + import { Button } from './Button.js'; 6 + 7 + // More on how to set up stories at: https://storybook.js.org/docs/writing-stories#default-export 8 + const meta = preview.meta({ 9 + title: 'Example/Button', 10 + component: Button, 11 + parameters: { 12 + // Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/configure/story-layout 13 + layout: 'centered', 14 + }, 15 + // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs 16 + tags: ['autodocs'], 17 + // More on argTypes: https://storybook.js.org/docs/api/argtypes 18 + argTypes: { 19 + backgroundColor: { control: 'color' }, 20 + }, 21 + // Use `fn` to spy on the onClick arg, which will appear in the actions panel once invoked: https://storybook.js.org/docs/essentials/actions#story-args 22 + args: { onClick: fn() }, 23 + }); 24 + 25 + // More on writing stories with args: https://storybook.js.org/docs/writing-stories/args 26 + export const Primary = meta.story({ 27 + args: { 28 + primary: true, 29 + label: 'Button', 30 + }, 31 + }); 32 + 33 + export const Secondary = meta.story({ 34 + args: { 35 + label: 'Button', 36 + }, 37 + }); 38 + 39 + export const Large = meta.story({ 40 + args: { 41 + size: 'large', 42 + label: 'Button', 43 + }, 44 + }); 45 + 46 + export const Small = meta.story({ 47 + args: { 48 + size: 'small', 49 + label: 'Button', 50 + }, 51 + }); 52 + 53 + export const Mine = meta.story({ 54 + args: { 55 + primary: false, 56 + label: "Button" 57 + } 58 + });
+37
src/stories/Button.tsx
··· 1 + import React from 'react'; 2 + 3 + import './button.css'; 4 + 5 + export interface ButtonProps { 6 + /** Is this the principal call to action on the page? */ 7 + primary?: boolean; 8 + /** What background color to use */ 9 + backgroundColor?: string; 10 + /** How large should the button be? */ 11 + size?: 'small' | 'medium' | 'large'; 12 + /** Button contents */ 13 + label: string; 14 + /** Optional click handler */ 15 + onClick?: () => void; 16 + } 17 + 18 + /** Primary UI component for user interaction */ 19 + export const Button = ({ 20 + primary = false, 21 + size = 'medium', 22 + backgroundColor, 23 + label, 24 + ...props 25 + }: ButtonProps) => { 26 + const mode = primary ? 'storybook-button--primary' : 'storybook-button--secondary'; 27 + return ( 28 + <button 29 + type="button" 30 + className={['storybook-button', `storybook-button--${size}`, mode].join(' ')} 31 + style={{ backgroundColor }} 32 + {...props} 33 + > 34 + {label} 35 + </button> 36 + ); 37 + };
+364
src/stories/Configure.mdx
··· 1 + import { Meta } from "@storybook/addon-docs/blocks"; 2 + 3 + import Github from "./assets/github.svg"; 4 + import Discord from "./assets/discord.svg"; 5 + import Youtube from "./assets/youtube.svg"; 6 + import Tutorials from "./assets/tutorials.svg"; 7 + import Styling from "./assets/styling.png"; 8 + import Context from "./assets/context.png"; 9 + import Assets from "./assets/assets.png"; 10 + import Docs from "./assets/docs.png"; 11 + import Share from "./assets/share.png"; 12 + import FigmaPlugin from "./assets/figma-plugin.png"; 13 + import Testing from "./assets/testing.png"; 14 + import Accessibility from "./assets/accessibility.png"; 15 + import Theming from "./assets/theming.png"; 16 + import AddonLibrary from "./assets/addon-library.png"; 17 + 18 + export const RightArrow = () => <svg 19 + viewBox="0 0 14 14" 20 + width="8px" 21 + height="14px" 22 + style={{ 23 + marginLeft: '4px', 24 + display: 'inline-block', 25 + shapeRendering: 'inherit', 26 + verticalAlign: 'middle', 27 + fill: 'currentColor', 28 + 'path fill': 'currentColor' 29 + }} 30 + > 31 + <path d="m11.1 7.35-5.5 5.5a.5.5 0 0 1-.7-.7L10.04 7 4.9 1.85a.5.5 0 1 1 .7-.7l5.5 5.5c.2.2.2.5 0 .7Z" /> 32 + </svg> 33 + 34 + <Meta title="Configure your project" /> 35 + 36 + <div className="sb-container"> 37 + <div className='sb-section-title'> 38 + # Configure your project 39 + 40 + Because Storybook works separately from your app, you'll need to configure it for your specific stack and setup. Below, explore guides for configuring Storybook with popular frameworks and tools. If you get stuck, learn how you can ask for help from our community. 41 + </div> 42 + <div className="sb-section"> 43 + <div className="sb-section-item"> 44 + <img 45 + src={Styling} 46 + alt="A wall of logos representing different styling technologies" 47 + /> 48 + <h4 className="sb-section-item-heading">Add styling and CSS</h4> 49 + <p className="sb-section-item-paragraph">Like with web applications, there are many ways to include CSS within Storybook. Learn more about setting up styling within Storybook.</p> 50 + <a 51 + href="https://storybook.js.org/docs/configure/styling-and-css/?renderer=react&ref=configure" 52 + target="_blank" 53 + >Learn more<RightArrow /></a> 54 + </div> 55 + <div className="sb-section-item"> 56 + <img 57 + src={Context} 58 + alt="An abstraction representing the composition of data for a component" 59 + /> 60 + <h4 className="sb-section-item-heading">Provide context and mocking</h4> 61 + <p className="sb-section-item-paragraph">Often when a story doesn't render, it's because your component is expecting a specific environment or context (like a theme provider) to be available.</p> 62 + <a 63 + href="https://storybook.js.org/docs/writing-stories/decorators/?renderer=react&ref=configure#context-for-mocking" 64 + target="_blank" 65 + >Learn more<RightArrow /></a> 66 + </div> 67 + <div className="sb-section-item"> 68 + <img src={Assets} alt="A representation of typography and image assets" /> 69 + <div> 70 + <h4 className="sb-section-item-heading">Load assets and resources</h4> 71 + <p className="sb-section-item-paragraph">To link static files (like fonts) to your projects and stories, use the 72 + `staticDirs` configuration option to specify folders to load when 73 + starting Storybook.</p> 74 + <a 75 + href="https://storybook.js.org/docs/configure/images-and-assets/?renderer=react&ref=configure" 76 + target="_blank" 77 + >Learn more<RightArrow /></a> 78 + </div> 79 + </div> 80 + </div> 81 + </div> 82 + <div className="sb-container"> 83 + <div className='sb-section-title'> 84 + # Do more with Storybook 85 + 86 + Now that you know the basics, let's explore other parts of Storybook that will improve your experience. This list is just to get you started. You can customise Storybook in many ways to fit your needs. 87 + </div> 88 + 89 + <div className="sb-section"> 90 + <div className="sb-features-grid"> 91 + <div className="sb-grid-item"> 92 + <img src={Docs} alt="A screenshot showing the autodocs tag being set, pointing a docs page being generated" /> 93 + <h4 className="sb-section-item-heading">Autodocs</h4> 94 + <p className="sb-section-item-paragraph">Auto-generate living, 95 + interactive reference documentation from your components and stories.</p> 96 + <a 97 + href="https://storybook.js.org/docs/writing-docs/autodocs/?renderer=react&ref=configure" 98 + target="_blank" 99 + >Learn more<RightArrow /></a> 100 + </div> 101 + <div className="sb-grid-item"> 102 + <img src={Share} alt="A browser window showing a Storybook being published to a chromatic.com URL" /> 103 + <h4 className="sb-section-item-heading">Publish to Chromatic</h4> 104 + <p className="sb-section-item-paragraph">Publish your Storybook to review and collaborate with your entire team.</p> 105 + <a 106 + href="https://storybook.js.org/docs/sharing/publish-storybook/?renderer=react&ref=configure#publish-storybook-with-chromatic" 107 + target="_blank" 108 + >Learn more<RightArrow /></a> 109 + </div> 110 + <div className="sb-grid-item"> 111 + <img src={FigmaPlugin} alt="Windows showing the Storybook plugin in Figma" /> 112 + <h4 className="sb-section-item-heading">Figma Plugin</h4> 113 + <p className="sb-section-item-paragraph">Embed your stories into Figma to cross-reference the design and live 114 + implementation in one place.</p> 115 + <a 116 + href="https://storybook.js.org/docs/sharing/design-integrations/?renderer=react&ref=configure#embed-storybook-in-figma-with-the-plugin" 117 + target="_blank" 118 + >Learn more<RightArrow /></a> 119 + </div> 120 + <div className="sb-grid-item"> 121 + <img src={Testing} alt="Screenshot of tests passing and failing" /> 122 + <h4 className="sb-section-item-heading">Testing</h4> 123 + <p className="sb-section-item-paragraph">Use stories to test a component in all its variations, no matter how 124 + complex.</p> 125 + <a 126 + href="https://storybook.js.org/docs/writing-tests/?renderer=react&ref=configure" 127 + target="_blank" 128 + >Learn more<RightArrow /></a> 129 + </div> 130 + <div className="sb-grid-item"> 131 + <img src={Accessibility} alt="Screenshot of accessibility tests passing and failing" /> 132 + <h4 className="sb-section-item-heading">Accessibility</h4> 133 + <p className="sb-section-item-paragraph">Automatically test your components for a11y issues as you develop.</p> 134 + <a 135 + href="https://storybook.js.org/docs/writing-tests/accessibility-testing/?renderer=react&ref=configure" 136 + target="_blank" 137 + >Learn more<RightArrow /></a> 138 + </div> 139 + <div className="sb-grid-item"> 140 + <img src={Theming} alt="Screenshot of Storybook in light and dark mode" /> 141 + <h4 className="sb-section-item-heading">Theming</h4> 142 + <p className="sb-section-item-paragraph">Theme Storybook's UI to personalize it to your project.</p> 143 + <a 144 + href="https://storybook.js.org/docs/configure/theming/?renderer=react&ref=configure" 145 + target="_blank" 146 + >Learn more<RightArrow /></a> 147 + </div> 148 + </div> 149 + </div> 150 + </div> 151 + <div className='sb-addon'> 152 + <div className='sb-addon-text'> 153 + <h4>Addons</h4> 154 + <p className="sb-section-item-paragraph">Integrate your tools with Storybook to connect workflows.</p> 155 + <a 156 + href="https://storybook.js.org/addons/?ref=configure" 157 + target="_blank" 158 + >Discover all addons<RightArrow /></a> 159 + </div> 160 + <div className='sb-addon-img'> 161 + <img src={AddonLibrary} alt="Integrate your tools with Storybook to connect workflows." /> 162 + </div> 163 + </div> 164 + 165 + <div className="sb-section sb-socials"> 166 + <div className="sb-section-item"> 167 + <img src={Github} alt="Github logo" className="sb-explore-image"/> 168 + Join our contributors building the future of UI development. 169 + 170 + <a 171 + href="https://github.com/storybookjs/storybook" 172 + target="_blank" 173 + >Star on GitHub<RightArrow /></a> 174 + </div> 175 + <div className="sb-section-item"> 176 + <img src={Discord} alt="Discord logo" className="sb-explore-image"/> 177 + <div> 178 + Get support and chat with frontend developers. 179 + 180 + <a 181 + href="https://discord.gg/storybook" 182 + target="_blank" 183 + >Join Discord server<RightArrow /></a> 184 + </div> 185 + </div> 186 + <div className="sb-section-item"> 187 + <img src={Youtube} alt="Youtube logo" className="sb-explore-image"/> 188 + <div> 189 + Watch tutorials, feature previews and interviews. 190 + 191 + <a 192 + href="https://www.youtube.com/@chromaticui" 193 + target="_blank" 194 + >Watch on YouTube<RightArrow /></a> 195 + </div> 196 + </div> 197 + <div className="sb-section-item"> 198 + <img src={Tutorials} alt="A book" className="sb-explore-image"/> 199 + <p>Follow guided walkthroughs on for key workflows.</p> 200 + 201 + <a 202 + href="https://storybook.js.org/tutorials/?ref=configure" 203 + target="_blank" 204 + >Discover tutorials<RightArrow /></a> 205 + </div> 206 + </div> 207 + 208 + <style> 209 + {` 210 + .sb-container { 211 + margin-bottom: 48px; 212 + } 213 + 214 + .sb-section { 215 + width: 100%; 216 + display: flex; 217 + flex-direction: row; 218 + gap: 20px; 219 + } 220 + 221 + img { 222 + object-fit: cover; 223 + } 224 + 225 + .sb-section-title { 226 + margin-bottom: 32px; 227 + } 228 + 229 + .sb-section a:not(h1 a, h2 a, h3 a) { 230 + font-size: 14px; 231 + } 232 + 233 + .sb-section-item, .sb-grid-item { 234 + flex: 1; 235 + display: flex; 236 + flex-direction: column; 237 + } 238 + 239 + .sb-section-item-heading { 240 + padding-top: 20px !important; 241 + padding-bottom: 5px !important; 242 + margin: 0 !important; 243 + } 244 + .sb-section-item-paragraph { 245 + margin: 0; 246 + padding-bottom: 10px; 247 + } 248 + 249 + .sb-chevron { 250 + margin-left: 5px; 251 + } 252 + 253 + .sb-features-grid { 254 + display: grid; 255 + grid-template-columns: repeat(2, 1fr); 256 + grid-gap: 32px 20px; 257 + } 258 + 259 + .sb-socials { 260 + display: grid; 261 + grid-template-columns: repeat(4, 1fr); 262 + } 263 + 264 + .sb-socials p { 265 + margin-bottom: 10px; 266 + } 267 + 268 + .sb-explore-image { 269 + max-height: 32px; 270 + align-self: flex-start; 271 + } 272 + 273 + .sb-addon { 274 + width: 100%; 275 + display: flex; 276 + align-items: center; 277 + position: relative; 278 + background-color: #EEF3F8; 279 + border-radius: 5px; 280 + border: 1px solid rgba(0, 0, 0, 0.05); 281 + background: #EEF3F8; 282 + height: 180px; 283 + margin-bottom: 48px; 284 + overflow: hidden; 285 + } 286 + 287 + .sb-addon-text { 288 + padding-left: 48px; 289 + max-width: 240px; 290 + } 291 + 292 + .sb-addon-text h4 { 293 + padding-top: 0px; 294 + } 295 + 296 + .sb-addon-img { 297 + position: absolute; 298 + left: 345px; 299 + top: 0; 300 + height: 100%; 301 + width: 200%; 302 + overflow: hidden; 303 + } 304 + 305 + .sb-addon-img img { 306 + width: 650px; 307 + transform: rotate(-15deg); 308 + margin-left: 40px; 309 + margin-top: -72px; 310 + box-shadow: 0 0 1px rgba(255, 255, 255, 0); 311 + backface-visibility: hidden; 312 + } 313 + 314 + @media screen and (max-width: 800px) { 315 + .sb-addon-img { 316 + left: 300px; 317 + } 318 + } 319 + 320 + @media screen and (max-width: 600px) { 321 + .sb-section { 322 + flex-direction: column; 323 + } 324 + 325 + .sb-features-grid { 326 + grid-template-columns: repeat(1, 1fr); 327 + } 328 + 329 + .sb-socials { 330 + grid-template-columns: repeat(2, 1fr); 331 + } 332 + 333 + .sb-addon { 334 + height: 280px; 335 + align-items: flex-start; 336 + padding-top: 32px; 337 + overflow: hidden; 338 + } 339 + 340 + .sb-addon-text { 341 + padding-left: 24px; 342 + } 343 + 344 + .sb-addon-img { 345 + right: 0; 346 + left: 0; 347 + top: 130px; 348 + bottom: 0; 349 + overflow: hidden; 350 + height: auto; 351 + width: 124%; 352 + } 353 + 354 + .sb-addon-img img { 355 + width: 1200px; 356 + transform: rotate(-12deg); 357 + margin-left: 0; 358 + margin-top: 48px; 359 + margin-bottom: -40px; 360 + margin-left: -24px; 361 + } 362 + } 363 + `} 364 + </style>
+53
src/stories/ErrorAlert.stories.tsx
··· 1 + import preview from "../../.storybook/preview.js"; 2 + import React from 'react'; 3 + import { Container } from '@chakra-ui/react'; 4 + 5 + import { fn } from 'storybook/test'; 6 + import { ErrorAlert } from "../client/components/ErrorAlert.js"; 7 + import {Provider} from "../client/components/Provider"; 8 + import { ErrorLike } from "../core/Atomic.js"; 9 + 10 + const stack = "Scrobble Submit Error: Failed to submit to Listenbrainz (listen_type single)\n at ListenbrainzApiClient.submitListen (/app/src/backend/common/vendor/ListenbrainzApiClient.ts:246:19)\n at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async ListenbrainzScrobbler.doScrobble (/app/src/backend/scrobblers/ListenbrainzScrobbler.ts:87:28)\n at async ListenbrainzScrobbler.scrobble (/app/src/backend/scrobblers/AbstractScrobbleClient.ts:679:28)\n at async ListenbrainzScrobbler.processDeadLetterScrobble (/app/src/backend/scrobblers/AbstractScrobbleClient.ts:920:39)\n at async ListenbrainzScrobbler.processDeadLetterQueue (/app/src/backend/scrobblers/AbstractScrobbleClient.ts:894:43)\n at async PromisePoolExecutor.handler (/app/src/backend/tasks/heartbeatClients.ts:35:21)\n at async PromisePoolExecutor.waitForActiveTaskToFinish (/app/node_modules/@supercharge/promise-pool/dist/promise-pool-executor.js:375:9)\n at async PromisePoolExecutor.waitForProcessingSlot (/app/node_modules/@supercharge/promise-pool/dist/promise-pool-executor.js:368:13)\n at async PromisePoolExecutor.process (/app/node_modules/@supercharge/promise-pool/dist/promise-pool-executor.js:354:13)"; 11 + 12 + const errorExample: ErrorLike = { 13 + showStopper: false, 14 + name: "Scrobble Submit Error", 15 + message: "Failed to submit to Listenbrainz (listen_type single)", 16 + stack: `${stack}`, 17 + cause: { 18 + errno: -104, 19 + code: "ECONNRESET", 20 + syscall: "read", 21 + name: "Error", 22 + message: "read ECONNRESET", 23 + stack: "Error: read ECONNRESET\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:218:20)\n at TLSWrap.callbackTrampoline (node:internal/async_hooks:130:17)" 24 + } 25 + } 26 + 27 + type PropsAndCustomArgs = React.ComponentProps<typeof ErrorAlert> & { 28 + }; 29 + // More on how to set up stories at: https://storybook.js.org/docs/writing-stories#default-export 30 + const meta = preview.type<{args: PropsAndCustomArgs}>().meta({ 31 + title: 'Examples/ErrorAlert', 32 + component: ErrorAlert, 33 + parameters: { 34 + // Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/configure/story-layout 35 + layout: 'padded', 36 + }, 37 + // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs 38 + tags: ['autodocs'], 39 + decorators: [ 40 + (Story) => (<Provider><Container maxWidth="8xl"><Story/></Container></Provider>), 41 + ], 42 + args: { 43 + error: errorExample, 44 + }, 45 + // Use `fn` to spy on the onClick arg, which will appear in the actions panel once invoked: https://storybook.js.org/docs/essentials/actions#story-args 46 + }); 47 + 48 + // More on writing stories with args: https://storybook.js.org/docs/writing-stories/args 49 + export const ErrorAlertStory = meta.story({ 50 + render: function Render(args) { 51 + return (<ErrorAlert {...args}/>) 52 + } 53 + });
+31
src/stories/Header.stories.ts
··· 1 + import preview from "../../.storybook/preview.js"; 2 + 3 + import { fn } from 'storybook/test'; 4 + 5 + import { Header } from './Header.js'; 6 + 7 + const meta = preview.meta({ 8 + title: 'Example/Header', 9 + component: Header, 10 + // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs 11 + tags: ['autodocs'], 12 + parameters: { 13 + // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout 14 + layout: 'fullscreen', 15 + }, 16 + args: { 17 + onLogin: fn(), 18 + onLogout: fn(), 19 + onCreateAccount: fn(), 20 + }, 21 + }); 22 + 23 + export const LoggedIn = meta.story({ 24 + args: { 25 + user: { 26 + name: 'Jane Doe', 27 + }, 28 + }, 29 + }); 30 + 31 + export const LoggedOut = meta.story();
+56
src/stories/Header.tsx
··· 1 + import React from 'react'; 2 + 3 + import { Button } from './Button'; 4 + import './header.css'; 5 + 6 + type User = { 7 + name: string; 8 + }; 9 + 10 + export interface HeaderProps { 11 + user?: User; 12 + onLogin?: () => void; 13 + onLogout?: () => void; 14 + onCreateAccount?: () => void; 15 + } 16 + 17 + export const Header = ({ user, onLogin, onLogout, onCreateAccount }: HeaderProps) => ( 18 + <header> 19 + <div className="storybook-header"> 20 + <div> 21 + <svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"> 22 + <g fill="none" fillRule="evenodd"> 23 + <path 24 + d="M10 0h12a10 10 0 0110 10v12a10 10 0 01-10 10H10A10 10 0 010 22V10A10 10 0 0110 0z" 25 + fill="#FFF" 26 + /> 27 + <path 28 + d="M5.3 10.6l10.4 6v11.1l-10.4-6v-11zm11.4-6.2l9.7 5.5-9.7 5.6V4.4z" 29 + fill="#555AB9" 30 + /> 31 + <path 32 + d="M27.2 10.6v11.2l-10.5 6V16.5l10.5-6zM15.7 4.4v11L6 10l9.7-5.5z" 33 + fill="#91BAF8" 34 + /> 35 + </g> 36 + </svg> 37 + <h1>Acme</h1> 38 + </div> 39 + <div> 40 + {user ? ( 41 + <> 42 + <span className="welcome"> 43 + Welcome, <b>{user.name}</b>! 44 + </span> 45 + <Button size="small" onClick={onLogout} label="Log out" /> 46 + </> 47 + ) : ( 48 + <> 49 + <Button size="small" onClick={onLogin} label="Log in" /> 50 + <Button primary size="small" onClick={onCreateAccount} label="Sign up" /> 51 + </> 52 + )} 53 + </div> 54 + </div> 55 + </header> 56 + );
+56
src/stories/List.stories.tsx
··· 1 + import preview from "../../.storybook/preview.js"; 2 + import React from 'react'; 3 + 4 + import { fn } from 'storybook/test'; 5 + import { Container } from '@chakra-ui/react'; 6 + import { CList } from "../client/components/List"; 7 + import {Provider} from "../client/components/Provider"; 8 + import { generateJsonPlays } from "../core/PlayTestUtils.js"; 9 + import { ErrorLike, JsonPlayObject } from "../core/Atomic.js"; 10 + import {examplePlay, lastfmErrorExample} from './storyUtils.js'; 11 + 12 + const stack = "Scrobble Submit Error: Failed to submit to Listenbrainz (listen_type single)\n at ListenbrainzApiClient.submitListen (/app/src/backend/common/vendor/ListenbrainzApiClient.ts:246:19)\n at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async ListenbrainzScrobbler.doScrobble (/app/src/backend/scrobblers/ListenbrainzScrobbler.ts:87:28)\n at async ListenbrainzScrobbler.scrobble (/app/src/backend/scrobblers/AbstractScrobbleClient.ts:679:28)\n at async ListenbrainzScrobbler.processDeadLetterScrobble (/app/src/backend/scrobblers/AbstractScrobbleClient.ts:920:39)\n at async ListenbrainzScrobbler.processDeadLetterQueue (/app/src/backend/scrobblers/AbstractScrobbleClient.ts:894:43)\n at async PromisePoolExecutor.handler (/app/src/backend/tasks/heartbeatClients.ts:35:21)\n at async PromisePoolExecutor.waitForActiveTaskToFinish (/app/node_modules/@supercharge/promise-pool/dist/promise-pool-executor.js:375:9)\n at async PromisePoolExecutor.waitForProcessingSlot (/app/node_modules/@supercharge/promise-pool/dist/promise-pool-executor.js:368:13)\n at async PromisePoolExecutor.process (/app/node_modules/@supercharge/promise-pool/dist/promise-pool-executor.js:354:13)"; 13 + 14 + const errorExample: ErrorLike = { 15 + showStopper: false, 16 + name: "Scrobble Submit Error", 17 + message: "Failed to submit to Listenbrainz (listen_type single)", 18 + stack: `${stack}`, 19 + cause: { 20 + errno: -104, 21 + code: "ECONNRESET", 22 + syscall: "read", 23 + name: "Error", 24 + message: "read ECONNRESET", 25 + stack: "Error: read ECONNRESET\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:218:20)\n at TLSWrap.callbackTrampoline (node:internal/async_hooks:130:17)" 26 + } 27 + } 28 + 29 + // More on how to set up stories at: https://storybook.js.org/docs/writing-stories#default-export 30 + const meta = preview.meta({ 31 + title: 'Examples/ActivityLog', 32 + component: CList, 33 + parameters: { 34 + // Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/configure/story-layout 35 + layout: 'padded', 36 + }, 37 + // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs 38 + tags: ['autodocs'], 39 + // More on argTypes: https://storybook.js.org/docs/api/argtypes 40 + args: { 41 + data:[ 42 + ...generateJsonPlays(2).map((x) => ({play: x, status: 'queued'})), 43 + {play: examplePlay(), status: 'scrobbled'}, 44 + {play: lastfmErrorExample(), status: 'error'} 45 + ] , 46 + }, 47 + decorators: [ 48 + (Story) => (<Provider><Container maxWidth="4xl"><Story/></Container></Provider>), 49 + ] 50 + // Use `fn` to spy on the onClick arg, which will appear in the actions panel once invoked: https://storybook.js.org/docs/essentials/actions#story-args 51 + }); 52 + 53 + // More on writing stories with args: https://storybook.js.org/docs/writing-stories/args 54 + export const List = meta.story({ 55 + //render: function Render(args) { return (<ChakraProvider><MyList></MyList></ChakraProvider>) } 56 + });
+30
src/stories/Page.stories.ts
··· 1 + import preview from "../../.storybook/preview.js"; 2 + 3 + import { expect, userEvent, within } from 'storybook/test'; 4 + 5 + import { Page } from './Page.js'; 6 + 7 + const meta = preview.meta({ 8 + title: 'Example/Page', 9 + component: Page, 10 + parameters: { 11 + // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout 12 + layout: 'fullscreen', 13 + }, 14 + }); 15 + 16 + export const LoggedOut = meta.story(); 17 + 18 + // More on component testing: https://storybook.js.org/docs/writing-tests/interaction-testing 19 + export const LoggedIn = meta.story({ 20 + play: async ({ canvasElement }) => { 21 + const canvas = within(canvasElement); 22 + const loginButton = canvas.getByRole('button', { name: /Log in/i }); 23 + await expect(loginButton).toBeInTheDocument(); 24 + await userEvent.click(loginButton); 25 + await expect(loginButton).not.toBeInTheDocument(); 26 + 27 + const logoutButton = canvas.getByRole('button', { name: /Log out/i }); 28 + await expect(logoutButton).toBeInTheDocument(); 29 + }, 30 + });
+73
src/stories/Page.tsx
··· 1 + import React from 'react'; 2 + 3 + import { Header } from './Header'; 4 + import './page.css'; 5 + 6 + type User = { 7 + name: string; 8 + }; 9 + 10 + export const Page: React.FC = () => { 11 + const [user, setUser] = React.useState<User>(); 12 + 13 + return ( 14 + <article> 15 + <Header 16 + user={user} 17 + onLogin={() => setUser({ name: 'Jane Doe' })} 18 + onLogout={() => setUser(undefined)} 19 + onCreateAccount={() => setUser({ name: 'Jane Doe' })} 20 + /> 21 + 22 + <section className="storybook-page"> 23 + <h2>Pages in Storybook</h2> 24 + <p> 25 + We recommend building UIs with a{' '} 26 + <a href="https://componentdriven.org" target="_blank" rel="noopener noreferrer"> 27 + <strong>component-driven</strong> 28 + </a>{' '} 29 + process starting with atomic components and ending with pages. 30 + </p> 31 + <p> 32 + Render pages with mock data. This makes it easy to build and review page states without 33 + needing to navigate to them in your app. Here are some handy patterns for managing page 34 + data in Storybook: 35 + </p> 36 + <ul> 37 + <li> 38 + Use a higher-level connected component. Storybook helps you compose such data from the 39 + "args" of child component stories 40 + </li> 41 + <li> 42 + Assemble data in the page component from your services. You can mock these services out 43 + using Storybook. 44 + </li> 45 + </ul> 46 + <p> 47 + Get a guided tutorial on component-driven development at{' '} 48 + <a href="https://storybook.js.org/tutorials/" target="_blank" rel="noopener noreferrer"> 49 + Storybook tutorials 50 + </a> 51 + . Read more in the{' '} 52 + <a href="https://storybook.js.org/docs" target="_blank" rel="noopener noreferrer"> 53 + docs 54 + </a> 55 + . 56 + </p> 57 + <div className="tip-wrapper"> 58 + <span className="tip">Tip</span> Adjust the width of the canvas with the{' '} 59 + <svg width="10" height="10" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg"> 60 + <g fill="none" fillRule="evenodd"> 61 + <path 62 + d="M1.5 5.2h4.8c.3 0 .5.2.5.4v5.1c-.1.2-.3.3-.4.3H1.4a.5.5 0 01-.5-.4V5.7c0-.3.2-.5.5-.5zm0-2.1h6.9c.3 0 .5.2.5.4v7a.5.5 0 01-1 0V4H1.5a.5.5 0 010-1zm0-2.1h9c.3 0 .5.2.5.4v9.1a.5.5 0 01-1 0V2H1.5a.5.5 0 010-1zm4.3 5.2H2V10h3.8V6.2z" 63 + id="a" 64 + fill="#999" 65 + /> 66 + </g> 67 + </svg> 68 + Viewports addon in the toolbar 69 + </div> 70 + </section> 71 + </article> 72 + ); 73 + };
+55
src/stories/PlayInfo.stories.tsx
··· 1 + import preview from "../../.storybook/preview.js"; 2 + import React from 'react'; 3 + 4 + import { fn } from 'storybook/test'; 5 + import { PlayData, PlayInfoContainer } from "../client/components/PlayData.js"; 6 + import {Provider} from "../client/components/Provider"; 7 + import { generateArtists, generateJsonPlay, generatePlay } from "../core/PlayTestUtils.js" 8 + import clone from "clone"; 9 + 10 + type PropsAndCustomArgs = React.ComponentProps<typeof PlayData> & { 11 + includeAlbumArtists?: boolean; 12 + defaultFinal?: boolean 13 + }; 14 + // More on how to set up stories at: https://storybook.js.org/docs/writing-stories#default-export 15 + const meta = preview.type<{args: PropsAndCustomArgs}>().meta({ 16 + title: 'Examples/PlayInfo', 17 + component: PlayInfoContainer, 18 + parameters: { 19 + // Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/configure/story-layout 20 + layout: 'padded', 21 + }, 22 + // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs 23 + tags: ['autodocs'], 24 + decorators: [ 25 + (Story) => (<Provider><Story/></Provider>), 26 + ], 27 + args: { 28 + play: generateJsonPlay(), 29 + includeAlbumArtists: false, 30 + showCodeToggle: true, 31 + defaultFinal: true 32 + }, 33 + // Use `fn` to spy on the onClick arg, which will appear in the actions panel once invoked: https://storybook.js.org/docs/essentials/actions#story-args 34 + }); 35 + 36 + // More on writing stories with args: https://storybook.js.org/docs/writing-stories/args 37 + export const PlayInfoStory = meta.story({ 38 + render: function Render(args) { 39 + 40 + if(args.defaultFinal && args.final === undefined) { 41 + const final = clone(args.play); 42 + final.data.track = `${final.data.track} (Album Version)`; 43 + args.final = final; 44 + } 45 + 46 + if(args.includeAlbumArtists && (args.play.data.albumArtists === undefined || args.play.data.albumArtists.length === 0)) { 47 + const aa = generateArtists(undefined, 2); 48 + args.play.data.albumArtists = aa; 49 + if(args.final !== undefined) { 50 + args.final.data.albumArtists = aa; 51 + } 52 + } 53 + return (<PlayInfoContainer {...args}/>) 54 + } 55 + });
src/stories/assets/accessibility.png

This is a binary file and will not be displayed.

+1
src/stories/assets/accessibility.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="none" viewBox="0 0 48 48"><title>Accessibility</title><circle cx="24.334" cy="24" r="24" fill="#A849FF" fill-opacity=".3"/><path fill="#A470D5" fill-rule="evenodd" d="M27.8609 11.585C27.8609 9.59506 26.2497 7.99023 24.2519 7.99023C22.254 7.99023 20.6429 9.65925 20.6429 11.585C20.6429 13.575 22.254 15.1799 24.2519 15.1799C26.2497 15.1799 27.8609 13.575 27.8609 11.585ZM21.8922 22.6473C21.8467 23.9096 21.7901 25.4788 21.5897 26.2771C20.9853 29.0462 17.7348 36.3314 17.3325 37.2275C17.1891 37.4923 17.1077 37.7955 17.1077 38.1178C17.1077 39.1519 17.946 39.9902 18.9802 39.9902C19.6587 39.9902 20.253 39.6293 20.5814 39.0889L20.6429 38.9874L24.2841 31.22C24.2841 31.22 27.5529 37.9214 27.9238 38.6591C28.2948 39.3967 28.8709 39.9902 29.7168 39.9902C30.751 39.9902 31.5893 39.1519 31.5893 38.1178C31.5893 37.7951 31.3639 37.2265 31.3639 37.2265C30.9581 36.3258 27.698 29.0452 27.0938 26.2771C26.8975 25.4948 26.847 23.9722 26.8056 22.7236C26.7927 22.333 26.7806 21.9693 26.7653 21.6634C26.7008 21.214 27.0231 20.8289 27.4097 20.7005L35.3366 18.3253C36.3033 18.0685 36.8834 16.9773 36.6256 16.0144C36.3678 15.0515 35.2722 14.4737 34.3055 14.7305C34.3055 14.7305 26.8619 17.1057 24.2841 17.1057C21.7062 17.1057 14.456 14.7947 14.456 14.7947C13.4893 14.5379 12.3937 14.9873 12.0715 15.9502C11.7493 16.9131 12.3293 18.0044 13.3604 18.3253L21.2873 20.7005C21.674 20.8289 21.9318 21.214 21.9318 21.6634C21.9174 21.9493 21.9053 22.2857 21.8922 22.6473Z" clip-rule="evenodd"/></svg>
src/stories/assets/addon-library.png

This is a binary file and will not be displayed.

src/stories/assets/assets.png

This is a binary file and will not be displayed.

src/stories/assets/avif-test-image.avif

This is a binary file and will not be displayed.

src/stories/assets/context.png

This is a binary file and will not be displayed.

+1
src/stories/assets/discord.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="33" height="32" fill="none" viewBox="0 0 33 32"><g clip-path="url(#clip0_10031_177575)"><mask id="mask0_10031_177575" style="mask-type:luminance" width="33" height="25" x="0" y="4" maskUnits="userSpaceOnUse"><path fill="#fff" d="M32.5034 4.00195H0.503906V28.7758H32.5034V4.00195Z"/></mask><g mask="url(#mask0_10031_177575)"><path fill="#5865F2" d="M27.5928 6.20817C25.5533 5.27289 23.3662 4.58382 21.0794 4.18916C21.0378 4.18154 20.9962 4.20057 20.9747 4.23864C20.6935 4.73863 20.3819 5.3909 20.1637 5.90358C17.7042 5.53558 15.2573 5.53558 12.8481 5.90358C12.6299 5.37951 12.307 4.73863 12.0245 4.23864C12.003 4.20184 11.9614 4.18281 11.9198 4.18916C9.63431 4.58255 7.44721 5.27163 5.40641 6.20817C5.38874 6.21578 5.3736 6.22848 5.36355 6.24497C1.21508 12.439 0.078646 18.4809 0.636144 24.4478C0.638667 24.477 0.655064 24.5049 0.677768 24.5227C3.41481 26.5315 6.06609 27.7511 8.66815 28.5594C8.70979 28.5721 8.75392 28.5569 8.78042 28.5226C9.39594 27.6826 9.94461 26.7968 10.4151 25.8653C10.4428 25.8107 10.4163 25.746 10.3596 25.7244C9.48927 25.3945 8.66058 24.9922 7.86343 24.5354C7.80038 24.4986 7.79533 24.4084 7.85333 24.3653C8.02108 24.2397 8.18888 24.109 8.34906 23.977C8.37804 23.9529 8.41842 23.9478 8.45249 23.963C13.6894 26.3526 19.359 26.3526 24.5341 23.963C24.5682 23.9465 24.6086 23.9516 24.6388 23.9757C24.799 24.1077 24.9668 24.2397 25.1358 24.3653C25.1938 24.4084 25.19 24.4986 25.127 24.5354C24.3298 25.0011 23.5011 25.3945 22.6296 25.7232C22.5728 25.7447 22.5476 25.8107 22.5754 25.8653C23.0559 26.7955 23.6046 27.6812 24.2087 28.5213C24.234 28.5569 24.2794 28.5721 24.321 28.5594C26.9357 27.7511 29.5869 26.5315 32.324 24.5227C32.348 24.5049 32.3631 24.4783 32.3656 24.4491C33.0328 17.5506 31.2481 11.5584 27.6344 6.24623C27.6256 6.22848 27.6105 6.21578 27.5928 6.20817ZM11.1971 20.8146C9.62043 20.8146 8.32129 19.3679 8.32129 17.5913C8.32129 15.8146 9.59523 14.368 11.1971 14.368C12.8115 14.368 14.0981 15.8273 14.0729 17.5913C14.0729 19.3679 12.7989 20.8146 11.1971 20.8146ZM21.8299 20.8146C20.2533 20.8146 18.9541 19.3679 18.9541 17.5913C18.9541 15.8146 20.228 14.368 21.8299 14.368C23.4444 14.368 24.7309 15.8273 24.7057 17.5913C24.7057 19.3679 23.4444 20.8146 21.8299 20.8146Z"/></g></g><defs><clipPath id="clip0_10031_177575"><rect width="32" height="32" fill="#fff" transform="translate(0.5)"/></clipPath></defs></svg>
src/stories/assets/docs.png

This is a binary file and will not be displayed.

src/stories/assets/figma-plugin.png

This is a binary file and will not be displayed.

+1
src/stories/assets/github.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none" viewBox="0 0 32 32"><path fill="#161614" d="M16.0001 0C7.16466 0 0 7.17472 0 16.0256C0 23.1061 4.58452 29.1131 10.9419 31.2322C11.7415 31.3805 12.0351 30.8845 12.0351 30.4613C12.0351 30.0791 12.0202 28.8167 12.0133 27.4776C7.56209 28.447 6.62283 25.5868 6.62283 25.5868C5.89499 23.7345 4.8463 23.2419 4.8463 23.2419C3.39461 22.2473 4.95573 22.2678 4.95573 22.2678C6.56242 22.3808 7.40842 23.9192 7.40842 23.9192C8.83547 26.3691 11.1514 25.6609 12.0645 25.2514C12.2081 24.2156 12.6227 23.5087 13.0803 23.1085C9.52648 22.7032 5.7906 21.3291 5.7906 15.1886C5.7906 13.4389 6.41563 12.0094 7.43916 10.8871C7.27303 10.4834 6.72537 8.85349 7.59415 6.64609C7.59415 6.64609 8.93774 6.21539 11.9953 8.28877C13.2716 7.9337 14.6404 7.75563 16.0001 7.74953C17.3599 7.75563 18.7297 7.9337 20.0084 8.28877C23.0623 6.21539 24.404 6.64609 24.404 6.64609C25.2749 8.85349 24.727 10.4834 24.5608 10.8871C25.5868 12.0094 26.2075 13.4389 26.2075 15.1886C26.2075 21.3437 22.4645 22.699 18.9017 23.0957C19.4756 23.593 19.9869 24.5683 19.9869 26.0634C19.9869 28.2077 19.9684 29.9334 19.9684 30.4613C19.9684 30.8877 20.2564 31.3874 21.0674 31.2301C27.4213 29.1086 32 23.1037 32 16.0256C32 7.17472 24.8364 0 16.0001 0ZM5.99257 22.8288C5.95733 22.9084 5.83227 22.9322 5.71834 22.8776C5.60229 22.8253 5.53711 22.7168 5.57474 22.6369C5.60918 22.5549 5.7345 22.5321 5.85029 22.587C5.9666 22.6393 6.03284 22.7489 5.99257 22.8288ZM6.7796 23.5321C6.70329 23.603 6.55412 23.5701 6.45291 23.4581C6.34825 23.3464 6.32864 23.197 6.40601 23.125C6.4847 23.0542 6.62937 23.0874 6.73429 23.1991C6.83895 23.3121 6.85935 23.4605 6.7796 23.5321ZM7.31953 24.4321C7.2215 24.5003 7.0612 24.4363 6.96211 24.2938C6.86407 24.1513 6.86407 23.9804 6.96422 23.9119C7.06358 23.8435 7.2215 23.905 7.32191 24.0465C7.41968 24.1914 7.41968 24.3623 7.31953 24.4321ZM8.23267 25.4743C8.14497 25.5712 7.95818 25.5452 7.82146 25.413C7.68156 25.2838 7.64261 25.1004 7.73058 25.0035C7.81934 24.9064 8.00719 24.9337 8.14497 25.0648C8.28381 25.1938 8.3262 25.3785 8.23267 25.4743ZM9.41281 25.8262C9.37413 25.9517 9.19423 26.0088 9.013 25.9554C8.83203 25.9005 8.7136 25.7535 8.75016 25.6266C8.78778 25.5003 8.96848 25.4408 9.15104 25.4979C9.33174 25.5526 9.45044 25.6985 9.41281 25.8262ZM10.7559 25.9754C10.7604 26.1076 10.6067 26.2172 10.4165 26.2196C10.2252 26.2238 10.0704 26.1169 10.0683 25.9868C10.0683 25.8534 10.2185 25.7448 10.4098 25.7416C10.6001 25.7379 10.7559 25.8441 10.7559 25.9754ZM12.0753 25.9248C12.0981 26.0537 11.9658 26.1862 11.7769 26.2215C11.5912 26.2554 11.4192 26.1758 11.3957 26.0479C11.3726 25.9157 11.5072 25.7833 11.6927 25.7491C11.8819 25.7162 12.0512 25.7937 12.0753 25.9248Z"/></svg>
src/stories/assets/share.png

This is a binary file and will not be displayed.

src/stories/assets/styling.png

This is a binary file and will not be displayed.

src/stories/assets/testing.png

This is a binary file and will not be displayed.

src/stories/assets/theming.png

This is a binary file and will not be displayed.

+1
src/stories/assets/tutorials.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="33" height="32" fill="none" viewBox="0 0 33 32"><g clip-path="url(#clip0_10031_177597)"><path fill="#B7F0EF" fill-rule="evenodd" d="M17 7.87059C17 6.48214 17.9812 5.28722 19.3431 5.01709L29.5249 2.99755C31.3238 2.64076 33 4.01717 33 5.85105V22.1344C33 23.5229 32.0188 24.7178 30.6569 24.9879L20.4751 27.0074C18.6762 27.3642 17 25.9878 17 24.1539L17 7.87059Z" clip-rule="evenodd" opacity=".7"/><path fill="#87E6E5" fill-rule="evenodd" d="M1 5.85245C1 4.01857 2.67623 2.64215 4.47507 2.99895L14.6569 5.01848C16.0188 5.28861 17 6.48354 17 7.87198V24.1553C17 25.9892 15.3238 27.3656 13.5249 27.0088L3.34311 24.9893C1.98119 24.7192 1 23.5242 1 22.1358V5.85245Z" clip-rule="evenodd"/><path fill="#61C1FD" fill-rule="evenodd" d="M15.543 5.71289C15.543 5.71289 16.8157 5.96289 17.4002 6.57653C17.9847 7.19016 18.4521 9.03107 18.4521 9.03107C18.4521 9.03107 18.4521 25.1106 18.4521 26.9629C18.4521 28.8152 19.3775 31.4174 19.3775 31.4174L17.4002 28.8947L16.2575 31.4174C16.2575 31.4174 15.543 29.0765 15.543 27.122C15.543 25.1674 15.543 5.71289 15.543 5.71289Z" clip-rule="evenodd"/></g><defs><clipPath id="clip0_10031_177597"><rect width="32" height="32" fill="#fff" transform="translate(0.5)"/></clipPath></defs></svg>
+1
src/stories/assets/youtube.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none" viewBox="0 0 32 32"><path fill="#ED1D24" d="M31.3313 8.44657C30.9633 7.08998 29.8791 6.02172 28.5022 5.65916C26.0067 5.00026 16 5.00026 16 5.00026C16 5.00026 5.99333 5.00026 3.4978 5.65916C2.12102 6.02172 1.03665 7.08998 0.668678 8.44657C0 10.9053 0 16.0353 0 16.0353C0 16.0353 0 21.1652 0.668678 23.6242C1.03665 24.9806 2.12102 26.0489 3.4978 26.4116C5.99333 27.0703 16 27.0703 16 27.0703C16 27.0703 26.0067 27.0703 28.5022 26.4116C29.8791 26.0489 30.9633 24.9806 31.3313 23.6242C32 21.1652 32 16.0353 32 16.0353C32 16.0353 32 10.9053 31.3313 8.44657Z"/><path fill="#fff" d="M12.7266 20.6934L21.0902 16.036L12.7266 11.3781V20.6934Z"/></svg>
+30
src/stories/button.css
··· 1 + .storybook-button { 2 + display: inline-block; 3 + cursor: pointer; 4 + border: 0; 5 + border-radius: 3em; 6 + font-weight: 700; 7 + line-height: 1; 8 + font-family: 'Nunito Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; 9 + } 10 + .storybook-button--primary { 11 + background-color: #555ab9; 12 + color: white; 13 + } 14 + .storybook-button--secondary { 15 + box-shadow: rgba(0, 0, 0, 0.15) 0px 0px 0px 1px inset; 16 + background-color: transparent; 17 + color: #333; 18 + } 19 + .storybook-button--small { 20 + padding: 10px 16px; 21 + font-size: 12px; 22 + } 23 + .storybook-button--medium { 24 + padding: 11px 20px; 25 + font-size: 14px; 26 + } 27 + .storybook-button--large { 28 + padding: 12px 24px; 29 + font-size: 16px; 30 + }
+32
src/stories/header.css
··· 1 + .storybook-header { 2 + display: flex; 3 + justify-content: space-between; 4 + align-items: center; 5 + border-bottom: 1px solid rgba(0, 0, 0, 0.1); 6 + padding: 15px 20px; 7 + font-family: 'Nunito Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; 8 + } 9 + 10 + .storybook-header svg { 11 + display: inline-block; 12 + vertical-align: top; 13 + } 14 + 15 + .storybook-header h1 { 16 + display: inline-block; 17 + vertical-align: top; 18 + margin: 6px 0 6px 10px; 19 + font-weight: 700; 20 + font-size: 20px; 21 + line-height: 1; 22 + } 23 + 24 + .storybook-header button + button { 25 + margin-left: 10px; 26 + } 27 + 28 + .storybook-header .welcome { 29 + margin-right: 10px; 30 + color: #333; 31 + font-size: 14px; 32 + }
+68
src/stories/page.css
··· 1 + .storybook-page { 2 + margin: 0 auto; 3 + padding: 48px 20px; 4 + max-width: 600px; 5 + color: #333; 6 + font-size: 14px; 7 + line-height: 24px; 8 + font-family: 'Nunito Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; 9 + } 10 + 11 + .storybook-page h2 { 12 + display: inline-block; 13 + vertical-align: top; 14 + margin: 0 0 4px; 15 + font-weight: 700; 16 + font-size: 32px; 17 + line-height: 1; 18 + } 19 + 20 + .storybook-page p { 21 + margin: 1em 0; 22 + } 23 + 24 + .storybook-page a { 25 + color: inherit; 26 + } 27 + 28 + .storybook-page ul { 29 + margin: 1em 0; 30 + padding-left: 30px; 31 + } 32 + 33 + .storybook-page li { 34 + margin-bottom: 8px; 35 + } 36 + 37 + .storybook-page .tip { 38 + display: inline-block; 39 + vertical-align: top; 40 + margin-right: 10px; 41 + border-radius: 1em; 42 + background: #e7fdd8; 43 + padding: 4px 12px; 44 + color: #357a14; 45 + font-weight: 700; 46 + font-size: 11px; 47 + line-height: 12px; 48 + } 49 + 50 + .storybook-page .tip-wrapper { 51 + margin-top: 40px; 52 + margin-bottom: 40px; 53 + font-size: 13px; 54 + line-height: 20px; 55 + } 56 + 57 + .storybook-page .tip-wrapper svg { 58 + display: inline-block; 59 + vertical-align: top; 60 + margin-top: 3px; 61 + margin-right: 4px; 62 + width: 12px; 63 + height: 12px; 64 + } 65 + 66 + .storybook-page .tip-wrapper svg path { 67 + fill: #1ea7fd; 68 + }
+1422
src/stories/storyUtils.ts
··· 1 + import { JsonPlayObject, PlayLifecycle } from "../core/Atomic.js"; 2 + 3 + const exampleLifecycle = (): PlayLifecycle => ({ 4 + "input": { 5 + "device": { 6 + "id": "3cc6dc47a8551498a70e519ee09cd8423ff9d48c", 7 + "is_active": true, 8 + "is_private_session": false, 9 + "is_restricted": false, 10 + "name": "Pixel 9a", 11 + "supports_volume": false, 12 + "type": "Smartphone", 13 + "volume_percent": 100 14 + }, 15 + "shuffle_state": true, 16 + "smart_shuffle": false, 17 + "repeat_state": "context", 18 + "is_playing": true, 19 + "timestamp": 1773588429309, 20 + "context": { 21 + "external_urls": { 22 + "spotify": "https://open.spotify.com/collection/tracks" 23 + }, 24 + "href": "https://api.spotify.com/v1/me/tracks", 25 + "type": "collection", 26 + "uri": "spotify:user:socrates13:collection" 27 + }, 28 + "progress_ms": 5455, 29 + "item": { 30 + "album": { 31 + "album_type": "album", 32 + "artists": [ 33 + { 34 + "external_urls": { 35 + "spotify": "https://open.spotify.com/artist/4V8LLVI7PbaPR0K2TGSxFF" 36 + }, 37 + "href": "https://api.spotify.com/v1/artists/4V8LLVI7PbaPR0K2TGSxFF", 38 + "id": "4V8LLVI7PbaPR0K2TGSxFF", 39 + "name": "Tyler, The Creator", 40 + "type": "artist", 41 + "uri": "spotify:artist:4V8LLVI7PbaPR0K2TGSxFF" 42 + } 43 + ], 44 + "external_urls": { 45 + "spotify": "https://open.spotify.com/album/2nkto6YNI4rUYTLqEwWJ3o" 46 + }, 47 + "href": "https://api.spotify.com/v1/albums/2nkto6YNI4rUYTLqEwWJ3o", 48 + "id": "2nkto6YNI4rUYTLqEwWJ3o", 49 + "images": [ 50 + { 51 + "height": 640, 52 + "url": "https://i.scdn.co/image/ab67616d0000b2738940ac99f49e44f59e6f7fb3", 53 + "width": 640 54 + }, 55 + { 56 + "height": 300, 57 + "url": "https://i.scdn.co/image/ab67616d00001e028940ac99f49e44f59e6f7fb3", 58 + "width": 300 59 + }, 60 + { 61 + "height": 64, 62 + "url": "https://i.scdn.co/image/ab67616d000048518940ac99f49e44f59e6f7fb3", 63 + "width": 64 64 + } 65 + ], 66 + "name": "Flower Boy", 67 + "release_date": "2017-07-21", 68 + "release_date_precision": "day", 69 + "total_tracks": 14, 70 + "type": "album", 71 + "uri": "spotify:album:2nkto6YNI4rUYTLqEwWJ3o" 72 + }, 73 + "artists": [ 74 + { 75 + "external_urls": { 76 + "spotify": "https://open.spotify.com/artist/4V8LLVI7PbaPR0K2TGSxFF" 77 + }, 78 + "href": "https://api.spotify.com/v1/artists/4V8LLVI7PbaPR0K2TGSxFF", 79 + "id": "4V8LLVI7PbaPR0K2TGSxFF", 80 + "name": "Tyler, The Creator", 81 + "type": "artist", 82 + "uri": "spotify:artist:4V8LLVI7PbaPR0K2TGSxFF" 83 + }, 84 + { 85 + "external_urls": { 86 + "spotify": "https://open.spotify.com/artist/7pbDxGE6nQSZVfiFdq9lOL" 87 + }, 88 + "href": "https://api.spotify.com/v1/artists/7pbDxGE6nQSZVfiFdq9lOL", 89 + "id": "7pbDxGE6nQSZVfiFdq9lOL", 90 + "name": "Rex Orange County", 91 + "type": "artist", 92 + "uri": "spotify:artist:7pbDxGE6nQSZVfiFdq9lOL" 93 + }, 94 + { 95 + "external_urls": { 96 + "spotify": "https://open.spotify.com/artist/1mSJCvDX0W7Dn7S9C6vmvI" 97 + }, 98 + "href": "https://api.spotify.com/v1/artists/1mSJCvDX0W7Dn7S9C6vmvI", 99 + "id": "1mSJCvDX0W7Dn7S9C6vmvI", 100 + "name": "Anna of the North", 101 + "type": "artist", 102 + "uri": "spotify:artist:1mSJCvDX0W7Dn7S9C6vmvI" 103 + } 104 + ], 105 + "disc_number": 1, 106 + "duration_ms": 320720, 107 + "explicit": true, 108 + "external_ids": { 109 + "isrc": "USQX91701279" 110 + }, 111 + "external_urls": { 112 + "spotify": "https://open.spotify.com/track/5WNYg3usc6H8N3MBEp4zVk" 113 + }, 114 + "href": "https://api.spotify.com/v1/tracks/5WNYg3usc6H8N3MBEp4zVk", 115 + "id": "5WNYg3usc6H8N3MBEp4zVk", 116 + "is_local": false, 117 + "name": "Boredom (feat. Rex Orange County & Anna of the North)", 118 + "popularity": 66, 119 + "preview_url": "https://p.scdn.co/mp3-preview/64c36bb59fe8c48d0ed5b38dc5a7b0189c1a642b?cid=f85f5aa4211f4ea78aa364547798b340", 120 + "track_number": 8, 121 + "type": "track", 122 + "uri": "spotify:track:5WNYg3usc6H8N3MBEp4zVk" 123 + }, 124 + "currently_playing_type": "track", 125 + "actions": { 126 + "disallows": { 127 + "resuming": true 128 + } 129 + } 130 + }, 131 + "original": { 132 + "data": { 133 + "artists": [ 134 + "Tyler, The Creator", 135 + "Rex Orange County", 136 + "Anna of the North" 137 + ], 138 + "albumArtists": [ 139 + "Tyler, The Creator" 140 + ], 141 + "album": "Flower Boy", 142 + "track": "Boredom (feat. Rex Orange County & Anna of the North)", 143 + "duration": 320.72, 144 + // @ts-ignore 145 + "playDate": "2026-03-15T15:27:09.309Z", 146 + "isrc": "USQX91701279", 147 + "meta": { 148 + "spotify": { 149 + "track": "5WNYg3usc6H8N3MBEp4zVk", 150 + "artist": [ 151 + "4V8LLVI7PbaPR0K2TGSxFF", 152 + "7pbDxGE6nQSZVfiFdq9lOL", 153 + "1mSJCvDX0W7Dn7S9C6vmvI" 154 + ], 155 + "albumArtist": [ 156 + "4V8LLVI7PbaPR0K2TGSxFF" 157 + ], 158 + "album": "2nkto6YNI4rUYTLqEwWJ3o" 159 + }, 160 + "brainz": { 161 + "trackNumber": 8 162 + } 163 + } 164 + }, 165 + "meta": { 166 + "deviceId": "3cc6dc47a8-Pixel 9a", 167 + "source": "Spotify", 168 + "musicService": "Spotify", 169 + "trackId": "5WNYg3usc6H8N3MBEp4zVk", 170 + "trackProgressPosition": 5.455, 171 + "scrobbleTsSOC": 1, 172 + "newFromSource": true, 173 + "url": { 174 + "web": "https://open.spotify.com/track/5WNYg3usc6H8N3MBEp4zVk" 175 + }, 176 + "art": { 177 + "album": "https://i.scdn.co/image/ab67616d00001e028940ac99f49e44f59e6f7fb3" 178 + } 179 + } 180 + }, 181 + "steps": [ 182 + { 183 + "name": "preCompare", 184 + "source": "Spotify - default", 185 + "patch": { 186 + "data": { 187 + "albumArtists": [ 188 + [ 189 + "Tyler, The Creator" 190 + ], 191 + 0, 192 + 0 193 + ], 194 + "album": [ 195 + "Flower Boy", 196 + "Scum Fuck Flower Boy" 197 + ], 198 + "track": [ 199 + "Boredom (feat. Rex Orange County & Anna of the North)", 200 + "Boredom" 201 + ], 202 + "duration": [ 203 + 320.72, 204 + 320 205 + ], 206 + "meta": { 207 + "brainz": { 208 + "recording": [ 209 + "379db622-cc58-4bbf-9a3e-a7fa50b25fd1" 210 + ], 211 + "artist": [ 212 + [ 213 + "f6beac20-5dfe-4d1f-ae02-0b0a740aafd6", 214 + "883cbf1f-dcaa-4d17-b9ed-394e1fdabc87", 215 + "4d7db1c4-3c00-4140-8c83-c6d99cfdecf4" 216 + ] 217 + ], 218 + "album": [ 219 + "eb340386-6815-4933-9a28-940f7140f009" 220 + ], 221 + "releaseGroup": [ 222 + "e248e931-c26c-4c94-aba2-2f89ce583901" 223 + ] 224 + } 225 + } 226 + } 227 + }, 228 + "inputs": [ 229 + { 230 + "type": "mbQuery", 231 + "input": "isrc:USQX91701279" 232 + }, 233 + { 234 + "type": "mbRecording", 235 + "input": { 236 + "id": "379db622-cc58-4bbf-9a3e-a7fa50b25fd1", 237 + "score": 100, 238 + "artist-credit-id": "c5abb112-bd0f-4155-9c78-9e3baf1b8ea5", 239 + "title": "Boredom", 240 + "length": 320000, 241 + "video": null, 242 + "artist-credit": [ 243 + { 244 + "joinphrase": " ft. ", 245 + "name": "Tyler, The Creator", 246 + "artist": { 247 + "id": "f6beac20-5dfe-4d1f-ae02-0b0a740aafd6", 248 + "name": "Tyler, The Creator", 249 + "sort-name": "Tyler, The Creator", 250 + "aliases": [ 251 + { 252 + "sort-name": "Okonma, Tyler", 253 + "name": "Tyler Okonma", 254 + "locale": null, 255 + "type": null, 256 + "primary": null, 257 + "begin-date": null, 258 + "end-date": null 259 + }, 260 + { 261 + "sort-name": "Okonma, T.", 262 + "name": "T. Okonma", 263 + "locale": null, 264 + "type": null, 265 + "primary": null, 266 + "begin-date": null, 267 + "end-date": null 268 + }, 269 + { 270 + "sort-name": "Okonma, Tyler Gregory", 271 + "type-id": "d4dcd0c0-b341-3612-a332-c0ce797b25cf", 272 + "name": "Tyler Gregory Okonma", 273 + "locale": null, 274 + "type": "Legal name", 275 + "primary": null, 276 + "begin-date": null, 277 + "end-date": null 278 + }, 279 + { 280 + "sort-name": "Haley, Wolf", 281 + "name": "Wolf Haley", 282 + "locale": null, 283 + "type": null, 284 + "primary": null, 285 + "begin-date": null, 286 + "end-date": null 287 + } 288 + ] 289 + } 290 + }, 291 + { 292 + "joinphrase": " & ", 293 + "name": "Rex Orange County", 294 + "artist": { 295 + "id": "883cbf1f-dcaa-4d17-b9ed-394e1fdabc87", 296 + "name": "Rex Orange County", 297 + "sort-name": "Rex Orange County", 298 + "aliases": [ 299 + { 300 + "sort-name": "O'Connor, Alexander James", 301 + "name": "Alexander James O'Connor", 302 + "locale": null, 303 + "type": null, 304 + "primary": null, 305 + "begin-date": null, 306 + "end-date": null 307 + }, 308 + { 309 + "sort-name": "O'Connor, Alexander", 310 + "type-id": "d4dcd0c0-b341-3612-a332-c0ce797b25cf", 311 + "name": "Alexander O'Connor", 312 + "locale": null, 313 + "type": "Legal name", 314 + "primary": null, 315 + "begin-date": null, 316 + "end-date": null 317 + } 318 + ] 319 + } 320 + }, 321 + { 322 + "name": "Anna of the North", 323 + "artist": { 324 + "id": "4d7db1c4-3c00-4140-8c83-c6d99cfdecf4", 325 + "name": "Anna of the North", 326 + "sort-name": "Anna of the North", 327 + "aliases": [ 328 + { 329 + "sort-name": "Lotterud, Anna", 330 + "type-id": "d4dcd0c0-b341-3612-a332-c0ce797b25cf", 331 + "name": "Anna Lotterud", 332 + "locale": null, 333 + "type": "Legal name", 334 + "primary": null, 335 + "begin-date": null, 336 + "end-date": null 337 + } 338 + ] 339 + } 340 + } 341 + ], 342 + "first-release-date": "2017-07-21", 343 + "releases": [ 344 + { 345 + "id": "eb340386-6815-4933-9a28-940f7140f009", 346 + "status-id": "4e304316-386d-3409-af2e-78857eec5cfe", 347 + "artist-credit-id": "3289218e-1edd-4ace-91c6-e7af96ce7144", 348 + "count": 1, 349 + "title": "Scum Fuck Flower Boy", 350 + "status": "Official", 351 + "disambiguation": "Explicit Cover", 352 + "artist-credit": [ 353 + { 354 + "name": "Tyler, The Creator", 355 + "artist": { 356 + "id": "f6beac20-5dfe-4d1f-ae02-0b0a740aafd6", 357 + "name": "Tyler, The Creator", 358 + "sort-name": "Tyler, The Creator" 359 + } 360 + } 361 + ], 362 + "release-group": { 363 + "id": "e248e931-c26c-4c94-aba2-2f89ce583901", 364 + "type-id": "f529b476-6e62-324f-b0aa-1f3e33d313fc", 365 + "primary-type-id": "f529b476-6e62-324f-b0aa-1f3e33d313fc", 366 + "title": "Flower Boy", 367 + "primary-type": "Album" 368 + }, 369 + "date": "2017-07-21", 370 + "country": "US", 371 + "release-events": [ 372 + { 373 + "date": "2017-07-21", 374 + "area": { 375 + "id": "489ce91b-6658-3307-9877-795b68554c98", 376 + "name": "United States", 377 + "sort-name": "United States", 378 + "iso-3166-1-codes": [ 379 + "US" 380 + ] 381 + } 382 + } 383 + ], 384 + "track-count": 14, 385 + "media": [ 386 + { 387 + "id": "f7525bfa-5263-3c90-926b-4f53cfc28021", 388 + "position": 1, 389 + "format": "CD", 390 + "track": [ 391 + { 392 + "id": "931cb165-a25b-4e54-b606-1e3c31c06348", 393 + "number": "8", 394 + "title": "Boredom", 395 + "length": 321000 396 + } 397 + ], 398 + "track-count": 14, 399 + "track-offset": 7 400 + } 401 + ], 402 + "albumScore": 3, 403 + "albumCompareScore": 0 404 + }, 405 + { 406 + "id": "88aba80a-e240-4464-8dad-a32654ba1348", 407 + "status-id": "4e304316-386d-3409-af2e-78857eec5cfe", 408 + "artist-credit-id": "3289218e-1edd-4ace-91c6-e7af96ce7144", 409 + "count": 1, 410 + "title": "Scum Fuck Flower Boy", 411 + "status": "Official", 412 + "artist-credit": [ 413 + { 414 + "name": "Tyler, The Creator", 415 + "artist": { 416 + "id": "f6beac20-5dfe-4d1f-ae02-0b0a740aafd6", 417 + "name": "Tyler, The Creator", 418 + "sort-name": "Tyler, The Creator" 419 + } 420 + } 421 + ], 422 + "release-group": { 423 + "id": "e248e931-c26c-4c94-aba2-2f89ce583901", 424 + "type-id": "f529b476-6e62-324f-b0aa-1f3e33d313fc", 425 + "primary-type-id": "f529b476-6e62-324f-b0aa-1f3e33d313fc", 426 + "title": "Flower Boy", 427 + "primary-type": "Album" 428 + }, 429 + "date": "2017-07-21", 430 + "country": "US", 431 + "release-events": [ 432 + { 433 + "date": "2017-07-21", 434 + "area": { 435 + "id": "489ce91b-6658-3307-9877-795b68554c98", 436 + "name": "United States", 437 + "sort-name": "United States", 438 + "iso-3166-1-codes": [ 439 + "US" 440 + ] 441 + } 442 + } 443 + ], 444 + "track-count": 14, 445 + "media": [ 446 + { 447 + "id": "0be9089c-cfa8-36b8-9036-ab3347e48da6", 448 + "position": 1, 449 + "format": "CD", 450 + "track": [ 451 + { 452 + "id": "aeff9385-9073-4c2e-915d-2136dc23be82", 453 + "number": "8", 454 + "title": "Boredom", 455 + "length": 320000 456 + } 457 + ], 458 + "track-count": 14, 459 + "track-offset": 7 460 + } 461 + ], 462 + "albumScore": 3, 463 + "albumCompareScore": 0 464 + }, 465 + { 466 + "id": "dd09e440-879d-447b-9dfa-8547b369548e", 467 + "status-id": "4e304316-386d-3409-af2e-78857eec5cfe", 468 + "artist-credit-id": "3289218e-1edd-4ace-91c6-e7af96ce7144", 469 + "count": 1, 470 + "title": "Flower Boy", 471 + "status": "Official", 472 + "disambiguation": "Apple Digital Master", 473 + "artist-credit": [ 474 + { 475 + "name": "Tyler, The Creator", 476 + "artist": { 477 + "id": "f6beac20-5dfe-4d1f-ae02-0b0a740aafd6", 478 + "name": "Tyler, The Creator", 479 + "sort-name": "Tyler, The Creator" 480 + } 481 + } 482 + ], 483 + "release-group": { 484 + "id": "e248e931-c26c-4c94-aba2-2f89ce583901", 485 + "type-id": "f529b476-6e62-324f-b0aa-1f3e33d313fc", 486 + "primary-type-id": "f529b476-6e62-324f-b0aa-1f3e33d313fc", 487 + "title": "Flower Boy", 488 + "primary-type": "Album" 489 + }, 490 + "date": "2017-07-21", 491 + "country": "XW", 492 + "release-events": [ 493 + { 494 + "date": "2017-07-21", 495 + "area": { 496 + "id": "525d4e18-3d00-31b9-a58b-a146a916de8f", 497 + "name": "[Worldwide]", 498 + "sort-name": "[Worldwide]", 499 + "iso-3166-1-codes": [ 500 + "XW" 501 + ] 502 + } 503 + } 504 + ], 505 + "track-count": 14, 506 + "media": [ 507 + { 508 + "id": "76a1bbb7-74c4-3953-a224-682a51c011c9", 509 + "position": 1, 510 + "format": "Digital Media", 511 + "track": [ 512 + { 513 + "id": "77f18908-29e2-4bc4-a170-67789188a506", 514 + "number": "8", 515 + "title": "Boredom", 516 + "length": 320000 517 + } 518 + ], 519 + "track-count": 14, 520 + "track-offset": 7 521 + } 522 + ], 523 + "albumScore": 2, 524 + "albumCompareScore": 0 525 + }, 526 + { 527 + "id": "c4d321ac-f21d-45e8-aebc-31986fc8233b", 528 + "status-id": "4e304316-386d-3409-af2e-78857eec5cfe", 529 + "artist-credit-id": "3289218e-1edd-4ace-91c6-e7af96ce7144", 530 + "count": 1, 531 + "title": "Flower Boy", 532 + "status": "Official", 533 + "artist-credit": [ 534 + { 535 + "name": "Tyler, The Creator", 536 + "artist": { 537 + "id": "f6beac20-5dfe-4d1f-ae02-0b0a740aafd6", 538 + "name": "Tyler, The Creator", 539 + "sort-name": "Tyler, The Creator" 540 + } 541 + } 542 + ], 543 + "release-group": { 544 + "id": "e248e931-c26c-4c94-aba2-2f89ce583901", 545 + "type-id": "f529b476-6e62-324f-b0aa-1f3e33d313fc", 546 + "primary-type-id": "f529b476-6e62-324f-b0aa-1f3e33d313fc", 547 + "title": "Flower Boy", 548 + "primary-type": "Album" 549 + }, 550 + "date": "2017-07-21", 551 + "country": "XW", 552 + "release-events": [ 553 + { 554 + "date": "2017-07-21", 555 + "area": { 556 + "id": "525d4e18-3d00-31b9-a58b-a146a916de8f", 557 + "name": "[Worldwide]", 558 + "sort-name": "[Worldwide]", 559 + "iso-3166-1-codes": [ 560 + "XW" 561 + ] 562 + } 563 + } 564 + ], 565 + "track-count": 14, 566 + "media": [ 567 + { 568 + "id": "359440fa-d653-3ba0-bbb4-57c41c2bdf78", 569 + "position": 1, 570 + "format": "Digital Media", 571 + "track": [ 572 + { 573 + "id": "3496999b-31a1-489d-a395-7f977e0eb00f", 574 + "number": "8", 575 + "title": "Boredom", 576 + "length": 320000 577 + } 578 + ], 579 + "track-count": 14, 580 + "track-offset": 7 581 + } 582 + ], 583 + "albumScore": 2, 584 + "albumCompareScore": 0 585 + }, 586 + { 587 + "id": "523f5e88-9988-436d-ab60-6d514c1f0e15", 588 + "status-id": "4e304316-386d-3409-af2e-78857eec5cfe", 589 + "artist-credit-id": "3289218e-1edd-4ace-91c6-e7af96ce7144", 590 + "count": 1, 591 + "title": "Flower Boy", 592 + "status": "Official", 593 + "artist-credit": [ 594 + { 595 + "name": "Tyler, The Creator", 596 + "artist": { 597 + "id": "f6beac20-5dfe-4d1f-ae02-0b0a740aafd6", 598 + "name": "Tyler, The Creator", 599 + "sort-name": "Tyler, The Creator" 600 + } 601 + } 602 + ], 603 + "release-group": { 604 + "id": "e248e931-c26c-4c94-aba2-2f89ce583901", 605 + "type-id": "f529b476-6e62-324f-b0aa-1f3e33d313fc", 606 + "primary-type-id": "f529b476-6e62-324f-b0aa-1f3e33d313fc", 607 + "title": "Flower Boy", 608 + "primary-type": "Album" 609 + }, 610 + "date": "2017-07-21", 611 + "country": "XW", 612 + "release-events": [ 613 + { 614 + "date": "2017-07-21", 615 + "area": { 616 + "id": "525d4e18-3d00-31b9-a58b-a146a916de8f", 617 + "name": "[Worldwide]", 618 + "sort-name": "[Worldwide]", 619 + "iso-3166-1-codes": [ 620 + "XW" 621 + ] 622 + } 623 + } 624 + ], 625 + "track-count": 14, 626 + "media": [ 627 + { 628 + "id": "401a7220-e021-3794-b52d-b7a75fdd8fc0", 629 + "position": 1, 630 + "format": "CD", 631 + "track": [ 632 + { 633 + "id": "106952b2-4331-4132-a69f-e926b11b1536", 634 + "number": "8", 635 + "title": "Boredom", 636 + "length": 320720 637 + } 638 + ], 639 + "track-count": 14, 640 + "track-offset": 7 641 + } 642 + ], 643 + "albumScore": 2, 644 + "albumCompareScore": 0 645 + }, 646 + { 647 + "id": "dacce9af-884c-4b60-a814-12e7d65f01be", 648 + "status-id": "1156806e-d06a-38bd-83f0-cf2284a808b9", 649 + "artist-credit-id": "949a7fd5-fe73-3e8f-922e-01ff4ca958f7", 650 + "count": 1, 651 + "title": "Insecure Music (Complete Season 02)", 652 + "status": "Bootleg", 653 + "artist-credit": [ 654 + { 655 + "name": "Various Artists", 656 + "artist": { 657 + "id": "89ad4ac3-39f7-470e-963a-56509c546377", 658 + "name": "Various Artists", 659 + "sort-name": "Various Artists", 660 + "disambiguation": "add compilations to this artist" 661 + } 662 + } 663 + ], 664 + "release-group": { 665 + "id": "8daa4b76-fb5d-4ece-98c4-beb0aaf09bcb", 666 + "type-id": "dd2a21e1-0c00-3729-a7a0-de60b84eb5d1", 667 + "primary-type-id": "f529b476-6e62-324f-b0aa-1f3e33d313fc", 668 + "title": "Insecure Music (Complete Season 02)", 669 + "primary-type": "Album", 670 + "secondary-types": [ 671 + "Compilation", 672 + "Soundtrack" 673 + ], 674 + "secondary-type-ids": [ 675 + "dd2a21e1-0c00-3729-a7a0-de60b84eb5d1", 676 + "22a628ad-c082-3c4f-b1b6-d41665107b88" 677 + ] 678 + }, 679 + "track-count": 74, 680 + "media": [ 681 + { 682 + "id": "d78e3f46-874b-4acb-968f-826896a81fd7", 683 + "position": 1, 684 + "format": "Digital Media", 685 + "track": [ 686 + { 687 + "id": "db7f1d1f-71a9-4e59-9add-137e265af169", 688 + "number": "63", 689 + "title": "Boredom" 690 + } 691 + ], 692 + "track-count": 74, 693 + "track-offset": 62 694 + } 695 + ], 696 + "albumScore": 1, 697 + "albumCompareScore": 0 698 + }, 699 + { 700 + "id": "7b19feb7-2c94-4f49-a887-868cde3c5941", 701 + "status-id": "4e304316-386d-3409-af2e-78857eec5cfe", 702 + "artist-credit-id": "3289218e-1edd-4ace-91c6-e7af96ce7144", 703 + "count": 2, 704 + "title": "Flower Boy", 705 + "status": "Official", 706 + "disambiguation": "limited edition translucent yellow", 707 + "artist-credit": [ 708 + { 709 + "name": "Tyler, The Creator", 710 + "artist": { 711 + "id": "f6beac20-5dfe-4d1f-ae02-0b0a740aafd6", 712 + "name": "Tyler, The Creator", 713 + "sort-name": "Tyler, The Creator" 714 + } 715 + } 716 + ], 717 + "release-group": { 718 + "id": "e248e931-c26c-4c94-aba2-2f89ce583901", 719 + "type-id": "f529b476-6e62-324f-b0aa-1f3e33d313fc", 720 + "primary-type-id": "f529b476-6e62-324f-b0aa-1f3e33d313fc", 721 + "title": "Flower Boy", 722 + "primary-type": "Album" 723 + }, 724 + "date": "2017-11-27", 725 + "country": "GB", 726 + "release-events": [ 727 + { 728 + "date": "2017-11-27", 729 + "area": { 730 + "id": "8a754a16-0027-3a29-b6d7-2b40ea0481ed", 731 + "name": "United Kingdom", 732 + "sort-name": "United Kingdom", 733 + "iso-3166-1-codes": [ 734 + "GB" 735 + ] 736 + } 737 + }, 738 + { 739 + "date": "2017-11-27", 740 + "area": { 741 + "id": "489ce91b-6658-3307-9877-795b68554c98", 742 + "name": "United States", 743 + "sort-name": "United States", 744 + "iso-3166-1-codes": [ 745 + "US" 746 + ] 747 + } 748 + }, 749 + { 750 + "date": "2017-11-27", 751 + "area": { 752 + "id": "89a675c2-3e37-3518-b83c-418bad59a85a", 753 + "name": "Europe", 754 + "sort-name": "Europe", 755 + "iso-3166-1-codes": [ 756 + "XE" 757 + ] 758 + } 759 + } 760 + ], 761 + "track-count": 14, 762 + "media": [ 763 + { 764 + "id": "8051dbab-8499-33b7-a6ad-ebae0991fe35", 765 + "position": 2, 766 + "format": "Vinyl", 767 + "track": [ 768 + { 769 + "id": "3de6c108-2ee1-4a5f-8fc5-446d91168a95", 770 + "number": "C1", 771 + "title": "Boredom", 772 + "length": 324000 773 + } 774 + ], 775 + "track-count": 7, 776 + "track-offset": 0 777 + } 778 + ], 779 + "albumScore": 1, 780 + "albumCompareScore": 0 781 + } 782 + ], 783 + "isrcs": [ 784 + "USQX91701279" 785 + ], 786 + "titleScore": 0, 787 + "artistScore": 0, 788 + "albumScore": 0, 789 + "rankScore": 0 790 + } 791 + } 792 + ] 793 + } 794 + ], 795 + "scrobble": { 796 + "match": { 797 + "match": false, 798 + "score": 0.09299683367479979, 799 + "breakdowns": [ 800 + "Artist: 0.02 * 0.3 = 0.01", 801 + "Title: 0.22 * 0.4 = 0.09", 802 + "Time: (No correlation) 0 * 0.5 = 0.00", 803 + "Time Detail => Existing: 2026-03-14T20:35:17.000Z - Candidate: 2026-03-15T15:27:14.682Z | Temporal Sameness: No correlation | Play Diff: 68,221s (Needed <10s) | Fuzzy Duration Diff: 67,901s (Needed <= 10s) | Range Comparison N/A", 804 + "Score 0.09 => No Match" 805 + ], 806 + "reason": "Score 0.09 => No Match", 807 + "closestMatchedPlay": { 808 + "data": { 809 + "artists": [ 810 + "Gorillaz" 811 + ], 812 + "track": "Tormenta", 813 + "album": "Cracker Island", 814 + // @ts-ignore 815 + "playDate": "2026-03-14T20:35:17.000Z", 816 + "meta": { 817 + "brainz": { 818 + "album": "52518f4a-9543-4f9c-9a86-89052f4bf458" 819 + } 820 + } 821 + }, 822 + "meta": { 823 + "nowPlaying": false, 824 + "mbid": "", 825 + "source": "Lastfm", 826 + "url": { 827 + "web": "https://www.last.fm/music/Gorillaz/_/Tormenta" 828 + }, 829 + "lifecycle": { 830 + "input": { 831 + "artist": { 832 + "url": "https://www.last.fm/music/Gorillaz", 833 + "name": "Gorillaz", 834 + "image": [ 835 + { 836 + "size": "small", 837 + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/2a96cbd8b46e442fc41c2b86b821562f.png" 838 + }, 839 + { 840 + "size": "medium", 841 + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/2a96cbd8b46e442fc41c2b86b821562f.png" 842 + }, 843 + { 844 + "size": "large", 845 + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/2a96cbd8b46e442fc41c2b86b821562f.png" 846 + }, 847 + { 848 + "size": "extralarge", 849 + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/2a96cbd8b46e442fc41c2b86b821562f.png" 850 + } 851 + ], 852 + "mbid": "" 853 + }, 854 + "date": { 855 + "uts": "1773520517", 856 + "#text": "14 Mar 2026, 20:35" 857 + }, 858 + "mbid": "", 859 + "name": "Tormenta", 860 + "image": [ 861 + { 862 + "size": "small", 863 + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/507c3f4c1863a05626a445057871b56e.png" 864 + }, 865 + { 866 + "size": "medium", 867 + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/507c3f4c1863a05626a445057871b56e.png" 868 + }, 869 + { 870 + "size": "large", 871 + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/507c3f4c1863a05626a445057871b56e.png" 872 + }, 873 + { 874 + "size": "extralarge", 875 + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/507c3f4c1863a05626a445057871b56e.png" 876 + } 877 + ], 878 + "url": "https://www.last.fm/music/Gorillaz/_/Tormenta", 879 + "streamable": "0", 880 + "album": { 881 + "mbid": "52518f4a-9543-4f9c-9a86-89052f4bf458", 882 + "#text": "Cracker Island" 883 + }, 884 + "loved": "0" 885 + }, 886 + "original": { 887 + "data": { 888 + "artists": [ 889 + "Gorillaz" 890 + ], 891 + "track": "Tormenta", 892 + "album": "Cracker Island", 893 + // @ts-ignore 894 + "playDate": "2026-03-14T20:35:17.000Z", 895 + "meta": { 896 + "brainz": { 897 + "album": "52518f4a-9543-4f9c-9a86-89052f4bf458" 898 + } 899 + } 900 + }, 901 + "meta": { 902 + "nowPlaying": false, 903 + "mbid": "", 904 + "source": "Lastfm", 905 + "url": { 906 + "web": "https://www.last.fm/music/Gorillaz/_/Tormenta" 907 + } 908 + } 909 + }, 910 + "steps": [] 911 + } 912 + } 913 + } 914 + }, 915 + "payload": { 916 + "artist": "Tyler, The Creator", 917 + "track": "Boredom", 918 + "album": "Scum Fuck Flower Boy", 919 + "timestamp": 1773588738, 920 + "mbid": "379db622-cc58-4bbf-9a3e-a7fa50b25fd1", 921 + "duration": 320 922 + }, 923 + "warnings": [ 924 + "test warning", 925 + "missing data in response" 926 + ], 927 + "response": { 928 + "scrobbles": { 929 + "scrobble": { 930 + "artist": { 931 + "corrected": "0", 932 + "#text": "Tyler, The Creator" 933 + }, 934 + "album": { 935 + "corrected": "0", 936 + "#text": "Scum Fuck Flower Boy" 937 + }, 938 + "track": { 939 + "corrected": "0", 940 + "#text": "Boredom" 941 + }, 942 + "ignoredMessage": { 943 + "code": "0", 944 + "#text": "" 945 + }, 946 + "albumArtist": { 947 + "corrected": "0", 948 + "#text": "" 949 + }, 950 + "timestamp": "1773588738" 951 + }, 952 + "@attr": { 953 + "ignored": 0, 954 + "accepted": 1 955 + } 956 + } 957 + }, 958 + "mergedScrobble": { 959 + "data": { 960 + "artists": [ 961 + "Tyler, The Creator", 962 + "Rex Orange County", 963 + "Anna of the North" 964 + ], 965 + "album": "Scum Fuck Flower Boy", 966 + "track": "Boredom", 967 + "duration": 320, 968 + // @ts-ignore 969 + "playDate": "2026-03-15T15:32:18.000Z", 970 + "isrc": "USQX91701279", 971 + "meta": { 972 + "spotify": { 973 + "track": "5WNYg3usc6H8N3MBEp4zVk", 974 + "artist": [ 975 + "4V8LLVI7PbaPR0K2TGSxFF", 976 + "7pbDxGE6nQSZVfiFdq9lOL", 977 + "1mSJCvDX0W7Dn7S9C6vmvI" 978 + ], 979 + "albumArtist": [ 980 + "4V8LLVI7PbaPR0K2TGSxFF" 981 + ], 982 + "album": "2nkto6YNI4rUYTLqEwWJ3o" 983 + }, 984 + "brainz": { 985 + "trackNumber": 8, 986 + "recording": "379db622-cc58-4bbf-9a3e-a7fa50b25fd1", 987 + "artist": [ 988 + "f6beac20-5dfe-4d1f-ae02-0b0a740aafd6", 989 + "883cbf1f-dcaa-4d17-b9ed-394e1fdabc87", 990 + "4d7db1c4-3c00-4140-8c83-c6d99cfdecf4" 991 + ], 992 + "album": "eb340386-6815-4933-9a28-940f7140f009", 993 + "releaseGroup": "e248e931-c26c-4c94-aba2-2f89ce583901" 994 + } 995 + }, 996 + "listenedFor": 293.56100000000004, 997 + 998 + "listenRanges": [ 999 + // @ts-ignore 1000 + [ 1001 + { 1002 + "timestamp": "2026-03-15T15:27:14.682Z", 1003 + "position": 5.455 1004 + }, 1005 + { 1006 + "timestamp": "2026-03-15T15:32:08.223Z", 1007 + "position": 299.016 1008 + } 1009 + ] 1010 + ], 1011 + "repeat": false 1012 + }, 1013 + "meta": { 1014 + "deviceId": "3cc6dc47a8-Pixel 9a", 1015 + "source": "Spotify", 1016 + "musicService": "Spotify", 1017 + "trackId": "5WNYg3usc6H8N3MBEp4zVk", 1018 + "trackProgressPosition": 5.455, 1019 + "scrobbleTsSOC": 2, 1020 + "newFromSource": true, 1021 + "url": { 1022 + "web": "https://open.spotify.com/track/5WNYg3usc6H8N3MBEp4zVk" 1023 + }, 1024 + "art": { 1025 + "album": "https://i.scdn.co/image/ab67616d00001e028940ac99f49e44f59e6f7fb3" 1026 + } 1027 + } 1028 + } 1029 + } 1030 + }); 1031 + 1032 + export const examplePlay = (): JsonPlayObject => ({ 1033 + "data": { 1034 + "artists": [ 1035 + "Tyler, The Creator", 1036 + "Rex Orange County", 1037 + "Anna of the North" 1038 + ], 1039 + "album": "Scum Fuck Flower Boy", 1040 + "track": "Boredom", 1041 + "duration": 320, 1042 + // @ts-ignore 1043 + "playDate": "2026-03-15T15:32:18.000Z", 1044 + "isrc": "USQX91701279", 1045 + "meta": { 1046 + "spotify": { 1047 + "track": "5WNYg3usc6H8N3MBEp4zVk", 1048 + "artist": [ 1049 + "4V8LLVI7PbaPR0K2TGSxFF", 1050 + "7pbDxGE6nQSZVfiFdq9lOL", 1051 + "1mSJCvDX0W7Dn7S9C6vmvI" 1052 + ], 1053 + "albumArtist": [ 1054 + "4V8LLVI7PbaPR0K2TGSxFF" 1055 + ], 1056 + "album": "2nkto6YNI4rUYTLqEwWJ3o" 1057 + }, 1058 + "brainz": { 1059 + "trackNumber": 8, 1060 + "recording": "379db622-cc58-4bbf-9a3e-a7fa50b25fd1", 1061 + "artist": [ 1062 + "f6beac20-5dfe-4d1f-ae02-0b0a740aafd6", 1063 + "883cbf1f-dcaa-4d17-b9ed-394e1fdabc87", 1064 + "4d7db1c4-3c00-4140-8c83-c6d99cfdecf4" 1065 + ], 1066 + "album": "eb340386-6815-4933-9a28-940f7140f009", 1067 + "releaseGroup": "e248e931-c26c-4c94-aba2-2f89ce583901" 1068 + } 1069 + }, 1070 + "listenedFor": 293.56100000000004, 1071 + "listenRanges": [ 1072 + // @ts-ignore 1073 + [ 1074 + { 1075 + "timestamp": "2026-03-15T15:27:14.682Z", 1076 + "position": 5.455 1077 + }, 1078 + { 1079 + "timestamp": "2026-03-15T15:32:08.223Z", 1080 + "position": 299.016 1081 + } 1082 + ] 1083 + ], 1084 + "repeat": false 1085 + }, 1086 + "meta": { 1087 + "deviceId": "3cc6dc47a8-Pixel 9a", 1088 + "source": "Spotify", 1089 + "musicService": "Spotify", 1090 + "trackId": "5WNYg3usc6H8N3MBEp4zVk", 1091 + "trackProgressPosition": 5.455, 1092 + "scrobbleTsSOC": 2, 1093 + "newFromSource": true, 1094 + "url": { 1095 + "web": "https://open.spotify.com/track/5WNYg3usc6H8N3MBEp4zVk" 1096 + }, 1097 + "art": { 1098 + "album": "https://i.scdn.co/image/ab67616d00001e028940ac99f49e44f59e6f7fb3" 1099 + }, 1100 + lifecycle: exampleLifecycle() 1101 + } 1102 + }); 1103 + 1104 + const lastfmErrorLifcycle: PlayLifecycle = { 1105 + "input": { 1106 + "track": { 1107 + "album": { 1108 + "album_type": "single", 1109 + "artists": [ 1110 + { 1111 + "external_urls": { 1112 + "spotify": "https://open.spotify.com/artist/4l8MDydHy2RGwcGscG0uCB" 1113 + }, 1114 + "href": "https://api.spotify.com/v1/artists/4l8MDydHy2RGwcGscG0uCB", 1115 + "id": "4l8MDydHy2RGwcGscG0uCB", 1116 + "name": "Mpho.Wav", 1117 + "type": "artist", 1118 + "uri": "spotify:artist:4l8MDydHy2RGwcGscG0uCB" 1119 + } 1120 + ], 1121 + "external_urls": { 1122 + "spotify": "https://open.spotify.com/album/1TCD8jrQdFclnpYVQxjon2" 1123 + }, 1124 + "href": "https://api.spotify.com/v1/albums/1TCD8jrQdFclnpYVQxjon2", 1125 + "id": "1TCD8jrQdFclnpYVQxjon2", 1126 + "images": [ 1127 + { 1128 + "height": 640, 1129 + "url": "https://i.scdn.co/image/ab67616d0000b273b0e9752208d1c426fcda8820", 1130 + "width": 640 1131 + }, 1132 + { 1133 + "height": 300, 1134 + "url": "https://i.scdn.co/image/ab67616d00001e02b0e9752208d1c426fcda8820", 1135 + "width": 300 1136 + }, 1137 + { 1138 + "height": 64, 1139 + "url": "https://i.scdn.co/image/ab67616d00004851b0e9752208d1c426fcda8820", 1140 + "width": 64 1141 + } 1142 + ], 1143 + "name": "Into The Deep", 1144 + "release_date": "2026-02-27", 1145 + "release_date_precision": "day", 1146 + "total_tracks": 3, 1147 + "type": "album", 1148 + "uri": "spotify:album:1TCD8jrQdFclnpYVQxjon2" 1149 + }, 1150 + "artists": [ 1151 + { 1152 + "external_urls": { 1153 + "spotify": "https://open.spotify.com/artist/4l8MDydHy2RGwcGscG0uCB" 1154 + }, 1155 + "href": "https://api.spotify.com/v1/artists/4l8MDydHy2RGwcGscG0uCB", 1156 + "id": "4l8MDydHy2RGwcGscG0uCB", 1157 + "name": "Mpho.Wav", 1158 + "type": "artist", 1159 + "uri": "spotify:artist:4l8MDydHy2RGwcGscG0uCB" 1160 + } 1161 + ], 1162 + "disc_number": 1, 1163 + "duration_ms": 318875, 1164 + "explicit": false, 1165 + "external_ids": { 1166 + "isrc": "US23A9495906" 1167 + }, 1168 + "external_urls": { 1169 + "spotify": "https://open.spotify.com/track/3Uar9flTUlakmFt9nkJdNZ" 1170 + }, 1171 + "href": "https://api.spotify.com/v1/tracks/3Uar9flTUlakmFt9nkJdNZ", 1172 + "id": "3Uar9flTUlakmFt9nkJdNZ", 1173 + "is_local": false, 1174 + "name": "Bab'omdala", 1175 + "popularity": 26, 1176 + "preview_url": "https://p.scdn.co/mp3-preview/ec6e58ff47870192adfa02cd02b963e269ff330e?cid=f85f5aa4211f4ea78aa364547798b340", 1177 + "track_number": 1, 1178 + "type": "track", 1179 + "uri": "spotify:track:3Uar9flTUlakmFt9nkJdNZ" 1180 + }, 1181 + "played_at": "2026-03-10T18:20:34.606Z", 1182 + "context": { 1183 + "type": "album", 1184 + "external_urls": { 1185 + "spotify": "https://open.spotify.com/album/4JgbPlF06nOTO03mSBSgtq" 1186 + }, 1187 + "href": "https://api.spotify.com/v1/albums/4JgbPlF06nOTO03mSBSgtq", 1188 + "uri": "spotify:album:4JgbPlF06nOTO03mSBSgtq" 1189 + } 1190 + }, 1191 + "original": { 1192 + "data": { 1193 + "album": "Into The Deep", 1194 + "track": "Bab'omdala", 1195 + "duration": 318.875, 1196 + "isrc": "US23A9495906", 1197 + "artists": [ 1198 + "Mpho.Wav" 1199 + ], 1200 + "albumArtists": [], 1201 + // @ts-ignore 1202 + "playDate": "2026-03-10T18:20:34.606Z", 1203 + // @ts-ignore 1204 + "playDateCompleted": "2026-03-10T18:20:34.606Z", 1205 + "meta": { 1206 + "spotify": { 1207 + "track": "3Uar9flTUlakmFt9nkJdNZ", 1208 + "artist": [ 1209 + "4l8MDydHy2RGwcGscG0uCB" 1210 + ], 1211 + "albumArtist": [], 1212 + "album": "1TCD8jrQdFclnpYVQxjon2" 1213 + }, 1214 + "brainz": { 1215 + "trackNumber": 1 1216 + } 1217 + } 1218 + }, 1219 + "meta": { 1220 + "deviceId": "NoDevice-SingleUser", 1221 + "source": "Spotify", 1222 + "musicService": "Spotify", 1223 + "trackId": "3Uar9flTUlakmFt9nkJdNZ", 1224 + "scrobbleTsSOC": 2, 1225 + "newFromSource": false, 1226 + "url": { 1227 + "web": "https://open.spotify.com/track/3Uar9flTUlakmFt9nkJdNZ" 1228 + }, 1229 + "art": { 1230 + "album": "https://i.scdn.co/image/ab67616d00001e02b0e9752208d1c426fcda8820" 1231 + } 1232 + } 1233 + }, 1234 + "steps": [ 1235 + { 1236 + "name": "preCompare", 1237 + "source": "Spotify - default" 1238 + } 1239 + ], 1240 + "scrobble": { 1241 + "payload": { 1242 + "artist": "Mpho.Wav", 1243 + "track": "Bab'omdala", 1244 + "album": "Into The Deep", 1245 + "timestamp": 1773166834, 1246 + "duration": 318.875 1247 + }, 1248 + "error": { 1249 + "showStopper": false, 1250 + "name": "Scrobble Submit Error", 1251 + "payload": { 1252 + "artist": "Mpho.Wav", 1253 + "track": "Bab'omdala", 1254 + "album": "Into The Deep", 1255 + "timestamp": 1773166834, 1256 + "duration": 318.875 1257 + }, 1258 + "message": "Failed to submit scrobble to Last.fm", 1259 + "stack": "Scrobble Submit Error: Failed to submit scrobble to Last.fm\n at LastfmApiClient.scrobble (/app/src/backend/common/vendor/LastfmApiClient.ts:447:19)\n at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async LastfmScrobbler.doScrobble (/app/src/backend/scrobblers/LastfmScrobbler.ts:88:28)\n at async LastfmScrobbler.scrobble (/app/src/backend/scrobblers/AbstractScrobbleClient.ts:623:28)\n at async LastfmScrobbler.processDeadLetterScrobble (/app/src/backend/scrobblers/AbstractScrobbleClient.ts:937:39)\n at async LastfmScrobbler.processDeadLetterQueue (/app/src/backend/scrobblers/AbstractScrobbleClient.ts:882:43)\n at async PromisePoolExecutor.handler (/app/src/backend/tasks/heartbeatClients.ts:35:21)\n at async PromisePoolExecutor.waitForActiveTaskToFinish (/app/node_modules/@supercharge/promise-pool/dist/promise-pool-executor.js:375:9)\n at async PromisePoolExecutor.waitForProcessingSlot (/app/node_modules/@supercharge/promise-pool/dist/promise-pool-executor.js:368:13)\n at async PromisePoolExecutor.process (/app/node_modules/@supercharge/promise-pool/dist/promise-pool-executor.js:354:13)", 1260 + "cause": { 1261 + "showStopper": false, 1262 + "name": "Error", 1263 + "message": "Last.fm ignored scrobble => (Code 1) (No error message returned) -- See https://www.last.fm/api/errorcodes for more information", 1264 + "stack": "Error: Last.fm ignored scrobble => (Code 1) (No error message returned) -- See https://www.last.fm/api/errorcodes for more information\n at LastfmApiClient.scrobble (/app/src/backend/common/vendor/LastfmApiClient.ts:424:23)\n at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async LastfmScrobbler.doScrobble (/app/src/backend/scrobblers/LastfmScrobbler.ts:88:28)\n at async LastfmScrobbler.scrobble (/app/src/backend/scrobblers/AbstractScrobbleClient.ts:623:28)\n at async LastfmScrobbler.processDeadLetterScrobble (/app/src/backend/scrobblers/AbstractScrobbleClient.ts:937:39)\n at async LastfmScrobbler.processDeadLetterQueue (/app/src/backend/scrobblers/AbstractScrobbleClient.ts:882:43)\n at async PromisePoolExecutor.handler (/app/src/backend/tasks/heartbeatClients.ts:35:21)\n at async PromisePoolExecutor.waitForActiveTaskToFinish (/app/node_modules/@supercharge/promise-pool/dist/promise-pool-executor.js:375:9)\n at async PromisePoolExecutor.waitForProcessingSlot (/app/node_modules/@supercharge/promise-pool/dist/promise-pool-executor.js:368:13)\n at async PromisePoolExecutor.process (/app/node_modules/@supercharge/promise-pool/dist/promise-pool-executor.js:354:13)" 1265 + } 1266 + }, 1267 + "match": { 1268 + "match": false, 1269 + "score": 0.32285714285714284, 1270 + "breakdowns": [ 1271 + "Artist: 0.00 * 0.3 = 0.00", 1272 + "Title: 0.06 * 0.4 = 0.02", 1273 + "Time: (Fuzzy) 0.6 * 0.5 = 0.30", 1274 + "Time Detail => Existing: 14:15:15-04:00 - Candidate: 14:20:34-04:00 | Temporal Sameness: Fuzzy | Play Diff: 319s (Needed <10s) | Fuzzy Duration Diff: 0s (Needed <= 10s) | Range Comparison N/A", 1275 + "Score 0.32 => No Match" 1276 + ], 1277 + "reason": "Score 0.32 => No Match", 1278 + "closestMatchedPlay": { 1279 + "data": { 1280 + "artists": [ 1281 + "Monique Bingham" 1282 + ], 1283 + "track": "Deep In The Bottom (of Africa) (feat. Black Coffee) - JazzWRLD Remix Edit (Radio Edit)", 1284 + "album": "Deep In The Bottom (Of Africa) The Remixes [Pt. 1]", 1285 + // @ts-ignore 1286 + "playDate": "2026-03-10T18:15:15.000Z" 1287 + }, 1288 + "meta": { 1289 + "nowPlaying": false, 1290 + "mbid": "", 1291 + "source": "Lastfm", 1292 + "url": { 1293 + "web": "https://www.last.fm/music/Monique+Bingham/_/Deep+In+The+Bottom+(of+Africa)+(feat.+Black+Coffee)+-+JazzWRLD+Remix+Edit+(Radio+Edit)" 1294 + }, 1295 + "lifecycle": { 1296 + "input": { 1297 + "artist": { 1298 + "url": "https://www.last.fm/music/Monique+Bingham", 1299 + "name": "Monique Bingham", 1300 + "image": [ 1301 + { 1302 + "size": "small", 1303 + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/2a96cbd8b46e442fc41c2b86b821562f.png" 1304 + }, 1305 + { 1306 + "size": "medium", 1307 + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/2a96cbd8b46e442fc41c2b86b821562f.png" 1308 + }, 1309 + { 1310 + "size": "large", 1311 + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/2a96cbd8b46e442fc41c2b86b821562f.png" 1312 + }, 1313 + { 1314 + "size": "extralarge", 1315 + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/2a96cbd8b46e442fc41c2b86b821562f.png" 1316 + } 1317 + ], 1318 + "mbid": "" 1319 + }, 1320 + "date": { 1321 + "uts": "1773166515", 1322 + "#text": "10 Mar 2026, 18:15" 1323 + }, 1324 + "mbid": "", 1325 + "name": "Deep In The Bottom (of Africa) (feat. Black Coffee) - JazzWRLD Remix Edit (Radio Edit)", 1326 + "image": [ 1327 + { 1328 + "size": "small", 1329 + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/2a96cbd8b46e442fc41c2b86b821562f.png" 1330 + }, 1331 + { 1332 + "size": "medium", 1333 + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/2a96cbd8b46e442fc41c2b86b821562f.png" 1334 + }, 1335 + { 1336 + "size": "large", 1337 + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/2a96cbd8b46e442fc41c2b86b821562f.png" 1338 + }, 1339 + { 1340 + "size": "extralarge", 1341 + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/2a96cbd8b46e442fc41c2b86b821562f.png" 1342 + } 1343 + ], 1344 + "url": "https://www.last.fm/music/Monique+Bingham/_/Deep+In+The+Bottom+(of+Africa)+(feat.+Black+Coffee)+-+JazzWRLD+Remix+Edit+(Radio+Edit)", 1345 + "streamable": "0", 1346 + "album": { 1347 + "mbid": "", 1348 + "#text": "Deep In The Bottom (Of Africa) The Remixes [Pt. 1]" 1349 + }, 1350 + "loved": "0" 1351 + }, 1352 + "original": { 1353 + "data": { 1354 + "track": "Deep In The Bottom (of Africa) (feat. Black Coffee) - JazzWRLD Remix Edit (Radio Edit)", 1355 + "album": "Deep In The Bottom (Of Africa) The Remixes [Pt. 1]", 1356 + "artists": [ 1357 + "Monique Bingham" 1358 + ], 1359 + // @ts-ignore 1360 + "playDate": "2026-03-10T18:15:15.000Z" 1361 + }, 1362 + "meta": { 1363 + "nowPlaying": false, 1364 + "mbid": "", 1365 + "source": "Lastfm", 1366 + "url": { 1367 + "web": "https://www.last.fm/music/Monique+Bingham/_/Deep+In+The+Bottom+(of+Africa)+(feat.+Black+Coffee)+-+JazzWRLD+Remix+Edit+(Radio+Edit)" 1368 + } 1369 + } 1370 + }, 1371 + "steps": [] 1372 + } 1373 + } 1374 + } 1375 + } 1376 + } 1377 + } 1378 + 1379 + export const lastfmErrorExample = (): JsonPlayObject => ({ 1380 + "data": { 1381 + "album": "Into The Deep", 1382 + "track": "Bab'omdala", 1383 + "duration": 318.875, 1384 + "isrc": "US23A9495906", 1385 + "artists": [ 1386 + "Mpho.Wav" 1387 + ], 1388 + "albumArtists": [], 1389 + // @ts-ignore 1390 + "playDate": "2026-03-10T18:20:34.606Z", 1391 + // @ts-ignore 1392 + "playDateCompleted": "2026-03-10T18:20:34.606Z", 1393 + "meta": { 1394 + "spotify": { 1395 + "track": "3Uar9flTUlakmFt9nkJdNZ", 1396 + "artist": [ 1397 + "4l8MDydHy2RGwcGscG0uCB" 1398 + ], 1399 + "albumArtist": [], 1400 + "album": "1TCD8jrQdFclnpYVQxjon2" 1401 + }, 1402 + "brainz": { 1403 + "trackNumber": 1 1404 + } 1405 + } 1406 + }, 1407 + "meta": { 1408 + "deviceId": "NoDevice-SingleUser", 1409 + "source": "Spotify", 1410 + "musicService": "Spotify", 1411 + "trackId": "3Uar9flTUlakmFt9nkJdNZ", 1412 + "scrobbleTsSOC": 2, 1413 + "newFromSource": false, 1414 + "url": { 1415 + "web": "https://open.spotify.com/track/3Uar9flTUlakmFt9nkJdNZ" 1416 + }, 1417 + "art": { 1418 + "album": "https://i.scdn.co/image/ab67616d00001e02b0e9752208d1c426fcda8820" 1419 + }, 1420 + lifecycle: lastfmErrorLifcycle 1421 + } 1422 + });
+28
src/stories/tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "moduleResolution": "bundler", 4 + "module": "preserve", 5 + "target": "esnext", 6 + "jsx": "react-jsx", 7 + "esModuleInterop": true, 8 + "resolveJsonModule": true, 9 + "lib": [ 10 + "esnext", 11 + "dom", 12 + "dom.iterable" 13 + ], 14 + "rootDirs": [ 15 + ".", 16 + "..src/client" 17 + ], 18 + }, 19 + "include": [ 20 + "*.stories.ts", 21 + "*.tsx", 22 + "..src/client/**/*.tsx", 23 + "..src/backend/tests/**/*.ts" 24 + ], 25 + "exclude": [ 26 + "node_modules" 27 + ] 28 + }
+1
vitest.shims.d.ts
··· 1 + /// <reference types="@vitest/browser-playwright" />