From 83210a606ab568ecd5ee9eef311d17479d27cc30 Mon Sep 17 00:00:00 2001 From: dongsk Date: Tue, 25 Aug 2026 16:27:43 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20init=20ai-platform=20-=20=E6=BA=90?= =?UTF-8?q?=E7=A0=81=20+=20=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 44 + index.html | 13 + package-lock.json | 3511 +++++++++++++++++ package.json | 35 + src/App.tsx | 30 + src/index.css | 254 ++ src/lib/utils.ts | 6 + src/main.tsx | 16 + .../ai-matching/components/AIMHeader.tsx | 161 + .../ai-matching/components/BottomAIBar.tsx | 470 +++ .../components/CenterDemandDetail.tsx | 603 +++ .../components/LeftDemandPanel.tsx | 205 + .../components/RightTranslatorPanel.tsx | 223 ++ src/modules/ai-matching/index.ts | 14 + src/modules/ai-matching/pages/AIMCockpit.tsx | 164 + src/modules/bexell-scheduling-ai/App.tsx | 267 ++ src/modules/bexell-scheduling-ai/api/index.ts | 61 + src/modules/bexell-scheduling-ai/index.ts | 14 + .../pages/CapacityEvaluationPage.tsx | 63 + .../pages/EquipmentCapacityPage.tsx | 88 + .../pages/ProductEquipmentLoadPage.tsx | 137 + .../pages/ProductInfoPage.tsx | 66 + .../pages/RealtimeMonitorPage.tsx | 244 ++ .../pages/SchedulePage.tsx | 146 + .../pages/SysParameterPage.tsx | 66 + .../components/BomBrowser.tsx | 89 + .../components/BomTree.tsx | 74 + .../components/ConfirmModal.tsx | 25 + .../bomx-reuse-analyzer/components/Drawer.tsx | 35 + .../bomx-reuse-analyzer/components/Icons.tsx | 62 + .../components/LoadingScreen.tsx | 136 + .../components/MiningView.tsx | 226 ++ .../components/ReuseSearch.tsx | 132 + .../components/SidePanel.tsx | 47 + .../components/SimilarityView.tsx | 241 ++ .../components/Skeleton.tsx | 10 + .../components/StandardLibrary.tsx | 103 + .../bomx-reuse-analyzer/components/Toast.tsx | 33 + .../bomx-reuse-analyzer/core/fingerprint.js | 64 + .../bomx-reuse-analyzer/core/mining-worker.js | 12 + .../bomx-reuse-analyzer/core/mining.js | 162 + .../bomx-reuse-analyzer/core/similarity.js | 205 + src/modules/bomx-reuse-analyzer/core/store.js | 54 + src/modules/bomx-reuse-analyzer/index.ts | 14 + .../pages/BomxReuseHome.tsx | 180 + src/modules/bomx-reuse-analyzer/styles.css | 1291 ++++++ .../components/BottomCostBar.tsx | 310 ++ .../components/CenterProfitTable.tsx | 620 +++ .../cost-analysis/components/CostHeader.tsx | 162 + .../components/LeftOrderPanel.tsx | 247 ++ .../cost-analysis/components/RightAIPanel.tsx | 334 ++ src/modules/cost-analysis/data/orders.ts | 912 +++++ src/modules/cost-analysis/index.ts | 14 + .../cost-analysis/pages/CostCockpit.tsx | 215 + .../components/KnowledgeGraph.tsx | 431 ++ .../components/MaterialList.tsx | 102 + .../components/NodeDetailPanel.tsx | 275 ++ .../components/StatsOverview.tsx | 122 + .../components/space/BottomChatBar.tsx | 252 ++ .../components/space/CenterGraphArea.tsx | 175 + .../components/space/LeftNoticePanel.tsx | 218 + .../components/space/RightAgentPanel.tsx | 347 ++ .../components/space/SpaceHeader.tsx | 198 + .../components/space/StarBackground.tsx | 98 + src/modules/knowledge-graph/data/materials.ts | 100 + src/modules/knowledge-graph/index.ts | 14 + .../pages/KnowledgeGraphHome.tsx | 276 ++ .../knowledge-graph/pages/SpaceCockpit.tsx | 93 + .../components/AIMHeader.tsx | 161 + .../components/BottomAIBar.tsx | 470 +++ .../components/BottomCostBar.tsx | 603 +++ .../components/CenterAnomalyChat.tsx | 177 + .../components/CenterBOMView.tsx | 526 +++ .../components/CenterCostCompare.tsx | 364 ++ .../components/CenterDemandDetail.tsx | 603 +++ .../components/CenterProductionSim.tsx | 424 ++ .../components/CenterProfitTable.tsx | 675 ++++ .../components/CenterTheoryCost.tsx | 166 + .../components/CostHeader.tsx | 217 + .../components/DataSourceToggle.tsx | 72 + .../components/LeftDemandPanel.tsx | 205 + .../components/LeftOrderPanel.tsx | 240 ++ .../components/ProductionLineComparison.tsx | 493 +++ .../components/RightAIPanel.tsx | 299 ++ .../components/RightTranslatorPanel.tsx | 223 ++ .../components/StarBackground.tsx | 234 ++ .../components/TechIcons.tsx | 91 + .../context/DataSourceContext.tsx | 80 + .../context/ThemeContext.tsx | 155 + .../order-cost-analysis/data/coupons.ts | 114 + .../order-cost-analysis/data/demands.ts | 309 ++ .../order-cost-analysis/data/designdoing.ts | 672 ++++ .../order-cost-analysis/data/orders.ts | 530 +++ .../order-cost-analysis/data/translators.ts | 139 + src/modules/order-cost-analysis/index.ts | 14 + .../pages-orig/AIMCockpit.tsx | 162 + .../pages-orig/CostCockpit.tsx | 315 ++ .../pages/AIMCockpitFull.tsx | 17 + .../pages/CostCockpitFull.tsx | 19 + .../order-cost-analysis/services/adapters.ts | 95 + .../order-cost-analysis/services/api.ts | 37 + .../services/hooks/useChatSSE.ts | 142 + .../services/hooks/useOrders.ts | 48 + src/modules/order-cost-analysis/styles.css | 143 + src/modules/registry.ts | 31 + src/modules/sanrui-ai-design/index.ts | 14 + .../pages/SanruiAIDesignHome.tsx | 116 + src/pages/HomePage.tsx | 299 ++ src/pages/SSOLogin.tsx | 35 + src/shared/components/StarBackground.tsx | 227 ++ src/shared/components/TechIcons.tsx | 91 + src/shared/components/ThemeToggle.tsx | 52 + src/shared/context/ThemeContext.tsx | 234 ++ src/shared/data/coupons.ts | 114 + src/shared/data/demands.ts | 309 ++ src/shared/data/designdoing.ts | 672 ++++ src/shared/data/translators.ts | 139 + src/vite-env.d.ts | 1 + tailwind.config.ts | 160 + tsconfig.app.json | 28 + tsconfig.json | 4 + vite.config.ts | 30 + 122 files changed, 27401 insertions(+) create mode 100644 .gitignore create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/App.tsx create mode 100644 src/index.css create mode 100644 src/lib/utils.ts create mode 100644 src/main.tsx create mode 100644 src/modules/ai-matching/components/AIMHeader.tsx create mode 100644 src/modules/ai-matching/components/BottomAIBar.tsx create mode 100644 src/modules/ai-matching/components/CenterDemandDetail.tsx create mode 100644 src/modules/ai-matching/components/LeftDemandPanel.tsx create mode 100644 src/modules/ai-matching/components/RightTranslatorPanel.tsx create mode 100644 src/modules/ai-matching/index.ts create mode 100644 src/modules/ai-matching/pages/AIMCockpit.tsx create mode 100644 src/modules/bexell-scheduling-ai/App.tsx create mode 100644 src/modules/bexell-scheduling-ai/api/index.ts create mode 100644 src/modules/bexell-scheduling-ai/index.ts create mode 100644 src/modules/bexell-scheduling-ai/pages/CapacityEvaluationPage.tsx create mode 100644 src/modules/bexell-scheduling-ai/pages/EquipmentCapacityPage.tsx create mode 100644 src/modules/bexell-scheduling-ai/pages/ProductEquipmentLoadPage.tsx create mode 100644 src/modules/bexell-scheduling-ai/pages/ProductInfoPage.tsx create mode 100644 src/modules/bexell-scheduling-ai/pages/RealtimeMonitorPage.tsx create mode 100644 src/modules/bexell-scheduling-ai/pages/SchedulePage.tsx create mode 100644 src/modules/bexell-scheduling-ai/pages/SysParameterPage.tsx create mode 100644 src/modules/bomx-reuse-analyzer/components/BomBrowser.tsx create mode 100644 src/modules/bomx-reuse-analyzer/components/BomTree.tsx create mode 100644 src/modules/bomx-reuse-analyzer/components/ConfirmModal.tsx create mode 100644 src/modules/bomx-reuse-analyzer/components/Drawer.tsx create mode 100644 src/modules/bomx-reuse-analyzer/components/Icons.tsx create mode 100644 src/modules/bomx-reuse-analyzer/components/LoadingScreen.tsx create mode 100644 src/modules/bomx-reuse-analyzer/components/MiningView.tsx create mode 100644 src/modules/bomx-reuse-analyzer/components/ReuseSearch.tsx create mode 100644 src/modules/bomx-reuse-analyzer/components/SidePanel.tsx create mode 100644 src/modules/bomx-reuse-analyzer/components/SimilarityView.tsx create mode 100644 src/modules/bomx-reuse-analyzer/components/Skeleton.tsx create mode 100644 src/modules/bomx-reuse-analyzer/components/StandardLibrary.tsx create mode 100644 src/modules/bomx-reuse-analyzer/components/Toast.tsx create mode 100644 src/modules/bomx-reuse-analyzer/core/fingerprint.js create mode 100644 src/modules/bomx-reuse-analyzer/core/mining-worker.js create mode 100644 src/modules/bomx-reuse-analyzer/core/mining.js create mode 100644 src/modules/bomx-reuse-analyzer/core/similarity.js create mode 100644 src/modules/bomx-reuse-analyzer/core/store.js create mode 100644 src/modules/bomx-reuse-analyzer/index.ts create mode 100644 src/modules/bomx-reuse-analyzer/pages/BomxReuseHome.tsx create mode 100644 src/modules/bomx-reuse-analyzer/styles.css create mode 100644 src/modules/cost-analysis/components/BottomCostBar.tsx create mode 100644 src/modules/cost-analysis/components/CenterProfitTable.tsx create mode 100644 src/modules/cost-analysis/components/CostHeader.tsx create mode 100644 src/modules/cost-analysis/components/LeftOrderPanel.tsx create mode 100644 src/modules/cost-analysis/components/RightAIPanel.tsx create mode 100644 src/modules/cost-analysis/data/orders.ts create mode 100644 src/modules/cost-analysis/index.ts create mode 100644 src/modules/cost-analysis/pages/CostCockpit.tsx create mode 100644 src/modules/knowledge-graph/components/KnowledgeGraph.tsx create mode 100644 src/modules/knowledge-graph/components/MaterialList.tsx create mode 100644 src/modules/knowledge-graph/components/NodeDetailPanel.tsx create mode 100644 src/modules/knowledge-graph/components/StatsOverview.tsx create mode 100644 src/modules/knowledge-graph/components/space/BottomChatBar.tsx create mode 100644 src/modules/knowledge-graph/components/space/CenterGraphArea.tsx create mode 100644 src/modules/knowledge-graph/components/space/LeftNoticePanel.tsx create mode 100644 src/modules/knowledge-graph/components/space/RightAgentPanel.tsx create mode 100644 src/modules/knowledge-graph/components/space/SpaceHeader.tsx create mode 100644 src/modules/knowledge-graph/components/space/StarBackground.tsx create mode 100644 src/modules/knowledge-graph/data/materials.ts create mode 100644 src/modules/knowledge-graph/index.ts create mode 100644 src/modules/knowledge-graph/pages/KnowledgeGraphHome.tsx create mode 100644 src/modules/knowledge-graph/pages/SpaceCockpit.tsx create mode 100644 src/modules/order-cost-analysis/components/AIMHeader.tsx create mode 100644 src/modules/order-cost-analysis/components/BottomAIBar.tsx create mode 100644 src/modules/order-cost-analysis/components/BottomCostBar.tsx create mode 100644 src/modules/order-cost-analysis/components/CenterAnomalyChat.tsx create mode 100644 src/modules/order-cost-analysis/components/CenterBOMView.tsx create mode 100644 src/modules/order-cost-analysis/components/CenterCostCompare.tsx create mode 100644 src/modules/order-cost-analysis/components/CenterDemandDetail.tsx create mode 100644 src/modules/order-cost-analysis/components/CenterProductionSim.tsx create mode 100644 src/modules/order-cost-analysis/components/CenterProfitTable.tsx create mode 100644 src/modules/order-cost-analysis/components/CenterTheoryCost.tsx create mode 100644 src/modules/order-cost-analysis/components/CostHeader.tsx create mode 100644 src/modules/order-cost-analysis/components/DataSourceToggle.tsx create mode 100644 src/modules/order-cost-analysis/components/LeftDemandPanel.tsx create mode 100644 src/modules/order-cost-analysis/components/LeftOrderPanel.tsx create mode 100644 src/modules/order-cost-analysis/components/ProductionLineComparison.tsx create mode 100644 src/modules/order-cost-analysis/components/RightAIPanel.tsx create mode 100644 src/modules/order-cost-analysis/components/RightTranslatorPanel.tsx create mode 100644 src/modules/order-cost-analysis/components/StarBackground.tsx create mode 100644 src/modules/order-cost-analysis/components/TechIcons.tsx create mode 100644 src/modules/order-cost-analysis/context/DataSourceContext.tsx create mode 100644 src/modules/order-cost-analysis/context/ThemeContext.tsx create mode 100644 src/modules/order-cost-analysis/data/coupons.ts create mode 100644 src/modules/order-cost-analysis/data/demands.ts create mode 100644 src/modules/order-cost-analysis/data/designdoing.ts create mode 100644 src/modules/order-cost-analysis/data/orders.ts create mode 100644 src/modules/order-cost-analysis/data/translators.ts create mode 100644 src/modules/order-cost-analysis/index.ts create mode 100644 src/modules/order-cost-analysis/pages-orig/AIMCockpit.tsx create mode 100644 src/modules/order-cost-analysis/pages-orig/CostCockpit.tsx create mode 100644 src/modules/order-cost-analysis/pages/AIMCockpitFull.tsx create mode 100644 src/modules/order-cost-analysis/pages/CostCockpitFull.tsx create mode 100644 src/modules/order-cost-analysis/services/adapters.ts create mode 100644 src/modules/order-cost-analysis/services/api.ts create mode 100644 src/modules/order-cost-analysis/services/hooks/useChatSSE.ts create mode 100644 src/modules/order-cost-analysis/services/hooks/useOrders.ts create mode 100644 src/modules/order-cost-analysis/styles.css create mode 100644 src/modules/registry.ts create mode 100644 src/modules/sanrui-ai-design/index.ts create mode 100644 src/modules/sanrui-ai-design/pages/SanruiAIDesignHome.tsx create mode 100644 src/pages/HomePage.tsx create mode 100644 src/pages/SSOLogin.tsx create mode 100644 src/shared/components/StarBackground.tsx create mode 100644 src/shared/components/TechIcons.tsx create mode 100644 src/shared/components/ThemeToggle.tsx create mode 100644 src/shared/context/ThemeContext.tsx create mode 100644 src/shared/data/coupons.ts create mode 100644 src/shared/data/demands.ts create mode 100644 src/shared/data/designdoing.ts create mode 100644 src/shared/data/translators.ts create mode 100644 src/vite-env.d.ts create mode 100644 tailwind.config.ts create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2552dc5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +# Dependencies +node_modules/ +.pnp +.pnp.js + +# Build output +dist/ +dist-ssr/ +build/ +*.local +!dist/.gitkeep + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +# Editor +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Env +.env +.env.local +.env.*.local + +# Cache +.cache/ +.temp/ +.eslintcache + +# Large sample data (use Git LFS if needed) +public/bomx/bom-data.json diff --git a/index.html b/index.html new file mode 100644 index 0000000..d6cad03 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + EIOSpace + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..09136b2 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3511 @@ +{ + "name": "ai-platform", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ai-platform", + "version": "1.0.0", + "dependencies": { + "@ant-design/icons": "^5.4.0", + "antd": "^5.21.0", + "axios": "^1.7.7", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "dayjs": "^1.11.13", + "lucide-react": "^0.468.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^7.1.1", + "tailwind-merge": "^2.6.0" + }, + "devDependencies": { + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.3", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.17", + "tailwindcss-animate": "^1.0.7", + "typescript": "~5.6.2", + "vite": "^8.0.16" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ant-design/colors": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.2.1.tgz", + "integrity": "sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^2.0.6" + } + }, + "node_modules/@ant-design/cssinjs": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.24.0.tgz", + "integrity": "sha512-K4cYrJBsgvL+IoozUXYjbT6LHHNt+19a9zkvpBPxLjFHas1UpPM2A5MlhROb0BT8N8WoavM5VsP9MeSeNK/3mg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "classnames": "^2.3.1", + "csstype": "^3.1.3", + "rc-util": "^5.35.0", + "stylis": "^4.3.4" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/cssinjs-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-1.1.3.tgz", + "integrity": "sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==", + "license": "MIT", + "dependencies": { + "@ant-design/cssinjs": "^1.21.0", + "@babel/runtime": "^7.23.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@ant-design/fast-color": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz", + "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@ant-design/icons": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.6.1.tgz", + "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/icons-svg": "^4.4.0", + "@babel/runtime": "^7.24.8", + "classnames": "^2.2.6", + "rc-util": "^5.31.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.5.0.tgz", + "integrity": "sha512-1BTUFyKPTBZ53MuTP8s0k5SFEXL7o3VHEOwLgzaoWKwnBeqIcqUtVshc4SKzhI6uACfqhJqBwBUE9FsWR3uULA==", + "license": "MIT" + }, + "node_modules/@ant-design/react-slick": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.1.2.tgz", + "integrity": "sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "resize-observer-polyfill": "^1.5.1", + "throttle-debounce": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", + "license": "MIT" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", + "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rc-component/async-validator": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.1.2.tgz", + "integrity": "sha512-WYbrZSjzznU1ekD0qFq2qRxt309VoS61MTG5npnFQlKYcoy9IzU8T+ZCIhq5bGAXRbXysABFWTspicMfmWFwow==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.4" + }, + "engines": { + "node": ">=14.x" + } + }, + "node_modules/@rc-component/color-picker": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-2.0.1.tgz", + "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^2.0.6", + "@babel/runtime": "^7.23.6", + "classnames": "^2.2.6", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/context": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz", + "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mini-decimal": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.4.tgz", + "integrity": "sha512-xiuXcaCwyOWpD8a8scdExFl+bntNphAW8XeenL1ig2en0AAZY0Pcp4pC0dI22qJ+NvxKn9RoNIoRdqYU3BLH4w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@rc-component/mutate-observer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", + "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/qrcode": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.1.3.tgz", + "integrity": "sha512-aGv6alnn4HbDEsURzKP+jv13rbi1VxmAYfBNZr5GKF1iohMNWy5tAVoJ1E3cOvzMB1kbUPvCXchM6zSFlRGPhA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tour": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.15.1.tgz", + "integrity": "sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/trigger": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.3.1.tgz", + "integrity": "sha512-ORENF39PeXTzM+gQEshuk460Z8N4+6DkjpxlpE7Q3gYy1iBpLrx0FOJz3h62ryrJZ/3zCAUIkT1Pb/8hHWpb3A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@rc-component/portal": "^1.1.0", + "classnames": "^2.3.2", + "rc-motion": "^2.0.0", + "rc-resize-observer": "^1.3.1", + "rc-util": "^5.44.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", + "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", + "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", + "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", + "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", + "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", + "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", + "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", + "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", + "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", + "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", + "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", + "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", + "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", + "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", + "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", + "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.3.tgz", + "integrity": "sha512-vmFvco5/QuC2f9Oj+wTk0+9XeDFkHxSamwZKYc7MxYwKICfvUvlMhqKI0VuICPltGqh1neqBKDvO4kes1ya8vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/antd": { + "version": "5.29.3", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.29.3.tgz", + "integrity": "sha512-3DdbGCa9tWAJGcCJ6rzR8EJFsv2CtyEbkVabZE14pfgUHfCicWCj0/QzQVLDYg8CPfQk9BH7fHCoTXHTy7MP/A==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^7.2.1", + "@ant-design/cssinjs": "^1.23.0", + "@ant-design/cssinjs-utils": "^1.1.3", + "@ant-design/fast-color": "^2.0.6", + "@ant-design/icons": "^5.6.1", + "@ant-design/react-slick": "~1.1.2", + "@babel/runtime": "^7.26.0", + "@rc-component/color-picker": "~2.0.1", + "@rc-component/mutate-observer": "^1.1.0", + "@rc-component/qrcode": "~1.1.0", + "@rc-component/tour": "~1.15.1", + "@rc-component/trigger": "^2.3.0", + "classnames": "^2.5.1", + "copy-to-clipboard": "^3.3.3", + "dayjs": "^1.11.11", + "rc-cascader": "~3.34.0", + "rc-checkbox": "~3.5.0", + "rc-collapse": "~3.9.0", + "rc-dialog": "~9.6.0", + "rc-drawer": "~7.3.0", + "rc-dropdown": "~4.2.1", + "rc-field-form": "~2.7.1", + "rc-image": "~7.12.0", + "rc-input": "~1.8.0", + "rc-input-number": "~9.5.0", + "rc-mentions": "~2.20.0", + "rc-menu": "~9.16.1", + "rc-motion": "^2.9.5", + "rc-notification": "~5.6.4", + "rc-pagination": "~5.1.0", + "rc-picker": "~4.11.3", + "rc-progress": "~4.0.0", + "rc-rate": "~2.13.1", + "rc-resize-observer": "^1.4.3", + "rc-segmented": "~2.7.0", + "rc-select": "~14.16.8", + "rc-slider": "~11.1.9", + "rc-steps": "~6.0.1", + "rc-switch": "~4.1.0", + "rc-table": "~7.54.0", + "rc-tabs": "~15.7.0", + "rc-textarea": "~1.10.2", + "rc-tooltip": "~6.4.0", + "rc-tree": "~5.13.1", + "rc-tree-select": "~5.27.0", + "rc-upload": "~4.11.0", + "rc-util": "^5.44.4", + "scroll-into-view-if-needed": "^3.1.0", + "throttle-debounce": "^5.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.5.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.2.tgz", + "integrity": "sha512-rD5t5DwOjJdmSORcTq64j8MawTC+tbQ+HHqjR4NDumamy/ambn1UJrlKL+KdwujWxMkFjPM3pPHOEA9tl4767Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.4", + "caniuse-lite": "^1.0.30001799", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.19.0.tgz", + "integrity": "sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.6", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.42", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.42.tgz", + "integrity": "sha512-c/jurFrDLyui7o1J86yLkRu4LMsTYcBohveus7/I2Hzdn9KIP2bdJPTue/lR1KH46enoPbD77GKeSYNdyPoD3Q==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.5.tgz", + "integrity": "sha512-Cu2E6QejHWzuDMTkuwgpABFgDfZrXLQq5V13YOACZx4mFAG4IwGTbTfHPMr4WtxlHoXSM8FIuRwYYCz5XiabaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.42", + "caniuse-lite": "^1.0.30001800", + "electron-to-chromium": "^1.5.387", + "node-releases": "^2.0.50", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001803", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001803.tgz", + "integrity": "sha512-g/uHREV2ZpK9qMalCsWaxmA6ol+DX8GYhuf3T40RKoP+oL7vhRJh8LNt73PCjpnR6l14FzfPrB5Yux4PKm2meg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", + "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "license": "MIT", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.23", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.23.tgz", + "integrity": "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.389", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.389.tgz", + "integrity": "sha512-cEto7aeOqBfU1D+c5py5pE+ooscKE75JifxLBdFUZsqAxRS6y7kebtxAZvICszSl05gPjYHDTjY+lXpyGvpJbg==", + "dev": true, + "license": "ISC" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "license": "MIT", + "dependencies": { + "string-convert": "^0.2.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lucide-react": { + "version": "0.468.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.468.0.tgz", + "integrity": "sha512-6koYRhnM2N0GGZIdXzSeiNwguv1gt/FAjZOiPl76roBi3xKEXa4WmfpxgQwTTL4KipXjefrnf3oV4IsYhi4JFA==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", + "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.5.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", + "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", + "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/rc-cascader": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.34.0.tgz", + "integrity": "sha512-KpXypcvju9ptjW9FaN2NFcA2QH9E9LHKq169Y0eWtH4e/wHQ5Wh5qZakAgvb8EKZ736WZ3B0zLLOBsrsja5Dag==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "classnames": "^2.3.1", + "rc-select": "~14.16.2", + "rc-tree": "~5.13.0", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-checkbox": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.5.0.tgz", + "integrity": "sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.25.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-collapse": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.9.0.tgz", + "integrity": "sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dialog": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.6.0.tgz", + "integrity": "sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-drawer": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.3.0.tgz", + "integrity": "sha512-DX6CIgiBWNpJIMGFO8BAISFkxiuKitoizooj4BDyee8/SnBn0zwO2FHrNDpqqepj0E/TFTDpmEBCyFuTgC7MOg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@rc-component/portal": "^1.1.1", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dropdown": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.2.1.tgz", + "integrity": "sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-util": "^5.44.1" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/rc-field-form": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.7.1.tgz", + "integrity": "sha512-vKeSifSJ6HoLaAB+B8aq/Qgm8a3dyxROzCtKNCsBQgiverpc4kWDQihoUwzUj+zNWJOykwSY4dNX3QrGwtVb9A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/async-validator": "^5.0.3", + "rc-util": "^5.32.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-image": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.12.0.tgz", + "integrity": "sha512-cZ3HTyyckPnNnUb9/DRqduqzLfrQRyi+CdHjdqgsyDpI3Ln5UX1kXnAhPBSJj9pVRzwRFgqkN7p9b6HBDjmu/Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.6.0", + "rc-motion": "^2.6.2", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-input": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.8.0.tgz", + "integrity": "sha512-KXvaTbX+7ha8a/k+eg6SYRVERK0NddX8QX7a7AnRvUa/rEH0CNMlpcBzBkhI0wp2C8C4HlMoYl8TImSN+fuHKA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-input-number": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.5.0.tgz", + "integrity": "sha512-bKaEvB5tHebUURAEXw35LDcnRZLq3x1k7GxfAqBMzmpHkDGzjAtnUL8y4y5N15rIFIg5IJgwr211jInl3cipag==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/mini-decimal": "^1.0.1", + "classnames": "^2.2.5", + "rc-input": "~1.8.0", + "rc-util": "^5.40.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-mentions": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.20.0.tgz", + "integrity": "sha512-w8HCMZEh3f0nR8ZEd466ATqmXFCMGMN5UFCzEUL0bM/nGw/wOS2GgRzKBcm19K++jDyuWCOJOdgcKGXU3fXfbQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-input": "~1.8.0", + "rc-menu": "~9.16.0", + "rc-textarea": "~1.10.0", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.16.1", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.16.1.tgz", + "integrity": "sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.0.0", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.3.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.5.tgz", + "integrity": "sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.44.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-notification": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.6.4.tgz", + "integrity": "sha512-KcS4O6B4qzM3KH7lkwOB7ooLPZ4b6J+VMmQgT51VZCeEcmghdeR4IrMcFq0LG+RPdnbe/ArT086tGM8Snimgiw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.9.0", + "rc-util": "^5.20.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.5.0.tgz", + "integrity": "sha512-Lm/v9h0LymeUYJf0x39OveU52InkdRXqnn2aYXfWmo8WdOonIKB2kfau+GF0fWq6jPgtdO9yMqveGcK6aIhJmg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.37.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-pagination": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-5.1.0.tgz", + "integrity": "sha512-8416Yip/+eclTFdHXLKTxZvn70duYVGTvUUWbckCCZoIl3jagqke3GLsFrMs0bsQBikiYpZLD9206Ej4SOdOXQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.11.3.tgz", + "integrity": "sha512-MJ5teb7FlNE0NFHTncxXQ62Y5lytq6sh5nUw0iH8OkHL/TjARSEvSHpr940pWgjGANpjCwyMdvsEV55l5tYNSg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.1", + "rc-overflow": "^1.3.2", + "rc-resize-observer": "^1.4.0", + "rc-util": "^5.43.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "luxon": ">= 3.x", + "moment": ">= 2.x", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, + "node_modules/rc-progress": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-4.0.0.tgz", + "integrity": "sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-rate": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.13.1.tgz", + "integrity": "sha512-QUhQ9ivQ8Gy7mtMZPAjLbxBt5y9GRp65VcUyGUMF3N3fhiftivPHdpuDIaWIMOTEprAjZPC08bls1dQB+I1F2Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-resize-observer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.3.tgz", + "integrity": "sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.44.1", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-segmented": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.7.1.tgz", + "integrity": "sha512-izj1Nw/Dw2Vb7EVr+D/E9lUTkBe+kKC+SAFSU9zqr7WV2W5Ktaa9Gc7cB2jTqgk8GROJayltaec+DBlYKc6d+g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-select": { + "version": "14.16.8", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.16.8.tgz", + "integrity": "sha512-NOV5BZa1wZrsdkKaiK7LHRuo5ZjZYMDxPP6/1+09+FB4KoNi8jcG1ZqLE3AVCxEsYMBe65OBx71wFoHRTP3LRg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.1.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.3.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-slider": { + "version": "11.1.9", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-11.1.9.tgz", + "integrity": "sha512-h8IknhzSh3FEM9u8ivkskh+Ef4Yo4JRIY2nj7MrH6GQmrwV6mcpJf5/4KgH5JaVI1H3E52yCdpOlVyGZIeph5A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-steps": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.1.tgz", + "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-switch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.1.0.tgz", + "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0", + "classnames": "^2.2.1", + "rc-util": "^5.30.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-table": { + "version": "7.54.0", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.54.0.tgz", + "integrity": "sha512-/wDTkki6wBTjwylwAGjpLKYklKo9YgjZwAU77+7ME5mBoS32Q4nAwoqhA2lSge6fobLW3Tap6uc5xfwaL2p0Sw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/context": "^1.4.0", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.44.3", + "rc-virtual-list": "^3.14.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-15.7.0.tgz", + "integrity": "sha512-ZepiE+6fmozYdWf/9gVp7k56PKHB1YYoDsKeQA1CBlJ/POIhjkcYiv0AGP0w2Jhzftd3AVvZP/K+V+Lpi2ankA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.2.0", + "rc-menu": "~9.16.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.34.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-textarea": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.10.2.tgz", + "integrity": "sha512-HfaeXiaSlpiSp0I/pvWpecFEHpVysZ9tpDLNkxQbMvMz6gsr7aVZ7FpWP9kt4t7DB+jJXesYS0us1uPZnlRnwQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-input": "~1.8.0", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tooltip": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.4.0.tgz", + "integrity": "sha512-kqyivim5cp8I5RkHmpsp1Nn/Wk+1oeloMv9c7LXNgDxUpGm+RbXJGL+OPvDlcRnx9DBeOe4wyOIl4OKUERyH1g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.1", + "rc-util": "^5.44.3" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tree": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.13.1.tgz", + "integrity": "sha512-FNhIefhftobCdUJshO7M8uZTA9F4OPGVXqGfZkkD/5soDeOhwO06T/aKTrg0WD8gRg/pyfq+ql3aMymLHCTC4A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.1" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-tree-select": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.27.0.tgz", + "integrity": "sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "classnames": "2.x", + "rc-select": "~14.16.2", + "rc-tree": "~5.13.0", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-upload": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.11.0.tgz", + "integrity": "sha512-ZUyT//2JAehfHzjWowqROcwYJKnZkIUGWaTE/VogVrepSl7AFNbQf4+zGfX4zl9Vrj/Jm8scLO0R6UlPDKK4wA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.44.4", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.44.4.tgz", + "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^18.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-virtual-list": { + "version": "3.19.2", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.19.2.tgz", + "integrity": "sha512-Ys6NcjwGkuwkeaWBDqfI3xWuZ7rDiQXlH1o2zLfFzATfEgXcqpk8CkgMfbJD81McqjcJVez25a3kPxCR807evA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/react-router": { + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.1.tgz", + "integrity": "sha512-GDLgg3i3uM0aeJO3Fm+TCS+sDQ7gu12T6x0qdTEzcwqEfleci7JwugVNIF3U//0FWKnJT7ptG+20B2jfDqnZAg==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.1.tgz", + "integrity": "sha512-KaZh+X/6UtEp28x51AUYZDMg9NGoz2ja3dNHa+ta/tk40vCzKhQ/RypCWBMLbmDr6//E24Vv5uPsrqXFozdkAg==", + "license": "MIT", + "dependencies": { + "react-router": "7.18.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rolldown": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", + "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.139.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.1.5", + "@rolldown/binding-darwin-arm64": "1.1.5", + "@rolldown/binding-darwin-x64": "1.1.5", + "@rolldown/binding-freebsd-x64": "1.1.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", + "@rolldown/binding-linux-arm64-gnu": "1.1.5", + "@rolldown/binding-linux-arm64-musl": "1.1.5", + "@rolldown/binding-linux-ppc64-gnu": "1.1.5", + "@rolldown/binding-linux-s390x-gnu": "1.1.5", + "@rolldown/binding-linux-x64-gnu": "1.1.5", + "@rolldown/binding-linux-x64-musl": "1.1.5", + "@rolldown/binding-openharmony-arm64": "1.1.5", + "@rolldown/binding-wasm32-wasi": "1.1.5", + "@rolldown/binding-win32-arm64-msvc": "1.1.5", + "@rolldown/binding-win32-x64-msvc": "1.1.5" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "license": "MIT", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==", + "license": "MIT" + }, + "node_modules/stylis": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz", + "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", + "license": "MIT" + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwind-merge": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.1.tgz", + "integrity": "sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "license": "MIT", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", + "license": "MIT" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.4.tgz", + "integrity": "sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.16", + "rolldown": "~1.1.4", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.3.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..b3f49a3 --- /dev/null +++ b/package.json @@ -0,0 +1,35 @@ +{ + "name": "ai-platform", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@ant-design/icons": "^5.4.0", + "antd": "^5.21.0", + "axios": "^1.7.7", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "dayjs": "^1.11.13", + "lucide-react": "^0.468.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^7.1.1", + "tailwind-merge": "^2.6.0" + }, + "devDependencies": { + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.3", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.17", + "tailwindcss-animate": "^1.0.7", + "typescript": "~5.6.2", + "vite": "^8.0.16" + } +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..c174930 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,30 @@ +import { Routes, Route } from 'react-router-dom'; +import HomePage from '@/pages/HomePage'; +import SSOLogin from '@/pages/SSOLogin'; +import AIMCockpit from '@/modules/ai-matching/pages/AIMCockpit'; +import CostCockpit from '@/modules/cost-analysis/pages/CostCockpit'; +import KnowledgeGraphHome from '@/modules/knowledge-graph/pages/KnowledgeGraphHome'; +import SpaceCockpit from '@/modules/knowledge-graph/pages/SpaceCockpit'; +import BomxReuseHome from '@/modules/bomx-reuse-analyzer/pages/BomxReuseHome'; +import CostCockpitFull from '@/modules/order-cost-analysis/pages/CostCockpitFull'; +import AIMCockpitFull from '@/modules/order-cost-analysis/pages/AIMCockpitFull'; +import BexellSchedulingApp from '@/modules/bexell-scheduling-ai/App'; +import SanruiAIDesignHome from '@/modules/sanrui-ai-design/pages/SanruiAIDesignHome'; + +export default function App() { + return ( + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + ); +} diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..f333ae9 --- /dev/null +++ b/src/index.css @@ -0,0 +1,254 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* ═══════════════════════════════════════════ + shadcn/ui CSS 变量体系(由 ThemeContext 动态切换) + ═══════════════════════════════════════════ */ +@layer base { + :root { + --background: 222 47% 5%; + --foreground: 210 40% 98%; + --card: 222 47% 8%; + --card-foreground: 210 40% 98%; + --popover: 222 47% 8%; + --popover-foreground: 210 40% 98%; + --primary: 210 40% 98%; + --primary-foreground: 222 47% 5%; + --secondary: 217 33% 17%; + --secondary-foreground: 210 40% 98%; + --muted: 217 33% 17%; + --muted-foreground: 215 20% 65%; + --accent: 217 33% 17%; + --accent-foreground: 210 40% 98%; + --border: 217 33% 17%; + --input: 217 33% 17%; + --ring: 212 68% 58%; + --radius: 0.75rem; + --color-temp: 211 85% 52%; + --color-gas: 252 65% 58%; + --color-valve: 32 90% 52%; + --color-struct: 160 55% 42%; + --shadow-xs: 0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04); + --shadow-sm: 0 2px 8px rgba(0,0,0,0.07), 0 1px 3px rgba(0,0,0,0.04); + --shadow-md: 0 4px 16px rgba(0,0,0,0.08), 0 2px 6px rgba(0,0,0,0.04); + --shadow-lg: 0 8px 32px rgba(0,0,0,0.10), 0 4px 12px rgba(0,0,0,0.05); + --transition-smooth: all 0.22s cubic-bezier(0.4, 0, 0.2, 1); + --transition-spring: all 0.35s cubic-bezier(0.34, 1.56, 0.64, 1); + } +} + +@layer base { + * { + @apply border-border; + box-sizing: border-box; + } + button { + background-color: transparent; + background-image: none; + color: inherit; + border: 0; + } + body { + background: #000a1e; + color: #a8d8ff; + min-height: 100vh; + font-family: -apple-system, 'SF Pro Display', 'SF Pro Text', 'PingFang SC', 'Helvetica Neue', Arial, sans-serif; + -webkit-font-smoothing: antialiased; + overflow: hidden; + } +} + +/* ═══════════════════════════════════════════ + Apple 风格工具类(用于浅色主题模块) + ═══════════════════════════════════════════ */ +@layer utilities { + .card-glass { + background-color: rgba(255,255,255,0.88); + backdrop-filter: blur(20px) saturate(180%); + -webkit-backdrop-filter: blur(20px) saturate(180%); + border: 1px solid rgba(255,255,255,0.7); + box-shadow: var(--shadow-sm); + } + .card-solid { + background-color: #ffffff; + border: 1px solid #e8e8ed; + box-shadow: var(--shadow-sm); + } + .card-elevated { + background-color: #ffffff; + border: 1px solid rgba(232,232,237,0.6); + box-shadow: var(--shadow-md); + } + .sidebar-bg { + background-color: rgba(248,248,250,0.98); + backdrop-filter: blur(20px) saturate(150%); + -webkit-backdrop-filter: blur(20px) saturate(150%); + } + .text-gradient-primary { + background-image: linear-gradient(135deg, hsl(var(--primary)), hsl(252 70% 58%)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + } + .list-card { + background-color: #ffffff; + border: 1px solid #e8e8ed; + border-radius: 10px; + box-shadow: 0 1px 3px rgba(0,0,0,0.04); + transition: all 0.18s ease; + } + .list-card:hover { + box-shadow: 0 2px 8px rgba(0,0,0,0.08); + } + .list-card-active { + background-color: #f0f7ff; + border-color: rgba(10,122,255,0.3); + box-shadow: 0 2px 10px rgba(10,122,255,0.10); + } +} + +/* ═══════════════════════════════════════════ + 太空舱主题 CSS — 动画关键帧 + ═══════════════════════════════════════════ */ + +@keyframes space-border-scan { + 0% { left: -100%; } + 100% { left: 200%; } +} + +@keyframes space-pulse { + 0%, 100% { opacity: 0.5; box-shadow: 0 0 10px rgba(0,212,255,0.2); } + 50% { opacity: 1; box-shadow: 0 0 25px rgba(0,212,255,0.6); } +} + +@keyframes star-twinkle { + 0%, 100% { opacity: 0.3; transform: scale(1); } + 50% { opacity: 1; transform: scale(1.4); } +} + +@keyframes slide-in-left { + from { opacity: 0; transform: translateX(-20px); } + to { opacity: 1; transform: translateX(0); } +} + +@keyframes slide-in-right-space { + from { opacity: 0; transform: translateX(20px); } + to { opacity: 1; transform: translateX(0); } +} + +@keyframes slide-in-up { + from { opacity: 0; transform: translateY(16px); } + to { opacity: 1; transform: translateY(0); } +} + +@keyframes notice-in { + from { opacity: 0; transform: translateX(-12px); } + to { opacity: 1; transform: translateX(0); } +} + +@keyframes card-in { + from { opacity: 0; transform: translateY(8px); } + to { opacity: 1; transform: translateY(0); } +} + +@keyframes glow-pulse { + 0%, 100% { box-shadow: 0 0 10px rgba(0,212,255,0.2); } + 50% { box-shadow: 0 0 30px rgba(0,212,255,0.5); } +} + +@keyframes scan-line { + 0% { top: 0%; opacity: 0.6; } + 100% { top: 100%; opacity: 0; } +} + +/* 拖入模块处理动画 */ +@keyframes module-spin { + 0% { transform: rotateY(0deg) scale(1); } + 30% { transform: rotateY(90deg) scale(0.92); } + 60% { transform: rotateY(180deg) scale(0.88); } + 80% { transform: rotateY(270deg) scale(0.92); } + 100% { transform: rotateY(360deg) scale(1); } +} + +@keyframes orbit-ring { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } +} + +@keyframes orbit-ring-rev { + from { transform: rotate(0deg); } + to { transform: rotate(-360deg); } +} + +@keyframes processing-dots { + 0%, 20% { opacity: 0.2; transform: scale(0.8); } + 50% { opacity: 1; transform: scale(1.2); } + 80%, 100%{ opacity: 0.2; transform: scale(0.8); } +} + +@keyframes content-reveal { + from { opacity: 0; transform: translateY(18px) scale(0.97); } + to { opacity: 1; transform: translateY(0) scale(1); } +} + +@keyframes scan-sweep { + 0% { top: -4px; opacity: 0; } + 10% { opacity: 0.8; } + 90% { opacity: 0.8; } + 100% { top: 100%; opacity: 0; } +} + +/* 知识图谱模块动画 */ +@keyframes fade-in-up { + from { opacity: 0; transform: translateY(6px); } + to { opacity: 1; transform: translateY(0); } +} + +@keyframes slide-in-right { + from { opacity: 0; transform: translateX(14px); } + to { opacity: 1; transform: translateX(0); } +} + +/* ═══════════════════════════════════════════ + 太空舱主题 CSS — 动画工具类 + ═══════════════════════════════════════════ */ + +.space-animate-left { animation: slide-in-left 0.4s cubic-bezier(0.4,0,0.2,1); } +.space-animate-right { animation: slide-in-right-space 0.4s cubic-bezier(0.4,0,0.2,1); } +.space-animate-up { animation: slide-in-up 0.4s cubic-bezier(0.4,0,0.2,1); } +.space-pulse { animation: space-pulse 2.5s ease-in-out infinite; } +.glow-pulse { animation: glow-pulse 3s ease-in-out infinite; } + +.space-card { + background: rgba(0, 20, 60, 0.55); + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + border: 1px solid rgba(0, 212, 255, 0.25); + border-radius: 12px; + box-shadow: 0 0 20px rgba(0, 212, 255, 0.06), inset 0 1px 0 rgba(255,255,255,0.05); +} + +.space-scroll::-webkit-scrollbar { width: 4px; } +.space-scroll::-webkit-scrollbar-track { background: rgba(0,212,255,0.04); } +.space-scroll::-webkit-scrollbar-thumb { background: rgba(0,212,255,0.25); border-radius: 4px; } +.space-scroll::-webkit-scrollbar-thumb:hover { background: rgba(0,212,255,0.45); } + +::-webkit-scrollbar { width: 5px; height: 5px; } +::-webkit-scrollbar-track { background: transparent; } +::-webkit-scrollbar-thumb { background: rgba(0,212,255,0.2); border-radius: 10px; } + +.module-processing { + animation: module-spin 1.6s cubic-bezier(0.4, 0, 0.2, 1) forwards; + transform-style: preserve-3d; + perspective: 800px; +} + +.content-reveal { + animation: content-reveal 0.55s cubic-bezier(0.34, 1.56, 0.64, 1) both; +} + +.graph-node { cursor: pointer; } + +.animate-fade-in-up { animation: fade-in-up 0.25s ease-out; } +.animate-slide-in-right { animation: slide-in-right 0.25s ease-out; } diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..d084cca --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..b67b35e --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,16 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import { BrowserRouter } from 'react-router-dom' +import { ThemeProvider } from '@/shared/context/ThemeContext' +import App from './App' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + + + + + , +) diff --git a/src/modules/ai-matching/components/AIMHeader.tsx b/src/modules/ai-matching/components/AIMHeader.tsx new file mode 100644 index 0000000..a166303 --- /dev/null +++ b/src/modules/ai-matching/components/AIMHeader.tsx @@ -0,0 +1,161 @@ +import { useState, useEffect } from 'react'; +import { useNavigate } from 'react-router-dom'; +import ThemeToggle from '@/shared/components/ThemeToggle'; +import { DEMANDS, statusConfig } from '@/shared/data/demands'; + +export default function AIMHeader() { + const navigate = useNavigate(); + const [time, setTime] = useState(new Date()); + useEffect(() => { + const t = setInterval(() => setTime(new Date()), 1000); + return () => clearInterval(t); + }, []); + + const pad = (n: number) => String(n).padStart(2, '0'); + const timeStr = `${pad(time.getHours())}:${pad(time.getMinutes())}:${pad(time.getSeconds())}`; + const dateStr = `${time.getFullYear()}-${pad(time.getMonth()+1)}-${pad(time.getDate())}`; + + const totalDemands = 93; + const matchingCount = DEMANDS.filter(d => d.status === 'matching' || d.status === 'matched').length; + const pilotCount = DEMANDS.filter(d => d.status === 'pilot' || d.status === 'deployed').length; + const newCount = DEMANDS.filter(d => d.status === 'new').length; + + return ( +
+ {/* 顶部扫光线 */} +
+ + {/* 底部弧形 */} + + + + + + + + {/* Logo + 标题 */} +
+
+ 温州城市Logo +
+
+
+

