Commit 7caeb6c57c1a06dd2534e3206c150c939561f335

Authored by zichun
1 parent 3a50cebe

feat(frontend): build Vite + React + AntD frontend wired to backend

Per docs/04 production stack: Vite + React 18 + TypeScript + AntD 5 +
Redux Toolkit + React Router v6 + Axios. Theme tokens copied from
prototype/XLY-ERP.html so density, colors, and layout match. Pages:
Login, Home, UserList, UserDetail, ModuleConfig — wired to existing
endpoints (/api/usr/auth/login, /api/usr/users, /api/mod/modules).
Backend-unsupported fields (user permission grid, 18 module fields,
iStaffId picker) hidden per scope. Sidebar/MegaNav remain static
reference data; dashboard stats hardcoded (no endpoint).

Too many changes to show.

To preserve performance only 19 of 32 files are displayed.

frontend/.gitignore 0 → 100644
  1 +node_modules
  2 +dist
  3 +dist-ssr
  4 +*.local
  5 +.vite
  6 +.env.local
  7 +tsconfig.tsbuildinfo
  8 +*.tsbuildinfo
frontend/index.html 0 → 100644
  1 +<!doctype html>
  2 +<html lang="zh-CN">
  3 + <head>
  4 + <meta charset="UTF-8" />
  5 + <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6 + <title>XLY-ERP · 印刷制造管理平台</title>
  7 + <link rel="preconnect" href="https://fonts.googleapis.com" />
  8 + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
  9 + <link
  10 + href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap"
  11 + rel="stylesheet"
  12 + />
  13 + </head>
  14 + <body>
  15 + <div id="root"></div>
  16 + <script type="module" src="/src/main.tsx"></script>
  17 + </body>
  18 +</html>
