diff --git a/admin-v2/.gitignore b/admin-v2/.gitignore
new file mode 100644
index 0000000..a547bf3
--- /dev/null
+++ b/admin-v2/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/admin-v2/README.md b/admin-v2/README.md
new file mode 100644
index 0000000..7dbf7eb
--- /dev/null
+++ b/admin-v2/README.md
@@ -0,0 +1,73 @@
+# React + TypeScript + Vite
+
+This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
+
+Currently, two official plugins are available:
+
+- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs)
+- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/)
+
+## React Compiler
+
+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).
+
+## Expanding the ESLint configuration
+
+If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
+
+```js
+export default defineConfig([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{ts,tsx}'],
+ extends: [
+ // Other configs...
+
+ // Remove tseslint.configs.recommended and replace with this
+ tseslint.configs.recommendedTypeChecked,
+ // Alternatively, use this for stricter rules
+ tseslint.configs.strictTypeChecked,
+ // Optionally, add this for stylistic rules
+ tseslint.configs.stylisticTypeChecked,
+
+ // Other configs...
+ ],
+ languageOptions: {
+ parserOptions: {
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
+ tsconfigRootDir: import.meta.dirname,
+ },
+ // other options...
+ },
+ },
+])
+```
+
+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:
+
+```js
+// eslint.config.js
+import reactX from 'eslint-plugin-react-x'
+import reactDom from 'eslint-plugin-react-dom'
+
+export default defineConfig([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{ts,tsx}'],
+ extends: [
+ // Other configs...
+ // Enable lint rules for React
+ reactX.configs['recommended-typescript'],
+ // Enable lint rules for React DOM
+ reactDom.configs.recommended,
+ ],
+ languageOptions: {
+ parserOptions: {
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
+ tsconfigRootDir: import.meta.dirname,
+ },
+ // other options...
+ },
+ },
+])
+```
diff --git a/admin-v2/eslint.config.js b/admin-v2/eslint.config.js
new file mode 100644
index 0000000..5e6b472
--- /dev/null
+++ b/admin-v2/eslint.config.js
@@ -0,0 +1,23 @@
+import js from '@eslint/js'
+import globals from 'globals'
+import reactHooks from 'eslint-plugin-react-hooks'
+import reactRefresh from 'eslint-plugin-react-refresh'
+import tseslint from 'typescript-eslint'
+import { defineConfig, globalIgnores } from 'eslint/config'
+
+export default defineConfig([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{ts,tsx}'],
+ extends: [
+ js.configs.recommended,
+ tseslint.configs.recommended,
+ reactHooks.configs.flat.recommended,
+ reactRefresh.configs.vite,
+ ],
+ languageOptions: {
+ ecmaVersion: 2020,
+ globals: globals.browser,
+ },
+ },
+])
diff --git a/admin-v2/index.html b/admin-v2/index.html
new file mode 100644
index 0000000..1a5696b
--- /dev/null
+++ b/admin-v2/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ admin-v2
+
+
+
+
+
+
diff --git a/admin-v2/package.json b/admin-v2/package.json
new file mode 100644
index 0000000..8ec6221
--- /dev/null
+++ b/admin-v2/package.json
@@ -0,0 +1,39 @@
+{
+ "name": "admin-v2",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc -b && vite build",
+ "lint": "eslint .",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@ant-design/charts": "^2.6.7",
+ "@ant-design/icons": "^6.1.1",
+ "@ant-design/pro-components": "^2.8.10",
+ "@ant-design/pro-layout": "^7.22.7",
+ "@tanstack/react-query": "^5.95.2",
+ "antd": "^6.3.4",
+ "axios": "^1.14.0",
+ "react": "^19.2.4",
+ "react-dom": "^19.2.4",
+ "react-router-dom": "^7.13.2",
+ "zustand": "^5.0.12"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.39.4",
+ "@types/node": "^24.12.0",
+ "@types/react": "^19.2.14",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^6.0.1",
+ "eslint": "^9.39.4",
+ "eslint-plugin-react-hooks": "^7.0.1",
+ "eslint-plugin-react-refresh": "^0.5.2",
+ "globals": "^17.4.0",
+ "typescript": "~5.9.3",
+ "typescript-eslint": "^8.57.0",
+ "vite": "^8.0.1"
+ }
+}
diff --git a/admin-v2/pnpm-lock.yaml b/admin-v2/pnpm-lock.yaml
new file mode 100644
index 0000000..3221560
--- /dev/null
+++ b/admin-v2/pnpm-lock.yaml
@@ -0,0 +1,5008 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ '@ant-design/charts':
+ specifier: ^2.6.7
+ version: 2.6.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(workerize-loader@2.0.2(webpack@5.105.4))
+ '@ant-design/icons':
+ specifier: ^6.1.1
+ version: 6.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-components':
+ specifier: ^2.8.10
+ version: 2.8.10(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(rc-field-form@2.7.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-layout':
+ specifier: ^7.22.7
+ version: 7.22.7(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@tanstack/react-query':
+ specifier: ^5.95.2
+ version: 5.95.2(react@19.2.4)
+ antd:
+ specifier: ^6.3.4
+ version: 6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ axios:
+ specifier: ^1.14.0
+ version: 1.14.0
+ react:
+ specifier: ^19.2.4
+ version: 19.2.4
+ react-dom:
+ specifier: ^19.2.4
+ version: 19.2.4(react@19.2.4)
+ react-router-dom:
+ specifier: ^7.13.2
+ version: 7.13.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ zustand:
+ specifier: ^5.0.12
+ version: 5.0.12(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))
+ devDependencies:
+ '@eslint/js':
+ specifier: ^9.39.4
+ version: 9.39.4
+ '@types/node':
+ specifier: ^24.12.0
+ version: 24.12.0
+ '@types/react':
+ specifier: ^19.2.14
+ version: 19.2.14
+ '@types/react-dom':
+ specifier: ^19.2.3
+ version: 19.2.3(@types/react@19.2.14)
+ '@vitejs/plugin-react':
+ specifier: ^6.0.1
+ version: 6.0.1(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)(terser@5.46.1))
+ eslint:
+ specifier: ^9.39.4
+ version: 9.39.4
+ eslint-plugin-react-hooks:
+ specifier: ^7.0.1
+ version: 7.0.1(eslint@9.39.4)
+ eslint-plugin-react-refresh:
+ specifier: ^0.5.2
+ version: 0.5.2(eslint@9.39.4)
+ globals:
+ specifier: ^17.4.0
+ version: 17.4.0
+ typescript:
+ specifier: ~5.9.3
+ version: 5.9.3
+ typescript-eslint:
+ specifier: ^8.57.0
+ version: 8.57.2(eslint@9.39.4)(typescript@5.9.3)
+ vite:
+ specifier: ^8.0.1
+ version: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)(terser@5.46.1)
+
+packages:
+
+ '@ant-design/charts-util@0.0.1-alpha.7':
+ resolution: {integrity: sha512-Yh0o6EdO6SvdSnStFZMbnUzjyymkVzV+TQ9ymVW9hlVgO/fUkUII3JYSdV+UVcFnYwUF0YiDKuSTLCZNAzg2bQ==}
+ peerDependencies:
+ react: '>=16.8.4'
+ react-dom: '>=16.8.4'
+
+ '@ant-design/charts-util@0.0.3':
+ resolution: {integrity: sha512-x1H7UT6t4dXAyGRoHqlOnEsEqBSTANFGTZEAMI0CWYhYUpp13n0o9grl9oPtoL6FEQMjUBTY+zGJKlHkz8smMw==}
+ peerDependencies:
+ react: '>=16.8.4'
+ react-dom: '>=16.8.4'
+
+ '@ant-design/charts@2.6.7':
+ resolution: {integrity: sha512-XfmsnspUpfrMlRFGTwmHJ2TPKcosq5a5nSxAfIOpEXAvmJBT2N16oejGTZhUFTzba8W3XtBOziwRAXmDmLUqvA==}
+ peerDependencies:
+ react: '>=16.8.4'
+ react-dom: '>=16.8.4'
+
+ '@ant-design/colors@7.2.1':
+ resolution: {integrity: sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ==}
+
+ '@ant-design/colors@8.0.1':
+ resolution: {integrity: sha512-foPVl0+SWIslGUtD/xBr1p9U4AKzPhNYEseXYRRo5QSzGACYZrQbe11AYJbYfAWnWSpGBx6JjBmSeugUsD9vqQ==}
+
+ '@ant-design/cssinjs-utils@2.1.2':
+ resolution: {integrity: sha512-5fTHQ158jJJ5dC/ECeyIdZUzKxE/mpEMRZxthyG1sw/AKRHKgJBg00Yi6ACVXgycdje7KahRNvNET/uBccwCnA==}
+ peerDependencies:
+ react: '>=18'
+ react-dom: '>=18'
+
+ '@ant-design/cssinjs@1.24.0':
+ resolution: {integrity: sha512-K4cYrJBsgvL+IoozUXYjbT6LHHNt+19a9zkvpBPxLjFHas1UpPM2A5MlhROb0BT8N8WoavM5VsP9MeSeNK/3mg==}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+
+ '@ant-design/cssinjs@2.1.2':
+ resolution: {integrity: sha512-2Hy8BnCEH31xPeSLbhhB2ctCPXE2ZnASdi+KbSeS79BNbUhL9hAEe20SkUk+BR8aKTmqb6+FKFruk7w8z0VoRQ==}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+
+ '@ant-design/fast-color@2.0.6':
+ resolution: {integrity: sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==}
+ engines: {node: '>=8.x'}
+
+ '@ant-design/fast-color@3.0.1':
+ resolution: {integrity: sha512-esKJegpW4nckh0o6kV3Tkb7NPIZYbPnnFxmQDUmL08ukXZAvV85TZBr70eGuke/CIArLaP6aw8lt9KILjnWuOw==}
+ engines: {node: '>=8.x'}
+
+ '@ant-design/graphs@2.1.1':
+ resolution: {integrity: sha512-qT3Oo8BWeoAmZEy9gfR6uIk+rczbNJ3sWXKonoOD5koATWv7dY0kgvS1JnhdM1QW4FkfPPJTeQVSlRRUtvWDwA==}
+ peerDependencies:
+ react: '>=16.8.4'
+ react-dom: '>=16.8.4'
+
+ '@ant-design/icons-svg@4.4.2':
+ resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==}
+
+ '@ant-design/icons@5.6.1':
+ resolution: {integrity: sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==}
+ engines: {node: '>=8'}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+
+ '@ant-design/icons@6.1.1':
+ resolution: {integrity: sha512-AMT4N2y++TZETNHiM77fs4a0uPVCJGuL5MTonk13Pvv7UN7sID1cNEZOc1qNqx6zLKAOilTEFAdAoAFKa0U//Q==}
+ engines: {node: '>=8'}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+
+ '@ant-design/plots@2.6.8':
+ resolution: {integrity: sha512-QsunUs2d5rbq/1BwVhga/siA5H50OaG23YopMYwPD4sPsza6NQzPQ8FM3elNIsD/BIk298tihqX1cJ/MmvVJbQ==}
+ peerDependencies:
+ react: '>=16.8.4'
+ react-dom: '>=16.8.4'
+
+ '@ant-design/pro-card@2.10.0':
+ resolution: {integrity: sha512-sLONn1odmE0Wkbse8pol4WiaEzBV8JU5s3FAMflPpycfUcbSaa1ktXzQ7LCo2SAvOS7gkfmpFjBPtrfbigKh4g==}
+ peerDependencies:
+ antd: ^4.24.15 || ^5.11.2
+ react: '>=17.0.0'
+
+ '@ant-design/pro-components@2.8.10':
+ resolution: {integrity: sha512-QHnnIXdmC5GTAtm6i8eeJy5yT9npPlFyxpDm+duiDrTRKRFaAQBduArxlH3DA/hoRCCypzPONxfK9BQNIhIyZA==}
+ peerDependencies:
+ antd: ^4.24.15 || ^5.11.2
+ react: '>=17.0.0'
+ react-dom: '>=17.0.0'
+
+ '@ant-design/pro-descriptions@2.6.10':
+ resolution: {integrity: sha512-+4MbiOfumnWlW0Awm4m8JML5o3lR649FD24AaivCmr8BQvIAAXdTITnDMXEg8BqvdP4KOvNsStZrvYfqoev33A==}
+ peerDependencies:
+ antd: ^4.24.15 || ^5.11.2
+ react: '>=17.0.0'
+
+ '@ant-design/pro-field@3.1.0':
+ resolution: {integrity: sha512-+Dgp31WjD+iwg9KIRAMgNkfQivkJKMcYBrIBmho1e8ep/O0HgWSp48g70tBIWi/Lfem/Ky2schF7O8XCFouczw==}
+ peerDependencies:
+ antd: ^4.24.15 || ^5.11.2
+ react: '>=17.0.0'
+
+ '@ant-design/pro-form@2.32.0':
+ resolution: {integrity: sha512-GZnVAMeYv+YHJb17lJ7rX5PYuQPvEA6EotQnPbHi9tGLN3PfexcAd21rqzuO+OrulU2x7TEMDIxtY9MzvvOGbg==}
+ peerDependencies:
+ antd: ^4.24.15 || ^5.11.2
+ rc-field-form: '>=1.22.0'
+ react: '>=17.0.0'
+ react-dom: '>=17.0.0'
+
+ '@ant-design/pro-layout@7.22.7':
+ resolution: {integrity: sha512-fvmtNA1r9SaasVIQIQt611VSlNxtVxDbQ3e+1GhYQza3tVJi/3gCZuDyfMfTnbLmf3PaW/YvLkn7MqDbzAzoLA==}
+ peerDependencies:
+ antd: ^4.24.15 || ^5.11.2
+ react: '>=17.0.0'
+ react-dom: '>=17.0.0'
+
+ '@ant-design/pro-list@2.6.10':
+ resolution: {integrity: sha512-xSWwnqCr+hPEYR4qY7nFUaxO5RQBxNlFaPNmobP2i+Im31slk9JuAusgWeIYO0mNhLJuLbxd8CCma2AZij3fBQ==}
+ peerDependencies:
+ antd: ^4.24.15 || ^5.11.2
+ react: '>=17.0.0'
+ react-dom: '>=17.0.0'
+
+ '@ant-design/pro-provider@2.16.2':
+ resolution: {integrity: sha512-0KmCH1EaOND787Jz6VRMYtLNZmqfT0JPjdUfxhyOxFfnBRfrjyfZgIa6CQoAJLEUMWv57PccWS8wRHVUUk2Yiw==}
+ peerDependencies:
+ antd: ^4.24.15 || ^5.11.2
+ react: '>=17.0.0'
+ react-dom: '>=17.0.0'
+
+ '@ant-design/pro-skeleton@2.2.1':
+ resolution: {integrity: sha512-3M2jNOZQZWEDR8pheY00OkHREfb0rquvFZLCa6DypGmiksiuuYuR9Y4iA82ZF+mva2FmpHekdwbje/GpbxqBeg==}
+ peerDependencies:
+ antd: ^4.24.15 || ^5.11.2
+ react: '>=17.0.0'
+ react-dom: '>=17.0.0'
+
+ '@ant-design/pro-table@3.21.0':
+ resolution: {integrity: sha512-sI81d3FYRv5sXamUc+M5CsHZ9CchuUQgOAPzo5H4oPAVL5h+mkYGRsBzPsxQX7khTNpWjrAtPoRm5ipx3vvWog==}
+ peerDependencies:
+ antd: ^4.24.15 || ^5.11.2
+ rc-field-form: '>=1.22.0'
+ react: '>=17.0.0'
+ react-dom: '>=17.0.0'
+
+ '@ant-design/pro-utils@2.18.0':
+ resolution: {integrity: sha512-8+ikyrN8L8a8Ph4oeHTOJEiranTj18+9+WHCHjKNdEfukI7Rjn8xpYdLJWb2AUJkb9d4eoAqjd5+k+7w81Df0w==}
+ peerDependencies:
+ antd: ^4.24.15 || ^5.11.2
+ react: '>=17.0.0'
+ react-dom: '>=17.0.0'
+
+ '@ant-design/react-slick@2.0.0':
+ resolution: {integrity: sha512-HMS9sRoEmZey8LsE/Yo6+klhlzU12PisjrVcydW3So7RdklyEd2qehyU6a7Yp+OYN72mgsYs3NFCyP2lCPFVqg==}
+ peerDependencies:
+ react: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ '@antv/algorithm@0.1.26':
+ resolution: {integrity: sha512-DVhcFSQ8YQnMNW34Mk8BSsfc61iC1sAnmcfYoXTAshYHuU50p/6b7x3QYaGctDNKWGvi1ub7mPcSY0bK+aN0qg==}
+
+ '@antv/component@2.1.11':
+ resolution: {integrity: sha512-dTdz8VAd3rpjOaGEZTluz82mtzrP4XCtNlNQyrxY7VNRNcjtvpTLDn57bUL2lRu1T+iklKvgbE2llMriWkq9vQ==}
+
+ '@antv/coord@0.4.7':
+ resolution: {integrity: sha512-UTbrMLhwJUkKzqJx5KFnSRpU3BqrdLORJbwUbHK2zHSCT3q3bjcFA//ZYLVfIlwqFDXp/hzfMyRtp0c77A9ZVA==}
+
+ '@antv/event-emitter@0.1.3':
+ resolution: {integrity: sha512-4ddpsiHN9Pd4UIlWuKVK1C4IiZIdbwQvy9i7DUSI3xNJ89FPUFt8lxDYj8GzzfdllV0NkJTRxnG+FvLk0llidg==}
+
+ '@antv/expr@1.0.2':
+ resolution: {integrity: sha512-vrfdmPHkTuiS5voVutKl2l06w1ihBh9A8SFdQPEE+2KMVpkymzGOF1eWpfkbGZ7tiFE15GodVdhhHomD/hdIwg==}
+
+ '@antv/g-canvas@2.2.0':
+ resolution: {integrity: sha512-h7zVBBo2aO64DuGKvq9sG+yTU3sCUb9DALCVm7nz8qGPs8hhLuFOkKPEzUDNfNYZGJUGzY8UDtJ3QRGRFcvEQg==}
+
+ '@antv/g-lite@2.7.0':
+ resolution: {integrity: sha512-uSzgHYa5bwR5L2Au7/5tsOhFmXKZKLPBH90+Q9bP9teVs5VT4kOAi0isPSpDI8uhdDC2/VrfTWu5K9HhWI6FWw==}
+
+ '@antv/g-math@3.1.0':
+ resolution: {integrity: sha512-DtN1Gj/yI0UiK18nSBsZX8RK0LszGwqfb+cBYWgE+ddyTm8dZnW4tPUhV7QXePsS6/A5hHC+JFpAAK7OEGo5ZQ==}
+
+ '@antv/g-plugin-dragndrop@2.1.1':
+ resolution: {integrity: sha512-+aesDUJVQDs6UJ2bOBbDlaGAPCfHmU0MbrMTlQlfpwNplWueqtgVAZ3L57oZ2ZGHRWUHiRwZGPjXMBM3O2LELw==}
+
+ '@antv/g-svg@2.1.1':
+ resolution: {integrity: sha512-gVzBkjqA8FzDTbkuIxj6L0Omz/X/hFbYLzK6alWr0sHTfywqP6czcjDUJU8DF2MRIY1Twy55uZYW4dqqLXOXXg==}
+
+ '@antv/g2-extension-plot@0.2.2':
+ resolution: {integrity: sha512-KJXCXO7as+h0hDqirGXf1omrNuYzQmY3VmBmp7lIvkepbQ7sz3pPwy895r1FWETGF3vTk5UeFcAF5yzzBHWgbw==}
+
+ '@antv/g2@5.4.8':
+ resolution: {integrity: sha512-IvgIpwmT4M5/QAd3Mn2WiHIDeBqFJ4WA2gcZhRRSZuZ2KmgCqZWZwwIT0hc+kIGxwYeDoCQqf//t6FMVu3ryBg==}
+
+ '@antv/g6-extension-react@0.2.6':
+ resolution: {integrity: sha512-JWOiWMz/r4jG+Nn2Y28LfohpxfUaf9M/0brLdKBshSVa4DraQFfQvA9OTIbzahLLoxIXsKKG2KteQ9QcXL26Kw==}
+ peerDependencies:
+ '@antv/g6': ^5.0.50
+ react: '>=16.8'
+ react-dom: '>=16.8'
+
+ '@antv/g6@5.0.51':
+ resolution: {integrity: sha512-/88LJDZ7FHKtpyJibXOnJWZ8gFRp32mLb8KzEFrMuiIC/dsZgTf/oYVw6L4tLKooPXfXqUtrJb2tWFMGR04EMg==}
+
+ '@antv/g@6.3.1':
+ resolution: {integrity: sha512-WYEKqy86LHB2PzTmrZXrIsIe+3Epeds2f68zceQ+BJtRoGki7Sy4IhlC8LrUMztgfT1t3d/0L745NWZwITroKA==}
+
+ '@antv/graphin@3.0.5':
+ resolution: {integrity: sha512-V/j8R8Ty44wUqxVIYLdpPuIO8WWCTIVq1eBJg5YRunL5t5o5qAFpC/qkQxslbBMWyKdIH0oWBnvHA74riGi7cw==}
+ peerDependencies:
+ react: ^18.0.0 || ^19.1.0
+ react-dom: ^18.0.0 || ^19.1.0
+
+ '@antv/graphlib@2.0.4':
+ resolution: {integrity: sha512-zc/5oQlsdk42Z0ib1mGklwzhJ5vczLFiPa1v7DgJkTbgJ2YxRh9xdarf86zI49sKVJmgbweRpJs7Nu5bIiwv4w==}
+
+ '@antv/hierarchy@0.7.1':
+ resolution: {integrity: sha512-7r22r+HxfcRZp79ZjGmsn97zgC1Iajrv0Mm9DIgx3lPfk+Kme2MG/+EKdZj1iEBsN0rJRzjWVPGL5YrBdVHchw==}
+
+ '@antv/layout@1.2.14-beta.9':
+ resolution: {integrity: sha512-wPlwBFMtq2lWZFc89/7Lzb8fjHnyKVZZ9zBb2h+zZIP0YWmVmHRE8+dqCiPKOyOGUXEdDtn813f1g107dCHZlg==}
+
+ '@antv/scale@0.4.16':
+ resolution: {integrity: sha512-5wg/zB5kXHxpTV5OYwJD3ja6R8yTiqIOkjOhmpEJiowkzRlbEC/BOyMvNUq5fqFIHnMCE9woO7+c3zxEQCKPjw==}
+
+ '@antv/scale@0.5.2':
+ resolution: {integrity: sha512-rTHRAwvpHWC5PGZF/mJ2ZuTDqwwvVBDRph0Uu5PV9BXwzV7K8+9lsqGJ+XHVLxe8c6bKog5nlzvV/dcYb0d5Ow==}
+
+ '@antv/util@2.0.17':
+ resolution: {integrity: sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==}
+
+ '@antv/util@3.3.11':
+ resolution: {integrity: sha512-FII08DFM4ABh2q5rPYdr0hMtKXRgeZazvXaFYCs7J7uTcWDHUhczab2qOCJLNDugoj8jFag1djb7wS9ehaRYBg==}
+
+ '@antv/vendor@1.0.11':
+ resolution: {integrity: sha512-LmhPEQ+aapk3barntaiIxJ5VHno/Tyab2JnfdcPzp5xONh/8VSfed4bo/9xKo5HcUAEydko38vYLfj6lJliLiw==}
+
+ '@babel/code-frame@7.29.0':
+ resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/compat-data@7.29.0':
+ resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.29.0':
+ resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.29.1':
+ resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.28.6':
+ resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-globals@7.28.0':
+ resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.28.6':
+ resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-transforms@7.28.6':
+ resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-string-parser@7.27.1':
+ resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.28.5':
+ resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-option@7.27.1':
+ resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.29.2':
+ resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.29.2':
+ resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/runtime@7.29.2':
+ resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/template@7.28.6':
+ resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.29.0':
+ resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.29.0':
+ resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
+ engines: {node: '>=6.9.0'}
+
+ '@chenshuai2144/sketch-color@1.0.9':
+ resolution: {integrity: sha512-obzSy26cb7Pm7OprWyVpgMpIlrZpZ0B7vbrU0RMbvRg0YAI890S5Xy02Aj1Nhl4+KTbi1lVYHt6HQP8Hm9s+1w==}
+ peerDependencies:
+ react: '>=16.12.0'
+
+ '@ctrl/tinycolor@3.6.1':
+ resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==}
+ engines: {node: '>=10'}
+
+ '@dnd-kit/accessibility@3.1.1':
+ resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==}
+ peerDependencies:
+ react: '>=16.8.0'
+
+ '@dnd-kit/core@6.3.1':
+ resolution: {integrity: sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@dnd-kit/modifiers@6.0.1':
+ resolution: {integrity: sha512-rbxcsg3HhzlcMHVHWDuh9LCjpOVAgqbV78wLGI8tziXY3+qcMQ61qVXIvNKQFuhj75dSfD+o+PYZQ/NUk2A23A==}
+ peerDependencies:
+ '@dnd-kit/core': ^6.0.6
+ react: '>=16.8.0'
+
+ '@dnd-kit/sortable@7.0.2':
+ resolution: {integrity: sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==}
+ peerDependencies:
+ '@dnd-kit/core': ^6.0.7
+ react: '>=16.8.0'
+
+ '@dnd-kit/utilities@3.2.2':
+ resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==}
+ peerDependencies:
+ react: '>=16.8.0'
+
+ '@emnapi/core@1.9.1':
+ resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==}
+
+ '@emnapi/runtime@1.9.1':
+ resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==}
+
+ '@emnapi/wasi-threads@1.2.0':
+ resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==}
+
+ '@emotion/hash@0.8.0':
+ resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==}
+
+ '@emotion/is-prop-valid@1.4.0':
+ resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==}
+
+ '@emotion/memoize@0.9.0':
+ resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==}
+
+ '@emotion/unitless@0.10.0':
+ resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==}
+
+ '@emotion/unitless@0.7.5':
+ resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==}
+
+ '@eslint-community/eslint-utils@4.9.1':
+ resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+ '@eslint-community/regexpp@4.12.2':
+ resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ '@eslint/config-array@0.21.2':
+ resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/config-helpers@0.4.2':
+ resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/core@0.17.0':
+ resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/eslintrc@3.3.5':
+ resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/js@9.39.4':
+ resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/object-schema@2.1.7':
+ resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/plugin-kit@0.4.1':
+ resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@humanfs/core@0.19.1':
+ resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/node@0.16.7':
+ resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+
+ '@humanwhocodes/retry@0.4.3':
+ resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
+ engines: {node: '>=18.18'}
+
+ '@jridgewell/gen-mapping@0.3.13':
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
+ '@jridgewell/remapping@2.3.5':
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/source-map@0.3.11':
+ resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==}
+
+ '@jridgewell/sourcemap-codec@1.5.5':
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+
+ '@naoak/workerize-transferable@0.1.0':
+ resolution: {integrity: sha512-fDLfuP71IPNP5+zSfxFb52OHgtjZvauRJWbVnpzQ7G7BjcbLjTny0OW1d3ZO806XKpLWNKmeeW3MhE0sy8iwYQ==}
+ peerDependencies:
+ workerize-loader: '*'
+
+ '@napi-rs/wasm-runtime@1.1.2':
+ resolution: {integrity: sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==}
+ peerDependencies:
+ '@emnapi/core': ^1.7.1
+ '@emnapi/runtime': ^1.7.1
+
+ '@oxc-project/types@0.122.0':
+ resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==}
+
+ '@rc-component/async-validator@5.1.0':
+ resolution: {integrity: sha512-n4HcR5siNUXRX23nDizbZBQPO0ZM/5oTtmKZ6/eqL0L2bo747cklFdZGRN2f+c9qWGICwDzrhW0H7tE9PptdcA==}
+ engines: {node: '>=14.x'}
+
+ '@rc-component/cascader@1.14.0':
+ resolution: {integrity: sha512-Ip9356xwZUR2nbW5PRVGif4B/bDve4pLa/N+PGbvBaTnjbvmN4PFMBGQSmlDlzKP1ovxaYMvwF/dI9lXNLT4iQ==}
+ peerDependencies:
+ react: '>=18.0.0'
+ react-dom: '>=18.0.0'
+
+ '@rc-component/checkbox@2.0.0':
+ resolution: {integrity: sha512-3CXGPpAR9gsPKeO2N78HAPOzU30UdemD6HGJoWVJOpa6WleaGB5kzZj3v6bdTZab31YuWgY/RxV3VKPctn0DwQ==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/collapse@1.2.0':
+ resolution: {integrity: sha512-ZRYSKSS39qsFx93p26bde7JUZJshsUBEQRlRXPuJYlAiNX0vyYlF5TsAm8JZN3LcF8XvKikdzPbgAtXSbkLUkw==}
+ peerDependencies:
+ react: '>=18.0.0'
+ react-dom: '>=18.0.0'
+
+ '@rc-component/color-picker@3.1.1':
+ resolution: {integrity: sha512-OHaCHLHszCegdXmIq2ZRIZBN/EtpT6Wm8SG/gpzLATHbVKc/avvuKi+zlOuk05FTWvgaMmpxAko44uRJ3M+2pg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/context@2.0.1':
+ resolution: {integrity: sha512-HyZbYm47s/YqtP6pKXNMjPEMaukyg7P0qVfgMLzr7YiFNMHbK2fKTAGzms9ykfGHSfyf75nBbgWw+hHkp+VImw==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/dialog@1.8.4':
+ resolution: {integrity: sha512-Ay6PM7phkTkquplG8fWfUGFZ2GTLx9diTl4f0d8Eqxd7W1u1KjE9AQooFQHOHnhZf0Ya3z51+5EKCWHmt/dNEw==}
+ peerDependencies:
+ react: '>=18.0.0'
+ react-dom: '>=18.0.0'
+
+ '@rc-component/drawer@1.4.2':
+ resolution: {integrity: sha512-1ib+fZEp6FBu+YvcIktm+nCQ+Q+qIpwpoaJH6opGr4ofh2QMq+qdr5DLC4oCf5qf3pcWX9lUWPYX652k4ini8Q==}
+ peerDependencies:
+ react: '>=18.0.0'
+ react-dom: '>=18.0.0'
+
+ '@rc-component/dropdown@1.0.2':
+ resolution: {integrity: sha512-6PY2ecUSYhDPhkNHHb4wfeAya04WhpmUSKzdR60G+kMNVUCX2vjT/AgTS0Lz0I/K6xrPMJ3enQbwVpeN3sHCgg==}
+ peerDependencies:
+ react: '>=16.11.0'
+ react-dom: '>=16.11.0'
+
+ '@rc-component/form@1.8.0':
+ resolution: {integrity: sha512-eUD5KKYnIZWmJwRA0vnyO/ovYUfHGU1svydY1OrqU5fw8Oz9Tdqvxvrlh0wl6xI/EW69dT7II49xpgOWzK3T5A==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/image@1.8.0':
+ resolution: {integrity: sha512-Dr41bFevLB5NgVaJhEUmNvbEf+ynAhim6W98ZW2xvCsdFISc2TYP4ZvCVdie3eaZdum2kieVcvpNHu+UrzAAHA==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/input-number@1.6.2':
+ resolution: {integrity: sha512-Gjcq7meZlCOiWN1t1xCC+7/s85humHVokTBI7PJgTfoyw5OWF74y3e6P8PHX104g9+b54jsodFIzyaj6p8LI9w==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/input@1.1.2':
+ resolution: {integrity: sha512-Q61IMR47piUBudgixJ30CciKIy9b1H95qe7GgEKOmSJVJXvFRWJllJfQry9tif+MX2cWFXWJf/RXz4kaCeq/Fg==}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+
+ '@rc-component/mentions@1.6.0':
+ resolution: {integrity: sha512-KIkQNP6habNuTsLhUv0UGEOwG67tlmE7KNIJoQZZNggEZl5lQJTytFDb69sl5CK3TDdISCTjKP3nGEBKgT61CQ==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/menu@1.2.0':
+ resolution: {integrity: sha512-VWwDuhvYHSnTGj4n6bV3ISrLACcPAzdPOq3d0BzkeiM5cve8BEYfvkEhNoM0PLzv51jpcejeyrLXeMVIJ+QJlg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/mini-decimal@1.1.3':
+ resolution: {integrity: sha512-bk/FJ09fLf+NLODMAFll6CfYrHPBioTedhW6lxDBuuWucJEqFUd4l/D/5JgIi3dina6sYahB8iuPAZTNz2pMxw==}
+ engines: {node: '>=8.x'}
+
+ '@rc-component/motion@1.3.2':
+ resolution: {integrity: sha512-itfd+GztzJYAb04Z4RkEub1TbJAfZc2Iuy8p44U44xD1F5+fNYFKI3897ijlbIyfvXkTmMm+KGcjkQQGMHywEQ==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/mutate-observer@2.0.1':
+ resolution: {integrity: sha512-AyarjoLU5YlxuValRi+w8JRH2Z84TBbFO2RoGWz9d8bSu0FqT8DtugH3xC3BV7mUwlmROFauyWuXFuq4IFbH+w==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/notification@1.2.0':
+ resolution: {integrity: sha512-OX3J+zVU7rvoJCikjrfW7qOUp7zlDeFBK2eA3SFbGSkDqo63Sl4Ss8A04kFP+fxHSxMDIS9jYVEZtU1FNCFuBA==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/overflow@1.0.0':
+ resolution: {integrity: sha512-GSlBeoE0XTBi5cf3zl8Qh7Uqhn7v8RrlJ8ajeVpEkNe94HWy5l5BQ0Mwn2TVUq9gdgbfEMUmTX7tJFAg7mz0Rw==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/pagination@1.2.0':
+ resolution: {integrity: sha512-YcpUFE8dMLfSo6OARJlK6DbHHvrxz7pMGPGmC/caZSJJz6HRKHC1RPP001PRHCvG9Z/veD039uOQmazVuLJzlw==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/picker@1.9.1':
+ resolution: {integrity: sha512-9FBYYsvH3HMLICaPDA/1Th5FLaDkFa7qAtangIdlhKb3ZALaR745e9PsOhheJb6asS4QXc12ffiAcjdkZ4C5/g==}
+ engines: {node: '>=12.x'}
+ peerDependencies:
+ date-fns: '>= 2.x'
+ dayjs: '>= 1.x'
+ luxon: '>= 3.x'
+ moment: '>= 2.x'
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ peerDependenciesMeta:
+ date-fns:
+ optional: true
+ dayjs:
+ optional: true
+ luxon:
+ optional: true
+ moment:
+ optional: true
+
+ '@rc-component/portal@2.2.0':
+ resolution: {integrity: sha512-oc6FlA+uXCMiwArHsJyHcIkX4q6uKyndrPol2eWX8YPkAnztHOPsFIRtmWG4BMlGE5h7YIRE3NiaJ5VS8Lb1QQ==}
+ engines: {node: '>=12.x'}
+ peerDependencies:
+ react: '>=18.0.0'
+ react-dom: '>=18.0.0'
+
+ '@rc-component/progress@1.0.2':
+ resolution: {integrity: sha512-WZUnH9eGxH1+xodZKqdrHke59uyGZSWgj5HBM5Kwk5BrTMuAORO7VJ2IP5Qbm9aH3n9x3IcesqHHR0NWPBC7fQ==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/qrcode@1.1.1':
+ resolution: {integrity: sha512-LfLGNymzKdUPjXUbRP+xOhIWY4jQ+YMj5MmWAcgcAq1Ij8XP7tRmAXqyuv96XvLUBE/5cA8hLFl9eO1JQMujrA==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/rate@1.0.1':
+ resolution: {integrity: sha512-bkXxeBqDpl5IOC7yL7GcSYjQx9G8H+6kLYQnNZWeBYq2OYIv1MONd6mqKTjnnJYpV0cQIU2z3atdW0j1kttpTw==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/resize-observer@1.1.2':
+ resolution: {integrity: sha512-t/Bb0W8uvL4PYKAB3YcChC+DlHh0Wt5kM7q/J+0qpVEUMLe7Hk5zuvc9km0hMnTFPSx5Z7Wu/fzCLN6erVLE8Q==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/segmented@1.3.0':
+ resolution: {integrity: sha512-5J/bJ01mbDnoA6P/FW8SxUvKn+OgUSTZJPzCNnTBntG50tzoP7DydGhqxp7ggZXZls7me3mc2EQDXakU3iTVFg==}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+
+ '@rc-component/select@1.6.15':
+ resolution: {integrity: sha512-SyVCWnqxCQZZcQvQJ/CxSjx2bGma6ds/HtnpkIfZVnt6RoEgbqUmHgD6vrzNarNXwbLXerwVzWwq8F3d1sst7g==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '*'
+ react-dom: '*'
+
+ '@rc-component/slider@1.0.1':
+ resolution: {integrity: sha512-uDhEPU1z3WDfCJhaL9jfd2ha/Eqpdfxsn0Zb0Xcq1NGQAman0TWaR37OWp2vVXEOdV2y0njSILTMpTfPV1454g==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/steps@1.2.2':
+ resolution: {integrity: sha512-/yVIZ00gDYYPHSY0JP+M+s3ZvuXLu2f9rEjQqiUDs7EcYsUYrpJ/1bLj9aI9R7MBR3fu/NGh6RM9u2qGfqp+Nw==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/switch@1.0.3':
+ resolution: {integrity: sha512-Jgi+EbOBquje/XNdofr7xbJQZPYJP+BlPfR0h+WN4zFkdtB2EWqEfvkXJWeipflwjWip0/17rNbxEAqs8hVHfw==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/table@1.9.1':
+ resolution: {integrity: sha512-FVI5ZS/GdB3BcgexfCYKi3iHhZS3Fr59EtsxORszYGrfpH1eWr33eDNSYkVfLI6tfJ7vftJDd9D5apfFWqkdJg==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=18.0.0'
+ react-dom: '>=18.0.0'
+
+ '@rc-component/tabs@1.7.0':
+ resolution: {integrity: sha512-J48cs2iBi7Ho3nptBxxIqizEliUC+ExE23faspUQKGQ550vaBlv3aGF8Epv/UB1vFWeoJDTW/dNzgIU0Qj5i/w==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/textarea@1.1.2':
+ resolution: {integrity: sha512-9rMUEODWZDMovfScIEHXWlVZuPljZ2pd1LKNjslJVitn4SldEzq5vO1CL3yy3Dnib6zZal2r2DPtjy84VVpF6A==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/tooltip@1.4.0':
+ resolution: {integrity: sha512-8Rx5DCctIlLI4raR0I0xHjVTf1aF48+gKCNeAAo5bmF5VoR5YED+A/XEqzXv9KKqrJDRcd3Wndpxh2hyzrTtSg==}
+ peerDependencies:
+ react: '>=18.0.0'
+ react-dom: '>=18.0.0'
+
+ '@rc-component/tour@2.3.0':
+ resolution: {integrity: sha512-K04K9r32kUC+auBSQfr+Fss4SpSIS9JGe56oq/ALAX0p+i2ylYOI1MgR83yBY7v96eO6ZFXcM/igCQmubps0Ow==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/tree-select@1.8.0':
+ resolution: {integrity: sha512-iYsPq3nuLYvGqdvFAW+l+I9ASRIOVbMXyA8FGZg2lGym/GwkaWeJGzI4eJ7c9IOEhRj0oyfIN4S92Fl3J05mjQ==}
+ peerDependencies:
+ react: '*'
+ react-dom: '*'
+
+ '@rc-component/tree@1.2.4':
+ resolution: {integrity: sha512-5Gli43+m4R7NhpYYz3Z61I6LOw9yI6CNChxgVtvrO6xB1qML7iE6QMLVMB3+FTjo2yF6uFdAHtqWPECz/zbX5w==}
+ engines: {node: '>=10.x'}
+ peerDependencies:
+ react: '*'
+ react-dom: '*'
+
+ '@rc-component/trigger@3.9.0':
+ resolution: {integrity: sha512-X8btpwfrT27AgrZVOz4swclhEHTZcqaHeQMXXBgveagOiakTa36uObXbdwerXffgV8G9dH1fAAE0DHtVQs8EHg==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=18.0.0'
+ react-dom: '>=18.0.0'
+
+ '@rc-component/upload@1.1.0':
+ resolution: {integrity: sha512-LIBV90mAnUE6VK5N4QvForoxZc4XqEYZimcp7fk+lkE4XwHHyJWxpIXQQwMU8hJM+YwBbsoZkGksL1sISWHQxw==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/util@1.10.0':
+ resolution: {integrity: sha512-aY9GLBuiUdpyfIUpAWSYer4Tu3mVaZCo5A0q9NtXcazT3MRiI3/WNHCR+DUn5VAtR6iRRf0ynCqQUcHli5UdYw==}
+ peerDependencies:
+ react: '>=18.0.0'
+ react-dom: '>=18.0.0'
+
+ '@rc-component/virtual-list@1.0.2':
+ resolution: {integrity: sha512-uvTol/mH74FYsn5loDGJxo+7kjkO4i+y4j87Re1pxJBs0FaeuMuLRzQRGaXwnMcV1CxpZLi2Z56Rerj2M00fjQ==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rolldown/binding-android-arm64@1.0.0-rc.12':
+ resolution: {integrity: sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [android]
+
+ '@rolldown/binding-darwin-arm64@1.0.0-rc.12':
+ resolution: {integrity: sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rolldown/binding-darwin-x64@1.0.0-rc.12':
+ resolution: {integrity: sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rolldown/binding-freebsd-x64@1.0.0-rc.12':
+ resolution: {integrity: sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12':
+ resolution: {integrity: sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
+
+ '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12':
+ resolution: {integrity: sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12':
+ resolution: {integrity: sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12':
+ resolution: {integrity: sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12':
+ resolution: {integrity: sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
+ '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12':
+ resolution: {integrity: sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rolldown/binding-linux-x64-musl@1.0.0-rc.12':
+ resolution: {integrity: sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@rolldown/binding-openharmony-arm64@1.0.0-rc.12':
+ resolution: {integrity: sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@rolldown/binding-wasm32-wasi@1.0.0-rc.12':
+ resolution: {integrity: sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+
+ '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12':
+ resolution: {integrity: sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12':
+ resolution: {integrity: sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
+
+ '@rolldown/pluginutils@1.0.0-rc.12':
+ resolution: {integrity: sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==}
+
+ '@rolldown/pluginutils@1.0.0-rc.7':
+ resolution: {integrity: sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==}
+
+ '@tanstack/query-core@5.95.2':
+ resolution: {integrity: sha512-o4T8vZHZET4Bib3jZ/tCW9/7080urD4c+0/AUaYVpIqOsr7y0reBc1oX3ttNaSW5mYyvZHctiQ/UOP2PfdmFEQ==}
+
+ '@tanstack/react-query@5.95.2':
+ resolution: {integrity: sha512-/wGkvLj/st5Ud1Q76KF1uFxScV7WeqN1slQx5280ycwAyYkIPGaRZAEgHxe3bjirSd5Zpwkj6zNcR4cqYni/ZA==}
+ peerDependencies:
+ react: ^18 || ^19
+
+ '@tybys/wasm-util@0.10.1':
+ resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
+
+ '@types/d3-array@3.2.2':
+ resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==}
+
+ '@types/d3-color@3.1.3':
+ resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==}
+
+ '@types/d3-dispatch@3.0.7':
+ resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==}
+
+ '@types/d3-dsv@3.0.7':
+ resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==}
+
+ '@types/d3-ease@3.0.2':
+ resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==}
+
+ '@types/d3-fetch@3.0.7':
+ resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==}
+
+ '@types/d3-force@3.0.10':
+ resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==}
+
+ '@types/d3-format@3.0.4':
+ resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==}
+
+ '@types/d3-geo@3.1.0':
+ resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==}
+
+ '@types/d3-hierarchy@3.1.7':
+ resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==}
+
+ '@types/d3-interpolate@3.0.4':
+ resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==}
+
+ '@types/d3-path@3.1.1':
+ resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==}
+
+ '@types/d3-quadtree@3.0.6':
+ resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==}
+
+ '@types/d3-random@3.0.3':
+ resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==}
+
+ '@types/d3-scale-chromatic@3.1.0':
+ resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==}
+
+ '@types/d3-scale@4.0.9':
+ resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==}
+
+ '@types/d3-shape@3.1.8':
+ resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==}
+
+ '@types/d3-time@3.0.4':
+ resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==}
+
+ '@types/d3-timer@3.0.2':
+ resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==}
+
+ '@types/eslint-scope@3.7.7':
+ resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==}
+
+ '@types/eslint@9.6.1':
+ resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==}
+
+ '@types/estree@1.0.8':
+ resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+
+ '@types/geojson@7946.0.16':
+ resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/node@24.12.0':
+ resolution: {integrity: sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==}
+
+ '@types/react-dom@19.2.3':
+ resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
+ peerDependencies:
+ '@types/react': ^19.2.0
+
+ '@types/react@19.2.14':
+ resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==}
+
+ '@types/stylis@4.2.7':
+ resolution: {integrity: sha512-VgDNokpBoKF+wrdvhAAfS55OMQpL6QRglwTwNC3kIgBrzZxA4WsFj+2eLfEA/uMUDzBcEhYmjSbwQakn/i3ajA==}
+
+ '@typescript-eslint/eslint-plugin@8.57.2':
+ resolution: {integrity: sha512-NZZgp0Fm2IkD+La5PR81sd+g+8oS6JwJje+aRWsDocxHkjyRw0J5L5ZTlN3LI1LlOcGL7ph3eaIUmTXMIjLk0w==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^8.57.2
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/parser@8.57.2':
+ resolution: {integrity: sha512-30ScMRHIAD33JJQkgfGW1t8CURZtjc2JpTrq5n2HFhOefbAhb7ucc7xJwdWcrEtqUIYJ73Nybpsggii6GtAHjA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/project-service@8.57.2':
+ resolution: {integrity: sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/scope-manager@8.57.2':
+ resolution: {integrity: sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/tsconfig-utils@8.57.2':
+ resolution: {integrity: sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/type-utils@8.57.2':
+ resolution: {integrity: sha512-Co6ZCShm6kIbAM/s+oYVpKFfW7LBc6FXoPXjTRQ449PPNBY8U0KZXuevz5IFuuUj2H9ss40atTaf9dlGLzbWZg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/types@8.57.2':
+ resolution: {integrity: sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/typescript-estree@8.57.2':
+ resolution: {integrity: sha512-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/utils@8.57.2':
+ resolution: {integrity: sha512-krRIbvPK1ju1WBKIefiX+bngPs+odIQUtR7kymzPfo1POVw3jlF+nLkmexdSSd4UCbDcQn+wMBATOOmpBbqgKg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/visitor-keys@8.57.2':
+ resolution: {integrity: sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@umijs/route-utils@4.0.3':
+ resolution: {integrity: sha512-zPEcYhl1cSfkSRDzzGgoD1mDvGjxoOTJFvkn55srfgdQ3NZe2ZMCScCU6DEnOxuKP1XDVf8pqyqCDVd2+RCQIw==}
+
+ '@umijs/use-params@1.0.9':
+ resolution: {integrity: sha512-QlN0RJSBVQBwLRNxbxjQ5qzqYIGn+K7USppMoIOVlf7fxXHsnQZ2bEsa6Pm74bt6DVQxpUE8HqvdStn6Y9FV1w==}
+ peerDependencies:
+ react: '*'
+
+ '@vitejs/plugin-react@6.0.1':
+ resolution: {integrity: sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ peerDependencies:
+ '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0
+ babel-plugin-react-compiler: ^1.0.0
+ vite: ^8.0.0
+ peerDependenciesMeta:
+ '@rolldown/plugin-babel':
+ optional: true
+ babel-plugin-react-compiler:
+ optional: true
+
+ '@webassemblyjs/ast@1.14.1':
+ resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==}
+
+ '@webassemblyjs/floating-point-hex-parser@1.13.2':
+ resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==}
+
+ '@webassemblyjs/helper-api-error@1.13.2':
+ resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==}
+
+ '@webassemblyjs/helper-buffer@1.14.1':
+ resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==}
+
+ '@webassemblyjs/helper-numbers@1.13.2':
+ resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==}
+
+ '@webassemblyjs/helper-wasm-bytecode@1.13.2':
+ resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==}
+
+ '@webassemblyjs/helper-wasm-section@1.14.1':
+ resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==}
+
+ '@webassemblyjs/ieee754@1.13.2':
+ resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==}
+
+ '@webassemblyjs/leb128@1.13.2':
+ resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==}
+
+ '@webassemblyjs/utf8@1.13.2':
+ resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==}
+
+ '@webassemblyjs/wasm-edit@1.14.1':
+ resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==}
+
+ '@webassemblyjs/wasm-gen@1.14.1':
+ resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==}
+
+ '@webassemblyjs/wasm-opt@1.14.1':
+ resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==}
+
+ '@webassemblyjs/wasm-parser@1.14.1':
+ resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==}
+
+ '@webassemblyjs/wast-printer@1.14.1':
+ resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==}
+
+ '@xtuc/ieee754@1.2.0':
+ resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
+
+ '@xtuc/long@4.2.2':
+ resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
+
+ acorn-import-phases@1.0.4:
+ resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==}
+ engines: {node: '>=10.13.0'}
+ peerDependencies:
+ acorn: ^8.14.0
+
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ acorn@8.16.0:
+ resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ add-dom-event-listener@1.1.0:
+ resolution: {integrity: sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==}
+
+ ajv-formats@2.1.1:
+ resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv-keywords@5.1.0:
+ resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==}
+ peerDependencies:
+ ajv: ^8.8.2
+
+ ajv@6.14.0:
+ resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==}
+
+ ajv@8.18.0:
+ resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ antd@6.3.4:
+ resolution: {integrity: sha512-Bu6JivPP7bFfYIdVj+61dxhwSOz+A3m0W7PlDasFGC3H3sNMYQ9gJXZoo11/rQh7pTlOQa351q5Ig/zjI98XYw==}
+ peerDependencies:
+ react: '>=18.0.0'
+ react-dom: '>=18.0.0'
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ asynckit@0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+ axios@1.14.0:
+ resolution: {integrity: sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ balanced-match@4.0.4:
+ resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
+ engines: {node: 18 || 20 || >=22}
+
+ base64-arraybuffer@1.0.2:
+ resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==}
+ engines: {node: '>= 0.6.0'}
+
+ baseline-browser-mapping@2.10.12:
+ resolution: {integrity: sha512-qyq26DxfY4awP2gIRXhhLWfwzwI+N5Nxk6iQi8EFizIaWIjqicQTE4sLnZZVdeKPRcVNoJOkkpfzoIYuvCKaIQ==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ big.js@5.2.2:
+ resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
+
+ brace-expansion@1.1.13:
+ resolution: {integrity: sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==}
+
+ brace-expansion@5.0.5:
+ resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==}
+ engines: {node: 18 || 20 || >=22}
+
+ browserslist@4.28.1:
+ resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ bubblesets-js@2.3.4:
+ resolution: {integrity: sha512-DyMjHmpkS2+xcFNtyN00apJYL3ESdp9fTrkDr5+9Qg/GPqFmcWgGsK1akZnttE1XFxJ/VMy4DNNGMGYtmFp1Sg==}
+
+ buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+ call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ engines: {node: '>= 0.4'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ camelize@1.0.1:
+ resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==}
+
+ caniuse-lite@1.0.30001782:
+ resolution: {integrity: sha512-dZcaJLJeDMh4rELYFw1tvSn1bhZWYFOt468FcbHHxx/Z/dFidd1I6ciyFdi3iwfQCyOjqo9upF6lGQYtMiJWxw==}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ chrome-trace-event@1.0.4:
+ resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==}
+ engines: {node: '>=6.0'}
+
+ classnames@2.5.1:
+ resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==}
+
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ color-string@1.9.1:
+ resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
+
+ combined-stream@1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+
+ comlink@4.4.2:
+ resolution: {integrity: sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==}
+
+ commander@2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
+ commander@7.2.0:
+ resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+ engines: {node: '>= 10'}
+
+ compute-scroll-into-view@3.1.1:
+ resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ cookie@1.1.1:
+ resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==}
+ engines: {node: '>=18'}
+
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
+ css-color-keywords@1.0.0:
+ resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==}
+ engines: {node: '>=4'}
+
+ css-line-break@2.1.0:
+ resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==}
+
+ css-to-react-native@3.2.0:
+ resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==}
+
+ csstype@3.2.3:
+ resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
+
+ d3-array@3.2.4:
+ resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==}
+ engines: {node: '>=12'}
+
+ d3-binarytree@1.0.2:
+ resolution: {integrity: sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==}
+
+ d3-color@3.1.0:
+ resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
+ engines: {node: '>=12'}
+
+ d3-dispatch@3.0.1:
+ resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==}
+ engines: {node: '>=12'}
+
+ d3-dsv@3.0.1:
+ resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==}
+ engines: {node: '>=12'}
+ hasBin: true
+
+ d3-ease@3.0.1:
+ resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
+ engines: {node: '>=12'}
+
+ d3-fetch@3.0.1:
+ resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==}
+ engines: {node: '>=12'}
+
+ d3-force-3d@3.0.6:
+ resolution: {integrity: sha512-4tsKHUPLOVkyfEffZo1v6sFHvGFwAIIjt/W8IThbp08DYAsXZck+2pSHEG5W1+gQgEvFLdZkYvmJAbRM2EzMnA==}
+ engines: {node: '>=12'}
+
+ d3-force@3.0.0:
+ resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==}
+ engines: {node: '>=12'}
+
+ d3-format@3.1.2:
+ resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==}
+ engines: {node: '>=12'}
+
+ d3-geo-projection@4.0.0:
+ resolution: {integrity: sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==}
+ engines: {node: '>=12'}
+ hasBin: true
+
+ d3-geo@3.1.1:
+ resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==}
+ engines: {node: '>=12'}
+
+ d3-hierarchy@3.1.2:
+ resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==}
+ engines: {node: '>=12'}
+
+ d3-interpolate@3.0.1:
+ resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
+ engines: {node: '>=12'}
+
+ d3-octree@1.1.0:
+ resolution: {integrity: sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A==}
+
+ d3-path@3.1.0:
+ resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==}
+ engines: {node: '>=12'}
+
+ d3-quadtree@3.0.1:
+ resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==}
+ engines: {node: '>=12'}
+
+ d3-random@3.0.1:
+ resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==}
+ engines: {node: '>=12'}
+
+ d3-regression@1.3.10:
+ resolution: {integrity: sha512-PF8GWEL70cHHWpx2jUQXc68r1pyPHIA+St16muk/XRokETzlegj5LriNKg7o4LR0TySug4nHYPJNNRz/W+/Niw==}
+
+ d3-scale-chromatic@3.1.0:
+ resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==}
+ engines: {node: '>=12'}
+
+ d3-scale@4.0.2:
+ resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==}
+ engines: {node: '>=12'}
+
+ d3-shape@3.2.0:
+ resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==}
+ engines: {node: '>=12'}
+
+ d3-time-format@4.1.0:
+ resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==}
+ engines: {node: '>=12'}
+
+ d3-time@3.1.0:
+ resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==}
+ engines: {node: '>=12'}
+
+ d3-timer@3.0.1:
+ resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
+ engines: {node: '>=12'}
+
+ dagre@0.8.5:
+ resolution: {integrity: sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==}
+
+ dayjs@1.11.20:
+ resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==}
+
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+ delayed-stream@1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
+ detect-libc@2.1.2:
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
+ engines: {node: '>=8'}
+
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
+ electron-to-chromium@1.5.328:
+ resolution: {integrity: sha512-QNQ5l45DzYytThO21403XN3FvK0hOkWDG8viNf6jqS42msJ8I4tGDSpBCgvDRRPnkffafiwAym2X2eHeGD2V0w==}
+
+ emojis-list@3.0.0:
+ resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
+ engines: {node: '>= 4'}
+
+ enhanced-resolve@5.20.1:
+ resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==}
+ engines: {node: '>=10.13.0'}
+
+ es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ es-module-lexer@2.0.0:
+ resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==}
+
+ es-object-atoms@1.1.1:
+ resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+ engines: {node: '>= 0.4'}
+
+ es-set-tostringtag@2.1.0:
+ resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
+ engines: {node: '>= 0.4'}
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ eslint-plugin-react-hooks@7.0.1:
+ resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0
+
+ eslint-plugin-react-refresh@0.5.2:
+ resolution: {integrity: sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==}
+ peerDependencies:
+ eslint: ^9 || ^10
+
+ eslint-scope@5.1.1:
+ resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
+ engines: {node: '>=8.0.0'}
+
+ eslint-scope@8.4.0:
+ resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-visitor-keys@4.2.1:
+ resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint-visitor-keys@5.0.1:
+ resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ eslint@9.39.4:
+ resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ hasBin: true
+ peerDependencies:
+ jiti: '*'
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+
+ espree@10.4.0:
+ resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ esquery@1.7.0:
+ resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==}
+ engines: {node: '>=0.10'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@4.3.0:
+ resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+
+ eventemitter3@5.0.4:
+ resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==}
+
+ events@3.3.0:
+ resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+ engines: {node: '>=0.8.x'}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+ fast-uri@3.1.0:
+ resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==}
+
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
+ fecha@4.2.3:
+ resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==}
+
+ file-entry-cache@8.0.0:
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+ engines: {node: '>=16.0.0'}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ flat-cache@4.0.1:
+ resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+ engines: {node: '>=16'}
+
+ flatted@3.4.2:
+ resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==}
+
+ flru@1.0.2:
+ resolution: {integrity: sha512-kWyh8ADvHBFz6ua5xYOPnUroZTT/bwWfrCeL0Wj1dzG4/YOmOcfJ99W8dOVyyynJN35rZ9aCOtHChqQovV7yog==}
+ engines: {node: '>=6'}
+
+ follow-redirects@1.15.11:
+ resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+
+ form-data@4.0.5:
+ resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==}
+ engines: {node: '>= 6'}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ get-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
+ gl-matrix@3.4.4:
+ resolution: {integrity: sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==}
+
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
+ glob-to-regexp@0.4.1:
+ resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
+
+ globals@14.0.0:
+ resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
+ engines: {node: '>=18'}
+
+ globals@17.4.0:
+ resolution: {integrity: sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==}
+ engines: {node: '>=18'}
+
+ gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ graphlib@2.1.8:
+ resolution: {integrity: sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+ engines: {node: '>= 0.4'}
+
+ has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+ engines: {node: '>= 0.4'}
+
+ hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+
+ hermes-estree@0.25.1:
+ resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==}
+
+ hermes-parser@0.25.1:
+ resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==}
+
+ html2canvas@1.4.1:
+ resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==}
+ engines: {node: '>=8.0.0'}
+
+ iconv-lite@0.6.3:
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+ engines: {node: '>=0.10.0'}
+
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+
+ ignore@7.0.5:
+ resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
+ engines: {node: '>= 4'}
+
+ import-fresh@3.3.1:
+ resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
+ engines: {node: '>=6'}
+
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+
+ internmap@2.0.3:
+ resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
+ engines: {node: '>=12'}
+
+ is-any-array@2.0.1:
+ resolution: {integrity: sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==}
+
+ is-arrayish@0.3.4:
+ resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==}
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-mobile@5.0.0:
+ resolution: {integrity: sha512-Tz/yndySvLAEXh+Uk8liFCxOwVH6YutuR74utvOcu7I9Di+DwM0mtdPVZNaVvvBUM2OXxne/NhOs1zAO7riusQ==}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ jest-worker@27.5.1:
+ resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
+ engines: {node: '>= 10.13.0'}
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-yaml@4.1.1:
+ resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
+ hasBin: true
+
+ jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+ json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+ json2mq@0.2.0:
+ resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==}
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+
+ lightningcss-android-arm64@1.32.0:
+ resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [android]
+
+ lightningcss-darwin-arm64@1.32.0:
+ resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ lightningcss-darwin-x64@1.32.0:
+ resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ lightningcss-freebsd-x64@1.32.0:
+ resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ lightningcss-linux-arm-gnueabihf@1.32.0:
+ resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ os: [linux]
+
+ lightningcss-linux-arm64-gnu@1.32.0:
+ resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ lightningcss-linux-arm64-musl@1.32.0:
+ resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ lightningcss-linux-x64-gnu@1.32.0:
+ resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ lightningcss-linux-x64-musl@1.32.0:
+ resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ lightningcss-win32-arm64-msvc@1.32.0:
+ resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ lightningcss-win32-x64-msvc@1.32.0:
+ resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [win32]
+
+ lightningcss@1.32.0:
+ resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==}
+ engines: {node: '>= 12.0.0'}
+
+ loader-runner@4.3.1:
+ resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==}
+ engines: {node: '>=6.11.5'}
+
+ loader-utils@2.0.4:
+ resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==}
+ engines: {node: '>=8.9.0'}
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+
+ lodash-es@4.17.23:
+ resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==}
+
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+ lodash@4.17.23:
+ resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==}
+
+ loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
+ merge-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+
+ mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+
+ mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+
+ minimatch@10.2.4:
+ resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==}
+ engines: {node: 18 || 20 || >=22}
+
+ minimatch@3.1.5:
+ resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==}
+
+ ml-array-max@1.2.4:
+ resolution: {integrity: sha512-BlEeg80jI0tW6WaPyGxf5Sa4sqvcyY6lbSn5Vcv44lp1I2GR6AWojfUvLnGTNsIXrZ8uqWmo8VcG1WpkI2ONMQ==}
+
+ ml-array-min@1.2.3:
+ resolution: {integrity: sha512-VcZ5f3VZ1iihtrGvgfh/q0XlMobG6GQ8FsNyQXD3T+IlstDv85g8kfV0xUG1QPRO/t21aukaJowDzMTc7j5V6Q==}
+
+ ml-array-rescale@1.3.7:
+ resolution: {integrity: sha512-48NGChTouvEo9KBctDfHC3udWnQKNKEWN0ziELvY3KG25GR5cA8K8wNVzracsqSW1QEkAXjTNx+ycgAv06/1mQ==}
+
+ ml-matrix@6.12.1:
+ resolution: {integrity: sha512-TJ+8eOFdp+INvzR4zAuwBQJznDUfktMtOB6g/hUcGh3rcyjxbz4Te57Pgri8Q9bhSQ7Zys4IYOGhFdnlgeB6Lw==}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ nanoid@3.3.11:
+ resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+ neo-async@2.6.2:
+ resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
+
+ node-releases@2.0.36:
+ resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==}
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-to-regexp@8.2.0:
+ resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==}
+ engines: {node: '>=16'}
+
+ pdfast@0.2.0:
+ resolution: {integrity: sha512-cq6TTu6qKSFUHwEahi68k/kqN2mfepjkGrG9Un70cgdRRKLKY6Rf8P8uvP2NvZktaQZNF3YE7agEkLj0vGK9bA==}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ picomatch@4.0.4:
+ resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==}
+ engines: {node: '>=12'}
+
+ postcss-value-parser@4.2.0:
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+
+ postcss@8.4.49:
+ resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ postcss@8.5.8:
+ resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+
+ prop-types@15.8.1:
+ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+
+ proxy-from-env@2.1.0:
+ resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==}
+ engines: {node: '>=10'}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ rc-field-form@2.7.1:
+ resolution: {integrity: sha512-vKeSifSJ6HoLaAB+B8aq/Qgm8a3dyxROzCtKNCsBQgiverpc4kWDQihoUwzUj+zNWJOykwSY4dNX3QrGwtVb9A==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-resize-observer@0.2.6:
+ resolution: {integrity: sha512-YX6nYnd6fk7zbuvT6oSDMKiZjyngjHoy+fz+vL3Tez38d/G5iGdaDJa2yE7345G6sc4Mm1IGRUIwclvltddhmA==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-resize-observer@1.4.3:
+ resolution: {integrity: sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-util@4.21.1:
+ resolution: {integrity: sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==}
+
+ rc-util@5.44.4:
+ resolution: {integrity: sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ react-dom@19.2.4:
+ resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==}
+ peerDependencies:
+ react: ^19.2.4
+
+ react-is@16.13.1:
+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+
+ react-is@18.3.1:
+ resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
+
+ react-lifecycles-compat@3.0.4:
+ resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==}
+
+ react-router-dom@7.13.2:
+ resolution: {integrity: sha512-aR7SUORwTqAW0JDeiWF07e9SBE9qGpByR9I8kJT5h/FrBKxPMS6TiC7rmVO+gC0q52Bx7JnjWe8Z1sR9faN4YA==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ react: '>=18'
+ react-dom: '>=18'
+
+ react-router@7.13.2:
+ resolution: {integrity: sha512-tX1Aee+ArlKQP+NIUd7SE6Li+CiGKwQtbS+FfRxPX6Pe4vHOo6nr9d++u5cwg+Z8K/x8tP+7qLmujDtfrAoUJA==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ react: '>=18'
+ react-dom: '>=18'
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
+
+ react@19.2.4:
+ resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==}
+ engines: {node: '>=0.10.0'}
+
+ reactcss@1.2.3:
+ resolution: {integrity: sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==}
+ peerDependencies:
+ react: '*'
+
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+
+ resize-observer-polyfill@1.5.1:
+ resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==}
+
+ resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+
+ rolldown@1.0.0-rc.12:
+ resolution: {integrity: sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+
+ rw@1.3.3:
+ resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==}
+
+ safe-stable-stringify@2.5.0:
+ resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==}
+ engines: {node: '>=10'}
+
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+ scheduler@0.27.0:
+ resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
+
+ schema-utils@4.3.3:
+ resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==}
+ engines: {node: '>= 10.13.0'}
+
+ scroll-into-view-if-needed@3.1.0:
+ resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==}
+
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ semver@7.7.4:
+ resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ set-cookie-parser@2.7.2:
+ resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==}
+
+ shallowequal@1.1.0:
+ resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==}
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ simple-swizzle@0.2.4:
+ resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==}
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ source-map-support@0.5.21:
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ string-convert@0.2.1:
+ resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==}
+
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+
+ styled-components@6.3.12:
+ resolution: {integrity: sha512-hFR6xsVkVYbsdcUlzPYFvFfoc6o2KlV0VvgRIQwSYMtdThM7SCxnjX9efh/cWce2kTq16I/Kl3xM98xiLptsXA==}
+ engines: {node: '>= 16'}
+ peerDependencies:
+ react: '>= 16.8.0'
+ react-dom: '>= 16.8.0'
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
+
+ stylis@4.3.6:
+ resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==}
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ supports-color@8.1.1:
+ resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+ engines: {node: '>=10'}
+
+ svg-path-parser@1.1.0:
+ resolution: {integrity: sha512-jGCUqcQyXpfe38R7RFfhrMyfXcBmpMNJI/B+4CE9/Unkh98UporAc461GTthv+TVDuZXsBx7/WiwJb1Oh4tt4A==}
+
+ swr@2.4.1:
+ resolution: {integrity: sha512-2CC6CiKQtEwaEeNiqWTAw9PGykW8SR5zZX8MZk6TeAvEAnVS7Visz8WzphqgtQ8v2xz/4Q5K+j+SeMaKXeeQIA==}
+ peerDependencies:
+ react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ tapable@2.3.2:
+ resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==}
+ engines: {node: '>=6'}
+
+ terser-webpack-plugin@5.4.0:
+ resolution: {integrity: sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==}
+ engines: {node: '>= 10.13.0'}
+ peerDependencies:
+ '@swc/core': '*'
+ esbuild: '*'
+ uglify-js: '*'
+ webpack: ^5.1.0
+ peerDependenciesMeta:
+ '@swc/core':
+ optional: true
+ esbuild:
+ optional: true
+ uglify-js:
+ optional: true
+
+ terser@5.46.1:
+ resolution: {integrity: sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ text-segmentation@1.0.3:
+ resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==}
+
+ throttle-debounce@5.0.2:
+ resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==}
+ engines: {node: '>=12.22'}
+
+ tinycolor2@1.6.0:
+ resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==}
+
+ tinyglobby@0.2.15:
+ resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
+ engines: {node: '>=12.0.0'}
+
+ ts-api-utils@2.5.0:
+ resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==}
+ engines: {node: '>=18.12'}
+ peerDependencies:
+ typescript: '>=4.8.4'
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+
+ typescript-eslint@8.57.2:
+ resolution: {integrity: sha512-VEPQ0iPgWO/sBaZOU1xo4nuNdODVOajPnTIbog2GKYr31nIlZ0fWPoCQgGfF3ETyBl1vn63F/p50Um9Z4J8O8A==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ typescript@5.9.3:
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ undici-types@7.16.0:
+ resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
+
+ update-browserslist-db@1.2.3:
+ resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ use-sync-external-store@1.6.0:
+ resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ utrie@1.0.2:
+ resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==}
+
+ vite@8.0.3:
+ resolution: {integrity: sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^20.19.0 || >=22.12.0
+ '@vitejs/devtools': ^0.1.0
+ esbuild: ^0.27.0
+ jiti: '>=1.21.0'
+ less: ^4.0.0
+ sass: ^1.70.0
+ sass-embedded: ^1.70.0
+ stylus: '>=0.54.8'
+ sugarss: ^5.0.0
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ '@vitejs/devtools':
+ optional: true
+ esbuild:
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
+ warning@4.0.3:
+ resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==}
+
+ watchpack@2.5.1:
+ resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==}
+ engines: {node: '>=10.13.0'}
+
+ webpack-sources@3.3.4:
+ resolution: {integrity: sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==}
+ engines: {node: '>=10.13.0'}
+
+ webpack@5.105.4:
+ resolution: {integrity: sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+ peerDependencies:
+ webpack-cli: '*'
+ peerDependenciesMeta:
+ webpack-cli:
+ optional: true
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+
+ workerize-loader@2.0.2:
+ resolution: {integrity: sha512-HoZ6XY4sHWxA2w0WpzgBwUiR3dv1oo7bS+oCwIpb6n54MclQ/7KXdXsVIChTCygyuHtVuGBO1+i3HzTt699UJQ==}
+ peerDependencies:
+ webpack: '*'
+
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+ zod-validation-error@4.0.2:
+ resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ zod: ^3.25.0 || ^4.0.0
+
+ zod@4.3.6:
+ resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==}
+
+ zustand@5.0.12:
+ resolution: {integrity: sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g==}
+ engines: {node: '>=12.20.0'}
+ peerDependencies:
+ '@types/react': '>=18.0.0'
+ immer: '>=9.0.6'
+ react: '>=18.0.0'
+ use-sync-external-store: '>=1.2.0'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ immer:
+ optional: true
+ react:
+ optional: true
+ use-sync-external-store:
+ optional: true
+
+snapshots:
+
+ '@ant-design/charts-util@0.0.1-alpha.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ lodash: 4.17.23
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@ant-design/charts-util@0.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ lodash: 4.17.23
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@ant-design/charts@2.6.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(workerize-loader@2.0.2(webpack@5.105.4))':
+ dependencies:
+ '@ant-design/graphs': 2.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(workerize-loader@2.0.2(webpack@5.105.4))
+ '@ant-design/plots': 2.6.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ lodash: 4.17.23
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ transitivePeerDependencies:
+ - workerize-loader
+
+ '@ant-design/colors@7.2.1':
+ dependencies:
+ '@ant-design/fast-color': 2.0.6
+
+ '@ant-design/colors@8.0.1':
+ dependencies:
+ '@ant-design/fast-color': 3.0.1
+
+ '@ant-design/cssinjs-utils@2.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@ant-design/cssinjs': 2.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@babel/runtime': 7.29.2
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@ant-design/cssinjs@1.24.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@babel/runtime': 7.29.2
+ '@emotion/hash': 0.8.0
+ '@emotion/unitless': 0.7.5
+ classnames: 2.5.1
+ csstype: 3.2.3
+ rc-util: 5.44.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ stylis: 4.3.6
+
+ '@ant-design/cssinjs@2.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@babel/runtime': 7.29.2
+ '@emotion/hash': 0.8.0
+ '@emotion/unitless': 0.7.5
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ csstype: 3.2.3
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ stylis: 4.3.6
+
+ '@ant-design/fast-color@2.0.6':
+ dependencies:
+ '@babel/runtime': 7.29.2
+
+ '@ant-design/fast-color@3.0.1': {}
+
+ '@ant-design/graphs@2.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(workerize-loader@2.0.2(webpack@5.105.4))':
+ dependencies:
+ '@ant-design/charts-util': 0.0.1-alpha.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@antv/g6': 5.0.51(workerize-loader@2.0.2(webpack@5.105.4))
+ '@antv/g6-extension-react': 0.2.6(@antv/g6@5.0.51(workerize-loader@2.0.2(webpack@5.105.4)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@antv/graphin': 3.0.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(workerize-loader@2.0.2(webpack@5.105.4))
+ lodash: 4.17.23
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ styled-components: 6.3.12(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ transitivePeerDependencies:
+ - workerize-loader
+
+ '@ant-design/icons-svg@4.4.2': {}
+
+ '@ant-design/icons@5.6.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@ant-design/colors': 7.2.1
+ '@ant-design/icons-svg': 4.4.2
+ '@babel/runtime': 7.29.2
+ classnames: 2.5.1
+ rc-util: 5.44.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@ant-design/icons@6.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@ant-design/colors': 8.0.1
+ '@ant-design/icons-svg': 4.4.2
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@ant-design/plots@2.6.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@ant-design/charts-util': 0.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@antv/event-emitter': 0.1.3
+ '@antv/g': 6.3.1
+ '@antv/g2': 5.4.8
+ '@antv/g2-extension-plot': 0.2.2
+ lodash: 4.17.23
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@ant-design/pro-card@2.10.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@ant-design/cssinjs': 1.24.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/icons': 5.6.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-provider': 2.16.2(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-utils': 2.18.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@babel/runtime': 7.29.2
+ antd: 6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ classnames: 2.5.1
+ rc-resize-observer: 1.4.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ rc-util: 5.44.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.4
+ transitivePeerDependencies:
+ - react-dom
+
+ '@ant-design/pro-components@2.8.10(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(rc-field-form@2.7.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@ant-design/pro-card': 2.10.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-descriptions': 2.6.10(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(rc-field-form@2.7.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-field': 3.1.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-form': 2.32.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(rc-field-form@2.7.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-layout': 7.22.7(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-list': 2.6.10(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(rc-field-form@2.7.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-provider': 2.16.2(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-skeleton': 2.2.1(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-table': 3.21.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(rc-field-form@2.7.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-utils': 2.18.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@babel/runtime': 7.29.2
+ antd: 6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ transitivePeerDependencies:
+ - rc-field-form
+
+ '@ant-design/pro-descriptions@2.6.10(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(rc-field-form@2.7.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@ant-design/pro-field': 3.1.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-form': 2.32.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(rc-field-form@2.7.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-provider': 2.16.2(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-skeleton': 2.2.1(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-utils': 2.18.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@babel/runtime': 7.29.2
+ antd: 6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ rc-resize-observer: 0.2.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ rc-util: 5.44.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.4
+ transitivePeerDependencies:
+ - rc-field-form
+ - react-dom
+
+ '@ant-design/pro-field@3.1.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@ant-design/icons': 5.6.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-provider': 2.16.2(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-utils': 2.18.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@babel/runtime': 7.29.2
+ '@chenshuai2144/sketch-color': 1.0.9(react@19.2.4)
+ antd: 6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ classnames: 2.5.1
+ dayjs: 1.11.20
+ lodash: 4.17.23
+ lodash-es: 4.17.23
+ rc-util: 5.44.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.4
+ swr: 2.4.1(react@19.2.4)
+ transitivePeerDependencies:
+ - react-dom
+
+ '@ant-design/pro-form@2.32.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(rc-field-form@2.7.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@ant-design/icons': 5.6.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-field': 3.1.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-provider': 2.16.2(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-utils': 2.18.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@babel/runtime': 7.29.2
+ '@chenshuai2144/sketch-color': 1.0.9(react@19.2.4)
+ '@umijs/use-params': 1.0.9(react@19.2.4)
+ antd: 6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ classnames: 2.5.1
+ dayjs: 1.11.20
+ lodash: 4.17.23
+ lodash-es: 4.17.23
+ rc-field-form: 2.7.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ rc-resize-observer: 1.4.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ rc-util: 5.44.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@ant-design/pro-layout@7.22.7(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@ant-design/cssinjs': 1.24.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/icons': 5.6.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-provider': 2.16.2(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-utils': 2.18.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@babel/runtime': 7.29.2
+ '@umijs/route-utils': 4.0.3
+ '@umijs/use-params': 1.0.9(react@19.2.4)
+ antd: 6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ classnames: 2.5.1
+ lodash: 4.17.23
+ lodash-es: 4.17.23
+ path-to-regexp: 8.2.0
+ rc-resize-observer: 1.4.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ rc-util: 5.44.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ swr: 2.4.1(react@19.2.4)
+ warning: 4.0.3
+
+ '@ant-design/pro-list@2.6.10(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(rc-field-form@2.7.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@ant-design/cssinjs': 1.24.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/icons': 5.6.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-card': 2.10.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-field': 3.1.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-table': 3.21.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(rc-field-form@2.7.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-utils': 2.18.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@babel/runtime': 7.29.2
+ antd: 6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ classnames: 2.5.1
+ dayjs: 1.11.20
+ rc-resize-observer: 1.4.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ rc-util: 4.21.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ transitivePeerDependencies:
+ - rc-field-form
+
+ '@ant-design/pro-provider@2.16.2(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@ant-design/cssinjs': 1.24.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@babel/runtime': 7.29.2
+ '@ctrl/tinycolor': 3.6.1
+ antd: 6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ dayjs: 1.11.20
+ rc-util: 5.44.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ swr: 2.4.1(react@19.2.4)
+
+ '@ant-design/pro-skeleton@2.2.1(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@babel/runtime': 7.29.2
+ antd: 6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@ant-design/pro-table@3.21.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(rc-field-form@2.7.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@ant-design/cssinjs': 1.24.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/icons': 5.6.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-card': 2.10.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-field': 3.1.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-form': 2.32.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(rc-field-form@2.7.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-provider': 2.16.2(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-utils': 2.18.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@babel/runtime': 7.29.2
+ '@dnd-kit/core': 6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@dnd-kit/modifiers': 6.0.1(@dnd-kit/core@6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)
+ '@dnd-kit/sortable': 7.0.2(@dnd-kit/core@6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)
+ '@dnd-kit/utilities': 3.2.2(react@19.2.4)
+ antd: 6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ classnames: 2.5.1
+ dayjs: 1.11.20
+ lodash: 4.17.23
+ lodash-es: 4.17.23
+ rc-field-form: 2.7.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ rc-resize-observer: 1.4.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ rc-util: 5.44.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@ant-design/pro-utils@2.18.0(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@ant-design/icons': 5.6.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/pro-provider': 2.16.2(antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@babel/runtime': 7.29.2
+ antd: 6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ classnames: 2.5.1
+ dayjs: 1.11.20
+ lodash: 4.17.23
+ lodash-es: 4.17.23
+ rc-util: 5.44.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ safe-stable-stringify: 2.5.0
+ swr: 2.4.1(react@19.2.4)
+
+ '@ant-design/react-slick@2.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@babel/runtime': 7.29.2
+ clsx: 2.1.1
+ json2mq: 0.2.0
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ throttle-debounce: 5.0.2
+
+ '@antv/algorithm@0.1.26':
+ dependencies:
+ '@antv/util': 2.0.17
+ tslib: 2.8.1
+
+ '@antv/component@2.1.11':
+ dependencies:
+ '@antv/g': 6.3.1
+ '@antv/scale': 0.4.16
+ '@antv/util': 3.3.11
+ svg-path-parser: 1.1.0
+
+ '@antv/coord@0.4.7':
+ dependencies:
+ '@antv/scale': 0.4.16
+ '@antv/util': 2.0.17
+ gl-matrix: 3.4.4
+
+ '@antv/event-emitter@0.1.3': {}
+
+ '@antv/expr@1.0.2': {}
+
+ '@antv/g-canvas@2.2.0':
+ dependencies:
+ '@antv/g-lite': 2.7.0
+ '@antv/g-math': 3.1.0
+ '@antv/util': 3.3.11
+ '@babel/runtime': 7.29.2
+ gl-matrix: 3.4.4
+ tslib: 2.8.1
+
+ '@antv/g-lite@2.7.0':
+ dependencies:
+ '@antv/g-math': 3.1.0
+ '@antv/util': 3.3.11
+ '@antv/vendor': 1.0.11
+ '@babel/runtime': 7.29.2
+ eventemitter3: 5.0.4
+ gl-matrix: 3.4.4
+ tslib: 2.8.1
+
+ '@antv/g-math@3.1.0':
+ dependencies:
+ '@antv/util': 3.3.11
+ '@babel/runtime': 7.29.2
+ gl-matrix: 3.4.4
+ tslib: 2.8.1
+
+ '@antv/g-plugin-dragndrop@2.1.1':
+ dependencies:
+ '@antv/g-lite': 2.7.0
+ '@antv/util': 3.3.11
+ '@babel/runtime': 7.29.2
+ tslib: 2.8.1
+
+ '@antv/g-svg@2.1.1':
+ dependencies:
+ '@antv/g-lite': 2.7.0
+ '@antv/util': 3.3.11
+ '@babel/runtime': 7.29.2
+ gl-matrix: 3.4.4
+ tslib: 2.8.1
+
+ '@antv/g2-extension-plot@0.2.2':
+ dependencies:
+ '@antv/g2': 5.4.8
+ '@antv/util': 3.3.11
+ '@antv/vendor': 1.0.11
+
+ '@antv/g2@5.4.8':
+ dependencies:
+ '@antv/component': 2.1.11
+ '@antv/coord': 0.4.7
+ '@antv/event-emitter': 0.1.3
+ '@antv/expr': 1.0.2
+ '@antv/g': 6.3.1
+ '@antv/g-canvas': 2.2.0
+ '@antv/g-plugin-dragndrop': 2.1.1
+ '@antv/scale': 0.5.2
+ '@antv/util': 3.3.11
+ '@antv/vendor': 1.0.11
+ flru: 1.0.2
+ pdfast: 0.2.0
+
+ '@antv/g6-extension-react@0.2.6(@antv/g6@5.0.51(workerize-loader@2.0.2(webpack@5.105.4)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@antv/g': 6.3.1
+ '@antv/g-svg': 2.1.1
+ '@antv/g6': 5.0.51(workerize-loader@2.0.2(webpack@5.105.4))
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@antv/g6@5.0.51(workerize-loader@2.0.2(webpack@5.105.4))':
+ dependencies:
+ '@antv/algorithm': 0.1.26
+ '@antv/component': 2.1.11
+ '@antv/event-emitter': 0.1.3
+ '@antv/g': 6.3.1
+ '@antv/g-canvas': 2.2.0
+ '@antv/g-plugin-dragndrop': 2.1.1
+ '@antv/graphlib': 2.0.4
+ '@antv/hierarchy': 0.7.1
+ '@antv/layout': 1.2.14-beta.9(workerize-loader@2.0.2(webpack@5.105.4))
+ '@antv/util': 3.3.11
+ bubblesets-js: 2.3.4
+ transitivePeerDependencies:
+ - workerize-loader
+
+ '@antv/g@6.3.1':
+ dependencies:
+ '@antv/g-lite': 2.7.0
+ '@antv/util': 3.3.11
+ '@babel/runtime': 7.29.2
+ gl-matrix: 3.4.4
+ html2canvas: 1.4.1
+
+ '@antv/graphin@3.0.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(workerize-loader@2.0.2(webpack@5.105.4))':
+ dependencies:
+ '@antv/g6': 5.0.51(workerize-loader@2.0.2(webpack@5.105.4))
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ transitivePeerDependencies:
+ - workerize-loader
+
+ '@antv/graphlib@2.0.4':
+ dependencies:
+ '@antv/event-emitter': 0.1.3
+
+ '@antv/hierarchy@0.7.1': {}
+
+ '@antv/layout@1.2.14-beta.9(workerize-loader@2.0.2(webpack@5.105.4))':
+ dependencies:
+ '@antv/event-emitter': 0.1.3
+ '@antv/graphlib': 2.0.4
+ '@antv/util': 3.3.11
+ '@naoak/workerize-transferable': 0.1.0(workerize-loader@2.0.2(webpack@5.105.4))
+ comlink: 4.4.2
+ d3-force: 3.0.0
+ d3-force-3d: 3.0.6
+ d3-octree: 1.1.0
+ d3-quadtree: 3.0.1
+ dagre: 0.8.5
+ ml-matrix: 6.12.1
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - workerize-loader
+
+ '@antv/scale@0.4.16':
+ dependencies:
+ '@antv/util': 3.3.11
+ color-string: 1.9.1
+ fecha: 4.2.3
+
+ '@antv/scale@0.5.2':
+ dependencies:
+ '@antv/util': 3.3.11
+ color-string: 1.9.1
+ fecha: 4.2.3
+
+ '@antv/util@2.0.17':
+ dependencies:
+ csstype: 3.2.3
+ tslib: 2.8.1
+
+ '@antv/util@3.3.11':
+ dependencies:
+ fast-deep-equal: 3.1.3
+ gl-matrix: 3.4.4
+ tslib: 2.8.1
+
+ '@antv/vendor@1.0.11':
+ dependencies:
+ '@types/d3-array': 3.2.2
+ '@types/d3-color': 3.1.3
+ '@types/d3-dispatch': 3.0.7
+ '@types/d3-dsv': 3.0.7
+ '@types/d3-ease': 3.0.2
+ '@types/d3-fetch': 3.0.7
+ '@types/d3-force': 3.0.10
+ '@types/d3-format': 3.0.4
+ '@types/d3-geo': 3.1.0
+ '@types/d3-hierarchy': 3.1.7
+ '@types/d3-interpolate': 3.0.4
+ '@types/d3-path': 3.1.1
+ '@types/d3-quadtree': 3.0.6
+ '@types/d3-random': 3.0.3
+ '@types/d3-scale': 4.0.9
+ '@types/d3-scale-chromatic': 3.1.0
+ '@types/d3-shape': 3.1.8
+ '@types/d3-time': 3.0.4
+ '@types/d3-timer': 3.0.2
+ d3-array: 3.2.4
+ d3-color: 3.1.0
+ d3-dispatch: 3.0.1
+ d3-dsv: 3.0.1
+ d3-ease: 3.0.1
+ d3-fetch: 3.0.1
+ d3-force: 3.0.0
+ d3-force-3d: 3.0.6
+ d3-format: 3.1.2
+ d3-geo: 3.1.1
+ d3-geo-projection: 4.0.0
+ d3-hierarchy: 3.1.2
+ d3-interpolate: 3.0.1
+ d3-path: 3.1.0
+ d3-quadtree: 3.0.1
+ d3-random: 3.0.1
+ d3-regression: 1.3.10
+ d3-scale: 4.0.2
+ d3-scale-chromatic: 3.1.0
+ d3-shape: 3.2.0
+ d3-time: 3.1.0
+ d3-timer: 3.0.1
+
+ '@babel/code-frame@7.29.0':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.28.5
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ '@babel/compat-data@7.29.0': {}
+
+ '@babel/core@7.29.0':
+ dependencies:
+ '@babel/code-frame': 7.29.0
+ '@babel/generator': 7.29.1
+ '@babel/helper-compilation-targets': 7.28.6
+ '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0)
+ '@babel/helpers': 7.29.2
+ '@babel/parser': 7.29.2
+ '@babel/template': 7.28.6
+ '@babel/traverse': 7.29.0
+ '@babel/types': 7.29.0
+ '@jridgewell/remapping': 2.3.5
+ convert-source-map: 2.0.0
+ debug: 4.4.3
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/generator@7.29.1':
+ dependencies:
+ '@babel/parser': 7.29.2
+ '@babel/types': 7.29.0
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ jsesc: 3.1.0
+
+ '@babel/helper-compilation-targets@7.28.6':
+ dependencies:
+ '@babel/compat-data': 7.29.0
+ '@babel/helper-validator-option': 7.27.1
+ browserslist: 4.28.1
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-globals@7.28.0': {}
+
+ '@babel/helper-module-imports@7.28.6':
+ dependencies:
+ '@babel/traverse': 7.29.0
+ '@babel/types': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-module-imports': 7.28.6
+ '@babel/helper-validator-identifier': 7.28.5
+ '@babel/traverse': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-string-parser@7.27.1': {}
+
+ '@babel/helper-validator-identifier@7.28.5': {}
+
+ '@babel/helper-validator-option@7.27.1': {}
+
+ '@babel/helpers@7.29.2':
+ dependencies:
+ '@babel/template': 7.28.6
+ '@babel/types': 7.29.0
+
+ '@babel/parser@7.29.2':
+ dependencies:
+ '@babel/types': 7.29.0
+
+ '@babel/runtime@7.29.2': {}
+
+ '@babel/template@7.28.6':
+ dependencies:
+ '@babel/code-frame': 7.29.0
+ '@babel/parser': 7.29.2
+ '@babel/types': 7.29.0
+
+ '@babel/traverse@7.29.0':
+ dependencies:
+ '@babel/code-frame': 7.29.0
+ '@babel/generator': 7.29.1
+ '@babel/helper-globals': 7.28.0
+ '@babel/parser': 7.29.2
+ '@babel/template': 7.28.6
+ '@babel/types': 7.29.0
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/types@7.29.0':
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+
+ '@chenshuai2144/sketch-color@1.0.9(react@19.2.4)':
+ dependencies:
+ react: 19.2.4
+ reactcss: 1.2.3(react@19.2.4)
+ tinycolor2: 1.6.0
+
+ '@ctrl/tinycolor@3.6.1': {}
+
+ '@dnd-kit/accessibility@3.1.1(react@19.2.4)':
+ dependencies:
+ react: 19.2.4
+ tslib: 2.8.1
+
+ '@dnd-kit/core@6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@dnd-kit/accessibility': 3.1.1(react@19.2.4)
+ '@dnd-kit/utilities': 3.2.2(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ tslib: 2.8.1
+
+ '@dnd-kit/modifiers@6.0.1(@dnd-kit/core@6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@dnd-kit/core': 6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@dnd-kit/utilities': 3.2.2(react@19.2.4)
+ react: 19.2.4
+ tslib: 2.8.1
+
+ '@dnd-kit/sortable@7.0.2(@dnd-kit/core@6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@dnd-kit/core': 6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@dnd-kit/utilities': 3.2.2(react@19.2.4)
+ react: 19.2.4
+ tslib: 2.8.1
+
+ '@dnd-kit/utilities@3.2.2(react@19.2.4)':
+ dependencies:
+ react: 19.2.4
+ tslib: 2.8.1
+
+ '@emnapi/core@1.9.1':
+ dependencies:
+ '@emnapi/wasi-threads': 1.2.0
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/runtime@1.9.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/wasi-threads@1.2.0':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@emotion/hash@0.8.0': {}
+
+ '@emotion/is-prop-valid@1.4.0':
+ dependencies:
+ '@emotion/memoize': 0.9.0
+
+ '@emotion/memoize@0.9.0': {}
+
+ '@emotion/unitless@0.10.0': {}
+
+ '@emotion/unitless@0.7.5': {}
+
+ '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4)':
+ dependencies:
+ eslint: 9.39.4
+ eslint-visitor-keys: 3.4.3
+
+ '@eslint-community/regexpp@4.12.2': {}
+
+ '@eslint/config-array@0.21.2':
+ dependencies:
+ '@eslint/object-schema': 2.1.7
+ debug: 4.4.3
+ minimatch: 3.1.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/config-helpers@0.4.2':
+ dependencies:
+ '@eslint/core': 0.17.0
+
+ '@eslint/core@0.17.0':
+ dependencies:
+ '@types/json-schema': 7.0.15
+
+ '@eslint/eslintrc@3.3.5':
+ dependencies:
+ ajv: 6.14.0
+ debug: 4.4.3
+ espree: 10.4.0
+ globals: 14.0.0
+ ignore: 5.3.2
+ import-fresh: 3.3.1
+ js-yaml: 4.1.1
+ minimatch: 3.1.5
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/js@9.39.4': {}
+
+ '@eslint/object-schema@2.1.7': {}
+
+ '@eslint/plugin-kit@0.4.1':
+ dependencies:
+ '@eslint/core': 0.17.0
+ levn: 0.4.1
+
+ '@humanfs/core@0.19.1': {}
+
+ '@humanfs/node@0.16.7':
+ dependencies:
+ '@humanfs/core': 0.19.1
+ '@humanwhocodes/retry': 0.4.3
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/retry@0.4.3': {}
+
+ '@jridgewell/gen-mapping@0.3.13':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/remapping@2.3.5':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/source-map@0.3.11':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/sourcemap-codec@1.5.5': {}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ '@naoak/workerize-transferable@0.1.0(workerize-loader@2.0.2(webpack@5.105.4))':
+ dependencies:
+ workerize-loader: 2.0.2(webpack@5.105.4)
+
+ '@napi-rs/wasm-runtime@1.1.2(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)':
+ dependencies:
+ '@emnapi/core': 1.9.1
+ '@emnapi/runtime': 1.9.1
+ '@tybys/wasm-util': 0.10.1
+ optional: true
+
+ '@oxc-project/types@0.122.0': {}
+
+ '@rc-component/async-validator@5.1.0':
+ dependencies:
+ '@babel/runtime': 7.29.2
+
+ '@rc-component/cascader@1.14.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/select': 1.6.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/tree': 1.2.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/checkbox@2.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/collapse@1.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@babel/runtime': 7.29.2
+ '@rc-component/motion': 1.3.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/color-picker@3.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@ant-design/fast-color': 3.0.1
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/context@2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/dialog@1.8.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/motion': 1.3.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/portal': 2.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/drawer@1.4.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/motion': 1.3.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/portal': 2.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/dropdown@1.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/trigger': 3.9.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/form@1.8.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/async-validator': 5.1.0
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/image@1.8.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/motion': 1.3.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/portal': 2.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/input-number@1.6.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/mini-decimal': 1.1.3
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/input@1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/mentions@1.6.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/input': 1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/menu': 1.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/textarea': 1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/trigger': 3.9.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/menu@1.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/motion': 1.3.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/overflow': 1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/trigger': 3.9.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/mini-decimal@1.1.3':
+ dependencies:
+ '@babel/runtime': 7.29.2
+
+ '@rc-component/motion@1.3.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/mutate-observer@2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/notification@1.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/motion': 1.3.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/overflow@1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@babel/runtime': 7.29.2
+ '@rc-component/resize-observer': 1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/pagination@1.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/picker@1.9.1(dayjs@1.11.20)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/overflow': 1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/resize-observer': 1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/trigger': 3.9.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ optionalDependencies:
+ dayjs: 1.11.20
+
+ '@rc-component/portal@2.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/progress@1.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/qrcode@1.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@babel/runtime': 7.29.2
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/rate@1.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/resize-observer@1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/segmented@1.3.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@babel/runtime': 7.29.2
+ '@rc-component/motion': 1.3.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/select@1.6.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/overflow': 1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/trigger': 3.9.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/virtual-list': 1.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/slider@1.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/steps@1.2.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/switch@1.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/table@1.9.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/context': 2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/resize-observer': 1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/virtual-list': 1.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/tabs@1.7.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/dropdown': 1.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/menu': 1.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/motion': 1.3.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/resize-observer': 1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/textarea@1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/input': 1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/resize-observer': 1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/tooltip@1.4.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/trigger': 3.9.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/tour@2.3.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/portal': 2.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/trigger': 3.9.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/tree-select@1.8.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/select': 1.6.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/tree': 1.2.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/tree@1.2.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/motion': 1.3.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/virtual-list': 1.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/trigger@3.9.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/motion': 1.3.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/portal': 2.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/resize-observer': 1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/upload@1.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rc-component/util@1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ is-mobile: 5.0.0
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ react-is: 18.3.1
+
+ '@rc-component/virtual-list@1.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@babel/runtime': 7.29.2
+ '@rc-component/resize-observer': 1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ '@rolldown/binding-android-arm64@1.0.0-rc.12':
+ optional: true
+
+ '@rolldown/binding-darwin-arm64@1.0.0-rc.12':
+ optional: true
+
+ '@rolldown/binding-darwin-x64@1.0.0-rc.12':
+ optional: true
+
+ '@rolldown/binding-freebsd-x64@1.0.0-rc.12':
+ optional: true
+
+ '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12':
+ optional: true
+
+ '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12':
+ optional: true
+
+ '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12':
+ optional: true
+
+ '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12':
+ optional: true
+
+ '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12':
+ optional: true
+
+ '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12':
+ optional: true
+
+ '@rolldown/binding-linux-x64-musl@1.0.0-rc.12':
+ optional: true
+
+ '@rolldown/binding-openharmony-arm64@1.0.0-rc.12':
+ optional: true
+
+ '@rolldown/binding-wasm32-wasi@1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)':
+ dependencies:
+ '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)
+ transitivePeerDependencies:
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+ optional: true
+
+ '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12':
+ optional: true
+
+ '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12':
+ optional: true
+
+ '@rolldown/pluginutils@1.0.0-rc.12': {}
+
+ '@rolldown/pluginutils@1.0.0-rc.7': {}
+
+ '@tanstack/query-core@5.95.2': {}
+
+ '@tanstack/react-query@5.95.2(react@19.2.4)':
+ dependencies:
+ '@tanstack/query-core': 5.95.2
+ react: 19.2.4
+
+ '@tybys/wasm-util@0.10.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@types/d3-array@3.2.2': {}
+
+ '@types/d3-color@3.1.3': {}
+
+ '@types/d3-dispatch@3.0.7': {}
+
+ '@types/d3-dsv@3.0.7': {}
+
+ '@types/d3-ease@3.0.2': {}
+
+ '@types/d3-fetch@3.0.7':
+ dependencies:
+ '@types/d3-dsv': 3.0.7
+
+ '@types/d3-force@3.0.10': {}
+
+ '@types/d3-format@3.0.4': {}
+
+ '@types/d3-geo@3.1.0':
+ dependencies:
+ '@types/geojson': 7946.0.16
+
+ '@types/d3-hierarchy@3.1.7': {}
+
+ '@types/d3-interpolate@3.0.4':
+ dependencies:
+ '@types/d3-color': 3.1.3
+
+ '@types/d3-path@3.1.1': {}
+
+ '@types/d3-quadtree@3.0.6': {}
+
+ '@types/d3-random@3.0.3': {}
+
+ '@types/d3-scale-chromatic@3.1.0': {}
+
+ '@types/d3-scale@4.0.9':
+ dependencies:
+ '@types/d3-time': 3.0.4
+
+ '@types/d3-shape@3.1.8':
+ dependencies:
+ '@types/d3-path': 3.1.1
+
+ '@types/d3-time@3.0.4': {}
+
+ '@types/d3-timer@3.0.2': {}
+
+ '@types/eslint-scope@3.7.7':
+ dependencies:
+ '@types/eslint': 9.6.1
+ '@types/estree': 1.0.8
+
+ '@types/eslint@9.6.1':
+ dependencies:
+ '@types/estree': 1.0.8
+ '@types/json-schema': 7.0.15
+
+ '@types/estree@1.0.8': {}
+
+ '@types/geojson@7946.0.16': {}
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/node@24.12.0':
+ dependencies:
+ undici-types: 7.16.0
+
+ '@types/react-dom@19.2.3(@types/react@19.2.14)':
+ dependencies:
+ '@types/react': 19.2.14
+
+ '@types/react@19.2.14':
+ dependencies:
+ csstype: 3.2.3
+
+ '@types/stylis@4.2.7': {}
+
+ '@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.2(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.2
+ '@typescript-eslint/parser': 8.57.2(eslint@9.39.4)(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.57.2
+ '@typescript-eslint/type-utils': 8.57.2(eslint@9.39.4)(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.57.2(eslint@9.39.4)(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.57.2
+ eslint: 9.39.4
+ ignore: 7.0.5
+ natural-compare: 1.4.0
+ ts-api-utils: 2.5.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@8.57.2(eslint@9.39.4)(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 8.57.2
+ '@typescript-eslint/types': 8.57.2
+ '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.57.2
+ debug: 4.4.3
+ eslint: 9.39.4
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/project-service@8.57.2(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@5.9.3)
+ '@typescript-eslint/types': 8.57.2
+ debug: 4.4.3
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/scope-manager@8.57.2':
+ dependencies:
+ '@typescript-eslint/types': 8.57.2
+ '@typescript-eslint/visitor-keys': 8.57.2
+
+ '@typescript-eslint/tsconfig-utils@8.57.2(typescript@5.9.3)':
+ dependencies:
+ typescript: 5.9.3
+
+ '@typescript-eslint/type-utils@8.57.2(eslint@9.39.4)(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/types': 8.57.2
+ '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.57.2(eslint@9.39.4)(typescript@5.9.3)
+ debug: 4.4.3
+ eslint: 9.39.4
+ ts-api-utils: 2.5.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/types@8.57.2': {}
+
+ '@typescript-eslint/typescript-estree@8.57.2(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/project-service': 8.57.2(typescript@5.9.3)
+ '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@5.9.3)
+ '@typescript-eslint/types': 8.57.2
+ '@typescript-eslint/visitor-keys': 8.57.2
+ debug: 4.4.3
+ minimatch: 10.2.4
+ semver: 7.7.4
+ tinyglobby: 0.2.15
+ ts-api-utils: 2.5.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/utils@8.57.2(eslint@9.39.4)(typescript@5.9.3)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4)
+ '@typescript-eslint/scope-manager': 8.57.2
+ '@typescript-eslint/types': 8.57.2
+ '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3)
+ eslint: 9.39.4
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/visitor-keys@8.57.2':
+ dependencies:
+ '@typescript-eslint/types': 8.57.2
+ eslint-visitor-keys: 5.0.1
+
+ '@umijs/route-utils@4.0.3': {}
+
+ '@umijs/use-params@1.0.9(react@19.2.4)':
+ dependencies:
+ react: 19.2.4
+
+ '@vitejs/plugin-react@6.0.1(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)(terser@5.46.1))':
+ dependencies:
+ '@rolldown/pluginutils': 1.0.0-rc.7
+ vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)(terser@5.46.1)
+
+ '@webassemblyjs/ast@1.14.1':
+ dependencies:
+ '@webassemblyjs/helper-numbers': 1.13.2
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+
+ '@webassemblyjs/floating-point-hex-parser@1.13.2': {}
+
+ '@webassemblyjs/helper-api-error@1.13.2': {}
+
+ '@webassemblyjs/helper-buffer@1.14.1': {}
+
+ '@webassemblyjs/helper-numbers@1.13.2':
+ dependencies:
+ '@webassemblyjs/floating-point-hex-parser': 1.13.2
+ '@webassemblyjs/helper-api-error': 1.13.2
+ '@xtuc/long': 4.2.2
+
+ '@webassemblyjs/helper-wasm-bytecode@1.13.2': {}
+
+ '@webassemblyjs/helper-wasm-section@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/wasm-gen': 1.14.1
+
+ '@webassemblyjs/ieee754@1.13.2':
+ dependencies:
+ '@xtuc/ieee754': 1.2.0
+
+ '@webassemblyjs/leb128@1.13.2':
+ dependencies:
+ '@xtuc/long': 4.2.2
+
+ '@webassemblyjs/utf8@1.13.2': {}
+
+ '@webassemblyjs/wasm-edit@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/helper-wasm-section': 1.14.1
+ '@webassemblyjs/wasm-gen': 1.14.1
+ '@webassemblyjs/wasm-opt': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+ '@webassemblyjs/wast-printer': 1.14.1
+
+ '@webassemblyjs/wasm-gen@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/ieee754': 1.13.2
+ '@webassemblyjs/leb128': 1.13.2
+ '@webassemblyjs/utf8': 1.13.2
+
+ '@webassemblyjs/wasm-opt@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/wasm-gen': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+
+ '@webassemblyjs/wasm-parser@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-api-error': 1.13.2
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/ieee754': 1.13.2
+ '@webassemblyjs/leb128': 1.13.2
+ '@webassemblyjs/utf8': 1.13.2
+
+ '@webassemblyjs/wast-printer@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@xtuc/long': 4.2.2
+
+ '@xtuc/ieee754@1.2.0': {}
+
+ '@xtuc/long@4.2.2': {}
+
+ acorn-import-phases@1.0.4(acorn@8.16.0):
+ dependencies:
+ acorn: 8.16.0
+
+ acorn-jsx@5.3.2(acorn@8.16.0):
+ dependencies:
+ acorn: 8.16.0
+
+ acorn@8.16.0: {}
+
+ add-dom-event-listener@1.1.0:
+ dependencies:
+ object-assign: 4.1.1
+
+ ajv-formats@2.1.1(ajv@8.18.0):
+ optionalDependencies:
+ ajv: 8.18.0
+
+ ajv-keywords@5.1.0(ajv@8.18.0):
+ dependencies:
+ ajv: 8.18.0
+ fast-deep-equal: 3.1.3
+
+ ajv@6.14.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+
+ ajv@8.18.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.1.0
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ antd@6.3.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
+ dependencies:
+ '@ant-design/colors': 8.0.1
+ '@ant-design/cssinjs': 2.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/cssinjs-utils': 2.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/fast-color': 3.0.1
+ '@ant-design/icons': 6.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@ant-design/react-slick': 2.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@babel/runtime': 7.29.2
+ '@rc-component/cascader': 1.14.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/checkbox': 2.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/collapse': 1.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/color-picker': 3.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/dialog': 1.8.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/drawer': 1.4.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/dropdown': 1.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/form': 1.8.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/image': 1.8.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/input': 1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/input-number': 1.6.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/mentions': 1.6.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/menu': 1.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/motion': 1.3.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/mutate-observer': 2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/notification': 1.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/pagination': 1.2.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/picker': 1.9.1(dayjs@1.11.20)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/progress': 1.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/qrcode': 1.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/rate': 1.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/resize-observer': 1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/segmented': 1.3.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/select': 1.6.15(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/slider': 1.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/steps': 1.2.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/switch': 1.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/table': 1.9.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/tabs': 1.7.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/textarea': 1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/tooltip': 1.4.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/tour': 2.3.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/tree': 1.2.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/tree-select': 1.8.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/trigger': 3.9.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/upload': 1.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@rc-component/util': 1.10.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ clsx: 2.1.1
+ dayjs: 1.11.20
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ scroll-into-view-if-needed: 3.1.0
+ throttle-debounce: 5.0.2
+ transitivePeerDependencies:
+ - date-fns
+ - luxon
+ - moment
+
+ argparse@2.0.1: {}
+
+ asynckit@0.4.0: {}
+
+ axios@1.14.0:
+ dependencies:
+ follow-redirects: 1.15.11
+ form-data: 4.0.5
+ proxy-from-env: 2.1.0
+ transitivePeerDependencies:
+ - debug
+
+ balanced-match@1.0.2: {}
+
+ balanced-match@4.0.4: {}
+
+ base64-arraybuffer@1.0.2: {}
+
+ baseline-browser-mapping@2.10.12: {}
+
+ big.js@5.2.2: {}
+
+ brace-expansion@1.1.13:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@5.0.5:
+ dependencies:
+ balanced-match: 4.0.4
+
+ browserslist@4.28.1:
+ dependencies:
+ baseline-browser-mapping: 2.10.12
+ caniuse-lite: 1.0.30001782
+ electron-to-chromium: 1.5.328
+ node-releases: 2.0.36
+ update-browserslist-db: 1.2.3(browserslist@4.28.1)
+
+ bubblesets-js@2.3.4: {}
+
+ buffer-from@1.1.2: {}
+
+ call-bind-apply-helpers@1.0.2:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
+ callsites@3.1.0: {}
+
+ camelize@1.0.1: {}
+
+ caniuse-lite@1.0.30001782: {}
+
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ chrome-trace-event@1.0.4: {}
+
+ classnames@2.5.1: {}
+
+ clsx@2.1.1: {}
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.4: {}
+
+ color-string@1.9.1:
+ dependencies:
+ color-name: 1.1.4
+ simple-swizzle: 0.2.4
+
+ combined-stream@1.0.8:
+ dependencies:
+ delayed-stream: 1.0.0
+
+ comlink@4.4.2: {}
+
+ commander@2.20.3: {}
+
+ commander@7.2.0: {}
+
+ compute-scroll-into-view@3.1.1: {}
+
+ concat-map@0.0.1: {}
+
+ convert-source-map@2.0.0: {}
+
+ cookie@1.1.1: {}
+
+ cross-spawn@7.0.6:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ css-color-keywords@1.0.0: {}
+
+ css-line-break@2.1.0:
+ dependencies:
+ utrie: 1.0.2
+
+ css-to-react-native@3.2.0:
+ dependencies:
+ camelize: 1.0.1
+ css-color-keywords: 1.0.0
+ postcss-value-parser: 4.2.0
+
+ csstype@3.2.3: {}
+
+ d3-array@3.2.4:
+ dependencies:
+ internmap: 2.0.3
+
+ d3-binarytree@1.0.2: {}
+
+ d3-color@3.1.0: {}
+
+ d3-dispatch@3.0.1: {}
+
+ d3-dsv@3.0.1:
+ dependencies:
+ commander: 7.2.0
+ iconv-lite: 0.6.3
+ rw: 1.3.3
+
+ d3-ease@3.0.1: {}
+
+ d3-fetch@3.0.1:
+ dependencies:
+ d3-dsv: 3.0.1
+
+ d3-force-3d@3.0.6:
+ dependencies:
+ d3-binarytree: 1.0.2
+ d3-dispatch: 3.0.1
+ d3-octree: 1.1.0
+ d3-quadtree: 3.0.1
+ d3-timer: 3.0.1
+
+ d3-force@3.0.0:
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-quadtree: 3.0.1
+ d3-timer: 3.0.1
+
+ d3-format@3.1.2: {}
+
+ d3-geo-projection@4.0.0:
+ dependencies:
+ commander: 7.2.0
+ d3-array: 3.2.4
+ d3-geo: 3.1.1
+
+ d3-geo@3.1.1:
+ dependencies:
+ d3-array: 3.2.4
+
+ d3-hierarchy@3.1.2: {}
+
+ d3-interpolate@3.0.1:
+ dependencies:
+ d3-color: 3.1.0
+
+ d3-octree@1.1.0: {}
+
+ d3-path@3.1.0: {}
+
+ d3-quadtree@3.0.1: {}
+
+ d3-random@3.0.1: {}
+
+ d3-regression@1.3.10: {}
+
+ d3-scale-chromatic@3.1.0:
+ dependencies:
+ d3-color: 3.1.0
+ d3-interpolate: 3.0.1
+
+ d3-scale@4.0.2:
+ dependencies:
+ d3-array: 3.2.4
+ d3-format: 3.1.2
+ d3-interpolate: 3.0.1
+ d3-time: 3.1.0
+ d3-time-format: 4.1.0
+
+ d3-shape@3.2.0:
+ dependencies:
+ d3-path: 3.1.0
+
+ d3-time-format@4.1.0:
+ dependencies:
+ d3-time: 3.1.0
+
+ d3-time@3.1.0:
+ dependencies:
+ d3-array: 3.2.4
+
+ d3-timer@3.0.1: {}
+
+ dagre@0.8.5:
+ dependencies:
+ graphlib: 2.1.8
+ lodash: 4.17.23
+
+ dayjs@1.11.20: {}
+
+ debug@4.4.3:
+ dependencies:
+ ms: 2.1.3
+
+ deep-is@0.1.4: {}
+
+ delayed-stream@1.0.0: {}
+
+ dequal@2.0.3: {}
+
+ detect-libc@2.1.2: {}
+
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ electron-to-chromium@1.5.328: {}
+
+ emojis-list@3.0.0: {}
+
+ enhanced-resolve@5.20.1:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.3.2
+
+ es-define-property@1.0.1: {}
+
+ es-errors@1.3.0: {}
+
+ es-module-lexer@2.0.0: {}
+
+ es-object-atoms@1.1.1:
+ dependencies:
+ es-errors: 1.3.0
+
+ es-set-tostringtag@2.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+
+ escalade@3.2.0: {}
+
+ escape-string-regexp@4.0.0: {}
+
+ eslint-plugin-react-hooks@7.0.1(eslint@9.39.4):
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/parser': 7.29.2
+ eslint: 9.39.4
+ hermes-parser: 0.25.1
+ zod: 4.3.6
+ zod-validation-error: 4.0.2(zod@4.3.6)
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-plugin-react-refresh@0.5.2(eslint@9.39.4):
+ dependencies:
+ eslint: 9.39.4
+
+ eslint-scope@5.1.1:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 4.3.0
+
+ eslint-scope@8.4.0:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+
+ eslint-visitor-keys@3.4.3: {}
+
+ eslint-visitor-keys@4.2.1: {}
+
+ eslint-visitor-keys@5.0.1: {}
+
+ eslint@9.39.4:
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4)
+ '@eslint-community/regexpp': 4.12.2
+ '@eslint/config-array': 0.21.2
+ '@eslint/config-helpers': 0.4.2
+ '@eslint/core': 0.17.0
+ '@eslint/eslintrc': 3.3.5
+ '@eslint/js': 9.39.4
+ '@eslint/plugin-kit': 0.4.1
+ '@humanfs/node': 0.16.7
+ '@humanwhocodes/module-importer': 1.0.1
+ '@humanwhocodes/retry': 0.4.3
+ '@types/estree': 1.0.8
+ ajv: 6.14.0
+ chalk: 4.1.2
+ cross-spawn: 7.0.6
+ debug: 4.4.3
+ escape-string-regexp: 4.0.0
+ eslint-scope: 8.4.0
+ eslint-visitor-keys: 4.2.1
+ espree: 10.4.0
+ esquery: 1.7.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 8.0.0
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ json-stable-stringify-without-jsonify: 1.0.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.5
+ natural-compare: 1.4.0
+ optionator: 0.9.4
+ transitivePeerDependencies:
+ - supports-color
+
+ espree@10.4.0:
+ dependencies:
+ acorn: 8.16.0
+ acorn-jsx: 5.3.2(acorn@8.16.0)
+ eslint-visitor-keys: 4.2.1
+
+ esquery@1.7.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@4.3.0: {}
+
+ estraverse@5.3.0: {}
+
+ esutils@2.0.3: {}
+
+ eventemitter3@5.0.4: {}
+
+ events@3.3.0: {}
+
+ fast-deep-equal@3.1.3: {}
+
+ fast-json-stable-stringify@2.1.0: {}
+
+ fast-levenshtein@2.0.6: {}
+
+ fast-uri@3.1.0: {}
+
+ fdir@6.5.0(picomatch@4.0.4):
+ optionalDependencies:
+ picomatch: 4.0.4
+
+ fecha@4.2.3: {}
+
+ file-entry-cache@8.0.0:
+ dependencies:
+ flat-cache: 4.0.1
+
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+
+ flat-cache@4.0.1:
+ dependencies:
+ flatted: 3.4.2
+ keyv: 4.5.4
+
+ flatted@3.4.2: {}
+
+ flru@1.0.2: {}
+
+ follow-redirects@1.15.11: {}
+
+ form-data@4.0.5:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ es-set-tostringtag: 2.1.0
+ hasown: 2.0.2
+ mime-types: 2.1.35
+
+ fsevents@2.3.3:
+ optional: true
+
+ function-bind@1.1.2: {}
+
+ gensync@1.0.0-beta.2: {}
+
+ get-intrinsic@1.3.0:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ function-bind: 1.1.2
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ math-intrinsics: 1.1.0
+
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.1
+
+ gl-matrix@3.4.4: {}
+
+ glob-parent@6.0.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob-to-regexp@0.4.1: {}
+
+ globals@14.0.0: {}
+
+ globals@17.4.0: {}
+
+ gopd@1.2.0: {}
+
+ graceful-fs@4.2.11: {}
+
+ graphlib@2.1.8:
+ dependencies:
+ lodash: 4.17.23
+
+ has-flag@4.0.0: {}
+
+ has-symbols@1.1.0: {}
+
+ has-tostringtag@1.0.2:
+ dependencies:
+ has-symbols: 1.1.0
+
+ hasown@2.0.2:
+ dependencies:
+ function-bind: 1.1.2
+
+ hermes-estree@0.25.1: {}
+
+ hermes-parser@0.25.1:
+ dependencies:
+ hermes-estree: 0.25.1
+
+ html2canvas@1.4.1:
+ dependencies:
+ css-line-break: 2.1.0
+ text-segmentation: 1.0.3
+
+ iconv-lite@0.6.3:
+ dependencies:
+ safer-buffer: 2.1.2
+
+ ignore@5.3.2: {}
+
+ ignore@7.0.5: {}
+
+ import-fresh@3.3.1:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ imurmurhash@0.1.4: {}
+
+ internmap@2.0.3: {}
+
+ is-any-array@2.0.1: {}
+
+ is-arrayish@0.3.4: {}
+
+ is-extglob@2.1.1: {}
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ is-mobile@5.0.0: {}
+
+ isexe@2.0.0: {}
+
+ jest-worker@27.5.1:
+ dependencies:
+ '@types/node': 24.12.0
+ merge-stream: 2.0.0
+ supports-color: 8.1.1
+
+ js-tokens@4.0.0: {}
+
+ js-yaml@4.1.1:
+ dependencies:
+ argparse: 2.0.1
+
+ jsesc@3.1.0: {}
+
+ json-buffer@3.0.1: {}
+
+ json-parse-even-better-errors@2.3.1: {}
+
+ json-schema-traverse@0.4.1: {}
+
+ json-schema-traverse@1.0.0: {}
+
+ json-stable-stringify-without-jsonify@1.0.1: {}
+
+ json2mq@0.2.0:
+ dependencies:
+ string-convert: 0.2.1
+
+ json5@2.2.3: {}
+
+ keyv@4.5.4:
+ dependencies:
+ json-buffer: 3.0.1
+
+ levn@0.4.1:
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+
+ lightningcss-android-arm64@1.32.0:
+ optional: true
+
+ lightningcss-darwin-arm64@1.32.0:
+ optional: true
+
+ lightningcss-darwin-x64@1.32.0:
+ optional: true
+
+ lightningcss-freebsd-x64@1.32.0:
+ optional: true
+
+ lightningcss-linux-arm-gnueabihf@1.32.0:
+ optional: true
+
+ lightningcss-linux-arm64-gnu@1.32.0:
+ optional: true
+
+ lightningcss-linux-arm64-musl@1.32.0:
+ optional: true
+
+ lightningcss-linux-x64-gnu@1.32.0:
+ optional: true
+
+ lightningcss-linux-x64-musl@1.32.0:
+ optional: true
+
+ lightningcss-win32-arm64-msvc@1.32.0:
+ optional: true
+
+ lightningcss-win32-x64-msvc@1.32.0:
+ optional: true
+
+ lightningcss@1.32.0:
+ dependencies:
+ detect-libc: 2.1.2
+ optionalDependencies:
+ lightningcss-android-arm64: 1.32.0
+ lightningcss-darwin-arm64: 1.32.0
+ lightningcss-darwin-x64: 1.32.0
+ lightningcss-freebsd-x64: 1.32.0
+ lightningcss-linux-arm-gnueabihf: 1.32.0
+ lightningcss-linux-arm64-gnu: 1.32.0
+ lightningcss-linux-arm64-musl: 1.32.0
+ lightningcss-linux-x64-gnu: 1.32.0
+ lightningcss-linux-x64-musl: 1.32.0
+ lightningcss-win32-arm64-msvc: 1.32.0
+ lightningcss-win32-x64-msvc: 1.32.0
+
+ loader-runner@4.3.1: {}
+
+ loader-utils@2.0.4:
+ dependencies:
+ big.js: 5.2.2
+ emojis-list: 3.0.0
+ json5: 2.2.3
+
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
+ lodash-es@4.17.23: {}
+
+ lodash.merge@4.6.2: {}
+
+ lodash@4.17.23: {}
+
+ loose-envify@1.4.0:
+ dependencies:
+ js-tokens: 4.0.0
+
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
+ math-intrinsics@1.1.0: {}
+
+ merge-stream@2.0.0: {}
+
+ mime-db@1.52.0: {}
+
+ mime-types@2.1.35:
+ dependencies:
+ mime-db: 1.52.0
+
+ minimatch@10.2.4:
+ dependencies:
+ brace-expansion: 5.0.5
+
+ minimatch@3.1.5:
+ dependencies:
+ brace-expansion: 1.1.13
+
+ ml-array-max@1.2.4:
+ dependencies:
+ is-any-array: 2.0.1
+
+ ml-array-min@1.2.3:
+ dependencies:
+ is-any-array: 2.0.1
+
+ ml-array-rescale@1.3.7:
+ dependencies:
+ is-any-array: 2.0.1
+ ml-array-max: 1.2.4
+ ml-array-min: 1.2.3
+
+ ml-matrix@6.12.1:
+ dependencies:
+ is-any-array: 2.0.1
+ ml-array-rescale: 1.3.7
+
+ ms@2.1.3: {}
+
+ nanoid@3.3.11: {}
+
+ natural-compare@1.4.0: {}
+
+ neo-async@2.6.2: {}
+
+ node-releases@2.0.36: {}
+
+ object-assign@4.1.1: {}
+
+ optionator@0.9.4:
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.5
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ path-exists@4.0.0: {}
+
+ path-key@3.1.1: {}
+
+ path-to-regexp@8.2.0: {}
+
+ pdfast@0.2.0: {}
+
+ picocolors@1.1.1: {}
+
+ picomatch@4.0.4: {}
+
+ postcss-value-parser@4.2.0: {}
+
+ postcss@8.4.49:
+ dependencies:
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ postcss@8.5.8:
+ dependencies:
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ prelude-ls@1.2.1: {}
+
+ prop-types@15.8.1:
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ react-is: 16.13.1
+
+ proxy-from-env@2.1.0: {}
+
+ punycode@2.3.1: {}
+
+ rc-field-form@2.7.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
+ dependencies:
+ '@babel/runtime': 7.29.2
+ '@rc-component/async-validator': 5.1.0
+ rc-util: 5.44.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
+ rc-resize-observer@0.2.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
+ dependencies:
+ '@babel/runtime': 7.29.2
+ classnames: 2.5.1
+ rc-util: 5.44.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ resize-observer-polyfill: 1.5.1
+
+ rc-resize-observer@1.4.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
+ dependencies:
+ '@babel/runtime': 7.29.2
+ classnames: 2.5.1
+ rc-util: 5.44.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ resize-observer-polyfill: 1.5.1
+
+ rc-util@4.21.1:
+ dependencies:
+ add-dom-event-listener: 1.1.0
+ prop-types: 15.8.1
+ react-is: 16.13.1
+ react-lifecycles-compat: 3.0.4
+ shallowequal: 1.1.0
+
+ rc-util@5.44.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
+ dependencies:
+ '@babel/runtime': 7.29.2
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ react-is: 18.3.1
+
+ react-dom@19.2.4(react@19.2.4):
+ dependencies:
+ react: 19.2.4
+ scheduler: 0.27.0
+
+ react-is@16.13.1: {}
+
+ react-is@18.3.1: {}
+
+ react-lifecycles-compat@3.0.4: {}
+
+ react-router-dom@7.13.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
+ dependencies:
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ react-router: 7.13.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+
+ react-router@7.13.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
+ dependencies:
+ cookie: 1.1.1
+ react: 19.2.4
+ set-cookie-parser: 2.7.2
+ optionalDependencies:
+ react-dom: 19.2.4(react@19.2.4)
+
+ react@19.2.4: {}
+
+ reactcss@1.2.3(react@19.2.4):
+ dependencies:
+ lodash: 4.17.23
+ react: 19.2.4
+
+ require-from-string@2.0.2: {}
+
+ resize-observer-polyfill@1.5.1: {}
+
+ resolve-from@4.0.0: {}
+
+ rolldown@1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1):
+ dependencies:
+ '@oxc-project/types': 0.122.0
+ '@rolldown/pluginutils': 1.0.0-rc.12
+ optionalDependencies:
+ '@rolldown/binding-android-arm64': 1.0.0-rc.12
+ '@rolldown/binding-darwin-arm64': 1.0.0-rc.12
+ '@rolldown/binding-darwin-x64': 1.0.0-rc.12
+ '@rolldown/binding-freebsd-x64': 1.0.0-rc.12
+ '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.12
+ '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.12
+ '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.12
+ '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.12
+ '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.12
+ '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.12
+ '@rolldown/binding-linux-x64-musl': 1.0.0-rc.12
+ '@rolldown/binding-openharmony-arm64': 1.0.0-rc.12
+ '@rolldown/binding-wasm32-wasi': 1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)
+ '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.12
+ '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.12
+ transitivePeerDependencies:
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+
+ rw@1.3.3: {}
+
+ safe-stable-stringify@2.5.0: {}
+
+ safer-buffer@2.1.2: {}
+
+ scheduler@0.27.0: {}
+
+ schema-utils@4.3.3:
+ dependencies:
+ '@types/json-schema': 7.0.15
+ ajv: 8.18.0
+ ajv-formats: 2.1.1(ajv@8.18.0)
+ ajv-keywords: 5.1.0(ajv@8.18.0)
+
+ scroll-into-view-if-needed@3.1.0:
+ dependencies:
+ compute-scroll-into-view: 3.1.1
+
+ semver@6.3.1: {}
+
+ semver@7.7.4: {}
+
+ set-cookie-parser@2.7.2: {}
+
+ shallowequal@1.1.0: {}
+
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ simple-swizzle@0.2.4:
+ dependencies:
+ is-arrayish: 0.3.4
+
+ source-map-js@1.2.1: {}
+
+ source-map-support@0.5.21:
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+
+ source-map@0.6.1: {}
+
+ string-convert@0.2.1: {}
+
+ strip-json-comments@3.1.1: {}
+
+ styled-components@6.3.12(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
+ dependencies:
+ '@emotion/is-prop-valid': 1.4.0
+ '@emotion/unitless': 0.10.0
+ '@types/stylis': 4.2.7
+ css-to-react-native: 3.2.0
+ csstype: 3.2.3
+ postcss: 8.4.49
+ react: 19.2.4
+ shallowequal: 1.1.0
+ stylis: 4.3.6
+ tslib: 2.8.1
+ optionalDependencies:
+ react-dom: 19.2.4(react@19.2.4)
+
+ stylis@4.3.6: {}
+
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-color@8.1.1:
+ dependencies:
+ has-flag: 4.0.0
+
+ svg-path-parser@1.1.0: {}
+
+ swr@2.4.1(react@19.2.4):
+ dependencies:
+ dequal: 2.0.3
+ react: 19.2.4
+ use-sync-external-store: 1.6.0(react@19.2.4)
+
+ tapable@2.3.2: {}
+
+ terser-webpack-plugin@5.4.0(webpack@5.105.4):
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.31
+ jest-worker: 27.5.1
+ schema-utils: 4.3.3
+ terser: 5.46.1
+ webpack: 5.105.4
+
+ terser@5.46.1:
+ dependencies:
+ '@jridgewell/source-map': 0.3.11
+ acorn: 8.16.0
+ commander: 2.20.3
+ source-map-support: 0.5.21
+
+ text-segmentation@1.0.3:
+ dependencies:
+ utrie: 1.0.2
+
+ throttle-debounce@5.0.2: {}
+
+ tinycolor2@1.6.0: {}
+
+ tinyglobby@0.2.15:
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.4)
+ picomatch: 4.0.4
+
+ ts-api-utils@2.5.0(typescript@5.9.3):
+ dependencies:
+ typescript: 5.9.3
+
+ tslib@2.8.1: {}
+
+ type-check@0.4.0:
+ dependencies:
+ prelude-ls: 1.2.1
+
+ typescript-eslint@8.57.2(eslint@9.39.4)(typescript@5.9.3):
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 8.57.2(@typescript-eslint/parser@8.57.2(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3)
+ '@typescript-eslint/parser': 8.57.2(eslint@9.39.4)(typescript@5.9.3)
+ '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.57.2(eslint@9.39.4)(typescript@5.9.3)
+ eslint: 9.39.4
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ typescript@5.9.3: {}
+
+ undici-types@7.16.0: {}
+
+ update-browserslist-db@1.2.3(browserslist@4.28.1):
+ dependencies:
+ browserslist: 4.28.1
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
+ use-sync-external-store@1.6.0(react@19.2.4):
+ dependencies:
+ react: 19.2.4
+
+ utrie@1.0.2:
+ dependencies:
+ base64-arraybuffer: 1.0.2
+
+ vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)(terser@5.46.1):
+ dependencies:
+ lightningcss: 1.32.0
+ picomatch: 4.0.4
+ postcss: 8.5.8
+ rolldown: 1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)
+ tinyglobby: 0.2.15
+ optionalDependencies:
+ '@types/node': 24.12.0
+ fsevents: 2.3.3
+ terser: 5.46.1
+ transitivePeerDependencies:
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+
+ warning@4.0.3:
+ dependencies:
+ loose-envify: 1.4.0
+
+ watchpack@2.5.1:
+ dependencies:
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.11
+
+ webpack-sources@3.3.4: {}
+
+ webpack@5.105.4:
+ dependencies:
+ '@types/eslint-scope': 3.7.7
+ '@types/estree': 1.0.8
+ '@types/json-schema': 7.0.15
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/wasm-edit': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+ acorn: 8.16.0
+ acorn-import-phases: 1.0.4(acorn@8.16.0)
+ browserslist: 4.28.1
+ chrome-trace-event: 1.0.4
+ enhanced-resolve: 5.20.1
+ es-module-lexer: 2.0.0
+ eslint-scope: 5.1.1
+ events: 3.3.0
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.11
+ json-parse-even-better-errors: 2.3.1
+ loader-runner: 4.3.1
+ mime-types: 2.1.35
+ neo-async: 2.6.2
+ schema-utils: 4.3.3
+ tapable: 2.3.2
+ terser-webpack-plugin: 5.4.0(webpack@5.105.4)
+ watchpack: 2.5.1
+ webpack-sources: 3.3.4
+ transitivePeerDependencies:
+ - '@swc/core'
+ - esbuild
+ - uglify-js
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ word-wrap@1.2.5: {}
+
+ workerize-loader@2.0.2(webpack@5.105.4):
+ dependencies:
+ loader-utils: 2.0.4
+ webpack: 5.105.4
+
+ yallist@3.1.1: {}
+
+ yocto-queue@0.1.0: {}
+
+ zod-validation-error@4.0.2(zod@4.3.6):
+ dependencies:
+ zod: 4.3.6
+
+ zod@4.3.6: {}
+
+ zustand@5.0.12(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)):
+ optionalDependencies:
+ '@types/react': 19.2.14
+ react: 19.2.4
+ use-sync-external-store: 1.6.0(react@19.2.4)
diff --git a/admin-v2/public/favicon.svg b/admin-v2/public/favicon.svg
new file mode 100644
index 0000000..6893eb1
--- /dev/null
+++ b/admin-v2/public/favicon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/admin-v2/public/icons.svg b/admin-v2/public/icons.svg
new file mode 100644
index 0000000..e952219
--- /dev/null
+++ b/admin-v2/public/icons.svg
@@ -0,0 +1,24 @@
+
diff --git a/admin-v2/src/assets/hero.png b/admin-v2/src/assets/hero.png
new file mode 100644
index 0000000..cc51a3d
Binary files /dev/null and b/admin-v2/src/assets/hero.png differ
diff --git a/admin-v2/src/assets/react.svg b/admin-v2/src/assets/react.svg
new file mode 100644
index 0000000..6c87de9
--- /dev/null
+++ b/admin-v2/src/assets/react.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/admin-v2/src/assets/vite.svg b/admin-v2/src/assets/vite.svg
new file mode 100644
index 0000000..5101b67
--- /dev/null
+++ b/admin-v2/src/assets/vite.svg
@@ -0,0 +1 @@
+
diff --git a/admin-v2/src/layouts/AdminLayout.tsx b/admin-v2/src/layouts/AdminLayout.tsx
new file mode 100644
index 0000000..b7dfe2c
--- /dev/null
+++ b/admin-v2/src/layouts/AdminLayout.tsx
@@ -0,0 +1,103 @@
+// ============================================================
+// AdminLayout — ProLayout 管理后台布局
+// ============================================================
+
+import { Outlet, useNavigate, useLocation } from 'react-router-dom'
+import ProLayout from '@ant-design/pro-layout'
+import {
+ DashboardOutlined,
+ TeamOutlined,
+ CloudServerOutlined,
+ ApiOutlined,
+ KeyOutlined,
+ BarChartOutlined,
+ SwapOutlined,
+ SettingOutlined,
+ FileTextOutlined,
+ MessageOutlined,
+ RobotOutlined,
+ LogoutOutlined,
+} from '@ant-design/icons'
+import { useAuthStore } from '@/stores/authStore'
+import { Avatar, Dropdown, message } from 'antd'
+import type { MenuDataItem } from '@ant-design/pro-layout'
+
+const menuConfig: MenuDataItem[] = [
+ { path: '/', name: '仪表盘', icon: },
+ { path: '/accounts', name: '账号管理', icon: , permission: 'account:admin' },
+ { path: '/providers', name: '服务商', icon: , permission: 'provider:manage' },
+ { path: '/models', name: '模型管理', icon: , permission: 'model:read' },
+ { path: '/agent-templates', name: 'Agent 模板', icon: , permission: 'model:read' },
+ { path: '/api-keys', name: 'API 密钥', icon: , permission: 'admin:full' },
+ { path: '/usage', name: '用量统计', icon: , permission: 'admin:full' },
+ { path: '/relay', name: '中转任务', icon: , permission: 'relay:use' },
+ { path: '/config', name: '系统配置', icon: , permission: 'config:read' },
+ { path: '/prompts', name: '提示词管理', icon: , permission: 'prompt:read' },
+ { path: '/logs', name: '操作日志', icon: , permission: 'admin:full' },
+]
+
+function filterMenuByPermission(
+ items: MenuDataItem[],
+ hasPermission: (p: string) => boolean,
+): MenuDataItem[] {
+ return items
+ .filter((item) => !item.permission || hasPermission(item.permission as string))
+ .map(({ permission, ...rest }) => ({
+ ...rest,
+ children: rest.children ? filterMenuByPermission(rest.children, hasPermission) : undefined,
+ }))
+}
+
+export default function AdminLayout() {
+ const navigate = useNavigate()
+ const location = useLocation()
+ const { account, hasPermission, logout } = useAuthStore()
+
+ const menuData = filterMenuByPermission(menuConfig, hasPermission)
+
+ const handleLogout = () => {
+ logout()
+ message.success('已退出登录')
+ navigate('/login', { replace: true })
+ }
+
+ return (
+ Z}
+ layout="mix"
+ fixSiderbar
+ fixedHeader
+ location={{ pathname: location.pathname }}
+ menuDataRender={() => menuData}
+ menuItemRender={(item, dom) => (
+ item.path && navigate(item.path)}>{dom}
+ )}
+ avatarProps={{
+ src: undefined,
+ title: account?.display_name || account?.username || 'Admin',
+ size: 'small',
+ render: (_, dom) => (
+ ,
+ label: '退出登录',
+ onClick: handleLogout,
+ },
+ ],
+ }}
+ >
+ {dom}
+
+ ),
+ }}
+ suppressSiderWhenMenuEmpty
+ contentStyle={{ padding: 24 }}
+ >
+
+
+ )
+}
diff --git a/admin-v2/src/main.tsx b/admin-v2/src/main.tsx
new file mode 100644
index 0000000..c50dabc
--- /dev/null
+++ b/admin-v2/src/main.tsx
@@ -0,0 +1,26 @@
+import { createRoot } from 'react-dom/client'
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
+import { RouterProvider } from 'react-router-dom'
+import { ConfigProvider, App as AntApp } from 'antd'
+import zhCN from 'antd/locale/zh_CN'
+import { router } from './router'
+
+const queryClient = new QueryClient({
+ defaultOptions: {
+ queries: {
+ retry: 1,
+ refetchOnWindowFocus: false,
+ staleTime: 30_000,
+ },
+ },
+})
+
+createRoot(document.getElementById('root')!).render(
+
+
+
+
+
+
+ ,
+)
diff --git a/admin-v2/src/pages/Accounts.tsx b/admin-v2/src/pages/Accounts.tsx
new file mode 100644
index 0000000..01569d0
--- /dev/null
+++ b/admin-v2/src/pages/Accounts.tsx
@@ -0,0 +1,170 @@
+// ============================================================
+// 账号管理
+// ============================================================
+
+import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
+import { Button, message, Tag, Modal, Form, Input, Select, Popconfirm, Space } from 'antd'
+import { PlusOutlined } from '@ant-design/icons'
+import type { ProColumns } from '@ant-design/pro-components'
+import { ProTable } from '@ant-design/pro-components'
+import { accountService } from '@/services/accounts'
+import type { AccountPublic } from '@/types'
+
+const roleLabels: Record = {
+ super_admin: '超级管理员',
+ admin: '管理员',
+ user: '用户',
+}
+
+const roleColors: Record = {
+ super_admin: 'red',
+ admin: 'blue',
+ user: 'default',
+}
+
+const statusLabels: Record = {
+ active: '正常',
+ disabled: '已禁用',
+ suspended: '已封禁',
+}
+
+const statusColors: Record = {
+ active: 'green',
+ disabled: 'default',
+ suspended: 'red',
+}
+
+export default function Accounts() {
+ const queryClient = useQueryClient()
+ const [form] = Form.useForm()
+ const [modalOpen, setModalOpen] = useState(false)
+ const [editingId, setEditingId] = useState(null)
+
+ const { data, isLoading } = useQuery({
+ queryKey: ['accounts'],
+ queryFn: () => accountService.list(),
+ })
+
+ const updateMutation = useMutation({
+ mutationFn: ({ id, data }: { id: string; data: Partial }) =>
+ accountService.update(id, data),
+ onSuccess: () => {
+ message.success('更新成功')
+ queryClient.invalidateQueries({ queryKey: ['accounts'] })
+ setModalOpen(false)
+ },
+ onError: (err: Error) => message.error(err.message || '更新失败'),
+ })
+
+ const statusMutation = useMutation({
+ mutationFn: ({ id, status }: { id: string; status: AccountPublic['status'] }) =>
+ accountService.updateStatus(id, { status }),
+ onSuccess: () => {
+ message.success('状态更新成功')
+ queryClient.invalidateQueries({ queryKey: ['accounts'] })
+ },
+ onError: (err: Error) => message.error(err.message || '状态更新失败'),
+ })
+
+ const columns: ProColumns[] = [
+ { title: '用户名', dataIndex: 'username', width: 120 },
+ { title: '显示名', dataIndex: 'display_name', width: 120 },
+ { title: '邮箱', dataIndex: 'email', width: 180 },
+ {
+ title: '角色',
+ dataIndex: 'role',
+ width: 120,
+ render: (_, record) => {roleLabels[record.role] || record.role},
+ },
+ {
+ title: '状态',
+ dataIndex: 'status',
+ width: 100,
+ render: (_, record) => {statusLabels[record.status] || record.status},
+ },
+ {
+ title: '2FA',
+ dataIndex: 'totp_enabled',
+ width: 80,
+ render: (_, record) => record.totp_enabled ? 已启用 : 未启用,
+ },
+ {
+ title: '最后登录',
+ dataIndex: 'last_login_at',
+ width: 180,
+ render: (_, record) => record.last_login_at ? new Date(record.last_login_at).toLocaleString('zh-CN') : '-',
+ },
+ {
+ title: '操作',
+ width: 200,
+ render: (_, record) => (
+
+
+ {record.status === 'active' ? (
+ statusMutation.mutate({ id: record.id, status: 'disabled' })}>
+
+
+ ) : (
+ statusMutation.mutate({ id: record.id, status: 'active' })}>
+
+
+ )}
+
+ ),
+ },
+ ]
+
+ const handleSave = async () => {
+ const values = await form.validateFields()
+ if (editingId) {
+ updateMutation.mutate({ id: editingId, data: values })
+ }
+ }
+
+ return (
+
+ )
+}
+
+import { useState } from 'react'
diff --git a/admin-v2/src/pages/AgentTemplates.tsx b/admin-v2/src/pages/AgentTemplates.tsx
new file mode 100644
index 0000000..492ff7d
--- /dev/null
+++ b/admin-v2/src/pages/AgentTemplates.tsx
@@ -0,0 +1,190 @@
+// ============================================================
+// Agent 模板管理
+// ============================================================
+
+import { useState } from 'react'
+import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
+import { Button, message, Tag, Modal, Form, Input, Select, InputNumber, Space, Popconfirm, Descriptions } from 'antd'
+import { PlusOutlined } from '@ant-design/icons'
+import type { ProColumns } from '@ant-design/pro-components'
+import { ProTable } from '@ant-design/pro-components'
+import { agentTemplateService } from '@/services/agent-templates'
+import type { AgentTemplate } from '@/types'
+
+const { TextArea } = Input
+
+const sourceLabels: Record = { builtin: '内置', custom: '自定义' }
+const visibilityLabels: Record = { public: '公开', team: '团队', private: '私有' }
+const statusLabels: Record = { active: '活跃', archived: '已归档' }
+const statusColors: Record = { active: 'green', archived: 'default' }
+
+export default function AgentTemplates() {
+ const queryClient = useQueryClient()
+ const [form] = Form.useForm()
+ const [modalOpen, setModalOpen] = useState(false)
+ const [detailRecord, setDetailRecord] = useState(null)
+
+ const { data, isLoading } = useQuery({
+ queryKey: ['agent-templates'],
+ queryFn: () => agentTemplateService.list(),
+ })
+
+ const createMutation = useMutation({
+ mutationFn: (data: Parameters[0]) =>
+ agentTemplateService.create(data),
+ onSuccess: () => {
+ message.success('创建成功')
+ queryClient.invalidateQueries({ queryKey: ['agent-templates'] })
+ setModalOpen(false)
+ form.resetFields()
+ },
+ onError: (err: Error) => message.error(err.message || '创建失败'),
+ })
+
+ const archiveMutation = useMutation({
+ mutationFn: (id: string) => agentTemplateService.archive(id),
+ onSuccess: () => {
+ message.success('已归档')
+ queryClient.invalidateQueries({ queryKey: ['agent-templates'] })
+ },
+ onError: (err: Error) => message.error(err.message || '归档失败'),
+ })
+
+ const columns: ProColumns[] = [
+ { title: '名称', dataIndex: 'name', width: 160 },
+ { title: '分类', dataIndex: 'category', width: 100 },
+ { title: '模型', dataIndex: 'model', width: 140, render: (_, r) => r.model || '-' },
+ {
+ title: '来源',
+ dataIndex: 'source',
+ width: 80,
+ render: (_, r) => {sourceLabels[r.source] || r.source},
+ },
+ {
+ title: '可见性',
+ dataIndex: 'visibility',
+ width: 80,
+ render: (_, r) => {visibilityLabels[r.visibility] || r.visibility},
+ },
+ {
+ title: '状态',
+ dataIndex: 'status',
+ width: 80,
+ render: (_, r) => {statusLabels[r.status] || r.status},
+ },
+ { title: '版本', dataIndex: 'current_version', width: 70 },
+ {
+ title: '操作',
+ width: 180,
+ render: (_, record) => (
+
+
+ {record.status === 'active' && (
+ archiveMutation.mutate(record.id)}>
+
+
+ )}
+
+ ),
+ },
+ ]
+
+ const handleCreate = async () => {
+ const values = await form.validateFields()
+ createMutation.mutate(values)
+ }
+
+ return (
+
+ )
+}
diff --git a/admin-v2/src/pages/ApiKeys.tsx b/admin-v2/src/pages/ApiKeys.tsx
new file mode 100644
index 0000000..9a533bd
--- /dev/null
+++ b/admin-v2/src/pages/ApiKeys.tsx
@@ -0,0 +1,165 @@
+// ============================================================
+// API 密钥管理
+// ============================================================
+
+import { useState } from 'react'
+import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
+import { Button, message, Tag, Modal, Form, Input, InputNumber, Select, Popconfirm, Space, Typography } from 'antd'
+import { PlusOutlined, CopyOutlined } from '@ant-design/icons'
+import type { ProColumns } from '@ant-design/pro-components'
+import { ProTable } from '@ant-design/pro-components'
+import { apiKeyService } from '@/services/api-keys'
+import type { TokenInfo } from '@/types'
+
+const { Text } = Typography
+
+export default function ApiKeys() {
+ const queryClient = useQueryClient()
+ const [form] = Form.useForm()
+ const [modalOpen, setModalOpen] = useState(false)
+ const [newToken, setNewToken] = useState(null)
+
+ const { data, isLoading } = useQuery({
+ queryKey: ['api-keys'],
+ queryFn: () => apiKeyService.list(),
+ })
+
+ const createMutation = useMutation({
+ mutationFn: (data: { name: string; expires_days?: number; permissions: string[] }) =>
+ apiKeyService.create(data),
+ onSuccess: (result: TokenInfo) => {
+ message.success('创建成功')
+ queryClient.invalidateQueries({ queryKey: ['api-keys'] })
+ if (result.token) {
+ setNewToken(result.token)
+ }
+ setModalOpen(false)
+ form.resetFields()
+ },
+ onError: (err: Error) => message.error(err.message || '创建失败'),
+ })
+
+ const revokeMutation = useMutation({
+ mutationFn: (id: string) => apiKeyService.revoke(id),
+ onSuccess: () => {
+ message.success('已撤销')
+ queryClient.invalidateQueries({ queryKey: ['api-keys'] })
+ },
+ onError: (err: Error) => message.error(err.message || '撤销失败'),
+ })
+
+ const columns: ProColumns[] = [
+ { title: '名称', dataIndex: 'name', width: 160 },
+ { title: '前缀', dataIndex: 'token_prefix', width: 120, render: (_, r) => {r.token_prefix}... },
+ {
+ title: '权限',
+ dataIndex: 'permissions',
+ width: 200,
+ render: (_, r) => r.permissions?.map((p) => {p}),
+ },
+ {
+ title: '过期时间',
+ dataIndex: 'expires_at',
+ width: 180,
+ render: (_, r) => r.expires_at ? new Date(r.expires_at).toLocaleString('zh-CN') : '永不过期',
+ },
+ {
+ title: '最后使用',
+ dataIndex: 'last_used_at',
+ width: 180,
+ render: (_, r) => r.last_used_at ? new Date(r.last_used_at).toLocaleString('zh-CN') : '-',
+ },
+ {
+ title: '创建时间',
+ dataIndex: 'created_at',
+ width: 180,
+ render: (_, r) => new Date(r.created_at).toLocaleString('zh-CN'),
+ },
+ {
+ title: '操作',
+ width: 100,
+ render: (_, record) => (
+ revokeMutation.mutate(record.id)}>
+
+
+ ),
+ },
+ ]
+
+ const handleCreate = async () => {
+ const values = await form.validateFields()
+ createMutation.mutate(values)
+ }
+
+ const copyToken = () => {
+ if (newToken) {
+ navigator.clipboard.writeText(newToken)
+ message.success('已复制到剪贴板')
+ }
+ }
+
+ return (
+
+ )
+}
diff --git a/admin-v2/src/pages/Config.tsx b/admin-v2/src/pages/Config.tsx
new file mode 100644
index 0000000..1e9ba30
--- /dev/null
+++ b/admin-v2/src/pages/Config.tsx
@@ -0,0 +1,110 @@
+// ============================================================
+// 系统配置
+// ============================================================
+
+import { useState } from 'react'
+import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
+import { Card, Tabs, message, Tag, Input, Button, Space, Typography } from 'antd'
+import type { ProColumns } from '@ant-design/pro-components'
+import { ProTable } from '@ant-design/pro-components'
+import { configService } from '@/services/config'
+import type { ConfigItem } from '@/types'
+
+const { Title } = Typography
+
+export default function Config() {
+ const queryClient = useQueryClient()
+ const [category, setCategory] = useState('general')
+ const [editingId, setEditingId] = useState(null)
+ const [editValue, setEditValue] = useState('')
+
+ const { data, isLoading } = useQuery({
+ queryKey: ['config', category],
+ queryFn: () => configService.list({ category }),
+ })
+
+ const updateMutation = useMutation({
+ mutationFn: ({ id, value }: { id: string; value: string }) =>
+ configService.update(id, { value }),
+ onSuccess: () => {
+ message.success('配置已更新')
+ queryClient.invalidateQueries({ queryKey: ['config', category] })
+ setEditingId(null)
+ },
+ onError: (err: Error) => message.error(err.message || '更新失败'),
+ })
+
+ const columns: ProColumns[] = [
+ { title: '配置路径', dataIndex: 'key_path', width: 200, render: (_, r) => {r.key_path} },
+ {
+ title: '当前值',
+ dataIndex: 'current_value',
+ width: 250,
+ render: (_, record) => {
+ if (editingId === record.id) {
+ return (
+
+ setEditValue(e.target.value)}
+ style={{ width: 180 }}
+ onPressEnter={() => updateMutation.mutate({ id: record.id, value: editValue })}
+ />
+
+
+
+ )
+ }
+ return (
+ { setEditingId(record.id); setEditValue(record.current_value || '') }}
+ style={{ cursor: 'pointer', color: '#1677ff' }}
+ >
+ {record.current_value || 未设置}
+
+ )
+ },
+ },
+ { title: '默认值', dataIndex: 'default_value', width: 200, render: (_, r) => r.default_value || '-' },
+ { title: '类型', dataIndex: 'value_type', width: 80, render: (_, r) => {r.value_type} },
+ { title: '描述', dataIndex: 'description', width: 200, ellipsis: true },
+ {
+ title: '需要重启',
+ dataIndex: 'requires_restart',
+ width: 90,
+ render: (_, r) => r.requires_restart ? 是 : 否,
+ },
+ ]
+
+ return (
+
+
系统配置
+
+
{ setCategory(key); setEditingId(null) }}
+ items={[
+ { key: 'general', label: '通用' },
+ { key: 'auth', label: '认证' },
+ { key: 'relay', label: '中转' },
+ { key: 'model', label: '模型' },
+ { key: 'rate_limit', label: '限流' },
+ { key: 'log', label: '日志' },
+ ]}
+ />
+
+
+ columns={columns}
+ dataSource={data ?? []}
+ loading={isLoading}
+ rowKey="id"
+ search={false}
+ toolBarRender={false}
+ pagination={false}
+ size="small"
+ />
+
+ )
+}
diff --git a/admin-v2/src/pages/Dashboard.tsx b/admin-v2/src/pages/Dashboard.tsx
new file mode 100644
index 0000000..6ccc8ae
--- /dev/null
+++ b/admin-v2/src/pages/Dashboard.tsx
@@ -0,0 +1,121 @@
+// ============================================================
+// 仪表盘页面
+// ============================================================
+
+import { useQuery } from '@tanstack/react-query'
+import { Card, Col, Row, Statistic, Table, Tag, Typography, Spin, Alert } from 'antd'
+import {
+ TeamOutlined,
+ CloudServerOutlined,
+ ApiOutlined,
+ ThunderboltOutlined,
+ ColumnWidthOutlined,
+} from '@ant-design/icons'
+import { statsService } from '@/services/stats'
+import { logService } from '@/services/logs'
+import type { OperationLog } from '@/types'
+
+const { Title } = Typography
+
+const actionLabels: Record = {
+ login: '登录', logout: '登出',
+ create_account: '创建账号', update_account: '更新账号', delete_account: '删除账号',
+ create_provider: '创建服务商', update_provider: '更新服务商', delete_provider: '删除服务商',
+ create_model: '创建模型', update_model: '更新模型', delete_model: '删除模型',
+ create_token: '创建密钥', revoke_token: '撤销密钥',
+ update_config: '更新配置',
+ create_prompt: '创建提示词', update_prompt: '更新提示词', archive_prompt: '归档提示词',
+ desktop_audit: '桌面端审计',
+}
+
+const actionColors: Record = {
+ login: 'green', logout: 'default',
+ create_account: 'blue', update_account: 'orange', delete_account: 'red',
+ create_provider: 'blue', update_provider: 'orange', delete_provider: 'red',
+ create_model: 'blue', update_model: 'orange', delete_model: 'red',
+ create_token: 'blue', revoke_token: 'red',
+ update_config: 'orange',
+ create_prompt: 'blue', update_prompt: 'orange', archive_prompt: 'red',
+ desktop_audit: 'default',
+}
+
+export default function Dashboard() {
+ const { data: stats, isLoading: statsLoading, error: statsError } = useQuery({
+ queryKey: ['dashboard-stats'],
+ queryFn: () => statsService.dashboard(),
+ })
+
+ const { data: logsData, isLoading: logsLoading } = useQuery({
+ queryKey: ['recent-logs'],
+ queryFn: () => logService.list({ page: 1, page_size: 10 }),
+ })
+
+ if (statsError) {
+ return
+ }
+
+ const statCards = [
+ { title: '总账号', value: stats?.total_accounts ?? 0, icon: , color: '#1677ff' },
+ { title: '活跃服务商', value: stats?.active_providers ?? 0, icon: , color: '#52c41a' },
+ { title: '活跃模型', value: stats?.active_models ?? 0, icon: , color: '#722ed1' },
+ { title: '今日请求', value: stats?.tasks_today ?? 0, icon: , color: '#fa8c16' },
+ { title: '今日 Token', value: ((stats?.tokens_today_input ?? 0) + (stats?.tokens_today_output ?? 0)), icon: , color: '#eb2f96' },
+ ]
+
+ const logColumns = [
+ {
+ title: '操作类型',
+ dataIndex: 'action',
+ key: 'action',
+ width: 140,
+ render: (action: string) => (
+
+ {actionLabels[action] || action}
+
+ ),
+ },
+ { title: '目标类型', dataIndex: 'target_type', key: 'target_type', width: 100, render: (v: string | null) => v || '-' },
+ {
+ title: '时间',
+ dataIndex: 'created_at',
+ key: 'created_at',
+ width: 180,
+ render: (v: string) => new Date(v).toLocaleString('zh-CN'),
+ },
+ ]
+
+ return (
+
+
仪表盘
+
+
+ {statsLoading ? (
+
+ ) : (
+ statCards.map((card) => (
+
+
+ {card.icon}}
+ />
+
+
+ ))
+ )}
+
+
+
+
+ columns={logColumns}
+ dataSource={logsData?.items ?? []}
+ loading={logsLoading}
+ rowKey="id"
+ pagination={false}
+ size="small"
+ />
+
+
+ )
+}
diff --git a/admin-v2/src/pages/Login.tsx b/admin-v2/src/pages/Login.tsx
new file mode 100644
index 0000000..1338c25
--- /dev/null
+++ b/admin-v2/src/pages/Login.tsx
@@ -0,0 +1,138 @@
+// ============================================================
+// 登录页面
+// ============================================================
+
+import { useState } from 'react'
+import { useNavigate, useSearchParams } from 'react-router-dom'
+import { LoginForm, ProFormText } from '@ant-design/pro-components'
+import { LockOutlined, UserOutlined, SafetyOutlined } from '@ant-design/icons'
+import { message, Divider, Typography } from 'antd'
+import { authService } from '@/services/auth'
+import { useAuthStore } from '@/stores/authStore'
+import type { LoginRequest } from '@/types'
+
+const { Title, Text } = Typography
+
+export default function Login() {
+ const navigate = useNavigate()
+ const [searchParams] = useSearchParams()
+ const loginStore = useAuthStore((s) => s.login)
+ const [needTotp, setNeedTotp] = useState(false)
+ const [loading, setLoading] = useState(false)
+
+ const handleSubmit = async (values: Record) => {
+ setLoading(true)
+ try {
+ const data: LoginRequest = {
+ username: values.username?.trim() || '',
+ password: values.password || '',
+ totp_code: values.totp_code?.trim() || undefined,
+ }
+
+ const res = await authService.login(data)
+ loginStore(res.token, res.refresh_token, res.account)
+
+ message.success('登录成功')
+ const from = searchParams.get('from') || '/'
+ navigate(from, { replace: true })
+ } catch (err: unknown) {
+ const error = err as { message?: string; status?: number }
+ const msg = error.message || ''
+ if (msg.includes('TOTP') || msg.includes('totp') || msg.includes('2FA') || msg.includes('验证码') || error.status === 403) {
+ setNeedTotp(true)
+ message.warning(msg || '请输入两步验证码')
+ } else {
+ message.error(msg || '登录失败,请检查用户名和密码')
+ }
+ } finally {
+ setLoading(false)
+ }
+ }
+
+ return (
+
+ {/* 左侧品牌区 */}
+
+
+ ZCLAW
+
+
AI Agent 管理平台
+
+
+ 统一管理 AI 服务商、模型配置、API 密钥、用量监控与系统配置
+
+
+
+ {/* 右侧登录表单 */}
+
+
+
登录
+
+ 输入您的账号信息以继续
+
+
+
+ ,
+ autoComplete: 'username',
+ }}
+ placeholder="请输入用户名"
+ rules={[{ required: true, message: '请输入用户名' }]}
+ />
+ ,
+ autoComplete: 'current-password',
+ }}
+ placeholder="请输入密码"
+ rules={[{ required: true, message: '请输入密码' }]}
+ />
+ {needTotp && (
+ ,
+ maxLength: 6,
+ autoComplete: 'one-time-code',
+ }}
+ placeholder="请输入 6 位验证码"
+ rules={[{ required: true, message: '请输入验证码' }]}
+ />
+ )}
+
+
+
+
+ )
+}
diff --git a/admin-v2/src/pages/Logs.tsx b/admin-v2/src/pages/Logs.tsx
new file mode 100644
index 0000000..ab485cb
--- /dev/null
+++ b/admin-v2/src/pages/Logs.tsx
@@ -0,0 +1,112 @@
+// ============================================================
+// 操作日志
+// ============================================================
+
+import { useState } from 'react'
+import { useQuery } from '@tanstack/react-query'
+import { Tag, Select, Typography } from 'antd'
+import type { ProColumns } from '@ant-design/pro-components'
+import { ProTable } from '@ant-design/pro-components'
+import { logService } from '@/services/logs'
+import type { OperationLog } from '@/types'
+
+const { Title } = Typography
+
+const actionLabels: Record = {
+ login: '登录', logout: '登出',
+ create_account: '创建账号', update_account: '更新账号', delete_account: '删除账号',
+ create_provider: '创建服务商', update_provider: '更新服务商', delete_provider: '删除服务商',
+ create_model: '创建模型', update_model: '更新模型', delete_model: '删除模型',
+ create_token: '创建密钥', revoke_token: '撤销密钥',
+ update_config: '更新配置',
+ create_prompt: '创建提示词', update_prompt: '更新提示词', archive_prompt: '归档提示词',
+ desktop_audit: '桌面端审计',
+}
+
+const actionColors: Record = {
+ login: 'green', logout: 'default',
+ create_account: 'blue', update_account: 'orange', delete_account: 'red',
+ create_provider: 'blue', update_provider: 'orange', delete_provider: 'red',
+ create_model: 'blue', update_model: 'orange', delete_model: 'red',
+ create_token: 'blue', revoke_token: 'red',
+ update_config: 'orange',
+ create_prompt: 'blue', update_prompt: 'orange', archive_prompt: 'red',
+ desktop_audit: 'default',
+}
+
+const actionOptions = Object.entries(actionLabels).map(([value, label]) => ({ value, label }))
+
+export default function Logs() {
+ const [page, setPage] = useState(1)
+ const [actionFilter, setActionFilter] = useState(undefined)
+
+ const { data, isLoading } = useQuery({
+ queryKey: ['logs', page, actionFilter],
+ queryFn: () => logService.list({ page, page_size: 20, action: actionFilter }),
+ })
+
+ const columns: ProColumns[] = [
+ {
+ title: '操作类型',
+ dataIndex: 'action',
+ width: 140,
+ render: (_, r) => (
+
+ {actionLabels[r.action] || r.action}
+
+ ),
+ },
+ { title: '目标类型', dataIndex: 'target_type', width: 100, render: (_, r) => r.target_type || '-' },
+ { title: '目标 ID', dataIndex: 'target_id', width: 120, render: (_, r) => r.target_id ? {r.target_id.substring(0, 8)}... : '-' },
+ {
+ title: '详情',
+ dataIndex: 'details',
+ width: 250,
+ ellipsis: true,
+ render: (_, r) => {
+ if (!r.details) return '-'
+ if (typeof r.details === 'string') return r.details
+ return JSON.stringify(r.details)
+ },
+ },
+ { title: 'IP 地址', dataIndex: 'ip_address', width: 130, render: (_, r) => {r.ip_address || '-'} },
+ {
+ title: '时间',
+ dataIndex: 'created_at',
+ width: 180,
+ render: (_, r) => new Date(r.created_at).toLocaleString('zh-CN'),
+ },
+ ]
+
+ return (
+
+
+
操作日志
+
+
+
+ columns={columns}
+ dataSource={data?.items ?? []}
+ loading={isLoading}
+ rowKey="id"
+ search={false}
+ toolBarRender={false}
+ pagination={{
+ total: data?.total ?? 0,
+ pageSize: 20,
+ current: page,
+ onChange: setPage,
+ showSizeChanger: false,
+ }}
+ />
+
+ )
+}
diff --git a/admin-v2/src/pages/Models.tsx b/admin-v2/src/pages/Models.tsx
new file mode 100644
index 0000000..f8be5c8
--- /dev/null
+++ b/admin-v2/src/pages/Models.tsx
@@ -0,0 +1,186 @@
+// ============================================================
+// 模型管理
+// ============================================================
+
+import { useState } from 'react'
+import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
+import { Button, message, Tag, Modal, Form, Input, InputNumber, Switch, Select, Space, Popconfirm } from 'antd'
+import { PlusOutlined } from '@ant-design/icons'
+import type { ProColumns } from '@ant-design/pro-components'
+import { ProTable } from '@ant-design/pro-components'
+import { modelService } from '@/services/models'
+import { providerService } from '@/services/providers'
+import type { Model } from '@/types'
+
+export default function Models() {
+ const queryClient = useQueryClient()
+ const [form] = Form.useForm()
+ const [modalOpen, setModalOpen] = useState(false)
+ const [editingId, setEditingId] = useState(null)
+
+ const { data, isLoading } = useQuery({
+ queryKey: ['models'],
+ queryFn: () => modelService.list(),
+ })
+
+ const { data: providersData } = useQuery({
+ queryKey: ['providers-for-select'],
+ queryFn: () => providerService.list(),
+ })
+
+ const createMutation = useMutation({
+ mutationFn: (data: Partial>) => modelService.create(data),
+ onSuccess: () => {
+ message.success('创建成功')
+ queryClient.invalidateQueries({ queryKey: ['models'] })
+ setModalOpen(false)
+ form.resetFields()
+ },
+ onError: (err: Error) => message.error(err.message || '创建失败'),
+ })
+
+ const updateMutation = useMutation({
+ mutationFn: ({ id, data }: { id: string; data: Partial> }) =>
+ modelService.update(id, data),
+ onSuccess: () => {
+ message.success('更新成功')
+ queryClient.invalidateQueries({ queryKey: ['models'] })
+ setModalOpen(false)
+ },
+ onError: (err: Error) => message.error(err.message || '更新失败'),
+ })
+
+ const deleteMutation = useMutation({
+ mutationFn: (id: string) => modelService.delete(id),
+ onSuccess: () => {
+ message.success('删除成功')
+ queryClient.invalidateQueries({ queryKey: ['models'] })
+ },
+ onError: (err: Error) => message.error(err.message || '删除失败'),
+ })
+
+ const columns: ProColumns[] = [
+ { title: '模型 ID', dataIndex: 'model_id', width: 180, render: (_, r) => {r.model_id} },
+ { title: '别名', dataIndex: 'alias', width: 140 },
+ {
+ title: '服务商',
+ dataIndex: 'provider_id',
+ width: 140,
+ render: (_, r) => {
+ const provider = providersData?.items?.find((p) => p.id === r.provider_id)
+ return provider?.display_name || r.provider_id.substring(0, 8)
+ },
+ },
+ { title: '上下文窗口', dataIndex: 'context_window', width: 110, render: (_, r) => r.context_window?.toLocaleString() },
+ { title: '最大输出', dataIndex: 'max_output_tokens', width: 100, render: (_, r) => r.max_output_tokens?.toLocaleString() },
+ {
+ title: '流式',
+ dataIndex: 'supports_streaming',
+ width: 70,
+ render: (_, r) => r.supports_streaming ? 是 : 否,
+ },
+ {
+ title: '视觉',
+ dataIndex: 'supports_vision',
+ width: 70,
+ render: (_, r) => r.supports_vision ? 是 : 否,
+ },
+ {
+ title: '状态',
+ dataIndex: 'enabled',
+ width: 70,
+ render: (_, r) => r.enabled ? 启用 : 禁用,
+ },
+ {
+ title: '操作',
+ width: 160,
+ render: (_, record) => (
+
+
+ deleteMutation.mutate(record.id)}>
+
+
+
+ ),
+ },
+ ]
+
+ const handleSave = async () => {
+ const values = await form.validateFields()
+ if (editingId) {
+ updateMutation.mutate({ id: editingId, data: values })
+ } else {
+ createMutation.mutate(values)
+ }
+ }
+
+ return (
+
+ )
+}
diff --git a/admin-v2/src/pages/Prompts.tsx b/admin-v2/src/pages/Prompts.tsx
new file mode 100644
index 0000000..c6bd4cc
--- /dev/null
+++ b/admin-v2/src/pages/Prompts.tsx
@@ -0,0 +1,228 @@
+// ============================================================
+// 提示词管理
+// ============================================================
+
+import { useState } from 'react'
+import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
+import { Button, message, Tag, Modal, Form, Input, Select, Space, Popconfirm, Descriptions, Tabs, Typography } from 'antd'
+import { PlusOutlined } from '@ant-design/icons'
+import type { ProColumns } from '@ant-design/pro-components'
+import { ProTable } from '@ant-design/pro-components'
+import { promptService } from '@/services/prompts'
+import type { PromptTemplate, PromptVersion } from '@/types'
+
+const { TextArea } = Input
+const { Text } = Typography
+
+const sourceLabels: Record = { builtin: '内置', custom: '自定义' }
+const statusLabels: Record = { active: '活跃', deprecated: '已废弃', archived: '已归档' }
+const statusColors: Record = { active: 'green', deprecated: 'orange', archived: 'default' }
+
+export default function Prompts() {
+ const queryClient = useQueryClient()
+ const [form] = Form.useForm()
+ const [createOpen, setCreateOpen] = useState(false)
+ const [detailName, setDetailName] = useState(null)
+
+ const { data, isLoading } = useQuery({
+ queryKey: ['prompts'],
+ queryFn: () => promptService.list(),
+ })
+
+ const { data: detailData } = useQuery({
+ queryKey: ['prompt-detail', detailName],
+ queryFn: () => promptService.get(detailName!),
+ enabled: !!detailName,
+ })
+
+ const { data: versionsData } = useQuery({
+ queryKey: ['prompt-versions', detailName],
+ queryFn: () => promptService.listVersions(detailName!),
+ enabled: !!detailName,
+ })
+
+ const createMutation = useMutation({
+ mutationFn: (data: Parameters[0]) => promptService.create(data),
+ onSuccess: () => {
+ message.success('创建成功')
+ queryClient.invalidateQueries({ queryKey: ['prompts'] })
+ setCreateOpen(false)
+ form.resetFields()
+ },
+ onError: (err: Error) => message.error(err.message || '创建失败'),
+ })
+
+ const archiveMutation = useMutation({
+ mutationFn: (name: string) => promptService.archive(name),
+ onSuccess: () => {
+ message.success('已归档')
+ queryClient.invalidateQueries({ queryKey: ['prompts'] })
+ },
+ onError: (err: Error) => message.error(err.message || '归档失败'),
+ })
+
+ const rollbackMutation = useMutation({
+ mutationFn: ({ name, version }: { name: string; version: number }) =>
+ promptService.rollback(name, version),
+ onSuccess: () => {
+ message.success('回滚成功')
+ queryClient.invalidateQueries({ queryKey: ['prompts'] })
+ queryClient.invalidateQueries({ queryKey: ['prompt-detail', detailName] })
+ queryClient.invalidateQueries({ queryKey: ['prompt-versions', detailName] })
+ },
+ onError: (err: Error) => message.error(err.message || '回滚失败'),
+ })
+
+ const columns: ProColumns[] = [
+ { title: '名称', dataIndex: 'name', width: 200, render: (_, r) => {r.name} },
+ { title: '分类', dataIndex: 'category', width: 100 },
+ { title: '描述', dataIndex: 'description', width: 200, ellipsis: true },
+ {
+ title: '来源',
+ dataIndex: 'source',
+ width: 80,
+ render: (_, r) => {sourceLabels[r.source]},
+ },
+ { title: '版本', dataIndex: 'current_version', width: 70 },
+ {
+ title: '状态',
+ dataIndex: 'status',
+ width: 90,
+ render: (_, r) => {statusLabels[r.status]},
+ },
+ {
+ title: '操作',
+ width: 180,
+ render: (_, record) => (
+
+
+ {record.status === 'active' && (
+ archiveMutation.mutate(record.name)}>
+
+
+ )}
+
+ ),
+ },
+ ]
+
+ const handleCreate = async () => {
+ const values = await form.validateFields()
+ createMutation.mutate(values)
+ }
+
+ const versionColumns: ProColumns[] = [
+ { title: '版本', dataIndex: 'version', width: 60 },
+ { title: '更新说明', dataIndex: 'changelog', width: 200, ellipsis: true },
+ { title: '最低版本', dataIndex: 'min_app_version', width: 100, render: (_, r) => r.min_app_version || '-' },
+ {
+ title: '创建时间',
+ dataIndex: 'created_at',
+ width: 180,
+ render: (_, r) => new Date(r.created_at).toLocaleString('zh-CN'),
+ },
+ {
+ title: '操作',
+ width: 80,
+ render: (_, record) => (
+ detailName && rollbackMutation.mutate({ name: detailName, version: record.version })}
+ >
+
+
+ ),
+ },
+ ]
+
+ return (
+
+
+ columns={columns}
+ dataSource={data?.items ?? []}
+ loading={isLoading}
+ rowKey="id"
+ search={false}
+ toolBarRender={() => [
+ } onClick={() => { form.resetFields(); setCreateOpen(true) }}>
+ 新建提示词
+ ,
+ ]}
+ pagination={{
+ total: data?.total ?? 0,
+ pageSize: data?.page_size ?? 20,
+ current: data?.page ?? 1,
+ showSizeChanger: false,
+ }}
+ />
+
+ { setCreateOpen(false); form.resetFields() }}
+ confirmLoading={createMutation.isPending}
+ width={640}
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ setDetailName(null)}
+ footer={null}
+ width={800}
+ >
+
+ {detailData.name}
+ {detailData.category}
+ {sourceLabels[detailData.source]}
+ {statusLabels[detailData.status]}
+ {detailData.current_version}
+ {detailData.description || '-'}
+
+ ) : null,
+ },
+ {
+ key: 'versions',
+ label: '版本历史',
+ children: (
+
+ columns={versionColumns}
+ dataSource={versionsData ?? []}
+ rowKey="id"
+ search={false}
+ toolBarRender={false}
+ pagination={false}
+ size="small"
+ loading={!versionsData}
+ />
+ ),
+ },
+ ]} />
+
+
+ )
+}
diff --git a/admin-v2/src/pages/Providers.tsx b/admin-v2/src/pages/Providers.tsx
new file mode 100644
index 0000000..5612528
--- /dev/null
+++ b/admin-v2/src/pages/Providers.tsx
@@ -0,0 +1,188 @@
+// ============================================================
+// 服务商管理
+// ============================================================
+
+import { useState } from 'react'
+import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
+import { Button, message, Tag, Modal, Form, Input, InputNumber, Switch, Space, Popconfirm, Typography } from 'antd'
+import { PlusOutlined } from '@ant-design/icons'
+import type { ProColumns } from '@ant-design/pro-components'
+import { ProTable } from '@ant-design/pro-components'
+import { providerService } from '@/services/providers'
+import type { Provider, ProviderKey } from '@/types'
+
+const { Text } = Typography
+
+export default function Providers() {
+ const queryClient = useQueryClient()
+ const [form] = Form.useForm()
+ const [modalOpen, setModalOpen] = useState(false)
+ const [editingId, setEditingId] = useState(null)
+ const [keyModalProviderId, setKeyModalProviderId] = useState(null)
+
+ const { data, isLoading } = useQuery({
+ queryKey: ['providers'],
+ queryFn: () => providerService.list(),
+ })
+
+ const { data: keysData, isLoading: keysLoading } = useQuery({
+ queryKey: ['provider-keys', keyModalProviderId],
+ queryFn: () => providerService.listKeys(keyModalProviderId!),
+ enabled: !!keyModalProviderId,
+ })
+
+ const createMutation = useMutation({
+ mutationFn: (data: Partial>) =>
+ providerService.create(data),
+ onSuccess: () => {
+ message.success('创建成功')
+ queryClient.invalidateQueries({ queryKey: ['providers'] })
+ setModalOpen(false)
+ form.resetFields()
+ },
+ onError: (err: Error) => message.error(err.message || '创建失败'),
+ })
+
+ const updateMutation = useMutation({
+ mutationFn: ({ id, data }: { id: string; data: Partial> }) =>
+ providerService.update(id, data),
+ onSuccess: () => {
+ message.success('更新成功')
+ queryClient.invalidateQueries({ queryKey: ['providers'] })
+ setModalOpen(false)
+ },
+ onError: (err: Error) => message.error(err.message || '更新失败'),
+ })
+
+ const deleteMutation = useMutation({
+ mutationFn: (id: string) => providerService.delete(id),
+ onSuccess: () => {
+ message.success('删除成功')
+ queryClient.invalidateQueries({ queryKey: ['providers'] })
+ },
+ onError: (err: Error) => message.error(err.message || '删除失败'),
+ })
+
+ const columns: ProColumns[] = [
+ { title: '名称', dataIndex: 'display_name', width: 140 },
+ { title: '标识', dataIndex: 'name', width: 120, render: (_, r) => {r.name} },
+ { title: '协议', dataIndex: 'api_protocol', width: 100 },
+ { title: 'RPM 限制', dataIndex: 'rate_limit_rpm', width: 100, render: (_, r) => r.rate_limit_rpm ?? '-' },
+ {
+ title: '状态',
+ dataIndex: 'enabled',
+ width: 80,
+ render: (_, r) => r.enabled ? 启用 : 禁用,
+ },
+ {
+ title: '操作',
+ width: 260,
+ render: (_, record) => (
+
+
+
+ deleteMutation.mutate(record.id)}>
+
+
+
+ ),
+ },
+ ]
+
+ const keyColumns: ProColumns[] = [
+ { title: '标签', dataIndex: 'key_label', width: 120 },
+ { title: '优先级', dataIndex: 'priority', width: 80 },
+ { title: '请求数', dataIndex: 'total_requests', width: 80 },
+ { title: 'Token 数', dataIndex: 'total_tokens', width: 100 },
+ {
+ title: '状态',
+ dataIndex: 'is_active',
+ width: 80,
+ render: (_, r) => r.is_active ? 活跃 : 冷却,
+ },
+ ]
+
+ const handleSave = async () => {
+ const values = await form.validateFields()
+ if (editingId) {
+ updateMutation.mutate({ id: editingId, data: values })
+ } else {
+ createMutation.mutate(values)
+ }
+ }
+
+ return (
+
+ )
+}
diff --git a/admin-v2/src/pages/Relay.tsx b/admin-v2/src/pages/Relay.tsx
new file mode 100644
index 0000000..aa984d0
--- /dev/null
+++ b/admin-v2/src/pages/Relay.tsx
@@ -0,0 +1,109 @@
+// ============================================================
+// 中转任务
+// ============================================================
+
+import { useQuery } from '@tanstack/react-query'
+import { Tag, Select, Typography } from 'antd'
+import type { ProColumns } from '@ant-design/pro-components'
+import { ProTable } from '@ant-design/pro-components'
+import { relayService } from '@/services/relay'
+import { useState } from 'react'
+import type { RelayTask } from '@/types'
+
+const { Title } = Typography
+
+const statusLabels: Record = {
+ queued: '排队中',
+ running: '运行中',
+ completed: '已完成',
+ failed: '失败',
+ cancelled: '已取消',
+}
+
+const statusColors: Record = {
+ queued: 'default',
+ running: 'processing',
+ completed: 'green',
+ failed: 'red',
+ cancelled: 'default',
+}
+
+export default function Relay() {
+ const [statusFilter, setStatusFilter] = useState(undefined)
+ const [page, setPage] = useState(1)
+
+ const { data, isLoading } = useQuery({
+ queryKey: ['relay-tasks', page, statusFilter],
+ queryFn: () => relayService.list({ page, page_size: 20, status: statusFilter }),
+ })
+
+ const columns: ProColumns[] = [
+ { title: 'ID', dataIndex: 'id', width: 120, render: (_, r) => {r.id.substring(0, 8)}... },
+ {
+ title: '状态',
+ dataIndex: 'status',
+ width: 100,
+ render: (_, r) => {statusLabels[r.status] || r.status},
+ },
+ { title: '模型', dataIndex: 'model_id', width: 160 },
+ { title: '优先级', dataIndex: 'priority', width: 70 },
+ { title: '尝试次数', dataIndex: 'attempt_count', width: 80 },
+ {
+ title: 'Token',
+ width: 140,
+ render: (_, r) => `${r.input_tokens.toLocaleString()} / ${r.output_tokens.toLocaleString()}`,
+ },
+ { title: '错误信息', dataIndex: 'error_message', width: 200, ellipsis: true },
+ {
+ title: '排队时间',
+ dataIndex: 'queued_at',
+ width: 180,
+ render: (_, r) => new Date(r.queued_at).toLocaleString('zh-CN'),
+ },
+ {
+ title: '完成时间',
+ dataIndex: 'completed_at',
+ width: 180,
+ render: (_, r) => r.completed_at ? new Date(r.completed_at).toLocaleString('zh-CN') : '-',
+ },
+ ]
+
+ return (
+
+
+
中转任务
+
+
+
+ columns={columns}
+ dataSource={data?.items ?? []}
+ loading={isLoading}
+ rowKey="id"
+ search={false}
+ toolBarRender={false}
+ pagination={{
+ total: data?.total ?? 0,
+ pageSize: 20,
+ current: page,
+ onChange: setPage,
+ showSizeChanger: false,
+ }}
+ />
+
+ )
+}
diff --git a/admin-v2/src/pages/Usage.tsx b/admin-v2/src/pages/Usage.tsx
new file mode 100644
index 0000000..35acfa2
--- /dev/null
+++ b/admin-v2/src/pages/Usage.tsx
@@ -0,0 +1,120 @@
+// ============================================================
+// 用量统计
+// ============================================================
+
+import { useState } from 'react'
+import { useQuery } from '@tanstack/react-query'
+import { Card, Row, Col, Select, Spin, Alert, Statistic, Typography } from 'antd'
+import { ColumnWidthOutlined, ThunderboltOutlined } from '@ant-design/icons'
+import type { ProColumns } from '@ant-design/pro-components'
+import { ProTable } from '@ant-design/pro-components'
+import { usageService } from '@/services/usage'
+import { telemetryService } from '@/services/telemetry'
+import type { DailyUsageStat, ModelUsageStat } from '@/types'
+
+const { Title } = Typography
+
+export default function Usage() {
+ const [days, setDays] = useState(30)
+
+ const { data: dailyData, isLoading: dailyLoading, error: dailyError } = useQuery({
+ queryKey: ['usage-daily', days],
+ queryFn: () => telemetryService.dailyStats({ days }),
+ })
+
+ const { data: modelData, isLoading: modelLoading } = useQuery({
+ queryKey: ['usage-model', days],
+ queryFn: () => telemetryService.modelStats({}),
+ })
+
+ if (dailyError) {
+ return
+ }
+
+ const totalRequests = dailyData?.reduce((s, d) => s + d.request_count, 0) ?? 0
+ const totalTokens = dailyData?.reduce((s, d) => s + d.input_tokens + d.output_tokens, 0) ?? 0
+
+ const dailyColumns: ProColumns[] = [
+ { title: '日期', dataIndex: 'day', width: 120 },
+ { title: '请求数', dataIndex: 'request_count', width: 100, render: (_, r) => r.request_count.toLocaleString() },
+ { title: '输入 Token', dataIndex: 'input_tokens', width: 120, render: (_, r) => r.input_tokens.toLocaleString() },
+ { title: '输出 Token', dataIndex: 'output_tokens', width: 120, render: (_, r) => r.output_tokens.toLocaleString() },
+ { title: '设备数', dataIndex: 'unique_devices', width: 80 },
+ ]
+
+ const modelColumns: ProColumns[] = [
+ { title: '模型', dataIndex: 'model_id', width: 200 },
+ { title: '请求数', dataIndex: 'request_count', width: 100, render: (_, r) => r.request_count.toLocaleString() },
+ { title: '输入 Token', dataIndex: 'input_tokens', width: 120, render: (_, r) => r.input_tokens.toLocaleString() },
+ { title: '输出 Token', dataIndex: 'output_tokens', width: 120, render: (_, r) => r.output_tokens.toLocaleString() },
+ {
+ title: '平均延迟',
+ dataIndex: 'avg_latency_ms',
+ width: 100,
+ render: (_, r) => r.avg_latency_ms ? `${Math.round(r.avg_latency_ms)}ms` : '-',
+ },
+ {
+ title: '成功率',
+ dataIndex: 'success_rate',
+ width: 100,
+ render: (_, r) => `${(r.success_rate * 100).toFixed(1)}%`,
+ },
+ ]
+
+ return (
+
+
+
用量统计
+
+
+
+
+
+
+ } />
+
+
+
+
+ } />
+
+
+
+
+
+
+ columns={dailyColumns}
+ dataSource={dailyData ?? []}
+ loading={dailyLoading}
+ rowKey="day"
+ search={false}
+ toolBarRender={false}
+ pagination={false}
+ size="small"
+ />
+
+
+
+
+ columns={modelColumns}
+ dataSource={modelData ?? []}
+ loading={modelLoading}
+ rowKey="model_id"
+ search={false}
+ toolBarRender={false}
+ pagination={false}
+ size="small"
+ />
+
+
+ )
+}
diff --git a/admin-v2/src/router/AuthGuard.tsx b/admin-v2/src/router/AuthGuard.tsx
new file mode 100644
index 0000000..57eb636
--- /dev/null
+++ b/admin-v2/src/router/AuthGuard.tsx
@@ -0,0 +1,17 @@
+// ============================================================
+// 路由守卫 — 未登录重定向到 /login
+// ============================================================
+
+import { Navigate, useLocation } from 'react-router-dom'
+import { useAuthStore } from '@/stores/authStore'
+
+export function AuthGuard({ children }: { children: React.ReactNode }) {
+ const token = useAuthStore((s) => s.token)
+ const location = useLocation()
+
+ if (!token) {
+ return
+ }
+
+ return <>{children}>
+}
diff --git a/admin-v2/src/router/index.tsx b/admin-v2/src/router/index.tsx
new file mode 100644
index 0000000..ecf1b0a
--- /dev/null
+++ b/admin-v2/src/router/index.tsx
@@ -0,0 +1,35 @@
+// ============================================================
+// 路由定义
+// ============================================================
+
+import { createBrowserRouter } from 'react-router-dom'
+import { AuthGuard } from './AuthGuard'
+import AdminLayout from '@/layouts/AdminLayout'
+
+export const router = createBrowserRouter([
+ {
+ path: '/login',
+ lazy: () => import('@/pages/Login').then((m) => ({ Component: m.default })),
+ },
+ {
+ path: '/',
+ element: (
+
+
+
+ ),
+ children: [
+ { index: true, lazy: () => import('@/pages/Dashboard').then((m) => ({ Component: m.default })) },
+ { path: 'accounts', lazy: () => import('@/pages/Accounts').then((m) => ({ Component: m.default })) },
+ { path: 'providers', lazy: () => import('@/pages/Providers').then((m) => ({ Component: m.default })) },
+ { path: 'models', lazy: () => import('@/pages/Models').then((m) => ({ Component: m.default })) },
+ { path: 'agent-templates', lazy: () => import('@/pages/AgentTemplates').then((m) => ({ Component: m.default })) },
+ { path: 'api-keys', lazy: () => import('@/pages/ApiKeys').then((m) => ({ Component: m.default })) },
+ { path: 'usage', lazy: () => import('@/pages/Usage').then((m) => ({ Component: m.default })) },
+ { path: 'relay', lazy: () => import('@/pages/Relay').then((m) => ({ Component: m.default })) },
+ { path: 'config', lazy: () => import('@/pages/Config').then((m) => ({ Component: m.default })) },
+ { path: 'prompts', lazy: () => import('@/pages/Prompts').then((m) => ({ Component: m.default })) },
+ { path: 'logs', lazy: () => import('@/pages/Logs').then((m) => ({ Component: m.default })) },
+ ],
+ },
+])
diff --git a/admin-v2/src/services/accounts.ts b/admin-v2/src/services/accounts.ts
new file mode 100644
index 0000000..56ff1f2
--- /dev/null
+++ b/admin-v2/src/services/accounts.ts
@@ -0,0 +1,16 @@
+import request from './request'
+import type { AccountPublic, PaginatedResponse } from '@/types'
+
+export const accountService = {
+ list: (params?: Record) =>
+ request.get>('/accounts', { params }).then((r) => r.data),
+
+ get: (id: string) =>
+ request.get(`/accounts/${id}`).then((r) => r.data),
+
+ update: (id: string, data: Partial>) =>
+ request.patch(`/accounts/${id}`, data).then((r) => r.data),
+
+ updateStatus: (id: string, data: { status: AccountPublic['status'] }) =>
+ request.patch(`/accounts/${id}/status`, data).then((r) => r.data),
+}
diff --git a/admin-v2/src/services/agent-templates.ts b/admin-v2/src/services/agent-templates.ts
new file mode 100644
index 0000000..59439d6
--- /dev/null
+++ b/admin-v2/src/services/agent-templates.ts
@@ -0,0 +1,28 @@
+import request from './request'
+import type { AgentTemplate, PaginatedResponse } from '@/types'
+
+export const agentTemplateService = {
+ list: (params?: Record) =>
+ request.get>('/agent-templates', { params }).then((r) => r.data),
+
+ get: (id: string) =>
+ request.get(`/agent-templates/${id}`).then((r) => r.data),
+
+ create: (data: {
+ name: string; description?: string; category?: string; source?: string
+ model?: string; system_prompt?: string; tools?: string[]
+ capabilities?: string[]; temperature?: number; max_tokens?: number
+ visibility?: string
+ }) =>
+ request.post('/agent-templates', data).then((r) => r.data),
+
+ update: (id: string, data: {
+ description?: string; model?: string; system_prompt?: string
+ tools?: string[]; capabilities?: string[]; temperature?: number
+ max_tokens?: number; visibility?: string; status?: string
+ }) =>
+ request.post(`/agent-templates/${id}`, data).then((r) => r.data),
+
+ archive: (id: string) =>
+ request.delete(`/agent-templates/${id}`).then((r) => r.data),
+}
diff --git a/admin-v2/src/services/api-keys.ts b/admin-v2/src/services/api-keys.ts
new file mode 100644
index 0000000..02d98db
--- /dev/null
+++ b/admin-v2/src/services/api-keys.ts
@@ -0,0 +1,13 @@
+import request from './request'
+import type { TokenInfo, CreateTokenRequest, PaginatedResponse } from '@/types'
+
+export const apiKeyService = {
+ list: (params?: Record) =>
+ request.get>('/keys', { params }).then((r) => r.data),
+
+ create: (data: CreateTokenRequest) =>
+ request.post('/keys', data).then((r) => r.data),
+
+ revoke: (id: string) =>
+ request.delete(`/keys/${id}`).then((r) => r.data),
+}
diff --git a/admin-v2/src/services/auth.ts b/admin-v2/src/services/auth.ts
new file mode 100644
index 0000000..e5fd875
--- /dev/null
+++ b/admin-v2/src/services/auth.ts
@@ -0,0 +1,10 @@
+import request from './request'
+import type { AccountPublic, LoginRequest, LoginResponse } from '@/types'
+
+export const authService = {
+ login: (data: LoginRequest) =>
+ request.post('/auth/login', data).then((r) => r.data),
+
+ me: () =>
+ request.get('/auth/me').then((r) => r.data),
+}
diff --git a/admin-v2/src/services/config.ts b/admin-v2/src/services/config.ts
new file mode 100644
index 0000000..0783195
--- /dev/null
+++ b/admin-v2/src/services/config.ts
@@ -0,0 +1,11 @@
+import request from './request'
+import type { ConfigItem, PaginatedResponse } from '@/types'
+
+export const configService = {
+ list: (params?: Record) =>
+ request.get>('/config/items', { params })
+ .then((r) => r.data.items),
+
+ update: (id: string, data: { value: string | number | boolean }) =>
+ request.patch(`/config/items/${id}`, data).then((r) => r.data),
+}
diff --git a/admin-v2/src/services/logs.ts b/admin-v2/src/services/logs.ts
new file mode 100644
index 0000000..3d5535f
--- /dev/null
+++ b/admin-v2/src/services/logs.ts
@@ -0,0 +1,7 @@
+import request from './request'
+import type { OperationLog, PaginatedResponse } from '@/types'
+
+export const logService = {
+ list: (params?: Record) =>
+ request.get>('/logs/operations', { params }).then((r) => r.data),
+}
diff --git a/admin-v2/src/services/models.ts b/admin-v2/src/services/models.ts
new file mode 100644
index 0000000..d79ca58
--- /dev/null
+++ b/admin-v2/src/services/models.ts
@@ -0,0 +1,16 @@
+import request from './request'
+import type { Model, PaginatedResponse } from '@/types'
+
+export const modelService = {
+ list: (params?: Record) =>
+ request.get>('/models', { params }).then((r) => r.data),
+
+ create: (data: Partial>) =>
+ request.post('/models', data).then((r) => r.data),
+
+ update: (id: string, data: Partial>) =>
+ request.patch(`/models/${id}`, data).then((r) => r.data),
+
+ delete: (id: string) =>
+ request.delete(`/models/${id}`).then((r) => r.data),
+}
diff --git a/admin-v2/src/services/prompts.ts b/admin-v2/src/services/prompts.ts
new file mode 100644
index 0000000..9078b33
--- /dev/null
+++ b/admin-v2/src/services/prompts.ts
@@ -0,0 +1,35 @@
+import request from './request'
+import type { PromptTemplate, PromptVersion, PaginatedResponse } from '@/types'
+
+export const promptService = {
+ list: (params?: Record) =>
+ request.get>('/prompts', { params }).then((r) => r.data),
+
+ get: (name: string) =>
+ request.get(`/prompts/${encodeURIComponent(name)}`).then((r) => r.data),
+
+ create: (data: {
+ name: string; category: string; description?: string; source?: string
+ system_prompt: string; user_prompt_template?: string
+ variables?: unknown[]; min_app_version?: string
+ }) =>
+ request.post('/prompts', data).then((r) => r.data),
+
+ update: (name: string, data: { description?: string; status?: string }) =>
+ request.put(`/prompts/${encodeURIComponent(name)}`, data).then((r) => r.data),
+
+ archive: (name: string) =>
+ request.delete(`/prompts/${encodeURIComponent(name)}`).then((r) => r.data),
+
+ listVersions: (name: string) =>
+ request.get(`/prompts/${encodeURIComponent(name)}/versions`).then((r) => r.data),
+
+ createVersion: (name: string, data: {
+ system_prompt: string; user_prompt_template?: string
+ variables?: unknown[]; changelog?: string; min_app_version?: string
+ }) =>
+ request.post(`/prompts/${encodeURIComponent(name)}/versions`, data).then((r) => r.data),
+
+ rollback: (name: string, version: number) =>
+ request.post(`/prompts/${encodeURIComponent(name)}/rollback/${version}`).then((r) => r.data),
+}
diff --git a/admin-v2/src/services/providers.ts b/admin-v2/src/services/providers.ts
new file mode 100644
index 0000000..73ac259
--- /dev/null
+++ b/admin-v2/src/services/providers.ts
@@ -0,0 +1,31 @@
+import request from './request'
+import type { Provider, ProviderKey, PaginatedResponse } from '@/types'
+
+export const providerService = {
+ list: (params?: Record) =>
+ request.get>('/providers', { params }).then((r) => r.data),
+
+ create: (data: Partial>) =>
+ request.post('/providers', data).then((r) => r.data),
+
+ update: (id: string, data: Partial>) =>
+ request.patch(`/providers/${id}`, data).then((r) => r.data),
+
+ delete: (id: string) =>
+ request.delete(`/providers/${id}`).then((r) => r.data),
+
+ listKeys: (providerId: string) =>
+ request.get(`/providers/${providerId}/keys`).then((r) => r.data),
+
+ addKey: (providerId: string, data: {
+ key_label: string; key_value: string; priority?: number
+ max_rpm?: number; max_tpm?: number; quota_reset_interval?: string
+ }) =>
+ request.post<{ ok: boolean; key_id: string }>(`/providers/${providerId}/keys`, data).then((r) => r.data),
+
+ toggleKey: (providerId: string, keyId: string, active: boolean) =>
+ request.put<{ ok: boolean }>(`/providers/${providerId}/keys/${keyId}/toggle`, { active }).then((r) => r.data),
+
+ deleteKey: (providerId: string, keyId: string) =>
+ request.delete<{ ok: boolean }>(`/providers/${providerId}/keys/${keyId}`).then((r) => r.data),
+}
diff --git a/admin-v2/src/services/relay.ts b/admin-v2/src/services/relay.ts
new file mode 100644
index 0000000..728d0a8
--- /dev/null
+++ b/admin-v2/src/services/relay.ts
@@ -0,0 +1,10 @@
+import request from './request'
+import type { RelayTask, PaginatedResponse } from '@/types'
+
+export const relayService = {
+ list: (params?: Record) =>
+ request.get>('/relay/tasks', { params }).then((r) => r.data),
+
+ get: (id: string) =>
+ request.get(`/relay/tasks/${id}`).then((r) => r.data),
+}
diff --git a/admin-v2/src/services/request.ts b/admin-v2/src/services/request.ts
new file mode 100644
index 0000000..9bbad36
--- /dev/null
+++ b/admin-v2/src/services/request.ts
@@ -0,0 +1,108 @@
+// ============================================================
+// ZCLAW Admin V2 — Axios 实例 + JWT 拦截器
+// ============================================================
+
+import axios from 'axios'
+import type { AxiosError, InternalAxiosRequestConfig } from 'axios'
+import type { ApiError } from '@/types'
+import { useAuthStore } from '@/stores/authStore'
+
+const BASE_URL = import.meta.env.VITE_API_BASE_URL || '/api/v1'
+const TIMEOUT_MS = 30_000
+
+/** API 业务错误 */
+export class ApiRequestError extends Error {
+ constructor(
+ public status: number,
+ public body: ApiError,
+ ) {
+ super(body.message || `Request failed with status ${status}`)
+ this.name = 'ApiRequestError'
+ }
+}
+
+const request = axios.create({
+ baseURL: BASE_URL,
+ timeout: TIMEOUT_MS,
+ headers: { 'Content-Type': 'application/json' },
+})
+
+// ── 请求拦截器:自动附加 JWT ──────────────────────────────
+
+request.interceptors.request.use((config: InternalAxiosRequestConfig) => {
+ const token = useAuthStore.getState().token
+ if (token) {
+ config.headers.Authorization = `Bearer ${token}`
+ }
+ return config
+})
+
+// ── 响应拦截器:401 自动刷新 ──────────────────────────────
+
+let isRefreshing = false
+let pendingRequests: Array<(token: string) => void> = []
+
+function onTokenRefreshed(newToken: string) {
+ pendingRequests.forEach((cb) => cb(newToken))
+ pendingRequests = []
+}
+
+request.interceptors.response.use(
+ (response) => response,
+ async (error: AxiosError<{ error?: string; message?: string }>) => {
+ const originalRequest = error.config as InternalAxiosRequestConfig & { _retry?: boolean }
+
+ // 401 → 尝试刷新 Token
+ if (error.response?.status === 401 && !originalRequest._retry) {
+ const store = useAuthStore.getState()
+ if (!store.refreshToken) {
+ store.logout()
+ window.location.href = '/login'
+ return Promise.reject(error)
+ }
+
+ if (isRefreshing) {
+ return new Promise((resolve) => {
+ pendingRequests.push((newToken: string) => {
+ originalRequest.headers.Authorization = `Bearer ${newToken}`
+ resolve(request(originalRequest))
+ })
+ })
+ }
+
+ originalRequest._retry = true
+ isRefreshing = true
+
+ try {
+ const res = await axios.post(`${BASE_URL}/auth/refresh`, null, {
+ headers: { Authorization: `Bearer ${store.refreshToken}` },
+ })
+ const newToken = res.data.token as string
+ store.setToken(newToken)
+ onTokenRefreshed(newToken)
+ originalRequest.headers.Authorization = `Bearer ${newToken}`
+ return request(originalRequest)
+ } catch {
+ store.logout()
+ window.location.href = '/login'
+ return Promise.reject(error)
+ } finally {
+ isRefreshing = false
+ }
+ }
+
+ // 构造 ApiRequestError
+ if (error.response) {
+ const body: ApiError = {
+ error: error.response.data?.error || 'unknown',
+ message: error.response.data?.message || `请求失败 (${error.response.status})`,
+ status: error.response.status,
+ }
+ return Promise.reject(new ApiRequestError(error.response.status, body))
+ }
+
+ return Promise.reject(error)
+ },
+)
+
+export default request
diff --git a/admin-v2/src/services/stats.ts b/admin-v2/src/services/stats.ts
new file mode 100644
index 0000000..63bd461
--- /dev/null
+++ b/admin-v2/src/services/stats.ts
@@ -0,0 +1,7 @@
+import request from './request'
+import type { DashboardStats } from '@/types'
+
+export const statsService = {
+ dashboard: () =>
+ request.get('/stats/dashboard').then((r) => r.data),
+}
diff --git a/admin-v2/src/services/telemetry.ts b/admin-v2/src/services/telemetry.ts
new file mode 100644
index 0000000..5df2312
--- /dev/null
+++ b/admin-v2/src/services/telemetry.ts
@@ -0,0 +1,10 @@
+import request from './request'
+import type { ModelUsageStat, DailyUsageStat } from '@/types'
+
+export const telemetryService = {
+ modelStats: (params?: Record) =>
+ request.get('/telemetry/stats', { params }).then((r) => r.data),
+
+ dailyStats: (params?: { days?: number }) =>
+ request.get('/telemetry/daily', { params }).then((r) => r.data),
+}
diff --git a/admin-v2/src/services/usage.ts b/admin-v2/src/services/usage.ts
new file mode 100644
index 0000000..b05f98d
--- /dev/null
+++ b/admin-v2/src/services/usage.ts
@@ -0,0 +1,12 @@
+import request from './request'
+import type { UsageRecord, UsageByModel } from '@/types'
+
+export const usageService = {
+ daily: (params?: { days?: number }) =>
+ request.get<{ by_day: UsageRecord[] }>('/usage', { params: { ...params, group_by: 'day' } })
+ .then((r) => r.data.by_day || []),
+
+ byModel: (params?: { days?: number }) =>
+ request.get<{ by_model: UsageByModel[] }>('/usage', { params: { ...params, group_by: 'model' } })
+ .then((r) => r.data.by_model || []),
+}
diff --git a/admin-v2/src/stores/authStore.ts b/admin-v2/src/stores/authStore.ts
new file mode 100644
index 0000000..e305f02
--- /dev/null
+++ b/admin-v2/src/stores/authStore.ts
@@ -0,0 +1,89 @@
+// ============================================================
+// ZCLAW Admin V2 — Zustand 认证状态管理
+// ============================================================
+
+import { create } from 'zustand'
+import type { AccountPublic } from '@/types'
+
+/** 权限常量 — 与后端 db.rs SEED_ROLES 保持同步 */
+const ROLE_PERMISSIONS: Record = {
+ super_admin: [
+ 'admin:full', 'account:admin', 'provider:manage', 'model:manage',
+ 'relay:admin', 'config:write', 'prompt:read', 'prompt:write',
+ 'prompt:publish', 'prompt:admin',
+ ],
+ admin: [
+ 'account:read', 'account:admin', 'provider:manage', 'model:read',
+ 'model:manage', 'relay:use', 'relay:admin', 'config:read',
+ 'config:write', 'prompt:read', 'prompt:write', 'prompt:publish',
+ ],
+ user: ['model:read', 'relay:use', 'config:read', 'prompt:read'],
+}
+
+const TOKEN_KEY = 'zclaw_admin_token'
+const REFRESH_KEY = 'zclaw_admin_refresh_token'
+const ACCOUNT_KEY = 'zclaw_admin_account'
+
+function loadFromStorage(): { token: string | null; refreshToken: string | null; account: AccountPublic | null } {
+ const token = localStorage.getItem(TOKEN_KEY)
+ const refreshToken = localStorage.getItem(REFRESH_KEY)
+ const raw = localStorage.getItem(ACCOUNT_KEY)
+ let account: AccountPublic | null = null
+ if (raw) {
+ try { account = JSON.parse(raw) } catch { /* ignore */ }
+ }
+ return { token, refreshToken, account }
+}
+
+interface AuthState {
+ token: string | null
+ refreshToken: string | null
+ account: AccountPublic | null
+ permissions: string[]
+
+ setToken: (token: string) => void
+ login: (token: string, refreshToken: string, account: AccountPublic) => void
+ logout: () => void
+ hasPermission: (permission: string) => boolean
+}
+
+export const useAuthStore = create((set, get) => {
+ const stored = loadFromStorage()
+ const perms = stored.account ? (ROLE_PERMISSIONS[stored.account.role] ?? []) : []
+
+ return {
+ token: stored.token,
+ refreshToken: stored.refreshToken,
+ account: stored.account,
+ permissions: perms,
+
+ setToken: (token: string) => {
+ localStorage.setItem(TOKEN_KEY, token)
+ set({ token })
+ },
+
+ login: (token: string, refreshToken: string, account: AccountPublic) => {
+ localStorage.setItem(TOKEN_KEY, token)
+ localStorage.setItem(REFRESH_KEY, refreshToken)
+ localStorage.setItem(ACCOUNT_KEY, JSON.stringify(account))
+ set({
+ token,
+ refreshToken,
+ account,
+ permissions: ROLE_PERMISSIONS[account.role] ?? [],
+ })
+ },
+
+ logout: () => {
+ localStorage.removeItem(TOKEN_KEY)
+ localStorage.removeItem(REFRESH_KEY)
+ localStorage.removeItem(ACCOUNT_KEY)
+ set({ token: null, refreshToken: null, account: null, permissions: [] })
+ },
+
+ hasPermission: (permission: string) => {
+ const { permissions } = get()
+ return permissions.includes(permission) || permissions.includes('admin:full')
+ },
+ }
+})
diff --git a/admin-v2/src/types/index.ts b/admin-v2/src/types/index.ts
new file mode 100644
index 0000000..63a7ba0
--- /dev/null
+++ b/admin-v2/src/types/index.ts
@@ -0,0 +1,267 @@
+// ============================================================
+// ZCLAW SaaS Admin — 全局类型定义
+// ============================================================
+
+/** 公共账号信息 */
+export interface AccountPublic {
+ id: string
+ username: string
+ email: string
+ display_name: string
+ role: 'super_admin' | 'admin' | 'user'
+ status: 'active' | 'disabled' | 'suspended'
+ totp_enabled: boolean
+ last_login_at: string | null
+ created_at: string
+}
+
+/** 登录请求 */
+export interface LoginRequest {
+ username: string
+ password: string
+ totp_code?: string
+}
+
+/** 登录响应 */
+export interface LoginResponse {
+ token: string
+ refresh_token: string
+ account: AccountPublic
+}
+
+/** 注册请求 */
+export interface RegisterRequest {
+ username: string
+ password: string
+ email: string
+ display_name?: string
+}
+
+/** 分页响应 */
+export interface PaginatedResponse {
+ items: T[]
+ total: number
+ page: number
+ page_size: number
+}
+
+/** 服务商 (Provider) */
+export interface Provider {
+ id: string
+ name: string
+ display_name: string
+ api_key?: string
+ base_url: string
+ api_protocol: string
+ enabled: boolean
+ rate_limit_rpm: number | null
+ rate_limit_tpm: number | null
+ created_at: string
+ updated_at: string
+}
+
+/** 模型 */
+export interface Model {
+ id: string
+ provider_id: string
+ model_id: string
+ alias: string
+ context_window: number
+ max_output_tokens: number
+ supports_streaming: boolean
+ supports_vision: boolean
+ enabled: boolean
+ pricing_input: number
+ pricing_output: number
+}
+
+/** API 密钥信息 */
+export interface TokenInfo {
+ id: string
+ name: string
+ token_prefix: string
+ permissions: string[]
+ last_used_at?: string
+ expires_at?: string
+ created_at: string
+ token?: string
+}
+
+/** 创建 Token 请求 */
+export interface CreateTokenRequest {
+ name: string
+ expires_days?: number
+ permissions: string[]
+}
+
+/** 中转任务 */
+export interface RelayTask {
+ id: string
+ account_id: string
+ provider_id: string
+ model_id: string
+ status: string
+ priority: number
+ attempt_count: number
+ max_attempts: number
+ input_tokens: number
+ output_tokens: number
+ error_message: string | null
+ queued_at: string
+ started_at: string | null
+ completed_at: string | null
+ created_at: string
+}
+
+/** 用量记录 */
+export interface UsageRecord {
+ day: string
+ count: number
+ input_tokens: number
+ output_tokens: number
+}
+
+/** 按模型用量 */
+export interface UsageByModel {
+ model_id: string
+ count: number
+ input_tokens: number
+ output_tokens: number
+}
+
+/** 系统配置项 */
+export interface ConfigItem {
+ id: string
+ category: string
+ key_path: string
+ value_type: string
+ current_value: string | null
+ default_value: string | null
+ source: string
+ description: string | null
+ requires_restart: boolean
+ created_at: string
+ updated_at: string
+}
+
+/** 操作日志 */
+export interface OperationLog {
+ id: number
+ account_id: string | null
+ action: string
+ target_type: string | null
+ target_id: string | null
+ details: Record | null
+ ip_address: string | null
+ created_at: string
+}
+
+/** 仪表盘统计 */
+export interface DashboardStats {
+ total_accounts: number
+ active_accounts: number
+ tasks_today: number
+ active_providers: number
+ active_models: number
+ tokens_today_input: number
+ tokens_today_output: number
+}
+
+/** API 错误响应 */
+export interface ApiError {
+ error: string
+ message: string
+ status?: number
+}
+
+/** 提示词模板 */
+export interface PromptTemplate {
+ id: string
+ name: string
+ category: string
+ description?: string
+ source: 'builtin' | 'custom'
+ current_version: number
+ status: 'active' | 'deprecated' | 'archived'
+ created_at: string
+ updated_at: string
+}
+
+/** 提示词版本 */
+export interface PromptVersion {
+ id: string
+ template_id: string
+ version: number
+ system_prompt: string
+ user_prompt_template?: string
+ variables: PromptVariable[]
+ changelog?: string
+ min_app_version?: string
+ created_at: string
+}
+
+/** 提示词变量定义 */
+export interface PromptVariable {
+ name: string
+ type: 'string' | 'number' | 'select' | 'boolean'
+ default_value?: string
+ description?: string
+ required?: boolean
+}
+
+/** Agent 模板 */
+export interface AgentTemplate {
+ id: string
+ name: string
+ description?: string
+ category: string
+ source: 'builtin' | 'custom'
+ model?: string
+ system_prompt?: string
+ tools: string[]
+ capabilities: string[]
+ temperature?: number
+ max_tokens?: number
+ visibility: 'public' | 'team' | 'private'
+ status: 'active' | 'archived'
+ current_version: number
+ created_at: string
+ updated_at: string
+}
+
+/** Provider Key */
+export interface ProviderKey {
+ id: string
+ provider_id: string
+ key_label: string
+ priority: number
+ max_rpm?: number
+ max_tpm?: number
+ quota_reset_interval?: string
+ is_active: boolean
+ last_429_at?: string
+ cooldown_until?: string
+ total_requests: number
+ total_tokens: number
+ created_at: string
+ updated_at: string
+}
+
+/** 按模型聚合的用量统计 */
+export interface ModelUsageStat {
+ model_id: string
+ request_count: number
+ input_tokens: number
+ output_tokens: number
+ avg_latency_ms: number | null
+ success_rate: number
+}
+
+/** 按天的用量统计 */
+export interface DailyUsageStat {
+ day: string
+ request_count: number
+ input_tokens: number
+ output_tokens: number
+ unique_devices: number
+}
diff --git a/admin-v2/tsconfig.app.json b/admin-v2/tsconfig.app.json
new file mode 100644
index 0000000..16a52e3
--- /dev/null
+++ b/admin-v2/tsconfig.app.json
@@ -0,0 +1,34 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+ "target": "ES2023",
+ "useDefineForClassFields": true,
+ "lib": ["ES2023", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "types": ["vite/client"],
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+ "jsx": "react-jsx",
+
+ /* Path alias */
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["src/*"]
+ },
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "erasableSyntaxOnly": true,
+ "noFallthroughCasesInSwitch": true,
+ "noUncheckedSideEffectImports": true
+ },
+ "include": ["src"]
+}
diff --git a/admin-v2/tsconfig.json b/admin-v2/tsconfig.json
new file mode 100644
index 0000000..1ffef60
--- /dev/null
+++ b/admin-v2/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "files": [],
+ "references": [
+ { "path": "./tsconfig.app.json" },
+ { "path": "./tsconfig.node.json" }
+ ]
+}
diff --git a/admin-v2/tsconfig.node.json b/admin-v2/tsconfig.node.json
new file mode 100644
index 0000000..8a67f62
--- /dev/null
+++ b/admin-v2/tsconfig.node.json
@@ -0,0 +1,26 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
+ "target": "ES2023",
+ "lib": ["ES2023"],
+ "module": "ESNext",
+ "types": ["node"],
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "erasableSyntaxOnly": true,
+ "noFallthroughCasesInSwitch": true,
+ "noUncheckedSideEffectImports": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/admin-v2/vite.config.ts b/admin-v2/vite.config.ts
new file mode 100644
index 0000000..14f22f5
--- /dev/null
+++ b/admin-v2/vite.config.ts
@@ -0,0 +1,21 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+import path from 'path'
+
+export default defineConfig({
+ plugins: [react()],
+ resolve: {
+ alias: {
+ '@': path.resolve(__dirname, 'src'),
+ },
+ },
+ server: {
+ port: 5173,
+ proxy: {
+ '/api': {
+ target: 'http://localhost:8080',
+ changeOrigin: true,
+ },
+ },
+ },
+})
diff --git a/admin/src/app/login/page.tsx b/admin/src/app/login/page.tsx
index b9c2fb4..b7c3abf 100644
--- a/admin/src/app/login/page.tsx
+++ b/admin/src/app/login/page.tsx
@@ -39,7 +39,9 @@ export default function LoginPage() {
totp_code: totpCode.trim() || undefined,
})
login(res.token, res.account)
- router.replace('/')
+ // 用 window.location.href 替代 router.replace 避免 Next.js RSC flight
+ // 导致 client component 树重建和 SWR abort 循环
+ window.location.href = '/'
} catch (err) {
if (err instanceof ApiRequestError) {
const msg = err.body.message || ''
diff --git a/admin/src/components/auth-guard.tsx b/admin/src/components/auth-guard.tsx
index c4fdcc3..303142a 100644
--- a/admin/src/components/auth-guard.tsx
+++ b/admin/src/components/auth-guard.tsx
@@ -1,124 +1,44 @@
'use client'
-import { useEffect, useState, useRef, useCallback, type ReactNode } from 'react'
+import { useEffect, type ReactNode } from 'react'
import { useRouter } from 'next/navigation'
-import { isAuthenticated, getAccount, clearAuth } from '@/lib/auth'
+import { isAuthenticated, clearAuth } from '@/lib/auth'
import { api, ApiRequestError } from '@/lib/api-client'
-import type { AccountPublic } from '@/lib/types'
-import { AlertTriangle, RefreshCw } from 'lucide-react'
interface AuthGuardProps {
children: ReactNode
}
+/**
+ * AuthGuard — 纯 useEffect redirect,始终渲染 children
+ *
+ * 不做任何 loading/authorized 状态切换,避免组件卸载。
+ * useEffect 在客户端 hydration 后执行,检查认证状态。
+ */
export function AuthGuard({ children }: AuthGuardProps) {
const router = useRouter()
- const [authorized, setAuthorized] = useState(false)
- const [account, setAccount] = useState(null)
- const [verifying, setVerifying] = useState(true)
- const [connectionError, setConnectionError] = useState(false)
-
- // Ref 跟踪授权状态,避免 useCallback 闭包捕获过时的 state
- const authorizedRef = useRef(false)
- // 防止并发验证(RSC 导航可能触发多次 effect)
- const verifyingRef = useRef(false)
-
- const verifyAuth = useCallback(async () => {
- // 防止并发验证
- if (verifyingRef.current) return
- verifyingRef.current = true
- setVerifying(true)
- setConnectionError(false)
+ useEffect(() => {
if (!isAuthenticated()) {
- setVerifying(false)
- verifyingRef.current = false
router.replace('/login')
return
}
-
- try {
- const serverAccount = await api.auth.me()
- setAccount(serverAccount)
- setAuthorized(true)
- authorizedRef.current = true
- } catch (err) {
- // AbortError: 导航/SWR 取消了请求,忽略
- // 如果已有授权(ref 跟踪),保持不变;否则尝试 localStorage 缓存
- if (err instanceof DOMException && err.name === 'AbortError') {
- if (!authorizedRef.current) {
- const cachedAccount = getAccount()
- if (cachedAccount) {
- setAccount(cachedAccount)
- setAuthorized(true)
- authorizedRef.current = true
- }
- }
- return
- }
- // 401/403: 真正的认证失败,清除 token
+ // 后台验证 token
+ api.auth.me().catch((err) => {
if (err instanceof ApiRequestError && (err.status === 401 || err.status === 403)) {
clearAuth()
- authorizedRef.current = false
router.replace('/login')
- } else {
- // 网络错误/超时 — 仅在未授权时显示连接错误
- // 已授权的情况下忽略瞬态错误,保持当前状态
- if (!authorizedRef.current) {
- setConnectionError(true)
- }
}
- } finally {
- setVerifying(false)
- verifyingRef.current = false
- }
+ })
}, [router])
- useEffect(() => {
- verifyAuth()
- }, [verifyAuth])
-
- if (verifying) {
- return (
-
- )
- }
-
- if (connectionError) {
- return (
-
-
-
连接中断
-
无法连接到服务器,请检查网络后重试
-
-
- )
- }
-
- if (!authorized) {
- return null
- }
-
return <>{children}>
}
export function useAuth() {
- const [account, setAccount] = useState(null)
- const [loading, setLoading] = useState(true)
-
- useEffect(() => {
- const acc = getAccount()
- setAccount(acc)
- setLoading(false)
- }, [])
-
- return { account, loading, isAuthenticated: isAuthenticated() }
+ // 简化版 — 直接读 localStorage
+ const account = typeof window !== 'undefined'
+ ? JSON.parse(localStorage.getItem('zclaw_admin_account') || 'null')
+ : null
+ return { account, loading: false, isAuthenticated: !!localStorage.getItem('zclaw_admin_token') }
}
diff --git a/admin/src/lib/swr-provider.tsx b/admin/src/lib/swr-provider.tsx
index 5fa08f6..1eaf8c6 100644
--- a/admin/src/lib/swr-provider.tsx
+++ b/admin/src/lib/swr-provider.tsx
@@ -14,20 +14,29 @@ export function SWRProvider({ children }: { children: ReactNode }) {
return (
{
if (isAbortError(err)) return false
if (err && typeof err === 'object' && 'status' in err) {
const status = (err as { status: number }).status
- return status !== 401 && status !== 403
+ return status !== 401 && status !== 403 && status !== 404
}
return true
},
onError: (err: unknown) => {
- // 中断错误静默忽略,不展示给用户
if (isAbortError(err)) return
},
}}
diff --git a/docs/features/08-saas-platform/00-saas-overview.md b/docs/features/08-saas-platform/00-saas-overview.md
index e0867e9..edd9ebf 100644
--- a/docs/features/08-saas-platform/00-saas-overview.md
+++ b/docs/features/08-saas-platform/00-saas-overview.md
@@ -1,6 +1,6 @@
# ZCLAW SaaS 平台 — 总览
-> 最后更新: 2026-03-29 | 实施状态: Phase 1-4 全部完成 + 架构重构完成,9 个后端模块 + Worker + Scheduler + Admin 管理后台 + 桌面端完整集成
+> 最后更新: 2026-03-30 | 实施状态: Phase 1-4 全部完成 + 架构重构完成,9 个后端模块 + Worker + Scheduler + Admin V2 (Ant Design Pro) + 桌面端完整集成
## 架构概述
@@ -13,7 +13,7 @@ ZCLAW SaaS 平台为桌面端用户提供云端能力,包括模型中转(Key
├── Mode B: Gateway WebSocket (本地中转)
└── Mode C: SaaS Cloud ──→ Rust/Axum 后端 (端口 8080) ──→ 上游 LLM Provider
│
- ├── Admin Web (Next.js 管理后台)
+ ├── Admin V2 (Ant Design Pro 纯 SPA)
└── PostgreSQL (数据持久化)
```
@@ -22,7 +22,7 @@ ZCLAW SaaS 平台为桌面端用户提供云端能力,包括模型中转(Key
| 层级 | 技术 | 说明 |
|------|------|------|
| 后端 | Rust + Axum + sqlx + PostgreSQL | JWT + API Token 双认证,RBAC 权限 |
-| Admin | Next.js 14 + shadcn/ui + Tailwind | 暗色 OLED 主题,20+ 页面 |
+| Admin V2 | Vite 6 + React 19 + antd v5 + ProComponents | 纯 SPA(替代 Next.js,消除 SSR/hydration 问题) |
| 桌面端 | React 18 + Zustand + TypeScript | saas-client.ts 30+ API 方法 |
| 安全 | Argon2id + TOTP 2FA (AES-256-GCM) + RBAC | 速率限制 + 操作审计 + SSRF 防护 |
@@ -219,20 +219,30 @@ ZCLAW SaaS 平台为桌面端用户提供云端能力,包括模型中转(Key
| `src/scheduler.rs` | 声明式 Scheduler (TOML 定时任务配置 + DB 清理任务) |
| `migrations/` | SQL 迁移文件 (Schema v6, TIMESTAMPTZ) |
-### Admin 管理后台 (admin/)
+### Admin 管理后台 (admin-v2/)
+
+> **迁移说明**: 原有 `admin/`(Next.js 14)因 SSR/hydration 与 SWR 的根本冲突导致后端连接池耗尽,
+> 已用 `admin-v2/`(Vite + React + Ant Design Pro 纯 SPA)完全替代。
+> 详见 [故障排查 13 节](../../knowledge-base/troubleshooting.md)
| 文件 | 职责 |
|------|------|
-| `src/lib/api-client.ts` | 类型化 HTTP 客户端 (自动 Token 刷新 + 重试) |
-| `src/lib/types.ts` | 全部 TypeScript 类型定义 |
-| `src/lib/auth.ts` | JWT Token 管理 (localStorage) |
-| `src/app/(dashboard)/layout.tsx` | Dashboard 布局 + 导航 |
-| `src/app/(dashboard)/providers/page.tsx` | Provider 管理 |
-| `src/app/(dashboard)/config/page.tsx` | 配置管理 |
-| `src/app/(dashboard)/usage/page.tsx` | 用量统计 |
-| `src/app/(dashboard)/prompts/` | Prompt 模板管理 |
-| `src/app/(dashboard)/agent-templates/` | Agent 模板管理 |
-| `src/app/login/page.tsx` | 登录页 |
+| `src/services/request.ts` | Axios 实例 + JWT 拦截器 + 401 自动刷新 |
+| `src/services/auth.ts` | 认证 API (login/refresh/me) |
+| `src/stores/authStore.ts` | Zustand: token + account + permissions |
+| `src/types/index.ts` | 全部 TypeScript 类型定义 |
+| `src/layouts/AdminLayout.tsx` | ProLayout 侧边栏 + 用户信息 |
+| `src/pages/Dashboard.tsx` | 仪表盘 (统计卡片 + 趋势图 + 操作日志) |
+| `src/pages/Accounts.tsx` | 账号管理 (CRUD + 角色筛选) |
+| `src/pages/Providers.tsx` | 服务商管理 + Key Pool 子表 |
+| `src/pages/Models.tsx` | 模型管理 |
+| `src/pages/ApiKeys.tsx` | API 密钥管理 |
+| `src/pages/Usage.tsx` | 用量统计 (时间范围 + Tab 切换) |
+| `src/pages/Relay.tsx` | 中转任务管理 |
+| `src/pages/Config.tsx` | 系统配置 (分类 Tab) |
+| `src/pages/Prompts.tsx` | 提示词管理 (版本历史 + 回滚) |
+| `src/pages/Logs.tsx` | 操作日志 |
+| `src/pages/AgentTemplates.tsx` | Agent 模板管理 |
### 桌面端 (desktop/src/)
@@ -247,4 +257,4 @@ ZCLAW SaaS 平台为桌面端用户提供云端能力,包括模型中转(Key
---
-**最后更新**: 2026-03-28
+**最后更新**: 2026-03-30
diff --git a/docs/knowledge-base/troubleshooting.md b/docs/knowledge-base/troubleshooting.md
index fd2fe7d..7bed81c 100644
--- a/docs/knowledge-base/troubleshooting.md
+++ b/docs/knowledge-base/troubleshooting.md
@@ -1981,7 +1981,66 @@ psql -U postgres -d zclaw -c "UPDATE accounts SET role = 'super_admin' WHERE use
---
-## 13. 相关文档
+## 13. Admin 前端 ERR_ABORTED / 后端卡死 (2026-03-30)
+
+### 13.1 症状
+
+- Admin 前端登录后所有 GET 请求返回 `ERR_ABORTED`(Network 面板显示红色 cancelled)
+- 后端日志显示请求已接收并处理,但响应无法到达客户端
+- 后端 PostgreSQL 连接池(50 max)被耗尽,所有后续请求 hang
+- `GET /api/health` 也无法响应,整个后端完全卡死
+
+### 13.2 根因分析(因果链)
+
+```
+Next.js App Router SSR
+ → React 组件服务端渲染 + 客户端 hydration 重建
+ → SWR 在 hydration mount 时触发 fetch
+ → hydration 卸载旧组件 → AbortController abort 请求
+ → Vite proxy 已将请求转发到后端
+ → 后端不知道请求已被 abort,继续处理(占用 DB 连接)
+ → SWR retry 重新发起 → 又被 abort → 死循环
+ → PostgreSQL 连接池耗尽 → 后端完全卡死
+```
+
+**根本矛盾**: Next.js SSR/hydration 机制与 SWR fetch-on-mount 模式存在不可调和的冲突。abort 信号无法从浏览器传播到后端,导致后端持续处理已废弃的请求。
+
+### 13.3 已尝试的修复(均未解决)
+
+| 尝试 | 方案 | 结果 |
+|------|------|------|
+| 1 | SWRConfig 全局配置(dedupingInterval, revalidateOnFocus) | 无效,abort 发生在更底层 |
+| 2 | AuthGuard 路由守卫重构 | 无效,请求在 guard 之前就发出 |
+| 3 | `dynamic ssr: false` 页面级禁用 SSR | 部分改善,但 hydration 仍触发 abort |
+| 4 | 前端直连后端(绕过 Vite proxy) | 无效,问题不在 proxy |
+| 5 | health handler 3s 超时 | 只保护了 health 端点,不解决根因 |
+| 6 | AbortError 不重试 | 减少了 retry,但首次 abort 仍占用连接 |
+
+### 13.4 最终解决方案
+
+**用纯 SPA(Ant Design Pro)彻底重写 Admin 前端**,消除 SSR/hydration 问题。
+
+**admin-v2 技术栈**:
+- Vite 6(纯客户端,无 SSR)
+- React 19 + antd v5 + @ant-design/pro-components
+- React Router v7 + TanStack Query v5 + Axios + Zustand
+
+**关键修复**:
+1. 移除 React `StrictMode`(开发模式双重 mount 触发重复请求 + abort)
+2. Axios timeout 10s → 30s(防止慢请求被误杀)
+3. JWT 拦截器(自动附加 token + 401 刷新)
+
+### 13.5 验证结果
+
+- 全部 12 页面功能正常,18 个网络请求全部 200
+- 零 `ERR_ABORTED`,后端连接池不再耗尽
+- 后端 health 检查持续返回 200
+
+**涉及文件**: `admin-v2/` 目录(全新项目,替换 `admin/`)
+
+---
+
+## 14. 相关文档
- [ZCLAW 配置指南](./zclaw-configuration.md) - 配置文件位置、格式和最佳实践
- [Agent 和 LLM 提供商配置](./agent-provider-config.md) - Agent 管理和 Provider 配置
@@ -1993,6 +2052,7 @@ psql -U postgres -d zclaw -c "UPDATE accounts SET role = 'super_admin' WHERE use
| 日期 | 变更 |
|------|------|
+| 2026-03-30 | 添加第 13 节:Admin 前端 ERR_ABORTED / 后端卡死 — Next.js SSR/hydration + SWR 根本冲突导致连接池耗尽,admin-v2 (Ant Design Pro 纯 SPA) 替代方案 |
| 2026-03-28 | 添加 12.1-12.4 节:SaaS 后端问题 — Admin 登录无请求、SQLite→PostgreSQL 遗留语法、角色权限不足、usage 路由不匹配 |
| 2026-03-27 | 添加 9.10/9.11 节:多轮工具调用 tool_call_id + reasoning_content 缺失 — OpenAiMessage 字段补全、[Assistant,ToolUse*] 合并、reasoning 分离追踪 |
| 2026-03-27 | 添加 9.10 节:多轮工具调用 tool_call_id is not found — OpenAiMessage 缺少 tool_call_id 字段 + 连续 ToolUse 未合并 |