+ 温州市“AI+制造”智创空间 +

+ + + LIVE + +
+
+
需求 · 诊断 · 规划 · 对接 · 落地
+
温州市人工智能局
+
+
+
+ + {/* 分隔线 */} +
+ + {/* 统计指标 */} +
+ {[ + { label: '入库需求', value: String(totalDemands), color: '#a8d8ff' }, + { label: '对接中', value: String(matchingCount), color: statusConfig.matching.color }, + { label: '试点落地', value: String(pilotCount), color: statusConfig.pilot.color }, + { label: '待对接', value: String(newCount), color: statusConfig.new.color }, + ].map((item, idx) => ( +
+
+
+ {item.value} +
+
+ {item.label} +
+
+ {idx < 3 &&
} +
+ ))} +
+ + {/* 右分隔线 */} +
+ + {/* 时间 + 操作按钮 */} +
+ + +
+
+ {timeStr} +
+
+ {dateStr} +
+
+ Powered by EIOS +
+
+
+
+ ); +} diff --git a/src/modules/ai-matching/components/BottomAIBar.tsx b/src/modules/ai-matching/components/BottomAIBar.tsx new file mode 100644 index 0000000..cf6fd33 --- /dev/null +++ b/src/modules/ai-matching/components/BottomAIBar.tsx @@ -0,0 +1,470 @@ +import { useState, useRef, useEffect, useCallback } from 'react'; +import { COUPONS, couponTypeConfig } from '@/shared/data/coupons'; +import TechIcon, { type TechIconName } from '@/shared/components/TechIcons'; +import type { AIDemand } from '@/shared/data/demands'; +import type { Translator } from '@/shared/data/translators'; +import { generateDesignDoingReply, searchDesignDoing } from '@/shared/data/designdoing'; + +interface Message { + id: number; + role: 'user' | 'ai'; + thinking: string; + content: string; + thinkingDone: boolean; + done: boolean; + time: string; +} + +type TabType = 'chat' | 'maturity' | 'roadmap' | 'coupons'; + +const getTimeStr = () => { + const now = new Date(); + return `${String(now.getHours()).padStart(2,'0')}:${String(now.getMinutes()).padStart(2,'0')}`; +}; + +const QUICK_CMDS = ['AI成熟度问诊', 'Design Doing方法论', '推荐落地方案', '匹配AI翻译官', '查询优惠券', '政策解读']; + +const MATURITY_STEPS = [ + { q: '企业是否已部署MES/SCADA/IoT等数据采集系统?', sub: '设备数字化率、联网率如何?数据是否可自动采集?', key: 'data_system', weight: 10, category: '自动化和数字化基础' }, + { q: '核心生产/经营数据积累情况如何?', sub: '是否有结构化存储?积累了多长时间?数据质量(完整性/一致性)如何?', key: 'data_quality', weight: 10, category: '数据与知识积累' }, + { q: '是否已部署ERP/MES/WMS/PLM等核心业务系统?', sub: '系统间是否实现数据互通?覆盖哪些核心工序?', key: 'it_system', weight: 10, category: '自动化和数字化基础' }, + { q: '是否有专职IT/数字化团队?', sub: '团队规模和AI基础通识水平如何?是否有外部数字化服务团队支持?', key: 'it_team', weight: 10, category: '团队与人才基础' }, + { q: '核心工艺知识是否有系统化沉淀?', sub: 'SOP/故障案例库/工艺参数优化经验,是纸质文档还是系统内置?是否建有企业知识库?', key: 'knowledge', weight: 10, category: '数据与知识积累' }, + { q: '是否已尝试过AI或机器学习项目?', sub: '引入了哪些工具?应用场景、使用频率及效果如何?未引入的原因是什么?', key: 'ai_exp', weight: 10, category: 'AI应用现状' }, + { q: '管理层是否有明确的AI转型目标和预算?', sub: '一把手是否亲自参与?是否制定1-2年短期或3-5年中长期AI规划?', key: 'leadership', weight: 10, category: 'AI提升意愿' }, + { q: '是否已识别出3个以上清晰的AI应用场景?', sub: '这些场景是单企业需求还是行业共性需求?核心价值和可行性如何评估?', key: 'scenario', weight: 10, category: 'AI应用现状' }, + { q: '推进AI应用的主要顾虑是什么?', sub: '技术不成熟/数据安全/投入回报不确定/员工抵触?愿意投入的资源力度?', key: 'concern', weight: 10, category: 'AI提升意愿' }, + { q: '是否已有明确的AI算力和部署规划?', sub: '自建/租赁/云边端混合?是否有国产化适配要求?预算规划如何?', key: 'infra', weight: 10, category: 'AI应用现状' }, +]; + +interface BottomAIBarProps { + selectedDemand: AIDemand | null; + selectedTranslator: Translator | null; +} + +export default function BottomAIBar({ selectedDemand, selectedTranslator }: BottomAIBarProps) { + const [tab, setTab] = useState('chat'); + const [messages, setMessages] = useState([{ + id: 0, role: 'ai', + thinking: '', + content: '您好!我是温州市“AI+制造”智创空间助手。\n\n我可以帮温州制造企业:\n• AI成熟度问诊评级(Design Doing方法论·10步5维)— 评估数字化基础、数据积累、团队人才、AI应用现状、AI提升意愿\n• 解析真实企业AI需求与场景痛点 — 由AI翻译官将业务语言转译为可交付任务\n• 推荐AI落地规划路线 — 生成从现状诊断到规模推广的分阶段实施路径\n• 匹配温州市AI+制造优惠券与政策支持 — 自动匹配算力券、语料券、咨询券、工具券、应用券\n\n试试快捷指令"Design Doing方法论",或直接提问任意步骤(如"数据采集怎么评估""工艺知识""算力规划"),我会为您详细解答!', + thinkingDone: true, done: true, time: getTimeStr(), + }]); + const [input, setInput] = useState(''); + const [isTyping, setIsTyping] = useState(false); + const [expanded, setExpanded] = useState(false); + const [maturityAnswers, setMaturityAnswers] = useState>({}); + const [maturityStep, setMaturityStep] = useState(0); + const [maturityDone, setMaturityDone] = useState(false); + const [claimedCoupons, setClaimedCoupons] = useState>(new Set()); + const scrollRef = useRef(null); + const streamTimerRef = useRef | null>(null); + + useEffect(() => { + if (scrollRef.current) scrollRef.current.scrollTop = scrollRef.current.scrollHeight; + }, [messages, isTyping]); + + const streamText = useCallback((msgId: number, field: 'thinking' | 'content', fullText: string, charDelay: number, onDone?: () => void) => { + let idx = 0; + const tick = () => { + idx += Math.floor(Math.random() * 2) + 1; + const slice = fullText.slice(0, Math.min(idx, fullText.length)); + setMessages(prev => prev.map(m => m.id === msgId ? { ...m, [field]: slice } : m)); + if (idx < fullText.length) { + streamTimerRef.current = setTimeout(tick, charDelay); + } else { + if (field === 'thinking') setMessages(prev => prev.map(m => m.id === msgId ? { ...m, thinkingDone: true } : m)); + else setMessages(prev => prev.map(m => m.id === msgId ? { ...m, done: true } : m)); + onDone?.(); + } + }; + streamTimerRef.current = setTimeout(tick, charDelay); + }, []); + + const buildAIReply = useCallback((text: string): { thinking: string; content: string } => { + // Design Doing 方法论知识库检索(优先匹配) + const ddSearch = searchDesignDoing(text); + if (ddSearch.isOverviewQuery || ddSearch.isMethodologyQuery || ddSearch.matchedSteps.length > 0) { + return generateDesignDoingReply( + text, + selectedDemand ? { + company: selectedDemand.company, + industry: selectedDemand.industry, + maturityLevel: selectedDemand.maturityLevel, + maturityScore: selectedDemand.maturityScore, + dataReadiness: selectedDemand.dataReadiness, + } : undefined + ); + } + if (text.includes('成熟度') || text.includes('问诊')) { + return { + thinking: `启动温州市AI成熟度评估模型…\n分析企业所在温州重点产业:${selectedDemand?.industry || '温州制造业'}…\n调取温州市“人工智能+制造”典型场景参考指引…\n结合问诊结果生成评级报告…`, + content: selectedDemand + ? `${selectedDemand.company} AI成熟度评估结果\n\n评级:${selectedDemand.maturityLevel}级(评分 ${selectedDemand.maturityScore}/100)\n\n评估维度(基于浙江版制造型企业AI场景调研提纲10步评估):\n\n一、自动化和数字化基础\n• 数据采集系统:${selectedDemand.dataReadiness >= 70 ? '已部署MES/SCADA/IoT,设备数字化率较高' : '数据采集体系尚在建设中'}\n• 核心业务系统:${selectedDemand.dataReadiness >= 60 ? 'ERP/MES/WMS已部分覆盖,系统集成度待提升' : '核心系统部署率较低,建议优先补齐'}\n\n二、数据与知识积累\n• 数据资产积累:${selectedDemand.dataReadiness}% 就绪度,${selectedDemand.dataReadiness >= 70 ? '数据质量较好,已具备AI建模基础' : '数据质量与结构化程度需进一步提升'}\n• 工艺知识沉淀:${selectedDemand.technicalDesc ? '已有部分结构化知识,建议建设企业专属知识库' : '以纸质文档和老员工经验为主,亟需系统化沉淀'}\n\n三、团队与人才基础\n• IT/数字化团队:${selectedDemand.department}主导,建议配置专职AI人员\n• AI通识水平:建议组织温州AI+制造专项培训\n\n四、AI应用现状\n• AI项目经验:${selectedDemand.maturityScore >= 60 ? '已有探索性项目,需建立系统化AI能力底座' : '尚处起步阶段,建议从单点场景切入'}\n• 场景识别:已明确“${selectedDemand.scenario}”核心场景\n\n五、AI提升意愿\n• 领导力与预算:预算区间 ${selectedDemand.budget},${selectedDemand.maturityScore >= 50 ? '管理层AI转型目标较为明确' : '建议加强一把手重视与预算保障'}\n• 落地顾虑:建议引入AI翻译官进行需求精化,明确技术边界与验收KPI\n\n下一步:\n• 把该企业需求拖入中间“AI成熟度问诊”模块查看五维详细诊断\n• 或拖入“AI落地规划”模块查看分阶段路线图` + : `AI成熟度10步问诊\n\n请先从左侧选择或拖拽一家企业需求到中间“AI成熟度问诊”模块。\n\n问诊维度(基于浙江省制造型企业AI场景调研提纲):\n\n一、自动化和数字化基础\n• 步骤1:数据采集系统(MES/SCADA/IoT)部署情况\n• 步骤3:核心业务系统(ERP/MES/WMS/PLM)覆盖与集成\n\n二、数据与知识积累\n• 步骤2:生产/经营数据积累与质量\n• 步骤5:工艺知识沉淀形式与知识库建设\n\n三、团队与人才基础\n• 步骤4:专职IT/数字化团队与AI通识水平\n\n四、AI应用现状\n• 步骤6:已引入AI工具与项目经验\n• 步骤8:AI应用场景识别清晰度\n• 步骤10:AI算力与部署规划\n\n五、AI提升意愿\n• 步骤7:管理层目标与预算\n• 步骤9:推进顾虑与资源投入意愿`, + }; + } + if (text.includes('方案') || text.includes('规划') || text.includes('落地')) { + return { + thinking: `分析温州企业需求场景:${selectedDemand?.scenario || '温州市AI+制造应用'}…\n匹配温州市“人工智能+制造”典型场景参考指引…\n评估数据就绪度与实施风险…\n生成分阶段落地路线图…`, + content: selectedDemand + ? `温州市AI+制造落地规划建议 · ${selectedDemand.company}\n\n目标场景:${selectedDemand.scenario}\n所属产业:${selectedDemand.industry}|区域:${selectedDemand.region}\n主导部门:${selectedDemand.department}|期望周期:${selectedDemand.timeline}\n\n阶段一(1-3个月)· 数据摸底与现状诊断\n• 盘点现有数据资产,评估质量与完整性\n• 对照温州市典型场景参考指引定义KPI\n• 选定首批试点区域/产线\n• 引入AI翻译官完成需求精化与场景可行性分析\n\n阶段二(3-6个月)· 试点验证与效果追踪\n• 申请算力券+咨询券启动开发\n• 在试点范围验证AI效果,建立ROI跟踪机制\n• 方案迭代优化,确保可量化验收\n\n阶段三(6-12个月)· 规模推广与持续运营\n• 基于试点结果优化模型与部署架构\n• 逐步扩展至全部应用范围\n• 建立AI运维与持续优化机制\n• 复制成功经验至同产业其他企业\n\n预算参考:${selectedDemand.budget}(建议申报温州市AI+制造专项支持)\n\n提示:把该企业需求拖入中间“AI落地规划”模块查看完整路线图与阶段明细` + : `请先选择或拖拽企业需求到中间模块,我将为您生成专属AI落地规划方案。\n\n您也可以尝试快捷指令:\n• “AI成熟度问诊” — 先了解企业AI准备度\n• “匹配AI翻译官” — 找到合适的专家进行需求精化\n• “查询优惠券” — 了解可用的政策支持`, + }; + } + if (text.includes('翻译官') || text.includes('匹配')) { + return { + thinking: `分析需求场景关键词…\n检索AI翻译官专长标签库…\n计算需求-翻译官匹配度…\n输出推荐排序…`, + content: selectedDemand + ? `AI翻译官智能推荐 · ${selectedDemand.scenario}\n\n当前需求来自 ${selectedDemand.company}(${selectedDemand.region},${selectedDemand.industry}),场景属于温州市“人工智能+制造”重点方向。\n\n一、业务痛点转译\n• 一句话描述痛点:${selectedDemand.painPoint}\n• 核心期望价值:通过AI技术实现该环节效率提升、人工依赖降低、质量一致性提高\n• AI可能扮演的角色:作为“智能助手”与“数据分析专家”,对业务数据进行统一分析,沉淀经验与知识,提供优化建议与决策支持\n\n二、数据与技术基础\n• 数据就绪度:${selectedDemand.dataReadiness}%,${selectedDemand.dataReadiness >= 70 ? '已具备一定结构化数据基础,可支撑AI建模起步' : '建议先完成数据资产盘点与质量评估'}\n• 现有系统:${selectedDemand.technicalDesc ? '已有部分业务系统覆盖,系统集成度待进一步提升' : '需确认现有ERP/MES/WMS等系统部署情况与数据互通能力'}\n• 算力规划:建议评估本地部署与云端训练混合方案\n\n三、翻译官推荐\n建议优先匹配三类专家:\n1. 温州本地制造业甲方专家 — 熟悉${selectedDemand.industry}真实产线与业务语言,最懂甲方痛点\n2. 温州高校/研究院专家 — 适合算法验证、样本构建与技术路线评审\n3. 工业AI服务商专家 — 适合系统集成、交付实施与ROI测算\n\n四、验收标准与对接流程\n• MVP验收:在试点数据集上核心指标达标;完成2-3家合作企业现场试用\n• 最终验收:真实场景连续稳定运行1个月+,核心KPI提升≥30%\n• 对接流程:①企业提交场景痛点与数据样本 ②AI翻译官输出需求说明与技术边界 ③进入落地规划与服务商对接\n\n点击右侧AI翻译官卡片发起对接申请` + : `请先选择或拖拽企业需求,我将为您推荐最匹配的AI翻译官。\n\nAI翻译官的职责:\n• 解析制造企业AI需求和场景痛点,量化业务损失与“理想状态”目标\n• 评估数据可用性、现有IT设施与算力资源\n• 用业务语言描述问题和解法,明确技术边界、输入数据和验收KPI\n• 定义MVP验收标准与最终项目验收标准\n\n来源:温州市人工智能局专家库、温州大学智能制造研究团队、乐清智能电气产业顾问组等`, + }; + } + if (text.includes('优惠券') || text.includes('券')) { + return { + thinking: `查询温州市人工智能局AI惠企政策库…\n匹配企业区域、产业类型与需求场景…\n过滤可用优惠券…\n计算可获得支持方向…`, + content: `可领取AI优惠券(${COUPONS.length}种)\n\n立即可用:\n• 算力券 — 支持模型训练、边缘推理和云端部署,覆盖工业视觉、预测维护等场景\n• AI翻译官咨询券 — 温州企业首次需求解析与成熟度诊断,8课时1对1服务\n• 工具券 — 支持工业大模型、知识库、视觉检测等试用,3个月免费API调用\n\n申请制:\n• 语料券 — 工业图像标注、工艺资料结构化、售后知识库整理\n• 应用券 — 需完成AI落地规划认定后进入试点支持,专项补贴最高¥10000\n\n发放机构:温州市人工智能局\n适用对象:温州市AI成熟度L1-L3制造企业\n\n提示:把企业需求拖入中间“优惠券领取”模块可查看全部详情并匹配申领`, + }; + } + if (text.includes('政策') || text.includes('补贴')) { + return { + thinking: `检索温州市“AI+制造”扶持政策库…\n匹配区县、产业链和典型场景…\n汇总可申请支持路径…`, + content: `温州市“AI+制造”政策解读\n\n支持方向:\n• 围绕智能电气、鞋业服装、汽车零部件、工业泵阀、新能源、智能装备等温州重点产业开展AI试点\n• 支持AI质量检测、AI计划排产、设备故障诊断、产品AI设计、智能经营决策等典型场景\n• 支持温州企业建设行业知识库、场景智能体、数据中台和AI应用示范线\n\n申报路径:\n1. 在本平台完成AI成熟度问诊评级\n2. 由AI翻译官输出业务语言版需求说明和技术路线建议\n3. 提交AI落地规划与试点KPI\n4. 通过温州市人工智能局认定后领取对应优惠券或试点支持\n\n政策来源:\n• 2026年第一批人工智能赋能新型工业化需求清单\n• 温州市“人工智能+制造”典型场景参考指引(试行)\n• 温州市AI+制造专项补贴与优惠券管理办法`, + }; + } + // 通用回复 + const name = selectedTranslator ? `【@${selectedTranslator.name}】` : ''; + return { + thinking: `${name ? `调用${name}专家知识库…\n` : ''}分析问题关键信息…\n结合制造业AI落地经验…\n生成个性化回答…`, + content: `${name ? `${name} ` : ''}收到您的问题:"${text}"\n\n基于温州市“AI+制造”智创空间分析:\n\n${selectedDemand ? `当前聚焦企业:${selectedDemand.company}\n区域:${selectedDemand.region}\n产业:${selectedDemand.industry}\n场景:${selectedDemand.scenario}\n成熟度:${selectedDemand.maturityLevel}(评分 ${selectedDemand.maturityScore}/100)\n数据就绪度:${selectedDemand.dataReadiness}%\n预算区间:${selectedDemand.budget}\n期望周期:${selectedDemand.timeline}\n\n` : ''}建议您使用快捷指令进行精准查询:\n• 输入“AI成熟度问诊” — 了解温州企业AI准备度\n• 输入“推荐落地方案” — 获取定制化路线图\n• 输入“匹配AI翻译官” — 找到最合适的专家\n• 输入“查询优惠券” — 了解可领取的政策支持\n• 输入“政策解读” — 查看温州市AI+制造扶持政策\n\n或者直接把左侧企业AI需求拖入中间 Agentic Space 的四个模块,即可生成对应内容。`, + }; + }, [selectedDemand, selectedTranslator]); + + const sendMessage = useCallback((text: string) => { + if (!text.trim() || isTyping) return; + setTab('chat'); + setMessages(prev => [...prev, { id: Date.now(), role: 'user', thinking: '', content: text, thinkingDone: true, done: true, time: getTimeStr() }]); + setInput(''); + setIsTyping(true); + setTimeout(() => { + const { thinking, content } = buildAIReply(text); + const aiMsgId = Date.now() + 1; + setMessages(prev => [...prev, { id: aiMsgId, role: 'ai', thinking: '', content: '', thinkingDone: false, done: false, time: getTimeStr() }]); + streamText(aiMsgId, 'thinking', thinking, 55, () => { + setTimeout(() => { streamText(aiMsgId, 'content', content, 40, () => setIsTyping(false)); }, 600); + }); + }, 450); + }, [isTyping, buildAIReply, streamText]); + + const maturityScore = Object.values(maturityAnswers).filter(v => v === true).length; + const maturityLevel = maturityScore <= 2 ? 'L1' : maturityScore <= 4 ? 'L2' : maturityScore <= 6 ? 'L3' : maturityScore <= 8 ? 'L4' : 'L5'; + const currentStep = MATURITY_STEPS[maturityStep]; + const currentCategory = currentStep?.category || ''; + + const chatHeight = expanded ? 380 : 90; + const ARC_H = 60; + + const TABS: { key: TabType; label: string; icon: TechIconName }[] = [ + { key: 'chat', label: '智能问答', icon: 'chat' }, + ]; + + return ( +
+
+ {/* 弧形顶部 */} + + + + + + + + + + +
+ +
+ + {/* Tab 切换栏 */} +
+ {TABS.map(t => ( + + ))} +
+ {selectedDemand && ( + + {selectedDemand.company} + + )} + {selectedTranslator && ( + + @{selectedTranslator.name} + + )} + +
+
+ + {/* ─── TAB: 智能问答 ─── */} + {tab === 'chat' && ( + <> +
+ {messages.map(msg => ( +
+ {msg.role === 'ai' && ( + + )} +
+ {msg.role === 'ai' && ( + <> + {msg.thinking && ( +
+ + {!msg.thinkingDone && } + {msg.thinking} + +
+ )} + {msg.thinkingDone && msg.content && ( +
+ {msg.content} + {!msg.done && } +
+ )} + + )} + {msg.role === 'user' && ( +
{msg.content}
+ )} +
{msg.time}
+
+ {msg.role === 'user' && ( + + )} +
+ ))} + {isTyping && messages[messages.length - 1]?.role !== 'ai' && ( +
+ +
+ {[0,1,2].map(i => )} +
+
+ )} +
+ + {/* 输入区 */} +
+
+ {QUICK_CMDS.map(cmd => ( + + ))} +
+
+ setInput(e.target.value)} onKeyDown={e => { if (e.key==='Enter' && !e.shiftKey) { e.preventDefault(); sendMessage(input); } }} + placeholder={selectedDemand ? `向AI助手提问关于 ${selectedDemand.company} 的AI需求…` : '输入问题,如:帮我分析这家企业的AI落地优先级…'} + style={{ flex: 1, padding: '9px 16px', borderRadius: 22, background: 'rgba(0,30,70,0.6)', border: '1px solid rgba(0,212,255,0.2)', color: 'rgba(255,255,255,0.92)', fontSize: 13, outline: 'none', transition: 'border-color 0.15s ease' }} + onFocus={e => (e.target.style.borderColor='rgba(0,212,255,0.5)')} + onBlur={e => (e.target.style.borderColor='rgba(0,212,255,0.2)')} + /> + +
+
+ + )} + + {/* ─── TAB: 成熟度问诊 ─── */} + {tab === 'maturity' && ( +
+ {!maturityDone ? ( + <> +
+ AI成熟度10步评估 · {currentCategory} + 第 {maturityStep + 1} / {MATURITY_STEPS.length} 步 +
+ {maturityStep < MATURITY_STEPS.length ? ( +
+

+ Q{maturityStep + 1}. {MATURITY_STEPS[maturityStep].q} +

+

+ {MATURITY_STEPS[maturityStep].sub} +

+
+ {[ + { label: '已具备/较好', icon: 'check' as TechIconName, value: true, color: '#00e599' }, + { label: '尚未具备/较弱', icon: 'close' as TechIconName, value: false, color: '#ff6b6b' }, + { label: '部分具备', icon: 'target' as TechIconName, value: 'partial' as string | boolean, color: '#ffb340' }, + ].map(opt => ( + + ))} +
+
+ ) : null} + {/* 进度 */} +
+
+
+
+ {maturityStep}/{MATURITY_STEPS.length} + {maturityStep > 0 && } + +
+ + ) : ( +
+
+
10步评估完成!
+
+
+
{maturityLevel}
+
+
AI成熟度等级
+
综合得分 {maturityScore * 10}/100
+
+
+ {/* 分类小结 */} +
+ {['自动化和数字化基础', '数据与知识积累', '团队与人才基础', 'AI应用现状', 'AI提升意愿'].map(cat => { + const catKeys = MATURITY_STEPS.filter(s => s.category === cat).map(s => s.key); + const catYes = catKeys.filter(k => maturityAnswers[k] === true).length; + const catTotal = catKeys.length; + const catPct = Math.round((catYes / catTotal) * 100); + return ( +
+
{cat}
+
+
+
= 70 ? '#00e599' : catPct >= 40 ? '#ffb340' : '#ff6b6b' }} /> +
+ = 70 ? '#00e599' : catPct >= 40 ? '#ffb340' : '#ff6b6b', fontSize: 11, fontWeight: 700 }}>{catPct}% +
+
+ ); + })} +
+

+ {maturityLevel === 'L1' && '处于AI启蒙期,建议从基础数字化建设入手:先建立数据采集能力、部署核心业务系统,再逐步积累工艺知识。'} + {maturityLevel === 'L2' && '具备探索基础,建议聚焦1-2个清晰场景进行AI小规模试点验证,同时补强数据治理和团队AI技能。'} + {maturityLevel === 'L3' && '已有一定AI基础,适合推进场景规模化复制和AI能力体系建设,重点加强数据互通与知识沉淀。'} + {maturityLevel === 'L4' && 'AI能力较成熟,可考虑构建自主AI开发能力和智能决策支持系统,探索算力基础设施优化。'} + {maturityLevel === 'L5' && '行业AI领先水平,建议向AI驱动业务创新方向演进,探索AI商业化与行业赋能输出。'} +

+
+ +
+
+ )} +
+ )} + + {/* ─── TAB: AI落地规划 ─── */} + {tab === 'roadmap' && ( +
+
+ {selectedDemand ? `${selectedDemand.company} · AI落地路线图` : '通用AI落地规划参考'} +
+
+ {[ + { phase: '阶段一', title: '现状诊断', duration: '1-2个月', color: '#ffb340', items: ['AI成熟度评估', '数据资产盘点', '场景识别优先级'], icon: 'analytics' as TechIconName }, + { phase: '阶段二', title: '需求精化', duration: '1-3个月', color: '#00d4ff', items: ['AI翻译官对接', '场景可行性分析', '技术方案评审'], icon: 'target' as TechIconName }, + { phase: '阶段三', title: '试点验证', duration: '3-6个月', color: '#7b61ff', items: ['小规模试点部署', 'ROI效果追踪', '方案迭代优化'], icon: 'lab' as TechIconName }, + { phase: '阶段四', title: '规模推广', duration: '6-12个月', color: '#00e599', items: ['扩大应用范围', '建立AI运维体系', '复制成功经验'], icon: 'deploy' as TechIconName }, + ].map(stage => ( +
+
+ +
+
{stage.phase}
+
{stage.title}
+
+
+
周期 {stage.duration}
+ {stage.items.map(item => ( +
· {item}
+ ))} +
+ ))} +
+
+ )} + + {/* ─── TAB: AI优惠券 ─── */} + {tab === 'coupons' && ( +
+
+ 温州市AI+制造优惠券({COUPONS.length}种可用) +
+
+ {COUPONS.map(coupon => { + const cfg = couponTypeConfig[coupon.type]; + const isClaimed = claimedCoupons.has(coupon.id); + return ( +
+
+ + {cfg.label} +
+
{coupon.title}
+
{coupon.value}
+
{coupon.condition}
+
{coupon.expiry} · 余{coupon.remaining}张
+ +
+ ); + })} +
+
+ )} +
+
+
+ ); +} diff --git a/src/modules/ai-matching/components/CenterDemandDetail.tsx b/src/modules/ai-matching/components/CenterDemandDetail.tsx new file mode 100644 index 0000000..f0b863a --- /dev/null +++ b/src/modules/ai-matching/components/CenterDemandDetail.tsx @@ -0,0 +1,603 @@ +import { useEffect, useRef, useState, type DragEvent } from 'react'; +import { DEMANDS, type AIDemand, maturityConfig, statusConfig } from '@/shared/data/demands'; +import { COUPONS, couponTypeConfig } from '@/shared/data/coupons'; +import { orgTypeConfig, type Translator } from '@/shared/data/translators'; +import TechIcon, { type TechIconName } from '@/shared/components/TechIcons'; + +interface CenterDemandDetailProps { + demand: AIDemand | null; + translator: Translator | null; + resetKey?: number; +} + +type AgentModule = 'maturity' | 'translator' | 'roadmap' | 'coupon'; + +const industryColors: Record = { + '智能电气': '#00d4ff', + '鞋业服装': '#ff6b9d', + '汽车零部件': '#ff8c42', + '工业泵阀': '#7b61ff', + '智能装备': '#4fc3f7', + '新能源': '#00e599', + '新材料': '#ffb340', + '智能物联': '#35d0ba', + '眼镜': '#9bdcff', + '食品农产品': '#8bd450', + '低空经济': '#b58cff', +}; + +const capabilityLabels = ['数据就绪', '系统集成', 'AI经验', '业务牵引', '场景清晰']; + +const capabilityScoreMap: Record = { + WZ001: [78, 82, 18, 76, 14], + WZ002: [82, 80, 22, 78, 16], + WZ003: [66, 18, 12, 72, 80], + WZ004: [63, 71, 15, 24, 84], + WZ005: [70, 16, 14, 82, 86], + WZ006: [52, 18, 12, 74, 79], + WZ007: [62, 14, 68, 80, 18], + WZ008: [48, 16, 74, 20, 82], + WZ009: [58, 24, 14, 76, 81], + WZ010: [50, 12, 70, 78, 18], + WZ011: [60, 18, 82, 14, 75], + WZ012: [61, 20, 78, 15, 72], + WZ013: [65, 17, 80, 82, 12], + WZ014: [58, 72, 15, 18, 80], + WZ015: [45, 12, 18, 77, 72], + WZ016: [68, 18, 13, 80, 84], + WZ017: [36, 14, 72, 18, 82], + WZ018: [40, 16, 18, 75, 82], + WZ019: [55, 78, 18, 84, 13], + WZ020: [49, 14, 76, 20, 82], + WZ021: [90, 86, 82, 78, 18], + WZ022: [64, 22, 75, 80, 16], + WZ023: [78, 82, 17, 15, 86], + WZ024: [72, 78, 18, 84, 15], + WZ025: [60, 15, 80, 18, 84], + WZ026: [50, 14, 16, 76, 82], + WZ027: [76, 84, 18, 80, 15], + WZ028: [75, 82, 78, 18, 14], +}; + +const moduleCards: { key: AgentModule; label: string; icon: TechIconName; color: string; desc: string }[] = [ + { key: 'maturity', label: 'AI成熟度问诊', icon: 'maturity', color: '#00d4ff', desc: '投放企业需求,生成五维成熟度诊断' }, + { key: 'translator', label: 'AI翻译官解析', icon: 'translator', color: '#7b61ff', desc: '投放企业需求,转译业务痛点与技术边界' }, + { key: 'roadmap', label: 'AI落地规划', icon: 'roadmap', color: '#00e599', desc: '投放企业需求,生成分阶段实施路线' }, + { key: 'coupon', label: '优惠券领取', icon: 'coupon', color: '#ff8c42', desc: '投放企业需求,匹配算力/语料/咨询等券' }, +]; + +function RadarChart({ scores, color }: { scores: number[]; color: string }) { + const cx = 60, cy = 60, r = 48; + const points = scores.map((v, i) => { + const angle = (i / 5) * Math.PI * 2 - Math.PI / 2; + const pct = Math.max(0.08, Math.min(1, v / 100)); + return { + x: cx + r * pct * Math.cos(angle), + y: cy + r * pct * Math.sin(angle), + labelX: cx + (r + 18) * Math.cos(angle), + labelY: cy + (r + 18) * Math.sin(angle), + }; + }); + const polyStr = points.map(p => `${p.x},${p.y}`).join(' '); + + return ( + + + {[0.25, 0.5, 0.75, 1].map(frac => { + const ps = Array.from({ length: 5 }, (_, i) => { + const a = (i / 5) * Math.PI * 2 - Math.PI / 2; + return `${cx + r * frac * Math.cos(a)},${cy + r * frac * Math.sin(a)}`; + }).join(' '); + return ; + })} + {Array.from({ length: 5 }, (_, i) => { + const a = (i / 5) * Math.PI * 2 - Math.PI / 2; + return ; + })} + + {points.map((p, i) => )} + {points.map((p, i) => ( + + {scores[i]} + + ))} + + + ); +} + +function MaturityGauge({ score, color }: { score: number; color: string }) { + const R = 38, cx = 50, cy = 52; + const startAngle = -220 * Math.PI / 180; + const endAngle = 40 * Math.PI / 180; + const totalAngle = endAngle - startAngle; + const progressAngle = startAngle + totalAngle * (score / 100); + + const arcPath = (fromA: number, toA: number, r: number) => { + const x1 = cx + r * Math.cos(fromA), y1 = cy + r * Math.sin(fromA); + const x2 = cx + r * Math.cos(toA), y2 = cy + r * Math.sin(toA); + const large = (toA - fromA) > Math.PI ? 1 : 0; + return `M ${x1} ${y1} A ${r} ${r} 0 ${large} 1 ${x2} ${y2}`; + }; + + return ( + + + + {score} + 成熟度评分 + + ); +} + +function ModuleCard({ card, active, inactive, compact, onDrop }: { card: typeof moduleCards[number]; active?: boolean; inactive?: boolean; compact?: boolean; onDrop: (module: AgentModule, event: DragEvent) => void }) { + const labelColor = inactive ? 'rgba(255,255,255,0.28)' : '#e8f4ff'; + const descColor = inactive ? 'rgba(255,255,255,0.18)' : 'rgba(255,255,255,0.58)'; + const iconColor = inactive ? 'rgba(255,255,255,0.2)' : card.color; + const iconBg = inactive ? 'rgba(255,255,255,0.04)' : `${card.color}12`; + const iconBorder = inactive ? '1px solid rgba(255,255,255,0.08)' : `1px solid ${card.color}45`; + const cardBg = active ? `${card.color}16` : inactive ? 'rgba(255,255,255,0.02)' : `${card.color}0d`; + const cardBorder = active ? `1px solid ${card.color}70` : inactive ? '1px solid rgba(255,255,255,0.08)' : `1px solid ${card.color}38`; + const cardShadow = active ? `0 0 26px ${card.color}18` : inactive ? 'none' : `inset 0 0 24px ${card.color}08`; + + return ( +
{ event.preventDefault(); event.currentTarget.style.background = `${card.color}18`; }} + onDragLeave={event => { event.currentTarget.style.background = cardBg; }} + onDrop={event => onDrop(card.key, event)} + style={{ + minHeight: compact ? 92 : 150, + padding: compact ? '14px 16px' : '24px 26px', + borderRadius: compact ? 14 : 18, + background: cardBg, + border: cardBorder, + boxShadow: cardShadow, + color: 'rgba(255,255,255,0.86)', + animation: 'card-in 0.35s both', + display: 'flex', + flexDirection: compact ? 'row' : 'column', + alignItems: compact ? 'center' : 'flex-start', + gap: compact ? 12 : 14, + transition: 'all 0.25s ease', + }} + > +
+ +
+
+
{card.label}
+
{card.desc}
+ {!compact && !inactive &&
拖入左侧企业AI需求卡片启动
} +
+
+ ); +} + +function ProcessingScreen({ module, demand }: { module: AgentModule; demand: AIDemand }) { + const card = moduleCards.find(c => c.key === module)!; + const steps = [ + '解析企业 AI 需求场景…', + '调取数据资产与基础评估…', + '匹配温州市典型场景参考指引…', + '生成分析报告…', + ]; + const [stepIdx, setStepIdx] = useState(0); + useEffect(() => { + const t = setInterval(() => setStepIdx(i => (i + 1) % steps.length), 480); + return () => clearInterval(t); + }, []); + + return ( +
+ {/* 旋转卡片 */} +
+ {/* 扫描线 */} +
+ {/* 轨道环 - 外圈 */} +
+
+
+ {/* 轨道环 - 内圈 */} +
+
+
+ +
{card.label}
+
+ + {/* 处理中文字 */} +
+ {demand.company} · {steps[stepIdx]} +
+ + {/* 点点动画 */} +
+ {[0, 1, 2].map(i => ( +
+ ))} +
+
+ ); +} + +function EmptyWorkspace({ onDrop }: { onDrop: (module: AgentModule, event: DragEvent) => void }) { + return ( +
+
+ {moduleCards.map(card => )} +
+
+ ); +} + +function DemandSummary({ demand }: { demand: AIDemand }) { + const mCfg = maturityConfig[demand.maturityLevel]; + const sCfg = statusConfig[demand.status]; + const indColor = industryColors[demand.industry] || '#00d4ff'; + const capabilityScores = capabilityScoreMap[demand.id] ?? [demand.dataReadiness, 20, 16, Math.max(70, demand.maturityScore), 82]; + + return ( +
+ +
+
+ {demand.company} + {sCfg.label} + {demand.industry} +
+

{demand.painPoint}

+
+
+ +
AI能力图谱
+
+
+ ); +} + +function ModuleWorkspace({ demand, module, onDrop }: { demand: AIDemand; module: AgentModule; onDrop: (module: AgentModule, event: DragEvent) => void }) { + const activeCard = moduleCards.find(card => card.key === module)!; + + return ( +
+
+ {moduleCards.map(card => )} +
+ +
+
+ +
+
{activeCard.label}
+
Agentic Space 已接收:{demand.company}
+
+
+ {module === 'maturity' && } + {module === 'translator' && } + {module === 'roadmap' && } + {module === 'coupon' && } +
+
+ ); +} + +function MaturityModule({ demand }: { demand: AIDemand }) { + const scores = capabilityScoreMap[demand.id] ?? [demand.dataReadiness, 20, 16, Math.max(70, demand.maturityScore), 82]; + const mCfg = maturityConfig[demand.maturityLevel]; + return ( +
+
+
五维成熟度问诊结论
+

+ {demand.company} 当前处于 {mCfg.label},综合评分 {demand.maturityScore}/100。建议先围绕“{demand.scenario}”建立小范围试点,以数据就绪度、系统接入能力和业务KPI闭环作为首批评估指标。 +

+
+
+ {capabilityLabels.map((label, index) => ( +
+
{label}{scores[index]}%
+
+
+
+
+ ))} +
+
+ ); +} + +function TranslatorModule({ demand }: { demand: AIDemand }) { + const mCfg = maturityConfig[demand.maturityLevel]; + return ( +
+ {[ + { + title: '业务语言 · 痛点描述与量化', icon: 'target' as TechIconName, color: '#ff8c42', + text: demand.businessDesc || demand.painPoint, + extra: [ + `核心问题指标:${demand.company}在“${demand.scenario}”场景中,当前${demand.painPoint}。`, + `问题导致的业务损失:生产效率受限、人工成本高企、质量波动影响交付稳定性。`, + `“理想状态”描述:通过AI技术实现该环节自动化或半自动化,减少人工依赖、提升一致性与可追溯性。`, + ], + }, + { + title: '数据与技术基础评估', icon: 'lab' as TechIconName, color: '#00d4ff', + text: demand.technicalDesc || `围绕${demand.scenario},需进一步确认数据来源、系统接口、现场部署环境和安全合规边界。`, + extra: [ + `可用数据集:${demand.dataReadiness >= 70 ? '企业已具备一定结构化数据基础,数据覆盖率较高,可支撑AI建模起步' : '数据采集与结构化程度不足,建议先完成数据资产盘点与质量评估'}。`, + `现有IT与硬件设施:${demand.dataReadiness >= 60 ? '已有ERP/MES等系统覆盖核心业务流程,系统集成度待进一步提升' : '核心业务系统部署率较低,需优先补齐数字化基础设施'}。`, + `数源需求:需进一步确认${demand.scenario}场景下的关键数据字段、采集频率、标注情况和隐私合规要求。`, + `算力资源:建议评估本地部署与云端训练的混合方案,满足数据安全与推理效率的双重要求。`, + ], + }, + { + title: 'AI翻译官 · 需求转译与交付边界', icon: 'translator' as TechIconName, color: '#7b61ff', + text: `将“${demand.painPoint}”转译为可交付任务。`, + extra: [ + `核心功能需求:${demand.suggestedSolution || '建议围绕该痛点构建AI辅助能力,明确输入数据格式、模型能力边界、系统集成接口和业务闭环流程'}。`, + `MVP验收标准:在试点数据集上,核心指标(准确率/召回率/效率提升)达到可量化目标;完成2-3家合作企业现场试用并收集反馈。`, + `最终验收标准:在真实生产场景中连续稳定运行1个月以上,核心KPI相比人工方式提升≥30%,方案具备向同产业其他企业复制推广能力。`, + `合作模式:建议采用“制造企业+AI翻译官+技术服务商”联合体模式,企业开放场景与数据,翻译官负责需求转译与技术边界定义,服务商负责交付实施。`, + `企业可投入资源:专项预算${demand.budget}、试点产线与真实生产环境、业务专家全程配合需求沟通与方案验证。`, + ], + }, + ].map(item => ( +
+
{item.title}
+

{item.text}

+ {item.extra?.map((line, i) => ( +

{line}

+ ))} +
+ ))} +
+
成熟度等级 {demand.maturityLevel} · 实施建议
+

+ {demand.maturityLevel === 'L1' && '当前数据基础薄弱,建议先完成核心业务系统部署和数据采集体系建设,再启动AI场景试点。可先申领咨询券进行成熟度诊断。'} + {demand.maturityLevel === 'L2' && '具备初步数字化基础,建议聚焦1-2个高价值场景做小规模验证,同步补强数据治理。推荐先引入AI翻译官完成需求精化。'} + {demand.maturityLevel === 'L3' && '已有一定AI探索经验,建议推进场景规模化复制,重点打通数据孤岛和建设知识库。可申请算力券+工具券加速开发。'} + {demand.maturityLevel === 'L4' && 'AI能力较为成熟,建议构建自主AI开发平台,推进智能决策支持系统。可探索云边端混合部署与国产化适配。'} + {demand.maturityLevel === 'L5' && '行业AI领先水平,建议向AI驱动业务创新方向演进,输出行业解决方案,探索AI商业化与产业链赋能。'} +

+
+
+ ); +} + +function RoadmapModule({ demand }: { demand: AIDemand }) { + const stages = [ + { phase: '阶段一', title: '现状诊断', duration: '1-2个月', color: '#ffb340', items: ['AI成熟度评估', '数据资产盘点', '场景识别优先级'], icon: 'analytics' as TechIconName }, + { phase: '阶段二', title: '需求精化', duration: '1-3个月', color: '#00d4ff', items: ['AI翻译官对接', '场景可行性分析', '技术方案评审'], icon: 'target' as TechIconName }, + { phase: '阶段三', title: '试点验证', duration: '3-6个月', color: '#7b61ff', items: ['小规模试点部署', 'ROI效果追踪', '方案迭代优化'], icon: 'lab' as TechIconName }, + { phase: '阶段四', title: '规模推广', duration: '6-12个月', color: '#00e599', items: ['扩大应用范围', '建立AI运维体系', '复制成功经验'], icon: 'deploy' as TechIconName }, + ]; + return ( +
+

+ 目标场景:{demand.scenario}|预算参考:{demand.budget}|期望周期:{demand.timeline}。{demand.suggestedSolution || '建议采用“小切口试点、可量化验收、可复制推广”的温州AI+制造实施路径。'} +

+
+ {stages.map(stage => ( +
+
+ +
+
{stage.phase}
+
{stage.title}
+
+
+
周期 {stage.duration}
+ {stage.items.map(item =>
· {item}
)} +
+ ))} +
+
+ ); +} + +function CouponModule({ demand }: { demand: AIDemand }) { + return ( +
+
+ 已按 {demand.region}、{demand.industry}、{demand.scenario} 自动匹配温州市AI+制造优惠券,建议优先申领咨询券、算力券和工具券。 +
+
+ {COUPONS.map(coupon => { + const cfg = couponTypeConfig[coupon.type]; + return ( +
+
+ + {cfg.label} +
+
{coupon.title}
+
{coupon.value}
+
{coupon.condition}
+
{coupon.expiry} · 余{coupon.remaining}张
+
+ ); + })} +
+
+ ); +} + +function TranslatorWorkspace({ translator }: { translator: Translator }) { + const orgCfg = orgTypeConfig[translator.orgType]; + const availabilityConfig = { + available: { label: '可接洽', color: '#00e599' }, + busy: { label: '忙碌中', color: '#ffb340' }, + offline: { label: '离线', color: 'rgba(255,255,255,0.35)' }, + }[translator.availability]; + + return ( +
+
+
{translator.avatar}
+
+
+ {translator.name} + {orgCfg.label} + {availabilityConfig.label} +
+
{translator.title}
+
{translator.organization}
+

{translator.bio}

+
+
+
+
{translator.rating}
+
专家评分
+
+
+
{translator.cases}
+
服务案例
+
+
+
+
+
+
+
专长领域
+
{translator.expertise.map(item => {item})}
+
+
+
适配温州产业
+
{translator.industries.map(item => {item})}
+
+
+
+
+
专业认证
+ {translator.certifications.map(item =>
· {item}
)} +
+
+
推荐对接方式
+
· 企业提交场景痛点、现有系统、数据样本与产线约束条件
· AI翻译官输出业务语言版需求说明,明确痛点量化指标与“理想状态”目标
· 翻译官定义技术边界:输入数据格式、模型能力范围、系统集成接口、验收KPI
· 输出MVP验收标准与最终项目验收标准,确保可量化、可追踪
· 进入落地规划、优惠券匹配和服务商对接,形成“企业+翻译官+服务商”联合体
+
+
+
+
+ ); +} + +function DemandDetailView({ demand }: { demand: AIDemand }) { + return ( +
+ +
+ {demand.tags.map(tag => #{tag})} +
+ +
+ ); +} + +export default function CenterDemandDetail({ demand, translator, resetKey = 0 }: CenterDemandDetailProps) { + const [activeModule, setActiveModule] = useState(null); + const [moduleDemand, setModuleDemand] = useState(null); + const [processing, setProcessing] = useState(false); + const [pendingModule, setPendingModule] = useState(null); + const [pendingDemand, setPendingDemand] = useState(null); + const timerRef = useRef | null>(null); + + useEffect(() => { + setActiveModule(null); + setModuleDemand(null); + setProcessing(false); + setPendingModule(null); + setPendingDemand(null); + if (timerRef.current) clearTimeout(timerRef.current); + }, [resetKey]); + + useEffect(() => { + if (demand) { + setActiveModule(null); + setModuleDemand(null); + setProcessing(false); + setPendingModule(null); + setPendingDemand(null); + if (timerRef.current) clearTimeout(timerRef.current); + } + }, [demand?.id]); + + const handleModuleDrop = (module: AgentModule, event: DragEvent) => { + event.preventDefault(); + const demandId = event.dataTransfer.getData('application/x-ai-demand-id'); + const droppedDemand = DEMANDS.find(item => item.id === demandId); + if (!droppedDemand) return; + // 先进入处理中动画状态 + setPendingModule(module); + setPendingDemand(droppedDemand); + setProcessing(true); + setActiveModule(null); + setModuleDemand(null); + // 2.2s 后再展示真实内容 + if (timerRef.current) clearTimeout(timerRef.current); + timerRef.current = setTimeout(() => { + setProcessing(false); + setModuleDemand(droppedDemand); + setActiveModule(module); + }, 2200); + }; + + if (translator) return ; + if (processing && pendingModule && pendingDemand) + return ; + if (activeModule && moduleDemand) return ; + if (!demand) return ; + return ; +} diff --git a/src/modules/ai-matching/components/LeftDemandPanel.tsx b/src/modules/ai-matching/components/LeftDemandPanel.tsx new file mode 100644 index 0000000..8d9dd81 --- /dev/null +++ b/src/modules/ai-matching/components/LeftDemandPanel.tsx @@ -0,0 +1,205 @@ +import { useState } from 'react'; +import { DEMANDS, maturityConfig, statusConfig, type AIDemand } from '@/shared/data/demands'; +import TechIcon from '@/shared/components/TechIcons'; + +interface LeftDemandPanelProps { + selectedId: string | null; + onSelect: (demand: AIDemand) => void; + onExpandChange?: (expanded: boolean) => void; +} + +const industryColors: Record = { + '智能电气': '#00d4ff', + '鞋业服装': '#ff6b9d', + '汽车零部件': '#ff8c42', + '工业泵阀': '#7b61ff', + '智能装备': '#4fc3f7', + '新能源': '#00e599', + '新材料': '#ffb340', + '智能物联': '#35d0ba', + '眼镜': '#9bdcff', + '食品农产品': '#8bd450', + '低空经济': '#b58cff', +}; + +export default function LeftDemandPanel({ selectedId, onSelect, onExpandChange }: LeftDemandPanelProps) { + const [filter, setFilter] = useState<'all' | 'new' | 'matching' | 'matched' | 'pilot'>('all'); + const [expanded, setExpanded] = useState(false); + + const filtered = filter === 'all' ? DEMANDS : DEMANDS.filter(d => d.status === filter); + const urgentCount = DEMANDS.filter(d => d.urgency === 'high').length; + + const handleExpand = () => { + const next = !expanded; + setExpanded(next); + onExpandChange?.(next); + }; + + const W = expanded ? 460 : 260; + const BULGE = 28; + const totalW = W + BULGE; + + const outlinePath = `M 0,0 L ${W - 70},0 Q ${W},0 ${W},80 C ${W + BULGE},2000 ${W + BULGE},8000 ${W},9920 L 0,10000 Z`; + const strokePath = `M 0,0.5 L ${W - 70},0.5 Q ${W - 0.5},0.5 ${W - 0.5},80 C ${W - 0.5 + BULGE},2000 ${W - 0.5 + BULGE},8000 ${W - 0.5},9920`; + + return ( +
+ + + + + + + + + + + + + + + +
+ {/* 标题区 */} +
+
+
+ + 企业AI需求 +
+
+ {urgentCount > 0 && ( + + {urgentCount}紧急 + + )} + +
+
+ + {/* 筛选标签 */} +
+ {(['all', 'new', 'matching', 'pilot'] as const).map(s => { + const isActive = filter === s; + const cfg = s !== 'all' ? statusConfig[s] : null; + return ( + + ); + })} +
+
+ +
+ + {/* 需求列表 */} +
+ {filtered.map((demand, idx) => { + const isSelected = selectedId === demand.id; + const mCfg = maturityConfig[demand.maturityLevel]; + const sCfg = statusConfig[demand.status]; + const indColor = industryColors[demand.industry] || '#00d4ff'; + + return ( +
{ + e.dataTransfer.setData('application/x-ai-demand-id', demand.id); + e.dataTransfer.effectAllowed = 'copy'; + }} + onClick={() => onSelect(demand)} + style={{ + padding: '10px 11px', borderRadius: 10, marginBottom: 7, + border: `1px solid ${isSelected ? '#00d4ff55' : 'rgba(0,212,255,0.12)'}`, + background: isSelected + ? 'linear-gradient(135deg, rgba(0,212,255,0.12) 0%, rgba(0,100,200,0.06) 100%)' + : 'rgba(0,20,50,0.35)', + cursor: 'pointer', transition: 'all 0.18s ease', + animation: `notice-in 0.3s ${idx * 0.05}s both`, + boxShadow: isSelected ? '0 0 14px rgba(0,212,255,0.15)' : 'none', + }} + onMouseEnter={e => { if (!isSelected) e.currentTarget.style.background = 'rgba(0,30,70,0.6)'; }} + onMouseLeave={e => { if (!isSelected) e.currentTarget.style.background = 'rgba(0,20,50,0.35)'; }} + > + {/* 顶行:公司名 + 状态 */} +
+
+
+ {demand.company} +
+
+ 拖拽至中间模块生成Agentic内容 +
+
+ {demand.region} +
+
+ {sCfg.label} +
+ + {/* 痛点描述 */} +

+ {demand.painPoint} +

+ + {/* 底行:行业标签 + 成熟度 + 场景 */} +
+ + {demand.industry} + + + {mCfg.label} + + {demand.urgency === 'high' && ( + + !紧急 + + )} +
+ + {/* 成熟度进度条 */} +
+
+
+
+ {demand.maturityScore} +
+
+ ); + })} +
+
+
+ ); +} diff --git a/src/modules/ai-matching/components/RightTranslatorPanel.tsx b/src/modules/ai-matching/components/RightTranslatorPanel.tsx new file mode 100644 index 0000000..0a2813c --- /dev/null +++ b/src/modules/ai-matching/components/RightTranslatorPanel.tsx @@ -0,0 +1,223 @@ +import { useState } from 'react'; +import { TRANSLATORS, orgTypeConfig, type Translator } from '@/shared/data/translators'; +import TechIcon from '@/shared/components/TechIcons'; + +interface RightTranslatorPanelProps { + onTranslatorSelect: (t: Translator) => void; + selectedId: number | null; + onExpandChange?: (expanded: boolean) => void; +} + +const availabilityConfig = { + available: { label: '可接洽', color: '#00e599' }, + busy: { label: '忙碌中', color: '#ffb340' }, + offline: { label: '离线', color: 'rgba(255,255,255,0.3)' }, +}; + +type FilterType = 'all' | 'vendor' | 'university' | 'enterprise'; + +export default function RightTranslatorPanel({ onTranslatorSelect, selectedId, onExpandChange }: RightTranslatorPanelProps) { + const [filter, setFilter] = useState('all'); + const [expanded, setExpanded] = useState(false); + + const filtered = filter === 'all' ? TRANSLATORS : TRANSLATORS.filter(t => t.orgType === filter); + const availableCount = TRANSLATORS.filter(t => t.availability === 'available').length; + + const handleExpand = () => { + const next = !expanded; + setExpanded(next); + onExpandChange?.(next); + }; + + const BULGE = 28; + const W = expanded ? 460 : 260; + + const outlinePath = `M ${W},0 L 70,0 Q 0,0 0,80 C ${-BULGE},2000 ${-BULGE},8000 0,9920 L ${W},10000 Z`; + const strokePath = `M ${W},0.5 L 70,0.5 Q 0.5,0.5 0.5,80 C ${-BULGE + 0.5},2000 ${-BULGE + 0.5},8000 0.5,9920`; + + return ( +
+ + + + + + + + + + + + + + + +
+ {/* 标题区 */} +
+
+
+ + AI翻译官 +
+
+ + {availableCount}可接洽 + + +
+
+ + {/* 类型筛选 */} +
+ {(['all', 'vendor', 'university', 'enterprise'] as FilterType[]).map(f => { + const isActive = filter === f; + const cfg = f !== 'all' ? orgTypeConfig[f] : null; + return ( + + ); + })} +
+ + {/* 进度条 */} +
+ 接洽率 +
+
+
+ {availableCount}/{TRANSLATORS.length} +
+
+ +
+ + {/* 翻译官列表 */} +
+ {filtered.map((translator, idx) => { + const isSelected = selectedId === translator.id; + const orgCfg = orgTypeConfig[translator.orgType]; + const availCfg = availabilityConfig[translator.availability]; + + return ( +
onTranslatorSelect(translator)} + style={{ + padding: '10px 10px', borderRadius: 10, marginBottom: 7, + border: `1px solid ${isSelected ? translator.color + '60' : 'rgba(123,97,255,0.15)'}`, + background: isSelected + ? `linear-gradient(135deg, ${translator.color}12 0%, ${translator.accentColor}08 100%)` + : 'rgba(10,5,40,0.4)', + cursor: 'pointer', transition: 'all 0.18s ease', + animation: `notice-in 0.3s ${idx * 0.06}s both`, + boxShadow: isSelected ? `0 0 14px ${translator.color}20` : 'none', + }} + onMouseEnter={e => { if (!isSelected) e.currentTarget.style.background = 'rgba(30,20,70,0.6)'; }} + onMouseLeave={e => { if (!isSelected) e.currentTarget.style.background = 'rgba(10,5,40,0.4)'; }} + > + {/* 顶行:头像 + 姓名 + 状态 */} +
+
+ {isSelected && ( +
+ )} + {translator.avatar} +
+ +
+
+ + {translator.name} + +
+ + {availCfg.label} +
+
+
{translator.title}
+
+
+ + {/* 机构 + 类型标签 */} +
+ {translator.organization} + {orgCfg.label} +
+ + {/* 简介 */} +

+ {translator.bio} +

+ + {/* 指标:评分 + 案例 */} +
+
+ + {translator.rating} +
+
+ {translator.cases} + 案例 +
+ {/* 专长 */} +
+ {translator.expertise.slice(0, 2).map(e => ( + {e} + ))} +
+
+ + {/* 展开态:认证信息 */} + {expanded && ( +
+
+
专业认证
+ {translator.certifications.map(c => ( +
· {c}
+ ))} +
+
+ )} +
+ ); + })} +
+
+
+ ); +} diff --git a/src/modules/ai-matching/index.ts b/src/modules/ai-matching/index.ts new file mode 100644 index 0000000..7de4bd5 --- /dev/null +++ b/src/modules/ai-matching/index.ts @@ -0,0 +1,14 @@ +import type { ModuleConfig } from '../registry'; + +export const moduleConfig: ModuleConfig = { + id: 'ai-matching', + name: 'AI+制造 智创空间', + description: '温州市"AI+制造"智创空间,智能匹配企业AI需求与AI翻译师', + icon: 'BrainCircuit', + path: '/ai-matching', + accentColor: '#00d4ff', + accentColorLight: '#1a56db', + gradient: 'linear-gradient(135deg, #001a4a, #003366, #004488)', + gradientLight: 'linear-gradient(135deg, #f0f7ff, #e8f0fe, #dbeafe)', + tags: ['AI', '制造', '匹配'], +}; diff --git a/src/modules/ai-matching/pages/AIMCockpit.tsx b/src/modules/ai-matching/pages/AIMCockpit.tsx new file mode 100644 index 0000000..3957417 --- /dev/null +++ b/src/modules/ai-matching/pages/AIMCockpit.tsx @@ -0,0 +1,164 @@ +import { useState } from 'react'; +import { useTheme } from '@/shared/context/ThemeContext'; +import StarBackground from '@/shared/components/StarBackground'; +import AIMHeader from '../components/AIMHeader'; +import LeftDemandPanel from '../components/LeftDemandPanel'; +import CenterDemandDetail from '../components/CenterDemandDetail'; +import RightTranslatorPanel from '../components/RightTranslatorPanel'; +import BottomAIBar from '../components/BottomAIBar'; +import type { AIDemand } from '@/shared/data/demands'; +import type { Translator } from '@/shared/data/translators'; + +export default function AIMCockpit() { + const { theme } = useTheme(); + const [selectedDemand, setSelectedDemand] = useState(null); + const [selectedTranslator, setSelectedTranslator] = useState(null); + const [leftExpanded, setLeftExpanded] = useState(false); + const [rightExpanded, setRightExpanded] = useState(false); + const [workspaceResetKey, setWorkspaceResetKey] = useState(0); + + const handleDemandSelect = (d: AIDemand) => { + setSelectedDemand(d); + setSelectedTranslator(null); + }; + + const handleTranslatorSelect = (t: Translator) => + setSelectedTranslator(prev => prev?.id === t.id ? null : t); + + const resetWorkspace = () => { + setSelectedDemand(null); + setSelectedTranslator(null); + setWorkspaceResetKey(key => key + 1); + }; + + return ( +
+ {/* 星空背景 */} + + + {/* 内容层 */} +
+ + {/* 顶部标题栏 */} + + + {/* 留白 */} +
+ + {/* 中部三栏区域 */} +
+ + {/* 左侧:企业AI需求面板,顶部留出80px */} +
+ +
+ + {/* 间隙 */} +
+ + {/* 中央:需求详情区 */} +
+ {/* 全息边框容器 */} +
+ {/* 四角装饰 */} + {['top-left', 'top-right', 'bottom-left', 'bottom-right'].map(pos => { + const isTop = pos.includes('top'); + const isLeft = pos.includes('left'); + return ( +
+ ); + })} + + {/* 中央标题栏 */} +
+
+ + 智创空间 Agentic Space + +
+ {selectedTranslator ? ( + + @{selectedTranslator.name} + + ) : selectedDemand && ( + + {selectedDemand.scenario} + + )} +
+
+ + {/* 中央内容 */} + +
+
+ + {/* 间隙 */} +
+ + {/* 右侧:AI翻译官面板 */} +
+ +
+
+ + {/* 底部留白 */} +
+ + {/* 底部智能问答工作区 */} + +
+
+ ); +} diff --git a/src/modules/bexell-scheduling-ai/App.tsx b/src/modules/bexell-scheduling-ai/App.tsx new file mode 100644 index 0000000..794ccbf --- /dev/null +++ b/src/modules/bexell-scheduling-ai/App.tsx @@ -0,0 +1,267 @@ +import React from 'react' +import { Routes, Route, Navigate, useNavigate, useLocation } from 'react-router-dom' +import { ConfigProvider, Layout, Menu, Button } from 'antd' +import { + SettingOutlined, + ToolOutlined, + TagsOutlined, + DashboardOutlined, + CalendarOutlined, + ClockCircleOutlined, + ThunderboltOutlined, +} from '@ant-design/icons' +import zhCN from 'antd/locale/zh_CN' + +import SysParameterPage from './pages/SysParameterPage' +import EquipmentCapacityPage from './pages/EquipmentCapacityPage' +import ProductInfoPage from './pages/ProductInfoPage' +import ProductEquipmentLoadPage from './pages/ProductEquipmentLoadPage' +import SchedulePage from './pages/SchedulePage' +import RealtimeMonitorPage from './pages/RealtimeMonitorPage' +import CapacityEvaluationPage from './pages/CapacityEvaluationPage' + +const { Sider, Content } = Layout + +const BASE_PATH = '/bexell-scheduling-ai' + +// 菜单分组配置 +const menuGroups = [ + { + title: '监控中心', + items: [ + { key: `${BASE_PATH}/realtime-monitor`, icon: , label: '实时产能监控' }, + ], + }, + { + title: '排产管理', + items: [ + { key: `${BASE_PATH}/product-equipment-load`, icon: , label: '产能负荷' }, + { key: `${BASE_PATH}/schedule`, icon: , label: '排产明细' }, + { key: `${BASE_PATH}/capacity-evaluation`, icon: , label: '产能评估' }, + ], + }, + { + title: '基础数据', + items: [ + { key: `${BASE_PATH}/equipment-capacity`, icon: , label: '设备产能' }, + { key: `${BASE_PATH}/product-info`, icon: , label: '品号信息' }, + ], + }, + { + title: '系统管理', + items: [ + { key: `${BASE_PATH}/sys-parameters`, icon: , label: '系统参数' }, + ], + }, +] + +// 页面标题映射 +const pageTitles: Record = { + [`${BASE_PATH}/sys-parameters`]: { title: '系统管理', subtitle: '系统参数配置与维护' }, + [`${BASE_PATH}/equipment-capacity`]: { title: '基础数据', subtitle: '设备产能信息管理' }, + [`${BASE_PATH}/product-info`]: { title: '基础数据', subtitle: '产品品号信息管理' }, + [`${BASE_PATH}/product-equipment-load`]: { title: '排产管理', subtitle: '品号设备产能负荷配置' }, + [`${BASE_PATH}/schedule`]: { title: '排产管理', subtitle: '品号设备排产明细管理' }, + [`${BASE_PATH}/capacity-evaluation`]: { title: '排产管理', subtitle: '试产设备产能评估与推荐' }, + [`${BASE_PATH}/realtime-monitor`]: { title: '监控中心', subtitle: '实时产线监控与产能概览' }, +} + +const AppLayout: React.FC = () => { + const navigate = useNavigate() + const location = useLocation() + + const menuItems = menuGroups.flatMap((group) => [ + { type: 'group' as const, label: group.title, children: group.items }, + ]) + + const currentPage = pageTitles[location.pathname] || { title: '', subtitle: '' } + + return ( + + {/* ===== 固定侧边栏 ===== */} + + {/* Logo 区域 - 固定顶部 */} +
+ BEXELL + + 试产排程评估 + +
+ + {/* 菜单区域 - 可滚动 */} +
+ navigate(key)} + style={{ + borderRight: 0, + paddingTop: 8, + background: 'transparent', + }} + /> +
+ + {/* 底部状态栏 - 固定至左侧下方 */} +
+ +
+ + 系统运行正常 +
+
+
+ + {/* ===== 主内容区 ===== */} + + {/* 页面标题栏 - 固定顶部,滚动不受影响 */} +
+