frontend/package-lock.json 0 → 100644
  1 +{
  2 + "name": "xly-erp-frontend",
  3 + "version": "0.0.1",
  4 + "lockfileVersion": 3,
  5 + "requires": true,
  6 + "packages": {
  7 + "": {
  8 + "name": "xly-erp-frontend",
  9 + "version": "0.0.1",
  10 + "dependencies": {
  11 + "@ant-design/icons": "^5.5.1",
  12 + "@reduxjs/toolkit": "^2.2.7",
  13 + "antd": "^5.21.5",
  14 + "axios": "^1.7.7",
  15 + "dayjs": "^1.11.13",
  16 + "react": "^18.3.1",
  17 + "react-dom": "^18.3.1",
  18 + "react-redux": "^9.1.2",
  19 + "react-router-dom": "^6.27.0"
  20 + },
  21 + "devDependencies": {
  22 + "@types/react": "^18.3.12",
  23 + "@types/react-dom": "^18.3.1",
  24 + "@vitejs/plugin-react": "^4.3.3",
  25 + "typescript": "^5.6.3",
  26 + "vite": "^5.4.10"
  27 + }
  28 + },
  29 + "node_modules/@ant-design/colors": {
  30 + "version": "7.2.1",
  31 + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.2.1.tgz",
  32 + "integrity": "sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ==",
  33 + "license": "MIT",
  34 + "dependencies": {
  35 + "@ant-design/fast-color": "^2.0.6"
  36 + }
  37 + },
  38 + "node_modules/@ant-design/cssinjs": {
  39 + "version": "1.24.0",
  40 + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.24.0.tgz",
  41 + "integrity": "sha512-K4cYrJBsgvL+IoozUXYjbT6LHHNt+19a9zkvpBPxLjFHas1UpPM2A5MlhROb0BT8N8WoavM5VsP9MeSeNK/3mg==",
  42 + "license": "MIT",
  43 + "dependencies": {
  44 + "@babel/runtime": "^7.11.1",
  45 + "@emotion/hash": "^0.8.0",
  46 + "@emotion/unitless": "^0.7.5",
  47 + "classnames": "^2.3.1",
  48 + "csstype": "^3.1.3",
  49 + "rc-util": "^5.35.0",
  50 + "stylis": "^4.3.4"
  51 + },
  52 + "peerDependencies": {
  53 + "react": ">=16.0.0",
  54 + "react-dom": ">=16.0.0"
  55 + }
  56 + },
  57 + "node_modules/@ant-design/cssinjs-utils": {
  58 + "version": "1.1.3",
  59 + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-1.1.3.tgz",
  60 + "integrity": "sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==",
  61 + "license": "MIT",
  62 + "dependencies": {
  63 + "@ant-design/cssinjs": "^1.21.0",
  64 + "@babel/runtime": "^7.23.2",
  65 + "rc-util": "^5.38.0"
  66 + },
  67 + "peerDependencies": {
  68 + "react": ">=16.9.0",
  69 + "react-dom": ">=16.9.0"
  70 + }
  71 + },
  72 + "node_modules/@ant-design/fast-color": {
  73 + "version": "2.0.6",
  74 + "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz",
  75 + "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==",
  76 + "license": "MIT",
  77 + "dependencies": {
  78 + "@babel/runtime": "^7.24.7"
  79 + },
  80 + "engines": {
  81 + "node": ">=8.x"
  82 + }
  83 + },
  84 + "node_modules/@ant-design/icons": {
  85 + "version": "5.6.1",
  86 + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.6.1.tgz",
  87 + "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==",
  88 + "license": "MIT",
  89 + "dependencies": {
  90 + "@ant-design/colors": "^7.0.0",
  91 + "@ant-design/icons-svg": "^4.4.0",
  92 + "@babel/runtime": "^7.24.8",
  93 + "classnames": "^2.2.6",
  94 + "rc-util": "^5.31.1"
  95 + },
  96 + "engines": {
  97 + "node": ">=8"
  98 + },
  99 + "peerDependencies": {
  100 + "react": ">=16.0.0",
  101 + "react-dom": ">=16.0.0"
  102 + }
  103 + },
  104 + "node_modules/@ant-design/icons-svg": {
  105 + "version": "4.4.2",
  106 + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz",
  107 + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==",
  108 + "license": "MIT"
  109 + },
  110 + "node_modules/@ant-design/react-slick": {
  111 + "version": "1.1.2",
  112 + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.1.2.tgz",
  113 + "integrity": "sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==",
  114 + "license": "MIT",
  115 + "dependencies": {
  116 + "@babel/runtime": "^7.10.4",
  117 + "classnames": "^2.2.5",
  118 + "json2mq": "^0.2.0",
  119 + "resize-observer-polyfill": "^1.5.1",
  120 + "throttle-debounce": "^5.0.0"
  121 + },
  122 + "peerDependencies": {
  123 + "react": ">=16.9.0"
  124 + }
  125 + },
  126 + "node_modules/@babel/code-frame": {
  127 + "version": "7.29.0",
  128 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
  129 + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
  130 + "dev": true,
  131 + "license": "MIT",
  132 + "dependencies": {
  133 + "@babel/helper-validator-identifier": "^7.28.5",
  134 + "js-tokens": "^4.0.0",
  135 + "picocolors": "^1.1.1"
  136 + },
  137 + "engines": {
  138 + "node": ">=6.9.0"
  139 + }
  140 + },
  141 + "node_modules/@babel/compat-data": {
  142 + "version": "7.29.0",
  143 + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz",
  144 + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==",
  145 + "dev": true,
  146 + "license": "MIT",
  147 + "engines": {
  148 + "node": ">=6.9.0"
  149 + }
  150 + },
  151 + "node_modules/@babel/core": {
  152 + "version": "7.29.0",
  153 + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz",
  154 + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
  155 + "dev": true,
  156 + "license": "MIT",
  157 + "dependencies": {
  158 + "@babel/code-frame": "^7.29.0",
  159 + "@babel/generator": "^7.29.0",
  160 + "@babel/helper-compilation-targets": "^7.28.6",
  161 + "@babel/helper-module-transforms": "^7.28.6",
  162 + "@babel/helpers": "^7.28.6",
  163 + "@babel/parser": "^7.29.0",
  164 + "@babel/template": "^7.28.6",
  165 + "@babel/traverse": "^7.29.0",
  166 + "@babel/types": "^7.29.0",
  167 + "@jridgewell/remapping": "^2.3.5",
  168 + "convert-source-map": "^2.0.0",
  169 + "debug": "^4.1.0",
  170 + "gensync": "^1.0.0-beta.2",
  171 + "json5": "^2.2.3",
  172 + "semver": "^6.3.1"
  173 + },
  174 + "engines": {
  175 + "node": ">=6.9.0"
  176 + },
  177 + "funding": {
  178 + "type": "opencollective",
  179 + "url": "https://opencollective.com/babel"
  180 + }
  181 + },
  182 + "node_modules/@babel/generator": {
  183 + "version": "7.29.1",
  184 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
  185 + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
  186 + "dev": true,
  187 + "license": "MIT",
  188 + "dependencies": {
  189 + "@babel/parser": "^7.29.0",
  190 + "@babel/types": "^7.29.0",
  191 + "@jridgewell/gen-mapping": "^0.3.12",
  192 + "@jridgewell/trace-mapping": "^0.3.28",
  193 + "jsesc": "^3.0.2"
  194 + },
  195 + "engines": {
  196 + "node": ">=6.9.0"
  197 + }
  198 + },
  199 + "node_modules/@babel/helper-compilation-targets": {
  200 + "version": "7.28.6",
  201 + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
  202 + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
  203 + "dev": true,
  204 + "license": "MIT",
  205 + "dependencies": {
  206 + "@babel/compat-data": "^7.28.6",
  207 + "@babel/helper-validator-option": "^7.27.1",
  208 + "browserslist": "^4.24.0",
  209 + "lru-cache": "^5.1.1",
  210 + "semver": "^6.3.1"
  211 + },
  212 + "engines": {
  213 + "node": ">=6.9.0"
  214 + }
  215 + },
  216 + "node_modules/@babel/helper-globals": {
  217 + "version": "7.28.0",
  218 + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
  219 + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
  220 + "dev": true,
  221 + "license": "MIT",
  222 + "engines": {
  223 + "node": ">=6.9.0"
  224 + }
  225 + },
  226 + "node_modules/@babel/helper-module-imports": {
  227 + "version": "7.28.6",
  228 + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
  229 + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
  230 + "dev": true,
  231 + "license": "MIT",
  232 + "dependencies": {
  233 + "@babel/traverse": "^7.28.6",
  234 + "@babel/types": "^7.28.6"
  235 + },
  236 + "engines": {
  237 + "node": ">=6.9.0"
  238 + }
  239 + },
  240 + "node_modules/@babel/helper-module-transforms": {
  241 + "version": "7.28.6",
  242 + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
  243 + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
  244 + "dev": true,
  245 + "license": "MIT",
  246 + "dependencies": {
  247 + "@babel/helper-module-imports": "^7.28.6",
  248 + "@babel/helper-validator-identifier": "^7.28.5",
  249 + "@babel/traverse": "^7.28.6"
  250 + },
  251 + "engines": {
  252 + "node": ">=6.9.0"
  253 + },
  254 + "peerDependencies": {
  255 + "@babel/core": "^7.0.0"
  256 + }
  257 + },
  258 + "node_modules/@babel/helper-plugin-utils": {
  259 + "version": "7.28.6",
  260 + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz",
  261 + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==",
  262 + "dev": true,
  263 + "license": "MIT",
  264 + "engines": {
  265 + "node": ">=6.9.0"
  266 + }
  267 + },
  268 + "node_modules/@babel/helper-string-parser": {
  269 + "version": "7.27.1",
  270 + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
  271 + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
  272 + "dev": true,
  273 + "license": "MIT",
  274 + "engines": {
  275 + "node": ">=6.9.0"
  276 + }
  277 + },
  278 + "node_modules/@babel/helper-validator-identifier": {
  279 + "version": "7.28.5",
  280 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
  281 + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
  282 + "dev": true,
  283 + "license": "MIT",
  284 + "engines": {
  285 + "node": ">=6.9.0"
  286 + }
  287 + },
  288 + "node_modules/@babel/helper-validator-option": {
  289 + "version": "7.27.1",
  290 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
  291 + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
  292 + "dev": true,
  293 + "license": "MIT",
  294 + "engines": {
  295 + "node": ">=6.9.0"
  296 + }
  297 + },
  298 + "node_modules/@babel/helpers": {
  299 + "version": "7.29.2",
  300 + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz",
  301 + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==",
  302 + "dev": true,
  303 + "license": "MIT",
  304 + "dependencies": {
  305 + "@babel/template": "^7.28.6",
  306 + "@babel/types": "^7.29.0"
  307 + },
  308 + "engines": {
  309 + "node": ">=6.9.0"
  310 + }
  311 + },
  312 + "node_modules/@babel/parser": {
  313 + "version": "7.29.2",
  314 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz",
  315 + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==",
  316 + "dev": true,
  317 + "license": "MIT",
  318 + "dependencies": {
  319 + "@babel/types": "^7.29.0"
  320 + },
  321 + "bin": {
  322 + "parser": "bin/babel-parser.js"
  323 + },
  324 + "engines": {
  325 + "node": ">=6.0.0"
  326 + }
  327 + },
  328 + "node_modules/@babel/plugin-transform-react-jsx-self": {
  329 + "version": "7.27.1",
  330 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
  331 + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
  332 + "dev": true,
  333 + "license": "MIT",
  334 + "dependencies": {
  335 + "@babel/helper-plugin-utils": "^7.27.1"
  336 + },
  337 + "engines": {
  338 + "node": ">=6.9.0"
  339 + },
  340 + "peerDependencies": {
  341 + "@babel/core": "^7.0.0-0"
  342 + }
  343 + },
  344 + "node_modules/@babel/plugin-transform-react-jsx-source": {
  345 + "version": "7.27.1",
  346 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
  347 + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
  348 + "dev": true,
  349 + "license": "MIT",
  350 + "dependencies": {
  351 + "@babel/helper-plugin-utils": "^7.27.1"
  352 + },
  353 + "engines": {
  354 + "node": ">=6.9.0"
  355 + },
  356 + "peerDependencies": {
  357 + "@babel/core": "^7.0.0-0"
  358 + }
  359 + },
  360 + "node_modules/@babel/runtime": {
  361 + "version": "7.29.2",
  362 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
  363 + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
  364 + "license": "MIT",
  365 + "engines": {
  366 + "node": ">=6.9.0"
  367 + }
  368 + },
  369 + "node_modules/@babel/template": {
  370 + "version": "7.28.6",
  371 + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
  372 + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
  373 + "dev": true,
  374 + "license": "MIT",
  375 + "dependencies": {
  376 + "@babel/code-frame": "^7.28.6",
  377 + "@babel/parser": "^7.28.6",
  378 + "@babel/types": "^7.28.6"
  379 + },
  380 + "engines": {
  381 + "node": ">=6.9.0"
  382 + }
  383 + },
  384 + "node_modules/@babel/traverse": {
  385 + "version": "7.29.0",
  386 + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
  387 + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
  388 + "dev": true,
  389 + "license": "MIT",
  390 + "dependencies": {
  391 + "@babel/code-frame": "^7.29.0",
  392 + "@babel/generator": "^7.29.0",
  393 + "@babel/helper-globals": "^7.28.0",
  394 + "@babel/parser": "^7.29.0",
  395 + "@babel/template": "^7.28.6",
  396 + "@babel/types": "^7.29.0",
  397 + "debug": "^4.3.1"
  398 + },
  399 + "engines": {
  400 + "node": ">=6.9.0"
  401 + }
  402 + },
  403 + "node_modules/@babel/types": {
  404 + "version": "7.29.0",
  405 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
  406 + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
  407 + "dev": true,
  408 + "license": "MIT",
  409 + "dependencies": {
  410 + "@babel/helper-string-parser": "^7.27.1",
  411 + "@babel/helper-validator-identifier": "^7.28.5"
  412 + },
  413 + "engines": {
  414 + "node": ">=6.9.0"
  415 + }
  416 + },
  417 + "node_modules/@emotion/hash": {
  418 + "version": "0.8.0",
  419 + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
  420 + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==",
  421 + "license": "MIT"
  422 + },
  423 + "node_modules/@emotion/unitless": {
  424 + "version": "0.7.5",
  425 + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
  426 + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==",
  427 + "license": "MIT"
  428 + },
  429 + "node_modules/@esbuild/aix-ppc64": {
  430 + "version": "0.21.5",
  431 + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
  432 + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
  433 + "cpu": [
  434 + "ppc64"
  435 + ],
  436 + "dev": true,
  437 + "license": "MIT",
  438 + "optional": true,
  439 + "os": [
  440 + "aix"
  441 + ],
  442 + "engines": {
  443 + "node": ">=12"
  444 + }
  445 + },
  446 + "node_modules/@esbuild/android-arm": {
  447 + "version": "0.21.5",
  448 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
  449 + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
  450 + "cpu": [
  451 + "arm"
  452 + ],
  453 + "dev": true,
  454 + "license": "MIT",
  455 + "optional": true,
  456 + "os": [
  457 + "android"
  458 + ],
  459 + "engines": {
  460 + "node": ">=12"
  461 + }
  462 + },
  463 + "node_modules/@esbuild/android-arm64": {
  464 + "version": "0.21.5",
  465 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
  466 + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
  467 + "cpu": [
  468 + "arm64"
  469 + ],
  470 + "dev": true,
  471 + "license": "MIT",
  472 + "optional": true,
  473 + "os": [
  474 + "android"
  475 + ],
  476 + "engines": {
  477 + "node": ">=12"
  478 + }
  479 + },
  480 + "node_modules/@esbuild/android-x64": {
  481 + "version": "0.21.5",
  482 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
  483 + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
  484 + "cpu": [
  485 + "x64"
  486 + ],
  487 + "dev": true,
  488 + "license": "MIT",
  489 + "optional": true,
  490 + "os": [
  491 + "android"
  492 + ],
  493 + "engines": {
  494 + "node": ">=12"
  495 + }
  496 + },
  497 + "node_modules/@esbuild/darwin-arm64": {
  498 + "version": "0.21.5",
  499 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
  500 + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
  501 + "cpu": [
  502 + "arm64"
  503 + ],
  504 + "dev": true,
  505 + "license": "MIT",
  506 + "optional": true,
  507 + "os": [
  508 + "darwin"
  509 + ],
  510 + "engines": {
  511 + "node": ">=12"
  512 + }
  513 + },
  514 + "node_modules/@esbuild/darwin-x64": {
  515 + "version": "0.21.5",
  516 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
  517 + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
  518 + "cpu": [
  519 + "x64"
  520 + ],
  521 + "dev": true,
  522 + "license": "MIT",
  523 + "optional": true,
  524 + "os": [
  525 + "darwin"
  526 + ],
  527 + "engines": {
  528 + "node": ">=12"
  529 + }
  530 + },
  531 + "node_modules/@esbuild/freebsd-arm64": {
  532 + "version": "0.21.5",
  533 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
  534 + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
  535 + "cpu": [
  536 + "arm64"
  537 + ],
  538 + "dev": true,
  539 + "license": "MIT",
  540 + "optional": true,
  541 + "os": [
  542 + "freebsd"
  543 + ],
  544 + "engines": {
  545 + "node": ">=12"
  546 + }
  547 + },
  548 + "node_modules/@esbuild/freebsd-x64": {
  549 + "version": "0.21.5",
  550 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
  551 + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
  552 + "cpu": [
  553 + "x64"
  554 + ],
  555 + "dev": true,
  556 + "license": "MIT",
  557 + "optional": true,
  558 + "os": [
  559 + "freebsd"
  560 + ],
  561 + "engines": {
  562 + "node": ">=12"
  563 + }
  564 + },
  565 + "node_modules/@esbuild/linux-arm": {
  566 + "version": "0.21.5",
  567 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
  568 + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
  569 + "cpu": [
  570 + "arm"
  571 + ],
  572 + "dev": true,
  573 + "license": "MIT",
  574 + "optional": true,
  575 + "os": [
  576 + "linux"
  577 + ],
  578 + "engines": {
  579 + "node": ">=12"
  580 + }
  581 + },
  582 + "node_modules/@esbuild/linux-arm64": {
  583 + "version": "0.21.5",
  584 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
  585 + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
  586 + "cpu": [
  587 + "arm64"
  588 + ],
  589 + "dev": true,
  590 + "license": "MIT",
  591 + "optional": true,
  592 + "os": [
  593 + "linux"
  594 + ],
  595 + "engines": {
  596 + "node": ">=12"
  597 + }
  598 + },
  599 + "node_modules/@esbuild/linux-ia32": {
  600 + "version": "0.21.5",
  601 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
  602 + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
  603 + "cpu": [
  604 + "ia32"
  605 + ],
  606 + "dev": true,
  607 + "license": "MIT",
  608 + "optional": true,
  609 + "os": [
  610 + "linux"
  611 + ],
  612 + "engines": {
  613 + "node": ">=12"
  614 + }
  615 + },
  616 + "node_modules/@esbuild/linux-loong64": {
  617 + "version": "0.21.5",
  618 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
  619 + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
  620 + "cpu": [
  621 + "loong64"
  622 + ],
  623 + "dev": true,
  624 + "license": "MIT",
  625 + "optional": true,
  626 + "os": [
  627 + "linux"
  628 + ],
  629 + "engines": {
  630 + "node": ">=12"
  631 + }
  632 + },
  633 + "node_modules/@esbuild/linux-mips64el": {
  634 + "version": "0.21.5",
  635 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
  636 + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
  637 + "cpu": [
  638 + "mips64el"
  639 + ],
  640 + "dev": true,
  641 + "license": "MIT",
  642 + "optional": true,
  643 + "os": [
  644 + "linux"
  645 + ],
  646 + "engines": {
  647 + "node": ">=12"
  648 + }
  649 + },
  650 + "node_modules/@esbuild/linux-ppc64": {
  651 + "version": "0.21.5",
  652 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
  653 + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
  654 + "cpu": [
  655 + "ppc64"
  656 + ],
  657 + "dev": true,
  658 + "license": "MIT",
  659 + "optional": true,
  660 + "os": [
  661 + "linux"
  662 + ],
  663 + "engines": {
  664 + "node": ">=12"
  665 + }
  666 + },
  667 + "node_modules/@esbuild/linux-riscv64": {
  668 + "version": "0.21.5",
  669 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
  670 + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
  671 + "cpu": [
  672 + "riscv64"
  673 + ],
  674 + "dev": true,
  675 + "license": "MIT",
  676 + "optional": true,
  677 + "os": [
  678 + "linux"
  679 + ],
  680 + "engines": {
  681 + "node": ">=12"
  682 + }
  683 + },
  684 + "node_modules/@esbuild/linux-s390x": {
  685 + "version": "0.21.5",
  686 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
  687 + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
  688 + "cpu": [
  689 + "s390x"
  690 + ],
  691 + "dev": true,
  692 + "license": "MIT",
  693 + "optional": true,
  694 + "os": [
  695 + "linux"
  696 + ],
  697 + "engines": {
  698 + "node": ">=12"
  699 + }
  700 + },
  701 + "node_modules/@esbuild/linux-x64": {
  702 + "version": "0.21.5",
  703 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
  704 + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
  705 + "cpu": [
  706 + "x64"
  707 + ],
  708 + "dev": true,
  709 + "license": "MIT",
  710 + "optional": true,
  711 + "os": [
  712 + "linux"
  713 + ],
  714 + "engines": {
  715 + "node": ">=12"
  716 + }
  717 + },
  718 + "node_modules/@esbuild/netbsd-x64": {
  719 + "version": "0.21.5",
  720 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
  721 + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
  722 + "cpu": [
  723 + "x64"
  724 + ],
  725 + "dev": true,
  726 + "license": "MIT",
  727 + "optional": true,
  728 + "os": [
  729 + "netbsd"
  730 + ],
  731 + "engines": {
  732 + "node": ">=12"
  733 + }
  734 + },
  735 + "node_modules/@esbuild/openbsd-x64": {
  736 + "version": "0.21.5",
  737 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
  738 + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
  739 + "cpu": [
  740 + "x64"
  741 + ],
  742 + "dev": true,
  743 + "license": "MIT",
  744 + "optional": true,
  745 + "os": [
  746 + "openbsd"
  747 + ],
  748 + "engines": {
  749 + "node": ">=12"
  750 + }
  751 + },
  752 + "node_modules/@esbuild/sunos-x64": {
  753 + "version": "0.21.5",
  754 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
  755 + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
  756 + "cpu": [
  757 + "x64"
  758 + ],
  759 + "dev": true,
  760 + "license": "MIT",
  761 + "optional": true,
  762 + "os": [
  763 + "sunos"
  764 + ],
  765 + "engines": {
  766 + "node": ">=12"
  767 + }
  768 + },
  769 + "node_modules/@esbuild/win32-arm64": {
  770 + "version": "0.21.5",
  771 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
  772 + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
  773 + "cpu": [
  774 + "arm64"
  775 + ],
  776 + "dev": true,
  777 + "license": "MIT",
  778 + "optional": true,
  779 + "os": [
  780 + "win32"
  781 + ],
  782 + "engines": {
  783 + "node": ">=12"
  784 + }
  785 + },
  786 + "node_modules/@esbuild/win32-ia32": {
  787 + "version": "0.21.5",
  788 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
  789 + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
  790 + "cpu": [
  791 + "ia32"
  792 + ],
  793 + "dev": true,
  794 + "license": "MIT",
  795 + "optional": true,
  796 + "os": [
  797 + "win32"
  798 + ],
  799 + "engines": {
  800 + "node": ">=12"
  801 + }
  802 + },
  803 + "node_modules/@esbuild/win32-x64": {
  804 + "version": "0.21.5",
  805 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
  806 + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
  807 + "cpu": [
  808 + "x64"
  809 + ],
  810 + "dev": true,
  811 + "license": "MIT",
  812 + "optional": true,
  813 + "os": [
  814 + "win32"
  815 + ],
  816 + "engines": {
  817 + "node": ">=12"
  818 + }
  819 + },
  820 + "node_modules/@jridgewell/gen-mapping": {
  821 + "version": "0.3.13",
  822 + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
  823 + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
  824 + "dev": true,
  825 + "license": "MIT",
  826 + "dependencies": {
  827 + "@jridgewell/sourcemap-codec": "^1.5.0",
  828 + "@jridgewell/trace-mapping": "^0.3.24"
  829 + }
  830 + },
  831 + "node_modules/@jridgewell/remapping": {
  832 + "version": "2.3.5",
  833 + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
  834 + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
  835 + "dev": true,
  836 + "license": "MIT",
  837 + "dependencies": {
  838 + "@jridgewell/gen-mapping": "^0.3.5",
  839 + "@jridgewell/trace-mapping": "^0.3.24"
  840 + }
  841 + },
  842 + "node_modules/@jridgewell/resolve-uri": {
  843 + "version": "3.1.2",
  844 + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
  845 + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
  846 + "dev": true,
  847 + "license": "MIT",
  848 + "engines": {
  849 + "node": ">=6.0.0"
  850 + }
  851 + },
  852 + "node_modules/@jridgewell/sourcemap-codec": {
  853 + "version": "1.5.5",
  854 + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
  855 + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
  856 + "dev": true,
  857 + "license": "MIT"
  858 + },
  859 + "node_modules/@jridgewell/trace-mapping": {
  860 + "version": "0.3.31",
  861 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
  862 + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
  863 + "dev": true,
  864 + "license": "MIT",
  865 + "dependencies": {
  866 + "@jridgewell/resolve-uri": "^3.1.0",
  867 + "@jridgewell/sourcemap-codec": "^1.4.14"
  868 + }
  869 + },
  870 + "node_modules/@rc-component/async-validator": {
  871 + "version": "5.1.0",
  872 + "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.1.0.tgz",
  873 + "integrity": "sha512-n4HcR5siNUXRX23nDizbZBQPO0ZM/5oTtmKZ6/eqL0L2bo747cklFdZGRN2f+c9qWGICwDzrhW0H7tE9PptdcA==",
  874 + "license": "MIT",
  875 + "dependencies": {
  876 + "@babel/runtime": "^7.24.4"
  877 + },
  878 + "engines": {
  879 + "node": ">=14.x"
  880 + }
  881 + },
  882 + "node_modules/@rc-component/color-picker": {
  883 + "version": "2.0.1",
  884 + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-2.0.1.tgz",
  885 + "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==",
  886 + "license": "MIT",
  887 + "dependencies": {
  888 + "@ant-design/fast-color": "^2.0.6",
  889 + "@babel/runtime": "^7.23.6",
  890 + "classnames": "^2.2.6",
  891 + "rc-util": "^5.38.1"
  892 + },
  893 + "peerDependencies": {
  894 + "react": ">=16.9.0",
  895 + "react-dom": ">=16.9.0"
  896 + }
  897 + },
  898 + "node_modules/@rc-component/context": {
  899 + "version": "1.4.0",
  900 + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz",
  901 + "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==",
  902 + "license": "MIT",
  903 + "dependencies": {
  904 + "@babel/runtime": "^7.10.1",
  905 + "rc-util": "^5.27.0"
  906 + },
  907 + "peerDependencies": {
  908 + "react": ">=16.9.0",
  909 + "react-dom": ">=16.9.0"
  910 + }
  911 + },
  912 + "node_modules/@rc-component/mini-decimal": {
  913 + "version": "1.1.3",
  914 + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.3.tgz",
  915 + "integrity": "sha512-bk/FJ09fLf+NLODMAFll6CfYrHPBioTedhW6lxDBuuWucJEqFUd4l/D/5JgIi3dina6sYahB8iuPAZTNz2pMxw==",
  916 + "license": "MIT",
  917 + "dependencies": {
  918 + "@babel/runtime": "^7.18.0"
  919 + },
  920 + "engines": {
  921 + "node": ">=8.x"
  922 + }
  923 + },
  924 + "node_modules/@rc-component/mutate-observer": {
  925 + "version": "1.1.0",
  926 + "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz",
  927 + "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==",
  928 + "license": "MIT",
  929 + "dependencies": {
  930 + "@babel/runtime": "^7.18.0",
  931 + "classnames": "^2.3.2",
  932 + "rc-util": "^5.24.4"
  933 + },
  934 + "engines": {
  935 + "node": ">=8.x"
  936 + },
  937 + "peerDependencies": {
  938 + "react": ">=16.9.0",
  939 + "react-dom": ">=16.9.0"
  940 + }
  941 + },
  942 + "node_modules/@rc-component/portal": {
  943 + "version": "1.1.2",
  944 + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz",
  945 + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==",
  946 + "license": "MIT",
  947 + "dependencies": {
  948 + "@babel/runtime": "^7.18.0",
  949 + "classnames": "^2.3.2",
  950 + "rc-util": "^5.24.4"
  951 + },
  952 + "engines": {
  953 + "node": ">=8.x"
  954 + },
  955 + "peerDependencies": {
  956 + "react": ">=16.9.0",
  957 + "react-dom": ">=16.9.0"
  958 + }
  959 + },
  960 + "node_modules/@rc-component/qrcode": {
  961 + "version": "1.1.1",
  962 + "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.1.1.tgz",
  963 + "integrity": "sha512-LfLGNymzKdUPjXUbRP+xOhIWY4jQ+YMj5MmWAcgcAq1Ij8XP7tRmAXqyuv96XvLUBE/5cA8hLFl9eO1JQMujrA==",
  964 + "license": "MIT",
  965 + "dependencies": {
  966 + "@babel/runtime": "^7.24.7"
  967 + },
  968 + "engines": {
  969 + "node": ">=8.x"
  970 + },
  971 + "peerDependencies": {
  972 + "react": ">=16.9.0",
  973 + "react-dom": ">=16.9.0"
  974 + }
  975 + },
  976 + "node_modules/@rc-component/tour": {
  977 + "version": "1.15.1",
  978 + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.15.1.tgz",
  979 + "integrity": "sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==",
  980 + "license": "MIT",
  981 + "dependencies": {
  982 + "@babel/runtime": "^7.18.0",
  983 + "@rc-component/portal": "^1.0.0-9",
  984 + "@rc-component/trigger": "^2.0.0",
  985 + "classnames": "^2.3.2",
  986 + "rc-util": "^5.24.4"
  987 + },
  988 + "engines": {
  989 + "node": ">=8.x"
  990 + },
  991 + "peerDependencies": {
  992 + "react": ">=16.9.0",
  993 + "react-dom": ">=16.9.0"
  994 + }
  995 + },
  996 + "node_modules/@rc-component/trigger": {
  997 + "version": "2.3.1",
  998 + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.3.1.tgz",
  999 + "integrity": "sha512-ORENF39PeXTzM+gQEshuk460Z8N4+6DkjpxlpE7Q3gYy1iBpLrx0FOJz3h62ryrJZ/3zCAUIkT1Pb/8hHWpb3A==",
  1000 + "license": "MIT",
  1001 + "dependencies": {
  1002 + "@babel/runtime": "^7.23.2",
  1003 + "@rc-component/portal": "^1.1.0",
  1004 + "classnames": "^2.3.2",
  1005 + "rc-motion": "^2.0.0",
  1006 + "rc-resize-observer": "^1.3.1",
  1007 + "rc-util": "^5.44.0"
  1008 + },
  1009 + "engines": {
  1010 + "node": ">=8.x"
  1011 + },
  1012 + "peerDependencies": {
  1013 + "react": ">=16.9.0",
  1014 + "react-dom": ">=16.9.0"
  1015 + }
  1016 + },
  1017 + "node_modules/@reduxjs/toolkit": {
  1018 + "version": "2.11.2",
  1019 + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz",
  1020 + "integrity": "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==",
  1021 + "license": "MIT",
  1022 + "dependencies": {
  1023 + "@standard-schema/spec": "^1.0.0",
  1024 + "@standard-schema/utils": "^0.3.0",
  1025 + "immer": "^11.0.0",
  1026 + "redux": "^5.0.1",
  1027 + "redux-thunk": "^3.1.0",
  1028 + "reselect": "^5.1.0"
  1029 + },
  1030 + "peerDependencies": {
  1031 + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19",
  1032 + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0"
  1033 + },
  1034 + "peerDependenciesMeta": {
  1035 + "react": {
  1036 + "optional": true
  1037 + },
  1038 + "react-redux": {
  1039 + "optional": true
  1040 + }
  1041 + }
  1042 + },
  1043 + "node_modules/@remix-run/router": {
  1044 + "version": "1.23.2",
  1045 + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz",
  1046 + "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==",
  1047 + "license": "MIT",
  1048 + "engines": {
  1049 + "node": ">=14.0.0"
  1050 + }
  1051 + },
  1052 + "node_modules/@rolldown/pluginutils": {
  1053 + "version": "1.0.0-beta.27",
  1054 + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
  1055 + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==",
  1056 + "dev": true,
  1057 + "license": "MIT"
  1058 + },
  1059 + "node_modules/@rollup/rollup-android-arm-eabi": {
  1060 + "version": "4.60.2",
  1061 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz",
  1062 + "integrity": "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==",
  1063 + "cpu": [
  1064 + "arm"
  1065 + ],
  1066 + "dev": true,
  1067 + "license": "MIT",
  1068 + "optional": true,
  1069 + "os": [
  1070 + "android"
  1071 + ]
  1072 + },
  1073 + "node_modules/@rollup/rollup-android-arm64": {
  1074 + "version": "4.60.2",
  1075 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz",
  1076 + "integrity": "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==",
  1077 + "cpu": [
  1078 + "arm64"
  1079 + ],
  1080 + "dev": true,
  1081 + "license": "MIT",
  1082 + "optional": true,
  1083 + "os": [
  1084 + "android"
  1085 + ]
  1086 + },
  1087 + "node_modules/@rollup/rollup-darwin-arm64": {
  1088 + "version": "4.60.2",
  1089 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz",
  1090 + "integrity": "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==",
  1091 + "cpu": [
  1092 + "arm64"
  1093 + ],
  1094 + "dev": true,
  1095 + "license": "MIT",
  1096 + "optional": true,
  1097 + "os": [
  1098 + "darwin"
  1099 + ]
  1100 + },
  1101 + "node_modules/@rollup/rollup-darwin-x64": {
  1102 + "version": "4.60.2",
  1103 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz",
  1104 + "integrity": "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==",
  1105 + "cpu": [
  1106 + "x64"
  1107 + ],
  1108 + "dev": true,
  1109 + "license": "MIT",
  1110 + "optional": true,
  1111 + "os": [
  1112 + "darwin"
  1113 + ]
  1114 + },
  1115 + "node_modules/@rollup/rollup-freebsd-arm64": {
  1116 + "version": "4.60.2",
  1117 + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz",
  1118 + "integrity": "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==",
  1119 + "cpu": [
  1120 + "arm64"
  1121 + ],
  1122 + "dev": true,
  1123 + "license": "MIT",
  1124 + "optional": true,
  1125 + "os": [
  1126 + "freebsd"
  1127 + ]
  1128 + },
  1129 + "node_modules/@rollup/rollup-freebsd-x64": {
  1130 + "version": "4.60.2",
  1131 + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz",
  1132 + "integrity": "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==",
  1133 + "cpu": [
  1134 + "x64"
  1135 + ],
  1136 + "dev": true,
  1137 + "license": "MIT",
  1138 + "optional": true,
  1139 + "os": [
  1140 + "freebsd"
  1141 + ]
  1142 + },
  1143 + "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
  1144 + "version": "4.60.2",
  1145 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz",
  1146 + "integrity": "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==",
  1147 + "cpu": [
  1148 + "arm"
  1149 + ],
  1150 + "dev": true,
  1151 + "libc": [
  1152 + "glibc"
  1153 + ],
  1154 + "license": "MIT",
  1155 + "optional": true,
  1156 + "os": [
  1157 + "linux"
  1158 + ]
  1159 + },
  1160 + "node_modules/@rollup/rollup-linux-arm-musleabihf": {
  1161 + "version": "4.60.2",
  1162 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz",
  1163 + "integrity": "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==",
  1164 + "cpu": [
  1165 + "arm"
  1166 + ],
  1167 + "dev": true,
  1168 + "libc": [
  1169 + "musl"
  1170 + ],
  1171 + "license": "MIT",
  1172 + "optional": true,
  1173 + "os": [
  1174 + "linux"
  1175 + ]
  1176 + },
  1177 + "node_modules/@rollup/rollup-linux-arm64-gnu": {
  1178 + "version": "4.60.2",
  1179 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz",
  1180 + "integrity": "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==",
  1181 + "cpu": [
  1182 + "arm64"
  1183 + ],
  1184 + "dev": true,
  1185 + "libc": [
  1186 + "glibc"
  1187 + ],
  1188 + "license": "MIT",
  1189 + "optional": true,
  1190 + "os": [
  1191 + "linux"
  1192 + ]
  1193 + },
  1194 + "node_modules/@rollup/rollup-linux-arm64-musl": {
  1195 + "version": "4.60.2",
  1196 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz",
  1197 + "integrity": "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==",
  1198 + "cpu": [
  1199 + "arm64"
  1200 + ],
  1201 + "dev": true,
  1202 + "libc": [
  1203 + "musl"
  1204 + ],
  1205 + "license": "MIT",
  1206 + "optional": true,
  1207 + "os": [
  1208 + "linux"
  1209 + ]
  1210 + },
  1211 + "node_modules/@rollup/rollup-linux-loong64-gnu": {
  1212 + "version": "4.60.2",
  1213 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz",
  1214 + "integrity": "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==",
  1215 + "cpu": [
  1216 + "loong64"
  1217 + ],
  1218 + "dev": true,
  1219 + "libc": [
  1220 + "glibc"
  1221 + ],
  1222 + "license": "MIT",
  1223 + "optional": true,
  1224 + "os": [
  1225 + "linux"
  1226 + ]
  1227 + },
  1228 + "node_modules/@rollup/rollup-linux-loong64-musl": {
  1229 + "version": "4.60.2",
  1230 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz",
  1231 + "integrity": "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==",
  1232 + "cpu": [
  1233 + "loong64"
  1234 + ],
  1235 + "dev": true,
  1236 + "libc": [
  1237 + "musl"
  1238 + ],
  1239 + "license": "MIT",
  1240 + "optional": true,
  1241 + "os": [
  1242 + "linux"
  1243 + ]
  1244 + },
  1245 + "node_modules/@rollup/rollup-linux-ppc64-gnu": {
  1246 + "version": "4.60.2",
  1247 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz",
  1248 + "integrity": "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==",
  1249 + "cpu": [
  1250 + "ppc64"
  1251 + ],
  1252 + "dev": true,
  1253 + "libc": [
  1254 + "glibc"
  1255 + ],
  1256 + "license": "MIT",
  1257 + "optional": true,
  1258 + "os": [
  1259 + "linux"
  1260 + ]
  1261 + },
  1262 + "node_modules/@rollup/rollup-linux-ppc64-musl": {
  1263 + "version": "4.60.2",
  1264 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz",
  1265 + "integrity": "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==",
  1266 + "cpu": [
  1267 + "ppc64"
  1268 + ],
  1269 + "dev": true,
  1270 + "libc": [
  1271 + "musl"
  1272 + ],
  1273 + "license": "MIT",
  1274 + "optional": true,
  1275 + "os": [
  1276 + "linux"
  1277 + ]
  1278 + },
  1279 + "node_modules/@rollup/rollup-linux-riscv64-gnu": {
  1280 + "version": "4.60.2",
  1281 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz",
  1282 + "integrity": "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==",
  1283 + "cpu": [
  1284 + "riscv64"
  1285 + ],
  1286 + "dev": true,
  1287 + "libc": [
  1288 + "glibc"
  1289 + ],
  1290 + "license": "MIT",
  1291 + "optional": true,
  1292 + "os": [
  1293 + "linux"
  1294 + ]
  1295 + },
  1296 + "node_modules/@rollup/rollup-linux-riscv64-musl": {
  1297 + "version": "4.60.2",
  1298 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz",
  1299 + "integrity": "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==",
  1300 + "cpu": [
  1301 + "riscv64"
  1302 + ],
  1303 + "dev": true,
  1304 + "libc": [
  1305 + "musl"
  1306 + ],
  1307 + "license": "MIT",
  1308 + "optional": true,
  1309 + "os": [
  1310 + "linux"
  1311 + ]
  1312 + },
  1313 + "node_modules/@rollup/rollup-linux-s390x-gnu": {
  1314 + "version": "4.60.2",
  1315 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz",
  1316 + "integrity": "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==",
  1317 + "cpu": [
  1318 + "s390x"
  1319 + ],
  1320 + "dev": true,
  1321 + "libc": [
  1322 + "glibc"
  1323 + ],
  1324 + "license": "MIT",
  1325 + "optional": true,
  1326 + "os": [
  1327 + "linux"
  1328 + ]
  1329 + },
  1330 + "node_modules/@rollup/rollup-linux-x64-gnu": {
  1331 + "version": "4.60.2",
  1332 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz",
  1333 + "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==",
  1334 + "cpu": [
  1335 + "x64"
  1336 + ],
  1337 + "dev": true,
  1338 + "libc": [
  1339 + "glibc"
  1340 + ],
  1341 + "license": "MIT",
  1342 + "optional": true,
  1343 + "os": [
  1344 + "linux"
  1345 + ]
  1346 + },
  1347 + "node_modules/@rollup/rollup-linux-x64-musl": {
  1348 + "version": "4.60.2",
  1349 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz",
  1350 + "integrity": "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==",
  1351 + "cpu": [
  1352 + "x64"
  1353 + ],
  1354 + "dev": true,
  1355 + "libc": [
  1356 + "musl"
  1357 + ],
  1358 + "license": "MIT",
  1359 + "optional": true,
  1360 + "os": [
  1361 + "linux"
  1362 + ]
  1363 + },
  1364 + "node_modules/@rollup/rollup-openbsd-x64": {
  1365 + "version": "4.60.2",
  1366 + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz",
  1367 + "integrity": "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==",
  1368 + "cpu": [
  1369 + "x64"
  1370 + ],
  1371 + "dev": true,
  1372 + "license": "MIT",
  1373 + "optional": true,
  1374 + "os": [
  1375 + "openbsd"
  1376 + ]
  1377 + },
  1378 + "node_modules/@rollup/rollup-openharmony-arm64": {
  1379 + "version": "4.60.2",
  1380 + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz",
  1381 + "integrity": "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==",
  1382 + "cpu": [
  1383 + "arm64"
  1384 + ],
  1385 + "dev": true,
  1386 + "license": "MIT",
  1387 + "optional": true,
  1388 + "os": [
  1389 + "openharmony"
  1390 + ]
  1391 + },
  1392 + "node_modules/@rollup/rollup-win32-arm64-msvc": {
  1393 + "version": "4.60.2",
  1394 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz",
  1395 + "integrity": "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==",
  1396 + "cpu": [
  1397 + "arm64"
  1398 + ],
  1399 + "dev": true,
  1400 + "license": "MIT",
  1401 + "optional": true,
  1402 + "os": [
  1403 + "win32"
  1404 + ]
  1405 + },
  1406 + "node_modules/@rollup/rollup-win32-ia32-msvc": {
  1407 + "version": "4.60.2",
  1408 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz",
  1409 + "integrity": "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==",
  1410 + "cpu": [
  1411 + "ia32"
  1412 + ],
  1413 + "dev": true,
  1414 + "license": "MIT",
  1415 + "optional": true,
  1416 + "os": [
  1417 + "win32"
  1418 + ]
  1419 + },
  1420 + "node_modules/@rollup/rollup-win32-x64-gnu": {
  1421 + "version": "4.60.2",
  1422 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz",
  1423 + "integrity": "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==",
  1424 + "cpu": [
  1425 + "x64"
  1426 + ],
  1427 + "dev": true,
  1428 + "license": "MIT",
  1429 + "optional": true,
  1430 + "os": [
  1431 + "win32"
  1432 + ]
  1433 + },
  1434 + "node_modules/@rollup/rollup-win32-x64-msvc": {
  1435 + "version": "4.60.2",
  1436 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz",
  1437 + "integrity": "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==",
  1438 + "cpu": [
  1439 + "x64"
  1440 + ],
  1441 + "dev": true,
  1442 + "license": "MIT",
  1443 + "optional": true,
  1444 + "os": [
  1445 + "win32"
  1446 + ]
  1447 + },
  1448 + "node_modules/@standard-schema/spec": {
  1449 + "version": "1.1.0",
  1450 + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
  1451 + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
  1452 + "license": "MIT"
  1453 + },
  1454 + "node_modules/@standard-schema/utils": {
  1455 + "version": "0.3.0",
  1456 + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz",
  1457 + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==",
  1458 + "license": "MIT"
  1459 + },
  1460 + "node_modules/@types/babel__core": {
  1461 + "version": "7.20.5",
  1462 + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
  1463 + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
  1464 + "dev": true,
  1465 + "license": "MIT",
  1466 + "dependencies": {
  1467 + "@babel/parser": "^7.20.7",
  1468 + "@babel/types": "^7.20.7",
  1469 + "@types/babel__generator": "*",
  1470 + "@types/babel__template": "*",
  1471 + "@types/babel__traverse": "*"
  1472 + }
  1473 + },
  1474 + "node_modules/@types/babel__generator": {
  1475 + "version": "7.27.0",
  1476 + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
  1477 + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
  1478 + "dev": true,
  1479 + "license": "MIT",
  1480 + "dependencies": {
  1481 + "@babel/types": "^7.0.0"
  1482 + }
  1483 + },
  1484 + "node_modules/@types/babel__template": {
  1485 + "version": "7.4.4",
  1486 + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
  1487 + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
  1488 + "dev": true,
  1489 + "license": "MIT",
  1490 + "dependencies": {
  1491 + "@babel/parser": "^7.1.0",
  1492 + "@babel/types": "^7.0.0"
  1493 + }
  1494 + },
  1495 + "node_modules/@types/babel__traverse": {
  1496 + "version": "7.28.0",
  1497 + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
  1498 + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
  1499 + "dev": true,
  1500 + "license": "MIT",
  1501 + "dependencies": {
  1502 + "@babel/types": "^7.28.2"
  1503 + }
  1504 + },
  1505 + "node_modules/@types/estree": {
  1506 + "version": "1.0.8",
  1507 + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
  1508 + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
  1509 + "dev": true,
  1510 + "license": "MIT"
  1511 + },
  1512 + "node_modules/@types/prop-types": {
  1513 + "version": "15.7.15",
  1514 + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
  1515 + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
  1516 + "devOptional": true,
  1517 + "license": "MIT"
  1518 + },
  1519 + "node_modules/@types/react": {
  1520 + "version": "18.3.28",
  1521 + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz",
  1522 + "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==",
  1523 + "devOptional": true,
  1524 + "license": "MIT",
  1525 + "dependencies": {
  1526 + "@types/prop-types": "*",
  1527 + "csstype": "^3.2.2"
  1528 + }
  1529 + },
  1530 + "node_modules/@types/react-dom": {
  1531 + "version": "18.3.7",
  1532 + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz",
  1533 + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
  1534 + "dev": true,
  1535 + "license": "MIT",
  1536 + "peerDependencies": {
  1537 + "@types/react": "^18.0.0"
  1538 + }
  1539 + },
  1540 + "node_modules/@types/use-sync-external-store": {
  1541 + "version": "0.0.6",
  1542 + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz",
  1543 + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==",
  1544 + "license": "MIT"
  1545 + },
  1546 + "node_modules/@vitejs/plugin-react": {
  1547 + "version": "4.7.0",
  1548 + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz",
  1549 + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==",
  1550 + "dev": true,
  1551 + "license": "MIT",
  1552 + "dependencies": {
  1553 + "@babel/core": "^7.28.0",
  1554 + "@babel/plugin-transform-react-jsx-self": "^7.27.1",
  1555 + "@babel/plugin-transform-react-jsx-source": "^7.27.1",
  1556 + "@rolldown/pluginutils": "1.0.0-beta.27",
  1557 + "@types/babel__core": "^7.20.5",
  1558 + "react-refresh": "^0.17.0"
  1559 + },
  1560 + "engines": {
  1561 + "node": "^14.18.0 || >=16.0.0"
  1562 + },
  1563 + "peerDependencies": {
  1564 + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
  1565 + }
  1566 + },
  1567 + "node_modules/antd": {
  1568 + "version": "5.29.3",
  1569 + "resolved": "https://registry.npmjs.org/antd/-/antd-5.29.3.tgz",
  1570 + "integrity": "sha512-3DdbGCa9tWAJGcCJ6rzR8EJFsv2CtyEbkVabZE14pfgUHfCicWCj0/QzQVLDYg8CPfQk9BH7fHCoTXHTy7MP/A==",
  1571 + "license": "MIT",
  1572 + "dependencies": {
  1573 + "@ant-design/colors": "^7.2.1",
  1574 + "@ant-design/cssinjs": "^1.23.0",
  1575 + "@ant-design/cssinjs-utils": "^1.1.3",
  1576 + "@ant-design/fast-color": "^2.0.6",
  1577 + "@ant-design/icons": "^5.6.1",
  1578 + "@ant-design/react-slick": "~1.1.2",
  1579 + "@babel/runtime": "^7.26.0",
  1580 + "@rc-component/color-picker": "~2.0.1",
  1581 + "@rc-component/mutate-observer": "^1.1.0",
  1582 + "@rc-component/qrcode": "~1.1.0",
  1583 + "@rc-component/tour": "~1.15.1",
  1584 + "@rc-component/trigger": "^2.3.0",
  1585 + "classnames": "^2.5.1",
  1586 + "copy-to-clipboard": "^3.3.3",
  1587 + "dayjs": "^1.11.11",
  1588 + "rc-cascader": "~3.34.0",
  1589 + "rc-checkbox": "~3.5.0",
  1590 + "rc-collapse": "~3.9.0",
  1591 + "rc-dialog": "~9.6.0",
  1592 + "rc-drawer": "~7.3.0",
  1593 + "rc-dropdown": "~4.2.1",
  1594 + "rc-field-form": "~2.7.1",
  1595 + "rc-image": "~7.12.0",
  1596 + "rc-input": "~1.8.0",
  1597 + "rc-input-number": "~9.5.0",
  1598 + "rc-mentions": "~2.20.0",
  1599 + "rc-menu": "~9.16.1",
  1600 + "rc-motion": "^2.9.5",
  1601 + "rc-notification": "~5.6.4",
  1602 + "rc-pagination": "~5.1.0",
  1603 + "rc-picker": "~4.11.3",
  1604 + "rc-progress": "~4.0.0",
  1605 + "rc-rate": "~2.13.1",
  1606 + "rc-resize-observer": "^1.4.3",
  1607 + "rc-segmented": "~2.7.0",
  1608 + "rc-select": "~14.16.8",
  1609 + "rc-slider": "~11.1.9",
  1610 + "rc-steps": "~6.0.1",
  1611 + "rc-switch": "~4.1.0",
  1612 + "rc-table": "~7.54.0",
  1613 + "rc-tabs": "~15.7.0",
  1614 + "rc-textarea": "~1.10.2",
  1615 + "rc-tooltip": "~6.4.0",
  1616 + "rc-tree": "~5.13.1",
  1617 + "rc-tree-select": "~5.27.0",
  1618 + "rc-upload": "~4.11.0",
  1619 + "rc-util": "^5.44.4",
  1620 + "scroll-into-view-if-needed": "^3.1.0",
  1621 + "throttle-debounce": "^5.0.2"
  1622 + },
  1623 + "funding": {
  1624 + "type": "opencollective",
  1625 + "url": "https://opencollective.com/ant-design"
  1626 + },
  1627 + "peerDependencies": {
  1628 + "react": ">=16.9.0",
  1629 + "react-dom": ">=16.9.0"
  1630 + }
  1631 + },
  1632 + "node_modules/asynckit": {
  1633 + "version": "0.4.0",
  1634 + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
  1635 + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
  1636 + "license": "MIT"
  1637 + },
  1638 + "node_modules/axios": {
  1639 + "version": "1.15.2",
  1640 + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.2.tgz",
  1641 + "integrity": "sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==",
  1642 + "license": "MIT",
  1643 + "dependencies": {
  1644 + "follow-redirects": "^1.15.11",
  1645 + "form-data": "^4.0.5",
  1646 + "proxy-from-env": "^2.1.0"
  1647 + }
  1648 + },
  1649 + "node_modules/baseline-browser-mapping": {
  1650 + "version": "2.10.24",
  1651 + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.24.tgz",
  1652 + "integrity": "sha512-I2NkZOOrj2XuguvWCK6OVh9GavsNjZjK908Rq3mIBK25+GD8vPX5w2WdxVqnQ7xx3SrZJiCiZFu+/Oz50oSYSA==",
  1653 + "dev": true,
  1654 + "license": "Apache-2.0",
  1655 + "bin": {
  1656 + "baseline-browser-mapping": "dist/cli.cjs"
  1657 + },
  1658 + "engines": {
  1659 + "node": ">=6.0.0"
  1660 + }
  1661 + },
  1662 + "node_modules/browserslist": {
  1663 + "version": "4.28.2",
  1664 + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
  1665 + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==",
  1666 + "dev": true,
  1667 + "funding": [
  1668 + {
  1669 + "type": "opencollective",
  1670 + "url": "https://opencollective.com/browserslist"
  1671 + },
  1672 + {
  1673 + "type": "tidelift",
  1674 + "url": "https://tidelift.com/funding/github/npm/browserslist"
  1675 + },
  1676 + {
  1677 + "type": "github",
  1678 + "url": "https://github.com/sponsors/ai"
  1679 + }
  1680 + ],
  1681 + "license": "MIT",
  1682 + "dependencies": {
  1683 + "baseline-browser-mapping": "^2.10.12",
  1684 + "caniuse-lite": "^1.0.30001782",
  1685 + "electron-to-chromium": "^1.5.328",
  1686 + "node-releases": "^2.0.36",
  1687 + "update-browserslist-db": "^1.2.3"
  1688 + },
  1689 + "bin": {
  1690 + "browserslist": "cli.js"
  1691 + },
  1692 + "engines": {
  1693 + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
  1694 + }
  1695 + },
  1696 + "node_modules/call-bind-apply-helpers": {
  1697 + "version": "1.0.2",
  1698 + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
  1699 + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
  1700 + "license": "MIT",
  1701 + "dependencies": {
  1702 + "es-errors": "^1.3.0",
  1703 + "function-bind": "^1.1.2"
  1704 + },
  1705 + "engines": {
  1706 + "node": ">= 0.4"
  1707 + }
  1708 + },
  1709 + "node_modules/caniuse-lite": {
  1710 + "version": "1.0.30001791",
  1711 + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz",
  1712 + "integrity": "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==",
  1713 + "dev": true,
  1714 + "funding": [
  1715 + {
  1716 + "type": "opencollective",
  1717 + "url": "https://opencollective.com/browserslist"
  1718 + },
  1719 + {
  1720 + "type": "tidelift",
  1721 + "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
  1722 + },
  1723 + {
  1724 + "type": "github",
  1725 + "url": "https://github.com/sponsors/ai"
  1726 + }
  1727 + ],
  1728 + "license": "CC-BY-4.0"
  1729 + },
  1730 + "node_modules/classnames": {
  1731 + "version": "2.5.1",
  1732 + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
  1733 + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==",
  1734 + "license": "MIT"
  1735 + },
  1736 + "node_modules/combined-stream": {
  1737 + "version": "1.0.8",
  1738 + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
  1739 + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
  1740 + "license": "MIT",
  1741 + "dependencies": {
  1742 + "delayed-stream": "~1.0.0"
  1743 + },
  1744 + "engines": {
  1745 + "node": ">= 0.8"
  1746 + }
  1747 + },
  1748 + "node_modules/compute-scroll-into-view": {
  1749 + "version": "3.1.1",
  1750 + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz",
  1751 + "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==",
  1752 + "license": "MIT"
  1753 + },
  1754 + "node_modules/convert-source-map": {
  1755 + "version": "2.0.0",
  1756 + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
  1757 + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
  1758 + "dev": true,
  1759 + "license": "MIT"
  1760 + },
  1761 + "node_modules/copy-to-clipboard": {
  1762 + "version": "3.3.3",
  1763 + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz",
  1764 + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==",
  1765 + "license": "MIT",
  1766 + "dependencies": {
  1767 + "toggle-selection": "^1.0.6"
  1768 + }
  1769 + },
  1770 + "node_modules/csstype": {
  1771 + "version": "3.2.3",
  1772 + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
  1773 + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
  1774 + "license": "MIT"
  1775 + },
  1776 + "node_modules/dayjs": {
  1777 + "version": "1.11.20",
  1778 + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz",
  1779 + "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==",
  1780 + "license": "MIT"
  1781 + },
  1782 + "node_modules/debug": {
  1783 + "version": "4.4.3",
  1784 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
  1785 + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
  1786 + "dev": true,
  1787 + "license": "MIT",
  1788 + "dependencies": {
  1789 + "ms": "^2.1.3"
  1790 + },
  1791 + "engines": {
  1792 + "node": ">=6.0"
  1793 + },
  1794 + "peerDependenciesMeta": {
  1795 + "supports-color": {
  1796 + "optional": true
  1797 + }
  1798 + }
  1799 + },
  1800 + "node_modules/delayed-stream": {
  1801 + "version": "1.0.0",
  1802 + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
  1803 + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
  1804 + "license": "MIT",
  1805 + "engines": {
  1806 + "node": ">=0.4.0"
  1807 + }
  1808 + },
  1809 + "node_modules/dunder-proto": {
  1810 + "version": "1.0.1",
  1811 + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
  1812 + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
  1813 + "license": "MIT",
  1814 + "dependencies": {
  1815 + "call-bind-apply-helpers": "^1.0.1",
  1816 + "es-errors": "^1.3.0",
  1817 + "gopd": "^1.2.0"
  1818 + },
  1819 + "engines": {
  1820 + "node": ">= 0.4"
  1821 + }
  1822 + },
  1823 + "node_modules/electron-to-chromium": {
  1824 + "version": "1.5.345",
  1825 + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.345.tgz",
  1826 + "integrity": "sha512-F9JXQGiMrz6yVNPI2qOVPvB9HzjH5cGzhs8oJ6A28V5L/YnzN/0KsuiibqF+F1Fd9qxFzD1BUnYSd8JfULxTwg==",
  1827 + "dev": true,
  1828 + "license": "ISC"
  1829 + },
  1830 + "node_modules/es-define-property": {
  1831 + "version": "1.0.1",
  1832 + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
  1833 + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
  1834 + "license": "MIT",
  1835 + "engines": {
  1836 + "node": ">= 0.4"
  1837 + }
  1838 + },
  1839 + "node_modules/es-errors": {
  1840 + "version": "1.3.0",
  1841 + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
  1842 + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
  1843 + "license": "MIT",
  1844 + "engines": {
  1845 + "node": ">= 0.4"
  1846 + }
  1847 + },
  1848 + "node_modules/es-object-atoms": {
  1849 + "version": "1.1.1",
  1850 + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
  1851 + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
  1852 + "license": "MIT",
  1853 + "dependencies": {
  1854 + "es-errors": "^1.3.0"
  1855 + },
  1856 + "engines": {
  1857 + "node": ">= 0.4"
  1858 + }
  1859 + },
  1860 + "node_modules/es-set-tostringtag": {
  1861 + "version": "2.1.0",
  1862 + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
  1863 + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
  1864 + "license": "MIT",
  1865 + "dependencies": {
  1866 + "es-errors": "^1.3.0",
  1867 + "get-intrinsic": "^1.2.6",
  1868 + "has-tostringtag": "^1.0.2",
  1869 + "hasown": "^2.0.2"
  1870 + },
  1871 + "engines": {
  1872 + "node": ">= 0.4"
  1873 + }
  1874 + },
  1875 + "node_modules/esbuild": {
  1876 + "version": "0.21.5",
  1877 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
  1878 + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
  1879 + "dev": true,
  1880 + "hasInstallScript": true,
  1881 + "license": "MIT",
  1882 + "bin": {
  1883 + "esbuild": "bin/esbuild"
  1884 + },
  1885 + "engines": {
  1886 + "node": ">=12"
  1887 + },
  1888 + "optionalDependencies": {
  1889 + "@esbuild/aix-ppc64": "0.21.5",
  1890 + "@esbuild/android-arm": "0.21.5",
  1891 + "@esbuild/android-arm64": "0.21.5",
  1892 + "@esbuild/android-x64": "0.21.5",
  1893 + "@esbuild/darwin-arm64": "0.21.5",
  1894 + "@esbuild/darwin-x64": "0.21.5",
  1895 + "@esbuild/freebsd-arm64": "0.21.5",
  1896 + "@esbuild/freebsd-x64": "0.21.5",
  1897 + "@esbuild/linux-arm": "0.21.5",
  1898 + "@esbuild/linux-arm64": "0.21.5",
  1899 + "@esbuild/linux-ia32": "0.21.5",
  1900 + "@esbuild/linux-loong64": "0.21.5",
  1901 + "@esbuild/linux-mips64el": "0.21.5",
  1902 + "@esbuild/linux-ppc64": "0.21.5",
  1903 + "@esbuild/linux-riscv64": "0.21.5",
  1904 + "@esbuild/linux-s390x": "0.21.5",
  1905 + "@esbuild/linux-x64": "0.21.5",
  1906 + "@esbuild/netbsd-x64": "0.21.5",
  1907 + "@esbuild/openbsd-x64": "0.21.5",
  1908 + "@esbuild/sunos-x64": "0.21.5",
  1909 + "@esbuild/win32-arm64": "0.21.5",
  1910 + "@esbuild/win32-ia32": "0.21.5",
  1911 + "@esbuild/win32-x64": "0.21.5"
  1912 + }
  1913 + },
  1914 + "node_modules/escalade": {
  1915 + "version": "3.2.0",
  1916 + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
  1917 + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
  1918 + "dev": true,
  1919 + "license": "MIT",
  1920 + "engines": {
  1921 + "node": ">=6"
  1922 + }
  1923 + },
  1924 + "node_modules/follow-redirects": {
  1925 + "version": "1.16.0",
  1926 + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz",
  1927 + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==",
  1928 + "funding": [
  1929 + {
  1930 + "type": "individual",
  1931 + "url": "https://github.com/sponsors/RubenVerborgh"
  1932 + }
  1933 + ],
  1934 + "license": "MIT",
  1935 + "engines": {
  1936 + "node": ">=4.0"
  1937 + },
  1938 + "peerDependenciesMeta": {
  1939 + "debug": {
  1940 + "optional": true
  1941 + }
  1942 + }
  1943 + },
  1944 + "node_modules/form-data": {
  1945 + "version": "4.0.5",
  1946 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
  1947 + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
  1948 + "license": "MIT",
  1949 + "dependencies": {
  1950 + "asynckit": "^0.4.0",
  1951 + "combined-stream": "^1.0.8",
  1952 + "es-set-tostringtag": "^2.1.0",
  1953 + "hasown": "^2.0.2",
  1954 + "mime-types": "^2.1.12"
  1955 + },
  1956 + "engines": {
  1957 + "node": ">= 6"
  1958 + }
  1959 + },
  1960 + "node_modules/fsevents": {
  1961 + "version": "2.3.3",
  1962 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
  1963 + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
  1964 + "dev": true,
  1965 + "hasInstallScript": true,
  1966 + "license": "MIT",
  1967 + "optional": true,
  1968 + "os": [
  1969 + "darwin"
  1970 + ],
  1971 + "engines": {
  1972 + "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
  1973 + }
  1974 + },
  1975 + "node_modules/function-bind": {
  1976 + "version": "1.1.2",
  1977 + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
  1978 + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
  1979 + "license": "MIT",
  1980 + "funding": {
  1981 + "url": "https://github.com/sponsors/ljharb"
  1982 + }
  1983 + },
  1984 + "node_modules/gensync": {
  1985 + "version": "1.0.0-beta.2",
  1986 + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
  1987 + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
  1988 + "dev": true,
  1989 + "license": "MIT",
  1990 + "engines": {
  1991 + "node": ">=6.9.0"
  1992 + }
  1993 + },
  1994 + "node_modules/get-intrinsic": {
  1995 + "version": "1.3.0",
  1996 + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
  1997 + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
  1998 + "license": "MIT",
  1999 + "dependencies": {
  2000 + "call-bind-apply-helpers": "^1.0.2",
  2001 + "es-define-property": "^1.0.1",
  2002 + "es-errors": "^1.3.0",
  2003 + "es-object-atoms": "^1.1.1",
  2004 + "function-bind": "^1.1.2",
  2005 + "get-proto": "^1.0.1",
  2006 + "gopd": "^1.2.0",
  2007 + "has-symbols": "^1.1.0",
  2008 + "hasown": "^2.0.2",
  2009 + "math-intrinsics": "^1.1.0"
  2010 + },
  2011 + "engines": {
  2012 + "node": ">= 0.4"
  2013 + },
  2014 + "funding": {
  2015 + "url": "https://github.com/sponsors/ljharb"
  2016 + }
  2017 + },
  2018 + "node_modules/get-proto": {
  2019 + "version": "1.0.1",
  2020 + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
  2021 + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
  2022 + "license": "MIT",
  2023 + "dependencies": {
  2024 + "dunder-proto": "^1.0.1",
  2025 + "es-object-atoms": "^1.0.0"
  2026 + },
  2027 + "engines": {
  2028 + "node": ">= 0.4"
  2029 + }
  2030 + },
  2031 + "node_modules/gopd": {
  2032 + "version": "1.2.0",
  2033 + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
  2034 + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
  2035 + "license": "MIT",
  2036 + "engines": {
  2037 + "node": ">= 0.4"
  2038 + },
  2039 + "funding": {
  2040 + "url": "https://github.com/sponsors/ljharb"
  2041 + }
  2042 + },
  2043 + "node_modules/has-symbols": {
  2044 + "version": "1.1.0",
  2045 + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
  2046 + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
  2047 + "license": "MIT",
  2048 + "engines": {
  2049 + "node": ">= 0.4"
  2050 + },
  2051 + "funding": {
  2052 + "url": "https://github.com/sponsors/ljharb"
  2053 + }
  2054 + },
  2055 + "node_modules/has-tostringtag": {
  2056 + "version": "1.0.2",
  2057 + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
  2058 + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
  2059 + "license": "MIT",
  2060 + "dependencies": {
  2061 + "has-symbols": "^1.0.3"
  2062 + },
  2063 + "engines": {
  2064 + "node": ">= 0.4"
  2065 + },
  2066 + "funding": {
  2067 + "url": "https://github.com/sponsors/ljharb"
  2068 + }
  2069 + },
  2070 + "node_modules/hasown": {
  2071 + "version": "2.0.3",
  2072 + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz",
  2073 + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==",
  2074 + "license": "MIT",
  2075 + "dependencies": {
  2076 + "function-bind": "^1.1.2"
  2077 + },
  2078 + "engines": {
  2079 + "node": ">= 0.4"
  2080 + }
  2081 + },
  2082 + "node_modules/immer": {
  2083 + "version": "11.1.4",
  2084 + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.4.tgz",
  2085 + "integrity": "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==",
  2086 + "license": "MIT",
  2087 + "funding": {
  2088 + "type": "opencollective",
  2089 + "url": "https://opencollective.com/immer"
  2090 + }
  2091 + },
  2092 + "node_modules/js-tokens": {
  2093 + "version": "4.0.0",
  2094 + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
  2095 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
  2096 + "license": "MIT"
  2097 + },
  2098 + "node_modules/jsesc": {
  2099 + "version": "3.1.0",
  2100 + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
  2101 + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
  2102 + "dev": true,
  2103 + "license": "MIT",
  2104 + "bin": {
  2105 + "jsesc": "bin/jsesc"
  2106 + },
  2107 + "engines": {
  2108 + "node": ">=6"
  2109 + }
  2110 + },
  2111 + "node_modules/json2mq": {
  2112 + "version": "0.2.0",
  2113 + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz",
  2114 + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==",
  2115 + "license": "MIT",
  2116 + "dependencies": {
  2117 + "string-convert": "^0.2.0"
  2118 + }
  2119 + },
  2120 + "node_modules/json5": {
  2121 + "version": "2.2.3",
  2122 + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
  2123 + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
  2124 + "dev": true,
  2125 + "license": "MIT",
  2126 + "bin": {
  2127 + "json5": "lib/cli.js"
  2128 + },
  2129 + "engines": {
  2130 + "node": ">=6"
  2131 + }
  2132 + },
  2133 + "node_modules/loose-envify": {
  2134 + "version": "1.4.0",
  2135 + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
  2136 + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
  2137 + "license": "MIT",
  2138 + "dependencies": {
  2139 + "js-tokens": "^3.0.0 || ^4.0.0"
  2140 + },
  2141 + "bin": {
  2142 + "loose-envify": "cli.js"
  2143 + }
  2144 + },
  2145 + "node_modules/lru-cache": {
  2146 + "version": "5.1.1",
  2147 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
  2148 + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
  2149 + "dev": true,
  2150 + "license": "ISC",
  2151 + "dependencies": {
  2152 + "yallist": "^3.0.2"
  2153 + }
  2154 + },
  2155 + "node_modules/math-intrinsics": {
  2156 + "version": "1.1.0",
  2157 + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
  2158 + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
  2159 + "license": "MIT",
  2160 + "engines": {
  2161 + "node": ">= 0.4"
  2162 + }
  2163 + },
  2164 + "node_modules/mime-db": {
  2165 + "version": "1.52.0",
  2166 + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
  2167 + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
  2168 + "license": "MIT",
  2169 + "engines": {
  2170 + "node": ">= 0.6"
  2171 + }
  2172 + },
  2173 + "node_modules/mime-types": {
  2174 + "version": "2.1.35",
  2175 + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
  2176 + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
  2177 + "license": "MIT",
  2178 + "dependencies": {
  2179 + "mime-db": "1.52.0"
  2180 + },
  2181 + "engines": {
  2182 + "node": ">= 0.6"
  2183 + }
  2184 + },
  2185 + "node_modules/ms": {
  2186 + "version": "2.1.3",
  2187 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
  2188 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
  2189 + "dev": true,
  2190 + "license": "MIT"
  2191 + },
  2192 + "node_modules/nanoid": {
  2193 + "version": "3.3.11",
  2194 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
  2195 + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
  2196 + "dev": true,
  2197 + "funding": [
  2198 + {
  2199 + "type": "github",
  2200 + "url": "https://github.com/sponsors/ai"
  2201 + }
  2202 + ],
  2203 + "license": "MIT",
  2204 + "bin": {
  2205 + "nanoid": "bin/nanoid.cjs"
  2206 + },
  2207 + "engines": {
  2208 + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
  2209 + }
  2210 + },
  2211 + "node_modules/node-releases": {
  2212 + "version": "2.0.38",
  2213 + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz",
  2214 + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==",
  2215 + "dev": true,
  2216 + "license": "MIT"
  2217 + },
  2218 + "node_modules/picocolors": {
  2219 + "version": "1.1.1",
  2220 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
  2221 + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
  2222 + "dev": true,
  2223 + "license": "ISC"
  2224 + },
  2225 + "node_modules/postcss": {
  2226 + "version": "8.5.12",
  2227 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz",
  2228 + "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==",
  2229 + "dev": true,
  2230 + "funding": [
  2231 + {
  2232 + "type": "opencollective",
  2233 + "url": "https://opencollective.com/postcss/"
  2234 + },
  2235 + {
  2236 + "type": "tidelift",
  2237 + "url": "https://tidelift.com/funding/github/npm/postcss"
  2238 + },
  2239 + {
  2240 + "type": "github",
  2241 + "url": "https://github.com/sponsors/ai"
  2242 + }
  2243 + ],
  2244 + "license": "MIT",
  2245 + "dependencies": {
  2246 + "nanoid": "^3.3.11",
  2247 + "picocolors": "^1.1.1",
  2248 + "source-map-js": "^1.2.1"
  2249 + },
  2250 + "engines": {
  2251 + "node": "^10 || ^12 || >=14"
  2252 + }
  2253 + },
  2254 + "node_modules/proxy-from-env": {
  2255 + "version": "2.1.0",
  2256 + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz",
  2257 + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==",
  2258 + "license": "MIT",
  2259 + "engines": {
  2260 + "node": ">=10"
  2261 + }
  2262 + },
  2263 + "node_modules/rc-cascader": {
  2264 + "version": "3.34.0",
  2265 + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.34.0.tgz",
  2266 + "integrity": "sha512-KpXypcvju9ptjW9FaN2NFcA2QH9E9LHKq169Y0eWtH4e/wHQ5Wh5qZakAgvb8EKZ736WZ3B0zLLOBsrsja5Dag==",
  2267 + "license": "MIT",
  2268 + "dependencies": {
  2269 + "@babel/runtime": "^7.25.7",
  2270 + "classnames": "^2.3.1",
  2271 + "rc-select": "~14.16.2",
  2272 + "rc-tree": "~5.13.0",
  2273 + "rc-util": "^5.43.0"
  2274 + },
  2275 + "peerDependencies": {
  2276 + "react": ">=16.9.0",
  2277 + "react-dom": ">=16.9.0"
  2278 + }
  2279 + },
  2280 + "node_modules/rc-checkbox": {
  2281 + "version": "3.5.0",
  2282 + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.5.0.tgz",
  2283 + "integrity": "sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg==",
  2284 + "license": "MIT",
  2285 + "dependencies": {
  2286 + "@babel/runtime": "^7.10.1",
  2287 + "classnames": "^2.3.2",
  2288 + "rc-util": "^5.25.2"
  2289 + },
  2290 + "peerDependencies": {
  2291 + "react": ">=16.9.0",
  2292 + "react-dom": ">=16.9.0"
  2293 + }
  2294 + },
  2295 + "node_modules/rc-collapse": {
  2296 + "version": "3.9.0",
  2297 + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.9.0.tgz",
  2298 + "integrity": "sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==",
  2299 + "license": "MIT",
  2300 + "dependencies": {
  2301 + "@babel/runtime": "^7.10.1",
  2302 + "classnames": "2.x",
  2303 + "rc-motion": "^2.3.4",
  2304 + "rc-util": "^5.27.0"
  2305 + },
  2306 + "peerDependencies": {
  2307 + "react": ">=16.9.0",
  2308 + "react-dom": ">=16.9.0"
  2309 + }
  2310 + },
  2311 + "node_modules/rc-dialog": {
  2312 + "version": "9.6.0",
  2313 + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.6.0.tgz",
  2314 + "integrity": "sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==",
  2315 + "license": "MIT",
  2316 + "dependencies": {
  2317 + "@babel/runtime": "^7.10.1",
  2318 + "@rc-component/portal": "^1.0.0-8",
  2319 + "classnames": "^2.2.6",
  2320 + "rc-motion": "^2.3.0",
  2321 + "rc-util": "^5.21.0"
  2322 + },
  2323 + "peerDependencies": {
  2324 + "react": ">=16.9.0",
  2325 + "react-dom": ">=16.9.0"
  2326 + }
  2327 + },
  2328 + "node_modules/rc-drawer": {
  2329 + "version": "7.3.0",
  2330 + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.3.0.tgz",
  2331 + "integrity": "sha512-DX6CIgiBWNpJIMGFO8BAISFkxiuKitoizooj4BDyee8/SnBn0zwO2FHrNDpqqepj0E/TFTDpmEBCyFuTgC7MOg==",
  2332 + "license": "MIT",
  2333 + "dependencies": {
  2334 + "@babel/runtime": "^7.23.9",
  2335 + "@rc-component/portal": "^1.1.1",
  2336 + "classnames": "^2.2.6",
  2337 + "rc-motion": "^2.6.1",
  2338 + "rc-util": "^5.38.1"
  2339 + },
  2340 + "peerDependencies": {
  2341 + "react": ">=16.9.0",
  2342 + "react-dom": ">=16.9.0"
  2343 + }
  2344 + },
  2345 + "node_modules/rc-dropdown": {
  2346 + "version": "4.2.1",
  2347 + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.2.1.tgz",
  2348 + "integrity": "sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==",
  2349 + "license": "MIT",
  2350 + "dependencies": {
  2351 + "@babel/runtime": "^7.18.3",
  2352 + "@rc-component/trigger": "^2.0.0",
  2353 + "classnames": "^2.2.6",
  2354 + "rc-util": "^5.44.1"
  2355 + },
  2356 + "peerDependencies": {
  2357 + "react": ">=16.11.0",
  2358 + "react-dom": ">=16.11.0"
  2359 + }
  2360 + },
  2361 + "node_modules/rc-field-form": {
  2362 + "version": "2.7.1",
  2363 + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.7.1.tgz",
  2364 + "integrity": "sha512-vKeSifSJ6HoLaAB+B8aq/Qgm8a3dyxROzCtKNCsBQgiverpc4kWDQihoUwzUj+zNWJOykwSY4dNX3QrGwtVb9A==",
  2365 + "license": "MIT",
  2366 + "dependencies": {
  2367 + "@babel/runtime": "^7.18.0",
  2368 + "@rc-component/async-validator": "^5.0.3",
  2369 + "rc-util": "^5.32.2"
  2370 + },
  2371 + "engines": {
  2372 + "node": ">=8.x"
  2373 + },
  2374 + "peerDependencies": {
  2375 + "react": ">=16.9.0",
  2376 + "react-dom": ">=16.9.0"
  2377 + }
  2378 + },
  2379 + "node_modules/rc-image": {
  2380 + "version": "7.12.0",
  2381 + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.12.0.tgz",
  2382 + "integrity": "sha512-cZ3HTyyckPnNnUb9/DRqduqzLfrQRyi+CdHjdqgsyDpI3Ln5UX1kXnAhPBSJj9pVRzwRFgqkN7p9b6HBDjmu/Q==",
  2383 + "license": "MIT",
  2384 + "dependencies": {
  2385 + "@babel/runtime": "^7.11.2",
  2386 + "@rc-component/portal": "^1.0.2",
  2387 + "classnames": "^2.2.6",
  2388 + "rc-dialog": "~9.6.0",
  2389 + "rc-motion": "^2.6.2",
  2390 + "rc-util": "^5.34.1"
  2391 + },
  2392 + "peerDependencies": {
  2393 + "react": ">=16.9.0",
  2394 + "react-dom": ">=16.9.0"
  2395 + }
  2396 + },
  2397 + "node_modules/rc-input": {
  2398 + "version": "1.8.0",
  2399 + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.8.0.tgz",
  2400 + "integrity": "sha512-KXvaTbX+7ha8a/k+eg6SYRVERK0NddX8QX7a7AnRvUa/rEH0CNMlpcBzBkhI0wp2C8C4HlMoYl8TImSN+fuHKA==",
  2401 + "license": "MIT",
  2402 + "dependencies": {
  2403 + "@babel/runtime": "^7.11.1",
  2404 + "classnames": "^2.2.1",
  2405 + "rc-util": "^5.18.1"
  2406 + },
  2407 + "peerDependencies": {
  2408 + "react": ">=16.0.0",
  2409 + "react-dom": ">=16.0.0"
  2410 + }
  2411 + },
  2412 + "node_modules/rc-input-number": {
  2413 + "version": "9.5.0",
  2414 + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.5.0.tgz",
  2415 + "integrity": "sha512-bKaEvB5tHebUURAEXw35LDcnRZLq3x1k7GxfAqBMzmpHkDGzjAtnUL8y4y5N15rIFIg5IJgwr211jInl3cipag==",
  2416 + "license": "MIT",
  2417 + "dependencies": {
  2418 + "@babel/runtime": "^7.10.1",
  2419 + "@rc-component/mini-decimal": "^1.0.1",
  2420 + "classnames": "^2.2.5",
  2421 + "rc-input": "~1.8.0",
  2422 + "rc-util": "^5.40.1"
  2423 + },
  2424 + "peerDependencies": {
  2425 + "react": ">=16.9.0",
  2426 + "react-dom": ">=16.9.0"
  2427 + }
  2428 + },
  2429 + "node_modules/rc-mentions": {
  2430 + "version": "2.20.0",
  2431 + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.20.0.tgz",
  2432 + "integrity": "sha512-w8HCMZEh3f0nR8ZEd466ATqmXFCMGMN5UFCzEUL0bM/nGw/wOS2GgRzKBcm19K++jDyuWCOJOdgcKGXU3fXfbQ==",
  2433 + "license": "MIT",
  2434 + "dependencies": {
  2435 + "@babel/runtime": "^7.22.5",
  2436 + "@rc-component/trigger": "^2.0.0",
  2437 + "classnames": "^2.2.6",
  2438 + "rc-input": "~1.8.0",
  2439 + "rc-menu": "~9.16.0",
  2440 + "rc-textarea": "~1.10.0",
  2441 + "rc-util": "^5.34.1"
  2442 + },
  2443 + "peerDependencies": {
  2444 + "react": ">=16.9.0",
  2445 + "react-dom": ">=16.9.0"
  2446 + }
  2447 + },
  2448 + "node_modules/rc-menu": {
  2449 + "version": "9.16.1",
  2450 + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.16.1.tgz",
  2451 + "integrity": "sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg==",
  2452 + "license": "MIT",
  2453 + "dependencies": {
  2454 + "@babel/runtime": "^7.10.1",
  2455 + "@rc-component/trigger": "^2.0.0",
  2456 + "classnames": "2.x",
  2457 + "rc-motion": "^2.4.3",
  2458 + "rc-overflow": "^1.3.1",
  2459 + "rc-util": "^5.27.0"
  2460 + },
  2461 + "peerDependencies": {
  2462 + "react": ">=16.9.0",
  2463 + "react-dom": ">=16.9.0"
  2464 + }
  2465 + },
  2466 + "node_modules/rc-motion": {
  2467 + "version": "2.9.5",
  2468 + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.5.tgz",
  2469 + "integrity": "sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==",
  2470 + "license": "MIT",
  2471 + "dependencies": {
  2472 + "@babel/runtime": "^7.11.1",
  2473 + "classnames": "^2.2.1",
  2474 + "rc-util": "^5.44.0"
  2475 + },
  2476 + "peerDependencies": {
  2477 + "react": ">=16.9.0",
  2478 + "react-dom": ">=16.9.0"
  2479 + }
  2480 + },
  2481 + "node_modules/rc-notification": {
  2482 + "version": "5.6.4",
  2483 + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.6.4.tgz",
  2484 + "integrity": "sha512-KcS4O6B4qzM3KH7lkwOB7ooLPZ4b6J+VMmQgT51VZCeEcmghdeR4IrMcFq0LG+RPdnbe/ArT086tGM8Snimgiw==",
  2485 + "license": "MIT",
  2486 + "dependencies": {
  2487 + "@babel/runtime": "^7.10.1",
  2488 + "classnames": "2.x",
  2489 + "rc-motion": "^2.9.0",
  2490 + "rc-util": "^5.20.1"
  2491 + },
  2492 + "engines": {
  2493 + "node": ">=8.x"
  2494 + },
  2495 + "peerDependencies": {
  2496 + "react": ">=16.9.0",
  2497 + "react-dom": ">=16.9.0"
  2498 + }
  2499 + },
  2500 + "node_modules/rc-overflow": {
  2501 + "version": "1.5.0",
  2502 + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.5.0.tgz",
  2503 + "integrity": "sha512-Lm/v9h0LymeUYJf0x39OveU52InkdRXqnn2aYXfWmo8WdOonIKB2kfau+GF0fWq6jPgtdO9yMqveGcK6aIhJmg==",
  2504 + "license": "MIT",
  2505 + "dependencies": {
  2506 + "@babel/runtime": "^7.11.1",
  2507 + "classnames": "^2.2.1",
  2508 + "rc-resize-observer": "^1.0.0",
  2509 + "rc-util": "^5.37.0"
  2510 + },
  2511 + "peerDependencies": {
  2512 + "react": ">=16.9.0",
  2513 + "react-dom": ">=16.9.0"
  2514 + }
  2515 + },
  2516 + "node_modules/rc-pagination": {
  2517 + "version": "5.1.0",
  2518 + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-5.1.0.tgz",
  2519 + "integrity": "sha512-8416Yip/+eclTFdHXLKTxZvn70duYVGTvUUWbckCCZoIl3jagqke3GLsFrMs0bsQBikiYpZLD9206Ej4SOdOXQ==",
  2520 + "license": "MIT",
  2521 + "dependencies": {
  2522 + "@babel/runtime": "^7.10.1",
  2523 + "classnames": "^2.3.2",
  2524 + "rc-util": "^5.38.0"
  2525 + },
  2526 + "peerDependencies": {
  2527 + "react": ">=16.9.0",
  2528 + "react-dom": ">=16.9.0"
  2529 + }
  2530 + },
  2531 + "node_modules/rc-picker": {
  2532 + "version": "4.11.3",
  2533 + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.11.3.tgz",
  2534 + "integrity": "sha512-MJ5teb7FlNE0NFHTncxXQ62Y5lytq6sh5nUw0iH8OkHL/TjARSEvSHpr940pWgjGANpjCwyMdvsEV55l5tYNSg==",
  2535 + "license": "MIT",
  2536 + "dependencies": {
  2537 + "@babel/runtime": "^7.24.7",
  2538 + "@rc-component/trigger": "^2.0.0",
  2539 + "classnames": "^2.2.1",
  2540 + "rc-overflow": "^1.3.2",
  2541 + "rc-resize-observer": "^1.4.0",
  2542 + "rc-util": "^5.43.0"
  2543 + },
  2544 + "engines": {
  2545 + "node": ">=8.x"
  2546 + },
  2547 + "peerDependencies": {
  2548 + "date-fns": ">= 2.x",
  2549 + "dayjs": ">= 1.x",
  2550 + "luxon": ">= 3.x",
  2551 + "moment": ">= 2.x",
  2552 + "react": ">=16.9.0",
  2553 + "react-dom": ">=16.9.0"
  2554 + },
  2555 + "peerDependenciesMeta": {
  2556 + "date-fns": {
  2557 + "optional": true
  2558 + },
  2559 + "dayjs": {
  2560 + "optional": true
  2561 + },
  2562 + "luxon": {
  2563 + "optional": true
  2564 + },
  2565 + "moment": {
  2566 + "optional": true
  2567 + }
  2568 + }
  2569 + },
  2570 + "node_modules/rc-progress": {
  2571 + "version": "4.0.0",
  2572 + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-4.0.0.tgz",
  2573 + "integrity": "sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==",
  2574 + "license": "MIT",
  2575 + "dependencies": {
  2576 + "@babel/runtime": "^7.10.1",
  2577 + "classnames": "^2.2.6",
  2578 + "rc-util": "^5.16.1"
  2579 + },
  2580 + "peerDependencies": {
  2581 + "react": ">=16.9.0",
  2582 + "react-dom": ">=16.9.0"
  2583 + }
  2584 + },
  2585 + "node_modules/rc-rate": {
  2586 + "version": "2.13.1",
  2587 + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.13.1.tgz",
  2588 + "integrity": "sha512-QUhQ9ivQ8Gy7mtMZPAjLbxBt5y9GRp65VcUyGUMF3N3fhiftivPHdpuDIaWIMOTEprAjZPC08bls1dQB+I1F2Q==",
  2589 + "license": "MIT",
  2590 + "dependencies": {
  2591 + "@babel/runtime": "^7.10.1",
  2592 + "classnames": "^2.2.5",
  2593 + "rc-util": "^5.0.1"
  2594 + },
  2595 + "engines": {
  2596 + "node": ">=8.x"
  2597 + },
  2598 + "peerDependencies": {
  2599 + "react": ">=16.9.0",
  2600 + "react-dom": ">=16.9.0"
  2601 + }
  2602 + },
  2603 + "node_modules/rc-resize-observer": {
  2604 + "version": "1.4.3",
  2605 + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.3.tgz",
  2606 + "integrity": "sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==",
  2607 + "license": "MIT",
  2608 + "dependencies": {
  2609 + "@babel/runtime": "^7.20.7",
  2610 + "classnames": "^2.2.1",
  2611 + "rc-util": "^5.44.1",
  2612 + "resize-observer-polyfill": "^1.5.1"
  2613 + },
  2614 + "peerDependencies": {
  2615 + "react": ">=16.9.0",
  2616 + "react-dom": ">=16.9.0"
  2617 + }
  2618 + },
  2619 + "node_modules/rc-segmented": {
  2620 + "version": "2.7.1",
  2621 + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.7.1.tgz",
  2622 + "integrity": "sha512-izj1Nw/Dw2Vb7EVr+D/E9lUTkBe+kKC+SAFSU9zqr7WV2W5Ktaa9Gc7cB2jTqgk8GROJayltaec+DBlYKc6d+g==",
  2623 + "license": "MIT",
  2624 + "dependencies": {
  2625 + "@babel/runtime": "^7.11.1",
  2626 + "classnames": "^2.2.1",
  2627 + "rc-motion": "^2.4.4",
  2628 + "rc-util": "^5.17.0"
  2629 + },
  2630 + "peerDependencies": {
  2631 + "react": ">=16.0.0",
  2632 + "react-dom": ">=16.0.0"
  2633 + }
  2634 + },
  2635 + "node_modules/rc-select": {
  2636 + "version": "14.16.8",
  2637 + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.16.8.tgz",
  2638 + "integrity": "sha512-NOV5BZa1wZrsdkKaiK7LHRuo5ZjZYMDxPP6/1+09+FB4KoNi8jcG1ZqLE3AVCxEsYMBe65OBx71wFoHRTP3LRg==",
  2639 + "license": "MIT",
  2640 + "dependencies": {
  2641 + "@babel/runtime": "^7.10.1",
  2642 + "@rc-component/trigger": "^2.1.1",
  2643 + "classnames": "2.x",
  2644 + "rc-motion": "^2.0.1",
  2645 + "rc-overflow": "^1.3.1",
  2646 + "rc-util": "^5.16.1",
  2647 + "rc-virtual-list": "^3.5.2"
  2648 + },
  2649 + "engines": {
  2650 + "node": ">=8.x"
  2651 + },
  2652 + "peerDependencies": {
  2653 + "react": "*",
  2654 + "react-dom": "*"
  2655 + }
  2656 + },
  2657 + "node_modules/rc-slider": {
  2658 + "version": "11.1.9",
  2659 + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-11.1.9.tgz",
  2660 + "integrity": "sha512-h8IknhzSh3FEM9u8ivkskh+Ef4Yo4JRIY2nj7MrH6GQmrwV6mcpJf5/4KgH5JaVI1H3E52yCdpOlVyGZIeph5A==",
  2661 + "license": "MIT",
  2662 + "dependencies": {
  2663 + "@babel/runtime": "^7.10.1",
  2664 + "classnames": "^2.2.5",
  2665 + "rc-util": "^5.36.0"
  2666 + },
  2667 + "engines": {
  2668 + "node": ">=8.x"
  2669 + },
  2670 + "peerDependencies": {
  2671 + "react": ">=16.9.0",
  2672 + "react-dom": ">=16.9.0"
  2673 + }
  2674 + },
  2675 + "node_modules/rc-steps": {
  2676 + "version": "6.0.1",
  2677 + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.1.tgz",
  2678 + "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==",
  2679 + "license": "MIT",
  2680 + "dependencies": {
  2681 + "@babel/runtime": "^7.16.7",
  2682 + "classnames": "^2.2.3",
  2683 + "rc-util": "^5.16.1"
  2684 + },
  2685 + "engines": {
  2686 + "node": ">=8.x"
  2687 + },
  2688 + "peerDependencies": {
  2689 + "react": ">=16.9.0",
  2690 + "react-dom": ">=16.9.0"
  2691 + }
  2692 + },
  2693 + "node_modules/rc-switch": {
  2694 + "version": "4.1.0",
  2695 + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.1.0.tgz",
  2696 + "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==",
  2697 + "license": "MIT",
  2698 + "dependencies": {
  2699 + "@babel/runtime": "^7.21.0",
  2700 + "classnames": "^2.2.1",
  2701 + "rc-util": "^5.30.0"
  2702 + },
  2703 + "peerDependencies": {
  2704 + "react": ">=16.9.0",
  2705 + "react-dom": ">=16.9.0"
  2706 + }
  2707 + },
  2708 + "node_modules/rc-table": {
  2709 + "version": "7.54.0",
  2710 + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.54.0.tgz",
  2711 + "integrity": "sha512-/wDTkki6wBTjwylwAGjpLKYklKo9YgjZwAU77+7ME5mBoS32Q4nAwoqhA2lSge6fobLW3Tap6uc5xfwaL2p0Sw==",
  2712 + "license": "MIT",
  2713 + "dependencies": {
  2714 + "@babel/runtime": "^7.10.1",
  2715 + "@rc-component/context": "^1.4.0",
  2716 + "classnames": "^2.2.5",
  2717 + "rc-resize-observer": "^1.1.0",
  2718 + "rc-util": "^5.44.3",
  2719 + "rc-virtual-list": "^3.14.2"
  2720 + },
  2721 + "engines": {
  2722 + "node": ">=8.x"
  2723 + },
  2724 + "peerDependencies": {
  2725 + "react": ">=16.9.0",
  2726 + "react-dom": ">=16.9.0"
  2727 + }
  2728 + },
  2729 + "node_modules/rc-tabs": {
  2730 + "version": "15.7.0",
  2731 + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-15.7.0.tgz",
  2732 + "integrity": "sha512-ZepiE+6fmozYdWf/9gVp7k56PKHB1YYoDsKeQA1CBlJ/POIhjkcYiv0AGP0w2Jhzftd3AVvZP/K+V+Lpi2ankA==",
  2733 + "license": "MIT",
  2734 + "dependencies": {
  2735 + "@babel/runtime": "^7.11.2",
  2736 + "classnames": "2.x",
  2737 + "rc-dropdown": "~4.2.0",
  2738 + "rc-menu": "~9.16.0",
  2739 + "rc-motion": "^2.6.2",
  2740 + "rc-resize-observer": "^1.0.0",
  2741 + "rc-util": "^5.34.1"
  2742 + },
  2743 + "engines": {
  2744 + "node": ">=8.x"
  2745 + },
  2746 + "peerDependencies": {
  2747 + "react": ">=16.9.0",
  2748 + "react-dom": ">=16.9.0"
  2749 + }
  2750 + },
  2751 + "node_modules/rc-textarea": {
  2752 + "version": "1.10.2",
  2753 + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.10.2.tgz",
  2754 + "integrity": "sha512-HfaeXiaSlpiSp0I/pvWpecFEHpVysZ9tpDLNkxQbMvMz6gsr7aVZ7FpWP9kt4t7DB+jJXesYS0us1uPZnlRnwQ==",
  2755 + "license": "MIT",
  2756 + "dependencies": {
  2757 + "@babel/runtime": "^7.10.1",
  2758 + "classnames": "^2.2.1",
  2759 + "rc-input": "~1.8.0",
  2760 + "rc-resize-observer": "^1.0.0",
  2761 + "rc-util": "^5.27.0"
  2762 + },
  2763 + "peerDependencies": {
  2764 + "react": ">=16.9.0",
  2765 + "react-dom": ">=16.9.0"
  2766 + }
  2767 + },
  2768 + "node_modules/rc-tooltip": {
  2769 + "version": "6.4.0",
  2770 + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.4.0.tgz",
  2771 + "integrity": "sha512-kqyivim5cp8I5RkHmpsp1Nn/Wk+1oeloMv9c7LXNgDxUpGm+RbXJGL+OPvDlcRnx9DBeOe4wyOIl4OKUERyH1g==",
  2772 + "license": "MIT",
  2773 + "dependencies": {
  2774 + "@babel/runtime": "^7.11.2",
  2775 + "@rc-component/trigger": "^2.0.0",
  2776 + "classnames": "^2.3.1",
  2777 + "rc-util": "^5.44.3"
  2778 + },
  2779 + "peerDependencies": {
  2780 + "react": ">=16.9.0",
  2781 + "react-dom": ">=16.9.0"
  2782 + }
  2783 + },
  2784 + "node_modules/rc-tree": {
  2785 + "version": "5.13.1",
  2786 + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.13.1.tgz",
  2787 + "integrity": "sha512-FNhIefhftobCdUJshO7M8uZTA9F4OPGVXqGfZkkD/5soDeOhwO06T/aKTrg0WD8gRg/pyfq+ql3aMymLHCTC4A==",
  2788 + "license": "MIT",
  2789 + "dependencies": {
  2790 + "@babel/runtime": "^7.10.1",
  2791 + "classnames": "2.x",
  2792 + "rc-motion": "^2.0.1",
  2793 + "rc-util": "^5.16.1",
  2794 + "rc-virtual-list": "^3.5.1"
  2795 + },
  2796 + "engines": {
  2797 + "node": ">=10.x"
  2798 + },
  2799 + "peerDependencies": {
  2800 + "react": "*",
  2801 + "react-dom": "*"
  2802 + }
  2803 + },
  2804 + "node_modules/rc-tree-select": {
  2805 + "version": "5.27.0",
  2806 + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.27.0.tgz",
  2807 + "integrity": "sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww==",
  2808 + "license": "MIT",
  2809 + "dependencies": {
  2810 + "@babel/runtime": "^7.25.7",
  2811 + "classnames": "2.x",
  2812 + "rc-select": "~14.16.2",
  2813 + "rc-tree": "~5.13.0",
  2814 + "rc-util": "^5.43.0"
  2815 + },
  2816 + "peerDependencies": {
  2817 + "react": "*",
  2818 + "react-dom": "*"
  2819 + }
  2820 + },
  2821 + "node_modules/rc-upload": {
  2822 + "version": "4.11.0",
  2823 + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.11.0.tgz",
  2824 + "integrity": "sha512-ZUyT//2JAehfHzjWowqROcwYJKnZkIUGWaTE/VogVrepSl7AFNbQf4+zGfX4zl9Vrj/Jm8scLO0R6UlPDKK4wA==",
  2825 + "license": "MIT",
  2826 + "dependencies": {
  2827 + "@babel/runtime": "^7.18.3",
  2828 + "classnames": "^2.2.5",
  2829 + "rc-util": "^5.2.0"
  2830 + },
  2831 + "peerDependencies": {
  2832 + "react": ">=16.9.0",
  2833 + "react-dom": ">=16.9.0"
  2834 + }
  2835 + },
  2836 + "node_modules/rc-util": {
  2837 + "version": "5.44.4",
  2838 + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.44.4.tgz",
  2839 + "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==",
  2840 + "license": "MIT",
  2841 + "dependencies": {
  2842 + "@babel/runtime": "^7.18.3",
  2843 + "react-is": "^18.2.0"
  2844 + },
  2845 + "peerDependencies": {
  2846 + "react": ">=16.9.0",
  2847 + "react-dom": ">=16.9.0"
  2848 + }
  2849 + },
  2850 + "node_modules/rc-virtual-list": {
  2851 + "version": "3.19.2",
  2852 + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.19.2.tgz",
  2853 + "integrity": "sha512-Ys6NcjwGkuwkeaWBDqfI3xWuZ7rDiQXlH1o2zLfFzATfEgXcqpk8CkgMfbJD81McqjcJVez25a3kPxCR807evA==",
  2854 + "license": "MIT",
  2855 + "dependencies": {
  2856 + "@babel/runtime": "^7.20.0",
  2857 + "classnames": "^2.2.6",
  2858 + "rc-resize-observer": "^1.0.0",
  2859 + "rc-util": "^5.36.0"
  2860 + },
  2861 + "engines": {
  2862 + "node": ">=8.x"
  2863 + },
  2864 + "peerDependencies": {
  2865 + "react": ">=16.9.0",
  2866 + "react-dom": ">=16.9.0"
  2867 + }
  2868 + },
  2869 + "node_modules/react": {
  2870 + "version": "18.3.1",
  2871 + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
  2872 + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
  2873 + "license": "MIT",
  2874 + "dependencies": {
  2875 + "loose-envify": "^1.1.0"
  2876 + },
  2877 + "engines": {
  2878 + "node": ">=0.10.0"
  2879 + }
  2880 + },
  2881 + "node_modules/react-dom": {
  2882 + "version": "18.3.1",
  2883 + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
  2884 + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
  2885 + "license": "MIT",
  2886 + "dependencies": {
  2887 + "loose-envify": "^1.1.0",
  2888 + "scheduler": "^0.23.2"
  2889 + },
  2890 + "peerDependencies": {
  2891 + "react": "^18.3.1"
  2892 + }
  2893 + },
  2894 + "node_modules/react-is": {
  2895 + "version": "18.3.1",
  2896 + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
  2897 + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
  2898 + "license": "MIT"
  2899 + },
  2900 + "node_modules/react-redux": {
  2901 + "version": "9.2.0",
  2902 + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz",
  2903 + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==",
  2904 + "license": "MIT",
  2905 + "dependencies": {
  2906 + "@types/use-sync-external-store": "^0.0.6",
  2907 + "use-sync-external-store": "^1.4.0"
  2908 + },
  2909 + "peerDependencies": {
  2910 + "@types/react": "^18.2.25 || ^19",
  2911 + "react": "^18.0 || ^19",
  2912 + "redux": "^5.0.0"
  2913 + },
  2914 + "peerDependenciesMeta": {
  2915 + "@types/react": {
  2916 + "optional": true
  2917 + },
  2918 + "redux": {
  2919 + "optional": true
  2920 + }
  2921 + }
  2922 + },
  2923 + "node_modules/react-refresh": {
  2924 + "version": "0.17.0",
  2925 + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
  2926 + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
  2927 + "dev": true,
  2928 + "license": "MIT",
  2929 + "engines": {
  2930 + "node": ">=0.10.0"
  2931 + }
  2932 + },
  2933 + "node_modules/react-router": {
  2934 + "version": "6.30.3",
  2935 + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz",
  2936 + "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==",
  2937 + "license": "MIT",
  2938 + "dependencies": {
  2939 + "@remix-run/router": "1.23.2"
  2940 + },
  2941 + "engines": {
  2942 + "node": ">=14.0.0"
  2943 + },
  2944 + "peerDependencies": {
  2945 + "react": ">=16.8"
  2946 + }
  2947 + },
  2948 + "node_modules/react-router-dom": {
  2949 + "version": "6.30.3",
  2950 + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz",
  2951 + "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==",
  2952 + "license": "MIT",
  2953 + "dependencies": {
  2954 + "@remix-run/router": "1.23.2",
  2955 + "react-router": "6.30.3"
  2956 + },
  2957 + "engines": {
  2958 + "node": ">=14.0.0"
  2959 + },
  2960 + "peerDependencies": {
  2961 + "react": ">=16.8",
  2962 + "react-dom": ">=16.8"
  2963 + }
  2964 + },
  2965 + "node_modules/redux": {
  2966 + "version": "5.0.1",
  2967 + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz",
  2968 + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==",
  2969 + "license": "MIT"
  2970 + },
  2971 + "node_modules/redux-thunk": {
  2972 + "version": "3.1.0",
  2973 + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz",
  2974 + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==",
  2975 + "license": "MIT",
  2976 + "peerDependencies": {
  2977 + "redux": "^5.0.0"
  2978 + }
  2979 + },
  2980 + "node_modules/reselect": {
  2981 + "version": "5.1.1",
  2982 + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz",
  2983 + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==",
  2984 + "license": "MIT"
  2985 + },
  2986 + "node_modules/resize-observer-polyfill": {
  2987 + "version": "1.5.1",
  2988 + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
  2989 + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==",
  2990 + "license": "MIT"
  2991 + },
  2992 + "node_modules/rollup": {
  2993 + "version": "4.60.2",
  2994 + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz",
  2995 + "integrity": "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==",
  2996 + "dev": true,
  2997 + "license": "MIT",
  2998 + "dependencies": {
  2999 + "@types/estree": "1.0.8"
  3000 + },
  3001 + "bin": {
  3002 + "rollup": "dist/bin/rollup"
  3003 + },
  3004 + "engines": {
  3005 + "node": ">=18.0.0",
  3006 + "npm": ">=8.0.0"
  3007 + },
  3008 + "optionalDependencies": {
  3009 + "@rollup/rollup-android-arm-eabi": "4.60.2",
  3010 + "@rollup/rollup-android-arm64": "4.60.2",
  3011 + "@rollup/rollup-darwin-arm64": "4.60.2",
  3012 + "@rollup/rollup-darwin-x64": "4.60.2",
  3013 + "@rollup/rollup-freebsd-arm64": "4.60.2",
  3014 + "@rollup/rollup-freebsd-x64": "4.60.2",
  3015 + "@rollup/rollup-linux-arm-gnueabihf": "4.60.2",
  3016 + "@rollup/rollup-linux-arm-musleabihf": "4.60.2",
  3017 + "@rollup/rollup-linux-arm64-gnu": "4.60.2",
  3018 + "@rollup/rollup-linux-arm64-musl": "4.60.2",
  3019 + "@rollup/rollup-linux-loong64-gnu": "4.60.2",
  3020 + "@rollup/rollup-linux-loong64-musl": "4.60.2",
  3021 + "@rollup/rollup-linux-ppc64-gnu": "4.60.2",
  3022 + "@rollup/rollup-linux-ppc64-musl": "4.60.2",
  3023 + "@rollup/rollup-linux-riscv64-gnu": "4.60.2",
  3024 + "@rollup/rollup-linux-riscv64-musl": "4.60.2",
  3025 + "@rollup/rollup-linux-s390x-gnu": "4.60.2",
  3026 + "@rollup/rollup-linux-x64-gnu": "4.60.2",
  3027 + "@rollup/rollup-linux-x64-musl": "4.60.2",
  3028 + "@rollup/rollup-openbsd-x64": "4.60.2",
  3029 + "@rollup/rollup-openharmony-arm64": "4.60.2",
  3030 + "@rollup/rollup-win32-arm64-msvc": "4.60.2",
  3031 + "@rollup/rollup-win32-ia32-msvc": "4.60.2",
  3032 + "@rollup/rollup-win32-x64-gnu": "4.60.2",
  3033 + "@rollup/rollup-win32-x64-msvc": "4.60.2",
  3034 + "fsevents": "~2.3.2"
  3035 + }
  3036 + },
  3037 + "node_modules/scheduler": {
  3038 + "version": "0.23.2",
  3039 + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
  3040 + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
  3041 + "license": "MIT",
  3042 + "dependencies": {
  3043 + "loose-envify": "^1.1.0"
  3044 + }
  3045 + },
  3046 + "node_modules/scroll-into-view-if-needed": {
  3047 + "version": "3.1.0",
  3048 + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz",
  3049 + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==",
  3050 + "license": "MIT",
  3051 + "dependencies": {
  3052 + "compute-scroll-into-view": "^3.0.2"
  3053 + }
  3054 + },
  3055 + "node_modules/semver": {
  3056 + "version": "6.3.1",
  3057 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
  3058 + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
  3059 + "dev": true,
  3060 + "license": "ISC",
  3061 + "bin": {
  3062 + "semver": "bin/semver.js"
  3063 + }
  3064 + },
  3065 + "node_modules/source-map-js": {
  3066 + "version": "1.2.1",
  3067 + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
  3068 + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
  3069 + "dev": true,
  3070 + "license": "BSD-3-Clause",
  3071 + "engines": {
  3072 + "node": ">=0.10.0"
  3073 + }
  3074 + },
  3075 + "node_modules/string-convert": {
  3076 + "version": "0.2.1",
  3077 + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz",
  3078 + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==",
  3079 + "license": "MIT"
  3080 + },
  3081 + "node_modules/stylis": {
  3082 + "version": "4.4.0",
  3083 + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz",
  3084 + "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==",
  3085 + "license": "MIT"
  3086 + },
  3087 + "node_modules/throttle-debounce": {
  3088 + "version": "5.0.2",
  3089 + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz",
  3090 + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==",
  3091 + "license": "MIT",
  3092 + "engines": {
  3093 + "node": ">=12.22"
  3094 + }
  3095 + },
  3096 + "node_modules/toggle-selection": {
  3097 + "version": "1.0.6",
  3098 + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
  3099 + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==",
  3100 + "license": "MIT"
  3101 + },
  3102 + "node_modules/typescript": {
  3103 + "version": "5.9.3",
  3104 + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
  3105 + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
  3106 + "dev": true,
  3107 + "license": "Apache-2.0",
  3108 + "bin": {
  3109 + "tsc": "bin/tsc",
  3110 + "tsserver": "bin/tsserver"
  3111 + },
  3112 + "engines": {
  3113 + "node": ">=14.17"
  3114 + }
  3115 + },
  3116 + "node_modules/update-browserslist-db": {
  3117 + "version": "1.2.3",
  3118 + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
  3119 + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
  3120 + "dev": true,
  3121 + "funding": [
  3122 + {
  3123 + "type": "opencollective",
  3124 + "url": "https://opencollective.com/browserslist"
  3125 + },
  3126 + {
  3127 + "type": "tidelift",
  3128 + "url": "https://tidelift.com/funding/github/npm/browserslist"
  3129 + },
  3130 + {
  3131 + "type": "github",
  3132 + "url": "https://github.com/sponsors/ai"
  3133 + }
  3134 + ],
  3135 + "license": "MIT",
  3136 + "dependencies": {
  3137 + "escalade": "^3.2.0",
  3138 + "picocolors": "^1.1.1"
  3139 + },
  3140 + "bin": {
  3141 + "update-browserslist-db": "cli.js"
  3142 + },
  3143 + "peerDependencies": {
  3144 + "browserslist": ">= 4.21.0"
  3145 + }
  3146 + },
  3147 + "node_modules/use-sync-external-store": {
  3148 + "version": "1.6.0",
  3149 + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
  3150 + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
  3151 + "license": "MIT",
  3152 + "peerDependencies": {
  3153 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
  3154 + }
  3155 + },
  3156 + "node_modules/vite": {
  3157 + "version": "5.4.21",
  3158 + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz",
  3159 + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
  3160 + "dev": true,
  3161 + "license": "MIT",
  3162 + "dependencies": {
  3163 + "esbuild": "^0.21.3",
  3164 + "postcss": "^8.4.43",
  3165 + "rollup": "^4.20.0"
  3166 + },
  3167 + "bin": {
  3168 + "vite": "bin/vite.js"
  3169 + },
  3170 + "engines": {
  3171 + "node": "^18.0.0 || >=20.0.0"
  3172 + },
  3173 + "funding": {
  3174 + "url": "https://github.com/vitejs/vite?sponsor=1"
  3175 + },
  3176 + "optionalDependencies": {
  3177 + "fsevents": "~2.3.3"
  3178 + },
  3179 + "peerDependencies": {
  3180 + "@types/node": "^18.0.0 || >=20.0.0",
  3181 + "less": "*",
  3182 + "lightningcss": "^1.21.0",
  3183 + "sass": "*",
  3184 + "sass-embedded": "*",
  3185 + "stylus": "*",
  3186 + "sugarss": "*",
  3187 + "terser": "^5.4.0"
  3188 + },
  3189 + "peerDependenciesMeta": {
  3190 + "@types/node": {
  3191 + "optional": true
  3192 + },
  3193 + "less": {
  3194 + "optional": true
  3195 + },
  3196 + "lightningcss": {
  3197 + "optional": true
  3198 + },
  3199 + "sass": {
  3200 + "optional": true
  3201 + },
  3202 + "sass-embedded": {
  3203 + "optional": true
  3204 + },
  3205 + "stylus": {
  3206 + "optional": true
  3207 + },
  3208 + "sugarss": {
  3209 + "optional": true
  3210 + },
  3211 + "terser": {
  3212 + "optional": true
  3213 + }
  3214 + }
  3215 + },
  3216 + "node_modules/yallist": {
  3217 + "version": "3.1.1",
  3218 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
  3219 + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
  3220 + "dev": true,
  3221 + "license": "ISC"
  3222 + }
  3223 + }
  3224 +}
