Commit c0103bcb2af57dafad7e8e4cb48a3b6c7980a6ca

Authored by zichun
1 parent e54407c2

chore(frontend): scaffold Vite + React + TS app with auth/usr pages

Initial frontend setup: Vite + React 19 + TypeScript, ESLint,
Redux store (auth, tabs), React Router with RequireAuth guard,
AppShell layout, TopBar/NavOverlay components, plus first-pass
pages (Login, Dashboard, UserList, UserDetail) and API layer
(request/types/usr) wired to the user backend module.

Establishes the frontend foundation so future module loops can
add their own pages under frontend/src/pages/<module>/ per
docs/08 path convention.
frontend/.gitignore 0 → 100644
  1 +# Logs
  2 +logs
  3 +*.log
  4 +npm-debug.log*
  5 +yarn-debug.log*
  6 +yarn-error.log*
  7 +pnpm-debug.log*
  8 +lerna-debug.log*
  9 +
  10 +node_modules
  11 +dist
  12 +dist-ssr
  13 +*.local
  14 +
  15 +# Editor directories and files
  16 +.vscode/*
  17 +!.vscode/extensions.json
  18 +.idea
  19 +.DS_Store
  20 +*.suo
  21 +*.ntvs*
  22 +*.njsproj
  23 +*.sln
  24 +*.sw?
... ...
frontend/README.md 0 → 100644
  1 +# React + TypeScript + Vite
  2 +
  3 +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
  4 +
  5 +Currently, two official plugins are available:
  6 +
  7 +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs)
  8 +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/)
  9 +
  10 +## React Compiler
  11 +
  12 +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
  13 +
  14 +## Expanding the ESLint configuration
  15 +
  16 +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
  17 +
  18 +```js
  19 +export default defineConfig([
  20 + globalIgnores(['dist']),
  21 + {
  22 + files: ['**/*.{ts,tsx}'],
  23 + extends: [
  24 + // Other configs...
  25 +
  26 + // Remove tseslint.configs.recommended and replace with this
  27 + tseslint.configs.recommendedTypeChecked,
  28 + // Alternatively, use this for stricter rules
  29 + tseslint.configs.strictTypeChecked,
  30 + // Optionally, add this for stylistic rules
  31 + tseslint.configs.stylisticTypeChecked,
  32 +
  33 + // Other configs...
  34 + ],
  35 + languageOptions: {
  36 + parserOptions: {
  37 + project: ['./tsconfig.node.json', './tsconfig.app.json'],
  38 + tsconfigRootDir: import.meta.dirname,
  39 + },
  40 + // other options...
  41 + },
  42 + },
  43 +])
  44 +```
  45 +
  46 +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
  47 +
  48 +```js
  49 +// eslint.config.js
  50 +import reactX from 'eslint-plugin-react-x'
  51 +import reactDom from 'eslint-plugin-react-dom'
  52 +
  53 +export default defineConfig([
  54 + globalIgnores(['dist']),
  55 + {
  56 + files: ['**/*.{ts,tsx}'],
  57 + extends: [
  58 + // Other configs...
  59 + // Enable lint rules for React
  60 + reactX.configs['recommended-typescript'],
  61 + // Enable lint rules for React DOM
  62 + reactDom.configs.recommended,
  63 + ],
  64 + languageOptions: {
  65 + parserOptions: {
  66 + project: ['./tsconfig.node.json', './tsconfig.app.json'],
  67 + tsconfigRootDir: import.meta.dirname,
  68 + },
  69 + // other options...
  70 + },
  71 + },
  72 +])
  73 +```
... ...
frontend/eslint.config.js 0 → 100644
  1 +import js from '@eslint/js'
  2 +import globals from 'globals'
  3 +import reactHooks from 'eslint-plugin-react-hooks'
  4 +import reactRefresh from 'eslint-plugin-react-refresh'
  5 +import tseslint from 'typescript-eslint'
  6 +import { defineConfig, globalIgnores } from 'eslint/config'
  7 +
  8 +export default defineConfig([
  9 + globalIgnores(['dist']),
  10 + {
  11 + files: ['**/*.{ts,tsx}'],
  12 + extends: [
  13 + js.configs.recommended,
  14 + tseslint.configs.recommended,
  15 + reactHooks.configs.flat.recommended,
  16 + reactRefresh.configs.vite,
  17 + ],
  18 + languageOptions: {
  19 + globals: globals.browser,
  20 + },
  21 + },
  22 +])
... ...
frontend/index.html 0 → 100644
  1 +<!doctype html>
  2 +<html lang="zh-CN">
  3 + <head>
  4 + <meta charset="UTF-8" />
  5 + <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
  6 + <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7 + <title>小羚羊 ERP</title>
  8 + </head>
  9 + <body>
  10 + <div id="root"></div>
  11 + <script type="module" src="/src/main.tsx"></script>
  12 + </body>
  13 +</html>
... ...
frontend/package-lock.json 0 → 100644
  1 +{
  2 + "name": "frontend",
  3 + "version": "0.0.0",
  4 + "lockfileVersion": 3,
  5 + "requires": true,
  6 + "packages": {
  7 + "": {
  8 + "name": "frontend",
  9 + "version": "0.0.0",
  10 + "dependencies": {
  11 + "@reduxjs/toolkit": "^2.11.2",
  12 + "antd": "^6.3.7",
  13 + "axios": "^1.16.0",
  14 + "react": "^19.2.5",
  15 + "react-dom": "^19.2.5",
  16 + "react-redux": "^9.2.0",
  17 + "react-router-dom": "^7.15.0"
  18 + },
  19 + "devDependencies": {
  20 + "@eslint/js": "^10.0.1",
  21 + "@types/node": "^24.12.2",
  22 + "@types/react": "^19.2.14",
  23 + "@types/react-dom": "^19.2.3",
  24 + "@vitejs/plugin-react": "^6.0.1",
  25 + "eslint": "^10.2.1",
  26 + "eslint-plugin-react-hooks": "^7.1.1",
  27 + "eslint-plugin-react-refresh": "^0.5.2",
  28 + "globals": "^17.5.0",
  29 + "typescript": "~6.0.2",
  30 + "typescript-eslint": "^8.58.2",
  31 + "vite": "^8.0.10"
  32 + }
  33 + },
  34 + "node_modules/@ant-design/colors": {
  35 + "version": "8.0.1",
  36 + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-8.0.1.tgz",
  37 + "integrity": "sha512-foPVl0+SWIslGUtD/xBr1p9U4AKzPhNYEseXYRRo5QSzGACYZrQbe11AYJbYfAWnWSpGBx6JjBmSeugUsD9vqQ==",
  38 + "license": "MIT",
  39 + "dependencies": {
  40 + "@ant-design/fast-color": "^3.0.0"
  41 + }
  42 + },
  43 + "node_modules/@ant-design/cssinjs": {
  44 + "version": "2.1.2",
  45 + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-2.1.2.tgz",
  46 + "integrity": "sha512-2Hy8BnCEH31xPeSLbhhB2ctCPXE2ZnASdi+KbSeS79BNbUhL9hAEe20SkUk+BR8aKTmqb6+FKFruk7w8z0VoRQ==",
  47 + "license": "MIT",
  48 + "dependencies": {
  49 + "@babel/runtime": "^7.11.1",
  50 + "@emotion/hash": "^0.8.0",
  51 + "@emotion/unitless": "^0.7.5",
  52 + "@rc-component/util": "^1.4.0",
  53 + "clsx": "^2.1.1",
  54 + "csstype": "^3.1.3",
  55 + "stylis": "^4.3.4"
  56 + },
  57 + "peerDependencies": {
  58 + "react": ">=16.0.0",
  59 + "react-dom": ">=16.0.0"
  60 + }
  61 + },
  62 + "node_modules/@ant-design/cssinjs-utils": {
  63 + "version": "2.1.2",
  64 + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-2.1.2.tgz",
  65 + "integrity": "sha512-5fTHQ158jJJ5dC/ECeyIdZUzKxE/mpEMRZxthyG1sw/AKRHKgJBg00Yi6ACVXgycdje7KahRNvNET/uBccwCnA==",
  66 + "license": "MIT",
  67 + "dependencies": {
  68 + "@ant-design/cssinjs": "^2.1.2",
  69 + "@babel/runtime": "^7.23.2",
  70 + "@rc-component/util": "^1.4.0"
  71 + },
  72 + "peerDependencies": {
  73 + "react": ">=18",
  74 + "react-dom": ">=18"
  75 + }
  76 + },
  77 + "node_modules/@ant-design/fast-color": {
  78 + "version": "3.0.1",
  79 + "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-3.0.1.tgz",
  80 + "integrity": "sha512-esKJegpW4nckh0o6kV3Tkb7NPIZYbPnnFxmQDUmL08ukXZAvV85TZBr70eGuke/CIArLaP6aw8lt9KILjnWuOw==",
  81 + "license": "MIT",
  82 + "engines": {
  83 + "node": ">=8.x"
  84 + }
  85 + },
  86 + "node_modules/@ant-design/icons": {
  87 + "version": "6.2.2",
  88 + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-6.2.2.tgz",
  89 + "integrity": "sha512-zlJtE7AMbG12TeYVPhtBXwNpFInNy8mjLzcIm+0BPw16/b8ODG87YJ1G37VIF5VFscdgfsf6EweAFPTobu/3iQ==",
  90 + "license": "MIT",
  91 + "dependencies": {
  92 + "@ant-design/colors": "^8.0.1",
  93 + "@ant-design/icons-svg": "^4.4.2",
  94 + "@rc-component/util": "^1.10.1",
  95 + "clsx": "^2.1.1"
  96 + },
  97 + "engines": {
  98 + "node": ">=8"
  99 + },
  100 + "peerDependencies": {
  101 + "react": ">=16.0.0",
  102 + "react-dom": ">=16.0.0"
  103 + }
  104 + },
  105 + "node_modules/@ant-design/icons-svg": {
  106 + "version": "4.4.2",
  107 + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz",
  108 + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==",
  109 + "license": "MIT"
  110 + },
  111 + "node_modules/@ant-design/react-slick": {
  112 + "version": "2.0.0",
  113 + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-2.0.0.tgz",
  114 + "integrity": "sha512-HMS9sRoEmZey8LsE/Yo6+klhlzU12PisjrVcydW3So7RdklyEd2qehyU6a7Yp+OYN72mgsYs3NFCyP2lCPFVqg==",
  115 + "license": "MIT",
  116 + "dependencies": {
  117 + "@babel/runtime": "^7.28.4",
  118 + "clsx": "^2.1.1",
  119 + "json2mq": "^0.2.0",
  120 + "throttle-debounce": "^5.0.0"
  121 + },
  122 + "peerDependencies": {
  123 + "react": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
  124 + "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
  125 + }
  126 + },
  127 + "node_modules/@babel/code-frame": {
  128 + "version": "7.29.0",
  129 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
  130 + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
  131 + "dev": true,
  132 + "license": "MIT",
  133 + "dependencies": {
  134 + "@babel/helper-validator-identifier": "^7.28.5",
  135 + "js-tokens": "^4.0.0",
  136 + "picocolors": "^1.1.1"
  137 + },
  138 + "engines": {
  139 + "node": ">=6.9.0"
  140 + }
  141 + },
  142 + "node_modules/@babel/compat-data": {
  143 + "version": "7.29.3",
  144 + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz",
  145 + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==",
  146 + "dev": true,
  147 + "license": "MIT",
  148 + "engines": {
  149 + "node": ">=6.9.0"
  150 + }
  151 + },
  152 + "node_modules/@babel/core": {
  153 + "version": "7.29.0",
  154 + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz",
  155 + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
  156 + "dev": true,
  157 + "license": "MIT",
  158 + "dependencies": {
  159 + "@babel/code-frame": "^7.29.0",
  160 + "@babel/generator": "^7.29.0",
  161 + "@babel/helper-compilation-targets": "^7.28.6",
  162 + "@babel/helper-module-transforms": "^7.28.6",
  163 + "@babel/helpers": "^7.28.6",
  164 + "@babel/parser": "^7.29.0",
  165 + "@babel/template": "^7.28.6",
  166 + "@babel/traverse": "^7.29.0",
  167 + "@babel/types": "^7.29.0",
  168 + "@jridgewell/remapping": "^2.3.5",
  169 + "convert-source-map": "^2.0.0",
  170 + "debug": "^4.1.0",
  171 + "gensync": "^1.0.0-beta.2",
  172 + "json5": "^2.2.3",
  173 + "semver": "^6.3.1"
  174 + },
  175 + "engines": {
  176 + "node": ">=6.9.0"
  177 + },
  178 + "funding": {
  179 + "type": "opencollective",
  180 + "url": "https://opencollective.com/babel"
  181 + }
  182 + },
  183 + "node_modules/@babel/generator": {
  184 + "version": "7.29.1",
  185 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
  186 + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
  187 + "dev": true,
  188 + "license": "MIT",
  189 + "dependencies": {
  190 + "@babel/parser": "^7.29.0",
  191 + "@babel/types": "^7.29.0",
  192 + "@jridgewell/gen-mapping": "^0.3.12",
  193 + "@jridgewell/trace-mapping": "^0.3.28",
  194 + "jsesc": "^3.0.2"
  195 + },
  196 + "engines": {
  197 + "node": ">=6.9.0"
  198 + }
  199 + },
  200 + "node_modules/@babel/helper-compilation-targets": {
  201 + "version": "7.28.6",
  202 + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
  203 + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
  204 + "dev": true,
  205 + "license": "MIT",
  206 + "dependencies": {
  207 + "@babel/compat-data": "^7.28.6",
  208 + "@babel/helper-validator-option": "^7.27.1",
  209 + "browserslist": "^4.24.0",
  210 + "lru-cache": "^5.1.1",
  211 + "semver": "^6.3.1"
  212 + },
  213 + "engines": {
  214 + "node": ">=6.9.0"
  215 + }
  216 + },
  217 + "node_modules/@babel/helper-globals": {
  218 + "version": "7.28.0",
  219 + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
  220 + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
  221 + "dev": true,
  222 + "license": "MIT",
  223 + "engines": {
  224 + "node": ">=6.9.0"
  225 + }
  226 + },
  227 + "node_modules/@babel/helper-module-imports": {
  228 + "version": "7.28.6",
  229 + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
  230 + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
  231 + "dev": true,
  232 + "license": "MIT",
  233 + "dependencies": {
  234 + "@babel/traverse": "^7.28.6",
  235 + "@babel/types": "^7.28.6"
  236 + },
  237 + "engines": {
  238 + "node": ">=6.9.0"
  239 + }
  240 + },
  241 + "node_modules/@babel/helper-module-transforms": {
  242 + "version": "7.28.6",
  243 + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
  244 + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
  245 + "dev": true,
  246 + "license": "MIT",
  247 + "dependencies": {
  248 + "@babel/helper-module-imports": "^7.28.6",
  249 + "@babel/helper-validator-identifier": "^7.28.5",
  250 + "@babel/traverse": "^7.28.6"
  251 + },
  252 + "engines": {
  253 + "node": ">=6.9.0"
  254 + },
  255 + "peerDependencies": {
  256 + "@babel/core": "^7.0.0"
  257 + }
  258 + },
  259 + "node_modules/@babel/helper-string-parser": {
  260 + "version": "7.27.1",
  261 + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
  262 + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
  263 + "dev": true,
  264 + "license": "MIT",
  265 + "engines": {
  266 + "node": ">=6.9.0"
  267 + }
  268 + },
  269 + "node_modules/@babel/helper-validator-identifier": {
  270 + "version": "7.28.5",
  271 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
  272 + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
  273 + "dev": true,
  274 + "license": "MIT",
  275 + "engines": {
  276 + "node": ">=6.9.0"
  277 + }
  278 + },
  279 + "node_modules/@babel/helper-validator-option": {
  280 + "version": "7.27.1",
  281 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
  282 + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
  283 + "dev": true,
  284 + "license": "MIT",
  285 + "engines": {
  286 + "node": ">=6.9.0"
  287 + }
  288 + },
  289 + "node_modules/@babel/helpers": {
  290 + "version": "7.29.2",
  291 + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz",
  292 + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==",
  293 + "dev": true,
  294 + "license": "MIT",
  295 + "dependencies": {
  296 + "@babel/template": "^7.28.6",
  297 + "@babel/types": "^7.29.0"
  298 + },
  299 + "engines": {
  300 + "node": ">=6.9.0"
  301 + }
  302 + },
  303 + "node_modules/@babel/parser": {
  304 + "version": "7.29.3",
  305 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz",
  306 + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==",
  307 + "dev": true,
  308 + "license": "MIT",
  309 + "dependencies": {
  310 + "@babel/types": "^7.29.0"
  311 + },
  312 + "bin": {
  313 + "parser": "bin/babel-parser.js"
  314 + },
  315 + "engines": {
  316 + "node": ">=6.0.0"
  317 + }
  318 + },
  319 + "node_modules/@babel/runtime": {
  320 + "version": "7.29.2",
  321 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
  322 + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
  323 + "license": "MIT",
  324 + "engines": {
  325 + "node": ">=6.9.0"
  326 + }
  327 + },
  328 + "node_modules/@babel/template": {
  329 + "version": "7.28.6",
  330 + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
  331 + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
  332 + "dev": true,
  333 + "license": "MIT",
  334 + "dependencies": {
  335 + "@babel/code-frame": "^7.28.6",
  336 + "@babel/parser": "^7.28.6",
  337 + "@babel/types": "^7.28.6"
  338 + },
  339 + "engines": {
  340 + "node": ">=6.9.0"
  341 + }
  342 + },
  343 + "node_modules/@babel/traverse": {
  344 + "version": "7.29.0",
  345 + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
  346 + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
  347 + "dev": true,
  348 + "license": "MIT",
  349 + "dependencies": {
  350 + "@babel/code-frame": "^7.29.0",
  351 + "@babel/generator": "^7.29.0",
  352 + "@babel/helper-globals": "^7.28.0",
  353 + "@babel/parser": "^7.29.0",
  354 + "@babel/template": "^7.28.6",
  355 + "@babel/types": "^7.29.0",
  356 + "debug": "^4.3.1"
  357 + },
  358 + "engines": {
  359 + "node": ">=6.9.0"
  360 + }
  361 + },
  362 + "node_modules/@babel/types": {
  363 + "version": "7.29.0",
  364 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
  365 + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
  366 + "dev": true,
  367 + "license": "MIT",
  368 + "dependencies": {
  369 + "@babel/helper-string-parser": "^7.27.1",
  370 + "@babel/helper-validator-identifier": "^7.28.5"
  371 + },
  372 + "engines": {
  373 + "node": ">=6.9.0"
  374 + }
  375 + },
  376 + "node_modules/@emnapi/core": {
  377 + "version": "1.10.0",
  378 + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz",
  379 + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==",
  380 + "dev": true,
  381 + "license": "MIT",
  382 + "optional": true,
  383 + "dependencies": {
  384 + "@emnapi/wasi-threads": "1.2.1",
  385 + "tslib": "^2.4.0"
  386 + }
  387 + },
  388 + "node_modules/@emnapi/runtime": {
  389 + "version": "1.10.0",
  390 + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz",
  391 + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
  392 + "dev": true,
  393 + "license": "MIT",
  394 + "optional": true,
  395 + "dependencies": {
  396 + "tslib": "^2.4.0"
  397 + }
  398 + },
  399 + "node_modules/@emnapi/wasi-threads": {
  400 + "version": "1.2.1",
  401 + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
  402 + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==",
  403 + "dev": true,
  404 + "license": "MIT",
  405 + "optional": true,
  406 + "dependencies": {
  407 + "tslib": "^2.4.0"
  408 + }
  409 + },
  410 + "node_modules/@emotion/hash": {
  411 + "version": "0.8.0",
  412 + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
  413 + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==",
  414 + "license": "MIT"
  415 + },
  416 + "node_modules/@emotion/unitless": {
  417 + "version": "0.7.5",
  418 + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
  419 + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==",
  420 + "license": "MIT"
  421 + },
  422 + "node_modules/@eslint-community/eslint-utils": {
  423 + "version": "4.9.1",
  424 + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
  425 + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
  426 + "dev": true,
  427 + "license": "MIT",
  428 + "dependencies": {
  429 + "eslint-visitor-keys": "^3.4.3"
  430 + },
  431 + "engines": {
  432 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
  433 + },
  434 + "funding": {
  435 + "url": "https://opencollective.com/eslint"
  436 + },
  437 + "peerDependencies": {
  438 + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
  439 + }
  440 + },
  441 + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
  442 + "version": "3.4.3",
  443 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
  444 + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
  445 + "dev": true,
  446 + "license": "Apache-2.0",
  447 + "engines": {
  448 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
  449 + },
  450 + "funding": {
  451 + "url": "https://opencollective.com/eslint"
  452 + }
  453 + },
  454 + "node_modules/@eslint-community/regexpp": {
  455 + "version": "4.12.2",
  456 + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
  457 + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
  458 + "dev": true,
  459 + "license": "MIT",
  460 + "engines": {
  461 + "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
  462 + }
  463 + },
  464 + "node_modules/@eslint/config-array": {
  465 + "version": "0.23.5",
  466 + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz",
  467 + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==",
  468 + "dev": true,
  469 + "license": "Apache-2.0",
  470 + "dependencies": {
  471 + "@eslint/object-schema": "^3.0.5",
  472 + "debug": "^4.3.1",
  473 + "minimatch": "^10.2.4"
  474 + },
  475 + "engines": {
  476 + "node": "^20.19.0 || ^22.13.0 || >=24"
  477 + }
  478 + },
  479 + "node_modules/@eslint/config-helpers": {
  480 + "version": "0.5.5",
  481 + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.5.tgz",
  482 + "integrity": "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==",
  483 + "dev": true,
  484 + "license": "Apache-2.0",
  485 + "dependencies": {
  486 + "@eslint/core": "^1.2.1"
  487 + },
  488 + "engines": {
  489 + "node": "^20.19.0 || ^22.13.0 || >=24"
  490 + }
  491 + },
  492 + "node_modules/@eslint/core": {
  493 + "version": "1.2.1",
  494 + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz",
  495 + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==",
  496 + "dev": true,
  497 + "license": "Apache-2.0",
  498 + "dependencies": {
  499 + "@types/json-schema": "^7.0.15"
  500 + },
  501 + "engines": {
  502 + "node": "^20.19.0 || ^22.13.0 || >=24"
  503 + }
  504 + },
  505 + "node_modules/@eslint/js": {
  506 + "version": "10.0.1",
  507 + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz",
  508 + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==",
  509 + "dev": true,
  510 + "license": "MIT",
  511 + "engines": {
  512 + "node": "^20.19.0 || ^22.13.0 || >=24"
  513 + },
  514 + "funding": {
  515 + "url": "https://eslint.org/donate"
  516 + },
  517 + "peerDependencies": {
  518 + "eslint": "^10.0.0"
  519 + },
  520 + "peerDependenciesMeta": {
  521 + "eslint": {
  522 + "optional": true
  523 + }
  524 + }
  525 + },
  526 + "node_modules/@eslint/object-schema": {
  527 + "version": "3.0.5",
  528 + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz",
  529 + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==",
  530 + "dev": true,
  531 + "license": "Apache-2.0",
  532 + "engines": {
  533 + "node": "^20.19.0 || ^22.13.0 || >=24"
  534 + }
  535 + },
  536 + "node_modules/@eslint/plugin-kit": {
  537 + "version": "0.7.1",
  538 + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz",
  539 + "integrity": "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==",
  540 + "dev": true,
  541 + "license": "Apache-2.0",
  542 + "dependencies": {
  543 + "@eslint/core": "^1.2.1",
  544 + "levn": "^0.4.1"
  545 + },
  546 + "engines": {
  547 + "node": "^20.19.0 || ^22.13.0 || >=24"
  548 + }
  549 + },
  550 + "node_modules/@humanfs/core": {
  551 + "version": "0.19.2",
  552 + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
  553 + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
  554 + "dev": true,
  555 + "license": "Apache-2.0",
  556 + "dependencies": {
  557 + "@humanfs/types": "^0.15.0"
  558 + },
  559 + "engines": {
  560 + "node": ">=18.18.0"
  561 + }
  562 + },
  563 + "node_modules/@humanfs/node": {
  564 + "version": "0.16.8",
  565 + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
  566 + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
  567 + "dev": true,
  568 + "license": "Apache-2.0",
  569 + "dependencies": {
  570 + "@humanfs/core": "^0.19.2",
  571 + "@humanfs/types": "^0.15.0",
  572 + "@humanwhocodes/retry": "^0.4.0"
  573 + },
  574 + "engines": {
  575 + "node": ">=18.18.0"
  576 + }
  577 + },
  578 + "node_modules/@humanfs/types": {
  579 + "version": "0.15.0",
  580 + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
  581 + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
  582 + "dev": true,
  583 + "license": "Apache-2.0",
  584 + "engines": {
  585 + "node": ">=18.18.0"
  586 + }
  587 + },
  588 + "node_modules/@humanwhocodes/module-importer": {
  589 + "version": "1.0.1",
  590 + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
  591 + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
  592 + "dev": true,
  593 + "license": "Apache-2.0",
  594 + "engines": {
  595 + "node": ">=12.22"
  596 + },
  597 + "funding": {
  598 + "type": "github",
  599 + "url": "https://github.com/sponsors/nzakas"
  600 + }
  601 + },
  602 + "node_modules/@humanwhocodes/retry": {
  603 + "version": "0.4.3",
  604 + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
  605 + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
  606 + "dev": true,
  607 + "license": "Apache-2.0",
  608 + "engines": {
  609 + "node": ">=18.18"
  610 + },
  611 + "funding": {
  612 + "type": "github",
  613 + "url": "https://github.com/sponsors/nzakas"
  614 + }
  615 + },
  616 + "node_modules/@jridgewell/gen-mapping": {
  617 + "version": "0.3.13",
  618 + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
  619 + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
  620 + "dev": true,
  621 + "license": "MIT",
  622 + "dependencies": {
  623 + "@jridgewell/sourcemap-codec": "^1.5.0",
  624 + "@jridgewell/trace-mapping": "^0.3.24"
  625 + }
  626 + },
  627 + "node_modules/@jridgewell/remapping": {
  628 + "version": "2.3.5",
  629 + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
  630 + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
  631 + "dev": true,
  632 + "license": "MIT",
  633 + "dependencies": {
  634 + "@jridgewell/gen-mapping": "^0.3.5",
  635 + "@jridgewell/trace-mapping": "^0.3.24"
  636 + }
  637 + },
  638 + "node_modules/@jridgewell/resolve-uri": {
  639 + "version": "3.1.2",
  640 + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
  641 + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
  642 + "dev": true,
  643 + "license": "MIT",
  644 + "engines": {
  645 + "node": ">=6.0.0"
  646 + }
  647 + },
  648 + "node_modules/@jridgewell/sourcemap-codec": {
  649 + "version": "1.5.5",
  650 + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
  651 + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
  652 + "dev": true,
  653 + "license": "MIT"
  654 + },
  655 + "node_modules/@jridgewell/trace-mapping": {
  656 + "version": "0.3.31",
  657 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
  658 + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
  659 + "dev": true,
  660 + "license": "MIT",
  661 + "dependencies": {
  662 + "@jridgewell/resolve-uri": "^3.1.0",
  663 + "@jridgewell/sourcemap-codec": "^1.4.14"
  664 + }
  665 + },
  666 + "node_modules/@napi-rs/wasm-runtime": {
  667 + "version": "1.1.4",
  668 + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz",
  669 + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==",
  670 + "dev": true,
  671 + "license": "MIT",
  672 + "optional": true,
  673 + "dependencies": {
  674 + "@tybys/wasm-util": "^0.10.1"
  675 + },
  676 + "funding": {
  677 + "type": "github",
  678 + "url": "https://github.com/sponsors/Brooooooklyn"
  679 + },
  680 + "peerDependencies": {
  681 + "@emnapi/core": "^1.7.1",
  682 + "@emnapi/runtime": "^1.7.1"
  683 + }
  684 + },
  685 + "node_modules/@oxc-project/types": {
  686 + "version": "0.127.0",
  687 + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz",
  688 + "integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==",
  689 + "dev": true,
  690 + "license": "MIT",
  691 + "funding": {
  692 + "url": "https://github.com/sponsors/Boshen"
  693 + }
  694 + },
  695 + "node_modules/@rc-component/async-validator": {
  696 + "version": "5.1.0",
  697 + "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.1.0.tgz",
  698 + "integrity": "sha512-n4HcR5siNUXRX23nDizbZBQPO0ZM/5oTtmKZ6/eqL0L2bo747cklFdZGRN2f+c9qWGICwDzrhW0H7tE9PptdcA==",
  699 + "license": "MIT",
  700 + "dependencies": {
  701 + "@babel/runtime": "^7.24.4"
  702 + },
  703 + "engines": {
  704 + "node": ">=14.x"
  705 + }
  706 + },
  707 + "node_modules/@rc-component/cascader": {
  708 + "version": "1.14.0",
  709 + "resolved": "https://registry.npmjs.org/@rc-component/cascader/-/cascader-1.14.0.tgz",
  710 + "integrity": "sha512-Ip9356xwZUR2nbW5PRVGif4B/bDve4pLa/N+PGbvBaTnjbvmN4PFMBGQSmlDlzKP1ovxaYMvwF/dI9lXNLT4iQ==",
  711 + "license": "MIT",
  712 + "dependencies": {
  713 + "@rc-component/select": "~1.6.0",
  714 + "@rc-component/tree": "~1.2.0",
  715 + "@rc-component/util": "^1.4.0",
  716 + "clsx": "^2.1.1"
  717 + },
  718 + "peerDependencies": {
  719 + "react": ">=18.0.0",
  720 + "react-dom": ">=18.0.0"
  721 + }
  722 + },
  723 + "node_modules/@rc-component/checkbox": {
  724 + "version": "2.0.0",
  725 + "resolved": "https://registry.npmjs.org/@rc-component/checkbox/-/checkbox-2.0.0.tgz",
  726 + "integrity": "sha512-3CXGPpAR9gsPKeO2N78HAPOzU30UdemD6HGJoWVJOpa6WleaGB5kzZj3v6bdTZab31YuWgY/RxV3VKPctn0DwQ==",
  727 + "license": "MIT",
  728 + "dependencies": {
  729 + "@rc-component/util": "^1.3.0",
  730 + "clsx": "^2.1.1"
  731 + },
  732 + "peerDependencies": {
  733 + "react": ">=16.9.0",
  734 + "react-dom": ">=16.9.0"
  735 + }
  736 + },
  737 + "node_modules/@rc-component/collapse": {
  738 + "version": "1.2.0",
  739 + "resolved": "https://registry.npmjs.org/@rc-component/collapse/-/collapse-1.2.0.tgz",
  740 + "integrity": "sha512-ZRYSKSS39qsFx93p26bde7JUZJshsUBEQRlRXPuJYlAiNX0vyYlF5TsAm8JZN3LcF8XvKikdzPbgAtXSbkLUkw==",
  741 + "license": "MIT",
  742 + "dependencies": {
  743 + "@babel/runtime": "^7.10.1",
  744 + "@rc-component/motion": "^1.1.4",
  745 + "@rc-component/util": "^1.3.0",
  746 + "clsx": "^2.1.1"
  747 + },
  748 + "peerDependencies": {
  749 + "react": ">=18.0.0",
  750 + "react-dom": ">=18.0.0"
  751 + }
  752 + },
  753 + "node_modules/@rc-component/color-picker": {
  754 + "version": "3.1.1",
  755 + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-3.1.1.tgz",
  756 + "integrity": "sha512-OHaCHLHszCegdXmIq2ZRIZBN/EtpT6Wm8SG/gpzLATHbVKc/avvuKi+zlOuk05FTWvgaMmpxAko44uRJ3M+2pg==",
  757 + "license": "MIT",
  758 + "dependencies": {
  759 + "@ant-design/fast-color": "^3.0.1",
  760 + "@rc-component/util": "^1.3.0",
  761 + "clsx": "^2.1.1"
  762 + },
  763 + "peerDependencies": {
  764 + "react": ">=16.9.0",
  765 + "react-dom": ">=16.9.0"
  766 + }
  767 + },
  768 + "node_modules/@rc-component/context": {
  769 + "version": "2.0.1",
  770 + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-2.0.1.tgz",
  771 + "integrity": "sha512-HyZbYm47s/YqtP6pKXNMjPEMaukyg7P0qVfgMLzr7YiFNMHbK2fKTAGzms9ykfGHSfyf75nBbgWw+hHkp+VImw==",
  772 + "license": "MIT",
  773 + "dependencies": {
  774 + "@rc-component/util": "^1.3.0"
  775 + },
  776 + "peerDependencies": {
  777 + "react": ">=16.9.0",
  778 + "react-dom": ">=16.9.0"
  779 + }
  780 + },
  781 + "node_modules/@rc-component/dialog": {
  782 + "version": "1.8.4",
  783 + "resolved": "https://registry.npmjs.org/@rc-component/dialog/-/dialog-1.8.4.tgz",
  784 + "integrity": "sha512-Ay6PM7phkTkquplG8fWfUGFZ2GTLx9diTl4f0d8Eqxd7W1u1KjE9AQooFQHOHnhZf0Ya3z51+5EKCWHmt/dNEw==",
  785 + "license": "MIT",
  786 + "dependencies": {
  787 + "@rc-component/motion": "^1.1.3",
  788 + "@rc-component/portal": "^2.1.0",
  789 + "@rc-component/util": "^1.9.0",
  790 + "clsx": "^2.1.1"
  791 + },
  792 + "peerDependencies": {
  793 + "react": ">=18.0.0",
  794 + "react-dom": ">=18.0.0"
  795 + }
  796 + },
  797 + "node_modules/@rc-component/drawer": {
  798 + "version": "1.4.2",
  799 + "resolved": "https://registry.npmjs.org/@rc-component/drawer/-/drawer-1.4.2.tgz",
  800 + "integrity": "sha512-1ib+fZEp6FBu+YvcIktm+nCQ+Q+qIpwpoaJH6opGr4ofh2QMq+qdr5DLC4oCf5qf3pcWX9lUWPYX652k4ini8Q==",
  801 + "license": "MIT",
  802 + "dependencies": {
  803 + "@rc-component/motion": "^1.1.4",
  804 + "@rc-component/portal": "^2.1.3",
  805 + "@rc-component/util": "^1.9.0",
  806 + "clsx": "^2.1.1"
  807 + },
  808 + "peerDependencies": {
  809 + "react": ">=18.0.0",
  810 + "react-dom": ">=18.0.0"
  811 + }
  812 + },
  813 + "node_modules/@rc-component/dropdown": {
  814 + "version": "1.0.2",
  815 + "resolved": "https://registry.npmjs.org/@rc-component/dropdown/-/dropdown-1.0.2.tgz",
  816 + "integrity": "sha512-6PY2ecUSYhDPhkNHHb4wfeAya04WhpmUSKzdR60G+kMNVUCX2vjT/AgTS0Lz0I/K6xrPMJ3enQbwVpeN3sHCgg==",
  817 + "license": "MIT",
  818 + "dependencies": {
  819 + "@rc-component/trigger": "^3.0.0",
  820 + "@rc-component/util": "^1.2.1",
  821 + "clsx": "^2.1.1"
  822 + },
  823 + "peerDependencies": {
  824 + "react": ">=16.11.0",
  825 + "react-dom": ">=16.11.0"
  826 + }
  827 + },
  828 + "node_modules/@rc-component/form": {
  829 + "version": "1.8.1",
  830 + "resolved": "https://registry.npmjs.org/@rc-component/form/-/form-1.8.1.tgz",
  831 + "integrity": "sha512-8O7TB55Fi2mWIGvSnwZjk8jFqVNYyKDAswglwGShcbndxqzKz4cHwNtNaLjZlAeRge9wcB0LL8IWsC/Bl18raQ==",
  832 + "license": "MIT",
  833 + "dependencies": {
  834 + "@rc-component/async-validator": "^5.1.0",
  835 + "@rc-component/util": "^1.6.2",
  836 + "clsx": "^2.1.1"
  837 + },
  838 + "engines": {
  839 + "node": ">=8.x"
  840 + },
  841 + "peerDependencies": {
  842 + "react": ">=16.9.0",
  843 + "react-dom": ">=16.9.0"
  844 + }
  845 + },
  846 + "node_modules/@rc-component/image": {
  847 + "version": "1.9.0",
  848 + "resolved": "https://registry.npmjs.org/@rc-component/image/-/image-1.9.0.tgz",
  849 + "integrity": "sha512-khF7w7xkBH5B1bsBcI1FSUZdkyd1aqpl2eYyILCqCzzQH3XdfehGUaZTnptyaJJfs09/R5hv9jXWyazOMFIClQ==",
  850 + "license": "MIT",
  851 + "dependencies": {
  852 + "@rc-component/motion": "^1.0.0",
  853 + "@rc-component/portal": "^2.1.2",
  854 + "@rc-component/util": "^1.10.1",
  855 + "clsx": "^2.1.1"
  856 + },
  857 + "peerDependencies": {
  858 + "react": ">=16.9.0",
  859 + "react-dom": ">=16.9.0"
  860 + }
  861 + },
  862 + "node_modules/@rc-component/input": {
  863 + "version": "1.1.2",
  864 + "resolved": "https://registry.npmjs.org/@rc-component/input/-/input-1.1.2.tgz",
  865 + "integrity": "sha512-Q61IMR47piUBudgixJ30CciKIy9b1H95qe7GgEKOmSJVJXvFRWJllJfQry9tif+MX2cWFXWJf/RXz4kaCeq/Fg==",
  866 + "license": "MIT",
  867 + "dependencies": {
  868 + "@rc-component/util": "^1.4.0",
  869 + "clsx": "^2.1.1"
  870 + },
  871 + "peerDependencies": {
  872 + "react": ">=16.0.0",
  873 + "react-dom": ">=16.0.0"
  874 + }
  875 + },
  876 + "node_modules/@rc-component/input-number": {
  877 + "version": "1.6.2",
  878 + "resolved": "https://registry.npmjs.org/@rc-component/input-number/-/input-number-1.6.2.tgz",
  879 + "integrity": "sha512-Gjcq7meZlCOiWN1t1xCC+7/s85humHVokTBI7PJgTfoyw5OWF74y3e6P8PHX104g9+b54jsodFIzyaj6p8LI9w==",
  880 + "license": "MIT",
  881 + "dependencies": {
  882 + "@rc-component/mini-decimal": "^1.0.1",
  883 + "@rc-component/util": "^1.4.0",
  884 + "clsx": "^2.1.1"
  885 + },
  886 + "peerDependencies": {
  887 + "react": ">=16.9.0",
  888 + "react-dom": ">=16.9.0"
  889 + }
  890 + },
  891 + "node_modules/@rc-component/mentions": {
  892 + "version": "1.6.0",
  893 + "resolved": "https://registry.npmjs.org/@rc-component/mentions/-/mentions-1.6.0.tgz",
  894 + "integrity": "sha512-KIkQNP6habNuTsLhUv0UGEOwG67tlmE7KNIJoQZZNggEZl5lQJTytFDb69sl5CK3TDdISCTjKP3nGEBKgT61CQ==",
  895 + "license": "MIT",
  896 + "dependencies": {
  897 + "@rc-component/input": "~1.1.0",
  898 + "@rc-component/menu": "~1.2.0",
  899 + "@rc-component/textarea": "~1.1.0",
  900 + "@rc-component/trigger": "^3.0.0",
  901 + "@rc-component/util": "^1.3.0",
  902 + "clsx": "^2.1.1"
  903 + },
  904 + "peerDependencies": {
  905 + "react": ">=16.9.0",
  906 + "react-dom": ">=16.9.0"
  907 + }
  908 + },
  909 + "node_modules/@rc-component/menu": {
  910 + "version": "1.2.0",
  911 + "resolved": "https://registry.npmjs.org/@rc-component/menu/-/menu-1.2.0.tgz",
  912 + "integrity": "sha512-VWwDuhvYHSnTGj4n6bV3ISrLACcPAzdPOq3d0BzkeiM5cve8BEYfvkEhNoM0PLzv51jpcejeyrLXeMVIJ+QJlg==",
  913 + "license": "MIT",
  914 + "dependencies": {
  915 + "@rc-component/motion": "^1.1.4",
  916 + "@rc-component/overflow": "^1.0.0",
  917 + "@rc-component/trigger": "^3.0.0",
  918 + "@rc-component/util": "^1.3.0",
  919 + "clsx": "^2.1.1"
  920 + },
  921 + "peerDependencies": {
  922 + "react": ">=16.9.0",
  923 + "react-dom": ">=16.9.0"
  924 + }
  925 + },
  926 + "node_modules/@rc-component/mini-decimal": {
  927 + "version": "1.1.3",
  928 + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.3.tgz",
  929 + "integrity": "sha512-bk/FJ09fLf+NLODMAFll6CfYrHPBioTedhW6lxDBuuWucJEqFUd4l/D/5JgIi3dina6sYahB8iuPAZTNz2pMxw==",
  930 + "license": "MIT",
  931 + "dependencies": {
  932 + "@babel/runtime": "^7.18.0"
  933 + },
  934 + "engines": {
  935 + "node": ">=8.x"
  936 + }
  937 + },
  938 + "node_modules/@rc-component/motion": {
  939 + "version": "1.3.2",
  940 + "resolved": "https://registry.npmjs.org/@rc-component/motion/-/motion-1.3.2.tgz",
  941 + "integrity": "sha512-itfd+GztzJYAb04Z4RkEub1TbJAfZc2Iuy8p44U44xD1F5+fNYFKI3897ijlbIyfvXkTmMm+KGcjkQQGMHywEQ==",
  942 + "license": "MIT",
  943 + "dependencies": {
  944 + "@rc-component/util": "^1.2.0",
  945 + "clsx": "^2.1.1"
  946 + },
  947 + "peerDependencies": {
  948 + "react": ">=16.9.0",
  949 + "react-dom": ">=16.9.0"
  950 + }
  951 + },
  952 + "node_modules/@rc-component/mutate-observer": {
  953 + "version": "2.0.1",
  954 + "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-2.0.1.tgz",
  955 + "integrity": "sha512-AyarjoLU5YlxuValRi+w8JRH2Z84TBbFO2RoGWz9d8bSu0FqT8DtugH3xC3BV7mUwlmROFauyWuXFuq4IFbH+w==",
  956 + "license": "MIT",
  957 + "dependencies": {
  958 + "@rc-component/util": "^1.2.0"
  959 + },
  960 + "engines": {
  961 + "node": ">=8.x"
  962 + },
  963 + "peerDependencies": {
  964 + "react": ">=16.9.0",
  965 + "react-dom": ">=16.9.0"
  966 + }
  967 + },
  968 + "node_modules/@rc-component/notification": {
  969 + "version": "1.2.0",
  970 + "resolved": "https://registry.npmjs.org/@rc-component/notification/-/notification-1.2.0.tgz",
  971 + "integrity": "sha512-OX3J+zVU7rvoJCikjrfW7qOUp7zlDeFBK2eA3SFbGSkDqo63Sl4Ss8A04kFP+fxHSxMDIS9jYVEZtU1FNCFuBA==",
  972 + "license": "MIT",
  973 + "dependencies": {
  974 + "@rc-component/motion": "^1.1.4",
  975 + "@rc-component/util": "^1.2.1",
  976 + "clsx": "^2.1.1"
  977 + },
  978 + "engines": {
  979 + "node": ">=8.x"
  980 + },
  981 + "peerDependencies": {
  982 + "react": ">=16.9.0",
  983 + "react-dom": ">=16.9.0"
  984 + }
  985 + },
  986 + "node_modules/@rc-component/overflow": {
  987 + "version": "1.0.1",
  988 + "resolved": "https://registry.npmjs.org/@rc-component/overflow/-/overflow-1.0.1.tgz",
  989 + "integrity": "sha512-syfmgAABaHCnCDzPwHZ/2tuvIcpOO3jefYZMmfkN+pmo8HKTzsfhS57vxo4ksPdN0By+uWVJhJWNFozNBxi2eA==",
  990 + "license": "MIT",
  991 + "dependencies": {
  992 + "@babel/runtime": "^7.11.1",
  993 + "@rc-component/resize-observer": "^1.0.1",
  994 + "@rc-component/util": "^1.4.0",
  995 + "clsx": "^2.1.1"
  996 + },
  997 + "peerDependencies": {
  998 + "react": ">=16.9.0",
  999 + "react-dom": ">=16.9.0"
  1000 + }
  1001 + },
  1002 + "node_modules/@rc-component/pagination": {
  1003 + "version": "1.2.0",
  1004 + "resolved": "https://registry.npmjs.org/@rc-component/pagination/-/pagination-1.2.0.tgz",
  1005 + "integrity": "sha512-YcpUFE8dMLfSo6OARJlK6DbHHvrxz7pMGPGmC/caZSJJz6HRKHC1RPP001PRHCvG9Z/veD039uOQmazVuLJzlw==",
  1006 + "license": "MIT",
  1007 + "dependencies": {
  1008 + "@rc-component/util": "^1.3.0",
  1009 + "clsx": "^2.1.1"
  1010 + },
  1011 + "peerDependencies": {
  1012 + "react": ">=16.9.0",
  1013 + "react-dom": ">=16.9.0"
  1014 + }
  1015 + },
  1016 + "node_modules/@rc-component/picker": {
  1017 + "version": "1.9.1",
  1018 + "resolved": "https://registry.npmjs.org/@rc-component/picker/-/picker-1.9.1.tgz",
  1019 + "integrity": "sha512-9FBYYsvH3HMLICaPDA/1Th5FLaDkFa7qAtangIdlhKb3ZALaR745e9PsOhheJb6asS4QXc12ffiAcjdkZ4C5/g==",
  1020 + "license": "MIT",
  1021 + "dependencies": {
  1022 + "@rc-component/overflow": "^1.0.0",
  1023 + "@rc-component/resize-observer": "^1.0.0",
  1024 + "@rc-component/trigger": "^3.6.15",
  1025 + "@rc-component/util": "^1.3.0",
  1026 + "clsx": "^2.1.1"
  1027 + },
  1028 + "engines": {
  1029 + "node": ">=12.x"
  1030 + },
  1031 + "peerDependencies": {
  1032 + "date-fns": ">= 2.x",
  1033 + "dayjs": ">= 1.x",
  1034 + "luxon": ">= 3.x",
  1035 + "moment": ">= 2.x",
  1036 + "react": ">=16.9.0",
  1037 + "react-dom": ">=16.9.0"
  1038 + },
  1039 + "peerDependenciesMeta": {
  1040 + "date-fns": {
  1041 + "optional": true
  1042 + },
  1043 + "dayjs": {
  1044 + "optional": true
  1045 + },
  1046 + "luxon": {
  1047 + "optional": true
  1048 + },
  1049 + "moment": {
  1050 + "optional": true
  1051 + }
  1052 + }
  1053 + },
  1054 + "node_modules/@rc-component/portal": {
  1055 + "version": "2.2.0",
  1056 + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-2.2.0.tgz",
  1057 + "integrity": "sha512-oc6FlA+uXCMiwArHsJyHcIkX4q6uKyndrPol2eWX8YPkAnztHOPsFIRtmWG4BMlGE5h7YIRE3NiaJ5VS8Lb1QQ==",
  1058 + "license": "MIT",
  1059 + "dependencies": {
  1060 + "@rc-component/util": "^1.2.1",
  1061 + "clsx": "^2.1.1"
  1062 + },
  1063 + "engines": {
  1064 + "node": ">=12.x"
  1065 + },
  1066 + "peerDependencies": {
  1067 + "react": ">=18.0.0",
  1068 + "react-dom": ">=18.0.0"
  1069 + }
  1070 + },
  1071 + "node_modules/@rc-component/progress": {
  1072 + "version": "1.0.2",
  1073 + "resolved": "https://registry.npmjs.org/@rc-component/progress/-/progress-1.0.2.tgz",
  1074 + "integrity": "sha512-WZUnH9eGxH1+xodZKqdrHke59uyGZSWgj5HBM5Kwk5BrTMuAORO7VJ2IP5Qbm9aH3n9x3IcesqHHR0NWPBC7fQ==",
  1075 + "license": "MIT",
  1076 + "dependencies": {
  1077 + "@rc-component/util": "^1.2.1",
  1078 + "clsx": "^2.1.1"
  1079 + },
  1080 + "peerDependencies": {
  1081 + "react": ">=16.9.0",
  1082 + "react-dom": ">=16.9.0"
  1083 + }
  1084 + },
  1085 + "node_modules/@rc-component/qrcode": {
  1086 + "version": "1.1.1",
  1087 + "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.1.1.tgz",
  1088 + "integrity": "sha512-LfLGNymzKdUPjXUbRP+xOhIWY4jQ+YMj5MmWAcgcAq1Ij8XP7tRmAXqyuv96XvLUBE/5cA8hLFl9eO1JQMujrA==",
  1089 + "license": "MIT",
  1090 + "dependencies": {
  1091 + "@babel/runtime": "^7.24.7"
  1092 + },
  1093 + "engines": {
  1094 + "node": ">=8.x"
  1095 + },
  1096 + "peerDependencies": {
  1097 + "react": ">=16.9.0",
  1098 + "react-dom": ">=16.9.0"
  1099 + }
  1100 + },
  1101 + "node_modules/@rc-component/rate": {
  1102 + "version": "1.0.1",
  1103 + "resolved": "https://registry.npmjs.org/@rc-component/rate/-/rate-1.0.1.tgz",
  1104 + "integrity": "sha512-bkXxeBqDpl5IOC7yL7GcSYjQx9G8H+6kLYQnNZWeBYq2OYIv1MONd6mqKTjnnJYpV0cQIU2z3atdW0j1kttpTw==",
  1105 + "license": "MIT",
  1106 + "dependencies": {
  1107 + "@rc-component/util": "^1.3.0",
  1108 + "clsx": "^2.1.1"
  1109 + },
  1110 + "engines": {
  1111 + "node": ">=8.x"
  1112 + },
  1113 + "peerDependencies": {
  1114 + "react": ">=16.9.0",
  1115 + "react-dom": ">=16.9.0"
  1116 + }
  1117 + },
  1118 + "node_modules/@rc-component/resize-observer": {
  1119 + "version": "1.1.2",
  1120 + "resolved": "https://registry.npmjs.org/@rc-component/resize-observer/-/resize-observer-1.1.2.tgz",
  1121 + "integrity": "sha512-t/Bb0W8uvL4PYKAB3YcChC+DlHh0Wt5kM7q/J+0qpVEUMLe7Hk5zuvc9km0hMnTFPSx5Z7Wu/fzCLN6erVLE8Q==",
  1122 + "license": "MIT",
  1123 + "dependencies": {
  1124 + "@rc-component/util": "^1.2.0"
  1125 + },
  1126 + "peerDependencies": {
  1127 + "react": ">=16.9.0",
  1128 + "react-dom": ">=16.9.0"
  1129 + }
  1130 + },
  1131 + "node_modules/@rc-component/segmented": {
  1132 + "version": "1.3.0",
  1133 + "resolved": "https://registry.npmjs.org/@rc-component/segmented/-/segmented-1.3.0.tgz",
  1134 + "integrity": "sha512-5J/bJ01mbDnoA6P/FW8SxUvKn+OgUSTZJPzCNnTBntG50tzoP7DydGhqxp7ggZXZls7me3mc2EQDXakU3iTVFg==",
  1135 + "license": "MIT",
  1136 + "dependencies": {
  1137 + "@babel/runtime": "^7.11.1",
  1138 + "@rc-component/motion": "^1.1.4",
  1139 + "@rc-component/util": "^1.3.0",
  1140 + "clsx": "^2.1.1"
  1141 + },
  1142 + "peerDependencies": {
  1143 + "react": ">=16.0.0",
  1144 + "react-dom": ">=16.0.0"
  1145 + }
  1146 + },
  1147 + "node_modules/@rc-component/select": {
  1148 + "version": "1.6.15",
  1149 + "resolved": "https://registry.npmjs.org/@rc-component/select/-/select-1.6.15.tgz",
  1150 + "integrity": "sha512-SyVCWnqxCQZZcQvQJ/CxSjx2bGma6ds/HtnpkIfZVnt6RoEgbqUmHgD6vrzNarNXwbLXerwVzWwq8F3d1sst7g==",
  1151 + "license": "MIT",
  1152 + "dependencies": {
  1153 + "@rc-component/overflow": "^1.0.0",
  1154 + "@rc-component/trigger": "^3.0.0",
  1155 + "@rc-component/util": "^1.3.0",
  1156 + "@rc-component/virtual-list": "^1.0.1",
  1157 + "clsx": "^2.1.1"
  1158 + },
  1159 + "engines": {
  1160 + "node": ">=8.x"
  1161 + },
  1162 + "peerDependencies": {
  1163 + "react": "*",
  1164 + "react-dom": "*"
  1165 + }
  1166 + },
  1167 + "node_modules/@rc-component/slider": {
  1168 + "version": "1.0.1",
  1169 + "resolved": "https://registry.npmjs.org/@rc-component/slider/-/slider-1.0.1.tgz",
  1170 + "integrity": "sha512-uDhEPU1z3WDfCJhaL9jfd2ha/Eqpdfxsn0Zb0Xcq1NGQAman0TWaR37OWp2vVXEOdV2y0njSILTMpTfPV1454g==",
  1171 + "license": "MIT",
  1172 + "dependencies": {
  1173 + "@rc-component/util": "^1.3.0",
  1174 + "clsx": "^2.1.1"
  1175 + },
  1176 + "engines": {
  1177 + "node": ">=8.x"
  1178 + },
  1179 + "peerDependencies": {
  1180 + "react": ">=16.9.0",
  1181 + "react-dom": ">=16.9.0"
  1182 + }
  1183 + },
  1184 + "node_modules/@rc-component/steps": {
  1185 + "version": "1.2.2",
  1186 + "resolved": "https://registry.npmjs.org/@rc-component/steps/-/steps-1.2.2.tgz",
  1187 + "integrity": "sha512-/yVIZ00gDYYPHSY0JP+M+s3ZvuXLu2f9rEjQqiUDs7EcYsUYrpJ/1bLj9aI9R7MBR3fu/NGh6RM9u2qGfqp+Nw==",
  1188 + "license": "MIT",
  1189 + "dependencies": {
  1190 + "@rc-component/util": "^1.2.1",
  1191 + "clsx": "^2.1.1"
  1192 + },
  1193 + "engines": {
  1194 + "node": ">=8.x"
  1195 + },
  1196 + "peerDependencies": {
  1197 + "react": ">=16.9.0",
  1198 + "react-dom": ">=16.9.0"
  1199 + }
  1200 + },
  1201 + "node_modules/@rc-component/switch": {
  1202 + "version": "1.0.3",
  1203 + "resolved": "https://registry.npmjs.org/@rc-component/switch/-/switch-1.0.3.tgz",
  1204 + "integrity": "sha512-Jgi+EbOBquje/XNdofr7xbJQZPYJP+BlPfR0h+WN4zFkdtB2EWqEfvkXJWeipflwjWip0/17rNbxEAqs8hVHfw==",
  1205 + "license": "MIT",
  1206 + "dependencies": {
  1207 + "@rc-component/util": "^1.3.0",
  1208 + "clsx": "^2.1.1"
  1209 + },
  1210 + "peerDependencies": {
  1211 + "react": ">=16.9.0",
  1212 + "react-dom": ">=16.9.0"
  1213 + }
  1214 + },
  1215 + "node_modules/@rc-component/table": {
  1216 + "version": "1.9.1",
  1217 + "resolved": "https://registry.npmjs.org/@rc-component/table/-/table-1.9.1.tgz",
  1218 + "integrity": "sha512-FVI5ZS/GdB3BcgexfCYKi3iHhZS3Fr59EtsxORszYGrfpH1eWr33eDNSYkVfLI6tfJ7vftJDd9D5apfFWqkdJg==",
  1219 + "license": "MIT",
  1220 + "dependencies": {
  1221 + "@rc-component/context": "^2.0.1",
  1222 + "@rc-component/resize-observer": "^1.0.0",
  1223 + "@rc-component/util": "^1.1.0",
  1224 + "@rc-component/virtual-list": "^1.0.1",
  1225 + "clsx": "^2.1.1"
  1226 + },
  1227 + "engines": {
  1228 + "node": ">=8.x"
  1229 + },
  1230 + "peerDependencies": {
  1231 + "react": ">=18.0.0",
  1232 + "react-dom": ">=18.0.0"
  1233 + }
  1234 + },
  1235 + "node_modules/@rc-component/tabs": {
  1236 + "version": "1.7.0",
  1237 + "resolved": "https://registry.npmjs.org/@rc-component/tabs/-/tabs-1.7.0.tgz",
  1238 + "integrity": "sha512-J48cs2iBi7Ho3nptBxxIqizEliUC+ExE23faspUQKGQ550vaBlv3aGF8Epv/UB1vFWeoJDTW/dNzgIU0Qj5i/w==",
  1239 + "license": "MIT",
  1240 + "dependencies": {
  1241 + "@rc-component/dropdown": "~1.0.0",
  1242 + "@rc-component/menu": "~1.2.0",
  1243 + "@rc-component/motion": "^1.1.3",
  1244 + "@rc-component/resize-observer": "^1.0.0",
  1245 + "@rc-component/util": "^1.3.0",
  1246 + "clsx": "^2.1.1"
  1247 + },
  1248 + "engines": {
  1249 + "node": ">=8.x"
  1250 + },
  1251 + "peerDependencies": {
  1252 + "react": ">=16.9.0",
  1253 + "react-dom": ">=16.9.0"
  1254 + }
  1255 + },
  1256 + "node_modules/@rc-component/textarea": {
  1257 + "version": "1.1.2",
  1258 + "resolved": "https://registry.npmjs.org/@rc-component/textarea/-/textarea-1.1.2.tgz",
  1259 + "integrity": "sha512-9rMUEODWZDMovfScIEHXWlVZuPljZ2pd1LKNjslJVitn4SldEzq5vO1CL3yy3Dnib6zZal2r2DPtjy84VVpF6A==",
  1260 + "license": "MIT",
  1261 + "dependencies": {
  1262 + "@rc-component/input": "~1.1.0",
  1263 + "@rc-component/resize-observer": "^1.0.0",
  1264 + "@rc-component/util": "^1.3.0",
  1265 + "clsx": "^2.1.1"
  1266 + },
  1267 + "peerDependencies": {
  1268 + "react": ">=16.9.0",
  1269 + "react-dom": ">=16.9.0"
  1270 + }
  1271 + },
  1272 + "node_modules/@rc-component/tooltip": {
  1273 + "version": "1.4.0",
  1274 + "resolved": "https://registry.npmjs.org/@rc-component/tooltip/-/tooltip-1.4.0.tgz",
  1275 + "integrity": "sha512-8Rx5DCctIlLI4raR0I0xHjVTf1aF48+gKCNeAAo5bmF5VoR5YED+A/XEqzXv9KKqrJDRcd3Wndpxh2hyzrTtSg==",
  1276 + "license": "MIT",
  1277 + "dependencies": {
  1278 + "@rc-component/trigger": "^3.7.1",
  1279 + "@rc-component/util": "^1.3.0",
  1280 + "clsx": "^2.1.1"
  1281 + },
  1282 + "peerDependencies": {
  1283 + "react": ">=18.0.0",
  1284 + "react-dom": ">=18.0.0"
  1285 + }
  1286 + },
  1287 + "node_modules/@rc-component/tour": {
  1288 + "version": "2.3.0",
  1289 + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-2.3.0.tgz",
  1290 + "integrity": "sha512-K04K9r32kUC+auBSQfr+Fss4SpSIS9JGe56oq/ALAX0p+i2ylYOI1MgR83yBY7v96eO6ZFXcM/igCQmubps0Ow==",
  1291 + "license": "MIT",
  1292 + "dependencies": {
  1293 + "@rc-component/portal": "^2.2.0",
  1294 + "@rc-component/trigger": "^3.0.0",
  1295 + "@rc-component/util": "^1.7.0",
  1296 + "clsx": "^2.1.1"
  1297 + },
  1298 + "engines": {
  1299 + "node": ">=8.x"
  1300 + },
  1301 + "peerDependencies": {
  1302 + "react": ">=16.9.0",
  1303 + "react-dom": ">=16.9.0"
  1304 + }
  1305 + },
  1306 + "node_modules/@rc-component/tree": {
  1307 + "version": "1.2.4",
  1308 + "resolved": "https://registry.npmjs.org/@rc-component/tree/-/tree-1.2.4.tgz",
  1309 + "integrity": "sha512-5Gli43+m4R7NhpYYz3Z61I6LOw9yI6CNChxgVtvrO6xB1qML7iE6QMLVMB3+FTjo2yF6uFdAHtqWPECz/zbX5w==",
  1310 + "license": "MIT",
  1311 + "dependencies": {
  1312 + "@rc-component/motion": "^1.0.0",
  1313 + "@rc-component/util": "^1.8.1",
  1314 + "@rc-component/virtual-list": "^1.0.1",
  1315 + "clsx": "^2.1.1"
  1316 + },
  1317 + "engines": {
  1318 + "node": ">=10.x"
  1319 + },
  1320 + "peerDependencies": {
  1321 + "react": "*",
  1322 + "react-dom": "*"
  1323 + }
  1324 + },
  1325 + "node_modules/@rc-component/tree-select": {
  1326 + "version": "1.8.0",
  1327 + "resolved": "https://registry.npmjs.org/@rc-component/tree-select/-/tree-select-1.8.0.tgz",
  1328 + "integrity": "sha512-iYsPq3nuLYvGqdvFAW+l+I9ASRIOVbMXyA8FGZg2lGym/GwkaWeJGzI4eJ7c9IOEhRj0oyfIN4S92Fl3J05mjQ==",
  1329 + "license": "MIT",
  1330 + "dependencies": {
  1331 + "@rc-component/select": "~1.6.0",
  1332 + "@rc-component/tree": "~1.2.0",
  1333 + "@rc-component/util": "^1.4.0",
  1334 + "clsx": "^2.1.1"
  1335 + },
  1336 + "peerDependencies": {
  1337 + "react": "*",
  1338 + "react-dom": "*"
  1339 + }
  1340 + },
  1341 + "node_modules/@rc-component/trigger": {
  1342 + "version": "3.9.0",
  1343 + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-3.9.0.tgz",
  1344 + "integrity": "sha512-X8btpwfrT27AgrZVOz4swclhEHTZcqaHeQMXXBgveagOiakTa36uObXbdwerXffgV8G9dH1fAAE0DHtVQs8EHg==",
  1345 + "license": "MIT",
  1346 + "dependencies": {
  1347 + "@rc-component/motion": "^1.1.4",
  1348 + "@rc-component/portal": "^2.2.0",
  1349 + "@rc-component/resize-observer": "^1.1.1",
  1350 + "@rc-component/util": "^1.2.1",
  1351 + "clsx": "^2.1.1"
  1352 + },
  1353 + "engines": {
  1354 + "node": ">=8.x"
  1355 + },
  1356 + "peerDependencies": {
  1357 + "react": ">=18.0.0",
  1358 + "react-dom": ">=18.0.0"
  1359 + }
  1360 + },
  1361 + "node_modules/@rc-component/upload": {
  1362 + "version": "1.1.0",
  1363 + "resolved": "https://registry.npmjs.org/@rc-component/upload/-/upload-1.1.0.tgz",
  1364 + "integrity": "sha512-LIBV90mAnUE6VK5N4QvForoxZc4XqEYZimcp7fk+lkE4XwHHyJWxpIXQQwMU8hJM+YwBbsoZkGksL1sISWHQxw==",
  1365 + "license": "MIT",
  1366 + "dependencies": {
  1367 + "@rc-component/util": "^1.3.0",
  1368 + "clsx": "^2.1.1"
  1369 + },
  1370 + "peerDependencies": {
  1371 + "react": ">=16.9.0",
  1372 + "react-dom": ">=16.9.0"
  1373 + }
  1374 + },
  1375 + "node_modules/@rc-component/util": {
  1376 + "version": "1.10.1",
  1377 + "resolved": "https://registry.npmjs.org/@rc-component/util/-/util-1.10.1.tgz",
  1378 + "integrity": "sha512-q++9S6rUa5Idb/xIBNz6jtvumw5+O5YV5V0g4iK9mn9jWs4oGJheE3ZN1kAnE723AXyaD8v95yeOASmdk8Jnng==",
  1379 + "license": "MIT",
  1380 + "dependencies": {
  1381 + "is-mobile": "^5.0.0",
  1382 + "react-is": "^18.2.0"
  1383 + },
  1384 + "peerDependencies": {
  1385 + "react": ">=18.0.0",
  1386 + "react-dom": ">=18.0.0"
  1387 + }
  1388 + },
  1389 + "node_modules/@rc-component/virtual-list": {
  1390 + "version": "1.0.2",
  1391 + "resolved": "https://registry.npmjs.org/@rc-component/virtual-list/-/virtual-list-1.0.2.tgz",
  1392 + "integrity": "sha512-uvTol/mH74FYsn5loDGJxo+7kjkO4i+y4j87Re1pxJBs0FaeuMuLRzQRGaXwnMcV1CxpZLi2Z56Rerj2M00fjQ==",
  1393 + "license": "MIT",
  1394 + "dependencies": {
  1395 + "@babel/runtime": "^7.20.0",
  1396 + "@rc-component/resize-observer": "^1.0.1",
  1397 + "@rc-component/util": "^1.4.0",
  1398 + "clsx": "^2.1.1"
  1399 + },
  1400 + "engines": {
  1401 + "node": ">=8.x"
  1402 + },
  1403 + "peerDependencies": {
  1404 + "react": ">=16.9.0",
  1405 + "react-dom": ">=16.9.0"
  1406 + }
  1407 + },
  1408 + "node_modules/@reduxjs/toolkit": {
  1409 + "version": "2.11.2",
  1410 + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz",
  1411 + "integrity": "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==",
  1412 + "license": "MIT",
  1413 + "dependencies": {
  1414 + "@standard-schema/spec": "^1.0.0",
  1415 + "@standard-schema/utils": "^0.3.0",
  1416 + "immer": "^11.0.0",
  1417 + "redux": "^5.0.1",
  1418 + "redux-thunk": "^3.1.0",
  1419 + "reselect": "^5.1.0"
  1420 + },
  1421 + "peerDependencies": {
  1422 + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19",
  1423 + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0"
  1424 + },
  1425 + "peerDependenciesMeta": {
  1426 + "react": {
  1427 + "optional": true
  1428 + },
  1429 + "react-redux": {
  1430 + "optional": true
  1431 + }
  1432 + }
  1433 + },
  1434 + "node_modules/@rolldown/binding-android-arm64": {
  1435 + "version": "1.0.0-rc.17",
  1436 + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.17.tgz",
  1437 + "integrity": "sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==",
  1438 + "cpu": [
  1439 + "arm64"
  1440 + ],
  1441 + "dev": true,
  1442 + "license": "MIT",
  1443 + "optional": true,
  1444 + "os": [
  1445 + "android"
  1446 + ],
  1447 + "engines": {
  1448 + "node": "^20.19.0 || >=22.12.0"
  1449 + }
  1450 + },
  1451 + "node_modules/@rolldown/binding-darwin-arm64": {
  1452 + "version": "1.0.0-rc.17",
  1453 + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.17.tgz",
  1454 + "integrity": "sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==",
  1455 + "cpu": [
  1456 + "arm64"
  1457 + ],
  1458 + "dev": true,
  1459 + "license": "MIT",
  1460 + "optional": true,
  1461 + "os": [
  1462 + "darwin"
  1463 + ],
  1464 + "engines": {
  1465 + "node": "^20.19.0 || >=22.12.0"
  1466 + }
  1467 + },
  1468 + "node_modules/@rolldown/binding-darwin-x64": {
  1469 + "version": "1.0.0-rc.17",
  1470 + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.17.tgz",
  1471 + "integrity": "sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==",
  1472 + "cpu": [
  1473 + "x64"
  1474 + ],
  1475 + "dev": true,
  1476 + "license": "MIT",
  1477 + "optional": true,
  1478 + "os": [
  1479 + "darwin"
  1480 + ],
  1481 + "engines": {
  1482 + "node": "^20.19.0 || >=22.12.0"
  1483 + }
  1484 + },
  1485 + "node_modules/@rolldown/binding-freebsd-x64": {
  1486 + "version": "1.0.0-rc.17",
  1487 + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.17.tgz",
  1488 + "integrity": "sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==",
  1489 + "cpu": [
  1490 + "x64"
  1491 + ],
  1492 + "dev": true,
  1493 + "license": "MIT",
  1494 + "optional": true,
  1495 + "os": [
  1496 + "freebsd"
  1497 + ],
  1498 + "engines": {
  1499 + "node": "^20.19.0 || >=22.12.0"
  1500 + }
  1501 + },
  1502 + "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
  1503 + "version": "1.0.0-rc.17",
  1504 + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.17.tgz",
  1505 + "integrity": "sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==",
  1506 + "cpu": [
  1507 + "arm"
  1508 + ],
  1509 + "dev": true,
  1510 + "license": "MIT",
  1511 + "optional": true,
  1512 + "os": [
  1513 + "linux"
  1514 + ],
  1515 + "engines": {
  1516 + "node": "^20.19.0 || >=22.12.0"
  1517 + }
  1518 + },
  1519 + "node_modules/@rolldown/binding-linux-arm64-gnu": {
  1520 + "version": "1.0.0-rc.17",
  1521 + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.17.tgz",
  1522 + "integrity": "sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==",
  1523 + "cpu": [
  1524 + "arm64"
  1525 + ],
  1526 + "dev": true,
  1527 + "libc": [
  1528 + "glibc"
  1529 + ],
  1530 + "license": "MIT",
  1531 + "optional": true,
  1532 + "os": [
  1533 + "linux"
  1534 + ],
  1535 + "engines": {
  1536 + "node": "^20.19.0 || >=22.12.0"
  1537 + }
  1538 + },
  1539 + "node_modules/@rolldown/binding-linux-arm64-musl": {
  1540 + "version": "1.0.0-rc.17",
  1541 + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.17.tgz",
  1542 + "integrity": "sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==",
  1543 + "cpu": [
  1544 + "arm64"
  1545 + ],
  1546 + "dev": true,
  1547 + "libc": [
  1548 + "musl"
  1549 + ],
  1550 + "license": "MIT",
  1551 + "optional": true,
  1552 + "os": [
  1553 + "linux"
  1554 + ],
  1555 + "engines": {
  1556 + "node": "^20.19.0 || >=22.12.0"
  1557 + }
  1558 + },
  1559 + "node_modules/@rolldown/binding-linux-ppc64-gnu": {
  1560 + "version": "1.0.0-rc.17",
  1561 + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.17.tgz",
  1562 + "integrity": "sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==",
  1563 + "cpu": [
  1564 + "ppc64"
  1565 + ],
  1566 + "dev": true,
  1567 + "libc": [
  1568 + "glibc"
  1569 + ],
  1570 + "license": "MIT",
  1571 + "optional": true,
  1572 + "os": [
  1573 + "linux"
  1574 + ],
  1575 + "engines": {
  1576 + "node": "^20.19.0 || >=22.12.0"
  1577 + }
  1578 + },
  1579 + "node_modules/@rolldown/binding-linux-s390x-gnu": {
  1580 + "version": "1.0.0-rc.17",
  1581 + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.17.tgz",
  1582 + "integrity": "sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==",
  1583 + "cpu": [
  1584 + "s390x"
  1585 + ],
  1586 + "dev": true,
  1587 + "libc": [
  1588 + "glibc"
  1589 + ],
  1590 + "license": "MIT",
  1591 + "optional": true,
  1592 + "os": [
  1593 + "linux"
  1594 + ],
  1595 + "engines": {
  1596 + "node": "^20.19.0 || >=22.12.0"
  1597 + }
  1598 + },
  1599 + "node_modules/@rolldown/binding-linux-x64-gnu": {
  1600 + "version": "1.0.0-rc.17",
  1601 + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.17.tgz",
  1602 + "integrity": "sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==",
  1603 + "cpu": [
  1604 + "x64"
  1605 + ],
  1606 + "dev": true,
  1607 + "libc": [
  1608 + "glibc"
  1609 + ],
  1610 + "license": "MIT",
  1611 + "optional": true,
  1612 + "os": [
  1613 + "linux"
  1614 + ],
  1615 + "engines": {
  1616 + "node": "^20.19.0 || >=22.12.0"
  1617 + }
  1618 + },
  1619 + "node_modules/@rolldown/binding-linux-x64-musl": {
  1620 + "version": "1.0.0-rc.17",
  1621 + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.17.tgz",
  1622 + "integrity": "sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==",
  1623 + "cpu": [
  1624 + "x64"
  1625 + ],
  1626 + "dev": true,
  1627 + "libc": [
  1628 + "musl"
  1629 + ],
  1630 + "license": "MIT",
  1631 + "optional": true,
  1632 + "os": [
  1633 + "linux"
  1634 + ],
  1635 + "engines": {
  1636 + "node": "^20.19.0 || >=22.12.0"
  1637 + }
  1638 + },
  1639 + "node_modules/@rolldown/binding-openharmony-arm64": {
  1640 + "version": "1.0.0-rc.17",
  1641 + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.17.tgz",
  1642 + "integrity": "sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==",
  1643 + "cpu": [
  1644 + "arm64"
  1645 + ],
  1646 + "dev": true,
  1647 + "license": "MIT",
  1648 + "optional": true,
  1649 + "os": [
  1650 + "openharmony"
  1651 + ],
  1652 + "engines": {
  1653 + "node": "^20.19.0 || >=22.12.0"
  1654 + }
  1655 + },
  1656 + "node_modules/@rolldown/binding-wasm32-wasi": {
  1657 + "version": "1.0.0-rc.17",
  1658 + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.17.tgz",
  1659 + "integrity": "sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==",
  1660 + "cpu": [
  1661 + "wasm32"
  1662 + ],
  1663 + "dev": true,
  1664 + "license": "MIT",
  1665 + "optional": true,
  1666 + "dependencies": {
  1667 + "@emnapi/core": "1.10.0",
  1668 + "@emnapi/runtime": "1.10.0",
  1669 + "@napi-rs/wasm-runtime": "^1.1.4"
  1670 + },
  1671 + "engines": {
  1672 + "node": "^20.19.0 || >=22.12.0"
  1673 + }
  1674 + },
  1675 + "node_modules/@rolldown/binding-win32-arm64-msvc": {
  1676 + "version": "1.0.0-rc.17",
  1677 + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.17.tgz",
  1678 + "integrity": "sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==",
  1679 + "cpu": [
  1680 + "arm64"
  1681 + ],
  1682 + "dev": true,
  1683 + "license": "MIT",
  1684 + "optional": true,
  1685 + "os": [
  1686 + "win32"
  1687 + ],
  1688 + "engines": {
  1689 + "node": "^20.19.0 || >=22.12.0"
  1690 + }
  1691 + },
  1692 + "node_modules/@rolldown/binding-win32-x64-msvc": {
  1693 + "version": "1.0.0-rc.17",
  1694 + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.17.tgz",
  1695 + "integrity": "sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==",
  1696 + "cpu": [
  1697 + "x64"
  1698 + ],
  1699 + "dev": true,
  1700 + "license": "MIT",
  1701 + "optional": true,
  1702 + "os": [
  1703 + "win32"
  1704 + ],
  1705 + "engines": {
  1706 + "node": "^20.19.0 || >=22.12.0"
  1707 + }
  1708 + },
  1709 + "node_modules/@rolldown/pluginutils": {
  1710 + "version": "1.0.0-rc.7",
  1711 + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz",
  1712 + "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==",
  1713 + "dev": true,
  1714 + "license": "MIT"
  1715 + },
  1716 + "node_modules/@standard-schema/spec": {
  1717 + "version": "1.1.0",
  1718 + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
  1719 + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
  1720 + "license": "MIT"
  1721 + },
  1722 + "node_modules/@standard-schema/utils": {
  1723 + "version": "0.3.0",
  1724 + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz",
  1725 + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==",
  1726 + "license": "MIT"
  1727 + },
  1728 + "node_modules/@tybys/wasm-util": {
  1729 + "version": "0.10.2",
  1730 + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz",
  1731 + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==",
  1732 + "dev": true,
  1733 + "license": "MIT",
  1734 + "optional": true,
  1735 + "dependencies": {
  1736 + "tslib": "^2.4.0"
  1737 + }
  1738 + },
  1739 + "node_modules/@types/esrecurse": {
  1740 + "version": "4.3.1",
  1741 + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz",
  1742 + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==",
  1743 + "dev": true,
  1744 + "license": "MIT"
  1745 + },
  1746 + "node_modules/@types/estree": {
  1747 + "version": "1.0.9",
  1748 + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
  1749 + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
  1750 + "dev": true,
  1751 + "license": "MIT"
  1752 + },
  1753 + "node_modules/@types/json-schema": {
  1754 + "version": "7.0.15",
  1755 + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
  1756 + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
  1757 + "dev": true,
  1758 + "license": "MIT"
  1759 + },
  1760 + "node_modules/@types/node": {
  1761 + "version": "24.12.2",
  1762 + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz",
  1763 + "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==",
  1764 + "dev": true,
  1765 + "license": "MIT",
  1766 + "dependencies": {
  1767 + "undici-types": "~7.16.0"
  1768 + }
  1769 + },
  1770 + "node_modules/@types/react": {
  1771 + "version": "19.2.14",
  1772 + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
  1773 + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
  1774 + "devOptional": true,
  1775 + "license": "MIT",
  1776 + "dependencies": {
  1777 + "csstype": "^3.2.2"
  1778 + }
  1779 + },
  1780 + "node_modules/@types/react-dom": {
  1781 + "version": "19.2.3",
  1782 + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
  1783 + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
  1784 + "dev": true,
  1785 + "license": "MIT",
  1786 + "peerDependencies": {
  1787 + "@types/react": "^19.2.0"
  1788 + }
  1789 + },
  1790 + "node_modules/@types/use-sync-external-store": {
  1791 + "version": "0.0.6",
  1792 + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz",
  1793 + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==",
  1794 + "license": "MIT"
  1795 + },
  1796 + "node_modules/@typescript-eslint/eslint-plugin": {
  1797 + "version": "8.59.2",
  1798 + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.2.tgz",
  1799 + "integrity": "sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ==",
  1800 + "dev": true,
  1801 + "license": "MIT",
  1802 + "dependencies": {
  1803 + "@eslint-community/regexpp": "^4.12.2",
  1804 + "@typescript-eslint/scope-manager": "8.59.2",
  1805 + "@typescript-eslint/type-utils": "8.59.2",
  1806 + "@typescript-eslint/utils": "8.59.2",
  1807 + "@typescript-eslint/visitor-keys": "8.59.2",
  1808 + "ignore": "^7.0.5",
  1809 + "natural-compare": "^1.4.0",
  1810 + "ts-api-utils": "^2.5.0"
  1811 + },
  1812 + "engines": {
  1813 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
  1814 + },
  1815 + "funding": {
  1816 + "type": "opencollective",
  1817 + "url": "https://opencollective.com/typescript-eslint"
  1818 + },
  1819 + "peerDependencies": {
  1820 + "@typescript-eslint/parser": "^8.59.2",
  1821 + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
  1822 + "typescript": ">=4.8.4 <6.1.0"
  1823 + }
  1824 + },
  1825 + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
  1826 + "version": "7.0.5",
  1827 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
  1828 + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
  1829 + "dev": true,
  1830 + "license": "MIT",
  1831 + "engines": {
  1832 + "node": ">= 4"
  1833 + }
  1834 + },
  1835 + "node_modules/@typescript-eslint/parser": {
  1836 + "version": "8.59.2",
  1837 + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.2.tgz",
  1838 + "integrity": "sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==",
  1839 + "dev": true,
  1840 + "license": "MIT",
  1841 + "dependencies": {
  1842 + "@typescript-eslint/scope-manager": "8.59.2",
  1843 + "@typescript-eslint/types": "8.59.2",
  1844 + "@typescript-eslint/typescript-estree": "8.59.2",
  1845 + "@typescript-eslint/visitor-keys": "8.59.2",
  1846 + "debug": "^4.4.3"
  1847 + },
  1848 + "engines": {
  1849 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
  1850 + },
  1851 + "funding": {
  1852 + "type": "opencollective",
  1853 + "url": "https://opencollective.com/typescript-eslint"
  1854 + },
  1855 + "peerDependencies": {
  1856 + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
  1857 + "typescript": ">=4.8.4 <6.1.0"
  1858 + }
  1859 + },
  1860 + "node_modules/@typescript-eslint/project-service": {
  1861 + "version": "8.59.2",
  1862 + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.2.tgz",
  1863 + "integrity": "sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==",
  1864 + "dev": true,
  1865 + "license": "MIT",
  1866 + "dependencies": {
  1867 + "@typescript-eslint/tsconfig-utils": "^8.59.2",
  1868 + "@typescript-eslint/types": "^8.59.2",
  1869 + "debug": "^4.4.3"
  1870 + },
  1871 + "engines": {
  1872 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
  1873 + },
  1874 + "funding": {
  1875 + "type": "opencollective",
  1876 + "url": "https://opencollective.com/typescript-eslint"
  1877 + },
  1878 + "peerDependencies": {
  1879 + "typescript": ">=4.8.4 <6.1.0"
  1880 + }
  1881 + },
  1882 + "node_modules/@typescript-eslint/scope-manager": {
  1883 + "version": "8.59.2",
  1884 + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.2.tgz",
  1885 + "integrity": "sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==",
  1886 + "dev": true,
  1887 + "license": "MIT",
  1888 + "dependencies": {
  1889 + "@typescript-eslint/types": "8.59.2",
  1890 + "@typescript-eslint/visitor-keys": "8.59.2"
  1891 + },
  1892 + "engines": {
  1893 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
  1894 + },
  1895 + "funding": {
  1896 + "type": "opencollective",
  1897 + "url": "https://opencollective.com/typescript-eslint"
  1898 + }
  1899 + },
  1900 + "node_modules/@typescript-eslint/tsconfig-utils": {
  1901 + "version": "8.59.2",
  1902 + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.2.tgz",
  1903 + "integrity": "sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==",
  1904 + "dev": true,
  1905 + "license": "MIT",
  1906 + "engines": {
  1907 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
  1908 + },
  1909 + "funding": {
  1910 + "type": "opencollective",
  1911 + "url": "https://opencollective.com/typescript-eslint"
  1912 + },
  1913 + "peerDependencies": {
  1914 + "typescript": ">=4.8.4 <6.1.0"
  1915 + }
  1916 + },
  1917 + "node_modules/@typescript-eslint/type-utils": {
  1918 + "version": "8.59.2",
  1919 + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.2.tgz",
  1920 + "integrity": "sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ==",
  1921 + "dev": true,
  1922 + "license": "MIT",
  1923 + "dependencies": {
  1924 + "@typescript-eslint/types": "8.59.2",
  1925 + "@typescript-eslint/typescript-estree": "8.59.2",
  1926 + "@typescript-eslint/utils": "8.59.2",
  1927 + "debug": "^4.4.3",
  1928 + "ts-api-utils": "^2.5.0"
  1929 + },
  1930 + "engines": {
  1931 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
  1932 + },
  1933 + "funding": {
  1934 + "type": "opencollective",
  1935 + "url": "https://opencollective.com/typescript-eslint"
  1936 + },
  1937 + "peerDependencies": {
  1938 + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
  1939 + "typescript": ">=4.8.4 <6.1.0"
  1940 + }
  1941 + },
  1942 + "node_modules/@typescript-eslint/types": {
  1943 + "version": "8.59.2",
  1944 + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.2.tgz",
  1945 + "integrity": "sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==",
  1946 + "dev": true,
  1947 + "license": "MIT",
  1948 + "engines": {
  1949 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
  1950 + },
  1951 + "funding": {
  1952 + "type": "opencollective",
  1953 + "url": "https://opencollective.com/typescript-eslint"
  1954 + }
  1955 + },
  1956 + "node_modules/@typescript-eslint/typescript-estree": {
  1957 + "version": "8.59.2",
  1958 + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.2.tgz",
  1959 + "integrity": "sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==",
  1960 + "dev": true,
  1961 + "license": "MIT",
  1962 + "dependencies": {
  1963 + "@typescript-eslint/project-service": "8.59.2",
  1964 + "@typescript-eslint/tsconfig-utils": "8.59.2",
  1965 + "@typescript-eslint/types": "8.59.2",
  1966 + "@typescript-eslint/visitor-keys": "8.59.2",
  1967 + "debug": "^4.4.3",
  1968 + "minimatch": "^10.2.2",
  1969 + "semver": "^7.7.3",
  1970 + "tinyglobby": "^0.2.15",
  1971 + "ts-api-utils": "^2.5.0"
  1972 + },
  1973 + "engines": {
  1974 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
  1975 + },
  1976 + "funding": {
  1977 + "type": "opencollective",
  1978 + "url": "https://opencollective.com/typescript-eslint"
  1979 + },
  1980 + "peerDependencies": {
  1981 + "typescript": ">=4.8.4 <6.1.0"
  1982 + }
  1983 + },
  1984 + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
  1985 + "version": "7.7.4",
  1986 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
  1987 + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
  1988 + "dev": true,
  1989 + "license": "ISC",
  1990 + "bin": {
  1991 + "semver": "bin/semver.js"
  1992 + },
  1993 + "engines": {
  1994 + "node": ">=10"
  1995 + }
  1996 + },
  1997 + "node_modules/@typescript-eslint/utils": {
  1998 + "version": "8.59.2",
  1999 + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.2.tgz",
  2000 + "integrity": "sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q==",
  2001 + "dev": true,
  2002 + "license": "MIT",
  2003 + "dependencies": {
  2004 + "@eslint-community/eslint-utils": "^4.9.1",
  2005 + "@typescript-eslint/scope-manager": "8.59.2",
  2006 + "@typescript-eslint/types": "8.59.2",
  2007 + "@typescript-eslint/typescript-estree": "8.59.2"
  2008 + },
  2009 + "engines": {
  2010 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
  2011 + },
  2012 + "funding": {
  2013 + "type": "opencollective",
  2014 + "url": "https://opencollective.com/typescript-eslint"
  2015 + },
  2016 + "peerDependencies": {
  2017 + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
  2018 + "typescript": ">=4.8.4 <6.1.0"
  2019 + }
  2020 + },
  2021 + "node_modules/@typescript-eslint/visitor-keys": {
  2022 + "version": "8.59.2",
  2023 + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.2.tgz",
  2024 + "integrity": "sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==",
  2025 + "dev": true,
  2026 + "license": "MIT",
  2027 + "dependencies": {
  2028 + "@typescript-eslint/types": "8.59.2",
  2029 + "eslint-visitor-keys": "^5.0.0"
  2030 + },
  2031 + "engines": {
  2032 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
  2033 + },
  2034 + "funding": {
  2035 + "type": "opencollective",
  2036 + "url": "https://opencollective.com/typescript-eslint"
  2037 + }
  2038 + },
  2039 + "node_modules/@vitejs/plugin-react": {
  2040 + "version": "6.0.1",
  2041 + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz",
  2042 + "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==",
  2043 + "dev": true,
  2044 + "license": "MIT",
  2045 + "dependencies": {
  2046 + "@rolldown/pluginutils": "1.0.0-rc.7"
  2047 + },
  2048 + "engines": {
  2049 + "node": "^20.19.0 || >=22.12.0"
  2050 + },
  2051 + "peerDependencies": {
  2052 + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0",
  2053 + "babel-plugin-react-compiler": "^1.0.0",
  2054 + "vite": "^8.0.0"
  2055 + },
  2056 + "peerDependenciesMeta": {
  2057 + "@rolldown/plugin-babel": {
  2058 + "optional": true
  2059 + },
  2060 + "babel-plugin-react-compiler": {
  2061 + "optional": true
  2062 + }
  2063 + }
  2064 + },
  2065 + "node_modules/acorn": {
  2066 + "version": "8.16.0",
  2067 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
  2068 + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
  2069 + "dev": true,
  2070 + "license": "MIT",
  2071 + "bin": {
  2072 + "acorn": "bin/acorn"
  2073 + },
  2074 + "engines": {
  2075 + "node": ">=0.4.0"
  2076 + }
  2077 + },
  2078 + "node_modules/acorn-jsx": {
  2079 + "version": "5.3.2",
  2080 + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
  2081 + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
  2082 + "dev": true,
  2083 + "license": "MIT",
  2084 + "peerDependencies": {
  2085 + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
  2086 + }
  2087 + },
  2088 + "node_modules/ajv": {
  2089 + "version": "6.15.0",
  2090 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
  2091 + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
  2092 + "dev": true,
  2093 + "license": "MIT",
  2094 + "dependencies": {
  2095 + "fast-deep-equal": "^3.1.1",
  2096 + "fast-json-stable-stringify": "^2.0.0",
  2097 + "json-schema-traverse": "^0.4.1",
  2098 + "uri-js": "^4.2.2"
  2099 + },
  2100 + "funding": {
  2101 + "type": "github",
  2102 + "url": "https://github.com/sponsors/epoberezkin"
  2103 + }
  2104 + },
  2105 + "node_modules/antd": {
  2106 + "version": "6.3.7",
  2107 + "resolved": "https://registry.npmjs.org/antd/-/antd-6.3.7.tgz",
  2108 + "integrity": "sha512-WTHi4bHVNKpYXLHESzU0Tts7rRNQeL84Bph9dfI3Qw7mHbTulExDcYKNHny5CTXcrBBOpraXbU9miBAwUR5vaw==",
  2109 + "license": "MIT",
  2110 + "dependencies": {
  2111 + "@ant-design/colors": "^8.0.1",
  2112 + "@ant-design/cssinjs": "^2.1.2",
  2113 + "@ant-design/cssinjs-utils": "^2.1.2",
  2114 + "@ant-design/fast-color": "^3.0.1",
  2115 + "@ant-design/icons": "^6.1.1",
  2116 + "@ant-design/react-slick": "~2.0.0",
  2117 + "@babel/runtime": "^7.28.4",
  2118 + "@rc-component/cascader": "~1.14.0",
  2119 + "@rc-component/checkbox": "~2.0.0",
  2120 + "@rc-component/collapse": "~1.2.0",
  2121 + "@rc-component/color-picker": "~3.1.1",
  2122 + "@rc-component/dialog": "~1.8.4",
  2123 + "@rc-component/drawer": "~1.4.2",
  2124 + "@rc-component/dropdown": "~1.0.2",
  2125 + "@rc-component/form": "~1.8.1",
  2126 + "@rc-component/image": "~1.9.0",
  2127 + "@rc-component/input": "~1.1.2",
  2128 + "@rc-component/input-number": "~1.6.2",
  2129 + "@rc-component/mentions": "~1.6.0",
  2130 + "@rc-component/menu": "~1.2.0",
  2131 + "@rc-component/motion": "^1.3.2",
  2132 + "@rc-component/mutate-observer": "^2.0.1",
  2133 + "@rc-component/notification": "~1.2.0",
  2134 + "@rc-component/pagination": "~1.2.0",
  2135 + "@rc-component/picker": "~1.9.1",
  2136 + "@rc-component/progress": "~1.0.2",
  2137 + "@rc-component/qrcode": "~1.1.1",
  2138 + "@rc-component/rate": "~1.0.1",
  2139 + "@rc-component/resize-observer": "^1.1.2",
  2140 + "@rc-component/segmented": "~1.3.0",
  2141 + "@rc-component/select": "~1.6.15",
  2142 + "@rc-component/slider": "~1.0.1",
  2143 + "@rc-component/steps": "~1.2.2",
  2144 + "@rc-component/switch": "~1.0.3",
  2145 + "@rc-component/table": "~1.9.1",
  2146 + "@rc-component/tabs": "~1.7.0",
  2147 + "@rc-component/textarea": "~1.1.2",
  2148 + "@rc-component/tooltip": "~1.4.0",
  2149 + "@rc-component/tour": "~2.3.0",
  2150 + "@rc-component/tree": "~1.2.4",
  2151 + "@rc-component/tree-select": "~1.8.0",
  2152 + "@rc-component/trigger": "^3.9.0",
  2153 + "@rc-component/upload": "~1.1.0",
  2154 + "@rc-component/util": "^1.10.1",
  2155 + "clsx": "^2.1.1",
  2156 + "dayjs": "^1.11.11",
  2157 + "scroll-into-view-if-needed": "^3.1.0",
  2158 + "throttle-debounce": "^5.0.2"
  2159 + },
  2160 + "funding": {
  2161 + "type": "opencollective",
  2162 + "url": "https://opencollective.com/ant-design"
  2163 + },
  2164 + "peerDependencies": {
  2165 + "react": ">=18.0.0",
  2166 + "react-dom": ">=18.0.0"
  2167 + }
  2168 + },
  2169 + "node_modules/asynckit": {
  2170 + "version": "0.4.0",
  2171 + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
  2172 + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
  2173 + "license": "MIT"
  2174 + },
  2175 + "node_modules/axios": {
  2176 + "version": "1.16.0",
  2177 + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz",
  2178 + "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==",
  2179 + "license": "MIT",
  2180 + "dependencies": {
  2181 + "follow-redirects": "^1.16.0",
  2182 + "form-data": "^4.0.5",
  2183 + "proxy-from-env": "^2.1.0"
  2184 + }
  2185 + },
  2186 + "node_modules/balanced-match": {
  2187 + "version": "4.0.4",
  2188 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
  2189 + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
  2190 + "dev": true,
  2191 + "license": "MIT",
  2192 + "engines": {
  2193 + "node": "18 || 20 || >=22"
  2194 + }
  2195 + },
  2196 + "node_modules/baseline-browser-mapping": {
  2197 + "version": "2.10.27",
  2198 + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.27.tgz",
  2199 + "integrity": "sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==",
  2200 + "dev": true,
  2201 + "license": "Apache-2.0",
  2202 + "bin": {
  2203 + "baseline-browser-mapping": "dist/cli.cjs"
  2204 + },
  2205 + "engines": {
  2206 + "node": ">=6.0.0"
  2207 + }
  2208 + },
  2209 + "node_modules/brace-expansion": {
  2210 + "version": "5.0.5",
  2211 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
  2212 + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
  2213 + "dev": true,
  2214 + "license": "MIT",
  2215 + "dependencies": {
  2216 + "balanced-match": "^4.0.2"
  2217 + },
  2218 + "engines": {
  2219 + "node": "18 || 20 || >=22"
  2220 + }
  2221 + },
  2222 + "node_modules/browserslist": {
  2223 + "version": "4.28.2",
  2224 + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
  2225 + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==",
  2226 + "dev": true,
  2227 + "funding": [
  2228 + {
  2229 + "type": "opencollective",
  2230 + "url": "https://opencollective.com/browserslist"
  2231 + },
  2232 + {
  2233 + "type": "tidelift",
  2234 + "url": "https://tidelift.com/funding/github/npm/browserslist"
  2235 + },
  2236 + {
  2237 + "type": "github",
  2238 + "url": "https://github.com/sponsors/ai"
  2239 + }
  2240 + ],
  2241 + "license": "MIT",
  2242 + "dependencies": {
  2243 + "baseline-browser-mapping": "^2.10.12",
  2244 + "caniuse-lite": "^1.0.30001782",
  2245 + "electron-to-chromium": "^1.5.328",
  2246 + "node-releases": "^2.0.36",
  2247 + "update-browserslist-db": "^1.2.3"
  2248 + },
  2249 + "bin": {
  2250 + "browserslist": "cli.js"
  2251 + },
  2252 + "engines": {
  2253 + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
  2254 + }
  2255 + },
  2256 + "node_modules/call-bind-apply-helpers": {
  2257 + "version": "1.0.2",
  2258 + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
  2259 + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
  2260 + "license": "MIT",
  2261 + "dependencies": {
  2262 + "es-errors": "^1.3.0",
  2263 + "function-bind": "^1.1.2"
  2264 + },
  2265 + "engines": {
  2266 + "node": ">= 0.4"
  2267 + }
  2268 + },
  2269 + "node_modules/caniuse-lite": {
  2270 + "version": "1.0.30001792",
  2271 + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz",
  2272 + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==",
  2273 + "dev": true,
  2274 + "funding": [
  2275 + {
  2276 + "type": "opencollective",
  2277 + "url": "https://opencollective.com/browserslist"
  2278 + },
  2279 + {
  2280 + "type": "tidelift",
  2281 + "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
  2282 + },
  2283 + {
  2284 + "type": "github",
  2285 + "url": "https://github.com/sponsors/ai"
  2286 + }
  2287 + ],
  2288 + "license": "CC-BY-4.0"
  2289 + },
  2290 + "node_modules/clsx": {
  2291 + "version": "2.1.1",
  2292 + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
  2293 + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
  2294 + "license": "MIT",
  2295 + "engines": {
  2296 + "node": ">=6"
  2297 + }
  2298 + },
  2299 + "node_modules/combined-stream": {
  2300 + "version": "1.0.8",
  2301 + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
  2302 + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
  2303 + "license": "MIT",
  2304 + "dependencies": {
  2305 + "delayed-stream": "~1.0.0"
  2306 + },
  2307 + "engines": {
  2308 + "node": ">= 0.8"
  2309 + }
  2310 + },
  2311 + "node_modules/compute-scroll-into-view": {
  2312 + "version": "3.1.1",
  2313 + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz",
  2314 + "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==",
  2315 + "license": "MIT"
  2316 + },
  2317 + "node_modules/convert-source-map": {
  2318 + "version": "2.0.0",
  2319 + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
  2320 + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
  2321 + "dev": true,
  2322 + "license": "MIT"
  2323 + },
  2324 + "node_modules/cookie": {
  2325 + "version": "1.1.1",
  2326 + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
  2327 + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==",
  2328 + "license": "MIT",
  2329 + "engines": {
  2330 + "node": ">=18"
  2331 + },
  2332 + "funding": {
  2333 + "type": "opencollective",
  2334 + "url": "https://opencollective.com/express"
  2335 + }
  2336 + },
  2337 + "node_modules/cross-spawn": {
  2338 + "version": "7.0.6",
  2339 + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
  2340 + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
  2341 + "dev": true,
  2342 + "license": "MIT",
  2343 + "dependencies": {
  2344 + "path-key": "^3.1.0",
  2345 + "shebang-command": "^2.0.0",
  2346 + "which": "^2.0.1"
  2347 + },
  2348 + "engines": {
  2349 + "node": ">= 8"
  2350 + }
  2351 + },
  2352 + "node_modules/csstype": {
  2353 + "version": "3.2.3",
  2354 + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
  2355 + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
  2356 + "license": "MIT"
  2357 + },
  2358 + "node_modules/dayjs": {
  2359 + "version": "1.11.20",
  2360 + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz",
  2361 + "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==",
  2362 + "license": "MIT"
  2363 + },
  2364 + "node_modules/debug": {
  2365 + "version": "4.4.3",
  2366 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
  2367 + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
  2368 + "dev": true,
  2369 + "license": "MIT",
  2370 + "dependencies": {
  2371 + "ms": "^2.1.3"
  2372 + },
  2373 + "engines": {
  2374 + "node": ">=6.0"
  2375 + },
  2376 + "peerDependenciesMeta": {
  2377 + "supports-color": {
  2378 + "optional": true
  2379 + }
  2380 + }
  2381 + },
  2382 + "node_modules/deep-is": {
  2383 + "version": "0.1.4",
  2384 + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
  2385 + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
  2386 + "dev": true,
  2387 + "license": "MIT"
  2388 + },
  2389 + "node_modules/delayed-stream": {
  2390 + "version": "1.0.0",
  2391 + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
  2392 + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
  2393 + "license": "MIT",
  2394 + "engines": {
  2395 + "node": ">=0.4.0"
  2396 + }
  2397 + },
  2398 + "node_modules/detect-libc": {
  2399 + "version": "2.1.2",
  2400 + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
  2401 + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
  2402 + "dev": true,
  2403 + "license": "Apache-2.0",
  2404 + "engines": {
  2405 + "node": ">=8"
  2406 + }
  2407 + },
  2408 + "node_modules/dunder-proto": {
  2409 + "version": "1.0.1",
  2410 + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
  2411 + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
  2412 + "license": "MIT",
  2413 + "dependencies": {
  2414 + "call-bind-apply-helpers": "^1.0.1",
  2415 + "es-errors": "^1.3.0",
  2416 + "gopd": "^1.2.0"
  2417 + },
  2418 + "engines": {
  2419 + "node": ">= 0.4"
  2420 + }
  2421 + },
  2422 + "node_modules/electron-to-chromium": {
  2423 + "version": "1.5.352",
  2424 + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.352.tgz",
  2425 + "integrity": "sha512-9wHk8x6dyuimoe18EdiDPWKExNdxYqo4fn4FwOVVper6RxT3cmpBwBkWWfSOCYJjQdIco/nPhJhNLmn4Ufg1Yg==",
  2426 + "dev": true,
  2427 + "license": "ISC"
  2428 + },
  2429 + "node_modules/es-define-property": {
  2430 + "version": "1.0.1",
  2431 + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
  2432 + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
  2433 + "license": "MIT",
  2434 + "engines": {
  2435 + "node": ">= 0.4"
  2436 + }
  2437 + },
  2438 + "node_modules/es-errors": {
  2439 + "version": "1.3.0",
  2440 + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
  2441 + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
  2442 + "license": "MIT",
  2443 + "engines": {
  2444 + "node": ">= 0.4"
  2445 + }
  2446 + },
  2447 + "node_modules/es-object-atoms": {
  2448 + "version": "1.1.1",
  2449 + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
  2450 + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
  2451 + "license": "MIT",
  2452 + "dependencies": {
  2453 + "es-errors": "^1.3.0"
  2454 + },
  2455 + "engines": {
  2456 + "node": ">= 0.4"
  2457 + }
  2458 + },
  2459 + "node_modules/es-set-tostringtag": {
  2460 + "version": "2.1.0",
  2461 + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
  2462 + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
  2463 + "license": "MIT",
  2464 + "dependencies": {
  2465 + "es-errors": "^1.3.0",
  2466 + "get-intrinsic": "^1.2.6",
  2467 + "has-tostringtag": "^1.0.2",
  2468 + "hasown": "^2.0.2"
  2469 + },
  2470 + "engines": {
  2471 + "node": ">= 0.4"
  2472 + }
  2473 + },
  2474 + "node_modules/escalade": {
  2475 + "version": "3.2.0",
  2476 + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
  2477 + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
  2478 + "dev": true,
  2479 + "license": "MIT",
  2480 + "engines": {
  2481 + "node": ">=6"
  2482 + }
  2483 + },
  2484 + "node_modules/escape-string-regexp": {
  2485 + "version": "4.0.0",
  2486 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
  2487 + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
  2488 + "dev": true,
  2489 + "license": "MIT",
  2490 + "engines": {
  2491 + "node": ">=10"
  2492 + },
  2493 + "funding": {
  2494 + "url": "https://github.com/sponsors/sindresorhus"
  2495 + }
  2496 + },
  2497 + "node_modules/eslint": {
  2498 + "version": "10.3.0",
  2499 + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.3.0.tgz",
  2500 + "integrity": "sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==",
  2501 + "dev": true,
  2502 + "license": "MIT",
  2503 + "dependencies": {
  2504 + "@eslint-community/eslint-utils": "^4.8.0",
  2505 + "@eslint-community/regexpp": "^4.12.2",
  2506 + "@eslint/config-array": "^0.23.5",
  2507 + "@eslint/config-helpers": "^0.5.5",
  2508 + "@eslint/core": "^1.2.1",
  2509 + "@eslint/plugin-kit": "^0.7.1",
  2510 + "@humanfs/node": "^0.16.6",
  2511 + "@humanwhocodes/module-importer": "^1.0.1",
  2512 + "@humanwhocodes/retry": "^0.4.2",
  2513 + "@types/estree": "^1.0.6",
  2514 + "ajv": "^6.14.0",
  2515 + "cross-spawn": "^7.0.6",
  2516 + "debug": "^4.3.2",
  2517 + "escape-string-regexp": "^4.0.0",
  2518 + "eslint-scope": "^9.1.2",
  2519 + "eslint-visitor-keys": "^5.0.1",
  2520 + "espree": "^11.2.0",
  2521 + "esquery": "^1.7.0",
  2522 + "esutils": "^2.0.2",
  2523 + "fast-deep-equal": "^3.1.3",
  2524 + "file-entry-cache": "^8.0.0",
  2525 + "find-up": "^5.0.0",
  2526 + "glob-parent": "^6.0.2",
  2527 + "ignore": "^5.2.0",
  2528 + "imurmurhash": "^0.1.4",
  2529 + "is-glob": "^4.0.0",
  2530 + "json-stable-stringify-without-jsonify": "^1.0.1",
  2531 + "minimatch": "^10.2.4",
  2532 + "natural-compare": "^1.4.0",
  2533 + "optionator": "^0.9.3"
  2534 + },
  2535 + "bin": {
  2536 + "eslint": "bin/eslint.js"
  2537 + },
  2538 + "engines": {
  2539 + "node": "^20.19.0 || ^22.13.0 || >=24"
  2540 + },
  2541 + "funding": {
  2542 + "url": "https://eslint.org/donate"
  2543 + },
  2544 + "peerDependencies": {
  2545 + "jiti": "*"
  2546 + },
  2547 + "peerDependenciesMeta": {
  2548 + "jiti": {
  2549 + "optional": true
  2550 + }
  2551 + }
  2552 + },
  2553 + "node_modules/eslint-plugin-react-hooks": {
  2554 + "version": "7.1.1",
  2555 + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz",
  2556 + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==",
  2557 + "dev": true,
  2558 + "license": "MIT",
  2559 + "dependencies": {
  2560 + "@babel/core": "^7.24.4",
  2561 + "@babel/parser": "^7.24.4",
  2562 + "hermes-parser": "^0.25.1",
  2563 + "zod": "^3.25.0 || ^4.0.0",
  2564 + "zod-validation-error": "^3.5.0 || ^4.0.0"
  2565 + },
  2566 + "engines": {
  2567 + "node": ">=18"
  2568 + },
  2569 + "peerDependencies": {
  2570 + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0"
  2571 + }
  2572 + },
  2573 + "node_modules/eslint-plugin-react-refresh": {
  2574 + "version": "0.5.2",
  2575 + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz",
  2576 + "integrity": "sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==",
  2577 + "dev": true,
  2578 + "license": "MIT",
  2579 + "peerDependencies": {
  2580 + "eslint": "^9 || ^10"
  2581 + }
  2582 + },
  2583 + "node_modules/eslint-scope": {
  2584 + "version": "9.1.2",
  2585 + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz",
  2586 + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==",
  2587 + "dev": true,
  2588 + "license": "BSD-2-Clause",
  2589 + "dependencies": {
  2590 + "@types/esrecurse": "^4.3.1",
  2591 + "@types/estree": "^1.0.8",
  2592 + "esrecurse": "^4.3.0",
  2593 + "estraverse": "^5.2.0"
  2594 + },
  2595 + "engines": {
  2596 + "node": "^20.19.0 || ^22.13.0 || >=24"
  2597 + },
  2598 + "funding": {
  2599 + "url": "https://opencollective.com/eslint"
  2600 + }
  2601 + },
  2602 + "node_modules/eslint-visitor-keys": {
  2603 + "version": "5.0.1",
  2604 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
  2605 + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
  2606 + "dev": true,
  2607 + "license": "Apache-2.0",
  2608 + "engines": {
  2609 + "node": "^20.19.0 || ^22.13.0 || >=24"
  2610 + },
  2611 + "funding": {
  2612 + "url": "https://opencollective.com/eslint"
  2613 + }
  2614 + },
  2615 + "node_modules/espree": {
  2616 + "version": "11.2.0",
  2617 + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz",
  2618 + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==",
  2619 + "dev": true,
  2620 + "license": "BSD-2-Clause",
  2621 + "dependencies": {
  2622 + "acorn": "^8.16.0",
  2623 + "acorn-jsx": "^5.3.2",
  2624 + "eslint-visitor-keys": "^5.0.1"
  2625 + },
  2626 + "engines": {
  2627 + "node": "^20.19.0 || ^22.13.0 || >=24"
  2628 + },
  2629 + "funding": {
  2630 + "url": "https://opencollective.com/eslint"
  2631 + }
  2632 + },
  2633 + "node_modules/esquery": {
  2634 + "version": "1.7.0",
  2635 + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
  2636 + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
  2637 + "dev": true,
  2638 + "license": "BSD-3-Clause",
  2639 + "dependencies": {
  2640 + "estraverse": "^5.1.0"
  2641 + },
  2642 + "engines": {
  2643 + "node": ">=0.10"
  2644 + }
  2645 + },
  2646 + "node_modules/esrecurse": {
  2647 + "version": "4.3.0",
  2648 + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
  2649 + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
  2650 + "dev": true,
  2651 + "license": "BSD-2-Clause",
  2652 + "dependencies": {
  2653 + "estraverse": "^5.2.0"
  2654 + },
  2655 + "engines": {
  2656 + "node": ">=4.0"
  2657 + }
  2658 + },
  2659 + "node_modules/estraverse": {
  2660 + "version": "5.3.0",
  2661 + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
  2662 + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
  2663 + "dev": true,
  2664 + "license": "BSD-2-Clause",
  2665 + "engines": {
  2666 + "node": ">=4.0"
  2667 + }
  2668 + },
  2669 + "node_modules/esutils": {
  2670 + "version": "2.0.3",
  2671 + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
  2672 + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
  2673 + "dev": true,
  2674 + "license": "BSD-2-Clause",
  2675 + "engines": {
  2676 + "node": ">=0.10.0"
  2677 + }
  2678 + },
  2679 + "node_modules/fast-deep-equal": {
  2680 + "version": "3.1.3",
  2681 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
  2682 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
  2683 + "dev": true,
  2684 + "license": "MIT"
  2685 + },
  2686 + "node_modules/fast-json-stable-stringify": {
  2687 + "version": "2.1.0",
  2688 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
  2689 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
  2690 + "dev": true,
  2691 + "license": "MIT"
  2692 + },
  2693 + "node_modules/fast-levenshtein": {
  2694 + "version": "2.0.6",
  2695 + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
  2696 + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
  2697 + "dev": true,
  2698 + "license": "MIT"
  2699 + },
  2700 + "node_modules/fdir": {
  2701 + "version": "6.5.0",
  2702 + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
  2703 + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
  2704 + "dev": true,
  2705 + "license": "MIT",
  2706 + "engines": {
  2707 + "node": ">=12.0.0"
  2708 + },
  2709 + "peerDependencies": {
  2710 + "picomatch": "^3 || ^4"
  2711 + },
  2712 + "peerDependenciesMeta": {
  2713 + "picomatch": {
  2714 + "optional": true
  2715 + }
  2716 + }
  2717 + },
  2718 + "node_modules/file-entry-cache": {
  2719 + "version": "8.0.0",
  2720 + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
  2721 + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
  2722 + "dev": true,
  2723 + "license": "MIT",
  2724 + "dependencies": {
  2725 + "flat-cache": "^4.0.0"
  2726 + },
  2727 + "engines": {
  2728 + "node": ">=16.0.0"
  2729 + }
  2730 + },
  2731 + "node_modules/find-up": {
  2732 + "version": "5.0.0",
  2733 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
  2734 + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
  2735 + "dev": true,
  2736 + "license": "MIT",
  2737 + "dependencies": {
  2738 + "locate-path": "^6.0.0",
  2739 + "path-exists": "^4.0.0"
  2740 + },
  2741 + "engines": {
  2742 + "node": ">=10"
  2743 + },
  2744 + "funding": {
  2745 + "url": "https://github.com/sponsors/sindresorhus"
  2746 + }
  2747 + },
  2748 + "node_modules/flat-cache": {
  2749 + "version": "4.0.1",
  2750 + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
  2751 + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
  2752 + "dev": true,
  2753 + "license": "MIT",
  2754 + "dependencies": {
  2755 + "flatted": "^3.2.9",
  2756 + "keyv": "^4.5.4"
  2757 + },
  2758 + "engines": {
  2759 + "node": ">=16"
  2760 + }
  2761 + },
  2762 + "node_modules/flatted": {
  2763 + "version": "3.4.2",
  2764 + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
  2765 + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
  2766 + "dev": true,
  2767 + "license": "ISC"
  2768 + },
  2769 + "node_modules/follow-redirects": {
  2770 + "version": "1.16.0",
  2771 + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz",
  2772 + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==",
  2773 + "funding": [
  2774 + {
  2775 + "type": "individual",
  2776 + "url": "https://github.com/sponsors/RubenVerborgh"
  2777 + }
  2778 + ],
  2779 + "license": "MIT",
  2780 + "engines": {
  2781 + "node": ">=4.0"
  2782 + },
  2783 + "peerDependenciesMeta": {
  2784 + "debug": {
  2785 + "optional": true
  2786 + }
  2787 + }
  2788 + },
  2789 + "node_modules/form-data": {
  2790 + "version": "4.0.5",
  2791 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
  2792 + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
  2793 + "license": "MIT",
  2794 + "dependencies": {
  2795 + "asynckit": "^0.4.0",
  2796 + "combined-stream": "^1.0.8",
  2797 + "es-set-tostringtag": "^2.1.0",
  2798 + "hasown": "^2.0.2",
  2799 + "mime-types": "^2.1.12"
  2800 + },
  2801 + "engines": {
  2802 + "node": ">= 6"
  2803 + }
  2804 + },
  2805 + "node_modules/fsevents": {
  2806 + "version": "2.3.3",
  2807 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
  2808 + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
  2809 + "dev": true,
  2810 + "hasInstallScript": true,
  2811 + "license": "MIT",
  2812 + "optional": true,
  2813 + "os": [
  2814 + "darwin"
  2815 + ],
  2816 + "engines": {
  2817 + "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
  2818 + }
  2819 + },
  2820 + "node_modules/function-bind": {
  2821 + "version": "1.1.2",
  2822 + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
  2823 + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
  2824 + "license": "MIT",
  2825 + "funding": {
  2826 + "url": "https://github.com/sponsors/ljharb"
  2827 + }
  2828 + },
  2829 + "node_modules/gensync": {
  2830 + "version": "1.0.0-beta.2",
  2831 + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
  2832 + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
  2833 + "dev": true,
  2834 + "license": "MIT",
  2835 + "engines": {
  2836 + "node": ">=6.9.0"
  2837 + }
  2838 + },
  2839 + "node_modules/get-intrinsic": {
  2840 + "version": "1.3.0",
  2841 + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
  2842 + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
  2843 + "license": "MIT",
  2844 + "dependencies": {
  2845 + "call-bind-apply-helpers": "^1.0.2",
  2846 + "es-define-property": "^1.0.1",
  2847 + "es-errors": "^1.3.0",
  2848 + "es-object-atoms": "^1.1.1",
  2849 + "function-bind": "^1.1.2",
  2850 + "get-proto": "^1.0.1",
  2851 + "gopd": "^1.2.0",
  2852 + "has-symbols": "^1.1.0",
  2853 + "hasown": "^2.0.2",
  2854 + "math-intrinsics": "^1.1.0"
  2855 + },
  2856 + "engines": {
  2857 + "node": ">= 0.4"
  2858 + },
  2859 + "funding": {
  2860 + "url": "https://github.com/sponsors/ljharb"
  2861 + }
  2862 + },
  2863 + "node_modules/get-proto": {
  2864 + "version": "1.0.1",
  2865 + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
  2866 + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
  2867 + "license": "MIT",
  2868 + "dependencies": {
  2869 + "dunder-proto": "^1.0.1",
  2870 + "es-object-atoms": "^1.0.0"
  2871 + },
  2872 + "engines": {
  2873 + "node": ">= 0.4"
  2874 + }
  2875 + },
  2876 + "node_modules/glob-parent": {
  2877 + "version": "6.0.2",
  2878 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
  2879 + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
  2880 + "dev": true,
  2881 + "license": "ISC",
  2882 + "dependencies": {
  2883 + "is-glob": "^4.0.3"
  2884 + },
  2885 + "engines": {
  2886 + "node": ">=10.13.0"
  2887 + }
  2888 + },
  2889 + "node_modules/globals": {
  2890 + "version": "17.6.0",
  2891 + "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz",
  2892 + "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==",
  2893 + "dev": true,
  2894 + "license": "MIT",
  2895 + "engines": {
  2896 + "node": ">=18"
  2897 + },
  2898 + "funding": {
  2899 + "url": "https://github.com/sponsors/sindresorhus"
  2900 + }
  2901 + },
  2902 + "node_modules/gopd": {
  2903 + "version": "1.2.0",
  2904 + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
  2905 + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
  2906 + "license": "MIT",
  2907 + "engines": {
  2908 + "node": ">= 0.4"
  2909 + },
  2910 + "funding": {
  2911 + "url": "https://github.com/sponsors/ljharb"
  2912 + }
  2913 + },
  2914 + "node_modules/has-symbols": {
  2915 + "version": "1.1.0",
  2916 + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
  2917 + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
  2918 + "license": "MIT",
  2919 + "engines": {
  2920 + "node": ">= 0.4"
  2921 + },
  2922 + "funding": {
  2923 + "url": "https://github.com/sponsors/ljharb"
  2924 + }
  2925 + },
  2926 + "node_modules/has-tostringtag": {
  2927 + "version": "1.0.2",
  2928 + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
  2929 + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
  2930 + "license": "MIT",
  2931 + "dependencies": {
  2932 + "has-symbols": "^1.0.3"
  2933 + },
  2934 + "engines": {
  2935 + "node": ">= 0.4"
  2936 + },
  2937 + "funding": {
  2938 + "url": "https://github.com/sponsors/ljharb"
  2939 + }
  2940 + },
  2941 + "node_modules/hasown": {
  2942 + "version": "2.0.3",
  2943 + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz",
  2944 + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==",
  2945 + "license": "MIT",
  2946 + "dependencies": {
  2947 + "function-bind": "^1.1.2"
  2948 + },
  2949 + "engines": {
  2950 + "node": ">= 0.4"
  2951 + }
  2952 + },
  2953 + "node_modules/hermes-estree": {
  2954 + "version": "0.25.1",
  2955 + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz",
  2956 + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==",
  2957 + "dev": true,
  2958 + "license": "MIT"
  2959 + },
  2960 + "node_modules/hermes-parser": {
  2961 + "version": "0.25.1",
  2962 + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz",
  2963 + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==",
  2964 + "dev": true,
  2965 + "license": "MIT",
  2966 + "dependencies": {
  2967 + "hermes-estree": "0.25.1"
  2968 + }
  2969 + },
  2970 + "node_modules/ignore": {
  2971 + "version": "5.3.2",
  2972 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
  2973 + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
  2974 + "dev": true,
  2975 + "license": "MIT",
  2976 + "engines": {
  2977 + "node": ">= 4"
  2978 + }
  2979 + },
  2980 + "node_modules/immer": {
  2981 + "version": "11.1.7",
  2982 + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.7.tgz",
  2983 + "integrity": "sha512-LFVFtAROHcDy1er5UI6nodRFnZ2SgdCXhfNSI+DpObO8N7Pur/muBGsjzH5wpnFHCYhYVQxZskCkV4koQ//3/Q==",
  2984 + "license": "MIT",
  2985 + "funding": {
  2986 + "type": "opencollective",
  2987 + "url": "https://opencollective.com/immer"
  2988 + }
  2989 + },
  2990 + "node_modules/imurmurhash": {
  2991 + "version": "0.1.4",
  2992 + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
  2993 + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
  2994 + "dev": true,
  2995 + "license": "MIT",
  2996 + "engines": {
  2997 + "node": ">=0.8.19"
  2998 + }
  2999 + },
  3000 + "node_modules/is-extglob": {
  3001 + "version": "2.1.1",
  3002 + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
  3003 + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
  3004 + "dev": true,
  3005 + "license": "MIT",
  3006 + "engines": {
  3007 + "node": ">=0.10.0"
  3008 + }
  3009 + },
  3010 + "node_modules/is-glob": {
  3011 + "version": "4.0.3",
  3012 + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
  3013 + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
  3014 + "dev": true,
  3015 + "license": "MIT",
  3016 + "dependencies": {
  3017 + "is-extglob": "^2.1.1"
  3018 + },
  3019 + "engines": {
  3020 + "node": ">=0.10.0"
  3021 + }
  3022 + },
  3023 + "node_modules/is-mobile": {
  3024 + "version": "5.0.0",
  3025 + "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-5.0.0.tgz",
  3026 + "integrity": "sha512-Tz/yndySvLAEXh+Uk8liFCxOwVH6YutuR74utvOcu7I9Di+DwM0mtdPVZNaVvvBUM2OXxne/NhOs1zAO7riusQ==",
  3027 + "license": "MIT"
  3028 + },
  3029 + "node_modules/isexe": {
  3030 + "version": "2.0.0",
  3031 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
  3032 + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
  3033 + "dev": true,
  3034 + "license": "ISC"
  3035 + },
  3036 + "node_modules/js-tokens": {
  3037 + "version": "4.0.0",
  3038 + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
  3039 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
  3040 + "dev": true,
  3041 + "license": "MIT"
  3042 + },
  3043 + "node_modules/jsesc": {
  3044 + "version": "3.1.0",
  3045 + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
  3046 + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
  3047 + "dev": true,
  3048 + "license": "MIT",
  3049 + "bin": {
  3050 + "jsesc": "bin/jsesc"
  3051 + },
  3052 + "engines": {
  3053 + "node": ">=6"
  3054 + }
  3055 + },
  3056 + "node_modules/json-buffer": {
  3057 + "version": "3.0.1",
  3058 + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
  3059 + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
  3060 + "dev": true,
  3061 + "license": "MIT"
  3062 + },
  3063 + "node_modules/json-schema-traverse": {
  3064 + "version": "0.4.1",
  3065 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
  3066 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
  3067 + "dev": true,
  3068 + "license": "MIT"
  3069 + },
  3070 + "node_modules/json-stable-stringify-without-jsonify": {
  3071 + "version": "1.0.1",
  3072 + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
  3073 + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
  3074 + "dev": true,
  3075 + "license": "MIT"
  3076 + },
  3077 + "node_modules/json2mq": {
  3078 + "version": "0.2.0",
  3079 + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz",
  3080 + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==",
  3081 + "license": "MIT",
  3082 + "dependencies": {
  3083 + "string-convert": "^0.2.0"
  3084 + }
  3085 + },
  3086 + "node_modules/json5": {
  3087 + "version": "2.2.3",
  3088 + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
  3089 + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
  3090 + "dev": true,
  3091 + "license": "MIT",
  3092 + "bin": {
  3093 + "json5": "lib/cli.js"
  3094 + },
  3095 + "engines": {
  3096 + "node": ">=6"
  3097 + }
  3098 + },
  3099 + "node_modules/keyv": {
  3100 + "version": "4.5.4",
  3101 + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
  3102 + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
  3103 + "dev": true,
  3104 + "license": "MIT",
  3105 + "dependencies": {
  3106 + "json-buffer": "3.0.1"
  3107 + }
  3108 + },
  3109 + "node_modules/levn": {
  3110 + "version": "0.4.1",
  3111 + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
  3112 + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
  3113 + "dev": true,
  3114 + "license": "MIT",
  3115 + "dependencies": {
  3116 + "prelude-ls": "^1.2.1",
  3117 + "type-check": "~0.4.0"
  3118 + },
  3119 + "engines": {
  3120 + "node": ">= 0.8.0"
  3121 + }
  3122 + },
  3123 + "node_modules/lightningcss": {
  3124 + "version": "1.32.0",
  3125 + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
  3126 + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
  3127 + "dev": true,
  3128 + "license": "MPL-2.0",
  3129 + "dependencies": {
  3130 + "detect-libc": "^2.0.3"
  3131 + },
  3132 + "engines": {
  3133 + "node": ">= 12.0.0"
  3134 + },
  3135 + "funding": {
  3136 + "type": "opencollective",
  3137 + "url": "https://opencollective.com/parcel"
  3138 + },
  3139 + "optionalDependencies": {
  3140 + "lightningcss-android-arm64": "1.32.0",
  3141 + "lightningcss-darwin-arm64": "1.32.0",
  3142 + "lightningcss-darwin-x64": "1.32.0",
  3143 + "lightningcss-freebsd-x64": "1.32.0",
  3144 + "lightningcss-linux-arm-gnueabihf": "1.32.0",
  3145 + "lightningcss-linux-arm64-gnu": "1.32.0",
  3146 + "lightningcss-linux-arm64-musl": "1.32.0",
  3147 + "lightningcss-linux-x64-gnu": "1.32.0",
  3148 + "lightningcss-linux-x64-musl": "1.32.0",
  3149 + "lightningcss-win32-arm64-msvc": "1.32.0",
  3150 + "lightningcss-win32-x64-msvc": "1.32.0"
  3151 + }
  3152 + },
  3153 + "node_modules/lightningcss-android-arm64": {
  3154 + "version": "1.32.0",
  3155 + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
  3156 + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
  3157 + "cpu": [
  3158 + "arm64"
  3159 + ],
  3160 + "dev": true,
  3161 + "license": "MPL-2.0",
  3162 + "optional": true,
  3163 + "os": [
  3164 + "android"
  3165 + ],
  3166 + "engines": {
  3167 + "node": ">= 12.0.0"
  3168 + },
  3169 + "funding": {
  3170 + "type": "opencollective",
  3171 + "url": "https://opencollective.com/parcel"
  3172 + }
  3173 + },
  3174 + "node_modules/lightningcss-darwin-arm64": {
  3175 + "version": "1.32.0",
  3176 + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
  3177 + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
  3178 + "cpu": [
  3179 + "arm64"
  3180 + ],
  3181 + "dev": true,
  3182 + "license": "MPL-2.0",
  3183 + "optional": true,
  3184 + "os": [
  3185 + "darwin"
  3186 + ],
  3187 + "engines": {
  3188 + "node": ">= 12.0.0"
  3189 + },
  3190 + "funding": {
  3191 + "type": "opencollective",
  3192 + "url": "https://opencollective.com/parcel"
  3193 + }
  3194 + },
  3195 + "node_modules/lightningcss-darwin-x64": {
  3196 + "version": "1.32.0",
  3197 + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
  3198 + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
  3199 + "cpu": [
  3200 + "x64"
  3201 + ],
  3202 + "dev": true,
  3203 + "license": "MPL-2.0",
  3204 + "optional": true,
  3205 + "os": [
  3206 + "darwin"
  3207 + ],
  3208 + "engines": {
  3209 + "node": ">= 12.0.0"
  3210 + },
  3211 + "funding": {
  3212 + "type": "opencollective",
  3213 + "url": "https://opencollective.com/parcel"
  3214 + }
  3215 + },
  3216 + "node_modules/lightningcss-freebsd-x64": {
  3217 + "version": "1.32.0",
  3218 + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
  3219 + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
  3220 + "cpu": [
  3221 + "x64"
  3222 + ],
  3223 + "dev": true,
  3224 + "license": "MPL-2.0",
  3225 + "optional": true,
  3226 + "os": [
  3227 + "freebsd"
  3228 + ],
  3229 + "engines": {
  3230 + "node": ">= 12.0.0"
  3231 + },
  3232 + "funding": {
  3233 + "type": "opencollective",
  3234 + "url": "https://opencollective.com/parcel"
  3235 + }
  3236 + },
  3237 + "node_modules/lightningcss-linux-arm-gnueabihf": {
  3238 + "version": "1.32.0",
  3239 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
  3240 + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
  3241 + "cpu": [
  3242 + "arm"
  3243 + ],
  3244 + "dev": true,
  3245 + "license": "MPL-2.0",
  3246 + "optional": true,
  3247 + "os": [
  3248 + "linux"
  3249 + ],
  3250 + "engines": {
  3251 + "node": ">= 12.0.0"
  3252 + },
  3253 + "funding": {
  3254 + "type": "opencollective",
  3255 + "url": "https://opencollective.com/parcel"
  3256 + }
  3257 + },
  3258 + "node_modules/lightningcss-linux-arm64-gnu": {
  3259 + "version": "1.32.0",
  3260 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
  3261 + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
  3262 + "cpu": [
  3263 + "arm64"
  3264 + ],
  3265 + "dev": true,
  3266 + "libc": [
  3267 + "glibc"
  3268 + ],
  3269 + "license": "MPL-2.0",
  3270 + "optional": true,
  3271 + "os": [
  3272 + "linux"
  3273 + ],
  3274 + "engines": {
  3275 + "node": ">= 12.0.0"
  3276 + },
  3277 + "funding": {
  3278 + "type": "opencollective",
  3279 + "url": "https://opencollective.com/parcel"
  3280 + }
  3281 + },
  3282 + "node_modules/lightningcss-linux-arm64-musl": {
  3283 + "version": "1.32.0",
  3284 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
  3285 + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
  3286 + "cpu": [
  3287 + "arm64"
  3288 + ],
  3289 + "dev": true,
  3290 + "libc": [
  3291 + "musl"
  3292 + ],
  3293 + "license": "MPL-2.0",
  3294 + "optional": true,
  3295 + "os": [
  3296 + "linux"
  3297 + ],
  3298 + "engines": {
  3299 + "node": ">= 12.0.0"
  3300 + },
  3301 + "funding": {
  3302 + "type": "opencollective",
  3303 + "url": "https://opencollective.com/parcel"
  3304 + }
  3305 + },
  3306 + "node_modules/lightningcss-linux-x64-gnu": {
  3307 + "version": "1.32.0",
  3308 + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
  3309 + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
  3310 + "cpu": [
  3311 + "x64"
  3312 + ],
  3313 + "dev": true,
  3314 + "libc": [
  3315 + "glibc"
  3316 + ],
  3317 + "license": "MPL-2.0",
  3318 + "optional": true,
  3319 + "os": [
  3320 + "linux"
  3321 + ],
  3322 + "engines": {
  3323 + "node": ">= 12.0.0"
  3324 + },
  3325 + "funding": {
  3326 + "type": "opencollective",
  3327 + "url": "https://opencollective.com/parcel"
  3328 + }
  3329 + },
  3330 + "node_modules/lightningcss-linux-x64-musl": {
  3331 + "version": "1.32.0",
  3332 + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
  3333 + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
  3334 + "cpu": [
  3335 + "x64"
  3336 + ],
  3337 + "dev": true,
  3338 + "libc": [
  3339 + "musl"
  3340 + ],
  3341 + "license": "MPL-2.0",
  3342 + "optional": true,
  3343 + "os": [
  3344 + "linux"
  3345 + ],
  3346 + "engines": {
  3347 + "node": ">= 12.0.0"
  3348 + },
  3349 + "funding": {
  3350 + "type": "opencollective",
  3351 + "url": "https://opencollective.com/parcel"
  3352 + }
  3353 + },
  3354 + "node_modules/lightningcss-win32-arm64-msvc": {
  3355 + "version": "1.32.0",
  3356 + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
  3357 + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
  3358 + "cpu": [
  3359 + "arm64"
  3360 + ],
  3361 + "dev": true,
  3362 + "license": "MPL-2.0",
  3363 + "optional": true,
  3364 + "os": [
  3365 + "win32"
  3366 + ],
  3367 + "engines": {
  3368 + "node": ">= 12.0.0"
  3369 + },
  3370 + "funding": {
  3371 + "type": "opencollective",
  3372 + "url": "https://opencollective.com/parcel"
  3373 + }
  3374 + },
  3375 + "node_modules/lightningcss-win32-x64-msvc": {
  3376 + "version": "1.32.0",
  3377 + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
  3378 + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
  3379 + "cpu": [
  3380 + "x64"
  3381 + ],
  3382 + "dev": true,
  3383 + "license": "MPL-2.0",
  3384 + "optional": true,
  3385 + "os": [
  3386 + "win32"
  3387 + ],
  3388 + "engines": {
  3389 + "node": ">= 12.0.0"
  3390 + },
  3391 + "funding": {
  3392 + "type": "opencollective",
  3393 + "url": "https://opencollective.com/parcel"
  3394 + }
  3395 + },
  3396 + "node_modules/locate-path": {
  3397 + "version": "6.0.0",
  3398 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
  3399 + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
  3400 + "dev": true,
  3401 + "license": "MIT",
  3402 + "dependencies": {
  3403 + "p-locate": "^5.0.0"
  3404 + },
  3405 + "engines": {
  3406 + "node": ">=10"
  3407 + },
  3408 + "funding": {
  3409 + "url": "https://github.com/sponsors/sindresorhus"
  3410 + }
  3411 + },
  3412 + "node_modules/lru-cache": {
  3413 + "version": "5.1.1",
  3414 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
  3415 + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
  3416 + "dev": true,
  3417 + "license": "ISC",
  3418 + "dependencies": {
  3419 + "yallist": "^3.0.2"
  3420 + }
  3421 + },
  3422 + "node_modules/math-intrinsics": {
  3423 + "version": "1.1.0",
  3424 + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
  3425 + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
  3426 + "license": "MIT",
  3427 + "engines": {
  3428 + "node": ">= 0.4"
  3429 + }
  3430 + },
  3431 + "node_modules/mime-db": {
  3432 + "version": "1.52.0",
  3433 + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
  3434 + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
  3435 + "license": "MIT",
  3436 + "engines": {
  3437 + "node": ">= 0.6"
  3438 + }
  3439 + },
  3440 + "node_modules/mime-types": {
  3441 + "version": "2.1.35",
  3442 + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
  3443 + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
  3444 + "license": "MIT",
  3445 + "dependencies": {
  3446 + "mime-db": "1.52.0"
  3447 + },
  3448 + "engines": {
  3449 + "node": ">= 0.6"
  3450 + }
  3451 + },
  3452 + "node_modules/minimatch": {
  3453 + "version": "10.2.5",
  3454 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
  3455 + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
  3456 + "dev": true,
  3457 + "license": "BlueOak-1.0.0",
  3458 + "dependencies": {
  3459 + "brace-expansion": "^5.0.5"
  3460 + },
  3461 + "engines": {
  3462 + "node": "18 || 20 || >=22"
  3463 + },
  3464 + "funding": {
  3465 + "url": "https://github.com/sponsors/isaacs"
  3466 + }
  3467 + },
  3468 + "node_modules/ms": {
  3469 + "version": "2.1.3",
  3470 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
  3471 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
  3472 + "dev": true,
  3473 + "license": "MIT"
  3474 + },
  3475 + "node_modules/nanoid": {
  3476 + "version": "3.3.12",
  3477 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz",
  3478 + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
  3479 + "dev": true,
  3480 + "funding": [
  3481 + {
  3482 + "type": "github",
  3483 + "url": "https://github.com/sponsors/ai"
  3484 + }
  3485 + ],
  3486 + "license": "MIT",
  3487 + "bin": {
  3488 + "nanoid": "bin/nanoid.cjs"
  3489 + },
  3490 + "engines": {
  3491 + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
  3492 + }
  3493 + },
  3494 + "node_modules/natural-compare": {
  3495 + "version": "1.4.0",
  3496 + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
  3497 + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
  3498 + "dev": true,
  3499 + "license": "MIT"
  3500 + },
  3501 + "node_modules/node-releases": {
  3502 + "version": "2.0.38",
  3503 + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz",
  3504 + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==",
  3505 + "dev": true,
  3506 + "license": "MIT"
  3507 + },
  3508 + "node_modules/optionator": {
  3509 + "version": "0.9.4",
  3510 + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
  3511 + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
  3512 + "dev": true,
  3513 + "license": "MIT",
  3514 + "dependencies": {
  3515 + "deep-is": "^0.1.3",
  3516 + "fast-levenshtein": "^2.0.6",
  3517 + "levn": "^0.4.1",
  3518 + "prelude-ls": "^1.2.1",
  3519 + "type-check": "^0.4.0",
  3520 + "word-wrap": "^1.2.5"
  3521 + },
  3522 + "engines": {
  3523 + "node": ">= 0.8.0"
  3524 + }
  3525 + },
  3526 + "node_modules/p-limit": {
  3527 + "version": "3.1.0",
  3528 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
  3529 + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
  3530 + "dev": true,
  3531 + "license": "MIT",
  3532 + "dependencies": {
  3533 + "yocto-queue": "^0.1.0"
  3534 + },
  3535 + "engines": {
  3536 + "node": ">=10"
  3537 + },
  3538 + "funding": {
  3539 + "url": "https://github.com/sponsors/sindresorhus"
  3540 + }
  3541 + },
  3542 + "node_modules/p-locate": {
  3543 + "version": "5.0.0",
  3544 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
  3545 + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
  3546 + "dev": true,
  3547 + "license": "MIT",
  3548 + "dependencies": {
  3549 + "p-limit": "^3.0.2"
  3550 + },
  3551 + "engines": {
  3552 + "node": ">=10"
  3553 + },
  3554 + "funding": {
  3555 + "url": "https://github.com/sponsors/sindresorhus"
  3556 + }
  3557 + },
  3558 + "node_modules/path-exists": {
  3559 + "version": "4.0.0",
  3560 + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
  3561 + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
  3562 + "dev": true,
  3563 + "license": "MIT",
  3564 + "engines": {
  3565 + "node": ">=8"
  3566 + }
  3567 + },
  3568 + "node_modules/path-key": {
  3569 + "version": "3.1.1",
  3570 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
  3571 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
  3572 + "dev": true,
  3573 + "license": "MIT",
  3574 + "engines": {
  3575 + "node": ">=8"
  3576 + }
  3577 + },
  3578 + "node_modules/picocolors": {
  3579 + "version": "1.1.1",
  3580 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
  3581 + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
  3582 + "dev": true,
  3583 + "license": "ISC"
  3584 + },
  3585 + "node_modules/picomatch": {
  3586 + "version": "4.0.4",
  3587 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
  3588 + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
  3589 + "dev": true,
  3590 + "license": "MIT",
  3591 + "engines": {
  3592 + "node": ">=12"
  3593 + },
  3594 + "funding": {
  3595 + "url": "https://github.com/sponsors/jonschlinkert"
  3596 + }
  3597 + },
  3598 + "node_modules/postcss": {
  3599 + "version": "8.5.14",
  3600 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz",
  3601 + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==",
  3602 + "dev": true,
  3603 + "funding": [
  3604 + {
  3605 + "type": "opencollective",
  3606 + "url": "https://opencollective.com/postcss/"
  3607 + },
  3608 + {
  3609 + "type": "tidelift",
  3610 + "url": "https://tidelift.com/funding/github/npm/postcss"
  3611 + },
  3612 + {
  3613 + "type": "github",
  3614 + "url": "https://github.com/sponsors/ai"
  3615 + }
  3616 + ],
  3617 + "license": "MIT",
  3618 + "dependencies": {
  3619 + "nanoid": "^3.3.11",
  3620 + "picocolors": "^1.1.1",
  3621 + "source-map-js": "^1.2.1"
  3622 + },
  3623 + "engines": {
  3624 + "node": "^10 || ^12 || >=14"
  3625 + }
  3626 + },
  3627 + "node_modules/prelude-ls": {
  3628 + "version": "1.2.1",
  3629 + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
  3630 + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
  3631 + "dev": true,
  3632 + "license": "MIT",
  3633 + "engines": {
  3634 + "node": ">= 0.8.0"
  3635 + }
  3636 + },
  3637 + "node_modules/proxy-from-env": {
  3638 + "version": "2.1.0",
  3639 + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz",
  3640 + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==",
  3641 + "license": "MIT",
  3642 + "engines": {
  3643 + "node": ">=10"
  3644 + }
  3645 + },
  3646 + "node_modules/punycode": {
  3647 + "version": "2.3.1",
  3648 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
  3649 + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
  3650 + "dev": true,
  3651 + "license": "MIT",
  3652 + "engines": {
  3653 + "node": ">=6"
  3654 + }
  3655 + },
  3656 + "node_modules/react": {
  3657 + "version": "19.2.6",
  3658 + "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz",
  3659 + "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==",
  3660 + "license": "MIT",
  3661 + "engines": {
  3662 + "node": ">=0.10.0"
  3663 + }
  3664 + },
  3665 + "node_modules/react-dom": {
  3666 + "version": "19.2.6",
  3667 + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz",
  3668 + "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==",
  3669 + "license": "MIT",
  3670 + "dependencies": {
  3671 + "scheduler": "^0.27.0"
  3672 + },
  3673 + "peerDependencies": {
  3674 + "react": "^19.2.6"
  3675 + }
  3676 + },
  3677 + "node_modules/react-is": {
  3678 + "version": "18.3.1",
  3679 + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
  3680 + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
  3681 + "license": "MIT"
  3682 + },
  3683 + "node_modules/react-redux": {
  3684 + "version": "9.2.0",
  3685 + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz",
  3686 + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==",
  3687 + "license": "MIT",
  3688 + "dependencies": {
  3689 + "@types/use-sync-external-store": "^0.0.6",
  3690 + "use-sync-external-store": "^1.4.0"
  3691 + },
  3692 + "peerDependencies": {
  3693 + "@types/react": "^18.2.25 || ^19",
  3694 + "react": "^18.0 || ^19",
  3695 + "redux": "^5.0.0"
  3696 + },
  3697 + "peerDependenciesMeta": {
  3698 + "@types/react": {
  3699 + "optional": true
  3700 + },
  3701 + "redux": {
  3702 + "optional": true
  3703 + }
  3704 + }
  3705 + },
  3706 + "node_modules/react-router": {
  3707 + "version": "7.15.0",
  3708 + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.15.0.tgz",
  3709 + "integrity": "sha512-HW9vYwuM8f4yx66Izy8xfrzCM+SBJluoZcCbww9A1TySax11S5Vgw6fi3ZjMONw9J4gQwngL7PzkyIpJJpJ7RQ==",
  3710 + "license": "MIT",
  3711 + "dependencies": {
  3712 + "cookie": "^1.0.1",
  3713 + "set-cookie-parser": "^2.6.0"
  3714 + },
  3715 + "engines": {
  3716 + "node": ">=20.0.0"
  3717 + },
  3718 + "peerDependencies": {
  3719 + "react": ">=18",
  3720 + "react-dom": ">=18"
  3721 + },
  3722 + "peerDependenciesMeta": {
  3723 + "react-dom": {
  3724 + "optional": true
  3725 + }
  3726 + }
  3727 + },
  3728 + "node_modules/react-router-dom": {
  3729 + "version": "7.15.0",
  3730 + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.15.0.tgz",
  3731 + "integrity": "sha512-VcrVg64Fo8nwBvDscajG8gRTLIuTC6N50nb22l2HOOV4PTOHgoGp8mUjy9wLiHYoYTSYI36tUnXZgasSRFZorQ==",
  3732 + "license": "MIT",
  3733 + "dependencies": {
  3734 + "react-router": "7.15.0"
  3735 + },
  3736 + "engines": {
  3737 + "node": ">=20.0.0"
  3738 + },
  3739 + "peerDependencies": {
  3740 + "react": ">=18",
  3741 + "react-dom": ">=18"
  3742 + }
  3743 + },
  3744 + "node_modules/redux": {
  3745 + "version": "5.0.1",
  3746 + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz",
  3747 + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==",
  3748 + "license": "MIT"
  3749 + },
  3750 + "node_modules/redux-thunk": {
  3751 + "version": "3.1.0",
  3752 + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz",
  3753 + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==",
  3754 + "license": "MIT",
  3755 + "peerDependencies": {
  3756 + "redux": "^5.0.0"
  3757 + }
  3758 + },
  3759 + "node_modules/reselect": {
  3760 + "version": "5.1.1",
  3761 + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz",
  3762 + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==",
  3763 + "license": "MIT"
  3764 + },
  3765 + "node_modules/rolldown": {
  3766 + "version": "1.0.0-rc.17",
  3767 + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.17.tgz",
  3768 + "integrity": "sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==",
  3769 + "dev": true,
  3770 + "license": "MIT",
  3771 + "dependencies": {
  3772 + "@oxc-project/types": "=0.127.0",
  3773 + "@rolldown/pluginutils": "1.0.0-rc.17"
  3774 + },
  3775 + "bin": {
  3776 + "rolldown": "bin/cli.mjs"
  3777 + },
  3778 + "engines": {
  3779 + "node": "^20.19.0 || >=22.12.0"
  3780 + },
  3781 + "optionalDependencies": {
  3782 + "@rolldown/binding-android-arm64": "1.0.0-rc.17",
  3783 + "@rolldown/binding-darwin-arm64": "1.0.0-rc.17",
  3784 + "@rolldown/binding-darwin-x64": "1.0.0-rc.17",
  3785 + "@rolldown/binding-freebsd-x64": "1.0.0-rc.17",
  3786 + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.17",
  3787 + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.17",
  3788 + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.17",
  3789 + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.17",
  3790 + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.17",
  3791 + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.17",
  3792 + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.17",
  3793 + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.17",
  3794 + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.17",
  3795 + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.17",
  3796 + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.17"
  3797 + }
  3798 + },
  3799 + "node_modules/rolldown/node_modules/@rolldown/pluginutils": {
  3800 + "version": "1.0.0-rc.17",
  3801 + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.17.tgz",
  3802 + "integrity": "sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==",
  3803 + "dev": true,
  3804 + "license": "MIT"
  3805 + },
  3806 + "node_modules/scheduler": {
  3807 + "version": "0.27.0",
  3808 + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
  3809 + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
  3810 + "license": "MIT"
  3811 + },
  3812 + "node_modules/scroll-into-view-if-needed": {
  3813 + "version": "3.1.0",
  3814 + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz",
  3815 + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==",
  3816 + "license": "MIT",
  3817 + "dependencies": {
  3818 + "compute-scroll-into-view": "^3.0.2"
  3819 + }
  3820 + },
  3821 + "node_modules/semver": {
  3822 + "version": "6.3.1",
  3823 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
  3824 + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
  3825 + "dev": true,
  3826 + "license": "ISC",
  3827 + "bin": {
  3828 + "semver": "bin/semver.js"
  3829 + }
  3830 + },
  3831 + "node_modules/set-cookie-parser": {
  3832 + "version": "2.7.2",
  3833 + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz",
  3834 + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==",
  3835 + "license": "MIT"
  3836 + },
  3837 + "node_modules/shebang-command": {
  3838 + "version": "2.0.0",
  3839 + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
  3840 + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
  3841 + "dev": true,
  3842 + "license": "MIT",
  3843 + "dependencies": {
  3844 + "shebang-regex": "^3.0.0"
  3845 + },
  3846 + "engines": {
  3847 + "node": ">=8"
  3848 + }
  3849 + },
  3850 + "node_modules/shebang-regex": {
  3851 + "version": "3.0.0",
  3852 + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
  3853 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
  3854 + "dev": true,
  3855 + "license": "MIT",
  3856 + "engines": {
  3857 + "node": ">=8"
  3858 + }
  3859 + },
  3860 + "node_modules/source-map-js": {
  3861 + "version": "1.2.1",
  3862 + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
  3863 + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
  3864 + "dev": true,
  3865 + "license": "BSD-3-Clause",
  3866 + "engines": {
  3867 + "node": ">=0.10.0"
  3868 + }
  3869 + },
  3870 + "node_modules/string-convert": {
  3871 + "version": "0.2.1",
  3872 + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz",
  3873 + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==",
  3874 + "license": "MIT"
  3875 + },
  3876 + "node_modules/stylis": {
  3877 + "version": "4.4.0",
  3878 + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz",
  3879 + "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==",
  3880 + "license": "MIT"
  3881 + },
  3882 + "node_modules/throttle-debounce": {
  3883 + "version": "5.0.2",
  3884 + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz",
  3885 + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==",
  3886 + "license": "MIT",
  3887 + "engines": {
  3888 + "node": ">=12.22"
  3889 + }
  3890 + },
  3891 + "node_modules/tinyglobby": {
  3892 + "version": "0.2.16",
  3893 + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
  3894 + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
  3895 + "dev": true,
  3896 + "license": "MIT",
  3897 + "dependencies": {
  3898 + "fdir": "^6.5.0",
  3899 + "picomatch": "^4.0.4"
  3900 + },
  3901 + "engines": {
  3902 + "node": ">=12.0.0"
  3903 + },
  3904 + "funding": {
  3905 + "url": "https://github.com/sponsors/SuperchupuDev"
  3906 + }
  3907 + },
  3908 + "node_modules/ts-api-utils": {
  3909 + "version": "2.5.0",
  3910 + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
  3911 + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
  3912 + "dev": true,
  3913 + "license": "MIT",
  3914 + "engines": {
  3915 + "node": ">=18.12"
  3916 + },
  3917 + "peerDependencies": {
  3918 + "typescript": ">=4.8.4"
  3919 + }
  3920 + },
  3921 + "node_modules/tslib": {
  3922 + "version": "2.8.1",
  3923 + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
  3924 + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
  3925 + "dev": true,
  3926 + "license": "0BSD",
  3927 + "optional": true
  3928 + },
  3929 + "node_modules/type-check": {
  3930 + "version": "0.4.0",
  3931 + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
  3932 + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
  3933 + "dev": true,
  3934 + "license": "MIT",
  3935 + "dependencies": {
  3936 + "prelude-ls": "^1.2.1"
  3937 + },
  3938 + "engines": {
  3939 + "node": ">= 0.8.0"
  3940 + }
  3941 + },
  3942 + "node_modules/typescript": {
  3943 + "version": "6.0.3",
  3944 + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz",
  3945 + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==",
  3946 + "dev": true,
  3947 + "license": "Apache-2.0",
  3948 + "bin": {
  3949 + "tsc": "bin/tsc",
  3950 + "tsserver": "bin/tsserver"
  3951 + },
  3952 + "engines": {
  3953 + "node": ">=14.17"
  3954 + }
  3955 + },
  3956 + "node_modules/typescript-eslint": {
  3957 + "version": "8.59.2",
  3958 + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.2.tgz",
  3959 + "integrity": "sha512-pJw051uomb3ZeCzGTpRb8RbEqB5Y4WWet8gl/GcTlU35BSx0PVdZ86/bqkQCyKKuraVQEK7r6kBHQXF+fBhkoQ==",
  3960 + "dev": true,
  3961 + "license": "MIT",
  3962 + "dependencies": {
  3963 + "@typescript-eslint/eslint-plugin": "8.59.2",
  3964 + "@typescript-eslint/parser": "8.59.2",
  3965 + "@typescript-eslint/typescript-estree": "8.59.2",
  3966 + "@typescript-eslint/utils": "8.59.2"
  3967 + },
  3968 + "engines": {
  3969 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
  3970 + },
  3971 + "funding": {
  3972 + "type": "opencollective",
  3973 + "url": "https://opencollective.com/typescript-eslint"
  3974 + },
  3975 + "peerDependencies": {
  3976 + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
  3977 + "typescript": ">=4.8.4 <6.1.0"
  3978 + }
  3979 + },
  3980 + "node_modules/undici-types": {
  3981 + "version": "7.16.0",
  3982 + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
  3983 + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
  3984 + "dev": true,
  3985 + "license": "MIT"
  3986 + },
  3987 + "node_modules/update-browserslist-db": {
  3988 + "version": "1.2.3",
  3989 + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
  3990 + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
  3991 + "dev": true,
  3992 + "funding": [
  3993 + {
  3994 + "type": "opencollective",
  3995 + "url": "https://opencollective.com/browserslist"
  3996 + },
  3997 + {
  3998 + "type": "tidelift",
  3999 + "url": "https://tidelift.com/funding/github/npm/browserslist"
  4000 + },
  4001 + {
  4002 + "type": "github",
  4003 + "url": "https://github.com/sponsors/ai"
  4004 + }
  4005 + ],
  4006 + "license": "MIT",
  4007 + "dependencies": {
  4008 + "escalade": "^3.2.0",
  4009 + "picocolors": "^1.1.1"
  4010 + },
  4011 + "bin": {
  4012 + "update-browserslist-db": "cli.js"
  4013 + },
  4014 + "peerDependencies": {
  4015 + "browserslist": ">= 4.21.0"
  4016 + }
  4017 + },
  4018 + "node_modules/uri-js": {
  4019 + "version": "4.4.1",
  4020 + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
  4021 + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
  4022 + "dev": true,
  4023 + "license": "BSD-2-Clause",
  4024 + "dependencies": {
  4025 + "punycode": "^2.1.0"
  4026 + }
  4027 + },
  4028 + "node_modules/use-sync-external-store": {
  4029 + "version": "1.6.0",
  4030 + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
  4031 + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
  4032 + "license": "MIT",
  4033 + "peerDependencies": {
  4034 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
  4035 + }
  4036 + },
  4037 + "node_modules/vite": {
  4038 + "version": "8.0.10",
  4039 + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.10.tgz",
  4040 + "integrity": "sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==",
  4041 + "dev": true,
  4042 + "license": "MIT",
  4043 + "dependencies": {
  4044 + "lightningcss": "^1.32.0",
  4045 + "picomatch": "^4.0.4",
  4046 + "postcss": "^8.5.10",
  4047 + "rolldown": "1.0.0-rc.17",
  4048 + "tinyglobby": "^0.2.16"
  4049 + },
  4050 + "bin": {
  4051 + "vite": "bin/vite.js"
  4052 + },
  4053 + "engines": {
  4054 + "node": "^20.19.0 || >=22.12.0"
  4055 + },
  4056 + "funding": {
  4057 + "url": "https://github.com/vitejs/vite?sponsor=1"
  4058 + },
  4059 + "optionalDependencies": {
  4060 + "fsevents": "~2.3.3"
  4061 + },
  4062 + "peerDependencies": {
  4063 + "@types/node": "^20.19.0 || >=22.12.0",
  4064 + "@vitejs/devtools": "^0.1.0",
  4065 + "esbuild": "^0.27.0 || ^0.28.0",
  4066 + "jiti": ">=1.21.0",
  4067 + "less": "^4.0.0",
  4068 + "sass": "^1.70.0",
  4069 + "sass-embedded": "^1.70.0",
  4070 + "stylus": ">=0.54.8",
  4071 + "sugarss": "^5.0.0",
  4072 + "terser": "^5.16.0",
  4073 + "tsx": "^4.8.1",
  4074 + "yaml": "^2.4.2"
  4075 + },
  4076 + "peerDependenciesMeta": {
  4077 + "@types/node": {
  4078 + "optional": true
  4079 + },
  4080 + "@vitejs/devtools": {
  4081 + "optional": true
  4082 + },
  4083 + "esbuild": {
  4084 + "optional": true
  4085 + },
  4086 + "jiti": {
  4087 + "optional": true
  4088 + },
  4089 + "less": {
  4090 + "optional": true
  4091 + },
  4092 + "sass": {
  4093 + "optional": true
  4094 + },
  4095 + "sass-embedded": {
  4096 + "optional": true
  4097 + },
  4098 + "stylus": {
  4099 + "optional": true
  4100 + },
  4101 + "sugarss": {
  4102 + "optional": true
  4103 + },
  4104 + "terser": {
  4105 + "optional": true
  4106 + },
  4107 + "tsx": {
  4108 + "optional": true
  4109 + },
  4110 + "yaml": {
  4111 + "optional": true
  4112 + }
  4113 + }
  4114 + },
  4115 + "node_modules/which": {
  4116 + "version": "2.0.2",
  4117 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
  4118 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
  4119 + "dev": true,
  4120 + "license": "ISC",
  4121 + "dependencies": {
  4122 + "isexe": "^2.0.0"
  4123 + },
  4124 + "bin": {
  4125 + "node-which": "bin/node-which"
  4126 + },
  4127 + "engines": {
  4128 + "node": ">= 8"
  4129 + }
  4130 + },
  4131 + "node_modules/word-wrap": {
  4132 + "version": "1.2.5",
  4133 + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
  4134 + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
  4135 + "dev": true,
  4136 + "license": "MIT",
  4137 + "engines": {
  4138 + "node": ">=0.10.0"
  4139 + }
  4140 + },
  4141 + "node_modules/yallist": {
  4142 + "version": "3.1.1",
  4143 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
  4144 + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
  4145 + "dev": true,
  4146 + "license": "ISC"
  4147 + },
  4148 + "node_modules/yocto-queue": {
  4149 + "version": "0.1.0",
  4150 + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
  4151 + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
  4152 + "dev": true,
  4153 + "license": "MIT",
  4154 + "engines": {
  4155 + "node": ">=10"
  4156 + },
  4157 + "funding": {
  4158 + "url": "https://github.com/sponsors/sindresorhus"
  4159 + }
  4160 + },
  4161 + "node_modules/zod": {
  4162 + "version": "4.4.3",
  4163 + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz",
  4164 + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==",
  4165 + "dev": true,
  4166 + "license": "MIT",
  4167 + "funding": {
  4168 + "url": "https://github.com/sponsors/colinhacks"
  4169 + }
  4170 + },
  4171 + "node_modules/zod-validation-error": {
  4172 + "version": "4.0.2",
  4173 + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz",
  4174 + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==",
  4175 + "dev": true,
  4176 + "license": "MIT",
  4177 + "engines": {
  4178 + "node": ">=18.0.0"
  4179 + },
  4180 + "peerDependencies": {
  4181 + "zod": "^3.25.0 || ^4.0.0"
  4182 + }
  4183 + }
  4184 + }
  4185 +}
... ...
frontend/package.json 0 → 100644
  1 +{
  2 + "name": "frontend",
  3 + "private": true,
  4 + "version": "0.0.0",
  5 + "type": "module",
  6 + "scripts": {
  7 + "dev": "vite",
  8 + "build": "tsc -b && vite build",
  9 + "lint": "eslint .",
  10 + "preview": "vite preview"
  11 + },
  12 + "dependencies": {
  13 + "@reduxjs/toolkit": "^2.11.2",
  14 + "antd": "^6.3.7",
  15 + "axios": "^1.16.0",
  16 + "react": "^19.2.5",
  17 + "react-dom": "^19.2.5",
  18 + "react-redux": "^9.2.0",
  19 + "react-router-dom": "^7.15.0"
  20 + },
  21 + "devDependencies": {
  22 + "@eslint/js": "^10.0.1",
  23 + "@types/node": "^24.12.2",
  24 + "@types/react": "^19.2.14",
  25 + "@types/react-dom": "^19.2.3",
  26 + "@vitejs/plugin-react": "^6.0.1",
  27 + "eslint": "^10.2.1",
  28 + "eslint-plugin-react-hooks": "^7.1.1",
  29 + "eslint-plugin-react-refresh": "^0.5.2",
  30 + "globals": "^17.5.0",
  31 + "typescript": "~6.0.2",
  32 + "typescript-eslint": "^8.58.2",
  33 + "vite": "^8.0.10"
  34 + }
  35 +}
... ...
frontend/public/favicon.svg 0 → 100644
  1 +<svg xmlns="http://www.w3.org/2000/svg" width="48" height="46" fill="none" viewBox="0 0 48 46"><path fill="#863bff" d="M25.946 44.938c-.664.845-2.021.375-2.021-.698V33.937a2.26 2.26 0 0 0-2.262-2.262H10.287c-.92 0-1.456-1.04-.92-1.788l7.48-10.471c1.07-1.497 0-3.578-1.842-3.578H1.237c-.92 0-1.456-1.04-.92-1.788L10.013.474c.214-.297.556-.474.92-.474h28.894c.92 0 1.456 1.04.92 1.788l-7.48 10.471c-1.07 1.498 0 3.579 1.842 3.579h11.377c.943 0 1.473 1.088.89 1.83L25.947 44.94z" style="fill:#863bff;fill:color(display-p3 .5252 .23 1);fill-opacity:1"/><mask id="a" width="48" height="46" x="0" y="0" maskUnits="userSpaceOnUse" style="mask-type:alpha"><path fill="#000" d="M25.842 44.938c-.664.844-2.021.375-2.021-.698V33.937a2.26 2.26 0 0 0-2.262-2.262H10.183c-.92 0-1.456-1.04-.92-1.788l7.48-10.471c1.07-1.498 0-3.579-1.842-3.579H1.133c-.92 0-1.456-1.04-.92-1.787L9.91.473c.214-.297.556-.474.92-.474h28.894c.92 0 1.456 1.04.92 1.788l-7.48 10.471c-1.07 1.498 0 3.578 1.842 3.578h11.377c.943 0 1.473 1.088.89 1.832L25.843 44.94z" style="fill:#000;fill-opacity:1"/></mask><g mask="url(#a)"><g filter="url(#b)"><ellipse cx="5.508" cy="14.704" fill="#ede6ff" rx="5.508" ry="14.704" style="fill:#ede6ff;fill:color(display-p3 .9275 .9033 1);fill-opacity:1" transform="matrix(.00324 1 1 -.00324 -4.47 31.516)"/></g><g filter="url(#c)"><ellipse cx="10.399" cy="29.851" fill="#ede6ff" rx="10.399" ry="29.851" style="fill:#ede6ff;fill:color(display-p3 .9275 .9033 1);fill-opacity:1" transform="matrix(.00324 1 1 -.00324 -39.328 7.883)"/></g><g filter="url(#d)"><ellipse cx="5.508" cy="30.487" fill="#7e14ff" rx="5.508" ry="30.487" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.814 -25.913 -14.639)scale(1 -1)"/></g><g filter="url(#e)"><ellipse cx="5.508" cy="30.599" fill="#7e14ff" rx="5.508" ry="30.599" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.814 -32.644 -3.334)scale(1 -1)"/></g><g filter="url(#f)"><ellipse cx="5.508" cy="30.599" fill="#7e14ff" rx="5.508" ry="30.599" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="matrix(.00324 1 1 -.00324 -34.34 30.47)"/></g><g filter="url(#g)"><ellipse cx="14.072" cy="22.078" fill="#ede6ff" rx="14.072" ry="22.078" style="fill:#ede6ff;fill:color(display-p3 .9275 .9033 1);fill-opacity:1" transform="rotate(93.35 24.506 48.493)scale(-1 1)"/></g><g filter="url(#h)"><ellipse cx="3.47" cy="21.501" fill="#7e14ff" rx="3.47" ry="21.501" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.009 28.708 47.59)scale(-1 1)"/></g><g filter="url(#i)"><ellipse cx="3.47" cy="21.501" fill="#7e14ff" rx="3.47" ry="21.501" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.009 28.708 47.59)scale(-1 1)"/></g><g filter="url(#j)"><ellipse cx=".387" cy="8.972" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(39.51 .387 8.972)"/></g><g filter="url(#k)"><ellipse cx="47.523" cy="-6.092" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 47.523 -6.092)"/></g><g filter="url(#l)"><ellipse cx="41.412" cy="6.333" fill="#47bfff" rx="5.971" ry="9.665" style="fill:#47bfff;fill:color(display-p3 .2799 .748 1);fill-opacity:1" transform="rotate(37.892 41.412 6.333)"/></g><g filter="url(#m)"><ellipse cx="-1.879" cy="38.332" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 -1.88 38.332)"/></g><g filter="url(#n)"><ellipse cx="-1.879" cy="38.332" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 -1.88 38.332)"/></g><g filter="url(#o)"><ellipse cx="35.651" cy="29.907" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 35.651 29.907)"/></g><g filter="url(#p)"><ellipse cx="38.418" cy="32.4" fill="#47bfff" rx="5.971" ry="15.297" style="fill:#47bfff;fill:color(display-p3 .2799 .748 1);fill-opacity:1" transform="rotate(37.892 38.418 32.4)"/></g></g><defs><filter id="b" width="60.045" height="41.654" x="-19.77" y="16.149" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="7.659"/></filter><filter id="c" width="90.34" height="51.437" x="-54.613" y="-7.533" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="7.659"/></filter><filter id="d" width="79.355" height="29.4" x="-49.64" y="2.03" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="e" width="79.579" height="29.4" x="-45.045" y="20.029" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="f" width="79.579" height="29.4" x="-43.513" y="21.178" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="g" width="74.749" height="58.852" x="15.756" y="-17.901" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="7.659"/></filter><filter id="h" width="61.377" height="25.362" x="23.548" y="2.284" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="i" width="61.377" height="25.362" x="23.548" y="2.284" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="j" width="56.045" height="63.649" x="-27.636" y="-22.853" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="k" width="54.814" height="64.646" x="20.116" y="-38.415" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="l" width="33.541" height="35.313" x="24.641" y="-11.323" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="m" width="54.814" height="64.646" x="-29.286" y="6.009" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="n" width="54.814" height="64.646" x="-29.286" y="6.009" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="o" width="54.814" height="64.646" x="8.244" y="-2.416" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="p" width="39.409" height="43.623" x="18.713" y="10.588" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter></defs></svg>
0 2 \ No newline at end of file
... ...
frontend/public/icons.svg 0 → 100644
  1 +<svg xmlns="http://www.w3.org/2000/svg">
  2 + <symbol id="bluesky-icon" viewBox="0 0 16 17">
  3 + <g clip-path="url(#bluesky-clip)"><path fill="#08060d" d="M7.75 7.735c-.693-1.348-2.58-3.86-4.334-5.097-1.68-1.187-2.32-.981-2.74-.79C.188 2.065.1 2.812.1 3.251s.241 3.602.398 4.13c.52 1.744 2.367 2.333 4.07 2.145-2.495.37-4.71 1.278-1.805 4.512 3.196 3.309 4.38-.71 4.987-2.746.608 2.036 1.307 5.91 4.93 2.746 2.72-2.746.747-4.143-1.747-4.512 1.702.189 3.55-.4 4.07-2.145.156-.528.397-3.691.397-4.13s-.088-1.186-.575-1.406c-.42-.19-1.06-.395-2.741.79-1.755 1.24-3.64 3.752-4.334 5.099"/></g>
  4 + <defs><clipPath id="bluesky-clip"><path fill="#fff" d="M.1.85h15.3v15.3H.1z"/></clipPath></defs>
  5 + </symbol>
  6 + <symbol id="discord-icon" viewBox="0 0 20 19">
  7 + <path fill="#08060d" d="M16.224 3.768a14.5 14.5 0 0 0-3.67-1.153c-.158.286-.343.67-.47.976a13.5 13.5 0 0 0-4.067 0c-.128-.306-.317-.69-.476-.976A14.4 14.4 0 0 0 3.868 3.77C1.546 7.28.916 10.703 1.231 14.077a14.7 14.7 0 0 0 4.5 2.306q.545-.748.965-1.587a9.5 9.5 0 0 1-1.518-.74q.191-.14.372-.293c2.927 1.369 6.107 1.369 8.999 0q.183.152.372.294-.723.437-1.52.74.418.838.963 1.588a14.6 14.6 0 0 0 4.504-2.308c.37-3.911-.63-7.302-2.644-10.309m-9.13 8.234c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.894 0 1.614.82 1.599 1.82.001 1-.705 1.82-1.6 1.82m5.91 0c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.893 0 1.614.82 1.599 1.82 0 1-.706 1.82-1.6 1.82"/>
  8 + </symbol>
  9 + <symbol id="documentation-icon" viewBox="0 0 21 20">
  10 + <path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="m15.5 13.333 1.533 1.322c.645.555.967.833.967 1.178s-.322.623-.967 1.179L15.5 18.333m-3.333-5-1.534 1.322c-.644.555-.966.833-.966 1.178s.322.623.966 1.179l1.534 1.321"/>
  11 + <path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M17.167 10.836v-4.32c0-1.41 0-2.117-.224-2.68-.359-.906-1.118-1.621-2.08-1.96-.599-.21-1.349-.21-2.848-.21-2.623 0-3.935 0-4.983.369-1.684.591-3.013 1.842-3.641 3.428C3 6.449 3 7.684 3 10.154v2.122c0 2.558 0 3.838.706 4.726q.306.383.713.671c.76.536 1.79.64 3.581.66"/>
  12 + <path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M3 10a2.78 2.78 0 0 1 2.778-2.778c.555 0 1.209.097 1.748-.047.48-.129.854-.503.982-.982.145-.54.048-1.194.048-1.749a2.78 2.78 0 0 1 2.777-2.777"/>
  13 + </symbol>
  14 + <symbol id="github-icon" viewBox="0 0 19 19">
  15 + <path fill="#08060d" fill-rule="evenodd" d="M9.356 1.85C5.05 1.85 1.57 5.356 1.57 9.694a7.84 7.84 0 0 0 5.324 7.44c.387.079.528-.168.528-.376 0-.182-.013-.805-.013-1.454-2.165.467-2.616-.935-2.616-.935-.349-.91-.864-1.143-.864-1.143-.71-.48.051-.48.051-.48.787.051 1.2.805 1.2.805.695 1.194 1.817.857 2.268.649.064-.507.27-.857.49-1.052-1.728-.182-3.545-.857-3.545-3.87 0-.857.31-1.558.8-2.104-.078-.195-.349-1 .077-2.078 0 0 .657-.208 2.14.805a7.5 7.5 0 0 1 1.946-.26c.657 0 1.328.092 1.946.26 1.483-1.013 2.14-.805 2.14-.805.426 1.078.155 1.883.078 2.078.502.546.799 1.247.799 2.104 0 3.013-1.818 3.675-3.558 3.87.284.247.528.714.528 1.454 0 1.052-.012 1.896-.012 2.156 0 .208.142.455.528.377a7.84 7.84 0 0 0 5.324-7.441c.013-4.338-3.48-7.844-7.773-7.844" clip-rule="evenodd"/>
  16 + </symbol>
  17 + <symbol id="social-icon" viewBox="0 0 20 20">
  18 + <path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M12.5 6.667a4.167 4.167 0 1 0-8.334 0 4.167 4.167 0 0 0 8.334 0"/>
  19 + <path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M2.5 16.667a5.833 5.833 0 0 1 8.75-5.053m3.837.474.513 1.035c.07.144.257.282.414.309l.93.155c.596.1.736.536.307.965l-.723.73a.64.64 0 0 0-.152.531l.207.903c.164.715-.213.991-.84.618l-.872-.52a.63.63 0 0 0-.577 0l-.872.52c-.624.373-1.003.094-.84-.618l.207-.903a.64.64 0 0 0-.152-.532l-.723-.729c-.426-.43-.289-.864.306-.964l.93-.156a.64.64 0 0 0 .412-.31l.513-1.034c.28-.562.735-.562 1.012 0"/>
  20 + </symbol>
  21 + <symbol id="x-icon" viewBox="0 0 19 19">
  22 + <path fill="#08060d" fill-rule="evenodd" d="M1.893 1.98c.052.072 1.245 1.769 2.653 3.77l2.892 4.114c.183.261.333.48.333.486s-.068.089-.152.183l-.522.593-.765.867-3.597 4.087c-.375.426-.734.834-.798.905a1 1 0 0 0-.118.148c0 .01.236.017.664.017h.663l.729-.83c.4-.457.796-.906.879-.999a692 692 0 0 0 1.794-2.038c.034-.037.301-.34.594-.675l.551-.624.345-.392a7 7 0 0 1 .34-.374c.006 0 .93 1.306 2.052 2.903l2.084 2.965.045.063h2.275c1.87 0 2.273-.003 2.266-.021-.008-.02-1.098-1.572-3.894-5.547-2.013-2.862-2.28-3.246-2.273-3.266.008-.019.282-.332 2.085-2.38l2-2.274 1.567-1.782c.022-.028-.016-.03-.65-.03h-.674l-.3.342a871 871 0 0 1-1.782 2.025c-.067.075-.405.458-.75.852a100 100 0 0 1-.803.91c-.148.172-.299.344-.99 1.127-.304.343-.32.358-.345.327-.015-.019-.904-1.282-1.976-2.808L6.365 1.85H1.8zm1.782.91 8.078 11.294c.772 1.08 1.413 1.973 1.425 1.984.016.017.241.02 1.05.017l1.03-.004-2.694-3.766L7.796 5.75 5.722 2.852l-1.039-.004-1.039-.004z" clip-rule="evenodd"/>
  23 + </symbol>
  24 +</svg>
... ...
frontend/src/api/request.ts 0 → 100644
  1 +import axios, { type AxiosError, type AxiosResponse, type InternalAxiosRequestConfig } from 'axios'
  2 +import type { ApiResponse } from './types'
  3 +
  4 +export const TOKEN_KEY = 'erp.accessToken'
  5 +
  6 +const instance = axios.create({
  7 + baseURL: '/api',
  8 + timeout: 15000,
  9 +})
  10 +
  11 +instance.interceptors.request.use((cfg: InternalAxiosRequestConfig) => {
  12 + const token = sessionStorage.getItem(TOKEN_KEY)
  13 + if (token) cfg.headers.set('Authorization', `Bearer ${token}`)
  14 + return cfg
  15 +})
  16 +
  17 +let onUnauthorized: (() => void) | null = null
  18 +export function setUnauthorizedHandler(fn: () => void) {
  19 + onUnauthorized = fn
  20 +}
  21 +
  22 +instance.interceptors.response.use(
  23 + (res: AxiosResponse<ApiResponse<unknown>>) => res,
  24 + (err: AxiosError) => {
  25 + if (err.response?.status === 401) onUnauthorized?.()
  26 + return Promise.reject(err)
  27 + },
  28 +)
  29 +
  30 +/** Throws BizError when code !== 200; returns data on success. */
  31 +export class BizError extends Error {
  32 + code: number
  33 + payload: unknown
  34 + constructor(code: number, message: string, payload: unknown) {
  35 + super(message)
  36 + this.code = code
  37 + this.payload = payload
  38 + }
  39 +}
  40 +
  41 +export async function call<T>(req: () => Promise<AxiosResponse<ApiResponse<T>>>): Promise<T> {
  42 + const res = await req()
  43 + const body = res.data
  44 + if (body.code !== 200) {
  45 + throw new BizError(body.code, body.message, body.data)
  46 + }
  47 + return body.data
  48 +}
  49 +
  50 +export default instance
... ...
frontend/src/api/types.ts 0 → 100644
  1 +export interface ApiResponse<T> {
  2 + code: number
  3 + message: string
  4 + data: T
  5 + timestamp: number
  6 +}
  7 +
  8 +export interface UserInfo {
  9 + iIncrement: number
  10 + sUserNo: string
  11 + sUserName: string
  12 + sUserType: string
  13 + sLanguage: string
  14 +}
  15 +
  16 +export interface LoginRequest {
  17 + sUserName: string
  18 + sPassword: string
  19 + sVersion: 'standard'
  20 +}
  21 +
  22 +export interface LoginResponse {
  23 + accessToken: string
  24 + expiresIn: number
  25 + user: UserInfo
  26 +}
  27 +
  28 +export interface UserListItem {
  29 + iIncrement: number
  30 + sUserName: string
  31 + sStaffName: string | null
  32 + sUserNo: string
  33 + sDepartment: string | null
  34 + sUserType: string
  35 + sLanguage: string
  36 + bDeleted: boolean
  37 + tLastLoginDate: string | null
  38 + sCreatedBy: string | null
  39 + tCreateDate: string | null
  40 +}
  41 +
  42 +export interface UserListPage {
  43 + total: number
  44 + list: UserListItem[]
  45 + pageNum: number
  46 + pageSize: number
  47 +}
  48 +
  49 +export type QueryField = 'username' | 'userno' | 'staff' | 'department' | 'usertype' | 'language' | 'deleted'
  50 +export type MatchType = 'contains' | 'equals' | 'startsWith' | 'endsWith'
  51 +
  52 +export interface UserQuery {
  53 + pageNum: number
  54 + pageSize: number
  55 + queryField?: QueryField
  56 + matchType?: MatchType
  57 + queryValue?: string
  58 +}
  59 +
  60 +export interface UserCreate {
  61 + sUserNo: string
  62 + sUserName: string
  63 + iStaffId?: number | null
  64 + sUserType: string
  65 + sLanguage: string
  66 + bCanModifyDocs?: boolean
  67 + permissionCategoryIds?: number[]
  68 +}
  69 +
  70 +export interface UserUpdate {
  71 + iStaffId?: number | null
  72 + sUserType: string
  73 + sLanguage: string
  74 + bCanModifyDocs?: boolean
  75 + permissionCategoryIds?: number[]
  76 +}
  77 +
  78 +export interface ErrorPayload {
  79 + cooldownSeconds?: number
  80 + [key: string]: unknown
  81 +}
... ...
frontend/src/api/usr.ts 0 → 100644
  1 +import http, { call } from './request'
  2 +import type { ApiResponse, LoginRequest, LoginResponse, UserCreate, UserListItem, UserListPage, UserQuery, UserUpdate } from './types'
  3 +
  4 +export function login(req: LoginRequest) {
  5 + return call<LoginResponse>(() => http.post<ApiResponse<LoginResponse>>('/auth/login', req))
  6 +}
  7 +
  8 +export function listUsers(q: UserQuery) {
  9 + return call<UserListPage>(() =>
  10 + http.get<ApiResponse<UserListPage>>('/users', { params: q }),
  11 + )
  12 +}
  13 +
  14 +export function createUser(body: UserCreate) {
  15 + return call<UserListItem>(() => http.post<ApiResponse<UserListItem>>('/users', body))
  16 +}
  17 +
  18 +export function updateUser(id: number, body: UserUpdate) {
  19 + return call<UserListItem>(() => http.put<ApiResponse<UserListItem>>(`/users/${id}`, body))
  20 +}
... ...
frontend/src/assets/hero.png 0 → 100644

12.8 KB

frontend/src/assets/vite.svg 0 → 100644
  1 +<svg xmlns="http://www.w3.org/2000/svg" width="77" height="47" fill="none" aria-labelledby="vite-logo-title" viewBox="0 0 77 47"><title id="vite-logo-title">Vite</title><style>.parenthesis{fill:#000}@media (prefers-color-scheme:dark){.parenthesis{fill:#fff}}</style><path fill="#9135ff" d="M40.151 45.71c-.663.844-2.02.374-2.02-.699V34.708a2.26 2.26 0 0 0-2.262-2.262H24.493c-.92 0-1.457-1.04-.92-1.788l7.479-10.471c1.07-1.498 0-3.578-1.842-3.578H15.443c-.92 0-1.456-1.04-.92-1.788l9.696-13.576c.213-.297.556-.474.92-.474h28.894c.92 0 1.456 1.04.92 1.788l-7.48 10.472c-1.07 1.497 0 3.578 1.842 3.578h11.376c.944 0 1.474 1.087.89 1.83L40.153 45.712z"/><mask id="a" width="48" height="47" x="14" y="0" maskUnits="userSpaceOnUse" style="mask-type:alpha"><path fill="#000" d="M40.047 45.71c-.663.843-2.02.374-2.02-.699V34.708a2.26 2.26 0 0 0-2.262-2.262H24.389c-.92 0-1.457-1.04-.92-1.788l7.479-10.472c1.07-1.497 0-3.578-1.842-3.578H15.34c-.92 0-1.456-1.04-.92-1.788l9.696-13.575c.213-.297.556-.474.92-.474H53.93c.92 0 1.456 1.04.92 1.788L47.37 13.03c-1.07 1.498 0 3.578 1.842 3.578h11.376c.944 0 1.474 1.088.89 1.831L40.049 45.712z"/></mask><g mask="url(#a)"><g filter="url(#b)"><ellipse cx="5.508" cy="14.704" fill="#eee6ff" rx="5.508" ry="14.704" transform="rotate(269.814 20.96 11.29)scale(-1 1)"/></g><g filter="url(#c)"><ellipse cx="10.399" cy="29.851" fill="#eee6ff" rx="10.399" ry="29.851" transform="rotate(89.814 -16.902 -8.275)scale(1 -1)"/></g><g filter="url(#d)"><ellipse cx="5.508" cy="30.487" fill="#8900ff" rx="5.508" ry="30.487" transform="rotate(89.814 -19.197 -7.127)scale(1 -1)"/></g><g filter="url(#e)"><ellipse cx="5.508" cy="30.599" fill="#8900ff" rx="5.508" ry="30.599" transform="rotate(89.814 -25.928 4.177)scale(1 -1)"/></g><g filter="url(#f)"><ellipse cx="5.508" cy="30.599" fill="#8900ff" rx="5.508" ry="30.599" transform="rotate(89.814 -25.738 5.52)scale(1 -1)"/></g><g filter="url(#g)"><ellipse cx="14.072" cy="22.078" fill="#eee6ff" rx="14.072" ry="22.078" transform="rotate(93.35 31.245 55.578)scale(-1 1)"/></g><g filter="url(#h)"><ellipse cx="3.47" cy="21.501" fill="#8900ff" rx="3.47" ry="21.501" transform="rotate(89.009 35.419 55.202)scale(-1 1)"/></g><g filter="url(#i)"><ellipse cx="3.47" cy="21.501" fill="#8900ff" rx="3.47" ry="21.501" transform="rotate(89.009 35.419 55.202)scale(-1 1)"/></g><g filter="url(#j)"><ellipse cx="14.592" cy="9.743" fill="#8900ff" rx="4.407" ry="29.108" transform="rotate(39.51 14.592 9.743)"/></g><g filter="url(#k)"><ellipse cx="61.728" cy="-5.321" fill="#8900ff" rx="4.407" ry="29.108" transform="rotate(37.892 61.728 -5.32)"/></g><g filter="url(#l)"><ellipse cx="55.618" cy="7.104" fill="#00c2ff" rx="5.971" ry="9.665" transform="rotate(37.892 55.618 7.104)"/></g><g filter="url(#m)"><ellipse cx="12.326" cy="39.103" fill="#8900ff" rx="4.407" ry="29.108" transform="rotate(37.892 12.326 39.103)"/></g><g filter="url(#n)"><ellipse cx="12.326" cy="39.103" fill="#8900ff" rx="4.407" ry="29.108" transform="rotate(37.892 12.326 39.103)"/></g><g filter="url(#o)"><ellipse cx="49.857" cy="30.678" fill="#8900ff" rx="4.407" ry="29.108" transform="rotate(37.892 49.857 30.678)"/></g><g filter="url(#p)"><ellipse cx="52.623" cy="33.171" fill="#00c2ff" rx="5.971" ry="15.297" transform="rotate(37.892 52.623 33.17)"/></g></g><path d="M6.919 0c-9.198 13.166-9.252 33.575 0 46.789h6.215c-9.25-13.214-9.196-33.623 0-46.789zm62.424 0h-6.215c9.198 13.166 9.252 33.575 0 46.789h6.215c9.25-13.214 9.196-33.623 0-46.789" class="parenthesis"/><defs><filter id="b" width="60.045" height="41.654" x="-5.564" y="16.92" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="7.659"/></filter><filter id="c" width="90.34" height="51.437" x="-40.407" y="-6.762" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="7.659"/></filter><filter id="d" width="79.355" height="29.4" x="-35.435" y="2.801" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="e" width="79.579" height="29.4" x="-30.84" y="20.8" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="f" width="79.579" height="29.4" x="-29.307" y="21.949" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="g" width="74.749" height="58.852" x="29.961" y="-17.13" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="7.659"/></filter><filter id="h" width="61.377" height="25.362" x="37.754" y="3.055" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="i" width="61.377" height="25.362" x="37.754" y="3.055" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="j" width="56.045" height="63.649" x="-13.43" y="-22.082" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="k" width="54.814" height="64.646" x="34.321" y="-37.644" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="l" width="33.541" height="35.313" x="38.847" y="-10.552" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="m" width="54.814" height="64.646" x="-15.081" y="6.78" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="n" width="54.814" height="64.646" x="-15.081" y="6.78" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="o" width="54.814" height="64.646" x="22.45" y="-1.645" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="p" width="39.409" height="43.623" x="32.919" y="11.36" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter></defs></svg>
... ...
frontend/src/components/NavOverlay.tsx 0 → 100644
  1 +import { useNavigate } from 'react-router-dom'
  2 +import { message } from 'antd'
  3 +import { useAppDispatch } from '@/store'
  4 +import { openTab } from '@/store/tabs'
  5 +
  6 +const navSide = [
  7 + { ico: 'sales', label: '销售管理' }, { ico: 'dcs', label: 'DCS系统' }, { ico: 'prod', label: '产品管理' },
  8 + { ico: 'ops', label: '生产运营' }, { ico: 'exec', label: '生产执行' }, { ico: 'mold', label: '模具管理' },
  9 + { ico: 'cart', label: '采购管理' }, { ico: 'mat', label: '材料库存' }, { ico: 'fg', label: '成品库存' },
  10 + { ico: 'out', label: '外协管理' }, { ico: 'logi', label: '物流管理' }, { ico: 'qa', label: '质量管理' },
  11 + { ico: 'fin', label: '财务管理' }, { ico: 'cost1', label: '成本管理(专)' }, { ico: 'cost2', label: '成本管理' },
  12 + { ico: 'eq', label: '设备管理' }, { ico: 'hr', label: '人事行政' }, { ico: 'oa', label: 'OA系统' },
  13 + { ico: 'base', label: '基础设置' }, { ico: 'sys', label: '系统设置', active: true },
  14 +]
  15 +
  16 +const sideIco: Record<string, string> = {
  17 + sales: 'M3 7l3 10h12l3-10M5 7l1-3h12l1 3M9 21a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm8 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2z',
  18 + dcs: 'M12 2l9 5-9 5-9-5z M3 12l9 5 9-5 M3 17l9 5 9-5',
  19 + prod: 'M3 7l9-5 9 5v10l-9 5-9-5z',
  20 + ops: 'M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4zM14 14h6v6h-6z',
  21 + exec: 'M5 4h14v16H5z M5 9h14 M9 4v5',
  22 + mold: 'M4 7h16v10H4z M8 7v10 M16 7v10',
  23 + cart: 'M5 5h2l3 11h10l2-8H8 M9 20a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm9 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2z',
  24 + mat: 'M4 21V8l8-5 8 5v13z M9 21v-7h6v7',
  25 + fg: 'M3 21V9l9-6 9 6v12z',
  26 + out: 'M12 12c2 0 4-1 4-4s-2-4-4-4-4 1-4 4 2 4 4 4z M4 21c0-4 4-7 8-7s8 3 8 7',
  27 + logi: 'M3 7h11v9H3z M14 10h5l3 3v3h-8z M7 19a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm10 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2z',
  28 + qa: 'M12 2l8 4v6c0 5-4 8-8 10-4-2-8-5-8-10V6z M9 12l2 2 4-4',
  29 + fin: 'M12 2v20 M7 6h10 M7 10h10',
  30 + cost1: 'M4 20V8 M9 20V4 M14 20v-8 M19 20v-6 M2 20h20',
  31 + cost2: 'M4 20V8 M9 20V4 M14 20v-8 M19 20v-6 M2 20h20',
  32 + eq: 'M12 8a4 4 0 1 1 0 8 4 4 0 0 1 0-8z M19 12a7 7 0 0 0-.5-2.5l1.5-1.5-2-2-1.5 1.5A7 7 0 0 0 14 7l-.5-2h-3l-.5 2A7 7 0 0 0 7.5 7.5L6 6 4 8l1.5 1.5A7 7 0 0 0 5 12',
  33 + hr: 'M9 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8z M2 21c0-4 3-7 7-7s7 3 7 7 M17 11a3 3 0 1 0 0-6 3 3 0 0 0 0 6z M22 21c0-3-2-5-5-5',
  34 + oa: 'M3 7h18v12H3z M3 11h18 M8 7V4h8v3',
  35 + base: 'M4 6h16 M4 12h16 M4 18h16 M8 6v12 M14 6v12',
  36 + sys: 'M12 8a4 4 0 1 1 0 8 4 4 0 0 1 0-8z M19 12a7 7 0 0 0-.5-2.5l1.5-1.5-2-2-1.5 1.5A7 7 0 0 0 14 7l-.5-2h-3l-.5 2A7 7 0 0 0 7.5 7.5L6 6 4 8l1.5 1.5A7 7 0 0 0 5 12',
  37 +}
  38 +
  39 +interface NavLink {
  40 + label: string
  41 + star?: boolean
  42 + go?: 'userlist'
  43 +}
  44 +
  45 +const navCols: { title: string; items: (string | NavLink)[] }[] = [
  46 + { title: '期初设置', items: ['客户期初', '供应商期初', '材料期初', '产品期初', '数据导入', '离线导出下载'] },
  47 + { title: '用户管理', items: [{ label: '用户列表', star: true, go: 'userlist' }, '系统权限', '系统权限稽查表', '权限组'] },
  48 + { title: '系统参数', items: ['系统参数', '财务结账', '系统常量配置'] },
  49 + { title: '计算方案', items: ['方案列表', '计算参数'] },
  50 + { title: '日志', items: ['个性化模块', '操作日志', '异常清除KPI任务表', 'MYSQL监听器'] },
  51 + { title: '开发平台', items: ['自定义开发范例', { label: '系统功能模块设置', star: true }, 'EBC流程清单', '功能模块界面设置', '增删改存业务处理'] },
  52 + { title: 'API对接管理', items: ['调用第三方接口(TOKEN配置)', '调用第三方接口(接口定义)', '被第三方调用(生成token)', '数据同步', '被第三方调用(API定义)'] },
  53 +]
  54 +
  55 +interface Props {
  56 + onClose: () => void
  57 +}
  58 +
  59 +export default function NavOverlay({ onClose }: Props) {
  60 + const navigate = useNavigate()
  61 + const dispatch = useAppDispatch()
  62 +
  63 + const handleClick = (it: string | NavLink) => {
  64 + if (typeof it !== 'string' && it.go === 'userlist') {
  65 + dispatch(openTab({ key: 'userlist', title: '用户列表', path: '/users' }))
  66 + navigate('/users')
  67 + onClose()
  68 + } else {
  69 + const label = typeof it === 'string' ? it : it.label
  70 + message.info(`${label} - 未实现`)
  71 + }
  72 + }
  73 +
  74 + return (
  75 + <div className="nav-overlay">
  76 + <div className="side">
  77 + {navSide.map(s => (
  78 + <div key={s.label} className={`si ${s.active ? 'active' : ''}`}>
  79 + <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth={1.6}>
  80 + <path d={sideIco[s.ico] || ''} />
  81 + </svg>
  82 + {s.label}
  83 + </div>
  84 + ))}
  85 + </div>
  86 + <div className="grid">
  87 + {navCols.map(c => (
  88 + <div key={c.title} className="col">
  89 + <h3>{c.title}</h3>
  90 + {c.items.map((it, i) => {
  91 + const label = typeof it === 'string' ? it : it.label
  92 + const star = typeof it !== 'string' && it.star
  93 + return (
  94 + <a key={i} onClick={() => handleClick(it)}>
  95 + {label}
  96 + {star && <span className="star">★</span>}
  97 + </a>
  98 + )
  99 + })}
  100 + </div>
  101 + ))}
  102 + </div>
  103 + </div>
  104 + )
  105 +}
... ...
frontend/src/components/TopBar.tsx 0 → 100644
  1 +import { useLocation, useNavigate } from 'react-router-dom'
  2 +import { useAppDispatch, useAppSelector } from '@/store'
  3 +import { closeTab, type TabItem } from '@/store/tabs'
  4 +import { loggedOut } from '@/store/auth'
  5 +import { IconAntler, IconBell, IconHome, IconMenu, IconSearch, IconUser } from './icons'
  6 +
  7 +interface Props {
  8 + navOpen: boolean
  9 + onToggleNav: () => void
  10 +}
  11 +
  12 +export default function TopBar({ navOpen, onToggleNav }: Props) {
  13 + const navigate = useNavigate()
  14 + const location = useLocation()
  15 + const dispatch = useAppDispatch()
  16 + const tabs = useAppSelector(s => s.tabs.items)
  17 + const user = useAppSelector(s => s.auth.user)
  18 +
  19 + const isHome = location.pathname === '/'
  20 +
  21 + const handleTabClick = (t: TabItem) => navigate(t.path)
  22 + const handleClose = (e: React.MouseEvent, t: TabItem) => {
  23 + e.stopPropagation()
  24 + const idx = tabs.findIndex(x => x.key === t.key)
  25 + dispatch(closeTab(t.key))
  26 + if (location.pathname === t.path) {
  27 + const next = tabs[idx + 1] || tabs[idx - 1]
  28 + navigate(next ? next.path : '/')
  29 + }
  30 + }
  31 +
  32 + const handleLogout = () => {
  33 + dispatch(loggedOut())
  34 + navigate('/login', { replace: true })
  35 + }
  36 +
  37 + return (
  38 + <div className="topbar">
  39 + <div className="logo" title="主页" onClick={() => navigate('/')}>
  40 + <IconAntler />
  41 + </div>
  42 + <div className="tabs">
  43 + <button className={`nav-btn ${navOpen ? 'active' : ''}`} onClick={onToggleNav}>
  44 + <IconMenu />
  45 + 全部导航
  46 + </button>
  47 + <div className={`tab ${isHome ? 'active' : ''}`} onClick={() => navigate('/')}>
  48 + <span className="ic"><IconHome /></span>
  49 + 主页
  50 + </div>
  51 + {tabs.map(t => (
  52 + <div
  53 + key={t.key}
  54 + className={`tab ${location.pathname === t.path ? 'active' : ''}`}
  55 + onClick={() => handleTabClick(t)}
  56 + >
  57 + {t.title}
  58 + <span className="close" onClick={e => handleClose(e, t)}>✕</span>
  59 + </div>
  60 + ))}
  61 + </div>
  62 + <div className="right">
  63 + <span className="ic" title="搜索"><IconSearch /></span>
  64 + <span className="ic" title="通知"><IconBell /></span>
  65 + <div className="user" onClick={handleLogout} title="点击退出登录">
  66 + <span className="ic"><IconUser /></span>
  67 + {user ? `${user.sUserName}(${user.sUserType})` : '未登录'}
  68 + <span style={{ fontSize: 10 }}>▾</span>
  69 + </div>
  70 + <span className="more">⋯</span>
  71 + </div>
  72 + </div>
  73 + )
  74 +}
... ...
frontend/src/components/icons.tsx 0 → 100644
  1 +import type { SVGProps } from 'react'
  2 +
  3 +const stroke: SVGProps<SVGSVGElement> = {
  4 + fill: 'none',
  5 + stroke: 'currentColor',
  6 + strokeWidth: 2,
  7 + viewBox: '0 0 24 24',
  8 +}
  9 +
  10 +export const IconAntler = (p: SVGProps<SVGSVGElement>) => (
  11 + <svg viewBox="0 0 64 64" fill="currentColor" {...p}>
  12 + <path d="M14 10c2 4 1 8-1 11 3-1 7 0 10 3 1-4 4-7 8-7-3 3-4 7-3 11l4 1c-1 3 0 6 3 8-3 0-6 1-8 4-1-3-4-5-8-5 2-3 2-7 0-10-3 1-7 0-10-3 3 0 5-2 6-5l-1-8z" />
  13 + <path d="M48 14c-2 3-2 6-1 9-2-2-5-2-8-1 1 3 1 6-1 9 3 0 5 2 6 5 1-3 4-5 7-5-2-3-2-6 0-9 2 1 5 1 7-1-2 0-4-1-5-3-1-2-3-4-5-4z" />
  14 + <path d="M28 38c2 3 5 5 9 5 1 4 4 7 8 8-3 2-5 5-5 9-3-2-7-3-11-2 1-3 1-7-1-10-3 0-6-1-8-4 3-1 6-3 8-6z" />
  15 + </svg>
  16 +)
  17 +
  18 +export const IconMenu = (p: SVGProps<SVGSVGElement>) => (
  19 + <svg width="18" height="18" {...stroke} {...p}>
  20 + <line x1="4" y1="7" x2="20" y2="7" />
  21 + <line x1="4" y1="12" x2="20" y2="12" />
  22 + <line x1="4" y1="17" x2="20" y2="17" />
  23 + </svg>
  24 +)
  25 +
  26 +export const IconHome = (p: SVGProps<SVGSVGElement>) => (
  27 + <svg width="16" height="16" {...stroke} {...p}>
  28 + <path d="M3 11l9-8 9 8" />
  29 + <path d="M5 10v10h14V10" />
  30 + </svg>
  31 +)
  32 +
  33 +export const IconSearch = (p: SVGProps<SVGSVGElement>) => (
  34 + <svg width="18" height="18" {...stroke} {...p}>
  35 + <circle cx="11" cy="11" r="7" />
  36 + <line x1="21" y1="21" x2="16.5" y2="16.5" />
  37 + </svg>
  38 +)
  39 +
  40 +export const IconBell = (p: SVGProps<SVGSVGElement>) => (
  41 + <svg width="18" height="18" {...stroke} {...p}>
  42 + <path d="M6 8a6 6 0 0 1 12 0v5l1.5 3h-15L6 13z" />
  43 + <path d="M10 19a2 2 0 0 0 4 0" />
  44 + </svg>
  45 +)
  46 +
  47 +export const IconUser = (p: SVGProps<SVGSVGElement>) => (
  48 + <svg width="18" height="18" {...stroke} {...p}>
  49 + <rect x="3" y="5" width="18" height="14" rx="1" />
  50 + <path d="M3 9h18" />
  51 + </svg>
  52 +)
  53 +
  54 +export const IconRefresh = (p: SVGProps<SVGSVGElement>) => (
  55 + <svg width="14" height="14" {...stroke} {...p}>
  56 + <path d="M21 12a9 9 0 1 1-3-6.7" />
  57 + <path d="M21 4v5h-5" />
  58 + </svg>
  59 +)
  60 +
  61 +export const IconPlus = (p: SVGProps<SVGSVGElement>) => (
  62 + <svg width="14" height="14" {...stroke} {...p}>
  63 + <circle cx="12" cy="12" r="9" />
  64 + <path d="M12 8v8M8 12h8" />
  65 + </svg>
  66 +)
  67 +
  68 +export const IconExport = (p: SVGProps<SVGSVGElement>) => (
  69 + <svg width="14" height="14" {...stroke} {...p}>
  70 + <path d="M4 4h12l4 4v12H4z" />
  71 + <path d="M16 4v4h4" />
  72 + <path d="M8 12h8M8 16h8" />
  73 + </svg>
  74 +)
  75 +
  76 +export const IconEdit = (p: SVGProps<SVGSVGElement>) => (
  77 + <svg width="14" height="14" {...stroke} {...p}>
  78 + <path d="M14 3l7 7-11 11H3v-7z" />
  79 + </svg>
  80 +)
  81 +
  82 +export const IconDelete = (p: SVGProps<SVGSVGElement>) => (
  83 + <svg width="14" height="14" {...stroke} {...p}>
  84 + <circle cx="12" cy="12" r="9" />
  85 + <path d="M8 8l8 8M16 8l-8 8" />
  86 + </svg>
  87 +)
  88 +
  89 +export const IconSave = (p: SVGProps<SVGSVGElement>) => (
  90 + <svg width="14" height="14" {...stroke} {...p}>
  91 + <path d="M5 4h11l3 3v13H5z" />
  92 + <rect x="8" y="4" width="8" height="5" />
  93 + </svg>
  94 +)
  95 +
  96 +export const IconCancel = (p: SVGProps<SVGSVGElement>) => (
  97 + <svg width="14" height="14" {...stroke} {...p}>
  98 + <circle cx="12" cy="12" r="9" />
  99 + <path d="M9 9l6 6M15 9l-6 6" />
  100 + </svg>
  101 +)
  102 +
  103 +export const IconGrid = (p: SVGProps<SVGSVGElement>) => (
  104 + <svg width="14" height="14" {...stroke} {...p}>
  105 + <rect x="3" y="3" width="7" height="7" />
  106 + <rect x="14" y="3" width="7" height="7" />
  107 + <rect x="3" y="14" width="7" height="7" />
  108 + <rect x="14" y="14" width="7" height="7" />
  109 + </svg>
  110 +)
  111 +
  112 +export const IconLock = (p: SVGProps<SVGSVGElement>) => (
  113 + <svg width="16" height="16" {...stroke} {...p}>
  114 + <rect x="4" y="11" width="16" height="10" rx="1" />
  115 + <path d="M8 11V7a4 4 0 0 1 8 0v4" />
  116 + </svg>
  117 +)
  118 +
  119 +export const IconAvatar = (p: SVGProps<SVGSVGElement>) => (
  120 + <svg width="16" height="16" {...stroke} {...p}>
  121 + <circle cx="12" cy="8" r="4" />
  122 + <path d="M4 21c0-4 4-7 8-7s8 3 8 7" />
  123 + </svg>
  124 +)
  125 +
  126 +export const IconAi = (p: SVGProps<SVGSVGElement>) => (
  127 + <svg width="14" height="14" {...stroke} {...p}>
  128 + <path d="M12 2l2 5 5 2-5 2-2 5-2-5-5-2 5-2z" />
  129 + </svg>
  130 +)
... ...
frontend/src/layouts/AppShell.tsx 0 → 100644
  1 +import { useState } from 'react'
  2 +import { Outlet } from 'react-router-dom'
  3 +import TopBar from '@/components/TopBar'
  4 +import NavOverlay from '@/components/NavOverlay'
  5 +
  6 +export default function AppShell() {
  7 + const [navOpen, setNavOpen] = useState(false)
  8 +
  9 + return (
  10 + <div className="app">
  11 + <TopBar navOpen={navOpen} onToggleNav={() => setNavOpen(o => !o)} />
  12 + <div className="stage">
  13 + {navOpen && <NavOverlay onClose={() => setNavOpen(false)} />}
  14 + <Outlet />
  15 + </div>
  16 + </div>
  17 + )
  18 +}
... ...
frontend/src/main.tsx 0 → 100644
  1 +import { StrictMode } from 'react'
  2 +import { createRoot } from 'react-dom/client'
  3 +import { Provider } from 'react-redux'
  4 +import { RouterProvider } from 'react-router-dom'
  5 +import { ConfigProvider } from 'antd'
  6 +import zhCN from 'antd/locale/zh_CN'
  7 +import { store } from '@/store'
  8 +import { router } from '@/router'
  9 +import { setUnauthorizedHandler } from '@/api/request'
  10 +import { loggedOut } from '@/store/auth'
  11 +import './styles/global.css'
  12 +
  13 +setUnauthorizedHandler(() => {
  14 + store.dispatch(loggedOut())
  15 + if (location.pathname !== '/login') location.assign('/login')
  16 +})
  17 +
  18 +createRoot(document.getElementById('root')!).render(
  19 + <StrictMode>
  20 + <Provider store={store}>
  21 + <ConfigProvider locale={zhCN} theme={{ token: { colorPrimary: '#2f7adf', borderRadius: 2 } }}>
  22 + <RouterProvider router={router} />
  23 + </ConfigProvider>
  24 + </Provider>
  25 + </StrictMode>,
  26 +)
... ...
frontend/src/pages/login/Login.tsx 0 → 100644
  1 +import { useState, useEffect } from 'react'
  2 +import { useNavigate } from 'react-router-dom'
  3 +import { login } from '@/api/usr'
  4 +import { BizError } from '@/api/request'
  5 +import { useAppDispatch, useAppSelector } from '@/store'
  6 +import { loginSucceeded } from '@/store/auth'
  7 +import { IconAntler, IconAvatar, IconLock } from '@/components/icons'
  8 +import type { ErrorPayload } from '@/api/types'
  9 +
  10 +export default function Login() {
  11 + const navigate = useNavigate()
  12 + const dispatch = useAppDispatch()
  13 + const existingToken = useAppSelector(s => s.auth.token)
  14 + const [userName, setUserName] = useState('')
  15 + const [password, setPassword] = useState('')
  16 + const [version] = useState<'standard'>('standard')
  17 + const [submitting, setSubmitting] = useState(false)
  18 + const [error, setError] = useState('')
  19 +
  20 + useEffect(() => {
  21 + if (existingToken) navigate('/', { replace: true })
  22 + }, [existingToken, navigate])
  23 +
  24 + const handleSubmit = async (e: React.FormEvent) => {
  25 + e.preventDefault()
  26 + if (!userName.trim() || !password) {
  27 + setError('请输入用户名和密码')
  28 + return
  29 + }
  30 + setError('')
  31 + setSubmitting(true)
  32 + try {
  33 + const res = await login({ sUserName: userName.trim(), sPassword: password, sVersion: version })
  34 + dispatch(loginSucceeded({ token: res.accessToken, user: res.user }))
  35 + navigate('/', { replace: true })
  36 + } catch (err) {
  37 + if (err instanceof BizError) {
  38 + if (err.code === 40101) setError('用户名或密码错误')
  39 + else if (err.code === 40301) {
  40 + const payload = err.payload as ErrorPayload | undefined
  41 + const sec = payload?.cooldownSeconds
  42 + setError(`账户已锁定,请 ${sec ? Math.ceil(sec / 60) + ' 分钟' : '稍后'}后重试`)
  43 + } else if (err.code === 40010) setError(err.message || '请求参数无效')
  44 + else setError(err.message || '登录失败')
  45 + } else {
  46 + setError('网络错误,请检查后端服务')
  47 + }
  48 + } finally {
  49 + setSubmitting(false)
  50 + }
  51 + }
  52 +
  53 + return (
  54 + <div className="login-wrap">
  55 + <div className="login-head">
  56 + <span className="lg" style={{ color: '#0e1216' }}>
  57 + <IconAntler width={42} height={42} />
  58 + </span>
  59 + <span className="name">Antler ERP</span>
  60 + <span className="sub">欢迎登录EBC平台</span>
  61 + </div>
  62 + <form className="login-hero" onSubmit={handleSubmit}>
  63 + <div className="login-text">
  64 + <div className="en">Enterprise Business Capability</div>
  65 + <div className="zh">企业业务能力平台</div>
  66 + <div className="erp">ERP</div>
  67 + </div>
  68 + <div className="login-card">
  69 + <h3>用户登录</h3>
  70 + <div className="lf">
  71 + <span className="ic"><IconAvatar /></span>
  72 + <span className="div"></span>
  73 + <input
  74 + type="text"
  75 + placeholder="请输入你的用户名"
  76 + value={userName}
  77 + onChange={e => setUserName(e.target.value)}
  78 + autoFocus
  79 + />
  80 + </div>
  81 + <div className="lf">
  82 + <span className="ic"><IconLock /></span>
  83 + <span className="div"></span>
  84 + <input
  85 + type="password"
  86 + placeholder="请输入你的密码"
  87 + value={password}
  88 + onChange={e => setPassword(e.target.value)}
  89 + />
  90 + </div>
  91 + <div className="lf dropdown">
  92 + <input type="text" value="标准版" readOnly style={{ cursor: 'pointer' }} />
  93 + </div>
  94 + <div className="err">{error}</div>
  95 + <button className="submit" type="submit" disabled={submitting}>
  96 + {submitting ? '登 录 中…' : '登 录'}
  97 + </button>
  98 + </div>
  99 + </form>
  100 + <div className="login-foot">
  101 + 🛠 ©Copyright Antler Software | 印刷智慧工厂 | 印刷MES | 印刷ERP | 印刷电商平台 | 文件智能处理 | 印前自动化 | 400-880-6237
  102 + <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4, marginLeft: 6 }}>
  103 + <svg width="14" height="14" viewBox="0 0 24 24" fill="#3a6cb6">
  104 + <path d="M12 2l9 4v6c0 5-4 9-9 10-5-1-9-5-9-10V6z" />
  105 + </svg>
  106 + 沪ICP备14034791号-1
  107 + </span>
  108 + </div>
  109 + </div>
  110 + )
  111 +}
... ...
frontend/src/pages/main/Dashboard.tsx 0 → 100644
  1 +import { useNavigate } from 'react-router-dom'
  2 +import { message } from 'antd'
  3 +import { useAppDispatch } from '@/store'
  4 +import { openTab } from '@/store/tabs'
  5 +import { IconAi } from '@/components/icons'
  6 +
  7 +interface KpiRow {
  8 + role?: string
  9 + item: string
  10 + desc: string
  11 + today: string
  12 + total: string
  13 + red?: boolean
  14 + sub?: string
  15 + roleSpan?: number
  16 + subSpan?: number
  17 +}
  18 +
  19 +const kpiRows: KpiRow[] = [
  20 + { role: '核价人员', item: '01/04【新增】新报价单', desc: '报价单明细', today: '-', total: '-', sub: '估价管理流程', roleSpan: 4, subSpan: 5 },
  21 + { item: '02/04 审核后报价单->客户确认价格', desc: '报价单明细', today: '16', total: '16', red: true },
  22 + { item: '03/04 客户不认可->二次确认', desc: '报价单明细', today: '-', total: '-' },
  23 + { item: '04/04 报价单->销售订单', desc: '销售订单明细', today: '1', total: '1', red: true },
  24 + { role: '销售人员', item: '04/04 报价单->销售订单(标签)', desc: '销售订单明细(标签)', today: '0', total: '0', red: true },
  25 + { role: '印前', item: '1/2 新增设计申请单', desc: '设计申请明细', today: '-', total: '-', sub: '设计制作流程', roleSpan: 2, subSpan: 2 },
  26 + { item: '2/2 设计申请->设计制作', desc: '根据设计申请单进行设计制作,当日16:00前审核的为今日任务,16:00后(含)顺延至次日', today: '11', total: '11', red: true },
  27 + { role: '客服部', item: '1/1 研发申请->文件制作', desc: '根据研发申请单,制作电子文件,当日16:00前下达的为今日任务,16:00后(含)顺延至次日', today: '0', total: '12', red: true, sub: '新品研发流程', subSpan: 5 },
  28 + { role: '客服部', item: '1/5 新增研发申请单', desc: '研发申请明细', today: '-', total: '-' },
  29 + { role: '技术研发部', item: '2/5 研发申请>>研发工单', desc: '及时开立研发工单,当日16:00前审核的为今日任务,16:00后(含)顺延至次日', today: '4', total: '4', red: true, roleSpan: 2 },
  30 + { item: '3/5 研发工单>>完工处理', desc: '计划人员在交货日期前确认工单完工', today: '7', total: '7', red: true },
  31 + { role: '客服部', item: '4/5 研发工单->客户确认', desc: '工单完工后需在7天内和客户确认样品', today: '-', total: '2703' },
  32 + { role: '技术研发部', item: '5/5 客户确认->工艺卡', desc: '根据客户已经确认的研发工单,生成产品工艺卡。当日16:00前确认的为今日任务,16:00后(含)顺延至次日', today: '0', total: '1632', red: true },
  33 + { role: '车间主管', item: '1/3 工单(测试部门数)->车间反馈', desc: '车间主管在工单完工前对测试材料进行数据反馈', today: '10', total: '115', red: true, sub: '材料测试流程', subSpan: 3 },
  34 + { item: '2/3 车间反馈->车间补充(多部门)', desc: '补充新材料测试信息,车间反馈次日16:00前的为当日任务,16:00后(含)顺延一日', today: '8', total: '8', red: true, roleSpan: 2 },
  35 + { role: '技术研发部', item: '2/3 车间反馈->工程部反馈(单部门)', desc: '工程部对新材料的测试结果进行反馈,车间反馈次日16:00前的为当日任务,16:00后(含)顺延一日', today: '23', total: '23', red: true },
  36 +]
  37 +
  38 +const kpiHeads = ['导航类型', '角色', 'KPI待处理事项(当前行双击进入)', 'KPI内容描述及处理结果(点击蓝色查看明细)', '今日未处理', '未清总数', '子流程']
  39 +
  40 +const navTreeRoles = [
  41 + ['所有部门', 37428, true], ['核价人员', 17], ['销售人员', 0], ['印前', 11], ['客服部', 30127],
  42 + ['技术研发部', 47], ['车间主管', 316], ['工艺部', 6], ['物控部', 728], ['生产计划部', 225],
  43 + ['版房', 120], ['生产车间', 596], ['工艺技术部', 0], ['品质管理部', 589], ['储运部', 3496],
  44 + ['通用', 0], ['外发组', 867], ['材料仓管', 0], ['机修组', 42], ['应收', 30],
  45 + ['出纳', 211], ['应付', 0], ['客服', 0],
  46 +] as const
  47 +
  48 +const navTreeFlows = [
  49 + ['估价管理流程', 17], ['设计制作流程', 11], ['新品研发流程', 11],
  50 + ['材料测试流程', 51], ['订单下达流程', 30118],
  51 +] as const
  52 +
  53 +export default function Dashboard() {
  54 + const navigate = useNavigate()
  55 + const dispatch = useAppDispatch()
  56 +
  57 + const goUserList = () => {
  58 + dispatch(openTab({ key: 'userlist', title: '用户列表', path: '/users' }))
  59 + navigate('/users')
  60 + }
  61 +
  62 + const total = kpiRows.length
  63 +
  64 + return (
  65 + <section style={{ height: '100%', overflow: 'auto' }}>
  66 + <div className="main-wrap">
  67 + <div style={{ display: 'flex', flexDirection: 'column', gap: 10, minHeight: 0 }}>
  68 + <div className="panel kpi-head">
  69 + <span className="title">KPI监控</span>
  70 + <span className="stat">今日未处理:<b>37428</b></span>
  71 + <span className="sep">|</span>
  72 + <span className="stat blue">未清总数:<b>56433</b></span>
  73 + <button className="ai-btn" onClick={() => message.info('AI 助手 - 未实现')}>
  74 + <IconAi />
  75 + 小ai同学,请帮我安排今日工作
  76 + </button>
  77 + </div>
  78 + <div className="three-col">
  79 + <div className="left-nav nav-tree">
  80 + <div className="group"><span className="arrow"></span><span className="ico">📁</span>按角色</div>
  81 + {navTreeRoles.map(([name, count, active]) => (
  82 + <div key={name as string} className={`item${active ? ' active' : ''}`}>
  83 + <span className="ico">📄</span>{name} ({count})
  84 + </div>
  85 + ))}
  86 + <div className="group"><span className="arrow"></span><span className="ico">📁</span>按流程</div>
  87 + {navTreeFlows.map(([name, count]) => (
  88 + <div key={name as string} className="item">
  89 + <span className="ico">📄</span>{name} ({count})
  90 + </div>
  91 + ))}
  92 + </div>
  93 + <div className="center">
  94 + <div className="panel" style={{ overflow: 'auto' }}>
  95 + <div
  96 + className="kpi-body"
  97 + style={{ gridTemplateRows: `38px repeat(${total}, minmax(38px, auto))` }}
  98 + >
  99 + {kpiHeads.map(h => (
  100 + <div key={h} className="h">{h}</div>
  101 + ))}
  102 + <div className="center" style={{ gridColumn: '1', gridRow: `2 / span ${total}` }}>按角色</div>
  103 + {kpiRows.map((row, i) => {
  104 + const altClass = i % 2 === 1 ? 'row-alt' : ''
  105 + const curRow = i + 2
  106 + const cells: React.ReactNode[] = []
  107 + if (row.role) {
  108 + cells.push(
  109 + <div
  110 + key={`role-${i}`}
  111 + className={`center ${altClass}`}
  112 + style={{ gridColumn: '2', gridRow: `${curRow} / span ${row.roleSpan || 1}` }}
  113 + >
  114 + {row.role}
  115 + </div>,
  116 + )
  117 + }
  118 + cells.push(
  119 + <div key={`item-${i}`} className={`link ${altClass}`} style={{ gridColumn: '3', gridRow: `${curRow}` }}>{row.item}</div>,
  120 + <div key={`desc-${i}`} className={`link ${altClass}`} style={{ gridColumn: '4', gridRow: `${curRow}` }}>{row.desc}</div>,
  121 + <div key={`today-${i}`} className={`num ${row.red ? 'num-red' : ''} ${altClass}`} style={{ gridColumn: '5', gridRow: `${curRow}` }}>{row.today}</div>,
  122 + <div key={`total-${i}`} className={`num ${row.red ? 'num-red' : ''} ${altClass}`} style={{ gridColumn: '6', gridRow: `${curRow}` }}>{row.total}</div>,
  123 + )
  124 + if (row.sub && row.subSpan) {
  125 + cells.push(
  126 + <div key={`sub-${i}`} className="subproc" style={{ gridColumn: '7', gridRow: `${curRow} / span ${row.subSpan}` }}>
  127 + {row.sub}
  128 + </div>,
  129 + )
  130 + }
  131 + return cells
  132 + })}
  133 + </div>
  134 + </div>
  135 + </div>
  136 + </div>
  137 + </div>
  138 + <div className="panel common-ops" style={{ height: 'fit-content' }}>
  139 + <div className="h">常用操作</div>
  140 + <a onClick={goUserList}>用户列表</a>
  141 + <a onClick={() => message.info('系统功能模块设置 - 未实现')}>系统功能模块设置</a>
  142 + </div>
  143 + </div>
  144 + <footer className="foot">
  145 + <span style={{ verticalAlign: 'middle' }}>🛠</span>
  146 + ©Copyright Antler Software <span className="pipe">|</span> 印刷智慧工厂 <span className="pipe">|</span> 印刷MES <span className="pipe">|</span> 印刷ERP <span className="pipe">|</span> 印刷电商平台 <span className="pipe">|</span> 文件智能处理 <span className="pipe">|</span> 印前自动化 <span className="pipe">|</span> 400-880-6237
  147 + <span className="police">
  148 + <svg viewBox="0 0 24 24" fill="#3a6cb6"><path d="M12 2l9 4v6c0 5-4 9-9 10-5-1-9-5-9-10V6z" /></svg>
  149 + 沪ICP备14034791号-1
  150 + </span>
  151 + </footer>
  152 + </section>
  153 + )
  154 +}
... ...
frontend/src/pages/usr/UserDetail.tsx 0 → 100644
  1 +import { useEffect, useMemo, useState } from 'react'
  2 +import { useNavigate, useParams } from 'react-router-dom'
  3 +import { message } from 'antd'
  4 +import { createUser, listUsers, updateUser } from '@/api/usr'
  5 +import { BizError } from '@/api/request'
  6 +import { useAppDispatch } from '@/store'
  7 +import { closeTab } from '@/store/tabs'
  8 +import type { UserListItem } from '@/api/types'
  9 +import { IconCancel, IconDelete, IconEdit, IconGrid, IconPlus, IconSave } from '@/components/icons'
  10 +
  11 +interface Props {
  12 + mode: 'new' | 'edit'
  13 +}
  14 +
  15 +const PERMS = [
  16 + '默认显示(必选)', '禁止查看价格', '客服跟单', '报价组员工', '物控部员工', '供应链PMC', '允许查看订单价格',
  17 + '储运部员工', '外部供应商', '品质部员工', '技术中心员工', '机修组员工', '生产部计划员工', '外发组员工',
  18 + '模烫车间', '装订车间', '后加工车间', '品质部管理', '精品车间', '人事组', '统计组', '机修主管',
  19 + '样品开发部员工', '设计开发', '总经办', '审核组', '结算组', '打样车间', '制版组', '文控组', '行政组',
  20 + '成本组', '采购组', 'OA管理员', '开发组', 'API对接', 'MES管理员', '报表组',
  21 +]
  22 +
  23 +const TABS = ['权限组', '客户查看权限', '供应商查看权限', '人员查看权限', '工序查看权限', '司机查看权限']
  24 +
  25 +const USER_TYPES = ['超级管理员', '普通用户']
  26 +const LANGS = [{ v: 'zh', t: '中文' }, { v: 'en', t: '英文' }]
  27 +
  28 +interface FormState {
  29 + sUserNo: string
  30 + sUserName: string
  31 + sUserType: string
  32 + sLanguage: string
  33 + bCanModifyDocs: boolean
  34 + perms: Set<number>
  35 + tCreateDate: string
  36 + sCreatedBy: string
  37 + sStaffName: string
  38 +}
  39 +
  40 +const empty: FormState = {
  41 + sUserNo: '',
  42 + sUserName: '',
  43 + sUserType: '超级管理员',
  44 + sLanguage: 'zh',
  45 + bCanModifyDocs: false,
  46 + perms: new Set([0]),
  47 + tCreateDate: '',
  48 + sCreatedBy: '',
  49 + sStaffName: '',
  50 +}
  51 +
  52 +export default function UserDetail({ mode }: Props) {
  53 + const navigate = useNavigate()
  54 + const dispatch = useAppDispatch()
  55 + const params = useParams()
  56 + const userId = mode === 'edit' ? Number(params.id) : null
  57 +
  58 + const [form, setForm] = useState<FormState>(empty)
  59 + const [tab, setTab] = useState(0)
  60 + const [submitting, setSubmitting] = useState(false)
  61 + const [editing, setEditing] = useState(mode === 'new')
  62 + const [loaded, setLoaded] = useState(mode === 'new')
  63 +
  64 + useEffect(() => {
  65 + if (mode !== 'edit' || !userId) return
  66 + let cancelled = false
  67 + ;(async () => {
  68 + try {
  69 + const res = await listUsers({ pageNum: 1, pageSize: 100, queryField: 'username', matchType: 'contains', queryValue: '' })
  70 + if (cancelled) return
  71 + const found = res.list.find((u: UserListItem) => u.iIncrement === userId)
  72 + if (!found) {
  73 + message.warning('用户不存在或已删除')
  74 + return
  75 + }
  76 + setForm({
  77 + sUserNo: found.sUserNo,
  78 + sUserName: found.sUserName,
  79 + sUserType: found.sUserType,
  80 + sLanguage: found.sLanguage,
  81 + bCanModifyDocs: false,
  82 + perms: new Set([0]),
  83 + tCreateDate: found.tCreateDate ?? '',
  84 + sCreatedBy: found.sCreatedBy ?? '',
  85 + sStaffName: found.sStaffName ?? '',
  86 + })
  87 + setLoaded(true)
  88 + } catch (err) {
  89 + const msg = err instanceof BizError ? err.message : '加载用户信息失败'
  90 + message.error(msg)
  91 + }
  92 + })()
  93 + return () => { cancelled = true }
  94 + }, [mode, userId])
  95 +
  96 + const togglePerm = (i: number) => {
  97 + if (!editing) return
  98 + setForm(f => {
  99 + const next = new Set(f.perms)
  100 + if (next.has(i)) next.delete(i); else next.add(i)
  101 + next.add(0)
  102 + return { ...f, perms: next }
  103 + })
  104 + }
  105 +
  106 + const handleSave = async () => {
  107 + if (!form.sUserNo.trim() || !form.sUserName.trim()) {
  108 + message.warning('请填写必填字段:用户号、用户名')
  109 + return
  110 + }
  111 + setSubmitting(true)
  112 + try {
  113 + const permIds = [...form.perms].map(i => i + 1)
  114 + if (mode === 'new') {
  115 + await createUser({
  116 + sUserNo: form.sUserNo.trim(),
  117 + sUserName: form.sUserName.trim(),
  118 + sUserType: form.sUserType,
  119 + sLanguage: form.sLanguage,
  120 + bCanModifyDocs: form.bCanModifyDocs,
  121 + permissionCategoryIds: permIds,
  122 + })
  123 + message.success('用户创建成功,初始密码 666666')
  124 + closeAndBack()
  125 + } else if (userId) {
  126 + await updateUser(userId, {
  127 + sUserType: form.sUserType,
  128 + sLanguage: form.sLanguage,
  129 + bCanModifyDocs: form.bCanModifyDocs,
  130 + permissionCategoryIds: permIds,
  131 + })
  132 + message.success('保存成功')
  133 + setEditing(false)
  134 + }
  135 + } catch (err) {
  136 + const msg = err instanceof BizError ? err.message : '保存失败'
  137 + message.error(msg)
  138 + } finally {
  139 + setSubmitting(false)
  140 + }
  141 + }
  142 +
  143 + const closeAndBack = () => {
  144 + dispatch(closeTab('userdetail'))
  145 + navigate('/users')
  146 + }
  147 +
  148 + const isNew = mode === 'new'
  149 + const langText = useMemo(
  150 + () => LANGS.find(l => l.v === form.sLanguage)?.t ?? form.sLanguage,
  151 + [form.sLanguage],
  152 + )
  153 +
  154 + return (
  155 + <div className="userdetail-screen">
  156 + <div className="toolbar">
  157 + <span className={`tb-btn ${editing && !isNew ? 'disabled' : ''}`} onClick={() => !editing && navigate('/users/new')}>
  158 + <IconPlus />新增
  159 + </span>
  160 + <span className={`tb-btn ${editing || isNew ? 'disabled' : ''}`} onClick={() => !isNew && setEditing(true)}>
  161 + <IconEdit />修改
  162 + </span>
  163 + <span className="tb-btn disabled"><IconDelete />删除</span>
  164 + <span className={`tb-btn ${editing && !submitting ? '' : 'disabled'}`} onClick={editing ? handleSave : undefined}>
  165 + <IconSave />保存
  166 + </span>
  167 + <span className={`tb-btn ${editing && !isNew ? '' : 'disabled'}`} onClick={() => editing && !isNew && setEditing(false)}>
  168 + <IconCancel />取消
  169 + </span>
  170 + <span className="tb-btn disabled"><IconGrid />功能</span>
  171 + <span className="tb-btn disabled">作废</span>
  172 + <span className="tb-btn disabled">重置密码</span>
  173 + <span className="tb-btn disabled">取消作废</span>
  174 + <span className="spacer" />
  175 + <span className="gear">⚙</span>
  176 + </div>
  177 +
  178 + <div className="form-grid">
  179 + <div className="form-cell">
  180 + <span className="lbl">创建时间:</span>
  181 + <div className="field readonly">{isNew ? '' : form.tCreateDate}</div>
  182 + </div>
  183 + <div className="form-cell">
  184 + <span className="lbl">制单人:</span>
  185 + <div className="field readonly">{isNew ? '保存后自动生成' : form.sCreatedBy}</div>
  186 + </div>
  187 + <div className="form-cell">
  188 + <span className="lbl req">员工名:</span>
  189 + <input
  190 + type="text"
  191 + value={form.sStaffName}
  192 + onChange={e => setForm(f => ({ ...f, sStaffName: e.target.value }))}
  193 + disabled={!editing}
  194 + placeholder="(暂不绑定员工档案)"
  195 + />
  196 + </div>
  197 +
  198 + <div className="form-cell">
  199 + <span className="lbl req">用户名:</span>
  200 + <input
  201 + type="text"
  202 + value={form.sUserName}
  203 + onChange={e => setForm(f => ({ ...f, sUserName: e.target.value }))}
  204 + disabled={!editing || !isNew}
  205 + />
  206 + </div>
  207 + <div className="form-cell">
  208 + <span className="lbl req">类型:</span>
  209 + {editing ? (
  210 + <select className="field" value={form.sUserType} onChange={e => setForm(f => ({ ...f, sUserType: e.target.value }))}>
  211 + {USER_TYPES.map(t => <option key={t} value={t}>{t}</option>)}
  212 + </select>
  213 + ) : (
  214 + <div className="field readonly">{form.sUserType}</div>
  215 + )}
  216 + </div>
  217 + <div className="form-cell">
  218 + <span className="lbl req">语言:</span>
  219 + {editing ? (
  220 + <select className="field" value={form.sLanguage} onChange={e => setForm(f => ({ ...f, sLanguage: e.target.value }))}>
  221 + {LANGS.map(l => <option key={l.v} value={l.v}>{l.t}</option>)}
  222 + </select>
  223 + ) : (
  224 + <div className="field readonly">{langText}</div>
  225 + )}
  226 + </div>
  227 +
  228 + <div className="form-cell">
  229 + <span className="lbl req">用户号:</span>
  230 + <input
  231 + type="text"
  232 + value={form.sUserNo}
  233 + onChange={e => setForm(f => ({ ...f, sUserNo: e.target.value }))}
  234 + disabled={!editing || !isNew}
  235 + />
  236 + </div>
  237 + <div className="form-cell"></div>
  238 + <div className="form-cell">
  239 + <span className="lbl">单据修改权限:</span>
  240 + <span
  241 + className={`cb ${form.bCanModifyDocs ? 'checked' : ''}`}
  242 + onClick={() => editing && setForm(f => ({ ...f, bCanModifyDocs: !f.bCanModifyDocs }))}
  243 + />
  244 + </div>
  245 + </div>
  246 +
  247 + <div className="tabs-row">
  248 + {TABS.map((t, i) => (
  249 + <div key={t} className={`tb ${tab === i ? 'active' : ''}`} onClick={() => setTab(i)}>
  250 + {t}
  251 + </div>
  252 + ))}
  253 + </div>
  254 +
  255 + <div className="perm-list">
  256 + <div className="perm-row head">
  257 + <span className="cb"></span>
  258 + <span>权限分类</span>
  259 + <span className="ic" style={{ marginLeft: 'auto', color: '#aaa' }}>⇅</span>
  260 + </div>
  261 + {tab === 0 ? (
  262 + loaded && PERMS.map((p, i) => (
  263 + <div key={p} className="perm-row" onClick={() => togglePerm(i)}>
  264 + <span className={`cb ${form.perms.has(i) ? 'checked' : ''}`} />
  265 + <span>{p}</span>
  266 + </div>
  267 + ))
  268 + ) : (
  269 + <div style={{ padding: '40px 14px', color: '#888', textAlign: 'center' }}>该 tab 后端暂未实现</div>
  270 + )}
  271 + </div>
  272 + </div>
  273 + )
  274 +}
... ...
frontend/src/pages/usr/UserList.tsx 0 → 100644
  1 +import { useCallback, useEffect, useState } from 'react'
  2 +import { useNavigate } from 'react-router-dom'
  3 +import { message } from 'antd'
  4 +import { listUsers } from '@/api/usr'
  5 +import { BizError } from '@/api/request'
  6 +import type { MatchType, QueryField, UserListItem } from '@/api/types'
  7 +import { useAppDispatch } from '@/store'
  8 +import { openTab } from '@/store/tabs'
  9 +import { IconExport, IconPlus, IconRefresh, IconSearch } from '@/components/icons'
  10 +
  11 +const QUERY_FIELDS: { value: QueryField; label: string }[] = [
  12 + { value: 'username', label: '用户名' },
  13 + { value: 'staff', label: '员工名' },
  14 + { value: 'userno', label: '用户号' },
  15 + { value: 'department', label: '部门' },
  16 + { value: 'usertype', label: '用户类型' },
  17 + { value: 'language', label: '语言' },
  18 + { value: 'deleted', label: '是否作废' },
  19 +]
  20 +
  21 +const MATCH_TYPES: { value: MatchType; label: string }[] = [
  22 + { value: 'contains', label: '包含' },
  23 + { value: 'equals', label: '等于' },
  24 + { value: 'startsWith', label: '开头是' },
  25 + { value: 'endsWith', label: '结尾是' },
  26 +]
  27 +
  28 +const fmt = (s: string | null | undefined) => s ?? ''
  29 +
  30 +export default function UserList() {
  31 + const navigate = useNavigate()
  32 + const dispatch = useAppDispatch()
  33 + const [data, setData] = useState<UserListItem[]>([])
  34 + const [total, setTotal] = useState(0)
  35 + const [pageNum, setPageNum] = useState(1)
  36 + const [pageSize] = useState(20)
  37 + const [loading, setLoading] = useState(false)
  38 + const [selectedId, setSelectedId] = useState<number | null>(null)
  39 +
  40 + const [scopeAll] = useState(true)
  41 + const [queryField, setQueryField] = useState<QueryField>('username')
  42 + const [matchType, setMatchType] = useState<MatchType>('contains')
  43 + const [queryValue, setQueryValue] = useState('')
  44 +
  45 + const load = useCallback(async (page: number) => {
  46 + setLoading(true)
  47 + try {
  48 + const params: Parameters<typeof listUsers>[0] = { pageNum: page, pageSize }
  49 + if (queryValue.trim()) {
  50 + params.queryField = queryField
  51 + params.matchType = matchType
  52 + params.queryValue = queryValue.trim()
  53 + }
  54 + const res = await listUsers(params)
  55 + setData(res.list)
  56 + setTotal(res.total)
  57 + setPageNum(res.pageNum)
  58 + } catch (err) {
  59 + const msg = err instanceof BizError ? err.message : '加载用户列表失败'
  60 + message.error(msg)
  61 + } finally {
  62 + setLoading(false)
  63 + }
  64 + }, [pageSize, queryField, matchType, queryValue])
  65 +
  66 + useEffect(() => { load(1) }, [load])
  67 +
  68 + const handleAdd = () => {
  69 + dispatch(openTab({ key: 'userdetail', title: '用户信息单据', path: '/users/new' }))
  70 + navigate('/users/new')
  71 + }
  72 +
  73 + const handleRowDouble = (u: UserListItem) => {
  74 + dispatch(openTab({ key: 'userdetail', title: '用户信息单据', path: `/users/${u.iIncrement}` }))
  75 + navigate(`/users/${u.iIncrement}`)
  76 + }
  77 +
  78 + const handleClear = () => {
  79 + setQueryValue('')
  80 + setQueryField('username')
  81 + setMatchType('contains')
  82 + }
  83 +
  84 + const totalPages = Math.max(1, Math.ceil(total / pageSize))
  85 +
  86 + return (
  87 + <div className="userlist-screen">
  88 + <div className="toolbar">
  89 + <span className="tb-btn" onClick={() => load(pageNum)}><IconRefresh />刷新</span>
  90 + <span className="tb-btn" onClick={handleAdd}><IconPlus />新增</span>
  91 + <span className="tb-btn" onClick={() => message.info('导出 Excel - 未实现')}><IconExport />导出Excel</span>
  92 + <span className="spacer" />
  93 + <span className="gear">⚙</span>
  94 + </div>
  95 + <div className="filterbar">
  96 + <select value={scopeAll ? 'all' : 'all'} disabled>
  97 + <option value="all">全部用户</option>
  98 + </select>
  99 + <select value={queryField} onChange={e => setQueryField(e.target.value as QueryField)}>
  100 + {QUERY_FIELDS.map(f => <option key={f.value} value={f.value}>{f.label}</option>)}
  101 + </select>
  102 + <select value={matchType} onChange={e => setMatchType(e.target.value as MatchType)}>
  103 + {MATCH_TYPES.map(m => <option key={m.value} value={m.value}>{m.label}</option>)}
  104 + </select>
  105 + <input
  106 + type="text"
  107 + value={queryValue}
  108 + onChange={e => setQueryValue(e.target.value)}
  109 + onKeyDown={e => { if (e.key === 'Enter') load(1) }}
  110 + />
  111 + <span className="down">▾</span>
  112 + <button className="btn" onClick={() => load(1)} disabled={loading}>
  113 + <IconSearch />搜索
  114 + </button>
  115 + <button className="btn ghost" onClick={handleClear}>⊗ 清空</button>
  116 + </div>
  117 + <div className="table-shell">
  118 + <table className="grid-table">
  119 + <thead>
  120 + <tr>
  121 + <th style={{ width: 36 }}></th>
  122 + <th style={{ width: 60 }}>序号</th>
  123 + <th>用户名</th>
  124 + <th>员工名</th>
  125 + <th>用户号</th>
  126 + <th>部门</th>
  127 + <th>用户类型</th>
  128 + <th>语言</th>
  129 + <th>作</th>
  130 + <th>登录日期</th>
  131 + <th>制单人</th>
  132 + <th>制单日期</th>
  133 + </tr>
  134 + </thead>
  135 + <tbody>
  136 + {data.length === 0 && !loading && (
  137 + <tr><td colSpan={12} style={{ textAlign: 'center', color: '#888', padding: 24 }}>无数据</td></tr>
  138 + )}
  139 + {data.map((u, i) => (
  140 + <tr
  141 + key={u.iIncrement}
  142 + className={selectedId === u.iIncrement ? 'selected' : ''}
  143 + onClick={() => setSelectedId(u.iIncrement)}
  144 + onDoubleClick={() => handleRowDouble(u)}
  145 + >
  146 + <td className="radio-cell">
  147 + <span className={`radio-dot ${selectedId === u.iIncrement ? 'checked' : ''}`}></span>
  148 + </td>
  149 + <td>{(pageNum - 1) * pageSize + i + 1}</td>
  150 + <td>{u.sUserName}</td>
  151 + <td>{fmt(u.sStaffName)}</td>
  152 + <td>{u.sUserNo}</td>
  153 + <td>{fmt(u.sDepartment)}</td>
  154 + <td>{u.sUserType}</td>
  155 + <td>{u.sLanguage === 'zh' ? '中文' : u.sLanguage === 'en' ? '英文' : u.sLanguage}</td>
  156 + <td><input className="cb" type="checkbox" readOnly checked={u.bDeleted} /></td>
  157 + <td>{fmt(u.tLastLoginDate)}</td>
  158 + <td>{fmt(u.sCreatedBy)}</td>
  159 + <td>{fmt(u.tCreateDate)}</td>
  160 + </tr>
  161 + ))}
  162 + </tbody>
  163 + </table>
  164 + </div>
  165 + <div className="pager">
  166 + <span>当前显示 共 {total} 条记录</span>
  167 + <span
  168 + className={`pgbtn ${pageNum <= 1 ? 'disabled' : ''}`}
  169 + onClick={() => pageNum > 1 && load(pageNum - 1)}
  170 + >‹</span>
  171 + <span className="pgcur">{pageNum}</span>
  172 + <span
  173 + className={`pgbtn ${pageNum >= totalPages ? 'disabled' : ''}`}
  174 + onClick={() => pageNum < totalPages && load(pageNum + 1)}
  175 + >›</span>
  176 + <select value={pageSize} disabled>
  177 + <option value={pageSize}>{pageSize} 条/页</option>
  178 + </select>
  179 + </div>
  180 + </div>
  181 + )
  182 +}
... ...
frontend/src/router/RequireAuth.tsx 0 → 100644
  1 +import { Navigate, useLocation } from 'react-router-dom'
  2 +import { useAppSelector } from '@/store'
  3 +
  4 +export default function RequireAuth({ children }: { children: React.ReactNode }) {
  5 + const token = useAppSelector(s => s.auth.token)
  6 + const loc = useLocation()
  7 + if (!token) return <Navigate to="/login" replace state={{ from: loc.pathname }} />
  8 + return <>{children}</>
  9 +}
... ...
frontend/src/router/index.tsx 0 → 100644
  1 +import { createBrowserRouter } from 'react-router-dom'
  2 +import AppShell from '@/layouts/AppShell'
  3 +import RequireAuth from './RequireAuth'
  4 +import LoginPage from '@/pages/login/Login'
  5 +import DashboardPage from '@/pages/main/Dashboard'
  6 +import UserListPage from '@/pages/usr/UserList'
  7 +import UserDetailPage from '@/pages/usr/UserDetail'
  8 +
  9 +export const router = createBrowserRouter([
  10 + { path: '/login', element: <LoginPage /> },
  11 + {
  12 + path: '/',
  13 + element: (
  14 + <RequireAuth>
  15 + <AppShell />
  16 + </RequireAuth>
  17 + ),
  18 + children: [
  19 + { index: true, element: <DashboardPage /> },
  20 + { path: 'users', element: <UserListPage /> },
  21 + { path: 'users/new', element: <UserDetailPage mode="new" /> },
  22 + { path: 'users/:id', element: <UserDetailPage mode="edit" /> },
  23 + ],
  24 + },
  25 +])
... ...
frontend/src/store/auth.ts 0 → 100644
  1 +import { createSlice, type PayloadAction } from '@reduxjs/toolkit'
  2 +import { TOKEN_KEY } from '@/api/request'
  3 +import type { UserInfo } from '@/api/types'
  4 +
  5 +const USER_KEY = 'erp.user'
  6 +
  7 +function loadUser(): UserInfo | null {
  8 + const raw = sessionStorage.getItem(USER_KEY)
  9 + if (!raw) return null
  10 + try { return JSON.parse(raw) as UserInfo } catch { return null }
  11 +}
  12 +
  13 +interface AuthState {
  14 + token: string | null
  15 + user: UserInfo | null
  16 +}
  17 +
  18 +const initialState: AuthState = {
  19 + token: sessionStorage.getItem(TOKEN_KEY),
  20 + user: loadUser(),
  21 +}
  22 +
  23 +const slice = createSlice({
  24 + name: 'auth',
  25 + initialState,
  26 + reducers: {
  27 + loginSucceeded(state, action: PayloadAction<{ token: string; user: UserInfo }>) {
  28 + state.token = action.payload.token
  29 + state.user = action.payload.user
  30 + sessionStorage.setItem(TOKEN_KEY, action.payload.token)
  31 + sessionStorage.setItem(USER_KEY, JSON.stringify(action.payload.user))
  32 + },
  33 + loggedOut(state) {
  34 + state.token = null
  35 + state.user = null
  36 + sessionStorage.removeItem(TOKEN_KEY)
  37 + sessionStorage.removeItem(USER_KEY)
  38 + },
  39 + },
  40 +})
  41 +
  42 +export const { loginSucceeded, loggedOut } = slice.actions
  43 +export default slice.reducer
... ...
frontend/src/store/index.ts 0 → 100644
  1 +import { configureStore } from '@reduxjs/toolkit'
  2 +import { useDispatch, useSelector, type TypedUseSelectorHook } from 'react-redux'
  3 +import auth from './auth'
  4 +import tabs from './tabs'
  5 +
  6 +export const store = configureStore({
  7 + reducer: { auth, tabs },
  8 +})
  9 +
  10 +export type RootState = ReturnType<typeof store.getState>
  11 +export type AppDispatch = typeof store.dispatch
  12 +export const useAppDispatch: () => AppDispatch = useDispatch
  13 +export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector
... ...
frontend/src/store/tabs.ts 0 → 100644
  1 +import { createSlice, type PayloadAction } from '@reduxjs/toolkit'
  2 +
  3 +export interface TabItem {
  4 + key: string
  5 + title: string
  6 + path: string
  7 +}
  8 +
  9 +interface TabsState {
  10 + items: TabItem[]
  11 +}
  12 +
  13 +const initialState: TabsState = {
  14 + items: [],
  15 +}
  16 +
  17 +const slice = createSlice({
  18 + name: 'tabs',
  19 + initialState,
  20 + reducers: {
  21 + openTab(state, action: PayloadAction<TabItem>) {
  22 + const exists = state.items.find(t => t.key === action.payload.key)
  23 + if (!exists) state.items.push(action.payload)
  24 + },
  25 + closeTab(state, action: PayloadAction<string>) {
  26 + state.items = state.items.filter(t => t.key !== action.payload)
  27 + },
  28 + resetTabs(state) {
  29 + state.items = []
  30 + },
  31 + },
  32 +})
  33 +
  34 +export const { openTab, closeTab, resetTabs } = slice.actions
  35 +export default slice.reducer
... ...
frontend/src/styles/global.css 0 → 100644
  1 +@import './tokens.css';
  2 +
  3 +* { box-sizing: border-box; }
  4 +html, body, #root {
  5 + margin: 0;
  6 + padding: 0;
  7 + height: 100%;
  8 + background: var(--bg);
  9 + color: var(--text);
  10 + font-family: "Microsoft YaHei", "PingFang SC", "Helvetica Neue", Helvetica, Arial, "Segoe UI", sans-serif;
  11 + font-size: 13px;
  12 +}
  13 +button { font-family: inherit; cursor: pointer; }
  14 +a { color: inherit; text-decoration: none; }
  15 +input, select, textarea { font-family: inherit; font-size: 13px; }
  16 +
  17 +/* ======= TOP BAR ======= */
  18 +.topbar { display: flex; align-items: stretch; height: 44px; background: var(--topbar); color: var(--topbar-text); position: relative; z-index: 30; }
  19 +.topbar .logo { width: 54px; display: flex; align-items: center; justify-content: center; cursor: pointer; }
  20 +.topbar .logo svg { width: 30px; height: 30px; color: #0e1216; }
  21 +.topbar .nav-btn { display: flex; align-items: center; gap: 6px; padding: 0 18px; color: #fff; cursor: pointer; font-size: 14px; border: none; background: transparent; height: 100%; }
  22 +.topbar .nav-btn.active { background: var(--primary); }
  23 +.topbar .nav-btn:hover { background: #33363d; }
  24 +.topbar .nav-btn.active:hover { background: var(--primary-strong); }
  25 +.topbar .tabs { display: flex; align-items: stretch; flex: 1; }
  26 +.topbar .tab { display: flex; align-items: center; gap: 8px; padding: 0 18px; cursor: pointer; color: #cfd2d8; font-size: 14px; height: 100%; }
  27 +.topbar .tab .ic { opacity: .85; }
  28 +.topbar .tab.active { color: var(--link); }
  29 +.topbar .tab .close { margin-left: 6px; width: 14px; height: 14px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-size: 11px; color: #9aa0a8; }
  30 +.topbar .tab .close:hover { background: #3a3d44; color: #fff; }
  31 +.topbar .right { display: flex; align-items: center; gap: 18px; padding-right: 14px; }
  32 +.topbar .right .ic { width: 18px; height: 18px; opacity: .9; cursor: pointer; }
  33 +.topbar .user { display: flex; align-items: center; gap: 6px; font-size: 14px; cursor: pointer; }
  34 +.topbar .more { font-size: 18px; letter-spacing: 2px; cursor: pointer; padding: 0 4px; }
  35 +
  36 +/* ======= APP LAYOUT ======= */
  37 +.app { height: 100vh; display: flex; flex-direction: column; overflow: hidden; }
  38 +.stage { flex: 1; position: relative; overflow: hidden; background: var(--bg); }
  39 +
  40 +/* ======= MAIN / DASHBOARD ======= */
  41 +.main-wrap { display: grid; grid-template-columns: 1fr 280px; gap: 10px; padding: 10px; min-height: 100%; }
  42 +.panel { background: var(--panel); border: 1px solid var(--border); border-radius: 2px; }
  43 +.kpi-head { padding: 14px 18px; display: flex; align-items: center; gap: 24px; flex-wrap: wrap; }
  44 +.kpi-head .title { font-size: 15px; color: #222; font-weight: 500; margin-right: 6px; }
  45 +.kpi-head .stat { color: var(--text-soft); }
  46 +.kpi-head .stat b { color: var(--danger); font-weight: 500; margin-left: 6px; font-size: 14px; }
  47 +.kpi-head .stat.blue b { color: var(--link); }
  48 +.kpi-head .sep { color: #cdd0d6; }
  49 +.kpi-head .ai-btn { margin-left: auto; background: var(--primary); color: #fff; border: none; padding: 7px 14px; border-radius: 2px; display: inline-flex; align-items: center; gap: 6px; font-size: 13px; }
  50 +.kpi-head .ai-btn:hover { background: var(--primary-strong); }
  51 +
  52 +.kpi-body { display: grid; grid-template-columns: 200px 90px 1fr 1fr 90px 90px 130px; border-top: 1px solid var(--border); }
  53 +.kpi-body > div { border-right: 1px solid var(--border); border-bottom: 1px solid var(--border); padding: 10px 12px; font-size: 13px; min-height: 38px; display: flex; align-items: center; }
  54 +.kpi-body > div:nth-last-child(-n+7) { border-bottom: none; }
  55 +.kpi-body > div:last-child { border-right: none; }
  56 +.kpi-body .h { background: var(--header-bg); font-weight: 500; color: #222; padding: 9px 12px; }
  57 +.kpi-body .row-alt { background: var(--row-alt); }
  58 +.kpi-body .link { color: var(--link); cursor: pointer; }
  59 +.kpi-body .link:hover { text-decoration: underline; }
  60 +.kpi-body .num-red { color: var(--danger); font-weight: 600; justify-content: center; }
  61 +.kpi-body .num { justify-content: center; }
  62 +.kpi-body .center { justify-content: center; }
  63 +
  64 +.nav-tree { padding: 6px 0; }
  65 +.nav-tree .group { padding: 8px 14px; color: #444; font-size: 13px; display: flex; align-items: center; gap: 6px; cursor: pointer; }
  66 +.nav-tree .group .arrow { display: inline-block; width: 0; height: 0; border-left: 4px solid #888; border-top: 4px solid transparent; border-bottom: 4px solid transparent; transform: rotate(90deg); margin-right: 2px; }
  67 +.nav-tree .group .ico { color: #e0b96a; }
  68 +.nav-tree .item { padding: 6px 14px 6px 36px; display: flex; align-items: center; gap: 8px; color: #3a3a3a; cursor: pointer; font-size: 13px; }
  69 +.nav-tree .item:hover { background: #eef3fb; }
  70 +.nav-tree .item.active { background: #d8eaff; color: #1166cc; }
  71 +.nav-tree .item .ico { color: #e0b96a; }
  72 +
  73 +.three-col { display: grid; grid-template-columns: 280px 1fr; height: 100%; }
  74 +.three-col .left-nav { background: var(--panel); border: 1px solid var(--border); overflow: auto; }
  75 +.three-col .center { display: flex; flex-direction: column; gap: 10px; min-width: 0; }
  76 +
  77 +.common-ops { padding: 14px 18px; }
  78 +.common-ops .h { font-size: 14px; color: #222; margin-bottom: 14px; font-weight: 500; }
  79 +.common-ops a { display: block; color: var(--link); padding: 8px 0; font-size: 13px; cursor: pointer; }
  80 +.common-ops a:hover { text-decoration: underline; }
  81 +
  82 +.subproc { writing-mode: vertical-rl; text-orientation: upright; color: #222; font-weight: 500; justify-content: center; min-width: 24px; }
  83 +
  84 +footer.foot { background: #f3f4f6; border-top: 1px solid var(--border); padding: 10px 14px; text-align: center; color: #666; font-size: 12px; }
  85 +footer.foot .pipe { margin: 0 8px; color: #bbb; }
  86 +footer.foot .police { display: inline-flex; align-items: center; gap: 4px; margin-left: 6px; }
  87 +footer.foot .police svg { width: 14px; height: 14px; }
  88 +
  89 +/* ======= NAV OVERLAY ======= */
  90 +.nav-overlay { position: absolute; inset: 0; background: #2b3137; display: flex; z-index: 20; color: #cfd3da; }
  91 +.nav-overlay .side { width: 200px; background: #2b3137; padding: 8px 0; border-right: 1px solid #1e2226; overflow: auto; }
  92 +.nav-overlay .side .si { display: flex; align-items: center; gap: 10px; padding: 11px 18px; font-size: 14px; color: #d3d6db; cursor: pointer; }
  93 +.nav-overlay .side .si:hover { background: #34393f; }
  94 +.nav-overlay .side .si.active { color: var(--link); background: #34393f; }
  95 +.nav-overlay .side .si svg { width: 16px; height: 16px; opacity: .85; }
  96 +.nav-overlay .grid { flex: 1; padding: 30px 40px; display: grid; grid-template-columns: repeat(7, 1fr); gap: 30px 40px; align-content: start; overflow: auto; }
  97 +.nav-overlay .col h3 { font-size: 15px; color: #e8eaee; font-weight: 500; margin: 0 0 18px; border-bottom: 1px solid #4a4f57; padding-bottom: 10px; }
  98 +.nav-overlay .col a { display: flex; align-items: center; gap: 6px; padding: 7px 0; color: #cfd3da; font-size: 14px; cursor: pointer; }
  99 +.nav-overlay .col a:hover { color: #fff; }
  100 +.nav-overlay .col a .star { color: #f3b526; }
  101 +
  102 +/* ======= USER LIST ======= */
  103 +.userlist-screen, .userdetail-screen { display: flex; flex-direction: column; height: 100%; }
  104 +.toolbar { background: var(--toolbar-bg); color: #fff; display: flex; align-items: center; gap: 6px; padding: 0 8px; height: 38px; flex-shrink: 0; }
  105 +.toolbar .tb-btn { display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px; color: #e6e7ea; cursor: pointer; font-size: 13px; border-radius: 2px; user-select: none; }
  106 +.toolbar .tb-btn:hover { background: #3a3d44; }
  107 +.toolbar .tb-btn.disabled { color: #6c6e74; cursor: not-allowed; }
  108 +.toolbar .tb-btn.disabled:hover { background: transparent; }
  109 +.toolbar .tb-btn .ic { opacity: .9; }
  110 +.toolbar .spacer { flex: 1; }
  111 +.toolbar .gear { padding: 6px 8px; cursor: pointer; color: #cfd2d8; }
  112 +
  113 +.filterbar { display: flex; align-items: center; gap: 8px; padding: 10px 12px; background: var(--panel); border-bottom: 1px solid var(--border); flex-shrink: 0; }
  114 +.filterbar select, .filterbar input { height: 30px; border: 1px solid #d5d8de; border-radius: 2px; padding: 0 28px 0 10px; background: #fff; min-width: 140px; appearance: none;
  115 + background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 10 10'><path d='M2 3l3 4 3-4z' fill='%23888'/></svg>");
  116 + background-repeat: no-repeat; background-position: right 8px center; }
  117 +.filterbar input { background-image: none; padding-right: 10px; }
  118 +.filterbar .down { width: 34px; height: 30px; background: #dfe5ee; border: 1px solid #d5d8de; display: flex; align-items: center; justify-content: center; border-radius: 2px; cursor: pointer; color: #3776c8; }
  119 +.filterbar .btn { height: 30px; padding: 0 14px; border-radius: 2px; border: 1px solid var(--primary); background: var(--primary); color: #fff; display: inline-flex; align-items: center; gap: 5px; font-size: 13px; cursor: pointer; }
  120 +.filterbar .btn.ghost { background: #fff; color: #444; border-color: #cfd3da; }
  121 +.filterbar .btn:hover { filter: brightness(1.05); }
  122 +
  123 +.table-shell { background: #fff; flex: 1; overflow: auto; border: 1px solid var(--border); border-top: none; }
  124 +.grid-table { width: 100%; border-collapse: collapse; background: #fff; font-size: 13px; }
  125 +.grid-table th, .grid-table td { border: 1px solid var(--border); padding: 7px 10px; text-align: left; white-space: nowrap; }
  126 +.grid-table thead th { background: var(--header-bg); font-weight: 500; color: #333; position: sticky; top: 0; z-index: 1; }
  127 +.grid-table tbody tr:nth-child(even) { background: var(--row-alt); }
  128 +.grid-table tbody tr:hover { background: #eaf3fe; cursor: pointer; }
  129 +.grid-table tbody tr.selected { background: #86d5fb !important; }
  130 +.grid-table .radio-cell { width: 32px; text-align: center; }
  131 +.radio-dot { width: 14px; height: 14px; border: 1px solid #b8bcc3; border-radius: 50%; display: inline-block; vertical-align: middle; background: #fff; }
  132 +.radio-dot.checked { background: var(--primary); border-color: var(--primary); box-shadow: inset 0 0 0 3px #fff; }
  133 +.grid-table input.cb { margin: 0; }
  134 +
  135 +.pager { display: flex; align-items: center; gap: 8px; padding: 10px 14px; background: #fff; border-top: 1px solid var(--border); justify-content: flex-end; font-size: 13px; color: #555; flex-shrink: 0; }
  136 +.pager .pgbtn { width: 28px; height: 28px; border: 1px solid #d5d8de; background: #fff; border-radius: 2px; display: inline-flex; align-items: center; justify-content: center; cursor: pointer; color: #666; user-select: none; }
  137 +.pager .pgbtn.disabled { color: #ccc; cursor: not-allowed; }
  138 +.pager .pgcur { width: 28px; height: 28px; border: 1px solid var(--primary); color: var(--primary); display: inline-flex; align-items: center; justify-content: center; border-radius: 2px; }
  139 +.pager select { height: 28px; border: 1px solid #d5d8de; border-radius: 2px; padding: 0 8px; background: #fff; min-width: auto; appearance: auto; background-image: none; }
  140 +
  141 +/* ======= USER DETAIL ======= */
  142 +.form-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0; background: #fff; padding: 10px 14px; border-bottom: 1px solid var(--border); flex-shrink: 0; }
  143 +.form-cell { display: flex; align-items: center; gap: 6px; padding: 8px 10px; }
  144 +.form-cell .lbl { min-width: 88px; color: #333; font-size: 13px; text-align: right; }
  145 +.form-cell .lbl.req::before { content: "*"; color: var(--label); margin-right: 3px; }
  146 +.form-cell .lbl.req { color: var(--label); }
  147 +.form-cell input[type=text], .form-cell .field, .form-cell select.field {
  148 + flex: 1; height: 28px; border: 1px solid #d5d8de; border-radius: 2px; padding: 0 24px 0 10px; background: var(--field-bg);
  149 + appearance: none; min-width: 0; outline: none;
  150 +}
  151 +.form-cell input[type=text]:disabled, .form-cell .field.readonly { background: var(--field-bg-readonly); color: #444; }
  152 +.form-cell .field.readonly { display: flex; align-items: center; }
  153 +.form-cell select.field { background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 10 10'><path d='M2 3l3 4 3-4z' fill='%23888'/></svg>"); background-repeat: no-repeat; background-position: right 8px center; }
  154 +.form-cell .cb { width: 14px; height: 14px; border: 1px solid #b8bcc3; background: #fff; display: inline-block; cursor: pointer; }
  155 +.form-cell .cb.checked { background: var(--primary); border-color: var(--primary); }
  156 +
  157 +.tabs-row { display: flex; background: #fff; border-bottom: 1px solid var(--border); padding: 0 6px; flex-shrink: 0; }
  158 +.tabs-row .tb { padding: 11px 18px; font-size: 14px; color: #444; cursor: pointer; border-bottom: 2px solid transparent; margin-right: 4px; }
  159 +.tabs-row .tb.active { color: var(--tab-active); border-bottom-color: var(--tab-active); }
  160 +
  161 +.perm-list { background: #fff; flex: 1; overflow: auto; }
  162 +.perm-row { display: flex; align-items: center; gap: 14px; padding: 10px 14px; border-bottom: 1px solid var(--border); font-size: 13px; color: #333; cursor: pointer; }
  163 +.perm-row:hover:not(.head) { background: #eaf3fe; }
  164 +.perm-row.head { background: var(--header-bg); font-weight: 500; color: #222; cursor: default; }
  165 +.perm-row .cb { width: 14px; height: 14px; border: 1px solid #b8bcc3; background: #fff; display: inline-block; flex-shrink: 0; }
  166 +.perm-row .cb.checked { background: var(--primary); border-color: var(--primary); }
  167 +
  168 +/* ======= LOGIN ======= */
  169 +.login-wrap { position: absolute; inset: 0; background: #eaedf2; display: flex; flex-direction: column; }
  170 +.login-head { display: flex; align-items: center; gap: 12px; padding: 18px 36px; background: #eaedf2; }
  171 +.login-head .lg { width: 42px; height: 42px; display: flex; align-items: center; justify-content: center; }
  172 +.login-head .name { font-size: 24px; font-weight: 700; color: #e0a020; letter-spacing: 2px; }
  173 +.login-head .sub { color: #444; font-size: 14px; margin-left: 6px; }
  174 +.login-hero { flex: 1; position: relative;
  175 + background: radial-gradient(ellipse at center, #1a4ea0 0%, #0a1d44 60%, #050d20 100%);
  176 + overflow: hidden; }
  177 +.login-hero::before {
  178 + content: ""; position: absolute; inset: 0;
  179 + background-image:
  180 + linear-gradient(rgba(80, 160, 255, .18) 1px, transparent 1px),
  181 + linear-gradient(90deg, rgba(80, 160, 255, .18) 1px, transparent 1px);
  182 + background-size: 80px 80px;
  183 + transform: perspective(800px) rotateX(55deg) translateY(20%);
  184 + transform-origin: center;
  185 + opacity: .55;
  186 +}
  187 +.login-hero::after {
  188 + content: ""; position: absolute; inset: 0;
  189 + background:
  190 + radial-gradient(ellipse 800px 300px at 50% 50%, rgba(140, 200, 255, .35), transparent 60%),
  191 + radial-gradient(circle 200px at 30% 40%, rgba(255, 255, 255, .15), transparent 70%),
  192 + radial-gradient(circle 160px at 70% 60%, rgba(255, 255, 255, .12), transparent 70%);
  193 +}
  194 +.login-text { position: absolute; left: 8%; top: 35%; color: #fff; z-index: 2; }
  195 +.login-text .en { font-size: 30px; font-weight: 300; letter-spacing: 1px; color: #cfe1ff; margin-bottom: 6px; }
  196 +.login-text .zh { font-size: 54px; font-weight: 700; color: #fff; letter-spacing: 4px; margin-bottom: 4px; }
  197 +.login-text .erp { font-size: 90px; font-weight: 800; color: #fff; letter-spacing: 8px; line-height: .9; }
  198 +.login-card { position: absolute; right: 8%; top: 50%; transform: translateY(-50%); background: #fff; width: 380px; padding: 36px 32px; border-radius: 2px; box-shadow: 0 12px 40px rgba(0, 0, 0, .3); z-index: 3; }
  199 +.login-card h3 { margin: 0 0 22px; font-size: 18px; color: #333; font-weight: 500; }
  200 +.login-card .lf { display: flex; align-items: center; border: 1px solid #e1e4e8; border-radius: 2px; height: 42px; margin-bottom: 14px; background: #fff; position: relative; }
  201 +.login-card .lf .ic { width: 42px; display: flex; align-items: center; justify-content: center; color: #888; }
  202 +.login-card .lf .div { width: 1px; height: 20px; background: #e1e4e8; }
  203 +.login-card .lf input { flex: 1; border: none; outline: none; height: 100%; padding: 0 12px; background: transparent; }
  204 +.login-card .lf select { flex: 1; border: none; outline: none; height: 100%; padding: 0 12px; background: transparent; appearance: none; cursor: pointer; }
  205 +.login-card .lf.dropdown::after { content: ""; position: absolute; right: 14px; top: 50%; width: 0; height: 0; border-left: 5px solid transparent; border-right: 5px solid transparent; border-top: 5px solid #888; transform: translateY(-50%); pointer-events: none; }
  206 +.login-card .submit { width: 100%; height: 42px; background: var(--primary); color: #fff; border: none; border-radius: 2px; font-size: 15px; letter-spacing: 8px; cursor: pointer; margin-top: 6px; }
  207 +.login-card .submit:hover:not(:disabled) { background: var(--primary-strong); }
  208 +.login-card .submit:disabled { background: #99b7e0; cursor: not-allowed; }
  209 +.login-card .err { color: var(--danger); font-size: 12px; margin: -8px 0 12px; min-height: 16px; }
  210 +.login-foot { background: #eaedf2; text-align: center; padding: 14px 8px; color: #666; font-size: 12px; border-top: 1px solid #d8dce2; }
  211 +
  212 +.ic { display: inline-flex; align-items: center; justify-content: center; }
  213 +.star { color: #f3b526; }
... ...
frontend/src/styles/tokens.css 0 → 100644
  1 +:root {
  2 + --bg: #f3f4f6;
  3 + --panel: #ffffff;
  4 + --topbar: #1f1f23;
  5 + --topbar-text: #ffffff;
  6 + --primary: #2f7adf;
  7 + --primary-strong: #1f6ed4;
  8 + --link: #1e84e6;
  9 + --text: #333333;
  10 + --text-soft: #555;
  11 + --text-mute: #888;
  12 + --border: #e3e6eb;
  13 + --row-alt: #f7f8fa;
  14 + --header-bg: #f4f5f7;
  15 + --danger: #e34d4d;
  16 + --tab-active: #1e84e6;
  17 + --toolbar-bg: #2c2f36;
  18 + --toolbar-text: #ffffff;
  19 + --label: #f04848;
  20 + --field-bg: #eaf3fe;
  21 + --field-bg-readonly: #f1f3f5;
  22 +}
... ...
frontend/tsconfig.app.json 0 → 100644
  1 +{
  2 + "compilerOptions": {
  3 + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
  4 + "target": "es2023",
  5 + "lib": ["ES2023", "DOM"],
  6 + "module": "esnext",
  7 + "types": ["vite/client"],
  8 + "skipLibCheck": true,
  9 +
  10 + /* Bundler mode */
  11 + "moduleResolution": "bundler",
  12 + "allowImportingTsExtensions": true,
  13 + "verbatimModuleSyntax": true,
  14 + "moduleDetection": "force",
  15 + "noEmit": true,
  16 + "jsx": "react-jsx",
  17 +
  18 + /* Path alias */
  19 + "paths": {
  20 + "@/*": ["./src/*"]
  21 + },
  22 +
  23 + /* Linting */
  24 + "noUnusedLocals": true,
  25 + "noUnusedParameters": true,
  26 + "erasableSyntaxOnly": true,
  27 + "noFallthroughCasesInSwitch": true
  28 + },
  29 + "include": ["src"]
  30 +}
... ...
frontend/tsconfig.json 0 → 100644
  1 +{
  2 + "files": [],
  3 + "references": [
  4 + { "path": "./tsconfig.app.json" },
  5 + { "path": "./tsconfig.node.json" }
  6 + ]
  7 +}
... ...
frontend/tsconfig.node.json 0 → 100644
  1 +{
  2 + "compilerOptions": {
  3 + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
  4 + "target": "es2023",
  5 + "lib": ["ES2023"],
  6 + "module": "esnext",
  7 + "types": ["node"],
  8 + "skipLibCheck": true,
  9 +
  10 + /* Bundler mode */
  11 + "moduleResolution": "bundler",
  12 + "allowImportingTsExtensions": true,
  13 + "verbatimModuleSyntax": true,
  14 + "moduleDetection": "force",
  15 + "noEmit": true,
  16 +
  17 + /* Linting */
  18 + "noUnusedLocals": true,
  19 + "noUnusedParameters": true,
  20 + "erasableSyntaxOnly": true,
  21 + "noFallthroughCasesInSwitch": true
  22 + },
  23 + "include": ["vite.config.ts"]
  24 +}
... ...
frontend/vite.config.ts 0 → 100644
  1 +import { defineConfig } from 'vite'
  2 +import react from '@vitejs/plugin-react'
  3 +import path from 'node:path'
  4 +
  5 +export default defineConfig({
  6 + plugins: [react()],
  7 + resolve: {
  8 + alias: {
  9 + '@': path.resolve(__dirname, 'src'),
  10 + },
  11 + },
  12 + server: {
  13 + port: 5173,
  14 + proxy: {
  15 + '/api': {
  16 + target: 'http://localhost:8080',
  17 + changeOrigin: true,
  18 + },
  19 + },
  20 + },
  21 +})
... ...