+ {currentPage.title} +

+

+ {currentPage.subtitle} +

+
+ + {/* 可滚动内容区 */} + + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + +
+
+ ) +} + +const App: React.FC = () => ( + + + +) + +export default App diff --git a/src/modules/bexell-scheduling-ai/api/index.ts b/src/modules/bexell-scheduling-ai/api/index.ts new file mode 100644 index 0000000..c86c8a1 --- /dev/null +++ b/src/modules/bexell-scheduling-ai/api/index.ts @@ -0,0 +1,61 @@ +import axios from 'axios' + +const api = axios.create({ + baseURL: '/bexapi', + timeout: 10000, +}) + +// 系统参数 +export const sysParameterApi = { + list: () => api.get('/sys-parameters/'), + get: (id: number) => api.get(`/sys-parameters/${id}`), + create: (data: any) => api.post('/sys-parameters/', data), + update: (id: number, data: any) => api.put(`/sys-parameters/${id}`, data), + delete: (id: number) => api.delete(`/sys-parameters/${id}`), +} + +// 设备产能 +export const equipmentApi = { + list: (params?: any) => api.get('/equipment-capacity/', { params }), + options: () => api.get('/equipment-capacity/options'), + get: (id: number) => api.get(`/equipment-capacity/${id}`), + create: (data: any) => api.post('/equipment-capacity/', data), + update: (id: number, data: any) => api.put(`/equipment-capacity/${id}`, data), + delete: (id: number) => api.delete(`/equipment-capacity/${id}`), +} + +// 品号信息 +export const productApi = { + list: () => api.get('/product-info/'), + options: () => api.get('/product-info/options'), + get: (id: number) => api.get(`/product-info/${id}`), + create: (data: any) => api.post('/product-info/', data), + update: (id: number, data: any) => api.put(`/product-info/${id}`, data), + delete: (id: number) => api.delete(`/product-info/${id}`), +} + +// 品号设备产能负荷 +export const productLoadApi = { + list: (params?: any) => api.get('/product-equipment-load/', { params }), + get: (id: number) => api.get(`/product-equipment-load/${id}`), + create: (data: any) => api.post('/product-equipment-load/', data), + update: (id: number, data: any) => api.put(`/product-equipment-load/${id}`, data), + delete: (id: number) => api.delete(`/product-equipment-load/${id}`), +} + +// 品号设备排产明细 +export const scheduleApi = { + list: (params?: any) => api.get('/schedule/', { params }), + get: (id: number) => api.get(`/schedule/${id}`), + create: (data: any) => api.post('/schedule/', data), + update: (id: number, data: any) => api.put(`/schedule/${id}`, data), + delete: (id: number) => api.delete(`/schedule/${id}`), +} + +// 设备实时产能 +export const realtimeApi = { + list: (params?: any) => api.get('/equipment-realtime/', { params }), + summary: () => api.get('/equipment-realtime/summary'), +} + +export default api diff --git a/src/modules/bexell-scheduling-ai/index.ts b/src/modules/bexell-scheduling-ai/index.ts new file mode 100644 index 0000000..33cbf09 --- /dev/null +++ b/src/modules/bexell-scheduling-ai/index.ts @@ -0,0 +1,14 @@ +import type { ModuleConfig } from '../registry'; + +export const moduleConfig: ModuleConfig = { + id: 'bexell-scheduling-ai', + name: '试产排程评估及优化', + description: 'BEXELL 试产排程评估及优化系统:实时产能监控/产能负荷/排产明细/产能评估', + icon: 'CalendarClock', + path: '/bexell-scheduling-ai', + accentColor: '#1677ff', + accentColorLight: '#003088', + gradient: 'linear-gradient(135deg, #001533, #002266, #003399)', + gradientLight: 'linear-gradient(135deg, #e8f0ff, #dbe7ff, #c8d8ff)', + tags: ['试产', '排程', '产能'], +}; diff --git a/src/modules/bexell-scheduling-ai/pages/CapacityEvaluationPage.tsx b/src/modules/bexell-scheduling-ai/pages/CapacityEvaluationPage.tsx new file mode 100644 index 0000000..99f8753 --- /dev/null +++ b/src/modules/bexell-scheduling-ai/pages/CapacityEvaluationPage.tsx @@ -0,0 +1,63 @@ +import React, { useState, useRef } from 'react' +import { Spin } from 'antd' + +const IFRAME_URL = 'https://kai-skc.apps.digiwincloud.com.cn/sso-login?routerLink=/assistant/web/kpedmt3i6ces31f2&userToken=' + + +const CapacityEvaluationPage: React.FC = () => { + const [loading, setLoading] = useState(true) + const iframeRef = useRef(null) + + // 从 sessionStorage 读取 userToken,拼接到 iframe URL + const userToken = sessionStorage.getItem('userToken') || '' + const iframeSrc = userToken ? `${IFRAME_URL}${encodeURIComponent(userToken)}` : IFRAME_URL + + const handleIframeLoad = () => { + setLoading(false) + } + + return ( +
+ {loading && ( +
+ +
+ )} + +