frontend/package.json 0 → 100644
  1 +{
  2 + "name": "xly-erp-frontend",
  3 + "private": true,
  4 + "version": "0.0.1",
  5 + "type": "module",
  6 + "scripts": {
  7 + "dev": "vite",
  8 + "build": "tsc -b && vite build",
  9 + "preview": "vite preview"
  10 + },
  11 + "dependencies": {
  12 + "@ant-design/icons": "^5.5.1",
  13 + "@reduxjs/toolkit": "^2.2.7",
  14 + "antd": "^5.21.5",
  15 + "axios": "^1.7.7",
  16 + "dayjs": "^1.11.13",
  17 + "react": "^18.3.1",
  18 + "react-dom": "^18.3.1",
  19 + "react-redux": "^9.1.2",
  20 + "react-router-dom": "^6.27.0"
  21 + },
  22 + "devDependencies": {
  23 + "@types/react": "^18.3.12",
  24 + "@types/react-dom": "^18.3.1",
  25 + "@vitejs/plugin-react": "^4.3.3",
  26 + "typescript": "^5.6.3",
  27 + "vite": "^5.4.10"
  28 + }
  29 +}
frontend/src/App.tsx 0 → 100644
  1 +import { ConfigProvider, App as AntApp } from "antd";
  2 +import zhCN from "antd/locale/zh_CN";
  3 +import { Provider } from "react-redux";
  4 +import { RouterProvider } from "react-router-dom";
  5 +import { store } from "@/store";
  6 +import { router } from "@/router";
  7 +import { antdTheme } from "@/styles/theme";
  8 +
  9 +export default function App() {
  10 + return (
  11 + <ConfigProvider locale={zhCN} theme={antdTheme}>
  12 + <AntApp>
  13 + <Provider store={store}>
  14 + <RouterProvider router={router} />
  15 + </Provider>
  16 + </AntApp>
  17 + </ConfigProvider>
  18 + );
  19 +}
