stevhliu HF Staff commited on
Commit
9347966
·
1 Parent(s): 7a1a5b0

update space

Browse files
README.md CHANGED
@@ -1,81 +1,73 @@
1
- ---
2
- title: Moe Experts
3
- emoji: 🐠
4
- colorFrom: indigo
5
- colorTo: red
6
- sdk: static
7
- pinned: false
8
- app_build_command: npm run build
9
- app_file: build/index.html
10
- ---
11
-
12
- # Getting Started with Create React App
13
-
14
- This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
15
-
16
- ## Available Scripts
17
-
18
- In the project directory, you can run:
19
-
20
- ### `npm start`
21
-
22
- Runs the app in the development mode.\
23
- Open [http://localhost:3000](http://localhost:3000) to view it in your browser.
24
-
25
- The page will reload when you make changes.\
26
- You may also see any lint errors in the console.
27
-
28
- ### `npm test`
29
-
30
- Launches the test runner in the interactive watch mode.\
31
- See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
32
-
33
- ### `npm run build`
34
-
35
- Builds the app for production to the `build` folder.\
36
- It correctly bundles React in production mode and optimizes the build for the best performance.
37
-
38
- The build is minified and the filenames include the hashes.\
39
- Your app is ready to be deployed!
40
-
41
- See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
42
-
43
- ### `npm run eject`
44
-
45
- **Note: this is a one-way operation. Once you `eject`, you can't go back!**
46
-
47
- If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
48
-
49
- Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own.
50
-
51
- You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it.
52
-
53
- ## Learn More
54
-
55
- You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
56
-
57
- To learn React, check out the [React documentation](https://reactjs.org/).
58
-
59
- ### Code Splitting
60
-
61
- This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
62
-
63
- ### Analyzing the Bundle Size
64
-
65
- This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
66
-
67
- ### Making a Progressive Web App
68
-
69
- This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
70
-
71
- ### Advanced Configuration
72
-
73
- This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
74
-
75
- ### Deployment
76
-
77
- This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
78
-
79
- ### `npm run build` fails to minify
80
-
81
- This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
 
1
+ # React + TypeScript + Vite
2
+
3
+ This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
4
+
5
+ Currently, two official plugins are available:
6
+
7
+ - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh
8
+ - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
9
+
10
+ ## React Compiler
11
+
12
+ The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
13
+
14
+ ## Expanding the ESLint configuration
15
+
16
+ If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
17
+
18
+ ```js
19
+ export default defineConfig([
20
+ globalIgnores(['dist']),
21
+ {
22
+ files: ['**/*.{ts,tsx}'],
23
+ extends: [
24
+ // Other configs...
25
+
26
+ // Remove tseslint.configs.recommended and replace with this
27
+ tseslint.configs.recommendedTypeChecked,
28
+ // Alternatively, use this for stricter rules
29
+ tseslint.configs.strictTypeChecked,
30
+ // Optionally, add this for stylistic rules
31
+ tseslint.configs.stylisticTypeChecked,
32
+
33
+ // Other configs...
34
+ ],
35
+ languageOptions: {
36
+ parserOptions: {
37
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
38
+ tsconfigRootDir: import.meta.dirname,
39
+ },
40
+ // other options...
41
+ },
42
+ },
43
+ ])
44
+ ```
45
+
46
+ You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
47
+
48
+ ```js
49
+ // eslint.config.js
50
+ import reactX from 'eslint-plugin-react-x'
51
+ import reactDom from 'eslint-plugin-react-dom'
52
+
53
+ export default defineConfig([
54
+ globalIgnores(['dist']),
55
+ {
56
+ files: ['**/*.{ts,tsx}'],
57
+ extends: [
58
+ // Other configs...
59
+ // Enable lint rules for React
60
+ reactX.configs['recommended-typescript'],
61
+ // Enable lint rules for React DOM
62
+ reactDom.configs.recommended,
63
+ ],
64
+ languageOptions: {
65
+ parserOptions: {
66
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
67
+ tsconfigRootDir: import.meta.dirname,
68
+ },
69
+ // other options...
70
+ },
71
+ },
72
+ ])
73
+ ```
 
 
 
 
 
 
 
 
eslint.config.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import js from '@eslint/js'
2
+ import globals from 'globals'
3
+ import reactHooks from 'eslint-plugin-react-hooks'
4
+ import reactRefresh from 'eslint-plugin-react-refresh'
5
+ import tseslint from 'typescript-eslint'
6
+ import { defineConfig, globalIgnores } from 'eslint/config'
7
+
8
+ export default defineConfig([
9
+ globalIgnores(['dist']),
10
+ {
11
+ files: ['**/*.{ts,tsx}'],
12
+ extends: [
13
+ js.configs.recommended,
14
+ tseslint.configs.recommended,
15
+ reactHooks.configs.flat.recommended,
16
+ reactRefresh.configs.vite,
17
+ ],
18
+ languageOptions: {
19
+ ecmaVersion: 2020,
20
+ globals: globals.browser,
21
+ },
22
+ },
23
+ ])
index.html ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>experts-vis-react</title>
8
+ </head>
9
+ <body>
10
+ <div id="root"></div>
11
+ <script type="module" src="/src/main.tsx"></script>
12
+ </body>
13
+ </html>
package.json CHANGED
@@ -1,39 +1,37 @@
1
  {
2
- "name": "react-template",
3
- "version": "0.1.0",
4
  "private": true,
5
- "dependencies": {
6
- "@testing-library/dom": "^10.4.0",
7
- "@testing-library/jest-dom": "^6.6.3",
8
- "@testing-library/react": "^16.3.0",
9
- "@testing-library/user-event": "^13.5.0",
10
- "react": "^19.1.0",
11
- "react-dom": "^19.1.0",
12
- "react-scripts": "5.0.1",
13
- "web-vitals": "^2.1.4"
14
- },
15
  "scripts": {
16
- "start": "react-scripts start",
17
- "build": "react-scripts build",
18
- "test": "react-scripts test",
19
- "eject": "react-scripts eject"
20
  },
21
- "eslintConfig": {
22
- "extends": [
23
- "react-app",
24
- "react-app/jest"
25
- ]
 
 
26
  },
27
- "browserslist": {
28
- "production": [
29
- ">0.2%",
30
- "not dead",
31
- "not op_mini all"
32
- ],
33
- "development": [
34
- "last 1 chrome version",
35
- "last 1 firefox version",
36
- "last 1 safari version"
37
- ]
 
 
 
 
 
38
  }
39
  }
 
1
  {
2
+ "name": "experts-vis-react",
 
3
  "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
 
 
 
 
 
 
 
 
6
  "scripts": {
7
+ "dev": "vite",
8
+ "build": "tsc -b && vite build",
9
+ "lint": "eslint .",
10
+ "preview": "vite preview"
11
  },
12
+ "dependencies": {
13
+ "class-variance-authority": "^0.7.1",
14
+ "clsx": "^2.1.1",
15
+ "react": "^19.2.0",
16
+ "react-dom": "^19.2.0",
17
+ "recharts": "^3.6.0",
18
+ "tailwind-merge": "^3.4.0"
19
  },
20
+ "devDependencies": {
21
+ "@eslint/js": "^9.39.1",
22
+ "@tailwindcss/vite": "^4.1.18",
23
+ "@types/node": "^24.10.1",
24
+ "@types/react": "^19.2.5",
25
+ "@types/react-dom": "^19.2.3",
26
+ "@vitejs/plugin-react": "^5.1.1",
27
+ "eslint": "^9.39.1",
28
+ "eslint-plugin-react-hooks": "^7.0.1",
29
+ "eslint-plugin-react-refresh": "^0.4.24",
30
+ "globals": "^16.5.0",
31
+ "tailwindcss": "^4.1.18",
32
+ "tw-animate-css": "^1.4.0",
33
+ "typescript": "~5.9.3",
34
+ "typescript-eslint": "^8.46.4",
35
+ "vite": "^7.2.4"
36
  }
37
  }
pnpm-lock.yaml ADDED
@@ -0,0 +1,2727 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ lockfileVersion: '9.0'
2
+
3
+ settings:
4
+ autoInstallPeers: true
5
+ excludeLinksFromLockfile: false
6
+
7
+ importers:
8
+
9
+ .:
10
+ dependencies:
11
+ class-variance-authority:
12
+ specifier: ^0.7.1
13
+ version: 0.7.1
14
+ clsx:
15
+ specifier: ^2.1.1
16
+ version: 2.1.1
17
+ react:
18
+ specifier: ^19.2.0
19
+ version: 19.2.3
20
+ react-dom:
21
+ specifier: ^19.2.0
22
+ version: 19.2.3(react@19.2.3)
23
+ recharts:
24
+ specifier: ^3.6.0
25
+ version: 3.6.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react-is@19.2.3)(react@19.2.3)(redux@5.0.1)
26
+ tailwind-merge:
27
+ specifier: ^3.4.0
28
+ version: 3.4.0
29
+ devDependencies:
30
+ '@eslint/js':
31
+ specifier: ^9.39.1
32
+ version: 9.39.2
33
+ '@tailwindcss/vite':
34
+ specifier: ^4.1.18
35
+ version: 4.1.18(vite@7.3.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2))
36
+ '@types/node':
37
+ specifier: ^24.10.1
38
+ version: 24.10.4
39
+ '@types/react':
40
+ specifier: ^19.2.5
41
+ version: 19.2.7
42
+ '@types/react-dom':
43
+ specifier: ^19.2.3
44
+ version: 19.2.3(@types/react@19.2.7)
45
+ '@vitejs/plugin-react':
46
+ specifier: ^5.1.1
47
+ version: 5.1.2(vite@7.3.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2))
48
+ eslint:
49
+ specifier: ^9.39.1
50
+ version: 9.39.2(jiti@2.6.1)
51
+ eslint-plugin-react-hooks:
52
+ specifier: ^7.0.1
53
+ version: 7.0.1(eslint@9.39.2(jiti@2.6.1))
54
+ eslint-plugin-react-refresh:
55
+ specifier: ^0.4.24
56
+ version: 0.4.26(eslint@9.39.2(jiti@2.6.1))
57
+ globals:
58
+ specifier: ^16.5.0
59
+ version: 16.5.0
60
+ tailwindcss:
61
+ specifier: ^4.1.18
62
+ version: 4.1.18
63
+ tw-animate-css:
64
+ specifier: ^1.4.0
65
+ version: 1.4.0
66
+ typescript:
67
+ specifier: ~5.9.3
68
+ version: 5.9.3
69
+ typescript-eslint:
70
+ specifier: ^8.46.4
71
+ version: 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
72
+ vite:
73
+ specifier: ^7.2.4
74
+ version: 7.3.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)
75
+
76
+ packages:
77
+
78
+ '@babel/code-frame@7.27.1':
79
+ resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
80
+ engines: {node: '>=6.9.0'}
81
+
82
+ '@babel/compat-data@7.28.5':
83
+ resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==}
84
+ engines: {node: '>=6.9.0'}
85
+
86
+ '@babel/core@7.28.5':
87
+ resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==}
88
+ engines: {node: '>=6.9.0'}
89
+
90
+ '@babel/generator@7.28.5':
91
+ resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==}
92
+ engines: {node: '>=6.9.0'}
93
+
94
+ '@babel/helper-compilation-targets@7.27.2':
95
+ resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
96
+ engines: {node: '>=6.9.0'}
97
+
98
+ '@babel/helper-globals@7.28.0':
99
+ resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
100
+ engines: {node: '>=6.9.0'}
101
+
102
+ '@babel/helper-module-imports@7.27.1':
103
+ resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
104
+ engines: {node: '>=6.9.0'}
105
+
106
+ '@babel/helper-module-transforms@7.28.3':
107
+ resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==}
108
+ engines: {node: '>=6.9.0'}
109
+ peerDependencies:
110
+ '@babel/core': ^7.0.0
111
+
112
+ '@babel/helper-plugin-utils@7.27.1':
113
+ resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==}
114
+ engines: {node: '>=6.9.0'}
115
+
116
+ '@babel/helper-string-parser@7.27.1':
117
+ resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
118
+ engines: {node: '>=6.9.0'}
119
+
120
+ '@babel/helper-validator-identifier@7.28.5':
121
+ resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
122
+ engines: {node: '>=6.9.0'}
123
+
124
+ '@babel/helper-validator-option@7.27.1':
125
+ resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
126
+ engines: {node: '>=6.9.0'}
127
+
128
+ '@babel/helpers@7.28.4':
129
+ resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==}
130
+ engines: {node: '>=6.9.0'}
131
+
132
+ '@babel/parser@7.28.5':
133
+ resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==}
134
+ engines: {node: '>=6.0.0'}
135
+ hasBin: true
136
+
137
+ '@babel/plugin-transform-react-jsx-self@7.27.1':
138
+ resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==}
139
+ engines: {node: '>=6.9.0'}
140
+ peerDependencies:
141
+ '@babel/core': ^7.0.0-0
142
+
143
+ '@babel/plugin-transform-react-jsx-source@7.27.1':
144
+ resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==}
145
+ engines: {node: '>=6.9.0'}
146
+ peerDependencies:
147
+ '@babel/core': ^7.0.0-0
148
+
149
+ '@babel/template@7.27.2':
150
+ resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
151
+ engines: {node: '>=6.9.0'}
152
+
153
+ '@babel/traverse@7.28.5':
154
+ resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==}
155
+ engines: {node: '>=6.9.0'}
156
+
157
+ '@babel/types@7.28.5':
158
+ resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==}
159
+ engines: {node: '>=6.9.0'}
160
+
161
+ '@esbuild/aix-ppc64@0.27.2':
162
+ resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==}
163
+ engines: {node: '>=18'}
164
+ cpu: [ppc64]
165
+ os: [aix]
166
+
167
+ '@esbuild/android-arm64@0.27.2':
168
+ resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==}
169
+ engines: {node: '>=18'}
170
+ cpu: [arm64]
171
+ os: [android]
172
+
173
+ '@esbuild/android-arm@0.27.2':
174
+ resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==}
175
+ engines: {node: '>=18'}
176
+ cpu: [arm]
177
+ os: [android]
178
+
179
+ '@esbuild/android-x64@0.27.2':
180
+ resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==}
181
+ engines: {node: '>=18'}
182
+ cpu: [x64]
183
+ os: [android]
184
+
185
+ '@esbuild/darwin-arm64@0.27.2':
186
+ resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==}
187
+ engines: {node: '>=18'}
188
+ cpu: [arm64]
189
+ os: [darwin]
190
+
191
+ '@esbuild/darwin-x64@0.27.2':
192
+ resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==}
193
+ engines: {node: '>=18'}
194
+ cpu: [x64]
195
+ os: [darwin]
196
+
197
+ '@esbuild/freebsd-arm64@0.27.2':
198
+ resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==}
199
+ engines: {node: '>=18'}
200
+ cpu: [arm64]
201
+ os: [freebsd]
202
+
203
+ '@esbuild/freebsd-x64@0.27.2':
204
+ resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==}
205
+ engines: {node: '>=18'}
206
+ cpu: [x64]
207
+ os: [freebsd]
208
+
209
+ '@esbuild/linux-arm64@0.27.2':
210
+ resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==}
211
+ engines: {node: '>=18'}
212
+ cpu: [arm64]
213
+ os: [linux]
214
+
215
+ '@esbuild/linux-arm@0.27.2':
216
+ resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==}
217
+ engines: {node: '>=18'}
218
+ cpu: [arm]
219
+ os: [linux]
220
+
221
+ '@esbuild/linux-ia32@0.27.2':
222
+ resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==}
223
+ engines: {node: '>=18'}
224
+ cpu: [ia32]
225
+ os: [linux]
226
+
227
+ '@esbuild/linux-loong64@0.27.2':
228
+ resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==}
229
+ engines: {node: '>=18'}
230
+ cpu: [loong64]
231
+ os: [linux]
232
+
233
+ '@esbuild/linux-mips64el@0.27.2':
234
+ resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==}
235
+ engines: {node: '>=18'}
236
+ cpu: [mips64el]
237
+ os: [linux]
238
+
239
+ '@esbuild/linux-ppc64@0.27.2':
240
+ resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==}
241
+ engines: {node: '>=18'}
242
+ cpu: [ppc64]
243
+ os: [linux]
244
+
245
+ '@esbuild/linux-riscv64@0.27.2':
246
+ resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==}
247
+ engines: {node: '>=18'}
248
+ cpu: [riscv64]
249
+ os: [linux]
250
+
251
+ '@esbuild/linux-s390x@0.27.2':
252
+ resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==}
253
+ engines: {node: '>=18'}
254
+ cpu: [s390x]
255
+ os: [linux]
256
+
257
+ '@esbuild/linux-x64@0.27.2':
258
+ resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==}
259
+ engines: {node: '>=18'}
260
+ cpu: [x64]
261
+ os: [linux]
262
+
263
+ '@esbuild/netbsd-arm64@0.27.2':
264
+ resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==}
265
+ engines: {node: '>=18'}
266
+ cpu: [arm64]
267
+ os: [netbsd]
268
+
269
+ '@esbuild/netbsd-x64@0.27.2':
270
+ resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==}
271
+ engines: {node: '>=18'}
272
+ cpu: [x64]
273
+ os: [netbsd]
274
+
275
+ '@esbuild/openbsd-arm64@0.27.2':
276
+ resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==}
277
+ engines: {node: '>=18'}
278
+ cpu: [arm64]
279
+ os: [openbsd]
280
+
281
+ '@esbuild/openbsd-x64@0.27.2':
282
+ resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==}
283
+ engines: {node: '>=18'}
284
+ cpu: [x64]
285
+ os: [openbsd]
286
+
287
+ '@esbuild/openharmony-arm64@0.27.2':
288
+ resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==}
289
+ engines: {node: '>=18'}
290
+ cpu: [arm64]
291
+ os: [openharmony]
292
+
293
+ '@esbuild/sunos-x64@0.27.2':
294
+ resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==}
295
+ engines: {node: '>=18'}
296
+ cpu: [x64]
297
+ os: [sunos]
298
+
299
+ '@esbuild/win32-arm64@0.27.2':
300
+ resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==}
301
+ engines: {node: '>=18'}
302
+ cpu: [arm64]
303
+ os: [win32]
304
+
305
+ '@esbuild/win32-ia32@0.27.2':
306
+ resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==}
307
+ engines: {node: '>=18'}
308
+ cpu: [ia32]
309
+ os: [win32]
310
+
311
+ '@esbuild/win32-x64@0.27.2':
312
+ resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==}
313
+ engines: {node: '>=18'}
314
+ cpu: [x64]
315
+ os: [win32]
316
+
317
+ '@eslint-community/eslint-utils@4.9.1':
318
+ resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==}
319
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
320
+ peerDependencies:
321
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
322
+
323
+ '@eslint-community/regexpp@4.12.2':
324
+ resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
325
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
326
+
327
+ '@eslint/config-array@0.21.1':
328
+ resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==}
329
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
330
+
331
+ '@eslint/config-helpers@0.4.2':
332
+ resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==}
333
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
334
+
335
+ '@eslint/core@0.17.0':
336
+ resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==}
337
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
338
+
339
+ '@eslint/eslintrc@3.3.3':
340
+ resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==}
341
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
342
+
343
+ '@eslint/js@9.39.2':
344
+ resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==}
345
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
346
+
347
+ '@eslint/object-schema@2.1.7':
348
+ resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==}
349
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
350
+
351
+ '@eslint/plugin-kit@0.4.1':
352
+ resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
353
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
354
+
355
+ '@humanfs/core@0.19.1':
356
+ resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
357
+ engines: {node: '>=18.18.0'}
358
+
359
+ '@humanfs/node@0.16.7':
360
+ resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==}
361
+ engines: {node: '>=18.18.0'}
362
+
363
+ '@humanwhocodes/module-importer@1.0.1':
364
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
365
+ engines: {node: '>=12.22'}
366
+
367
+ '@humanwhocodes/retry@0.4.3':
368
+ resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
369
+ engines: {node: '>=18.18'}
370
+
371
+ '@jridgewell/gen-mapping@0.3.13':
372
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
373
+
374
+ '@jridgewell/remapping@2.3.5':
375
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
376
+
377
+ '@jridgewell/resolve-uri@3.1.2':
378
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
379
+ engines: {node: '>=6.0.0'}
380
+
381
+ '@jridgewell/sourcemap-codec@1.5.5':
382
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
383
+
384
+ '@jridgewell/trace-mapping@0.3.31':
385
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
386
+
387
+ '@reduxjs/toolkit@2.11.2':
388
+ resolution: {integrity: sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==}
389
+ peerDependencies:
390
+ react: ^16.9.0 || ^17.0.0 || ^18 || ^19
391
+ react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0
392
+ peerDependenciesMeta:
393
+ react:
394
+ optional: true
395
+ react-redux:
396
+ optional: true
397
+
398
+ '@rolldown/pluginutils@1.0.0-beta.53':
399
+ resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==}
400
+
401
+ '@rollup/rollup-android-arm-eabi@4.55.1':
402
+ resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==}
403
+ cpu: [arm]
404
+ os: [android]
405
+
406
+ '@rollup/rollup-android-arm64@4.55.1':
407
+ resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==}
408
+ cpu: [arm64]
409
+ os: [android]
410
+
411
+ '@rollup/rollup-darwin-arm64@4.55.1':
412
+ resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==}
413
+ cpu: [arm64]
414
+ os: [darwin]
415
+
416
+ '@rollup/rollup-darwin-x64@4.55.1':
417
+ resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==}
418
+ cpu: [x64]
419
+ os: [darwin]
420
+
421
+ '@rollup/rollup-freebsd-arm64@4.55.1':
422
+ resolution: {integrity: sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==}
423
+ cpu: [arm64]
424
+ os: [freebsd]
425
+
426
+ '@rollup/rollup-freebsd-x64@4.55.1':
427
+ resolution: {integrity: sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==}
428
+ cpu: [x64]
429
+ os: [freebsd]
430
+
431
+ '@rollup/rollup-linux-arm-gnueabihf@4.55.1':
432
+ resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==}
433
+ cpu: [arm]
434
+ os: [linux]
435
+
436
+ '@rollup/rollup-linux-arm-musleabihf@4.55.1':
437
+ resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==}
438
+ cpu: [arm]
439
+ os: [linux]
440
+
441
+ '@rollup/rollup-linux-arm64-gnu@4.55.1':
442
+ resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==}
443
+ cpu: [arm64]
444
+ os: [linux]
445
+
446
+ '@rollup/rollup-linux-arm64-musl@4.55.1':
447
+ resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==}
448
+ cpu: [arm64]
449
+ os: [linux]
450
+
451
+ '@rollup/rollup-linux-loong64-gnu@4.55.1':
452
+ resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==}
453
+ cpu: [loong64]
454
+ os: [linux]
455
+
456
+ '@rollup/rollup-linux-loong64-musl@4.55.1':
457
+ resolution: {integrity: sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==}
458
+ cpu: [loong64]
459
+ os: [linux]
460
+
461
+ '@rollup/rollup-linux-ppc64-gnu@4.55.1':
462
+ resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==}
463
+ cpu: [ppc64]
464
+ os: [linux]
465
+
466
+ '@rollup/rollup-linux-ppc64-musl@4.55.1':
467
+ resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==}
468
+ cpu: [ppc64]
469
+ os: [linux]
470
+
471
+ '@rollup/rollup-linux-riscv64-gnu@4.55.1':
472
+ resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==}
473
+ cpu: [riscv64]
474
+ os: [linux]
475
+
476
+ '@rollup/rollup-linux-riscv64-musl@4.55.1':
477
+ resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==}
478
+ cpu: [riscv64]
479
+ os: [linux]
480
+
481
+ '@rollup/rollup-linux-s390x-gnu@4.55.1':
482
+ resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==}
483
+ cpu: [s390x]
484
+ os: [linux]
485
+
486
+ '@rollup/rollup-linux-x64-gnu@4.55.1':
487
+ resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==}
488
+ cpu: [x64]
489
+ os: [linux]
490
+
491
+ '@rollup/rollup-linux-x64-musl@4.55.1':
492
+ resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==}
493
+ cpu: [x64]
494
+ os: [linux]
495
+
496
+ '@rollup/rollup-openbsd-x64@4.55.1':
497
+ resolution: {integrity: sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==}
498
+ cpu: [x64]
499
+ os: [openbsd]
500
+
501
+ '@rollup/rollup-openharmony-arm64@4.55.1':
502
+ resolution: {integrity: sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==}
503
+ cpu: [arm64]
504
+ os: [openharmony]
505
+
506
+ '@rollup/rollup-win32-arm64-msvc@4.55.1':
507
+ resolution: {integrity: sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==}
508
+ cpu: [arm64]
509
+ os: [win32]
510
+
511
+ '@rollup/rollup-win32-ia32-msvc@4.55.1':
512
+ resolution: {integrity: sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==}
513
+ cpu: [ia32]
514
+ os: [win32]
515
+
516
+ '@rollup/rollup-win32-x64-gnu@4.55.1':
517
+ resolution: {integrity: sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==}
518
+ cpu: [x64]
519
+ os: [win32]
520
+
521
+ '@rollup/rollup-win32-x64-msvc@4.55.1':
522
+ resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==}
523
+ cpu: [x64]
524
+ os: [win32]
525
+
526
+ '@standard-schema/spec@1.1.0':
527
+ resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
528
+
529
+ '@standard-schema/utils@0.3.0':
530
+ resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==}
531
+
532
+ '@tailwindcss/node@4.1.18':
533
+ resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==}
534
+
535
+ '@tailwindcss/oxide-android-arm64@4.1.18':
536
+ resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==}
537
+ engines: {node: '>= 10'}
538
+ cpu: [arm64]
539
+ os: [android]
540
+
541
+ '@tailwindcss/oxide-darwin-arm64@4.1.18':
542
+ resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==}
543
+ engines: {node: '>= 10'}
544
+ cpu: [arm64]
545
+ os: [darwin]
546
+
547
+ '@tailwindcss/oxide-darwin-x64@4.1.18':
548
+ resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==}
549
+ engines: {node: '>= 10'}
550
+ cpu: [x64]
551
+ os: [darwin]
552
+
553
+ '@tailwindcss/oxide-freebsd-x64@4.1.18':
554
+ resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==}
555
+ engines: {node: '>= 10'}
556
+ cpu: [x64]
557
+ os: [freebsd]
558
+
559
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18':
560
+ resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==}
561
+ engines: {node: '>= 10'}
562
+ cpu: [arm]
563
+ os: [linux]
564
+
565
+ '@tailwindcss/oxide-linux-arm64-gnu@4.1.18':
566
+ resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==}
567
+ engines: {node: '>= 10'}
568
+ cpu: [arm64]
569
+ os: [linux]
570
+
571
+ '@tailwindcss/oxide-linux-arm64-musl@4.1.18':
572
+ resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==}
573
+ engines: {node: '>= 10'}
574
+ cpu: [arm64]
575
+ os: [linux]
576
+
577
+ '@tailwindcss/oxide-linux-x64-gnu@4.1.18':
578
+ resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==}
579
+ engines: {node: '>= 10'}
580
+ cpu: [x64]
581
+ os: [linux]
582
+
583
+ '@tailwindcss/oxide-linux-x64-musl@4.1.18':
584
+ resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==}
585
+ engines: {node: '>= 10'}
586
+ cpu: [x64]
587
+ os: [linux]
588
+
589
+ '@tailwindcss/oxide-wasm32-wasi@4.1.18':
590
+ resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==}
591
+ engines: {node: '>=14.0.0'}
592
+ cpu: [wasm32]
593
+ bundledDependencies:
594
+ - '@napi-rs/wasm-runtime'
595
+ - '@emnapi/core'
596
+ - '@emnapi/runtime'
597
+ - '@tybys/wasm-util'
598
+ - '@emnapi/wasi-threads'
599
+ - tslib
600
+
601
+ '@tailwindcss/oxide-win32-arm64-msvc@4.1.18':
602
+ resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==}
603
+ engines: {node: '>= 10'}
604
+ cpu: [arm64]
605
+ os: [win32]
606
+
607
+ '@tailwindcss/oxide-win32-x64-msvc@4.1.18':
608
+ resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==}
609
+ engines: {node: '>= 10'}
610
+ cpu: [x64]
611
+ os: [win32]
612
+
613
+ '@tailwindcss/oxide@4.1.18':
614
+ resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==}
615
+ engines: {node: '>= 10'}
616
+
617
+ '@tailwindcss/vite@4.1.18':
618
+ resolution: {integrity: sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==}
619
+ peerDependencies:
620
+ vite: ^5.2.0 || ^6 || ^7
621
+
622
+ '@types/babel__core@7.20.5':
623
+ resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
624
+
625
+ '@types/babel__generator@7.27.0':
626
+ resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==}
627
+
628
+ '@types/babel__template@7.4.4':
629
+ resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
630
+
631
+ '@types/babel__traverse@7.28.0':
632
+ resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==}
633
+
634
+ '@types/d3-array@3.2.2':
635
+ resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==}
636
+
637
+ '@types/d3-color@3.1.3':
638
+ resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==}
639
+
640
+ '@types/d3-ease@3.0.2':
641
+ resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==}
642
+
643
+ '@types/d3-interpolate@3.0.4':
644
+ resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==}
645
+
646
+ '@types/d3-path@3.1.1':
647
+ resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==}
648
+
649
+ '@types/d3-scale@4.0.9':
650
+ resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==}
651
+
652
+ '@types/d3-shape@3.1.7':
653
+ resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==}
654
+
655
+ '@types/d3-time@3.0.4':
656
+ resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==}
657
+
658
+ '@types/d3-timer@3.0.2':
659
+ resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==}
660
+
661
+ '@types/estree@1.0.8':
662
+ resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
663
+
664
+ '@types/json-schema@7.0.15':
665
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
666
+
667
+ '@types/node@24.10.4':
668
+ resolution: {integrity: sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==}
669
+
670
+ '@types/react-dom@19.2.3':
671
+ resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
672
+ peerDependencies:
673
+ '@types/react': ^19.2.0
674
+
675
+ '@types/react@19.2.7':
676
+ resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==}
677
+
678
+ '@types/use-sync-external-store@0.0.6':
679
+ resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==}
680
+
681
+ '@typescript-eslint/eslint-plugin@8.52.0':
682
+ resolution: {integrity: sha512-okqtOgqu2qmZJ5iN4TWlgfF171dZmx2FzdOv2K/ixL2LZWDStL8+JgQerI2sa8eAEfoydG9+0V96m7V+P8yE1Q==}
683
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
684
+ peerDependencies:
685
+ '@typescript-eslint/parser': ^8.52.0
686
+ eslint: ^8.57.0 || ^9.0.0
687
+ typescript: '>=4.8.4 <6.0.0'
688
+
689
+ '@typescript-eslint/parser@8.52.0':
690
+ resolution: {integrity: sha512-iIACsx8pxRnguSYhHiMn2PvhvfpopO9FXHyn1mG5txZIsAaB6F0KwbFnUQN3KCiG3Jcuad/Cao2FAs1Wp7vAyg==}
691
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
692
+ peerDependencies:
693
+ eslint: ^8.57.0 || ^9.0.0
694
+ typescript: '>=4.8.4 <6.0.0'
695
+
696
+ '@typescript-eslint/project-service@8.52.0':
697
+ resolution: {integrity: sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==}
698
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
699
+ peerDependencies:
700
+ typescript: '>=4.8.4 <6.0.0'
701
+
702
+ '@typescript-eslint/scope-manager@8.52.0':
703
+ resolution: {integrity: sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==}
704
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
705
+
706
+ '@typescript-eslint/tsconfig-utils@8.52.0':
707
+ resolution: {integrity: sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==}
708
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
709
+ peerDependencies:
710
+ typescript: '>=4.8.4 <6.0.0'
711
+
712
+ '@typescript-eslint/type-utils@8.52.0':
713
+ resolution: {integrity: sha512-JD3wKBRWglYRQkAtsyGz1AewDu3mTc7NtRjR/ceTyGoPqmdS5oCdx/oZMWD5Zuqmo6/MpsYs0wp6axNt88/2EQ==}
714
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
715
+ peerDependencies:
716
+ eslint: ^8.57.0 || ^9.0.0
717
+ typescript: '>=4.8.4 <6.0.0'
718
+
719
+ '@typescript-eslint/types@8.52.0':
720
+ resolution: {integrity: sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==}
721
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
722
+
723
+ '@typescript-eslint/typescript-estree@8.52.0':
724
+ resolution: {integrity: sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==}
725
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
726
+ peerDependencies:
727
+ typescript: '>=4.8.4 <6.0.0'
728
+
729
+ '@typescript-eslint/utils@8.52.0':
730
+ resolution: {integrity: sha512-wYndVMWkweqHpEpwPhwqE2lnD2DxC6WVLupU/DOt/0/v+/+iQbbzO3jOHjmBMnhu0DgLULvOaU4h4pwHYi2oRQ==}
731
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
732
+ peerDependencies:
733
+ eslint: ^8.57.0 || ^9.0.0
734
+ typescript: '>=4.8.4 <6.0.0'
735
+
736
+ '@typescript-eslint/visitor-keys@8.52.0':
737
+ resolution: {integrity: sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==}
738
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
739
+
740
+ '@vitejs/plugin-react@5.1.2':
741
+ resolution: {integrity: sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==}
742
+ engines: {node: ^20.19.0 || >=22.12.0}
743
+ peerDependencies:
744
+ vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0
745
+
746
+ acorn-jsx@5.3.2:
747
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
748
+ peerDependencies:
749
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
750
+
751
+ acorn@8.15.0:
752
+ resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
753
+ engines: {node: '>=0.4.0'}
754
+ hasBin: true
755
+
756
+ ajv@6.12.6:
757
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
758
+
759
+ ansi-styles@4.3.0:
760
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
761
+ engines: {node: '>=8'}
762
+
763
+ argparse@2.0.1:
764
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
765
+
766
+ balanced-match@1.0.2:
767
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
768
+
769
+ baseline-browser-mapping@2.9.13:
770
+ resolution: {integrity: sha512-WhtvB2NG2wjr04+h77sg3klAIwrgOqnjS49GGudnUPGFFgg7G17y7Qecqp+2Dr5kUDxNRBca0SK7cG8JwzkWDQ==}
771
+ hasBin: true
772
+
773
+ brace-expansion@1.1.12:
774
+ resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
775
+
776
+ brace-expansion@2.0.2:
777
+ resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
778
+
779
+ browserslist@4.28.1:
780
+ resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==}
781
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
782
+ hasBin: true
783
+
784
+ callsites@3.1.0:
785
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
786
+ engines: {node: '>=6'}
787
+
788
+ caniuse-lite@1.0.30001763:
789
+ resolution: {integrity: sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ==}
790
+
791
+ chalk@4.1.2:
792
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
793
+ engines: {node: '>=10'}
794
+
795
+ class-variance-authority@0.7.1:
796
+ resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
797
+
798
+ clsx@2.1.1:
799
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
800
+ engines: {node: '>=6'}
801
+
802
+ color-convert@2.0.1:
803
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
804
+ engines: {node: '>=7.0.0'}
805
+
806
+ color-name@1.1.4:
807
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
808
+
809
+ concat-map@0.0.1:
810
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
811
+
812
+ convert-source-map@2.0.0:
813
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
814
+
815
+ cross-spawn@7.0.6:
816
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
817
+ engines: {node: '>= 8'}
818
+
819
+ csstype@3.2.3:
820
+ resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
821
+
822
+ d3-array@3.2.4:
823
+ resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==}
824
+ engines: {node: '>=12'}
825
+
826
+ d3-color@3.1.0:
827
+ resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
828
+ engines: {node: '>=12'}
829
+
830
+ d3-ease@3.0.1:
831
+ resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
832
+ engines: {node: '>=12'}
833
+
834
+ d3-format@3.1.0:
835
+ resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==}
836
+ engines: {node: '>=12'}
837
+
838
+ d3-interpolate@3.0.1:
839
+ resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
840
+ engines: {node: '>=12'}
841
+
842
+ d3-path@3.1.0:
843
+ resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==}
844
+ engines: {node: '>=12'}
845
+
846
+ d3-scale@4.0.2:
847
+ resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==}
848
+ engines: {node: '>=12'}
849
+
850
+ d3-shape@3.2.0:
851
+ resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==}
852
+ engines: {node: '>=12'}
853
+
854
+ d3-time-format@4.1.0:
855
+ resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==}
856
+ engines: {node: '>=12'}
857
+
858
+ d3-time@3.1.0:
859
+ resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==}
860
+ engines: {node: '>=12'}
861
+
862
+ d3-timer@3.0.1:
863
+ resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
864
+ engines: {node: '>=12'}
865
+
866
+ debug@4.4.3:
867
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
868
+ engines: {node: '>=6.0'}
869
+ peerDependencies:
870
+ supports-color: '*'
871
+ peerDependenciesMeta:
872
+ supports-color:
873
+ optional: true
874
+
875
+ decimal.js-light@2.5.1:
876
+ resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==}
877
+
878
+ deep-is@0.1.4:
879
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
880
+
881
+ detect-libc@2.1.2:
882
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
883
+ engines: {node: '>=8'}
884
+
885
+ electron-to-chromium@1.5.267:
886
+ resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==}
887
+
888
+ enhanced-resolve@5.18.4:
889
+ resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==}
890
+ engines: {node: '>=10.13.0'}
891
+
892
+ es-toolkit@1.43.0:
893
+ resolution: {integrity: sha512-SKCT8AsWvYzBBuUqMk4NPwFlSdqLpJwmy6AP322ERn8W2YLIB6JBXnwMI2Qsh2gfphT3q7EKAxKb23cvFHFwKA==}
894
+
895
+ esbuild@0.27.2:
896
+ resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==}
897
+ engines: {node: '>=18'}
898
+ hasBin: true
899
+
900
+ escalade@3.2.0:
901
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
902
+ engines: {node: '>=6'}
903
+
904
+ escape-string-regexp@4.0.0:
905
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
906
+ engines: {node: '>=10'}
907
+
908
+ eslint-plugin-react-hooks@7.0.1:
909
+ resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==}
910
+ engines: {node: '>=18'}
911
+ peerDependencies:
912
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0
913
+
914
+ eslint-plugin-react-refresh@0.4.26:
915
+ resolution: {integrity: sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==}
916
+ peerDependencies:
917
+ eslint: '>=8.40'
918
+
919
+ eslint-scope@8.4.0:
920
+ resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==}
921
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
922
+
923
+ eslint-visitor-keys@3.4.3:
924
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
925
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
926
+
927
+ eslint-visitor-keys@4.2.1:
928
+ resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
929
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
930
+
931
+ eslint@9.39.2:
932
+ resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==}
933
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
934
+ hasBin: true
935
+ peerDependencies:
936
+ jiti: '*'
937
+ peerDependenciesMeta:
938
+ jiti:
939
+ optional: true
940
+
941
+ espree@10.4.0:
942
+ resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==}
943
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
944
+
945
+ esquery@1.7.0:
946
+ resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==}
947
+ engines: {node: '>=0.10'}
948
+
949
+ esrecurse@4.3.0:
950
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
951
+ engines: {node: '>=4.0'}
952
+
953
+ estraverse@5.3.0:
954
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
955
+ engines: {node: '>=4.0'}
956
+
957
+ esutils@2.0.3:
958
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
959
+ engines: {node: '>=0.10.0'}
960
+
961
+ eventemitter3@5.0.1:
962
+ resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
963
+
964
+ fast-deep-equal@3.1.3:
965
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
966
+
967
+ fast-json-stable-stringify@2.1.0:
968
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
969
+
970
+ fast-levenshtein@2.0.6:
971
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
972
+
973
+ fdir@6.5.0:
974
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
975
+ engines: {node: '>=12.0.0'}
976
+ peerDependencies:
977
+ picomatch: ^3 || ^4
978
+ peerDependenciesMeta:
979
+ picomatch:
980
+ optional: true
981
+
982
+ file-entry-cache@8.0.0:
983
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
984
+ engines: {node: '>=16.0.0'}
985
+
986
+ find-up@5.0.0:
987
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
988
+ engines: {node: '>=10'}
989
+
990
+ flat-cache@4.0.1:
991
+ resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
992
+ engines: {node: '>=16'}
993
+
994
+ flatted@3.3.3:
995
+ resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
996
+
997
+ fsevents@2.3.3:
998
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
999
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
1000
+ os: [darwin]
1001
+
1002
+ gensync@1.0.0-beta.2:
1003
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
1004
+ engines: {node: '>=6.9.0'}
1005
+
1006
+ glob-parent@6.0.2:
1007
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
1008
+ engines: {node: '>=10.13.0'}
1009
+
1010
+ globals@14.0.0:
1011
+ resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
1012
+ engines: {node: '>=18'}
1013
+
1014
+ globals@16.5.0:
1015
+ resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==}
1016
+ engines: {node: '>=18'}
1017
+
1018
+ graceful-fs@4.2.11:
1019
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
1020
+
1021
+ has-flag@4.0.0:
1022
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
1023
+ engines: {node: '>=8'}
1024
+
1025
+ hermes-estree@0.25.1:
1026
+ resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==}
1027
+
1028
+ hermes-parser@0.25.1:
1029
+ resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==}
1030
+
1031
+ ignore@5.3.2:
1032
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
1033
+ engines: {node: '>= 4'}
1034
+
1035
+ ignore@7.0.5:
1036
+ resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
1037
+ engines: {node: '>= 4'}
1038
+
1039
+ immer@10.2.0:
1040
+ resolution: {integrity: sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==}
1041
+
1042
+ immer@11.1.3:
1043
+ resolution: {integrity: sha512-6jQTc5z0KJFtr1UgFpIL3N9XSC3saRaI9PwWtzM2pSqkNGtiNkYY2OSwkOGDK2XcTRcLb1pi/aNkKZz0nxVH4Q==}
1044
+
1045
+ import-fresh@3.3.1:
1046
+ resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
1047
+ engines: {node: '>=6'}
1048
+
1049
+ imurmurhash@0.1.4:
1050
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
1051
+ engines: {node: '>=0.8.19'}
1052
+
1053
+ internmap@2.0.3:
1054
+ resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
1055
+ engines: {node: '>=12'}
1056
+
1057
+ is-extglob@2.1.1:
1058
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
1059
+ engines: {node: '>=0.10.0'}
1060
+
1061
+ is-glob@4.0.3:
1062
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
1063
+ engines: {node: '>=0.10.0'}
1064
+
1065
+ isexe@2.0.0:
1066
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
1067
+
1068
+ jiti@2.6.1:
1069
+ resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
1070
+ hasBin: true
1071
+
1072
+ js-tokens@4.0.0:
1073
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
1074
+
1075
+ js-yaml@4.1.1:
1076
+ resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
1077
+ hasBin: true
1078
+
1079
+ jsesc@3.1.0:
1080
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
1081
+ engines: {node: '>=6'}
1082
+ hasBin: true
1083
+
1084
+ json-buffer@3.0.1:
1085
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
1086
+
1087
+ json-schema-traverse@0.4.1:
1088
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
1089
+
1090
+ json-stable-stringify-without-jsonify@1.0.1:
1091
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
1092
+
1093
+ json5@2.2.3:
1094
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
1095
+ engines: {node: '>=6'}
1096
+ hasBin: true
1097
+
1098
+ keyv@4.5.4:
1099
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
1100
+
1101
+ levn@0.4.1:
1102
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
1103
+ engines: {node: '>= 0.8.0'}
1104
+
1105
+ lightningcss-android-arm64@1.30.2:
1106
+ resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==}
1107
+ engines: {node: '>= 12.0.0'}
1108
+ cpu: [arm64]
1109
+ os: [android]
1110
+
1111
+ lightningcss-darwin-arm64@1.30.2:
1112
+ resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==}
1113
+ engines: {node: '>= 12.0.0'}
1114
+ cpu: [arm64]
1115
+ os: [darwin]
1116
+
1117
+ lightningcss-darwin-x64@1.30.2:
1118
+ resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==}
1119
+ engines: {node: '>= 12.0.0'}
1120
+ cpu: [x64]
1121
+ os: [darwin]
1122
+
1123
+ lightningcss-freebsd-x64@1.30.2:
1124
+ resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==}
1125
+ engines: {node: '>= 12.0.0'}
1126
+ cpu: [x64]
1127
+ os: [freebsd]
1128
+
1129
+ lightningcss-linux-arm-gnueabihf@1.30.2:
1130
+ resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==}
1131
+ engines: {node: '>= 12.0.0'}
1132
+ cpu: [arm]
1133
+ os: [linux]
1134
+
1135
+ lightningcss-linux-arm64-gnu@1.30.2:
1136
+ resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==}
1137
+ engines: {node: '>= 12.0.0'}
1138
+ cpu: [arm64]
1139
+ os: [linux]
1140
+
1141
+ lightningcss-linux-arm64-musl@1.30.2:
1142
+ resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==}
1143
+ engines: {node: '>= 12.0.0'}
1144
+ cpu: [arm64]
1145
+ os: [linux]
1146
+
1147
+ lightningcss-linux-x64-gnu@1.30.2:
1148
+ resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==}
1149
+ engines: {node: '>= 12.0.0'}
1150
+ cpu: [x64]
1151
+ os: [linux]
1152
+
1153
+ lightningcss-linux-x64-musl@1.30.2:
1154
+ resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==}
1155
+ engines: {node: '>= 12.0.0'}
1156
+ cpu: [x64]
1157
+ os: [linux]
1158
+
1159
+ lightningcss-win32-arm64-msvc@1.30.2:
1160
+ resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==}
1161
+ engines: {node: '>= 12.0.0'}
1162
+ cpu: [arm64]
1163
+ os: [win32]
1164
+
1165
+ lightningcss-win32-x64-msvc@1.30.2:
1166
+ resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==}
1167
+ engines: {node: '>= 12.0.0'}
1168
+ cpu: [x64]
1169
+ os: [win32]
1170
+
1171
+ lightningcss@1.30.2:
1172
+ resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==}
1173
+ engines: {node: '>= 12.0.0'}
1174
+
1175
+ locate-path@6.0.0:
1176
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
1177
+ engines: {node: '>=10'}
1178
+
1179
+ lodash.merge@4.6.2:
1180
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
1181
+
1182
+ lru-cache@5.1.1:
1183
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
1184
+
1185
+ magic-string@0.30.21:
1186
+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
1187
+
1188
+ minimatch@3.1.2:
1189
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
1190
+
1191
+ minimatch@9.0.5:
1192
+ resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
1193
+ engines: {node: '>=16 || 14 >=14.17'}
1194
+
1195
+ ms@2.1.3:
1196
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
1197
+
1198
+ nanoid@3.3.11:
1199
+ resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
1200
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
1201
+ hasBin: true
1202
+
1203
+ natural-compare@1.4.0:
1204
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
1205
+
1206
+ node-releases@2.0.27:
1207
+ resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
1208
+
1209
+ optionator@0.9.4:
1210
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
1211
+ engines: {node: '>= 0.8.0'}
1212
+
1213
+ p-limit@3.1.0:
1214
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
1215
+ engines: {node: '>=10'}
1216
+
1217
+ p-locate@5.0.0:
1218
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
1219
+ engines: {node: '>=10'}
1220
+
1221
+ parent-module@1.0.1:
1222
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
1223
+ engines: {node: '>=6'}
1224
+
1225
+ path-exists@4.0.0:
1226
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
1227
+ engines: {node: '>=8'}
1228
+
1229
+ path-key@3.1.1:
1230
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
1231
+ engines: {node: '>=8'}
1232
+
1233
+ picocolors@1.1.1:
1234
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
1235
+
1236
+ picomatch@4.0.3:
1237
+ resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
1238
+ engines: {node: '>=12'}
1239
+
1240
+ postcss@8.5.6:
1241
+ resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
1242
+ engines: {node: ^10 || ^12 || >=14}
1243
+
1244
+ prelude-ls@1.2.1:
1245
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
1246
+ engines: {node: '>= 0.8.0'}
1247
+
1248
+ punycode@2.3.1:
1249
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
1250
+ engines: {node: '>=6'}
1251
+
1252
+ react-dom@19.2.3:
1253
+ resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==}
1254
+ peerDependencies:
1255
+ react: ^19.2.3
1256
+
1257
+ react-is@19.2.3:
1258
+ resolution: {integrity: sha512-qJNJfu81ByyabuG7hPFEbXqNcWSU3+eVus+KJs+0ncpGfMyYdvSmxiJxbWR65lYi1I+/0HBcliO029gc4F+PnA==}
1259
+
1260
+ react-redux@9.2.0:
1261
+ resolution: {integrity: sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==}
1262
+ peerDependencies:
1263
+ '@types/react': ^18.2.25 || ^19
1264
+ react: ^18.0 || ^19
1265
+ redux: ^5.0.0
1266
+ peerDependenciesMeta:
1267
+ '@types/react':
1268
+ optional: true
1269
+ redux:
1270
+ optional: true
1271
+
1272
+ react-refresh@0.18.0:
1273
+ resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==}
1274
+ engines: {node: '>=0.10.0'}
1275
+
1276
+ react@19.2.3:
1277
+ resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==}
1278
+ engines: {node: '>=0.10.0'}
1279
+
1280
+ recharts@3.6.0:
1281
+ resolution: {integrity: sha512-L5bjxvQRAe26RlToBAziKUB7whaGKEwD3znoM6fz3DrTowCIC/FnJYnuq1GEzB8Zv2kdTfaxQfi5GoH0tBinyg==}
1282
+ engines: {node: '>=18'}
1283
+ peerDependencies:
1284
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
1285
+ react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
1286
+ react-is: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
1287
+
1288
+ redux-thunk@3.1.0:
1289
+ resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==}
1290
+ peerDependencies:
1291
+ redux: ^5.0.0
1292
+
1293
+ redux@5.0.1:
1294
+ resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==}
1295
+
1296
+ reselect@5.1.1:
1297
+ resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==}
1298
+
1299
+ resolve-from@4.0.0:
1300
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
1301
+ engines: {node: '>=4'}
1302
+
1303
+ rollup@4.55.1:
1304
+ resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==}
1305
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
1306
+ hasBin: true
1307
+
1308
+ scheduler@0.27.0:
1309
+ resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
1310
+
1311
+ semver@6.3.1:
1312
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
1313
+ hasBin: true
1314
+
1315
+ semver@7.7.3:
1316
+ resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
1317
+ engines: {node: '>=10'}
1318
+ hasBin: true
1319
+
1320
+ shebang-command@2.0.0:
1321
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
1322
+ engines: {node: '>=8'}
1323
+
1324
+ shebang-regex@3.0.0:
1325
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
1326
+ engines: {node: '>=8'}
1327
+
1328
+ source-map-js@1.2.1:
1329
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
1330
+ engines: {node: '>=0.10.0'}
1331
+
1332
+ strip-json-comments@3.1.1:
1333
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
1334
+ engines: {node: '>=8'}
1335
+
1336
+ supports-color@7.2.0:
1337
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
1338
+ engines: {node: '>=8'}
1339
+
1340
+ tailwind-merge@3.4.0:
1341
+ resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==}
1342
+
1343
+ tailwindcss@4.1.18:
1344
+ resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==}
1345
+
1346
+ tapable@2.3.0:
1347
+ resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==}
1348
+ engines: {node: '>=6'}
1349
+
1350
+ tiny-invariant@1.3.3:
1351
+ resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
1352
+
1353
+ tinyglobby@0.2.15:
1354
+ resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
1355
+ engines: {node: '>=12.0.0'}
1356
+
1357
+ ts-api-utils@2.4.0:
1358
+ resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==}
1359
+ engines: {node: '>=18.12'}
1360
+ peerDependencies:
1361
+ typescript: '>=4.8.4'
1362
+
1363
+ tw-animate-css@1.4.0:
1364
+ resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==}
1365
+
1366
+ type-check@0.4.0:
1367
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
1368
+ engines: {node: '>= 0.8.0'}
1369
+
1370
+ typescript-eslint@8.52.0:
1371
+ resolution: {integrity: sha512-atlQQJ2YkO4pfTVQmQ+wvYQwexPDOIgo+RaVcD7gHgzy/IQA+XTyuxNM9M9TVXvttkF7koBHmcwisKdOAf2EcA==}
1372
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1373
+ peerDependencies:
1374
+ eslint: ^8.57.0 || ^9.0.0
1375
+ typescript: '>=4.8.4 <6.0.0'
1376
+
1377
+ typescript@5.9.3:
1378
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
1379
+ engines: {node: '>=14.17'}
1380
+ hasBin: true
1381
+
1382
+ undici-types@7.16.0:
1383
+ resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
1384
+
1385
+ update-browserslist-db@1.2.3:
1386
+ resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
1387
+ hasBin: true
1388
+ peerDependencies:
1389
+ browserslist: '>= 4.21.0'
1390
+
1391
+ uri-js@4.4.1:
1392
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
1393
+
1394
+ use-sync-external-store@1.6.0:
1395
+ resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
1396
+ peerDependencies:
1397
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
1398
+
1399
+ victory-vendor@37.3.6:
1400
+ resolution: {integrity: sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==}
1401
+
1402
+ vite@7.3.1:
1403
+ resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==}
1404
+ engines: {node: ^20.19.0 || >=22.12.0}
1405
+ hasBin: true
1406
+ peerDependencies:
1407
+ '@types/node': ^20.19.0 || >=22.12.0
1408
+ jiti: '>=1.21.0'
1409
+ less: ^4.0.0
1410
+ lightningcss: ^1.21.0
1411
+ sass: ^1.70.0
1412
+ sass-embedded: ^1.70.0
1413
+ stylus: '>=0.54.8'
1414
+ sugarss: ^5.0.0
1415
+ terser: ^5.16.0
1416
+ tsx: ^4.8.1
1417
+ yaml: ^2.4.2
1418
+ peerDependenciesMeta:
1419
+ '@types/node':
1420
+ optional: true
1421
+ jiti:
1422
+ optional: true
1423
+ less:
1424
+ optional: true
1425
+ lightningcss:
1426
+ optional: true
1427
+ sass:
1428
+ optional: true
1429
+ sass-embedded:
1430
+ optional: true
1431
+ stylus:
1432
+ optional: true
1433
+ sugarss:
1434
+ optional: true
1435
+ terser:
1436
+ optional: true
1437
+ tsx:
1438
+ optional: true
1439
+ yaml:
1440
+ optional: true
1441
+
1442
+ which@2.0.2:
1443
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
1444
+ engines: {node: '>= 8'}
1445
+ hasBin: true
1446
+
1447
+ word-wrap@1.2.5:
1448
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
1449
+ engines: {node: '>=0.10.0'}
1450
+
1451
+ yallist@3.1.1:
1452
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
1453
+
1454
+ yocto-queue@0.1.0:
1455
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
1456
+ engines: {node: '>=10'}
1457
+
1458
+ zod-validation-error@4.0.2:
1459
+ resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==}
1460
+ engines: {node: '>=18.0.0'}
1461
+ peerDependencies:
1462
+ zod: ^3.25.0 || ^4.0.0
1463
+
1464
+ zod@4.3.5:
1465
+ resolution: {integrity: sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==}
1466
+
1467
+ snapshots:
1468
+
1469
+ '@babel/code-frame@7.27.1':
1470
+ dependencies:
1471
+ '@babel/helper-validator-identifier': 7.28.5
1472
+ js-tokens: 4.0.0
1473
+ picocolors: 1.1.1
1474
+
1475
+ '@babel/compat-data@7.28.5': {}
1476
+
1477
+ '@babel/core@7.28.5':
1478
+ dependencies:
1479
+ '@babel/code-frame': 7.27.1
1480
+ '@babel/generator': 7.28.5
1481
+ '@babel/helper-compilation-targets': 7.27.2
1482
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5)
1483
+ '@babel/helpers': 7.28.4
1484
+ '@babel/parser': 7.28.5
1485
+ '@babel/template': 7.27.2
1486
+ '@babel/traverse': 7.28.5
1487
+ '@babel/types': 7.28.5
1488
+ '@jridgewell/remapping': 2.3.5
1489
+ convert-source-map: 2.0.0
1490
+ debug: 4.4.3
1491
+ gensync: 1.0.0-beta.2
1492
+ json5: 2.2.3
1493
+ semver: 6.3.1
1494
+ transitivePeerDependencies:
1495
+ - supports-color
1496
+
1497
+ '@babel/generator@7.28.5':
1498
+ dependencies:
1499
+ '@babel/parser': 7.28.5
1500
+ '@babel/types': 7.28.5
1501
+ '@jridgewell/gen-mapping': 0.3.13
1502
+ '@jridgewell/trace-mapping': 0.3.31
1503
+ jsesc: 3.1.0
1504
+
1505
+ '@babel/helper-compilation-targets@7.27.2':
1506
+ dependencies:
1507
+ '@babel/compat-data': 7.28.5
1508
+ '@babel/helper-validator-option': 7.27.1
1509
+ browserslist: 4.28.1
1510
+ lru-cache: 5.1.1
1511
+ semver: 6.3.1
1512
+
1513
+ '@babel/helper-globals@7.28.0': {}
1514
+
1515
+ '@babel/helper-module-imports@7.27.1':
1516
+ dependencies:
1517
+ '@babel/traverse': 7.28.5
1518
+ '@babel/types': 7.28.5
1519
+ transitivePeerDependencies:
1520
+ - supports-color
1521
+
1522
+ '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)':
1523
+ dependencies:
1524
+ '@babel/core': 7.28.5
1525
+ '@babel/helper-module-imports': 7.27.1
1526
+ '@babel/helper-validator-identifier': 7.28.5
1527
+ '@babel/traverse': 7.28.5
1528
+ transitivePeerDependencies:
1529
+ - supports-color
1530
+
1531
+ '@babel/helper-plugin-utils@7.27.1': {}
1532
+
1533
+ '@babel/helper-string-parser@7.27.1': {}
1534
+
1535
+ '@babel/helper-validator-identifier@7.28.5': {}
1536
+
1537
+ '@babel/helper-validator-option@7.27.1': {}
1538
+
1539
+ '@babel/helpers@7.28.4':
1540
+ dependencies:
1541
+ '@babel/template': 7.27.2
1542
+ '@babel/types': 7.28.5
1543
+
1544
+ '@babel/parser@7.28.5':
1545
+ dependencies:
1546
+ '@babel/types': 7.28.5
1547
+
1548
+ '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)':
1549
+ dependencies:
1550
+ '@babel/core': 7.28.5
1551
+ '@babel/helper-plugin-utils': 7.27.1
1552
+
1553
+ '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.5)':
1554
+ dependencies:
1555
+ '@babel/core': 7.28.5
1556
+ '@babel/helper-plugin-utils': 7.27.1
1557
+
1558
+ '@babel/template@7.27.2':
1559
+ dependencies:
1560
+ '@babel/code-frame': 7.27.1
1561
+ '@babel/parser': 7.28.5
1562
+ '@babel/types': 7.28.5
1563
+
1564
+ '@babel/traverse@7.28.5':
1565
+ dependencies:
1566
+ '@babel/code-frame': 7.27.1
1567
+ '@babel/generator': 7.28.5
1568
+ '@babel/helper-globals': 7.28.0
1569
+ '@babel/parser': 7.28.5
1570
+ '@babel/template': 7.27.2
1571
+ '@babel/types': 7.28.5
1572
+ debug: 4.4.3
1573
+ transitivePeerDependencies:
1574
+ - supports-color
1575
+
1576
+ '@babel/types@7.28.5':
1577
+ dependencies:
1578
+ '@babel/helper-string-parser': 7.27.1
1579
+ '@babel/helper-validator-identifier': 7.28.5
1580
+
1581
+ '@esbuild/aix-ppc64@0.27.2':
1582
+ optional: true
1583
+
1584
+ '@esbuild/android-arm64@0.27.2':
1585
+ optional: true
1586
+
1587
+ '@esbuild/android-arm@0.27.2':
1588
+ optional: true
1589
+
1590
+ '@esbuild/android-x64@0.27.2':
1591
+ optional: true
1592
+
1593
+ '@esbuild/darwin-arm64@0.27.2':
1594
+ optional: true
1595
+
1596
+ '@esbuild/darwin-x64@0.27.2':
1597
+ optional: true
1598
+
1599
+ '@esbuild/freebsd-arm64@0.27.2':
1600
+ optional: true
1601
+
1602
+ '@esbuild/freebsd-x64@0.27.2':
1603
+ optional: true
1604
+
1605
+ '@esbuild/linux-arm64@0.27.2':
1606
+ optional: true
1607
+
1608
+ '@esbuild/linux-arm@0.27.2':
1609
+ optional: true
1610
+
1611
+ '@esbuild/linux-ia32@0.27.2':
1612
+ optional: true
1613
+
1614
+ '@esbuild/linux-loong64@0.27.2':
1615
+ optional: true
1616
+
1617
+ '@esbuild/linux-mips64el@0.27.2':
1618
+ optional: true
1619
+
1620
+ '@esbuild/linux-ppc64@0.27.2':
1621
+ optional: true
1622
+
1623
+ '@esbuild/linux-riscv64@0.27.2':
1624
+ optional: true
1625
+
1626
+ '@esbuild/linux-s390x@0.27.2':
1627
+ optional: true
1628
+
1629
+ '@esbuild/linux-x64@0.27.2':
1630
+ optional: true
1631
+
1632
+ '@esbuild/netbsd-arm64@0.27.2':
1633
+ optional: true
1634
+
1635
+ '@esbuild/netbsd-x64@0.27.2':
1636
+ optional: true
1637
+
1638
+ '@esbuild/openbsd-arm64@0.27.2':
1639
+ optional: true
1640
+
1641
+ '@esbuild/openbsd-x64@0.27.2':
1642
+ optional: true
1643
+
1644
+ '@esbuild/openharmony-arm64@0.27.2':
1645
+ optional: true
1646
+
1647
+ '@esbuild/sunos-x64@0.27.2':
1648
+ optional: true
1649
+
1650
+ '@esbuild/win32-arm64@0.27.2':
1651
+ optional: true
1652
+
1653
+ '@esbuild/win32-ia32@0.27.2':
1654
+ optional: true
1655
+
1656
+ '@esbuild/win32-x64@0.27.2':
1657
+ optional: true
1658
+
1659
+ '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))':
1660
+ dependencies:
1661
+ eslint: 9.39.2(jiti@2.6.1)
1662
+ eslint-visitor-keys: 3.4.3
1663
+
1664
+ '@eslint-community/regexpp@4.12.2': {}
1665
+
1666
+ '@eslint/config-array@0.21.1':
1667
+ dependencies:
1668
+ '@eslint/object-schema': 2.1.7
1669
+ debug: 4.4.3
1670
+ minimatch: 3.1.2
1671
+ transitivePeerDependencies:
1672
+ - supports-color
1673
+
1674
+ '@eslint/config-helpers@0.4.2':
1675
+ dependencies:
1676
+ '@eslint/core': 0.17.0
1677
+
1678
+ '@eslint/core@0.17.0':
1679
+ dependencies:
1680
+ '@types/json-schema': 7.0.15
1681
+
1682
+ '@eslint/eslintrc@3.3.3':
1683
+ dependencies:
1684
+ ajv: 6.12.6
1685
+ debug: 4.4.3
1686
+ espree: 10.4.0
1687
+ globals: 14.0.0
1688
+ ignore: 5.3.2
1689
+ import-fresh: 3.3.1
1690
+ js-yaml: 4.1.1
1691
+ minimatch: 3.1.2
1692
+ strip-json-comments: 3.1.1
1693
+ transitivePeerDependencies:
1694
+ - supports-color
1695
+
1696
+ '@eslint/js@9.39.2': {}
1697
+
1698
+ '@eslint/object-schema@2.1.7': {}
1699
+
1700
+ '@eslint/plugin-kit@0.4.1':
1701
+ dependencies:
1702
+ '@eslint/core': 0.17.0
1703
+ levn: 0.4.1
1704
+
1705
+ '@humanfs/core@0.19.1': {}
1706
+
1707
+ '@humanfs/node@0.16.7':
1708
+ dependencies:
1709
+ '@humanfs/core': 0.19.1
1710
+ '@humanwhocodes/retry': 0.4.3
1711
+
1712
+ '@humanwhocodes/module-importer@1.0.1': {}
1713
+
1714
+ '@humanwhocodes/retry@0.4.3': {}
1715
+
1716
+ '@jridgewell/gen-mapping@0.3.13':
1717
+ dependencies:
1718
+ '@jridgewell/sourcemap-codec': 1.5.5
1719
+ '@jridgewell/trace-mapping': 0.3.31
1720
+
1721
+ '@jridgewell/remapping@2.3.5':
1722
+ dependencies:
1723
+ '@jridgewell/gen-mapping': 0.3.13
1724
+ '@jridgewell/trace-mapping': 0.3.31
1725
+
1726
+ '@jridgewell/resolve-uri@3.1.2': {}
1727
+
1728
+ '@jridgewell/sourcemap-codec@1.5.5': {}
1729
+
1730
+ '@jridgewell/trace-mapping@0.3.31':
1731
+ dependencies:
1732
+ '@jridgewell/resolve-uri': 3.1.2
1733
+ '@jridgewell/sourcemap-codec': 1.5.5
1734
+
1735
+ '@reduxjs/toolkit@2.11.2(react-redux@9.2.0(@types/react@19.2.7)(react@19.2.3)(redux@5.0.1))(react@19.2.3)':
1736
+ dependencies:
1737
+ '@standard-schema/spec': 1.1.0
1738
+ '@standard-schema/utils': 0.3.0
1739
+ immer: 11.1.3
1740
+ redux: 5.0.1
1741
+ redux-thunk: 3.1.0(redux@5.0.1)
1742
+ reselect: 5.1.1
1743
+ optionalDependencies:
1744
+ react: 19.2.3
1745
+ react-redux: 9.2.0(@types/react@19.2.7)(react@19.2.3)(redux@5.0.1)
1746
+
1747
+ '@rolldown/pluginutils@1.0.0-beta.53': {}
1748
+
1749
+ '@rollup/rollup-android-arm-eabi@4.55.1':
1750
+ optional: true
1751
+
1752
+ '@rollup/rollup-android-arm64@4.55.1':
1753
+ optional: true
1754
+
1755
+ '@rollup/rollup-darwin-arm64@4.55.1':
1756
+ optional: true
1757
+
1758
+ '@rollup/rollup-darwin-x64@4.55.1':
1759
+ optional: true
1760
+
1761
+ '@rollup/rollup-freebsd-arm64@4.55.1':
1762
+ optional: true
1763
+
1764
+ '@rollup/rollup-freebsd-x64@4.55.1':
1765
+ optional: true
1766
+
1767
+ '@rollup/rollup-linux-arm-gnueabihf@4.55.1':
1768
+ optional: true
1769
+
1770
+ '@rollup/rollup-linux-arm-musleabihf@4.55.1':
1771
+ optional: true
1772
+
1773
+ '@rollup/rollup-linux-arm64-gnu@4.55.1':
1774
+ optional: true
1775
+
1776
+ '@rollup/rollup-linux-arm64-musl@4.55.1':
1777
+ optional: true
1778
+
1779
+ '@rollup/rollup-linux-loong64-gnu@4.55.1':
1780
+ optional: true
1781
+
1782
+ '@rollup/rollup-linux-loong64-musl@4.55.1':
1783
+ optional: true
1784
+
1785
+ '@rollup/rollup-linux-ppc64-gnu@4.55.1':
1786
+ optional: true
1787
+
1788
+ '@rollup/rollup-linux-ppc64-musl@4.55.1':
1789
+ optional: true
1790
+
1791
+ '@rollup/rollup-linux-riscv64-gnu@4.55.1':
1792
+ optional: true
1793
+
1794
+ '@rollup/rollup-linux-riscv64-musl@4.55.1':
1795
+ optional: true
1796
+
1797
+ '@rollup/rollup-linux-s390x-gnu@4.55.1':
1798
+ optional: true
1799
+
1800
+ '@rollup/rollup-linux-x64-gnu@4.55.1':
1801
+ optional: true
1802
+
1803
+ '@rollup/rollup-linux-x64-musl@4.55.1':
1804
+ optional: true
1805
+
1806
+ '@rollup/rollup-openbsd-x64@4.55.1':
1807
+ optional: true
1808
+
1809
+ '@rollup/rollup-openharmony-arm64@4.55.1':
1810
+ optional: true
1811
+
1812
+ '@rollup/rollup-win32-arm64-msvc@4.55.1':
1813
+ optional: true
1814
+
1815
+ '@rollup/rollup-win32-ia32-msvc@4.55.1':
1816
+ optional: true
1817
+
1818
+ '@rollup/rollup-win32-x64-gnu@4.55.1':
1819
+ optional: true
1820
+
1821
+ '@rollup/rollup-win32-x64-msvc@4.55.1':
1822
+ optional: true
1823
+
1824
+ '@standard-schema/spec@1.1.0': {}
1825
+
1826
+ '@standard-schema/utils@0.3.0': {}
1827
+
1828
+ '@tailwindcss/node@4.1.18':
1829
+ dependencies:
1830
+ '@jridgewell/remapping': 2.3.5
1831
+ enhanced-resolve: 5.18.4
1832
+ jiti: 2.6.1
1833
+ lightningcss: 1.30.2
1834
+ magic-string: 0.30.21
1835
+ source-map-js: 1.2.1
1836
+ tailwindcss: 4.1.18
1837
+
1838
+ '@tailwindcss/oxide-android-arm64@4.1.18':
1839
+ optional: true
1840
+
1841
+ '@tailwindcss/oxide-darwin-arm64@4.1.18':
1842
+ optional: true
1843
+
1844
+ '@tailwindcss/oxide-darwin-x64@4.1.18':
1845
+ optional: true
1846
+
1847
+ '@tailwindcss/oxide-freebsd-x64@4.1.18':
1848
+ optional: true
1849
+
1850
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18':
1851
+ optional: true
1852
+
1853
+ '@tailwindcss/oxide-linux-arm64-gnu@4.1.18':
1854
+ optional: true
1855
+
1856
+ '@tailwindcss/oxide-linux-arm64-musl@4.1.18':
1857
+ optional: true
1858
+
1859
+ '@tailwindcss/oxide-linux-x64-gnu@4.1.18':
1860
+ optional: true
1861
+
1862
+ '@tailwindcss/oxide-linux-x64-musl@4.1.18':
1863
+ optional: true
1864
+
1865
+ '@tailwindcss/oxide-wasm32-wasi@4.1.18':
1866
+ optional: true
1867
+
1868
+ '@tailwindcss/oxide-win32-arm64-msvc@4.1.18':
1869
+ optional: true
1870
+
1871
+ '@tailwindcss/oxide-win32-x64-msvc@4.1.18':
1872
+ optional: true
1873
+
1874
+ '@tailwindcss/oxide@4.1.18':
1875
+ optionalDependencies:
1876
+ '@tailwindcss/oxide-android-arm64': 4.1.18
1877
+ '@tailwindcss/oxide-darwin-arm64': 4.1.18
1878
+ '@tailwindcss/oxide-darwin-x64': 4.1.18
1879
+ '@tailwindcss/oxide-freebsd-x64': 4.1.18
1880
+ '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18
1881
+ '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18
1882
+ '@tailwindcss/oxide-linux-arm64-musl': 4.1.18
1883
+ '@tailwindcss/oxide-linux-x64-gnu': 4.1.18
1884
+ '@tailwindcss/oxide-linux-x64-musl': 4.1.18
1885
+ '@tailwindcss/oxide-wasm32-wasi': 4.1.18
1886
+ '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18
1887
+ '@tailwindcss/oxide-win32-x64-msvc': 4.1.18
1888
+
1889
+ '@tailwindcss/vite@4.1.18(vite@7.3.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2))':
1890
+ dependencies:
1891
+ '@tailwindcss/node': 4.1.18
1892
+ '@tailwindcss/oxide': 4.1.18
1893
+ tailwindcss: 4.1.18
1894
+ vite: 7.3.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)
1895
+
1896
+ '@types/babel__core@7.20.5':
1897
+ dependencies:
1898
+ '@babel/parser': 7.28.5
1899
+ '@babel/types': 7.28.5
1900
+ '@types/babel__generator': 7.27.0
1901
+ '@types/babel__template': 7.4.4
1902
+ '@types/babel__traverse': 7.28.0
1903
+
1904
+ '@types/babel__generator@7.27.0':
1905
+ dependencies:
1906
+ '@babel/types': 7.28.5
1907
+
1908
+ '@types/babel__template@7.4.4':
1909
+ dependencies:
1910
+ '@babel/parser': 7.28.5
1911
+ '@babel/types': 7.28.5
1912
+
1913
+ '@types/babel__traverse@7.28.0':
1914
+ dependencies:
1915
+ '@babel/types': 7.28.5
1916
+
1917
+ '@types/d3-array@3.2.2': {}
1918
+
1919
+ '@types/d3-color@3.1.3': {}
1920
+
1921
+ '@types/d3-ease@3.0.2': {}
1922
+
1923
+ '@types/d3-interpolate@3.0.4':
1924
+ dependencies:
1925
+ '@types/d3-color': 3.1.3
1926
+
1927
+ '@types/d3-path@3.1.1': {}
1928
+
1929
+ '@types/d3-scale@4.0.9':
1930
+ dependencies:
1931
+ '@types/d3-time': 3.0.4
1932
+
1933
+ '@types/d3-shape@3.1.7':
1934
+ dependencies:
1935
+ '@types/d3-path': 3.1.1
1936
+
1937
+ '@types/d3-time@3.0.4': {}
1938
+
1939
+ '@types/d3-timer@3.0.2': {}
1940
+
1941
+ '@types/estree@1.0.8': {}
1942
+
1943
+ '@types/json-schema@7.0.15': {}
1944
+
1945
+ '@types/node@24.10.4':
1946
+ dependencies:
1947
+ undici-types: 7.16.0
1948
+
1949
+ '@types/react-dom@19.2.3(@types/react@19.2.7)':
1950
+ dependencies:
1951
+ '@types/react': 19.2.7
1952
+
1953
+ '@types/react@19.2.7':
1954
+ dependencies:
1955
+ csstype: 3.2.3
1956
+
1957
+ '@types/use-sync-external-store@0.0.6': {}
1958
+
1959
+ '@typescript-eslint/eslint-plugin@8.52.0(@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
1960
+ dependencies:
1961
+ '@eslint-community/regexpp': 4.12.2
1962
+ '@typescript-eslint/parser': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
1963
+ '@typescript-eslint/scope-manager': 8.52.0
1964
+ '@typescript-eslint/type-utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
1965
+ '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
1966
+ '@typescript-eslint/visitor-keys': 8.52.0
1967
+ eslint: 9.39.2(jiti@2.6.1)
1968
+ ignore: 7.0.5
1969
+ natural-compare: 1.4.0
1970
+ ts-api-utils: 2.4.0(typescript@5.9.3)
1971
+ typescript: 5.9.3
1972
+ transitivePeerDependencies:
1973
+ - supports-color
1974
+
1975
+ '@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
1976
+ dependencies:
1977
+ '@typescript-eslint/scope-manager': 8.52.0
1978
+ '@typescript-eslint/types': 8.52.0
1979
+ '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3)
1980
+ '@typescript-eslint/visitor-keys': 8.52.0
1981
+ debug: 4.4.3
1982
+ eslint: 9.39.2(jiti@2.6.1)
1983
+ typescript: 5.9.3
1984
+ transitivePeerDependencies:
1985
+ - supports-color
1986
+
1987
+ '@typescript-eslint/project-service@8.52.0(typescript@5.9.3)':
1988
+ dependencies:
1989
+ '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3)
1990
+ '@typescript-eslint/types': 8.52.0
1991
+ debug: 4.4.3
1992
+ typescript: 5.9.3
1993
+ transitivePeerDependencies:
1994
+ - supports-color
1995
+
1996
+ '@typescript-eslint/scope-manager@8.52.0':
1997
+ dependencies:
1998
+ '@typescript-eslint/types': 8.52.0
1999
+ '@typescript-eslint/visitor-keys': 8.52.0
2000
+
2001
+ '@typescript-eslint/tsconfig-utils@8.52.0(typescript@5.9.3)':
2002
+ dependencies:
2003
+ typescript: 5.9.3
2004
+
2005
+ '@typescript-eslint/type-utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
2006
+ dependencies:
2007
+ '@typescript-eslint/types': 8.52.0
2008
+ '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3)
2009
+ '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
2010
+ debug: 4.4.3
2011
+ eslint: 9.39.2(jiti@2.6.1)
2012
+ ts-api-utils: 2.4.0(typescript@5.9.3)
2013
+ typescript: 5.9.3
2014
+ transitivePeerDependencies:
2015
+ - supports-color
2016
+
2017
+ '@typescript-eslint/types@8.52.0': {}
2018
+
2019
+ '@typescript-eslint/typescript-estree@8.52.0(typescript@5.9.3)':
2020
+ dependencies:
2021
+ '@typescript-eslint/project-service': 8.52.0(typescript@5.9.3)
2022
+ '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3)
2023
+ '@typescript-eslint/types': 8.52.0
2024
+ '@typescript-eslint/visitor-keys': 8.52.0
2025
+ debug: 4.4.3
2026
+ minimatch: 9.0.5
2027
+ semver: 7.7.3
2028
+ tinyglobby: 0.2.15
2029
+ ts-api-utils: 2.4.0(typescript@5.9.3)
2030
+ typescript: 5.9.3
2031
+ transitivePeerDependencies:
2032
+ - supports-color
2033
+
2034
+ '@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
2035
+ dependencies:
2036
+ '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1))
2037
+ '@typescript-eslint/scope-manager': 8.52.0
2038
+ '@typescript-eslint/types': 8.52.0
2039
+ '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3)
2040
+ eslint: 9.39.2(jiti@2.6.1)
2041
+ typescript: 5.9.3
2042
+ transitivePeerDependencies:
2043
+ - supports-color
2044
+
2045
+ '@typescript-eslint/visitor-keys@8.52.0':
2046
+ dependencies:
2047
+ '@typescript-eslint/types': 8.52.0
2048
+ eslint-visitor-keys: 4.2.1
2049
+
2050
+ '@vitejs/plugin-react@5.1.2(vite@7.3.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2))':
2051
+ dependencies:
2052
+ '@babel/core': 7.28.5
2053
+ '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5)
2054
+ '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5)
2055
+ '@rolldown/pluginutils': 1.0.0-beta.53
2056
+ '@types/babel__core': 7.20.5
2057
+ react-refresh: 0.18.0
2058
+ vite: 7.3.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)
2059
+ transitivePeerDependencies:
2060
+ - supports-color
2061
+
2062
+ acorn-jsx@5.3.2(acorn@8.15.0):
2063
+ dependencies:
2064
+ acorn: 8.15.0
2065
+
2066
+ acorn@8.15.0: {}
2067
+
2068
+ ajv@6.12.6:
2069
+ dependencies:
2070
+ fast-deep-equal: 3.1.3
2071
+ fast-json-stable-stringify: 2.1.0
2072
+ json-schema-traverse: 0.4.1
2073
+ uri-js: 4.4.1
2074
+
2075
+ ansi-styles@4.3.0:
2076
+ dependencies:
2077
+ color-convert: 2.0.1
2078
+
2079
+ argparse@2.0.1: {}
2080
+
2081
+ balanced-match@1.0.2: {}
2082
+
2083
+ baseline-browser-mapping@2.9.13: {}
2084
+
2085
+ brace-expansion@1.1.12:
2086
+ dependencies:
2087
+ balanced-match: 1.0.2
2088
+ concat-map: 0.0.1
2089
+
2090
+ brace-expansion@2.0.2:
2091
+ dependencies:
2092
+ balanced-match: 1.0.2
2093
+
2094
+ browserslist@4.28.1:
2095
+ dependencies:
2096
+ baseline-browser-mapping: 2.9.13
2097
+ caniuse-lite: 1.0.30001763
2098
+ electron-to-chromium: 1.5.267
2099
+ node-releases: 2.0.27
2100
+ update-browserslist-db: 1.2.3(browserslist@4.28.1)
2101
+
2102
+ callsites@3.1.0: {}
2103
+
2104
+ caniuse-lite@1.0.30001763: {}
2105
+
2106
+ chalk@4.1.2:
2107
+ dependencies:
2108
+ ansi-styles: 4.3.0
2109
+ supports-color: 7.2.0
2110
+
2111
+ class-variance-authority@0.7.1:
2112
+ dependencies:
2113
+ clsx: 2.1.1
2114
+
2115
+ clsx@2.1.1: {}
2116
+
2117
+ color-convert@2.0.1:
2118
+ dependencies:
2119
+ color-name: 1.1.4
2120
+
2121
+ color-name@1.1.4: {}
2122
+
2123
+ concat-map@0.0.1: {}
2124
+
2125
+ convert-source-map@2.0.0: {}
2126
+
2127
+ cross-spawn@7.0.6:
2128
+ dependencies:
2129
+ path-key: 3.1.1
2130
+ shebang-command: 2.0.0
2131
+ which: 2.0.2
2132
+
2133
+ csstype@3.2.3: {}
2134
+
2135
+ d3-array@3.2.4:
2136
+ dependencies:
2137
+ internmap: 2.0.3
2138
+
2139
+ d3-color@3.1.0: {}
2140
+
2141
+ d3-ease@3.0.1: {}
2142
+
2143
+ d3-format@3.1.0: {}
2144
+
2145
+ d3-interpolate@3.0.1:
2146
+ dependencies:
2147
+ d3-color: 3.1.0
2148
+
2149
+ d3-path@3.1.0: {}
2150
+
2151
+ d3-scale@4.0.2:
2152
+ dependencies:
2153
+ d3-array: 3.2.4
2154
+ d3-format: 3.1.0
2155
+ d3-interpolate: 3.0.1
2156
+ d3-time: 3.1.0
2157
+ d3-time-format: 4.1.0
2158
+
2159
+ d3-shape@3.2.0:
2160
+ dependencies:
2161
+ d3-path: 3.1.0
2162
+
2163
+ d3-time-format@4.1.0:
2164
+ dependencies:
2165
+ d3-time: 3.1.0
2166
+
2167
+ d3-time@3.1.0:
2168
+ dependencies:
2169
+ d3-array: 3.2.4
2170
+
2171
+ d3-timer@3.0.1: {}
2172
+
2173
+ debug@4.4.3:
2174
+ dependencies:
2175
+ ms: 2.1.3
2176
+
2177
+ decimal.js-light@2.5.1: {}
2178
+
2179
+ deep-is@0.1.4: {}
2180
+
2181
+ detect-libc@2.1.2: {}
2182
+
2183
+ electron-to-chromium@1.5.267: {}
2184
+
2185
+ enhanced-resolve@5.18.4:
2186
+ dependencies:
2187
+ graceful-fs: 4.2.11
2188
+ tapable: 2.3.0
2189
+
2190
+ es-toolkit@1.43.0: {}
2191
+
2192
+ esbuild@0.27.2:
2193
+ optionalDependencies:
2194
+ '@esbuild/aix-ppc64': 0.27.2
2195
+ '@esbuild/android-arm': 0.27.2
2196
+ '@esbuild/android-arm64': 0.27.2
2197
+ '@esbuild/android-x64': 0.27.2
2198
+ '@esbuild/darwin-arm64': 0.27.2
2199
+ '@esbuild/darwin-x64': 0.27.2
2200
+ '@esbuild/freebsd-arm64': 0.27.2
2201
+ '@esbuild/freebsd-x64': 0.27.2
2202
+ '@esbuild/linux-arm': 0.27.2
2203
+ '@esbuild/linux-arm64': 0.27.2
2204
+ '@esbuild/linux-ia32': 0.27.2
2205
+ '@esbuild/linux-loong64': 0.27.2
2206
+ '@esbuild/linux-mips64el': 0.27.2
2207
+ '@esbuild/linux-ppc64': 0.27.2
2208
+ '@esbuild/linux-riscv64': 0.27.2
2209
+ '@esbuild/linux-s390x': 0.27.2
2210
+ '@esbuild/linux-x64': 0.27.2
2211
+ '@esbuild/netbsd-arm64': 0.27.2
2212
+ '@esbuild/netbsd-x64': 0.27.2
2213
+ '@esbuild/openbsd-arm64': 0.27.2
2214
+ '@esbuild/openbsd-x64': 0.27.2
2215
+ '@esbuild/openharmony-arm64': 0.27.2
2216
+ '@esbuild/sunos-x64': 0.27.2
2217
+ '@esbuild/win32-arm64': 0.27.2
2218
+ '@esbuild/win32-ia32': 0.27.2
2219
+ '@esbuild/win32-x64': 0.27.2
2220
+
2221
+ escalade@3.2.0: {}
2222
+
2223
+ escape-string-regexp@4.0.0: {}
2224
+
2225
+ eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@2.6.1)):
2226
+ dependencies:
2227
+ '@babel/core': 7.28.5
2228
+ '@babel/parser': 7.28.5
2229
+ eslint: 9.39.2(jiti@2.6.1)
2230
+ hermes-parser: 0.25.1
2231
+ zod: 4.3.5
2232
+ zod-validation-error: 4.0.2(zod@4.3.5)
2233
+ transitivePeerDependencies:
2234
+ - supports-color
2235
+
2236
+ eslint-plugin-react-refresh@0.4.26(eslint@9.39.2(jiti@2.6.1)):
2237
+ dependencies:
2238
+ eslint: 9.39.2(jiti@2.6.1)
2239
+
2240
+ eslint-scope@8.4.0:
2241
+ dependencies:
2242
+ esrecurse: 4.3.0
2243
+ estraverse: 5.3.0
2244
+
2245
+ eslint-visitor-keys@3.4.3: {}
2246
+
2247
+ eslint-visitor-keys@4.2.1: {}
2248
+
2249
+ eslint@9.39.2(jiti@2.6.1):
2250
+ dependencies:
2251
+ '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1))
2252
+ '@eslint-community/regexpp': 4.12.2
2253
+ '@eslint/config-array': 0.21.1
2254
+ '@eslint/config-helpers': 0.4.2
2255
+ '@eslint/core': 0.17.0
2256
+ '@eslint/eslintrc': 3.3.3
2257
+ '@eslint/js': 9.39.2
2258
+ '@eslint/plugin-kit': 0.4.1
2259
+ '@humanfs/node': 0.16.7
2260
+ '@humanwhocodes/module-importer': 1.0.1
2261
+ '@humanwhocodes/retry': 0.4.3
2262
+ '@types/estree': 1.0.8
2263
+ ajv: 6.12.6
2264
+ chalk: 4.1.2
2265
+ cross-spawn: 7.0.6
2266
+ debug: 4.4.3
2267
+ escape-string-regexp: 4.0.0
2268
+ eslint-scope: 8.4.0
2269
+ eslint-visitor-keys: 4.2.1
2270
+ espree: 10.4.0
2271
+ esquery: 1.7.0
2272
+ esutils: 2.0.3
2273
+ fast-deep-equal: 3.1.3
2274
+ file-entry-cache: 8.0.0
2275
+ find-up: 5.0.0
2276
+ glob-parent: 6.0.2
2277
+ ignore: 5.3.2
2278
+ imurmurhash: 0.1.4
2279
+ is-glob: 4.0.3
2280
+ json-stable-stringify-without-jsonify: 1.0.1
2281
+ lodash.merge: 4.6.2
2282
+ minimatch: 3.1.2
2283
+ natural-compare: 1.4.0
2284
+ optionator: 0.9.4
2285
+ optionalDependencies:
2286
+ jiti: 2.6.1
2287
+ transitivePeerDependencies:
2288
+ - supports-color
2289
+
2290
+ espree@10.4.0:
2291
+ dependencies:
2292
+ acorn: 8.15.0
2293
+ acorn-jsx: 5.3.2(acorn@8.15.0)
2294
+ eslint-visitor-keys: 4.2.1
2295
+
2296
+ esquery@1.7.0:
2297
+ dependencies:
2298
+ estraverse: 5.3.0
2299
+
2300
+ esrecurse@4.3.0:
2301
+ dependencies:
2302
+ estraverse: 5.3.0
2303
+
2304
+ estraverse@5.3.0: {}
2305
+
2306
+ esutils@2.0.3: {}
2307
+
2308
+ eventemitter3@5.0.1: {}
2309
+
2310
+ fast-deep-equal@3.1.3: {}
2311
+
2312
+ fast-json-stable-stringify@2.1.0: {}
2313
+
2314
+ fast-levenshtein@2.0.6: {}
2315
+
2316
+ fdir@6.5.0(picomatch@4.0.3):
2317
+ optionalDependencies:
2318
+ picomatch: 4.0.3
2319
+
2320
+ file-entry-cache@8.0.0:
2321
+ dependencies:
2322
+ flat-cache: 4.0.1
2323
+
2324
+ find-up@5.0.0:
2325
+ dependencies:
2326
+ locate-path: 6.0.0
2327
+ path-exists: 4.0.0
2328
+
2329
+ flat-cache@4.0.1:
2330
+ dependencies:
2331
+ flatted: 3.3.3
2332
+ keyv: 4.5.4
2333
+
2334
+ flatted@3.3.3: {}
2335
+
2336
+ fsevents@2.3.3:
2337
+ optional: true
2338
+
2339
+ gensync@1.0.0-beta.2: {}
2340
+
2341
+ glob-parent@6.0.2:
2342
+ dependencies:
2343
+ is-glob: 4.0.3
2344
+
2345
+ globals@14.0.0: {}
2346
+
2347
+ globals@16.5.0: {}
2348
+
2349
+ graceful-fs@4.2.11: {}
2350
+
2351
+ has-flag@4.0.0: {}
2352
+
2353
+ hermes-estree@0.25.1: {}
2354
+
2355
+ hermes-parser@0.25.1:
2356
+ dependencies:
2357
+ hermes-estree: 0.25.1
2358
+
2359
+ ignore@5.3.2: {}
2360
+
2361
+ ignore@7.0.5: {}
2362
+
2363
+ immer@10.2.0: {}
2364
+
2365
+ immer@11.1.3: {}
2366
+
2367
+ import-fresh@3.3.1:
2368
+ dependencies:
2369
+ parent-module: 1.0.1
2370
+ resolve-from: 4.0.0
2371
+
2372
+ imurmurhash@0.1.4: {}
2373
+
2374
+ internmap@2.0.3: {}
2375
+
2376
+ is-extglob@2.1.1: {}
2377
+
2378
+ is-glob@4.0.3:
2379
+ dependencies:
2380
+ is-extglob: 2.1.1
2381
+
2382
+ isexe@2.0.0: {}
2383
+
2384
+ jiti@2.6.1: {}
2385
+
2386
+ js-tokens@4.0.0: {}
2387
+
2388
+ js-yaml@4.1.1:
2389
+ dependencies:
2390
+ argparse: 2.0.1
2391
+
2392
+ jsesc@3.1.0: {}
2393
+
2394
+ json-buffer@3.0.1: {}
2395
+
2396
+ json-schema-traverse@0.4.1: {}
2397
+
2398
+ json-stable-stringify-without-jsonify@1.0.1: {}
2399
+
2400
+ json5@2.2.3: {}
2401
+
2402
+ keyv@4.5.4:
2403
+ dependencies:
2404
+ json-buffer: 3.0.1
2405
+
2406
+ levn@0.4.1:
2407
+ dependencies:
2408
+ prelude-ls: 1.2.1
2409
+ type-check: 0.4.0
2410
+
2411
+ lightningcss-android-arm64@1.30.2:
2412
+ optional: true
2413
+
2414
+ lightningcss-darwin-arm64@1.30.2:
2415
+ optional: true
2416
+
2417
+ lightningcss-darwin-x64@1.30.2:
2418
+ optional: true
2419
+
2420
+ lightningcss-freebsd-x64@1.30.2:
2421
+ optional: true
2422
+
2423
+ lightningcss-linux-arm-gnueabihf@1.30.2:
2424
+ optional: true
2425
+
2426
+ lightningcss-linux-arm64-gnu@1.30.2:
2427
+ optional: true
2428
+
2429
+ lightningcss-linux-arm64-musl@1.30.2:
2430
+ optional: true
2431
+
2432
+ lightningcss-linux-x64-gnu@1.30.2:
2433
+ optional: true
2434
+
2435
+ lightningcss-linux-x64-musl@1.30.2:
2436
+ optional: true
2437
+
2438
+ lightningcss-win32-arm64-msvc@1.30.2:
2439
+ optional: true
2440
+
2441
+ lightningcss-win32-x64-msvc@1.30.2:
2442
+ optional: true
2443
+
2444
+ lightningcss@1.30.2:
2445
+ dependencies:
2446
+ detect-libc: 2.1.2
2447
+ optionalDependencies:
2448
+ lightningcss-android-arm64: 1.30.2
2449
+ lightningcss-darwin-arm64: 1.30.2
2450
+ lightningcss-darwin-x64: 1.30.2
2451
+ lightningcss-freebsd-x64: 1.30.2
2452
+ lightningcss-linux-arm-gnueabihf: 1.30.2
2453
+ lightningcss-linux-arm64-gnu: 1.30.2
2454
+ lightningcss-linux-arm64-musl: 1.30.2
2455
+ lightningcss-linux-x64-gnu: 1.30.2
2456
+ lightningcss-linux-x64-musl: 1.30.2
2457
+ lightningcss-win32-arm64-msvc: 1.30.2
2458
+ lightningcss-win32-x64-msvc: 1.30.2
2459
+
2460
+ locate-path@6.0.0:
2461
+ dependencies:
2462
+ p-locate: 5.0.0
2463
+
2464
+ lodash.merge@4.6.2: {}
2465
+
2466
+ lru-cache@5.1.1:
2467
+ dependencies:
2468
+ yallist: 3.1.1
2469
+
2470
+ magic-string@0.30.21:
2471
+ dependencies:
2472
+ '@jridgewell/sourcemap-codec': 1.5.5
2473
+
2474
+ minimatch@3.1.2:
2475
+ dependencies:
2476
+ brace-expansion: 1.1.12
2477
+
2478
+ minimatch@9.0.5:
2479
+ dependencies:
2480
+ brace-expansion: 2.0.2
2481
+
2482
+ ms@2.1.3: {}
2483
+
2484
+ nanoid@3.3.11: {}
2485
+
2486
+ natural-compare@1.4.0: {}
2487
+
2488
+ node-releases@2.0.27: {}
2489
+
2490
+ optionator@0.9.4:
2491
+ dependencies:
2492
+ deep-is: 0.1.4
2493
+ fast-levenshtein: 2.0.6
2494
+ levn: 0.4.1
2495
+ prelude-ls: 1.2.1
2496
+ type-check: 0.4.0
2497
+ word-wrap: 1.2.5
2498
+
2499
+ p-limit@3.1.0:
2500
+ dependencies:
2501
+ yocto-queue: 0.1.0
2502
+
2503
+ p-locate@5.0.0:
2504
+ dependencies:
2505
+ p-limit: 3.1.0
2506
+
2507
+ parent-module@1.0.1:
2508
+ dependencies:
2509
+ callsites: 3.1.0
2510
+
2511
+ path-exists@4.0.0: {}
2512
+
2513
+ path-key@3.1.1: {}
2514
+
2515
+ picocolors@1.1.1: {}
2516
+
2517
+ picomatch@4.0.3: {}
2518
+
2519
+ postcss@8.5.6:
2520
+ dependencies:
2521
+ nanoid: 3.3.11
2522
+ picocolors: 1.1.1
2523
+ source-map-js: 1.2.1
2524
+
2525
+ prelude-ls@1.2.1: {}
2526
+
2527
+ punycode@2.3.1: {}
2528
+
2529
+ react-dom@19.2.3(react@19.2.3):
2530
+ dependencies:
2531
+ react: 19.2.3
2532
+ scheduler: 0.27.0
2533
+
2534
+ react-is@19.2.3: {}
2535
+
2536
+ react-redux@9.2.0(@types/react@19.2.7)(react@19.2.3)(redux@5.0.1):
2537
+ dependencies:
2538
+ '@types/use-sync-external-store': 0.0.6
2539
+ react: 19.2.3
2540
+ use-sync-external-store: 1.6.0(react@19.2.3)
2541
+ optionalDependencies:
2542
+ '@types/react': 19.2.7
2543
+ redux: 5.0.1
2544
+
2545
+ react-refresh@0.18.0: {}
2546
+
2547
+ react@19.2.3: {}
2548
+
2549
+ recharts@3.6.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react-is@19.2.3)(react@19.2.3)(redux@5.0.1):
2550
+ dependencies:
2551
+ '@reduxjs/toolkit': 2.11.2(react-redux@9.2.0(@types/react@19.2.7)(react@19.2.3)(redux@5.0.1))(react@19.2.3)
2552
+ clsx: 2.1.1
2553
+ decimal.js-light: 2.5.1
2554
+ es-toolkit: 1.43.0
2555
+ eventemitter3: 5.0.1
2556
+ immer: 10.2.0
2557
+ react: 19.2.3
2558
+ react-dom: 19.2.3(react@19.2.3)
2559
+ react-is: 19.2.3
2560
+ react-redux: 9.2.0(@types/react@19.2.7)(react@19.2.3)(redux@5.0.1)
2561
+ reselect: 5.1.1
2562
+ tiny-invariant: 1.3.3
2563
+ use-sync-external-store: 1.6.0(react@19.2.3)
2564
+ victory-vendor: 37.3.6
2565
+ transitivePeerDependencies:
2566
+ - '@types/react'
2567
+ - redux
2568
+
2569
+ redux-thunk@3.1.0(redux@5.0.1):
2570
+ dependencies:
2571
+ redux: 5.0.1
2572
+
2573
+ redux@5.0.1: {}
2574
+
2575
+ reselect@5.1.1: {}
2576
+
2577
+ resolve-from@4.0.0: {}
2578
+
2579
+ rollup@4.55.1:
2580
+ dependencies:
2581
+ '@types/estree': 1.0.8
2582
+ optionalDependencies:
2583
+ '@rollup/rollup-android-arm-eabi': 4.55.1
2584
+ '@rollup/rollup-android-arm64': 4.55.1
2585
+ '@rollup/rollup-darwin-arm64': 4.55.1
2586
+ '@rollup/rollup-darwin-x64': 4.55.1
2587
+ '@rollup/rollup-freebsd-arm64': 4.55.1
2588
+ '@rollup/rollup-freebsd-x64': 4.55.1
2589
+ '@rollup/rollup-linux-arm-gnueabihf': 4.55.1
2590
+ '@rollup/rollup-linux-arm-musleabihf': 4.55.1
2591
+ '@rollup/rollup-linux-arm64-gnu': 4.55.1
2592
+ '@rollup/rollup-linux-arm64-musl': 4.55.1
2593
+ '@rollup/rollup-linux-loong64-gnu': 4.55.1
2594
+ '@rollup/rollup-linux-loong64-musl': 4.55.1
2595
+ '@rollup/rollup-linux-ppc64-gnu': 4.55.1
2596
+ '@rollup/rollup-linux-ppc64-musl': 4.55.1
2597
+ '@rollup/rollup-linux-riscv64-gnu': 4.55.1
2598
+ '@rollup/rollup-linux-riscv64-musl': 4.55.1
2599
+ '@rollup/rollup-linux-s390x-gnu': 4.55.1
2600
+ '@rollup/rollup-linux-x64-gnu': 4.55.1
2601
+ '@rollup/rollup-linux-x64-musl': 4.55.1
2602
+ '@rollup/rollup-openbsd-x64': 4.55.1
2603
+ '@rollup/rollup-openharmony-arm64': 4.55.1
2604
+ '@rollup/rollup-win32-arm64-msvc': 4.55.1
2605
+ '@rollup/rollup-win32-ia32-msvc': 4.55.1
2606
+ '@rollup/rollup-win32-x64-gnu': 4.55.1
2607
+ '@rollup/rollup-win32-x64-msvc': 4.55.1
2608
+ fsevents: 2.3.3
2609
+
2610
+ scheduler@0.27.0: {}
2611
+
2612
+ semver@6.3.1: {}
2613
+
2614
+ semver@7.7.3: {}
2615
+
2616
+ shebang-command@2.0.0:
2617
+ dependencies:
2618
+ shebang-regex: 3.0.0
2619
+
2620
+ shebang-regex@3.0.0: {}
2621
+
2622
+ source-map-js@1.2.1: {}
2623
+
2624
+ strip-json-comments@3.1.1: {}
2625
+
2626
+ supports-color@7.2.0:
2627
+ dependencies:
2628
+ has-flag: 4.0.0
2629
+
2630
+ tailwind-merge@3.4.0: {}
2631
+
2632
+ tailwindcss@4.1.18: {}
2633
+
2634
+ tapable@2.3.0: {}
2635
+
2636
+ tiny-invariant@1.3.3: {}
2637
+
2638
+ tinyglobby@0.2.15:
2639
+ dependencies:
2640
+ fdir: 6.5.0(picomatch@4.0.3)
2641
+ picomatch: 4.0.3
2642
+
2643
+ ts-api-utils@2.4.0(typescript@5.9.3):
2644
+ dependencies:
2645
+ typescript: 5.9.3
2646
+
2647
+ tw-animate-css@1.4.0: {}
2648
+
2649
+ type-check@0.4.0:
2650
+ dependencies:
2651
+ prelude-ls: 1.2.1
2652
+
2653
+ typescript-eslint@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3):
2654
+ dependencies:
2655
+ '@typescript-eslint/eslint-plugin': 8.52.0(@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
2656
+ '@typescript-eslint/parser': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
2657
+ '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3)
2658
+ '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
2659
+ eslint: 9.39.2(jiti@2.6.1)
2660
+ typescript: 5.9.3
2661
+ transitivePeerDependencies:
2662
+ - supports-color
2663
+
2664
+ typescript@5.9.3: {}
2665
+
2666
+ undici-types@7.16.0: {}
2667
+
2668
+ update-browserslist-db@1.2.3(browserslist@4.28.1):
2669
+ dependencies:
2670
+ browserslist: 4.28.1
2671
+ escalade: 3.2.0
2672
+ picocolors: 1.1.1
2673
+
2674
+ uri-js@4.4.1:
2675
+ dependencies:
2676
+ punycode: 2.3.1
2677
+
2678
+ use-sync-external-store@1.6.0(react@19.2.3):
2679
+ dependencies:
2680
+ react: 19.2.3
2681
+
2682
+ victory-vendor@37.3.6:
2683
+ dependencies:
2684
+ '@types/d3-array': 3.2.2
2685
+ '@types/d3-ease': 3.0.2
2686
+ '@types/d3-interpolate': 3.0.4
2687
+ '@types/d3-scale': 4.0.9
2688
+ '@types/d3-shape': 3.1.7
2689
+ '@types/d3-time': 3.0.4
2690
+ '@types/d3-timer': 3.0.2
2691
+ d3-array: 3.2.4
2692
+ d3-ease: 3.0.1
2693
+ d3-interpolate: 3.0.1
2694
+ d3-scale: 4.0.2
2695
+ d3-shape: 3.2.0
2696
+ d3-time: 3.1.0
2697
+ d3-timer: 3.0.1
2698
+
2699
+ vite@7.3.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2):
2700
+ dependencies:
2701
+ esbuild: 0.27.2
2702
+ fdir: 6.5.0(picomatch@4.0.3)
2703
+ picomatch: 4.0.3
2704
+ postcss: 8.5.6
2705
+ rollup: 4.55.1
2706
+ tinyglobby: 0.2.15
2707
+ optionalDependencies:
2708
+ '@types/node': 24.10.4
2709
+ fsevents: 2.3.3
2710
+ jiti: 2.6.1
2711
+ lightningcss: 1.30.2
2712
+
2713
+ which@2.0.2:
2714
+ dependencies:
2715
+ isexe: 2.0.0
2716
+
2717
+ word-wrap@1.2.5: {}
2718
+
2719
+ yallist@3.1.1: {}
2720
+
2721
+ yocto-queue@0.1.0: {}
2722
+
2723
+ zod-validation-error@4.0.2(zod@4.3.5):
2724
+ dependencies:
2725
+ zod: 4.3.5
2726
+
2727
+ zod@4.3.5: {}
public/vite.svg ADDED
src/App.tsx ADDED
@@ -0,0 +1,184 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useState } from "react";
2
+ import { BenchmarkChart } from "@/components/benchmark-chart";
3
+
4
+ // Parse CSV data into chart-friendly format
5
+ function parseCSVData(csvContent: string, newTokens: number) {
6
+ const lines = csvContent.trim().split("\n").slice(1); // Skip header
7
+ const implementations = ["eager", "grouped_mm", "batched_mm", "grouped_prefill+batched_decode"];
8
+
9
+ const result = implementations.map((impl) => {
10
+ const noCompileRow = lines.find(
11
+ (line) =>
12
+ line.includes(impl) &&
13
+ line.includes(",False,") &&
14
+ line.split(",")[2] === String(newTokens)
15
+ );
16
+ const compiledRow = lines.find(
17
+ (line) =>
18
+ line.includes(impl) &&
19
+ (line.includes("max-autotune") || line.includes("max-autotune-no-cudagraphs")) &&
20
+ line.split(",")[2] === String(newTokens)
21
+ );
22
+
23
+ const parseRow = (row: string | undefined) => {
24
+ if (!row) return { generation: 0, prefill: 0, decode: 0 };
25
+ const parts = row.split(",");
26
+ return {
27
+ generation: parseFloat(parts[5]) || 0,
28
+ prefill: parseFloat(parts[6]) || 0,
29
+ decode: parseFloat(parts[7]) || 0,
30
+ };
31
+ };
32
+
33
+ const noCompile = parseRow(noCompileRow);
34
+ const compiled = parseRow(compiledRow);
35
+
36
+ return {
37
+ implementation: impl,
38
+ generationNoCompile: Math.round(noCompile.generation * 100) / 100,
39
+ generationCompiled: Math.round(compiled.generation * 100) / 100,
40
+ prefillNoCompile: Math.round(noCompile.prefill * 100) / 100,
41
+ prefillCompiled: Math.round(compiled.prefill * 100) / 100,
42
+ decodeNoCompile: Math.round(noCompile.decode * 100) / 100,
43
+ decodeCompiled: Math.round(compiled.decode * 100) / 100,
44
+ };
45
+ });
46
+
47
+ return result;
48
+ }
49
+
50
+ // CSV data embedded
51
+ const csvData: Record<string, string> = {
52
+ "1-16": `Batch Size,Seq Length,New Tokens,Torch Compile,Implementation,Mean Generation Latency (ms),Mean Prefill Latency (ms),Mean Decode Latency (ms),Peak Mem (MB)
53
+ 1,16,16,False,eager,1193.70,269.94,923.76,27333.27
54
+ 1,16,16,max-autotune-no-cudagraphs,eager,1332.96,269.72,1063.24,27333.27
55
+ 1,16,16,False,grouped_mm,814.61,64.32,750.29,27333.27
56
+ 1,16,16,max-autotune-no-cudagraphs,grouped_mm,476.82,63.42,413.41,27333.27
57
+ 1,16,16,False,batched_mm,535.34,52.18,483.17,28386.68
58
+ 1,16,16,max-autotune,batched_mm,144.21,52.25,91.97,28386.68
59
+ 1,16,16,False,grouped_prefill+batched_decode,579.92,64.83,515.10,27396.05
60
+ 1,16,16,max-autotune,grouped_prefill+batched_decode,162.56,64.71,97.84,27332.98
61
+ 1,16,64,False,eager,4303.03,274.71,4028.32,27342.27
62
+ 1,16,64,max-autotune-no-cudagraphs,eager,4908.60,288.97,4619.63,27343.43
63
+ 1,16,64,False,grouped_mm,3300.09,64.67,3235.42,27343.43
64
+ 1,16,64,max-autotune-no-cudagraphs,grouped_mm,1801.67,64.25,1737.41,27342.27
65
+ 1,16,64,False,batched_mm,2151.96,52.23,2099.73,28395.68
66
+ 1,16,64,max-autotune,batched_mm,434.84,52.25,382.58,28395.68
67
+ 1,16,64,False,grouped_prefill+batched_decode,2217.35,64.99,2152.36,27405.06
68
+ 1,16,64,max-autotune,grouped_prefill+batched_decode,465.11,64.50,400.62,27341.98`,
69
+
70
+ "1-128": `Batch Size,Seq Length,New Tokens,Torch Compile,Implementation,Mean Generation Latency (ms),Mean Prefill Latency (ms),Mean Decode Latency (ms),Peak Mem (MB)
71
+ 1,128,16,False,eager,1452.00,480.20,971.81,27425.16
72
+ 1,128,16,max-autotune-no-cudagraphs,eager,1620.98,498.00,1122.99,27410.34
73
+ 1,128,16,False,grouped_mm,850.87,76.51,774.35,27425.40
74
+ 1,128,16,max-autotune-no-cudagraphs,grouped_mm,492.87,76.79,416.08,27425.40
75
+ 1,128,16,False,batched_mm,815.11,316.56,498.56,35866.47
76
+ 1,128,16,max-autotune,batched_mm,412.98,316.33,96.65,35866.48
77
+ 1,128,16,False,grouped_prefill+batched_decode,588.87,77.15,511.72,27470.51
78
+ 1,128,16,max-autotune,grouped_prefill+batched_decode,181.79,76.78,105.01,27424.49
79
+ 1,128,64,False,eager,4524.16,486.84,4037.31,27418.44
80
+ 1,128,64,max-autotune-no-cudagraphs,eager,5116.71,477.42,4639.29,27419.62
81
+ 1,128,64,False,grouped_mm,3327.45,76.46,3250.98,27434.67
82
+ 1,128,64,max-autotune-no-cudagraphs,grouped_mm,1824.70,76.55,1748.15,27433.49
83
+ 1,128,64,False,batched_mm,2411.23,316.18,2095.05,35875.48
84
+ 1,128,64,max-autotune,batched_mm,707.73,316.24,391.49,35875.48
85
+ 1,128,64,False,grouped_prefill+batched_decode,2219.34,76.89,2142.45,27479.51
86
+ 1,128,64,max-autotune,grouped_prefill+batched_decode,489.06,76.88,412.18,27433.50`,
87
+
88
+ "4-16": `Batch Size,Seq Length,New Tokens,Torch Compile,Implementation,Mean Generation Latency (ms),Mean Prefill Latency (ms),Mean Decode Latency (ms),Peak Mem (MB)
89
+ 4,16,16,False,eager,2412.69,432.96,1979.74,27420.04
90
+ 4,16,16,max-autotune-no-cudagraphs,eager,2899.32,428.52,2470.80,27384.22
91
+ 4,16,16,False,grouped_mm,923.69,74.45,849.24,27384.22
92
+ 4,16,16,max-autotune-no-cudagraphs,grouped_mm,593.89,75.93,517.97,27384.22
93
+ 4,16,16,False,batched_mm,673.48,164.33,509.16,31601.36
94
+ 4,16,16,max-autotune,batched_mm,330.13,164.50,165.63,31601.36
95
+ 4,16,16,False,grouped_prefill+batched_decode,599.51,74.42,525.09,27638.76
96
+ 4,16,16,max-autotune,grouped_prefill+batched_decode,240.94,74.37,166.57,27382.55
97
+ 4,16,64,False,eager,9249.34,429.71,8819.63,27448.23
98
+ 4,16,64,max-autotune-no-cudagraphs,eager,11396.42,428.78,10967.64,27429.62
99
+ 4,16,64,False,grouped_mm,3649.18,74.14,3575.05,27429.62
100
+ 4,16,64,max-autotune-no-cudagraphs,grouped_mm,2264.07,74.28,2189.79,27424.98
101
+ 4,16,64,False,batched_mm,2309.70,164.35,2145.35,31642.11
102
+ 4,16,64,max-autotune,batched_mm,846.58,164.50,682.08,31642.11
103
+ 4,16,64,False,grouped_prefill+batched_decode,2270.82,74.18,2196.64,27679.51
104
+ 4,16,64,max-autotune,grouped_prefill+batched_decode,776.50,73.13,703.36,27423.29`,
105
+
106
+ "4-128": `Batch Size,Seq Length,New Tokens,Torch Compile,Implementation,Mean Generation Latency (ms),Mean Prefill Latency (ms),Mean Decode Latency (ms),Peak Mem (MB)
107
+ 4,128,16,False,eager,2147.71,523.33,1624.38,27691.78
108
+ 4,128,16,max-autotune-no-cudagraphs,eager,2480.61,519.22,1961.39,27696.76
109
+ 4,128,16,False,grouped_mm,908.79,80.24,828.55,27756.97
110
+ 4,128,16,max-autotune-no-cudagraphs,grouped_mm,577.16,79.94,497.22,27751.99
111
+ 4,128,16,False,batched_mm,1744.98,1235.64,509.34,61519.94
112
+ 4,128,16,max-autotune,batched_mm,1404.29,1236.12,168.17,61519.94
113
+ 4,128,16,False,grouped_prefill+batched_decode,603.57,80.56,523.01,27936.07
114
+ 4,128,16,max-autotune,grouped_prefill+batched_decode,249.57,79.61,169.96,27751.99
115
+ 4,128,64,False,eager,7273.57,520.92,6752.65,27727.80
116
+ 4,128,64,max-autotune-no-cudagraphs,eager,8629.54,525.01,8104.53,27732.78
117
+ 4,128,64,False,grouped_mm,3531.64,80.73,3450.91,27792.99
118
+ 4,128,64,max-autotune-no-cudagraphs,grouped_mm,2136.08,80.10,2055.98,27792.99
119
+ 4,128,64,False,batched_mm,3365.31,1235.87,2129.44,61560.94
120
+ 4,128,64,max-autotune,batched_mm,1931.15,1236.34,694.81,61555.96
121
+ 4,128,64,False,grouped_prefill+batched_decode,2264.46,80.26,2184.20,27972.08
122
+ 4,128,64,max-autotune,grouped_prefill+batched_decode,785.26,79.97,705.28,27788.02`,
123
+ };
124
+
125
+ function App() {
126
+ const [batchSize, setBatchSize] = useState(1);
127
+ const [seqLength, setSeqLength] = useState(16);
128
+
129
+ const key = `${batchSize}-${seqLength}`;
130
+ const data16tok = parseCSVData(csvData[key], 16);
131
+ const data64tok = parseCSVData(csvData[key], 64);
132
+
133
+ const legendItems = [
134
+ { label: "generation (no compile)", color: "hsl(150, 60%, 40%)" },
135
+ { label: "generation (compiled)", color: "hsl(150, 60%, 65%)" },
136
+ { label: "prefill (no compile)", color: "hsl(220, 70%, 50%)" },
137
+ { label: "prefill (compiled)", color: "hsl(220, 70%, 75%)" },
138
+ { label: "decode (no compile)", color: "hsl(340, 75%, 55%)" },
139
+ { label: "decode (compiled)", color: "hsl(340, 75%, 80%)" },
140
+ ];
141
+
142
+ return (
143
+ <div className="min-h-screen bg-white py-12 px-4">
144
+ <div className="max-w-7xl mx-auto">
145
+ <section>
146
+ <h2 className="text-2xl font-semibold text-slate-900 mb-6 text-center">
147
+ batch size{" "}
148
+ <button
149
+ onClick={() => setBatchSize(batchSize === 1 ? 4 : 1)}
150
+ className="underline decoration-slate-300 underline-offset-4 hover:decoration-slate-900 transition-colors"
151
+ >
152
+ {batchSize}
153
+ </button>
154
+ , sequence length{" "}
155
+ <button
156
+ onClick={() => setSeqLength(seqLength === 16 ? 128 : 16)}
157
+ className="underline decoration-slate-300 underline-offset-4 hover:decoration-slate-900 transition-colors"
158
+ >
159
+ {seqLength}
160
+ </button>
161
+ </h2>
162
+ <div className="grid md:grid-cols-2 gap-6">
163
+ <BenchmarkChart title="16 new tokens" data={data16tok} />
164
+ <BenchmarkChart title="64 new tokens" data={data64tok} />
165
+ </div>
166
+ </section>
167
+
168
+ <div className="flex flex-wrap items-center justify-center gap-x-6 gap-y-2 mt-8">
169
+ {legendItems.map((item) => (
170
+ <div key={item.label} className="flex items-center gap-2">
171
+ <div
172
+ className="h-3 w-3 rounded-sm"
173
+ style={{ backgroundColor: item.color }}
174
+ />
175
+ <span className="text-sm text-slate-600">{item.label}</span>
176
+ </div>
177
+ ))}
178
+ </div>
179
+ </div>
180
+ </div>
181
+ );
182
+ }
183
+
184
+ export default App;
src/assets/react.svg ADDED
src/components/benchmark-chart.tsx ADDED
@@ -0,0 +1,127 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Bar, BarChart, CartesianGrid, XAxis, YAxis } from "recharts";
2
+ import {
3
+ Card,
4
+ CardContent,
5
+ CardHeader,
6
+ CardTitle,
7
+ } from "@/components/ui/card";
8
+ import type { ChartConfig } from "@/components/ui/chart";
9
+ import {
10
+ ChartContainer,
11
+ ChartTooltip,
12
+ ChartTooltipContent,
13
+ } from "@/components/ui/chart";
14
+
15
+ interface BenchmarkRow {
16
+ implementation: string;
17
+ generationNoCompile: number;
18
+ generationCompiled: number;
19
+ prefillNoCompile: number;
20
+ prefillCompiled: number;
21
+ decodeNoCompile: number;
22
+ decodeCompiled: number;
23
+ }
24
+
25
+ interface BenchmarkChartProps {
26
+ title: string;
27
+ data: BenchmarkRow[];
28
+ }
29
+
30
+ const chartConfig = {
31
+ generationNoCompile: {
32
+ label: "generation (no compile)",
33
+ color: "hsl(150, 60%, 40%)",
34
+ },
35
+ generationCompiled: {
36
+ label: "generation (compiled)",
37
+ color: "hsl(150, 60%, 65%)",
38
+ },
39
+ prefillNoCompile: {
40
+ label: "prefill (no compile)",
41
+ color: "hsl(220, 70%, 50%)",
42
+ },
43
+ prefillCompiled: {
44
+ label: "prefill (compiled)",
45
+ color: "hsl(220, 70%, 75%)",
46
+ },
47
+ decodeNoCompile: {
48
+ label: "decode (no compile)",
49
+ color: "hsl(340, 75%, 55%)",
50
+ },
51
+ decodeCompiled: {
52
+ label: "decode (compiled)",
53
+ color: "hsl(340, 75%, 80%)",
54
+ },
55
+ } satisfies ChartConfig;
56
+
57
+ export function BenchmarkChart({
58
+ title,
59
+ data,
60
+ }: BenchmarkChartProps) {
61
+ return (
62
+ <Card className="border-0 shadow-none">
63
+ <CardHeader className="pb-2 px-0">
64
+ <CardTitle style={{ paddingLeft: 8 }}>{title}</CardTitle>
65
+ </CardHeader>
66
+ <CardContent className="px-0 pr-6">
67
+ <ChartContainer config={chartConfig} style={{ height: 350, width: '100%' }}>
68
+ <BarChart accessibilityLayer data={data}>
69
+ <CartesianGrid vertical={false} />
70
+ <XAxis
71
+ dataKey="implementation"
72
+ tickLine={false}
73
+ tickMargin={10}
74
+ axisLine={false}
75
+ tickFormatter={(value) => {
76
+ if (value === "grouped_prefill+batched_decode") {
77
+ return "grouped+batched";
78
+ }
79
+ return value;
80
+ }}
81
+ />
82
+ <YAxis
83
+ tickLine={false}
84
+ axisLine={false}
85
+ width={60}
86
+ tickFormatter={(value) => `${value}ms`}
87
+ />
88
+ <ChartTooltip
89
+ cursor={false}
90
+ content={<ChartTooltipContent indicator="dashed" />}
91
+ />
92
+ <Bar
93
+ dataKey="generationNoCompile"
94
+ fill="var(--color-generationNoCompile)"
95
+ radius={4}
96
+ />
97
+ <Bar
98
+ dataKey="generationCompiled"
99
+ fill="var(--color-generationCompiled)"
100
+ radius={4}
101
+ />
102
+ <Bar
103
+ dataKey="prefillNoCompile"
104
+ fill="var(--color-prefillNoCompile)"
105
+ radius={4}
106
+ />
107
+ <Bar
108
+ dataKey="prefillCompiled"
109
+ fill="var(--color-prefillCompiled)"
110
+ radius={4}
111
+ />
112
+ <Bar
113
+ dataKey="decodeNoCompile"
114
+ fill="var(--color-decodeNoCompile)"
115
+ radius={4}
116
+ />
117
+ <Bar
118
+ dataKey="decodeCompiled"
119
+ fill="var(--color-decodeCompiled)"
120
+ radius={4}
121
+ />
122
+ </BarChart>
123
+ </ChartContainer>
124
+ </CardContent>
125
+ </Card>
126
+ );
127
+ }
src/components/ui/card.tsx ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import * as React from "react"
2
+
3
+ import { cn } from "@/lib/utils"
4
+
5
+ function Card({ className, ...props }: React.ComponentProps<"div">) {
6
+ return (
7
+ <div
8
+ data-slot="card"
9
+ className={cn(
10
+ "bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",
11
+ className
12
+ )}
13
+ {...props}
14
+ />
15
+ )
16
+ }
17
+
18
+ function CardHeader({ className, ...props }: React.ComponentProps<"div">) {
19
+ return (
20
+ <div
21
+ data-slot="card-header"
22
+ className={cn(
23
+ "@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
24
+ className
25
+ )}
26
+ {...props}
27
+ />
28
+ )
29
+ }
30
+
31
+ function CardTitle({ className, ...props }: React.ComponentProps<"div">) {
32
+ return (
33
+ <div
34
+ data-slot="card-title"
35
+ className={cn("leading-none font-semibold", className)}
36
+ {...props}
37
+ />
38
+ )
39
+ }
40
+
41
+ function CardDescription({ className, ...props }: React.ComponentProps<"div">) {
42
+ return (
43
+ <div
44
+ data-slot="card-description"
45
+ className={cn("text-muted-foreground text-sm", className)}
46
+ {...props}
47
+ />
48
+ )
49
+ }
50
+
51
+ function CardAction({ className, ...props }: React.ComponentProps<"div">) {
52
+ return (
53
+ <div
54
+ data-slot="card-action"
55
+ className={cn(
56
+ "col-start-2 row-span-2 row-start-1 self-start justify-self-end",
57
+ className
58
+ )}
59
+ {...props}
60
+ />
61
+ )
62
+ }
63
+
64
+ function CardContent({ className, ...props }: React.ComponentProps<"div">) {
65
+ return (
66
+ <div
67
+ data-slot="card-content"
68
+ className={cn("px-6", className)}
69
+ {...props}
70
+ />
71
+ )
72
+ }
73
+
74
+ function CardFooter({ className, ...props }: React.ComponentProps<"div">) {
75
+ return (
76
+ <div
77
+ data-slot="card-footer"
78
+ className={cn("flex items-center px-6 [.border-t]:pt-6", className)}
79
+ {...props}
80
+ />
81
+ )
82
+ }
83
+
84
+ export {
85
+ Card,
86
+ CardHeader,
87
+ CardFooter,
88
+ CardTitle,
89
+ CardAction,
90
+ CardDescription,
91
+ CardContent,
92
+ }
src/components/ui/chart.tsx ADDED
@@ -0,0 +1,355 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import * as React from "react"
2
+ import * as RechartsPrimitive from "recharts"
3
+
4
+ import { cn } from "@/lib/utils"
5
+
6
+ // Format: { THEME_NAME: CSS_SELECTOR }
7
+ const THEMES = { light: "", dark: ".dark" } as const
8
+
9
+ export type ChartConfig = {
10
+ [k in string]: {
11
+ label?: React.ReactNode
12
+ icon?: React.ComponentType
13
+ } & (
14
+ | { color?: string; theme?: never }
15
+ | { color?: never; theme: Record<keyof typeof THEMES, string> }
16
+ )
17
+ }
18
+
19
+ type ChartContextProps = {
20
+ config: ChartConfig
21
+ }
22
+
23
+ const ChartContext = React.createContext<ChartContextProps | null>(null)
24
+
25
+ function useChart() {
26
+ const context = React.useContext(ChartContext)
27
+
28
+ if (!context) {
29
+ throw new Error("useChart must be used within a <ChartContainer />")
30
+ }
31
+
32
+ return context
33
+ }
34
+
35
+ function ChartContainer({
36
+ id,
37
+ className,
38
+ children,
39
+ config,
40
+ ...props
41
+ }: React.ComponentProps<"div"> & {
42
+ config: ChartConfig
43
+ children: React.ComponentProps<
44
+ typeof RechartsPrimitive.ResponsiveContainer
45
+ >["children"]
46
+ }) {
47
+ const uniqueId = React.useId()
48
+ const chartId = `chart-${id || uniqueId.replace(/:/g, "")}`
49
+
50
+ return (
51
+ <ChartContext.Provider value={{ config }}>
52
+ <div
53
+ data-slot="chart"
54
+ data-chart={chartId}
55
+ className={cn(
56
+ "[&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border text-xs [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden",
57
+ className
58
+ )}
59
+ {...props}
60
+ >
61
+ <ChartStyle id={chartId} config={config} />
62
+ <RechartsPrimitive.ResponsiveContainer width="100%" height="100%">
63
+ {children}
64
+ </RechartsPrimitive.ResponsiveContainer>
65
+ </div>
66
+ </ChartContext.Provider>
67
+ )
68
+ }
69
+
70
+ const ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {
71
+ const colorConfig = Object.entries(config).filter(
72
+ ([, config]) => config.theme || config.color
73
+ )
74
+
75
+ if (!colorConfig.length) {
76
+ return null
77
+ }
78
+
79
+ return (
80
+ <style
81
+ dangerouslySetInnerHTML={{
82
+ __html: Object.entries(THEMES)
83
+ .map(
84
+ ([theme, prefix]) => `
85
+ ${prefix} [data-chart=${id}] {
86
+ ${colorConfig
87
+ .map(([key, itemConfig]) => {
88
+ const color =
89
+ itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ||
90
+ itemConfig.color
91
+ return color ? ` --color-${key}: ${color};` : null
92
+ })
93
+ .join("\n")}
94
+ }
95
+ `
96
+ )
97
+ .join("\n"),
98
+ }}
99
+ />
100
+ )
101
+ }
102
+
103
+ const ChartTooltip = RechartsPrimitive.Tooltip
104
+
105
+ function ChartTooltipContent({
106
+ active,
107
+ payload,
108
+ className,
109
+ indicator = "dot",
110
+ hideLabel = false,
111
+ hideIndicator = false,
112
+ label,
113
+ labelFormatter,
114
+ labelClassName,
115
+ formatter,
116
+ color,
117
+ nameKey,
118
+ labelKey,
119
+ }: React.ComponentProps<typeof RechartsPrimitive.Tooltip> &
120
+ React.ComponentProps<"div"> & {
121
+ hideLabel?: boolean
122
+ hideIndicator?: boolean
123
+ indicator?: "line" | "dot" | "dashed"
124
+ nameKey?: string
125
+ labelKey?: string
126
+ }) {
127
+ const { config } = useChart()
128
+
129
+ const tooltipLabel = React.useMemo(() => {
130
+ if (hideLabel || !payload?.length) {
131
+ return null
132
+ }
133
+
134
+ const [item] = payload
135
+ const key = `${labelKey || item?.dataKey || item?.name || "value"}`
136
+ const itemConfig = getPayloadConfigFromPayload(config, item, key)
137
+ const value =
138
+ !labelKey && typeof label === "string"
139
+ ? config[label as keyof typeof config]?.label || label
140
+ : itemConfig?.label
141
+
142
+ if (labelFormatter) {
143
+ return (
144
+ <div className={cn("font-medium", labelClassName)}>
145
+ {labelFormatter(value, payload)}
146
+ </div>
147
+ )
148
+ }
149
+
150
+ if (!value) {
151
+ return null
152
+ }
153
+
154
+ return <div className={cn("font-medium", labelClassName)}>{value}</div>
155
+ }, [
156
+ label,
157
+ labelFormatter,
158
+ payload,
159
+ hideLabel,
160
+ labelClassName,
161
+ config,
162
+ labelKey,
163
+ ])
164
+
165
+ if (!active || !payload?.length) {
166
+ return null
167
+ }
168
+
169
+ const nestLabel = payload.length === 1 && indicator !== "dot"
170
+
171
+ return (
172
+ <div
173
+ className={cn(
174
+ "border-border/50 bg-background grid min-w-[8rem] items-start gap-1.5 rounded-lg border px-2.5 py-1.5 text-xs shadow-xl",
175
+ className
176
+ )}
177
+ >
178
+ {!nestLabel ? tooltipLabel : null}
179
+ <div className="grid gap-1.5">
180
+ {payload
181
+ .filter((item) => item.type !== "none")
182
+ .map((item, index) => {
183
+ const key = `${nameKey || item.name || item.dataKey || "value"}`
184
+ const itemConfig = getPayloadConfigFromPayload(config, item, key)
185
+ const indicatorColor = color || item.payload.fill || item.color
186
+
187
+ return (
188
+ <div
189
+ key={item.dataKey}
190
+ className={cn(
191
+ "[&>svg]:text-muted-foreground flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5",
192
+ indicator === "dot" && "items-center"
193
+ )}
194
+ >
195
+ {formatter && item?.value !== undefined && item.name ? (
196
+ formatter(item.value, item.name, item, index, item.payload)
197
+ ) : (
198
+ <>
199
+ {itemConfig?.icon ? (
200
+ <itemConfig.icon />
201
+ ) : (
202
+ !hideIndicator && (
203
+ <div
204
+ className={cn(
205
+ "shrink-0 rounded-[2px] border-(--color-border) bg-(--color-bg)",
206
+ {
207
+ "h-2.5 w-2.5": indicator === "dot",
208
+ "w-1": indicator === "line",
209
+ "w-0 border-[1.5px] border-dashed bg-transparent":
210
+ indicator === "dashed",
211
+ "my-0.5": nestLabel && indicator === "dashed",
212
+ }
213
+ )}
214
+ style={
215
+ {
216
+ "--color-bg": indicatorColor,
217
+ "--color-border": indicatorColor,
218
+ } as React.CSSProperties
219
+ }
220
+ />
221
+ )
222
+ )}
223
+ <div
224
+ className={cn(
225
+ "flex flex-1 justify-between leading-none",
226
+ nestLabel ? "items-end" : "items-center"
227
+ )}
228
+ >
229
+ <div className="grid gap-1.5">
230
+ {nestLabel ? tooltipLabel : null}
231
+ <span className="text-muted-foreground">
232
+ {itemConfig?.label || item.name}
233
+ </span>
234
+ </div>
235
+ {item.value && (
236
+ <span className="text-foreground font-mono font-medium tabular-nums">
237
+ {item.value.toLocaleString()}
238
+ </span>
239
+ )}
240
+ </div>
241
+ </>
242
+ )}
243
+ </div>
244
+ )
245
+ })}
246
+ </div>
247
+ </div>
248
+ )
249
+ }
250
+
251
+ const ChartLegend = RechartsPrimitive.Legend
252
+
253
+ function ChartLegendContent({
254
+ className,
255
+ hideIcon = false,
256
+ payload,
257
+ verticalAlign = "bottom",
258
+ nameKey,
259
+ }: React.ComponentProps<"div"> &
260
+ Pick<RechartsPrimitive.LegendProps, "payload" | "verticalAlign"> & {
261
+ hideIcon?: boolean
262
+ nameKey?: string
263
+ }) {
264
+ const { config } = useChart()
265
+
266
+ if (!payload?.length) {
267
+ return null
268
+ }
269
+
270
+ return (
271
+ <div
272
+ className={cn(
273
+ "flex items-center justify-center gap-4",
274
+ verticalAlign === "top" ? "pb-3" : "pt-3",
275
+ className
276
+ )}
277
+ >
278
+ {payload
279
+ .filter((item) => item.type !== "none")
280
+ .map((item) => {
281
+ const key = `${nameKey || item.dataKey || "value"}`
282
+ const itemConfig = getPayloadConfigFromPayload(config, item, key)
283
+
284
+ return (
285
+ <div
286
+ key={item.value}
287
+ className={cn(
288
+ "[&>svg]:text-muted-foreground flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3"
289
+ )}
290
+ >
291
+ {itemConfig?.icon && !hideIcon ? (
292
+ <itemConfig.icon />
293
+ ) : (
294
+ <div
295
+ className="h-2 w-2 shrink-0 rounded-[2px]"
296
+ style={{
297
+ backgroundColor: item.color,
298
+ }}
299
+ />
300
+ )}
301
+ {itemConfig?.label}
302
+ </div>
303
+ )
304
+ })}
305
+ </div>
306
+ )
307
+ }
308
+
309
+ // Helper to extract item config from a payload.
310
+ function getPayloadConfigFromPayload(
311
+ config: ChartConfig,
312
+ payload: unknown,
313
+ key: string
314
+ ) {
315
+ if (typeof payload !== "object" || payload === null) {
316
+ return undefined
317
+ }
318
+
319
+ const payloadPayload =
320
+ "payload" in payload &&
321
+ typeof payload.payload === "object" &&
322
+ payload.payload !== null
323
+ ? payload.payload
324
+ : undefined
325
+
326
+ let configLabelKey: string = key
327
+
328
+ if (
329
+ key in payload &&
330
+ typeof payload[key as keyof typeof payload] === "string"
331
+ ) {
332
+ configLabelKey = payload[key as keyof typeof payload] as string
333
+ } else if (
334
+ payloadPayload &&
335
+ key in payloadPayload &&
336
+ typeof payloadPayload[key as keyof typeof payloadPayload] === "string"
337
+ ) {
338
+ configLabelKey = payloadPayload[
339
+ key as keyof typeof payloadPayload
340
+ ] as string
341
+ }
342
+
343
+ return configLabelKey in config
344
+ ? config[configLabelKey]
345
+ : config[key as keyof typeof config]
346
+ }
347
+
348
+ export {
349
+ ChartContainer,
350
+ ChartTooltip,
351
+ ChartTooltipContent,
352
+ ChartLegend,
353
+ ChartLegendContent,
354
+ ChartStyle,
355
+ }
src/index.css CHANGED
@@ -1,3 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
  body {
2
  margin: 0;
3
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
 
1
+ @import "tailwindcss";
2
+
3
+ @theme inline {
4
+ --color-background: oklch(1 0 0);
5
+ --color-foreground: oklch(0.145 0 0);
6
+ --color-card: oklch(1 0 0);
7
+ --color-card-foreground: oklch(0.145 0 0);
8
+ --color-muted: oklch(0.97 0 0);
9
+ --color-muted-foreground: oklch(0.556 0 0);
10
+ --color-border: oklch(0.922 0 0);
11
+ }
12
+
13
  body {
14
  margin: 0;
15
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
src/lib/utils.ts ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ import { clsx, type ClassValue } from "clsx"
2
+ import { twMerge } from "tailwind-merge"
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs))
6
+ }
src/main.tsx ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import { StrictMode } from 'react'
2
+ import { createRoot } from 'react-dom/client'
3
+ import './index.css'
4
+ import App from './App.tsx'
5
+
6
+ createRoot(document.getElementById('root')!).render(
7
+ <StrictMode>
8
+ <App />
9
+ </StrictMode>,
10
+ )
style.css ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ body {
2
+ padding: 2rem;
3
+ font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
4
+ }
5
+
6
+ h1 {
7
+ font-size: 16px;
8
+ margin-top: 0;
9
+ }
10
+
11
+ p {
12
+ color: rgb(107, 114, 128);
13
+ font-size: 15px;
14
+ margin-bottom: 10px;
15
+ margin-top: 5px;
16
+ }
17
+
18
+ .card {
19
+ max-width: 620px;
20
+ margin: 0 auto;
21
+ padding: 16px;
22
+ border: 1px solid lightgray;
23
+ border-radius: 16px;
24
+ }
25
+
26
+ .card p:last-child {
27
+ margin-bottom: 0;
28
+ }
tsconfig.app.json ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
4
+ "target": "ES2022",
5
+ "useDefineForClassFields": true,
6
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
7
+ "module": "ESNext",
8
+ "types": ["vite/client"],
9
+ "skipLibCheck": true,
10
+
11
+ /* Bundler mode */
12
+ "moduleResolution": "bundler",
13
+ "allowImportingTsExtensions": true,
14
+ "verbatimModuleSyntax": true,
15
+ "moduleDetection": "force",
16
+ "noEmit": true,
17
+ "jsx": "react-jsx",
18
+
19
+ /* Linting */
20
+ "strict": true,
21
+ "noUnusedLocals": true,
22
+ "noUnusedParameters": true,
23
+ "erasableSyntaxOnly": true,
24
+ "noFallthroughCasesInSwitch": true,
25
+ "noUncheckedSideEffectImports": true
26
+ },
27
+ "include": ["src"]
28
+ }
tsconfig.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "files": [],
3
+ "references": [
4
+ { "path": "./tsconfig.app.json" },
5
+ { "path": "./tsconfig.node.json" }
6
+ ]
7
+ }
tsconfig.node.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
4
+ "target": "ES2023",
5
+ "lib": ["ES2023"],
6
+ "module": "ESNext",
7
+ "types": ["node"],
8
+ "skipLibCheck": true,
9
+
10
+ /* Bundler mode */
11
+ "moduleResolution": "bundler",
12
+ "allowImportingTsExtensions": true,
13
+ "verbatimModuleSyntax": true,
14
+ "moduleDetection": "force",
15
+ "noEmit": true,
16
+
17
+ /* Linting */
18
+ "strict": true,
19
+ "noUnusedLocals": true,
20
+ "noUnusedParameters": true,
21
+ "erasableSyntaxOnly": true,
22
+ "noFallthroughCasesInSwitch": true,
23
+ "noUncheckedSideEffectImports": true
24
+ },
25
+ "include": ["vite.config.ts"]
26
+ }
vite.config.ts ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { defineConfig } from 'vite'
2
+ import react from '@vitejs/plugin-react'
3
+ import tailwindcss from '@tailwindcss/vite'
4
+ import path from 'path'
5
+
6
+ // https://vite.dev/config/
7
+ export default defineConfig({
8
+ plugins: [react(), tailwindcss()],
9
+ resolve: {
10
+ alias: {
11
+ '@': path.resolve(__dirname, './src'),
12
+ },
13
+ },
14
+ })