frontend/src/api/auth.ts 0 → 100644
  1 +import { request } from "./client";
  2 +
  3 +export interface UserBrief {
  4 + iIncrement: number;
  5 + sUserNo: string;
  6 + sUserName: string;
  7 + sUserType: string;
  8 + sLanguage: string;
  9 +}
  10 +
  11 +export interface LoginResponse {
  12 + accessToken: string;
  13 + refreshToken: string;
  14 + expiresIn: number;
  15 + user: UserBrief;
  16 +}
  17 +
  18 +export function login(
  19 + sUserName: string,
  20 + password: string,
  21 + version: string
  22 +): Promise<LoginResponse> {
  23 + return request<LoginResponse>({
  24 + url: "/usr/auth/login",
  25 + method: "POST",
  26 + data: { sUserName, password, version },
  27 + });
  28 +}
frontend/src/api/client.ts 0 → 100644
  1 +import axios, { AxiosError } from "axios";
  2 +import { message } from "antd";
  3 +
  4 +const TOKEN_KEY = "xly.access";
  5 +
  6 +export function getToken(): string | null {
  7 + return sessionStorage.getItem(TOKEN_KEY);
  8 +}
  9 +export function setToken(t: string): void {
  10 + sessionStorage.setItem(TOKEN_KEY, t);
  11 +}
  12 +export function clearToken(): void {
  13 + sessionStorage.removeItem(TOKEN_KEY);
  14 +}
  15 +
  16 +export interface ApiEnvelope<T = unknown> {
  17 + code: number;
  18 + msg: string;
  19 + data: T;
  20 +}
  21 +
  22 +export class ApiError extends Error {
  23 + code: number;
  24 + constructor(code: number, msg: string) {
  25 + super(msg);
  26 + this.code = code;
  27 + }
  28 +}
  29 +
  30 +export const http = axios.create({
  31 + baseURL: "/api",
  32 + timeout: 15000,
  33 + headers: { "Content-Type": "application/json" },
  34 +});
  35 +
  36 +http.interceptors.request.use((config) => {
  37 + const tok = getToken();
  38 + if (tok) {
  39 + config.headers = config.headers ?? {};
  40 + (config.headers as Record<string, string>).Authorization = `Bearer ${tok}`;
  41 + }
  42 + return config;
  43 +});
  44 +
  45 +http.interceptors.response.use(
  46 + (response) => {
  47 + const env = response.data as ApiEnvelope;
  48 + if (env && typeof env.code === "number" && env.code !== 0) {
  49 + message.error(env.msg || "请求失败");
  50 + throw new ApiError(env.code, env.msg || "请求失败");
  51 + }
  52 + return response;
  53 + },
  54 + (err: AxiosError<ApiEnvelope>) => {
  55 + if (err.response?.status === 401) {
  56 + clearToken();
  57 + // Redirect to /login. Use location to avoid coupling axios with React Router.
  58 + if (window.location.pathname !== "/login") {
  59 + window.location.href = "/login";
  60 + }
  61 + return Promise.reject(new ApiError(401, "未登录或会话过期"));
  62 + }
  63 + const env = err.response?.data;
  64 + const msg = env?.msg || err.message || "网络错误";
  65 + message.error(msg);
  66 + return Promise.reject(new ApiError(env?.code ?? -1, msg));
  67 + }
  68 +);
  69 +
  70 +// Convenience: call http and unwrap envelope to data.
  71 +export async function request<T = unknown>(
  72 + config: Parameters<typeof http.request>[0]
  73 +): Promise<T> {
  74 + const resp = await http.request<ApiEnvelope<T>>(config);
  75 + return resp.data.data;
  76 +}
frontend/src/api/module.ts 0 → 100644
  1 +import { request } from "./client";
  2 +
  3 +export interface ModuleTreeVO {
  4 + iIncrement: number;
  5 + sModuleNameZh: string;
  6 + sDisplayType: string;
  7 + sManageDeptEn: string;
  8 + iParentId: number | null;
  9 + iSortOrder: number;
  10 + children: ModuleTreeVO[];
  11 +}
  12 +
  13 +export interface ModuleDTO {
  14 + sDisplayType: string;
  15 + sProcedureName?: string;
  16 + sModuleType: string;
  17 + sManageDeptEn: string;
  18 + bShowPermission?: boolean;
  19 + sModuleNameZh: string;
  20 + iParentId?: number | null;
  21 + iSortOrder?: number;
  22 +}
  23 +
  24 +export function listModules(keyword?: string): Promise<ModuleTreeVO[]> {
  25 + return request<ModuleTreeVO[]>({
  26 + url: "/mod/modules",
  27 + method: "GET",
  28 + params: keyword ? { keyword } : {},
  29 + });
  30 +}
  31 +
  32 +export function createModule(dto: ModuleDTO): Promise<{ iIncrement: number }> {
  33 + return request({ url: "/mod/modules", method: "POST", data: dto });
  34 +}
  35 +
  36 +export function updateModule(
  37 + id: number,
  38 + dto: ModuleDTO
  39 +): Promise<{ iIncrement: number }> {
  40 + return request({ url: `/mod/modules/${id}`, method: "PUT", data: dto });
  41 +}
  42 +
  43 +export function deleteModule(id: number): Promise<void> {
  44 + return request({ url: `/mod/modules/${id}`, method: "DELETE" });
  45 +}
frontend/src/api/user.ts 0 → 100644
  1 +import { request } from "./client";
  2 +
  3 +export interface UserListVO {
  4 + iIncrement: number;
  5 + sUserName: string;
  6 + staffName: string | null;
  7 + sUserNo: string;
  8 + department: string | null;
  9 + sUserType: string;
  10 + sLanguage: string;
  11 + bDeleted: boolean;
  12 + tLastLoginDate: string | null;
  13 + sCreatedBy: string | null;
  14 + tCreateDate: string;
  15 +}
  16 +
  17 +export interface UserListPage {
  18 + records: UserListVO[];
  19 + total: number;
  20 + pageNum: number;
  21 + pageSize: number;
  22 +}
  23 +
  24 +export interface UserListParams {
  25 + field?: string;
  26 + match?: string;
  27 + value?: string;
  28 + pageNum?: number;
  29 + pageSize?: number;
  30 +}
  31 +
  32 +export interface UserDTO {
  33 + sUserNo: string;
  34 + sUserName: string;
  35 + iStaffId?: number | null;
  36 + sUserType: string;
  37 + sLanguage: string;
  38 + bCanModifyDocs?: boolean;
  39 +}
  40 +
  41 +export function listUsers(params: UserListParams = {}): Promise<UserListPage> {
  42 + return request<UserListPage>({
  43 + url: "/usr/users",
  44 + method: "GET",
  45 + params,
  46 + });
  47 +}
  48 +
  49 +export function createUser(dto: UserDTO): Promise<{ iIncrement: number; sUserNo: string }> {
  50 + return request({ url: "/usr/users", method: "POST", data: dto });
  51 +}
  52 +
  53 +export function updateUser(id: number, dto: UserDTO): Promise<{ iIncrement: number }> {
  54 + return request({ url: `/usr/users/${id}`, method: "PUT", data: dto });
  55 +}
frontend/src/components/MegaNav.tsx 0 → 100644
  1 +import { useState } from "react";
  2 +import { CloseOutlined, FolderOutlined, SettingOutlined } from "@ant-design/icons";
  3 +import { MEGA_NAV, MEGA_COLUMNS } from "@/utils/data";
  4 +
  5 +interface Props {
  6 + onClose: () => void;
  7 + onOpen: (screen: string, label: string) => void;
  8 +}
  9 +
  10 +export default function MegaNav({ onClose, onOpen }: Props) {
  11 + const [activeId, setActiveId] = useState<string>(
  12 + MEGA_NAV.find((s) => s.active)?.id ?? "sys"
  13 + );
  14 + const columns = MEGA_COLUMNS[activeId] ?? [];
  15 +
  16 + return (
  17 + <div
  18 + style={{
  19 + position: "fixed",
  20 + inset: 0,
  21 + background: "rgba(0,0,0,0.4)",
  22 + zIndex: 100,
  23 + display: "flex",
  24 + }}
  25 + onClick={onClose}
  26 + >
  27 + <div
  28 + onClick={(e) => e.stopPropagation()}
  29 + style={{
  30 + display: "flex",
  31 + flex: 1,
  32 + background: "#fff",
  33 + margin: "60px auto",
  34 + maxWidth: 1100,
  35 + height: "calc(100% - 120px)",
  36 + border: "1px solid var(--border)",
  37 + boxShadow: "0 6px 32px rgba(0,0,0,0.3)",
  38 + }}
  39 + >
  40 + <div
  41 + style={{
  42 + width: 200,
  43 + borderRight: "1px solid var(--border)",
  44 + background: "var(--bg-app)",
  45 + overflow: "auto",
  46 + }}
  47 + >
  48 + {MEGA_NAV.map((s) => {
  49 + const active = s.id === activeId;
  50 + return (
  51 + <div
  52 + key={s.id}
  53 + onClick={() => setActiveId(s.id)}
  54 + style={{
  55 + display: "flex",
  56 + alignItems: "center",
  57 + gap: 8,
  58 + padding: "8px 12px",
  59 + fontSize: 12,
  60 + cursor: "pointer",
  61 + color: active ? "var(--accent-strong)" : "var(--text)",
  62 + background: active ? "var(--accent-soft)" : "transparent",
  63 + borderLeft: active ? "3px solid var(--accent)" : "3px solid transparent",
  64 + fontWeight: active ? 500 : 400,
  65 + }}
  66 + >
  67 + {s.id === "sys" ? <SettingOutlined /> : <FolderOutlined />}
  68 + {s.label}
  69 + </div>
  70 + );
  71 + })}
  72 + </div>
  73 + <div
  74 + style={{
  75 + flex: 1,
  76 + display: "flex",
  77 + flexDirection: "column",
  78 + overflow: "hidden",
  79 + }}
  80 + >
  81 + <div
  82 + style={{
  83 + display: "flex",
  84 + alignItems: "center",
  85 + padding: "10px 16px",
  86 + borderBottom: "1px solid var(--border)",
  87 + }}
  88 + >
  89 + <div style={{ flex: 1, fontSize: 14, fontWeight: 500 }}>
  90 + {MEGA_NAV.find((s) => s.id === activeId)?.label}
  91 + </div>
  92 + <button
  93 + onClick={onClose}
  94 + style={{
  95 + background: "transparent",
  96 + border: "none",
  97 + cursor: "pointer",
  98 + fontSize: 14,
  99 + color: "var(--text-muted)",
  100 + }}
  101 + >
  102 + <CloseOutlined />
  103 + </button>
  104 + </div>
  105 + <div
  106 + style={{
  107 + flex: 1,
  108 + overflow: "auto",
  109 + padding: 16,
  110 + display: "grid",
  111 + gridTemplateColumns: "repeat(auto-fill, minmax(200px, 1fr))",
  112 + gap: 16,
  113 + alignContent: "start",
  114 + }}
  115 + >
  116 + {columns.length === 0 && (
  117 + <div style={{ color: "var(--text-faint)", fontSize: 12 }}>
  118 + 此分类暂无配置内容
  119 + </div>
  120 + )}
  121 + {columns.map((col) => (
  122 + <div key={col.title}>
  123 + <div
  124 + style={{
  125 + fontSize: 12,
  126 + fontWeight: 500,
  127 + color: "var(--text-muted)",
  128 + paddingBottom: 6,
  129 + borderBottom: "1px solid var(--border)",
  130 + marginBottom: 6,
  131 + }}
  132 + >
  133 + {col.title}
  134 + </div>
  135 + {col.items.map((it) => (
  136 + <div
  137 + key={it.label}
  138 + onClick={() => {
  139 + if (it.screen) {
  140 + onOpen(it.screen, it.label);
  141 + onClose();
  142 + }
  143 + }}
  144 + style={{
  145 + padding: "5px 6px",
  146 + fontSize: 12,
  147 + cursor: it.screen ? "pointer" : "default",
  148 + color: it.screen
  149 + ? it.featured
  150 + ? "var(--accent-strong)"
  151 + : "var(--text)"
  152 + : "var(--text-faint)",
  153 + fontWeight: it.featured ? 500 : 400,
  154 + borderRadius: 2,
  155 + }}
  156 + onMouseEnter={(e) => {
  157 + if (it.screen) e.currentTarget.style.background = "var(--bg-row-hover)";
  158 + }}
  159 + onMouseLeave={(e) => {
  160 + e.currentTarget.style.background = "transparent";
  161 + }}
  162 + >
  163 + {it.label}
  164 + </div>
  165 + ))}
  166 + </div>
  167 + ))}
  168 + </div>
  169 + </div>
  170 + </div>
  171 + </div>
  172 + );
  173 +}
frontend/src/components/PrivateRoute.tsx 0 → 100644
  1 +import { Navigate } from "react-router-dom";
  2 +import { useAppSelector } from "@/store";
  3 +import { ReactNode } from "react";
  4 +
  5 +export default function PrivateRoute({ children }: { children: ReactNode }) {
  6 + const token = useAppSelector((s) => s.auth.token);
  7 + if (!token) return <Navigate to="/login" replace />;
  8 + return <>{children}</>;
  9 +}
frontend/src/components/Sidebar.tsx 0 → 100644
  1 +import { useState } from "react";
  2 +import {
  3 + HomeOutlined,
  4 + FolderOutlined,
  5 + FileTextOutlined,
  6 + SettingOutlined,
  7 + DownOutlined,
  8 + RightOutlined,
  9 + SearchOutlined,
  10 +} from "@ant-design/icons";
  11 +import { NAV_TREE, type NavNode } from "@/utils/data";
  12 +
  13 +interface Props {
  14 + activeNodeId: string;
  15 + onNodeClick: (node: NavNode) => void;
  16 +}
  17 +
  18 +const iconFor = (icon?: string) => {
  19 + switch (icon) {
  20 + case "home":
  21 + return <HomeOutlined />;
  22 + case "doc":
  23 + return <FileTextOutlined />;
  24 + case "settings":
  25 + return <SettingOutlined />;
  26 + default:
  27 + return <FolderOutlined />;
  28 + }
  29 +};
  30 +
  31 +export default function Sidebar({ activeNodeId, onNodeClick }: Props) {
  32 + const [expanded, setExpanded] = useState<Record<string, boolean>>({
  33 + kpi: true,
  34 + quote: true,
  35 + sys: true,
  36 + });
  37 + const [query, setQuery] = useState("");
  38 +
  39 + const toggle = (id: string) => setExpanded((s) => ({ ...s, [id]: !s[id] }));
  40 +
  41 + const renderNode = (node: NavNode, depth: number): React.ReactNode => {
  42 + const hasChildren = !!(node.children && node.children.length);
  43 + const isOpen = !!expanded[node.id];
  44 + const active = node.id === activeNodeId;
  45 +
  46 + if (query && !node.label.toLowerCase().includes(query.toLowerCase()) && !hasChildren) {
  47 + return null;
  48 + }
  49 +
  50 + return (
  51 + <div key={node.id}>
  52 + <div
  53 + onClick={() => {
  54 + if (hasChildren) toggle(node.id);
  55 + onNodeClick(node);
  56 + }}
  57 + style={{
  58 + display: "flex",
  59 + alignItems: "center",
  60 + gap: 6,
  61 + paddingLeft: 8 + depth * 14,
  62 + paddingRight: 8,
  63 + height: 26,
  64 + fontSize: 12,
  65 + cursor: "pointer",
  66 + color: active ? "var(--accent-strong)" : "var(--text)",
  67 + background: active ? "var(--selected)" : "transparent",
  68 + borderLeft: active ? "2px solid var(--accent)" : "2px solid transparent",
  69 + fontWeight: active ? 500 : 400,
  70 + }}
  71 + onMouseEnter={(e) => {
  72 + if (!active) e.currentTarget.style.background = "var(--bg-row-hover)";
  73 + }}
  74 + onMouseLeave={(e) => {
  75 + if (!active) e.currentTarget.style.background = "transparent";
  76 + }}
  77 + >
  78 + <span style={{ width: 12, display: "inline-flex" }}>
  79 + {hasChildren ? (
  80 + isOpen ? (
  81 + <DownOutlined style={{ fontSize: 9 }} />
  82 + ) : (
  83 + <RightOutlined style={{ fontSize: 9 }} />
  84 + )
  85 + ) : null}
  86 + </span>
  87 + <span style={{ display: "inline-flex", color: "var(--text-muted)" }}>
  88 + {iconFor(node.icon)}
  89 + </span>
  90 + <span style={{ flex: 1, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>
  91 + {node.label}
  92 + </span>
  93 + {node.badge && (
  94 + <span
  95 + style={{
  96 + fontSize: 10,
  97 + color: "var(--accent-strong)",
  98 + background: "var(--accent-soft)",
  99 + padding: "1px 5px",
  100 + borderRadius: 2,
  101 + }}
  102 + >
  103 + {node.badge}
  104 + </span>
  105 + )}
  106 + </div>
  107 + {hasChildren && isOpen && (
  108 + <div>{node.children!.map((c) => renderNode(c, depth + 1))}</div>
  109 + )}
  110 + </div>
  111 + );
  112 + };
  113 +
  114 + return (
  115 + <div
  116 + style={{
  117 + height: "100%",
  118 + display: "flex",
  119 + flexDirection: "column",
  120 + background: "#fff",
  121 + borderRight: "1px solid var(--border)",
  122 + }}
  123 + >
  124 + <div
  125 + style={{
  126 + padding: 6,
  127 + borderBottom: "1px solid var(--border)",
  128 + display: "flex",
  129 + alignItems: "center",
  130 + gap: 6,
  131 + }}
  132 + >
  133 + <SearchOutlined style={{ color: "var(--text-faint)", fontSize: 12 }} />
  134 + <input
  135 + value={query}
  136 + onChange={(e) => setQuery(e.target.value)}
  137 + placeholder="搜索菜单"
  138 + style={{
  139 + flex: 1,
  140 + height: 22,
  141 + border: "1px solid var(--border-input)",
  142 + background: "var(--bg-input)",
  143 + padding: "0 6px",
  144 + fontSize: 12,
  145 + outline: "none",
  146 + fontFamily: "inherit",
  147 + }}
  148 + />
  149 + </div>
  150 + <div style={{ flex: 1, overflow: "auto" }}>{NAV_TREE.map((n) => renderNode(n, 0))}</div>
  151 + </div>
  152 + );
  153 +}
frontend/src/components/TabStrip.tsx 0 → 100644
  1 +import { CloseOutlined } from "@ant-design/icons";
  2 +import { useAppDispatch, useAppSelector } from "@/store";
  3 +import { closeTab, setActiveTab } from "@/store/tabsSlice";
  4 +
  5 +export default function TabStrip() {
  6 + const tabs = useAppSelector((s) => s.tabs.tabs);
  7 + const activeTabId = useAppSelector((s) => s.tabs.activeTabId);
  8 + const dispatch = useAppDispatch();
  9 +
  10 + return (
  11 + <div className="tab-strip">
  12 + {tabs.map((t) => {
  13 + const active = t.id === activeTabId;
  14 + return (
  15 + <div
  16 + key={t.id}
  17 + className={`tab-item ${active ? "active" : ""}`}
  18 + onClick={() => dispatch(setActiveTab(t.id))}
  19 + >
  20 + <span style={{ overflow: "hidden", textOverflow: "ellipsis", maxWidth: 220, whiteSpace: "nowrap" }}>
  21 + {t.label}
  22 + </span>
  23 + {t.closable !== false && (
  24 + <span
  25 + className="close"
  26 + onClick={(e) => {
  27 + e.stopPropagation();
  28 + dispatch(closeTab(t.id));
  29 + }}
  30 + >
  31 + <CloseOutlined style={{ fontSize: 10 }} />
  32 + </span>
  33 + )}
  34 + </div>
  35 + );
  36 + })}
  37 + </div>
  38 + );
  39 +}
frontend/src/components/TopBar.tsx 0 → 100644
  1 +import {
  2 + AppstoreOutlined,
  3 + HomeOutlined,
  4 + SearchOutlined,
  5 + BellOutlined,
  6 + BankOutlined,
  7 + DownOutlined,
  8 +} from "@ant-design/icons";
  9 +import { Dropdown } from "antd";
  10 +import { useAppDispatch, useAppSelector } from "@/store";
  11 +import { logout } from "@/store/authSlice";
  12 +import { resetTabs, setActiveTab } from "@/store/tabsSlice";
  13 +import { useNavigate } from "react-router-dom";
  14 +
  15 +interface Props {
  16 + onOpenMegaNav: () => void;
  17 +}
  18 +
  19 +export default function TopBar({ onOpenMegaNav }: Props) {
  20 + const auth = useAppSelector((s) => s.auth);
  21 + const dispatch = useAppDispatch();
  22 + const navigate = useNavigate();
  23 +
  24 + const onLogout = () => {
  25 + dispatch(logout());
  26 + dispatch(resetTabs());
  27 + navigate("/login", { replace: true });
  28 + };
  29 +
  30 + const goHome = () => {
  31 + dispatch(setActiveTab("home"));
  32 + };
  33 +
  34 + return (
  35 + <div className="top-bar">
  36 + <button className="top-btn" onClick={onOpenMegaNav} title="全部导航">
  37 + <AppstoreOutlined /> 全部导航
  38 + </button>
  39 + <button className="top-btn" onClick={goHome} title="主页">
  40 + <HomeOutlined /> 主页
  41 + </button>
  42 + <div
  43 + style={{
  44 + flex: 1,
  45 + minWidth: 0,
  46 + display: "flex",
  47 + alignItems: "center",
  48 + gap: 8,
  49 + paddingLeft: 12,
  50 + overflow: "hidden",
  51 + }}
  52 + >
  53 + <Brand />
  54 + <span
  55 + style={{
  56 + color: "#fff",
  57 + fontSize: 13,
  58 + fontWeight: 500,
  59 + letterSpacing: 1,
  60 + whiteSpace: "nowrap",
  61 + flex: "none",
  62 + }}
  63 + >
  64 + XLY-ERP
  65 + </span>
  66 + <span
  67 + style={{
  68 + color: "var(--text-on-dark-muted)",
  69 + fontSize: 11,
  70 + whiteSpace: "nowrap",
  71 + overflow: "hidden",
  72 + textOverflow: "ellipsis",
  73 + minWidth: 0,
  74 + }}
  75 + >
  76 + · {auth.companyName ?? ""}
  77 + </span>
  78 + </div>
  79 + <button className="top-btn">
  80 + <SearchOutlined />
  81 + </button>
  82 + <button className="top-btn">
  83 + <span style={{ position: "relative", display: "inline-flex" }}>
  84 + <BellOutlined />
  85 + <span
  86 + style={{
  87 + position: "absolute",
  88 + top: -2,
  89 + right: -3,
  90 + width: 6,
  91 + height: 6,
  92 + background: "var(--danger)",
  93 + borderRadius: 3,
  94 + }}
  95 + />
  96 + </span>
  97 + </button>
  98 + <Dropdown
  99 + menu={{ items: [{ key: "logout", label: "登出", onClick: onLogout }] }}
  100 + placement="bottomRight"
  101 + >
  102 + <button className="top-btn">
  103 + <BankOutlined /> {auth.user?.sUserName ?? "用户"}({auth.user?.sUserType ?? ""})
  104 + <DownOutlined style={{ fontSize: 10, marginLeft: 2 }} />
  105 + </button>
  106 + </Dropdown>
  107 + </div>
  108 + );
  109 +}
  110 +
  111 +function Brand() {
  112 + return (
  113 + <svg width="22" height="22" viewBox="0 0 22 22" fill="none" style={{ flex: "none" }}>
  114 + <rect x="2" y="2" width="10" height="10" stroke="rgba(255,255,255,0.95)" strokeWidth="1.5" />
  115 + <rect x="6" y="6" width="10" height="10" stroke="rgba(255,255,255,0.85)" strokeWidth="1.5" />
  116 + <rect x="10" y="10" width="10" height="10" stroke="rgba(255,255,255,0.7)" strokeWidth="1.5" />
  117 + </svg>
  118 + );
  119 +}
frontend/src/main.tsx 0 → 100644
  1 +import React from "react";
  2 +import ReactDOM from "react-dom/client";
  3 +import App from "./App";
  4 +import "./styles/tokens.css";
  5 +import "./styles/global.css";
  6 +
  7 +ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
  8 + <React.StrictMode>
  9 + <App />
  10 + </React.StrictMode>
  11 +);
frontend/src/pages/Home.tsx 0 → 100644
  1 +import { useAppDispatch, useAppSelector } from "@/store";
  2 +import { openTab } from "@/store/tabsSlice";
  3 +
  4 +const STATS = [
  5 + { label: "待办事项", value: 12, color: "#3a8ee0" },
  6 + { label: "今日报价", value: 5, color: "#27a567" },
  7 + { label: "进行中订单", value: 28, color: "#d98e1f" },
  8 + { label: "待审核", value: 3, color: "#d04141" },
  9 +];
  10 +
  11 +export default function Home() {
  12 + const auth = useAppSelector((s) => s.auth);
  13 + const dispatch = useAppDispatch();
  14 +
  15 + return (
  16 + <div style={{ padding: 16, height: "100%", overflow: "auto", background: "var(--bg-app)" }}>
  17 + <div
  18 + style={{
  19 + background: "#fff",
  20 + padding: 20,
  21 + marginBottom: 14,
  22 + border: "1px solid var(--border)",
  23 + }}
  24 + >
  25 + <div style={{ fontSize: 16, fontWeight: 500, marginBottom: 4 }}>
  26 + 欢迎回来,{auth.user?.sUserName ?? ""}
  27 + </div>
  28 + <div style={{ fontSize: 12, color: "var(--text-muted)" }}>
  29 + XLY-ERP · {auth.companyName ?? ""}
  30 + </div>
  31 + </div>
  32 +
  33 + <div
  34 + style={{
  35 + display: "grid",
  36 + gridTemplateColumns: "repeat(auto-fit, minmax(180px, 1fr))",
  37 + gap: 12,
  38 + marginBottom: 14,
  39 + }}
  40 + >
  41 + {STATS.map((s) => (
  42 + <div
  43 + key={s.label}
  44 + style={{
  45 + background: "#fff",
  46 + padding: 16,
  47 + border: "1px solid var(--border)",
  48 + borderTop: `3px solid ${s.color}`,
  49 + }}
  50 + >
  51 + <div style={{ fontSize: 12, color: "var(--text-muted)", marginBottom: 6 }}>
  52 + {s.label}
  53 + </div>
  54 + <div style={{ fontSize: 26, fontWeight: 600, color: s.color }}>{s.value}</div>
  55 + </div>
  56 + ))}
  57 + </div>
  58 +
  59 + <div
  60 + style={{
  61 + background: "#fff",
  62 + padding: 16,
  63 + border: "1px solid var(--border)",
  64 + }}
  65 + >
  66 + <div style={{ fontSize: 13, fontWeight: 500, marginBottom: 10 }}>快捷入口</div>
  67 + <div style={{ display: "flex", gap: 8, flexWrap: "wrap" }}>
  68 + <QuickLink
  69 + label="用户列表"
  70 + onClick={() =>
  71 + dispatch(openTab({ id: "userlist", label: "用户列表", screen: "userlist" }))
  72 + }
  73 + />
  74 + <QuickLink
  75 + label="系统模块配置"
  76 + onClick={() =>
  77 + dispatch(openTab({ id: "module", label: "系统模块配置", screen: "module" }))
  78 + }
  79 + />
  80 + </div>
  81 + </div>
  82 + </div>
  83 + );
  84 +}
  85 +
  86 +function QuickLink({ label, onClick }: { label: string; onClick: () => void }) {
  87 + return (
  88 + <button
  89 + onClick={onClick}
  90 + style={{
  91 + height: 30,
  92 + padding: "0 14px",
  93 + border: "1px solid var(--border)",
  94 + background: "var(--bg-input)",
  95 + cursor: "pointer",
  96 + fontSize: 12,
  97 + color: "var(--text)",
  98 + fontFamily: "inherit",
  99 + }}
  100 + >
  101 + {label}
  102 + </button>
  103 + );
  104 +}
frontend/src/pages/Login.tsx 0 → 100644
  1 +import { useState } from "react";
  2 +import { useNavigate } from "react-router-dom";
  3 +import { App as AntApp, Button } from "antd";
  4 +import { UserOutlined, LockOutlined, DownOutlined } from "@ant-design/icons";
  5 +import { login } from "@/api/auth";
  6 +import { useAppDispatch } from "@/store";
  7 +import { loginSucceeded } from "@/store/authSlice";
  8 +import { COMPANIES } from "@/utils/data";
  9 +
  10 +export default function Login() {
  11 + const navigate = useNavigate();
  12 + const dispatch = useAppDispatch();
  13 + const { message } = AntApp.useApp();
  14 +
  15 + const [user, setUser] = useState("admin");
  16 + const [pass, setPass] = useState("666666");
  17 + const [companyId, setCompanyId] = useState("std");
  18 + const [companyOpen, setCompanyOpen] = useState(false);
  19 + const [submitting, setSubmitting] = useState(false);
  20 +
  21 + const company = COMPANIES.find((c) => c.id === companyId);
  22 +
  23 + const submit = async (e?: React.FormEvent) => {
  24 + e?.preventDefault();
  25 + if (!user || !pass) return;
  26 + setSubmitting(true);
  27 + try {
  28 + const data = await login(user, pass, companyId);
  29 + dispatch(
  30 + loginSucceeded({
  31 + token: data.accessToken,
  32 + user: data.user,
  33 + companyId,
  34 + companyName: company?.name ?? companyId,
  35 + })
  36 + );
  37 + message.success("登录成功");
  38 + navigate("/home", { replace: true });
  39 + } catch {
  40 + // message.error already shown by interceptor
  41 + } finally {
  42 + setSubmitting(false);
  43 + }
  44 + };
  45 +
  46 + return (
  47 + <div
  48 + style={{
  49 + position: "fixed",
  50 + inset: 0,
  51 + background:
  52 + "radial-gradient(ellipse at center, #424b60 0%, #2e3645 70%, #262d3a 100%)",
  53 + display: "flex",
  54 + flexDirection: "column",
  55 + alignItems: "center",
  56 + justifyContent: "center",
  57 + fontFamily: "inherit",
  58 + }}
  59 + >
  60 + <div style={{ width: 320, marginTop: -40 }}>
  61 + <div
  62 + style={{
  63 + display: "flex",
  64 + flexDirection: "column",
  65 + alignItems: "center",
  66 + marginBottom: 28,
  67 + }}
  68 + >
  69 + <div style={{ marginBottom: 10 }}>
  70 + <svg width="76" height="76" viewBox="0 0 76 76" fill="none">
  71 + <rect x="8" y="8" width="34" height="34" stroke="rgba(255,255,255,0.95)" strokeWidth="2" />
  72 + <rect x="22" y="22" width="34" height="34" stroke="rgba(255,255,255,0.85)" strokeWidth="2" />
  73 + <rect x="36" y="36" width="32" height="32" stroke="rgba(255,255,255,0.7)" strokeWidth="2" />
  74 + <circle cx="38" cy="38" r="4" stroke="#fff" strokeWidth="1.5" />
  75 + <path d="M38 32v12M32 38h12" stroke="#fff" strokeWidth="1" />
  76 + </svg>
  77 + </div>
  78 + <div
  79 + style={{
  80 + color: "#fff",
  81 + fontSize: 22,
  82 + fontWeight: 600,
  83 + letterSpacing: 4,
  84 + marginBottom: 2,
  85 + }}
  86 + >
  87 + XLY-ERP
  88 + </div>
  89 + <div style={{ color: "rgba(255,255,255,0.55)", fontSize: 11, letterSpacing: 2 }}>
  90 + 印刷制造管理平台
  91 + </div>
  92 + </div>
  93 +
  94 + <form onSubmit={submit}>
  95 + <div style={fieldWrap}>
  96 + <span style={fieldIcon}>
  97 + <UserOutlined style={{ color: "rgba(0,0,0,0.5)", fontSize: 14 }} />
  98 + </span>
  99 + <span style={fieldDivider} />
  100 + <input
  101 + value={user}
  102 + onChange={(e) => setUser(e.target.value)}
  103 + placeholder="请输入用户名"
  104 + style={inputStyle}
  105 + />
  106 + </div>
  107 + <div style={fieldWrap}>
  108 + <span style={fieldIcon}>
  109 + <LockOutlined style={{ color: "rgba(0,0,0,0.5)", fontSize: 14 }} />
  110 + </span>
  111 + <span style={fieldDivider} />
  112 + <input
  113 + type="password"
  114 + value={pass}
  115 + onChange={(e) => setPass(e.target.value)}
  116 + placeholder="请输入密码"
  117 + style={inputStyle}
  118 + />
  119 + </div>
  120 + <div style={{ position: "relative", marginBottom: 14 }}>
  121 + <button
  122 + type="button"
  123 + onClick={() => setCompanyOpen((v) => !v)}
  124 + style={{
  125 + ...fieldWrap,
  126 + width: "100%",
  127 + cursor: "pointer",
  128 + textAlign: "left",
  129 + paddingRight: 12,
  130 + }}
  131 + >
  132 + <span style={{ flex: 1, color: "#1a2332", fontSize: 13, paddingLeft: 12 }}>
  133 + {company?.name ?? "请选择公司名"}
  134 + </span>
  135 + <span style={{ color: "rgba(0,0,0,0.5)", display: "inline-flex", paddingRight: 4 }}>
  136 + <DownOutlined
  137 + style={{
  138 + fontSize: 12,
  139 + transform: companyOpen ? "rotate(180deg)" : "none",
  140 + transition: "transform 0.15s",
  141 + }}
  142 + />
  143 + </span>
  144 + </button>
  145 + {companyOpen && (
  146 + <div
  147 + style={{
  148 + position: "absolute",
  149 + top: "calc(100% + 2px)",
  150 + left: 0,
  151 + right: 0,
  152 + background: "rgba(60,68,82,0.98)",
  153 + border: "1px solid rgba(255,255,255,0.1)",
  154 + zIndex: 10,
  155 + }}
  156 + >
  157 + {COMPANIES.map((c, i) => {
  158 + const sel = c.id === companyId;
  159 + return (
  160 + <div
  161 + key={c.id}
  162 + onClick={() => {
  163 + setCompanyId(c.id);
  164 + setCompanyOpen(false);
  165 + }}
  166 + style={{
  167 + padding: "9px 12px",
  168 + color: "#fff",
  169 + fontSize: 13,
  170 + cursor: "pointer",
  171 + background: sel ? "var(--accent)" : "transparent",
  172 + borderTop: i === 0 ? "none" : "1px solid rgba(255,255,255,0.04)",
  173 + }}
  174 + >
  175 + {c.name}
  176 + </div>
  177 + );
  178 + })}
  179 + </div>
  180 + )}
  181 + </div>
  182 + <Button
  183 + type="primary"
  184 + htmlType="submit"
  185 + loading={submitting}
  186 + block
  187 + style={{
  188 + height: 38,
  189 + fontSize: 14,
  190 + letterSpacing: 8,
  191 + borderRadius: 0,
  192 + }}
  193 + >
  194 + {submitting ? "登 录 中" : "登 录"}
  195 + </Button>
  196 + </form>
  197 + </div>
  198 +
  199 + <div
  200 + style={{
  201 + position: "absolute",
  202 + bottom: 24,
  203 + left: 0,
  204 + right: 0,
  205 + textAlign: "center",
  206 + color: "rgba(255,255,255,0.3)",
  207 + fontSize: 11,
  208 + letterSpacing: 1,
  209 + }}
  210 + >
  211 + XLY 软件 · 印刷制造管理平台 · 版权所有 © 2017–2026
  212 + </div>
  213 + </div>
  214 + );
  215 +}
  216 +
  217 +const fieldWrap: React.CSSProperties = {
  218 + display: "flex",
  219 + alignItems: "center",
  220 + height: 38,
  221 + background: "rgba(255,255,255,0.95)",
  222 + border: "1px solid rgba(255,255,255,0.15)",
  223 + marginBottom: 10,
  224 +};
  225 +const fieldIcon: React.CSSProperties = {
  226 + width: 36,
  227 + display: "inline-flex",
  228 + alignItems: "center",
  229 + justifyContent: "center",
  230 +};
  231 +const fieldDivider: React.CSSProperties = {
  232 + width: 1,
  233 + height: 18,
  234 + background: "rgba(0,0,0,0.12)",
  235 +};
  236 +const inputStyle: React.CSSProperties = {
  237 + flex: 1,
  238 + height: "100%",
  239 + border: "none",
  240 + background: "transparent",
  241 + paddingLeft: 10,
  242 + paddingRight: 10,
  243 + fontSize: 13,
  244 + color: "#1a2332",
  245 + outline: "none",
  246 + fontFamily: "inherit",
  247 +};
frontend/src/pages/Workspace.tsx 0 → 100644
  1 +import { useState } from "react";
  2 +import TopBar from "@/components/TopBar";
  3 +import Sidebar from "@/components/Sidebar";
  4 +import TabStrip from "@/components/TabStrip";
  5 +import MegaNav from "@/components/MegaNav";
  6 +import Home from "@/pages/Home";
  7 +import UserList from "@/pages/usr/UserList";
  8 +import UserDetail from "@/pages/usr/UserDetail";
  9 +import ModuleConfig from "@/pages/mod/ModuleConfig";
  10 +import { useAppDispatch, useAppSelector } from "@/store";
  11 +import { openTab } from "@/store/tabsSlice";
  12 +import type { NavNode } from "@/utils/data";
  13 +
  14 +export default function Workspace() {
  15 + const tabs = useAppSelector((s) => s.tabs.tabs);
  16 + const activeTabId = useAppSelector((s) => s.tabs.activeTabId);
  17 + const auth = useAppSelector((s) => s.auth);
  18 + const dispatch = useAppDispatch();
  19 + const [activeNodeId, setActiveNodeId] = useState("home");
  20 + const [megaOpen, setMegaOpen] = useState(false);
  21 +
  22 + const handleNodeClick = (node: NavNode) => {
  23 + setActiveNodeId(node.id);
  24 + if (node.screen === "userlist") {
  25 + dispatch(openTab({ id: "userlist", label: "用户列表", screen: "userlist" }));
  26 + } else if (node.screen === "module") {
  27 + dispatch(openTab({ id: "module", label: "系统模块配置", screen: "module" }));
  28 + } else if (node.id === "home") {
  29 + dispatch(openTab({ id: "home", label: "主页", screen: "home", closable: false }));
  30 + } else if (!node.children?.length) {
  31 + dispatch(
  32 + openTab({ id: node.id, label: node.label, screen: "stub", meta: { stubLabel: node.label } })
  33 + );
  34 + }
  35 + };
  36 +
  37 + const handleMegaOpen = (screen: string, label: string) => {
  38 + dispatch(openTab({ id: screen, label, screen }));
  39 + };
  40 +
  41 + const activeTab = tabs.find((t) => t.id === activeTabId);
  42 + const showSidebar = activeTabId === "home";
  43 +
  44 + return (
  45 + <div
  46 + style={{
  47 + height: "100vh",
  48 + width: "100vw",
  49 + display: "flex",
  50 + flexDirection: "column",
  51 + background: "var(--bg-app)",
  52 + }}
  53 + >
  54 + <TopBar onOpenMegaNav={() => setMegaOpen(true)} />
  55 + <TabStrip />
  56 + <div style={{ flex: 1, display: "flex", minHeight: 0, overflow: "hidden" }}>
  57 + {showSidebar && (
  58 + <div style={{ width: 230, flex: "none", height: "100%" }}>
  59 + <Sidebar activeNodeId={activeNodeId} onNodeClick={handleNodeClick} />
  60 + </div>
  61 + )}
  62 + <div style={{ flex: 1, position: "relative", minWidth: 0 }}>
  63 + {activeTab && <ScreenRouter screen={activeTab.screen} meta={activeTab.meta} label={activeTab.label} />}
  64 + </div>
  65 + </div>
  66 + <div className="status-bar">
  67 + <span>
  68 + 就绪 · 当前用户 {auth.user?.sUserName ?? ""} · {auth.companyName ?? ""}
  69 + </span>
  70 + <span>XLY-ERP v8.6.2 · © 2017–2026 XLY 软件股份</span>
  71 + </div>
  72 + {megaOpen && <MegaNav onClose={() => setMegaOpen(false)} onOpen={handleMegaOpen} />}
  73 + </div>
  74 + );
  75 +}
  76 +
  77 +interface RouterProps {
  78 + screen: string;
  79 + meta?: Record<string, unknown>;
  80 + label: string;
  81 +}
  82 +
  83 +function ScreenRouter({ screen, meta, label }: RouterProps) {
  84 + if (screen === "home") return <Home />;
  85 + if (screen === "userlist") return <UserList />;
  86 + if (screen === "module") return <ModuleConfig />;
  87 + if (screen === "userdetail") {
  88 + const userId = meta?.userId as number | undefined;
  89 + const mode = (meta?.mode as "view" | "edit" | "new") ?? "view";
  90 + return <UserDetail userId={userId} mode={mode} />;
  91 + }
  92 + return (
  93 + <div
  94 + style={{
  95 + height: "100%",
  96 + display: "flex",
  97 + alignItems: "center",
  98 + justifyContent: "center",
  99 + color: "var(--text-faint)",
  100 + fontSize: 13,
  101 + background: "var(--bg-app)",
  102 + }}
  103 + >
  104 + {(meta?.stubLabel as string) ?? label} · 模块开发中
  105 + </div>
  106 + );
  107 +}
frontend/src/pages/mod/ModuleConfig.tsx 0 → 100644
  1 +import { useEffect, useMemo, useState } from "react";
  2 +import {
  3 + Button,
  4 + Form,
  5 + Input,
  6 + InputNumber,
  7 + Select,
  8 + Tree,
  9 + Checkbox,
  10 + App as AntApp,
  11 + Popconfirm,
  12 +} from "antd";
  13 +import {
  14 + PlusOutlined,
  15 + EditOutlined,
  16 + SaveOutlined,
  17 + CloseOutlined,
  18 + DeleteOutlined,
  19 + ReloadOutlined,
  20 +} from "@ant-design/icons";
  21 +import type { DataNode } from "antd/es/tree";
  22 +import {
  23 + listModules,
  24 + createModule,
  25 + updateModule,
  26 + deleteModule,
  27 + type ModuleTreeVO,
  28 + type ModuleDTO,
  29 +} from "@/api/module";
  30 +import { MODULE_DISPLAY_TYPES } from "@/utils/data";
  31 +
  32 +type Mode = "view" | "edit" | "new";
  33 +
  34 +interface FormShape {
  35 + sDisplayType: string;
  36 + sModuleNameZh: string;
  37 + sManageDeptEn: string;
  38 + sModuleType: string;
  39 + sProcedureName: string;
  40 + iSortOrder: number;
  41 + iParentId: number | null;
  42 + bShowPermission: boolean;
  43 +}
  44 +
  45 +export default function ModuleConfig() {
  46 + const { message } = AntApp.useApp();
  47 + const [form] = Form.useForm<FormShape>();
  48 + const [tree, setTree] = useState<ModuleTreeVO[]>([]);
  49 + const [loading, setLoading] = useState(false);
  50 + const [selectedId, setSelectedId] = useState<number | null>(null);
  51 + const [mode, setMode] = useState<Mode>("view");
  52 + const [submitting, setSubmitting] = useState(false);
  53 +
  54 + const reload = async () => {
  55 + setLoading(true);
  56 + try {
  57 + const data = await listModules();
  58 + setTree(data);
  59 + } catch {
  60 + // interceptor
  61 + } finally {
  62 + setLoading(false);
  63 + }
  64 + };
  65 +
  66 + useEffect(() => {
  67 + void reload();
  68 + }, []);
  69 +
  70 + const flat = useMemo(() => flatten(tree), [tree]);
  71 + const treeData = useMemo(() => toTreeData(tree), [tree]);
  72 + const selected = flat.find((m) => m.iIncrement === selectedId) ?? null;
  73 +
  74 + useEffect(() => {
  75 + if (selected && mode === "view") {
  76 + form.setFieldsValue({
  77 + sDisplayType: selected.sDisplayType,
  78 + sModuleNameZh: selected.sModuleNameZh,
  79 + sManageDeptEn: selected.sManageDeptEn,
  80 + sModuleType: "",
  81 + sProcedureName: "",
  82 + iSortOrder: selected.iSortOrder,
  83 + iParentId: selected.iParentId ?? null,
  84 + bShowPermission: false,
  85 + });
  86 + }
  87 + }, [selected, mode, form]);
  88 +
  89 + const startEdit = () => {
  90 + if (!selected) return;
  91 + setMode("edit");
  92 + };
  93 +
  94 + const startNew = () => {
  95 + form.setFieldsValue({
  96 + sDisplayType: "前端业务",
  97 + sModuleNameZh: "",
  98 + sManageDeptEn: "",
  99 + sModuleType: "",
  100 + sProcedureName: "",
  101 + iSortOrder: 1,
  102 + iParentId: selectedId,
  103 + bShowPermission: false,
  104 + });
  105 + setMode("new");
  106 + };
  107 +
  108 + const cancel = () => {
  109 + setMode("view");
  110 + };
  111 +
  112 + const save = async () => {
  113 + try {
  114 + const values = await form.validateFields();
  115 + const dto: ModuleDTO = {
  116 + sDisplayType: values.sDisplayType,
  117 + sModuleNameZh: values.sModuleNameZh,
  118 + sManageDeptEn: values.sManageDeptEn,
  119 + sModuleType: values.sModuleType,
  120 + sProcedureName: values.sProcedureName,
  121 + iSortOrder: values.iSortOrder,
  122 + iParentId: values.iParentId,
  123 + bShowPermission: values.bShowPermission,
  124 + };
  125 + setSubmitting(true);
  126 + if (mode === "new") {
  127 + const res = await createModule(dto);
  128 + message.success("新增成功");
  129 + await reload();
  130 + setSelectedId(res.iIncrement);
  131 + setMode("view");
  132 + } else if (selectedId) {
  133 + await updateModule(selectedId, dto);
  134 + message.success("保存成功");
  135 + await reload();
  136 + setMode("view");
  137 + }
  138 + } catch {
  139 + // validation or interceptor
  140 + } finally {
  141 + setSubmitting(false);
  142 + }
  143 + };
  144 +
  145 + const onDelete = async () => {
  146 + if (!selectedId) return;
  147 + try {
  148 + await deleteModule(selectedId);
  149 + message.success("删除成功");
  150 + setSelectedId(null);
  151 + await reload();
  152 + } catch {
  153 + // interceptor
  154 + }
  155 + };
  156 +
  157 + const disabled = mode === "view";
  158 +
  159 + return (
  160 + <div
  161 + style={{
  162 + display: "flex",
  163 + flexDirection: "column",
  164 + height: "100%",
  165 + background: "var(--bg-app)",
  166 + }}
  167 + >
  168 + <div className="blue-toolbar">
  169 + <Button icon={<ReloadOutlined />} onClick={reload} size="small">
  170 + 刷新
  171 + </Button>
  172 + <Button
  173 + icon={<PlusOutlined />}
  174 + type="primary"
  175 + onClick={startNew}
  176 + disabled={mode !== "view"}
  177 + size="small"
  178 + >
  179 + 添加节点
  180 + </Button>
  181 + <Button
  182 + icon={<EditOutlined />}
  183 + type="primary"
  184 + onClick={startEdit}
  185 + disabled={mode !== "view" || !selected}
  186 + size="small"
  187 + >
  188 + 修改
  189 + </Button>
  190 + <Button
  191 + icon={<SaveOutlined />}
  192 + onClick={save}
  193 + loading={submitting}
  194 + disabled={mode === "view"}
  195 + type="primary"
  196 + size="small"
  197 + >
  198 + 保存
  199 + </Button>
  200 + <Button
  201 + icon={<CloseOutlined />}
  202 + onClick={cancel}
  203 + disabled={mode === "view"}
  204 + size="small"
  205 + >
  206 + 取消
  207 + </Button>
  208 + <Popconfirm
  209 + title="确认删除该模块?"
  210 + onConfirm={onDelete}
  211 + disabled={!selected || mode !== "view"}
  212 + >
  213 + <Button
  214 + icon={<DeleteOutlined />}
  215 + danger
  216 + disabled={!selected || mode !== "view"}
  217 + size="small"
  218 + >
  219 + 删除节点
  220 + </Button>
  221 + </Popconfirm>
  222 + <div style={{ flex: 1 }} />
  223 + <span
  224 + style={{
  225 + padding: "2px 8px",
  226 + fontSize: 11,
  227 + background:
  228 + mode === "view"
  229 + ? "rgba(39,165,103,0.12)"
  230 + : "rgba(217,142,31,0.18)",
  231 + color: mode === "view" ? "var(--success)" : "var(--warning)",
  232 + border: "1px solid var(--border)",
  233 + }}
  234 + >
  235 + 状态:{mode === "view" ? "只读" : mode === "new" ? "新增中" : "编辑中"}
  236 + </span>
  237 + </div>
  238 +
  239 + <div style={{ flex: 1, display: "flex", overflow: "hidden", minHeight: 0 }}>
  240 + <div
  241 + style={{
  242 + width: 280,
  243 + flex: "none",
  244 + background: "#fff",
  245 + borderRight: "1px solid var(--border)",
  246 + overflow: "auto",
  247 + }}
  248 + >
  249 + <Tree
  250 + treeData={treeData}
  251 + selectedKeys={selectedId ? [selectedId] : []}
  252 + onSelect={(keys) => {
  253 + if (keys.length) setSelectedId(Number(keys[0]));
  254 + }}
  255 + blockNode
  256 + defaultExpandAll
  257 + disabled={loading || mode !== "view"}
  258 + style={{ padding: 6, fontSize: 12 }}
  259 + />
  260 + {tree.length === 0 && !loading && (
  261 + <div
  262 + style={{
  263 + padding: 16,
  264 + color: "var(--text-faint)",
  265 + fontSize: 12,
  266 + textAlign: "center",
  267 + }}
  268 + >
  269 + 暂无模块数据
  270 + </div>
  271 + )}
  272 + </div>
  273 +
  274 + <div style={{ flex: 1, overflow: "auto", padding: 14, minWidth: 0 }}>
  275 + <div
  276 + style={{
  277 + background: "#fff",
  278 + padding: "14px 14px 16px",
  279 + border: "1px solid var(--border)",
  280 + }}
  281 + >
  282 + <Form
  283 + form={form}
  284 + layout="vertical"
  285 + disabled={disabled}
  286 + style={{
  287 + display: "grid",
  288 + gridTemplateColumns: "repeat(auto-fit, minmax(220px, 1fr))",
  289 + rowGap: 8,
  290 + columnGap: 14,
  291 + }}
  292 + >
  293 + <Form.Item
  294 + label="显示类别"
  295 + name="sDisplayType"
  296 + rules={[{ required: true }]}
  297 + >
  298 + <Select options={MODULE_DISPLAY_TYPES.map((t) => ({ value: t, label: t }))} />
  299 + </Form.Item>
  300 + <Form.Item
  301 + label="模块中文名"
  302 + name="sModuleNameZh"
  303 + rules={[{ required: true, max: 100 }]}
  304 + >
  305 + <Input />
  306 + </Form.Item>
  307 + <Form.Item
  308 + label="管理部门英文"
  309 + name="sManageDeptEn"
  310 + rules={[{ required: true, max: 50 }]}
  311 + >
  312 + <Input />
  313 + </Form.Item>
  314 + <Form.Item
  315 + label="模块类型"
  316 + name="sModuleType"
  317 + rules={[{ required: true, max: 50 }]}
  318 + >
  319 + <Input />
  320 + </Form.Item>
  321 + <Form.Item
  322 + label="存储过程名"
  323 + name="sProcedureName"
  324 + rules={[
  325 + { required: mode === "new", max: 100 },
  326 + ]}
  327 + >
  328 + <Input className="mono" />
  329 + </Form.Item>
  330 + <Form.Item label="序号" name="iSortOrder" initialValue={1}>
  331 + <InputNumber style={{ width: "100%" }} />
  332 + </Form.Item>
  333 + <Form.Item label="父级" name="iParentId">
  334 + <Select
  335 + allowClear
  336 + placeholder="无(根节点)"
  337 + options={flat.map((m) => ({ value: m.iIncrement, label: m.sModuleNameZh }))}
  338 + />
  339 + </Form.Item>
  340 + <Form.Item
  341 + label="权限是否显示"
  342 + name="bShowPermission"
  343 + valuePropName="checked"
  344 + >
  345 + <Checkbox />
  346 + </Form.Item>
  347 + </Form>
  348 + </div>
  349 + <div
  350 + style={{
  351 + marginTop: 8,
  352 + padding: "6px 12px",
  353 + background: "#fff",
  354 + border: "1px solid var(--border)",
  355 + fontSize: 11,
  356 + color: "var(--text-muted)",
  357 + display: "flex",
  358 + justifyContent: "space-between",
  359 + }}
  360 + >
  361 + <span>
  362 + 当前节点:
  363 + {selected ? `${selected.iIncrement} ${selected.sModuleNameZh}` : "未选择"}
  364 + </span>
  365 + <span>
  366 + 状态:
  367 + <span
  368 + style={{
  369 + color: mode === "view" ? "var(--success)" : "var(--warning)",
  370 + fontWeight: 500,
  371 + }}
  372 + >
  373 + {mode === "view" ? "只读" : mode === "new" ? "新增中" : "编辑中"}
  374 + </span>
  375 + </span>
  376 + </div>
  377 + </div>
  378 + </div>
  379 + </div>
  380 + );
  381 +}
  382 +
  383 +function flatten(nodes: ModuleTreeVO[]): ModuleTreeVO[] {
  384 + const out: ModuleTreeVO[] = [];
  385 + const walk = (ns: ModuleTreeVO[]) => {
  386 + for (const n of ns) {
  387 + out.push(n);
  388 + if (n.children?.length) walk(n.children);
  389 + }
  390 + };
  391 + walk(nodes);
  392 + return out;
  393 +}
  394 +
  395 +function toTreeData(nodes: ModuleTreeVO[]): DataNode[] {
  396 + return nodes.map((n) => ({
  397 + key: n.iIncrement,
  398 + title: n.sModuleNameZh,
  399 + children: n.children?.length ? toTreeData(n.children) : undefined,
  400 + }));
  401 +}