From ae315100b4e044a9544c63ff7a4cf68c40f9891b Mon Sep 17 00:00:00 2001 From: GaoXiang Date: Wed, 25 Mar 2026 14:59:06 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 24 + README.md | 46 + env/.env | 0 env/.env.development | 1 + env/.env.production | 1 + eslint.config.js | 37 + index.html | 14 + package-lock.json | 4033 ++++++++++++++++++ package.json | 37 + public/iconfont/iconfont.css | 71 + public/iconfont/iconfont.ttf | Bin 0 -> 4836 bytes public/iconfont/iconfont.woff | Bin 0 -> 3340 bytes public/iconfont/iconfont.woff2 | Bin 0 -> 2700 bytes public/stopshopping.svg | 64 + src/api/AxiosHelper.ts | 161 + src/api/ProblemDetails.ts | 7 + src/api/index.ts | 150 + src/api/models/AccessToken.ts | 8 + src/api/models/AntiForgeryToken.ts | 8 + src/api/models/ApiResponseType.ts | 7 + src/api/models/Category.ts | 21 + src/api/models/ChangePassword.ts | 4 + src/api/models/District.ts | 11 + src/api/models/Enums.ts | 58 + src/api/models/PagedResult.ts | 6 + src/api/models/PagedSearchType.ts | 4 + src/api/models/Product.ts | 40 + src/api/models/Reply.ts | 23 + src/api/models/Request.ts | 35 + src/api/models/SignIn.ts | 17 + src/api/models/SignUp.ts | 8 + src/api/models/Upload.ts | 14 + src/api/models/User.ts | 20 + src/api/models/index.ts | 16 + src/assets/signin-bg.jpeg | Bin 0 -> 109831 bytes src/components/LoadMore/index.tsx | 59 + src/components/Nav/index.module.css | 64 + src/components/Nav/index.tsx | 77 + src/components/TreeSelector/Props.ts | 20 + src/components/TreeSelector/index.module.css | 89 + src/components/TreeSelector/index.tsx | 147 + src/index.css | 84 + src/main.tsx | 14 + src/pages/Error/index.tsx | 44 + src/pages/Home/index.module.css | 220 + src/pages/Home/index.tsx | 425 ++ src/pages/Layout.module.css | 48 + src/pages/Layout.tsx | 83 + src/pages/Message/index.tsx | 7 + src/pages/Product/index.module.css | 167 + src/pages/Product/index.tsx | 389 ++ src/pages/Reply/index.tsx | 3 + src/pages/Request/index.module.css | 218 + src/pages/Request/index.tsx | 439 ++ src/pages/Settings/index.tsx | 7 + src/pages/SignIn/Layout.tsx | 10 + src/pages/SignIn/SignIn.module.css | 50 + src/pages/SignIn/SignIn.tsx | 98 + src/pages/SignIn/SignUp.tsx | 154 + src/pages/User/index.tsx | 7 + src/routes.ts | 48 + src/store/Action.ts | 4 + src/store/AppContextProvider.tsx | 13 + src/store/AppContexts.ts | 11 + src/store/Types.ts | 7 + src/store/appcontext/action.ts | 9 + src/store/appcontext/index.ts | 3 + src/store/appcontext/reducer.ts | 28 + src/store/appcontext/state.ts | 13 + src/store/home/action.ts | 182 + src/store/home/index.ts | 3 + src/store/home/reducer.ts | 168 + src/store/home/state.ts | 65 + src/store/product/action.ts | 135 + src/store/product/index.ts | 3 + src/store/product/reducer.ts | 144 + src/store/product/state.ts | 34 + src/store/request/action.ts | 144 + src/store/request/index.ts | 3 + src/store/request/reducer.ts | 140 + src/store/request/state.ts | 44 + src/store/signin/action.ts | 40 + src/store/signin/index.ts | 3 + src/store/signin/reducer.ts | 47 + src/store/signin/state.ts | 10 + src/themes/dark.module.css | 3 + src/themes/index.ts | 2 + src/themes/light.module.css | 3 + tsconfig.app.json | 34 + tsconfig.json | 7 + tsconfig.node.json | 26 + vite.config.ts | 40 + 92 files changed, 9285 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 env/.env create mode 100644 env/.env.development create mode 100644 env/.env.production create mode 100644 eslint.config.js create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/iconfont/iconfont.css create mode 100644 public/iconfont/iconfont.ttf create mode 100644 public/iconfont/iconfont.woff create mode 100644 public/iconfont/iconfont.woff2 create mode 100644 public/stopshopping.svg create mode 100644 src/api/AxiosHelper.ts create mode 100644 src/api/ProblemDetails.ts create mode 100644 src/api/index.ts create mode 100644 src/api/models/AccessToken.ts create mode 100644 src/api/models/AntiForgeryToken.ts create mode 100644 src/api/models/ApiResponseType.ts create mode 100644 src/api/models/Category.ts create mode 100644 src/api/models/ChangePassword.ts create mode 100644 src/api/models/District.ts create mode 100644 src/api/models/Enums.ts create mode 100644 src/api/models/PagedResult.ts create mode 100644 src/api/models/PagedSearchType.ts create mode 100644 src/api/models/Product.ts create mode 100644 src/api/models/Reply.ts create mode 100644 src/api/models/Request.ts create mode 100644 src/api/models/SignIn.ts create mode 100644 src/api/models/SignUp.ts create mode 100644 src/api/models/Upload.ts create mode 100644 src/api/models/User.ts create mode 100644 src/api/models/index.ts create mode 100644 src/assets/signin-bg.jpeg create mode 100644 src/components/LoadMore/index.tsx create mode 100644 src/components/Nav/index.module.css create mode 100644 src/components/Nav/index.tsx create mode 100644 src/components/TreeSelector/Props.ts create mode 100644 src/components/TreeSelector/index.module.css create mode 100644 src/components/TreeSelector/index.tsx create mode 100644 src/index.css create mode 100644 src/main.tsx create mode 100644 src/pages/Error/index.tsx create mode 100644 src/pages/Home/index.module.css create mode 100644 src/pages/Home/index.tsx create mode 100644 src/pages/Layout.module.css create mode 100644 src/pages/Layout.tsx create mode 100644 src/pages/Message/index.tsx create mode 100644 src/pages/Product/index.module.css create mode 100644 src/pages/Product/index.tsx create mode 100644 src/pages/Reply/index.tsx create mode 100644 src/pages/Request/index.module.css create mode 100644 src/pages/Request/index.tsx create mode 100644 src/pages/Settings/index.tsx create mode 100644 src/pages/SignIn/Layout.tsx create mode 100644 src/pages/SignIn/SignIn.module.css create mode 100644 src/pages/SignIn/SignIn.tsx create mode 100644 src/pages/SignIn/SignUp.tsx create mode 100644 src/pages/User/index.tsx create mode 100644 src/routes.ts create mode 100644 src/store/Action.ts create mode 100644 src/store/AppContextProvider.tsx create mode 100644 src/store/AppContexts.ts create mode 100644 src/store/Types.ts create mode 100644 src/store/appcontext/action.ts create mode 100644 src/store/appcontext/index.ts create mode 100644 src/store/appcontext/reducer.ts create mode 100644 src/store/appcontext/state.ts create mode 100644 src/store/home/action.ts create mode 100644 src/store/home/index.ts create mode 100644 src/store/home/reducer.ts create mode 100644 src/store/home/state.ts create mode 100644 src/store/product/action.ts create mode 100644 src/store/product/index.ts create mode 100644 src/store/product/reducer.ts create mode 100644 src/store/product/state.ts create mode 100644 src/store/request/action.ts create mode 100644 src/store/request/index.ts create mode 100644 src/store/request/reducer.ts create mode 100644 src/store/request/state.ts create mode 100644 src/store/signin/action.ts create mode 100644 src/store/signin/index.ts create mode 100644 src/store/signin/reducer.ts create mode 100644 src/store/signin/state.ts create mode 100644 src/themes/dark.module.css create mode 100644 src/themes/index.ts create mode 100644 src/themes/light.module.css create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/README.md b/README.md new file mode 100644 index 0000000..10dab17 --- /dev/null +++ b/README.md @@ -0,0 +1,46 @@ +# 简介 + +**停止购物**不同于传统由商户上架商品消费者进行下单的购物模式,提供相反的由消费者发布需求商户竞标的商品、服务交易的方式。 + +## 业务流程 +卖家:上架商品➡️寻找需求➡️推荐商品➡️⬇️➡️➡️发货➡️⬇️ +买家:发布需求➡️➡️➡️➡️➡️➡️➡️➡️➡️️️️️下单付款➡️⬆️➡️➡️收货 +> 用户注册后同时具有卖家、买家身份,默认为买家,可以在用户中心切换即可使用相应身份的功能 + +## 系统功能 +- **通用功能** + + [ ] 注册 + 账号、密码、默认角色(买家、卖家) + + [ ] 登录 + + [ ] 退出登录 + + 个人中心 + * [ ] 昵称、头像等维护 + * [ ] 收货地址维护 + * [ ] 角色切换(买家版、卖家版) +- **作为卖家时:** + + 上架商品 + * [ ] 商品基本信息维护 + * [ ] 商品详情维护 + + 浏览需求 + * [ ] 分类检索 + * [ ] 关键词检索 + * [ ] 地区检索 + * [ ] 排序展示(发布时间、距离、竞标者数量) + + 竞标 + * [ ] 详情页展示(买家信息、需求描述、竞标者列表) + * [ ] 竞标,选择商品 + + 订单管理 + * [ ] 竞标中:查看详情 + * [ ] 已中标:查看详情、发货、在线沟通 + * [ ] 已发货:查看详情、物流 + * [ ] 已完成(买家已收货):查看详情、评价买家 + * [ ] 已关闭(未中标):查看详情、删除 +- **作为买家时:** + + 发布需求 + * [ ] 发布页:分类、简短描述、详细描述、预算 + + 订单管理 + * [ ] 已发布:查看详情、修改详情 + * [ ] 有竞标:查看详情、查看竞标详情、接受 + * [ ] 待发货:查看详情、留言、在线沟通 + * [ ] 已发货:查看详情、物流、确认收货 + * [ ] 已完成:评价卖家 diff --git a/env/.env b/env/.env new file mode 100644 index 0000000..e69de29 diff --git a/env/.env.development b/env/.env.development new file mode 100644 index 0000000..2c67dcf --- /dev/null +++ b/env/.env.development @@ -0,0 +1 @@ +VITE_API_BASE=http://localhost:5162 \ No newline at end of file diff --git a/env/.env.production b/env/.env.production new file mode 100644 index 0000000..a6119ba --- /dev/null +++ b/env/.env.production @@ -0,0 +1 @@ +VITE_API_BASE=https://api.stopshopping.bjbj.me \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..c23cdf8 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,37 @@ +import js from "@eslint/js"; +import globals from "globals"; +import reactHooks from "eslint-plugin-react-hooks"; +import reactRefresh from "eslint-plugin-react-refresh"; +import tseslint from "typescript-eslint"; +import { defineConfig, globalIgnores } from "eslint/config"; + +export default defineConfig([ + globalIgnores(["dist"]), + { + files: ["**/*.{ts,tsx}"], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + rules: { + "@typescript-eslint/no-unused-vars": [ + "error", + { + args: "all", + argsIgnorePattern: "^_", + caughtErrors: "all", + caughtErrorsIgnorePattern: "^_", + destructuredArrayIgnorePattern: "^_", + varsIgnorePattern: "^_", + ignoreRestSiblings: true, + }, + ], + }, + }, +]); diff --git a/index.html b/index.html new file mode 100644 index 0000000..c304c5c --- /dev/null +++ b/index.html @@ -0,0 +1,14 @@ + + + + + + + + 🤚停止购物🛍️ + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..bf126be --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4033 @@ +{ + "name": "stop-shopping-web", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "stop-shopping-web", + "version": "0.0.0", + "dependencies": { + "axios": "^1.13.6", + "qs": "^6.15.0", + "quill": "^2.0.3", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-router": "^7.13.1" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@types/node": "^24.10.1", + "@types/qs": "^6.14.0", + "@types/react": "^19.2.7", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react-swc": "^4.2.2", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "postcss-nesting": "^14.0.0", + "typescript": "~5.9.3", + "typescript-eslint": "^8.48.0", + "vite": "^7.3.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@csstools/selector-resolve-nested": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-4.0.0.tgz", + "integrity": "sha512-9vAPxmp+Dx3wQBIUwc1v7Mdisw1kbbaGqXUM8QLTgWg7SoPGYtXBsMXvsFs/0Bn5yoFhcktzxNZGNaUt0VjgjA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.1.1" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-6.0.0.tgz", + "integrity": "sha512-4sSgl78OtOXEX/2d++8A83zHNTgwCJMaR24FvsYL7Uf/VS8HZk9PTwR51elTbGqMuwH3szLvvOXEaVnqn0Z3zA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.1.1" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.4.tgz", + "integrity": "sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.3", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", + "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@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/@rolldown/pluginutils": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz", + "integrity": "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@swc/core": { + "version": "1.15.18", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.18.tgz", + "integrity": "sha512-z87aF9GphWp//fnkRsqvtY+inMVPgYW3zSlXH1kJFvRT5H/wiAn+G32qW5l3oEk63KSF1x3Ov0BfHCObAmT8RA==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.25" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.15.18", + "@swc/core-darwin-x64": "1.15.18", + "@swc/core-linux-arm-gnueabihf": "1.15.18", + "@swc/core-linux-arm64-gnu": "1.15.18", + "@swc/core-linux-arm64-musl": "1.15.18", + "@swc/core-linux-x64-gnu": "1.15.18", + "@swc/core-linux-x64-musl": "1.15.18", + "@swc/core-win32-arm64-msvc": "1.15.18", + "@swc/core-win32-ia32-msvc": "1.15.18", + "@swc/core-win32-x64-msvc": "1.15.18" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.15.18", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.18.tgz", + "integrity": "sha512-+mIv7uBuSaywN3C9LNuWaX1jJJ3SKfiJuE6Lr3bd+/1Iv8oMU7oLBjYMluX1UrEPzwN2qCdY6Io0yVicABoCwQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.15.18", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.18.tgz", + "integrity": "sha512-wZle0eaQhnzxWX5V/2kEOI6Z9vl/lTFEC6V4EWcn+5pDjhemCpQv9e/TDJ0GIoiClX8EDWRvuZwh+Z3dhL1NAg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.15.18", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.18.tgz", + "integrity": "sha512-ao61HGXVqrJFHAcPtF4/DegmwEkVCo4HApnotLU8ognfmU8x589z7+tcf3hU+qBiU1WOXV5fQX6W9Nzs6hjxDw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.15.18", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.18.tgz", + "integrity": "sha512-3xnctOBLIq3kj8PxOCgPrGjBLP/kNOddr6f5gukYt/1IZxsITQaU9TDyjeX6jG+FiCIHjCuWuffsyQDL5Ew1bg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.15.18", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.18.tgz", + "integrity": "sha512-0a+Lix+FSSHBSBOA0XznCcHo5/1nA6oLLjcnocvzXeqtdjnPb+SvchItHI+lfeiuj1sClYPDvPMLSLyXFaiIKw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.15.18", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.18.tgz", + "integrity": "sha512-wG9J8vReUlpaHz4KOD/5UE1AUgirimU4UFT9oZmupUDEofxJKYb1mTA/DrMj0s78bkBiNI+7Fo2EgPuvOJfuAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.15.18", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.18.tgz", + "integrity": "sha512-4nwbVvCphKzicwNWRmvD5iBaZj8JYsRGa4xOxJmOyHlMDpsvvJ2OR2cODlvWyGFH6BYL1MfIAK3qph3hp0Az6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.15.18", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.18.tgz", + "integrity": "sha512-zk0RYO+LjiBCat2RTMHzAWaMky0cra9loH4oRrLKLLNuL+jarxKLFDA8xTZWEkCPLjUTwlRN7d28eDLLMgtUcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.15.18", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.18.tgz", + "integrity": "sha512-yVuTrZ0RccD5+PEkpcLOBAuPbYBXS6rslENvIXfvJGXSdX5QGi1ehC4BjAMl5FkKLiam4kJECUI0l7Hq7T1vwg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.15.18", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.18.tgz", + "integrity": "sha512-7NRmE4hmUQNCbYU3Hn9Tz57mK9Qq4c97ZS+YlamlK6qG9Fb5g/BB3gPDe0iLlJkns/sYv2VWSkm8c3NmbEGjbg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/types": { + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz", + "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.11.0.tgz", + "integrity": "sha512-fPxQqz4VTgPI/IQ+lj9r0h+fDR66bzoeMGHp8ASee+32OSGIkeASsoZuJixsQoVef1QJbeubcPBxKk22QVoWdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "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/@typescript-eslint/eslint-plugin": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz", + "integrity": "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/type-utils": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.56.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz", + "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", + "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.56.1", + "@typescript-eslint/types": "^8.56.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", + "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", + "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz", + "integrity": "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", + "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", + "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.56.1", + "@typescript-eslint/tsconfig-utils": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz", + "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", + "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-4.2.3.tgz", + "integrity": "sha512-QIluDil2prhY1gdA3GGwxZzTAmLdi8cQ2CcuMW4PB/Wu4e/1pzqrwhYWVd09LInCRlDUidQjd0B70QWbjWtLxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.2", + "@swc/core": "^1.15.11" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4 || ^5 || ^6 || ^7" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "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/axios": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", + "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "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.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "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/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001775", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001775.tgz", + "integrity": "sha512-s3Qv7Lht9zbVKE9XoTyRG6wVDCKdtOFIjBGg3+Yhn6JaytuNKPIjBMTMIY1AnOH3seL5mvF+x33oGAyK3hVt3A==", + "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/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "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/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "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/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "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/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.302", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", + "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==", + "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.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "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/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "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/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", + "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.3", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", + "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "license": "Apache-2.0" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "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/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "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.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "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/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "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/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "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/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash-es": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "license": "MIT" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "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/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/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "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/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parchment": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-3.0.0.tgz", + "integrity": "sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A==", + "license": "BSD-3-Clause" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "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.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-nesting": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-14.0.0.tgz", + "integrity": "sha512-YGFOfVrjxYfeGTS5XctP1WCI5hu8Lr9SmntjfRC+iX5hCihEO+QZl9Ra+pkjqkgoVdDKvb2JccpElcowhZtzpw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-resolve-nested": "^4.0.0", + "@csstools/selector-specificity": "^6.0.0", + "postcss-selector-parser": "^7.1.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quill": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/quill/-/quill-2.0.3.tgz", + "integrity": "sha512-xEYQBqfYx/sfb33VJiKnSJp8ehloavImQ2A6564GAbqG55PGw1dAWUn1MUbQB62t0azawUS2CZZhWCjO8gRvTw==", + "license": "BSD-3-Clause", + "dependencies": { + "eventemitter3": "^5.0.1", + "lodash-es": "^4.17.21", + "parchment": "^3.0.0", + "quill-delta": "^5.1.0" + }, + "engines": { + "npm": ">=8.2.3" + } + }, + "node_modules/quill-delta": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-5.1.0.tgz", + "integrity": "sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==", + "license": "MIT", + "dependencies": { + "fast-diff": "^1.3.0", + "lodash.clonedeep": "^4.5.0", + "lodash.isequal": "^4.5.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/react-router": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.13.1.tgz", + "integrity": "sha512-td+xP4X2/6BJvZoX6xw++A2DdEi++YypA69bJUV5oVvqf6/9/9nNlD70YO1e9d3MyamJEBQFEzk6mbfDYbqrSA==", + "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/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "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/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.1.tgz", + "integrity": "sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.56.1", + "@typescript-eslint/parser": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "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/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.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": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "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", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.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 + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "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/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..f3659b9 --- /dev/null +++ b/package.json @@ -0,0 +1,37 @@ +{ + "name": "stop-shopping-web", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview", + "prebuild": "rm -rf dist" + }, + "dependencies": { + "axios": "^1.13.6", + "qs": "^6.15.0", + "quill": "^2.0.3", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-router": "^7.13.1" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@types/node": "^24.10.1", + "@types/qs": "^6.14.0", + "@types/react": "^19.2.7", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react-swc": "^4.2.2", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "postcss-nesting": "^14.0.0", + "typescript": "~5.9.3", + "typescript-eslint": "^8.48.0", + "vite": "^7.3.1" + } +} diff --git a/public/iconfont/iconfont.css b/public/iconfont/iconfont.css new file mode 100644 index 0000000..4ac5c7c --- /dev/null +++ b/public/iconfont/iconfont.css @@ -0,0 +1,71 @@ +@font-face { + font-family: "ss"; /* Project id 5133620 */ + src: url('iconfont.woff2?t=1774167321603') format('woff2'), + url('iconfont.woff?t=1774167321603') format('woff'), + url('iconfont.ttf?t=1774167321603') format('truetype'); +} + +.ss { + font-family: "ss" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.ssi-settings:before { + content: "\e61d"; +} + +.ssi-view-right:before { + content: "\e66d"; +} + +.ssi-edit:before { + content: "\e60c"; +} + +.ssi-create:before { + content: "\e617"; +} + +.ssi-triangledownfill:before { + content: "\e79b"; +} + +.ssi-triangleupfill:before { + content: "\e79c"; +} + +.ssi-expand:before { + content: "\e631"; +} + +.ssi-sousuo:before { + content: "\e60d"; +} + +.ssi-shangpin:before { + content: "\e64b"; +} + +.ssi-toudi:before { + content: "\e605"; +} + +.ssi-gerenzhongxin:before { + content: "\e611"; +} + +.ssi-xiaoxi:before { + content: "\e736"; +} + +.ssi-xuqiuqingdan:before { + content: "\e600"; +} + +.ssi-yitoudi:before { + content: "\e667"; +} + diff --git a/public/iconfont/iconfont.ttf b/public/iconfont/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f327589bf528b134d29eebac75d0921dfec02b55 GIT binary patch literal 4836 zcmd@&TWnj$m2+n9`;xr8d|ZkWMN$+Wb|g^}C6THvQ;yRrh@WW{3$BycVI+#8E0J1> zj_oY4cG0G7+B8nuCVj*%QaDYEI_bN+LAzT!1=0paTNKE8yW0k>v50B(fi4!^MFVei zwP!9VJ8AN<|9kH}GiT16IWu$SJccAd2+_$Y!pP9=)BAVCKaqNn5Ew`5UHhg7a}(Ci zC2T)}?fYhzO3UojE87X7n-Ko4vUpG%9#k`Uo#6f(3>F3n|s_aB4Edj%oCfCTwB z>>0%W5h1y-)Hps7T(?o)AF(~LSf4GKX95u%|5a?qmrBQ%Ax56S{tn)*m6pn18@+IW z5aV^6FScA?ZJeo|!M2b0Un016c53|;xkm`BucH*;l(#&FLqY0GqSk-dnD}p^3l788 ztNTCC5nivaub&iveGr=pp-wk00c(RiOeCkxsT#h7;5^R5`!zB|iiEy zNGEBDZ;gL54vW=F3FWtX0QqD-MooPYa2ML)Y&%kkb8GcVS8l@}rS8O-?xp1fG6+h<~Heny9uMv}MCV4W6 zC!QaKbZ<|>04WC6NKdX1@&LBeNFJSpA|T1ao`5VSvM^eNToeKx$mH^)>4X%pSXK}o z7gYO-iWSEot_piS!x8&RWZ3h#2fyJ6#9O%i;mmEB%x!ylkqO1)*?1gI$jWtDzOLY> z41^<*@b!*ygh-_0dU(9!-ZnQ5Imp?waa2bu{;(6c4=?EE z9fV0;w_ntwK@HOOue4y){t|50H2WfwbWYNPQTlJ3gR=#rNP{%*dpn76U9W$Vz0OXN z94U}H$R6?#`3UMV5tQWii~8I^Who1jkT2xhMG;V+A+A&@Bua7!GKd%Qg<)hF&2Yub z$er;g`XHTg-fch&MJV*-LO8BhOh`d9V2xNkMHus^ab&(F&HytY_4cs8fGjEQop+6t zDtSSo9m!~aXFhA`onAqWn#}ydk4oXeaL;tF(V>})0R{WdzrC~*zCPgT*deJ>m!i9s zh!E*q`$oENEU0-X8?pa6zh$)Vb$D;@W&oxrs!L|FNC9^3 zv;RPUN4xZZHnBfft>*=ir8_O3ZhBO~?ACjajA`blzkhGI5KW7{o{-z>Fj4a0l}o$e z%b#?26cvvg(Tt!+>k`7@wJF0lVZQ(_Pt+f_B2^gs!tNOmWPc2{j;+1gmj@U~!AY;6 z%L>S%E;CiMAKAORZ71trWB&&^d>wIh{9F~2CQ6u z8;sB&>j9T5pkEFrZ=!JOKhkTufimFT8*mkw8ZFus%fTQ zw!3s4uFC!!GQNzNn4}<`kii2{?zTlpvls09aG-sk#1yZ}wsTqEgRAHYU9#Wgg4*Ms zq%%C4Kt=@_*b_VK=k4crz!TJu7)Jl3}!bg0X;lXqKXB<_ig~ z+W%xawZK4G-eDLFNmqM+G9^hUR60MP3A%&h}j;2%jksK0YAg1yKGmEqk8UT-j z+z3KuN;FgGQtSivFS@pO*}sUTQ*jvX>WOwkHl9k`@AtZWIt(#Mu%ES`m1M8~l&V@( zP?X1@ZodL|`sul|9?utzZAts7Po0GiowvX0ixJ_*&C5-aV-*$mg7}=TD?FER{ur;YJgs5;p)D zL@VT1A(6%yj(NbqBZ`8AQ3+ns3`LOPmuja^wKuCTs)lgUKB#C^*VyySZyC&`**|86 zw)QG4s^U3tul>aEvmEGN(=F1(el6?~^v}qU(tSQI$JdE+H2ZE%fls|6di@52Et-oN zmY=;bt?57?{RdIA&$CTyQpos=;+B}pt3LNGNeqUS`<)91THg8vwwGSo;^)Z|7AMiC z_YDqZ`*-j8`#rn+vqOXX(gV>^R1OyXc7E#EBgdwk0zP72H>}uLyc!#eS@!P@%Zgdn z>#gc%{d@M^dvGrbKuLQK-n(y4f9LcNiokDZ8YZXOLZ*({hb<#M7DG9PMN5{kfC6~& z?VBi%1$c*8|1JAI+d{VD{_n>9qX$#8(k$g+fuiw7DQ>PEm~gY^Xr3o$?7*Op2^`&? z<_nBFKE^I5mY}jiH)2^U#!(59k+IE|wRtSE_S^<`hia(!-4V}bS^ak)JWauBei3w8KB-!I%Zmy{Q|&n>F*g{T@^O z(tJR~8&k|`#TxcUyw@1yU8wy-gcL@LXmvqMkQCFTzXzS`hFi6bj9VsmJG>F%(eNmW zZpbf*H!h5Rj7uOh4^5*=i!?^9eBoSr>h9e6^F0#-;hC+Jq$gA1O&t^S6Kns21%7|> zb%ug}%1owGleBaE(DLCz;qdaI@k_2$H*>vaY#!+Io|Y75#oh90$rLva-!qk-31=tb z53@&;lc}qG_|>g*Tk%`_-o)J2j!mIdF-@mZlS%v6hX7Y%D3ZS~$fUe6Wo(q(|DgfOxcxi)hdBHZCE(uZ?Sn z4YY9`B_6;i00MV~H2FXq=f8p zl@0dQ2P(NnV?I8=QeTQs;kfeRVm-dRQa@6jZDbc3jpZ$agIpe`XJ_k6i3#%cq+L|H928r525RePXXJ~psY ztt>Qz@?5nc%{qtUZLCyFwaQ|7u70dGUtL`EY!Hqv^QKfjzFex!Nvrjvt4Hg~>H;z^ yS8HOUesr$tu9R2GwFejKwaW2oO*&pJ)sI(Q$B+I^6~9_#u2hpxR2@#f^#298YC5I> literal 0 HcmV?d00001 diff --git a/public/iconfont/iconfont.woff b/public/iconfont/iconfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..2bf5271ef3ee647d10b9ece814ee8683ef589241 GIT binary patch literal 3340 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 literal 0 HcmV?d00001 diff --git a/public/iconfont/iconfont.woff2 b/public/iconfont/iconfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..3d34f451548afa83e09a265e7b75977d585a73a0 GIT binary patch literal 2700 zcmV;73Ul>$Pew8T0RR9101Au%3jhEB021T?017_<0RR9100000000000000000000 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 GQ)~fi{vG-N literal 0 HcmV?d00001 diff --git a/public/stopshopping.svg b/public/stopshopping.svg new file mode 100644 index 0000000..aa79d1e --- /dev/null +++ b/public/stopshopping.svg @@ -0,0 +1,64 @@ + + + + diff --git a/src/api/AxiosHelper.ts b/src/api/AxiosHelper.ts new file mode 100644 index 0000000..4cc7ad3 --- /dev/null +++ b/src/api/AxiosHelper.ts @@ -0,0 +1,161 @@ +import qs from "qs"; +import Axios, { HttpStatusCode } from "axios"; +import type { AxiosInstance, AxiosResponse, CreateAxiosDefaults } from "axios"; +import type { ProblemDetails } from "./ProblemDetails"; +import type { AccessToken, AccessTokenResponse } from "./models/AccessToken"; +import type { + AntiForgeryToken, + AntiForgeryTokenResponse, +} from "./models/AntiForgeryToken"; + +class AxiosHelper { + private readonly REFRESH_TOKEN_URL: string = "/common/refreshtoken"; + private constructor(config?: CreateAxiosDefaults) { + this.axios = Axios.create({ + withCredentials: true, + baseURL: import.meta.env.VITE_API_BASE, + paramsSerializer: (params) => { + return qs.stringify(params, { + indices: false, + arrayFormat: "repeat", + }); + }, + ...config, + }); + + this.axios.interceptors.request.use(async (config) => { + if (this.accessToken?.token) { + config.headers.Authorization = `Bearer ${this.accessToken?.token}`; + } + if (this.csrfToken) + config.headers[this.csrfToken.headerName] = this.csrfToken.token; + return config; + }); + + this.axios.interceptors.response.use(null, async (err) => { + if (err.response?.status === HttpStatusCode.Unauthorized) { + if (err.config.url == this.REFRESH_TOKEN_URL) { + window.location.href = "/signin"; + return; + } + const succed = await this.refreshAccessToken(); + if (succed) return await this.axios(err.config); + else window.location.href = "/signin"; + } else if (err.response?.status === HttpStatusCode.BadRequest) { + const details = err.response.data as ProblemDetails; + + if (details.code == 1000) { + const succed = await this.refreshCsrfToken(); + if (succed) return await this.axios(err.config); + else throw Error("网络错误"); + } else if (details.code == 1001) { + throw Error(details.detail || ""); + } else { + throw Error(details.title || ""); + } + } else { + throw Error("网络错误"); + } + }); + } + + private accessToken: AccessToken | null = null; + private csrfToken: AntiForgeryToken | null = null; + + private axios: AxiosInstance; + + private static instance: AxiosHelper; + + static getInstance(config?: CreateAxiosDefaults): AxiosHelper { + if (!this.instance) { + this.instance = new AxiosHelper(config); + } + + return this.instance; + } + + private async refreshCsrfToken(): Promise { + const csrfResp = + await AxiosHelper.getInstance().post( + "/common/antiforgery-token", + ); + + if (csrfResp.isSucced) { + this.csrfToken = csrfResp.data; + } else { + throw Error(csrfResp.message || "服务器错误,请刷新重试"); + } + return csrfResp.isSucced; + } + + private async refreshAccessToken(): Promise { + const tokenResp = await AxiosHelper.getInstance().post( + this.REFRESH_TOKEN_URL, + ); + + if (tokenResp.isSucced) { + this.accessToken = tokenResp.data; + this.autoRefreshToken(); + } + + return tokenResp.isSucced; + } + + private autoRefreshToken() { + if (this.accessToken?.expiresIn) { + setTimeout( + async () => { + await this.refreshAccessToken(); + }, + (this.accessToken.expiresIn - 10) * 1000, + ); + } + } + + private handleResult(result: AxiosResponse): T { + if (result.status === HttpStatusCode.Ok) { + return result.data; + } else { + console.error(result); + throw new Error(`${result.status}:${result.statusText}`); + } + } + + /** + * 登录成功后调用 + * @param accessToken + */ + async initToken(accessToken: AccessToken) { + this.accessToken = accessToken; + if (this.accessToken?.expiresIn) { + this.autoRefreshToken(); + } + } + + async initCsrfToken(csrfToken: AntiForgeryToken) { + this.csrfToken = csrfToken; + } + + async get(path: string, data?: TIn): Promise { + const result = await AxiosHelper.getInstance().axios.get(path, { + params: data, + }); + + return this.handleResult(result); + } + + async post(path: string, data?: TIn): Promise { + const result = await AxiosHelper.getInstance().axios.post(path, data); + return this.handleResult(result); + } + + async postFormData( + path: string, + data?: TIn, + ): Promise { + const result = await AxiosHelper.getInstance().axios.postForm(path, data); + return this.handleResult(result); + } +} + +export { AxiosHelper }; diff --git a/src/api/ProblemDetails.ts b/src/api/ProblemDetails.ts new file mode 100644 index 0000000..c8d2591 --- /dev/null +++ b/src/api/ProblemDetails.ts @@ -0,0 +1,7 @@ +export interface ProblemDetails { + code: number + detail: string | null + instance: string | null + status: number | null + title: string | null +} diff --git a/src/api/index.ts b/src/api/index.ts new file mode 100644 index 0000000..3f394ef --- /dev/null +++ b/src/api/index.ts @@ -0,0 +1,150 @@ +import * as M from "./models"; +import { AxiosHelper } from "./AxiosHelper"; + +//user +export const signUp = async ( + params: M.SignUpParams, +): Promise => { + return await AxiosHelper.getInstance().post("/user/signup", params); +}; + +export const signIn = async ( + params: M.SignInParams, +): Promise => { + const signInResult = await AxiosHelper.getInstance().post( + "/user/signin", + params, + ); + if (signInResult.isSucced && signInResult.data?.accessToken) + await AxiosHelper.getInstance().initToken(signInResult.data.accessToken); + return signInResult; +}; + +export const changePassword = async ( + params: M.ChangePasswordParams, +): Promise => { + return await AxiosHelper.getInstance().post("/user/changepassword", params); +}; + +export const userInfo = async (): Promise => { + return await AxiosHelper.getInstance().get("/user/info"); +}; + +export const editUser = async ( + params: M.EditUserParams, +): Promise => { + return await AxiosHelper.getInstance().post("/user/edit", params); +}; + +//district +export const districtTop3Levels = async (): Promise => { + return await AxiosHelper.getInstance().get("/district/top3level"); +}; + +export const districtChildren = async ( + parentId: number, +): Promise => { + return await AxiosHelper.getInstance().get("/district/children", { + parentId, + }); +}; + +//common +export const upload = async ( + params: M.UploadParams, +): Promise => { + return await AxiosHelper.getInstance().postFormData("/common/upload", params); +}; + +export const csrfToken = async (): Promise => { + const csrfResult = + await AxiosHelper.getInstance().post( + "/common/antiforgery-token", + ); + if (csrfResult.isSucced && csrfResult.data) + await AxiosHelper.getInstance().initCsrfToken(csrfResult.data); + + return csrfResult; +}; + +export const signOut = async (): Promise => { + return await AxiosHelper.getInstance().post("/common/signout"); +}; + +export const refreshToken = async (): Promise => { + return await AxiosHelper.getInstance().post("/common/refreshtoken"); +}; + +//category +export const getCategoryTree = async (): Promise => { + return await AxiosHelper.getInstance().get("/category/list"); +}; + +//product +export const productSearch = async ( + params: M.ProductSearchParms, +): Promise => { + return await AxiosHelper.getInstance().get("/product/list", params); +}; + +export const productDetail = async ( + productId: number, +): Promise => { + return await AxiosHelper.getInstance().get("/product/detail", { productId }); +}; + +export const productEdit = async ( + params: M.EditProductParams, +): Promise => { + return await AxiosHelper.getInstance().post("/product/edit", params); +}; + +export const productDelete = async ( + productId: number, +): Promise => { + return await AxiosHelper.getInstance().post("/product/delete", { productId }); +}; + +//request +export const requestPublish = async ( + params: M.CreateRequestParams, +): Promise => { + return await AxiosHelper.getInstance().post("/request/publish", params); +}; + +export const requestSearch = async ( + params: M.RequestSearchParams, +): Promise => { + return await AxiosHelper.getInstance().get("/request/search", params); +}; + +export const requestOrders = async ( + params: M.RequestOrdersParams, +): Promise => { + return await AxiosHelper.getInstance().get("/request/orders", params); +}; + +export const requestDelete = async ( + requestId: number, +): Promise => { + return await AxiosHelper.getInstance().post("/request/delete", { requestId }); +}; + +//reply +export const replyPost = async ( + params: M.ReplyParams, +): Promise => { + return await AxiosHelper.getInstance().post("/reply/post", params); +}; + +export const replyList = async ( + requestId: number, +): Promise => { + return await AxiosHelper.getInstance().get("/reply/list", { requestId }); +}; + +export const replyOrders = async ( + params: M.RequestOrdersParams, +): Promise => { + return await AxiosHelper.getInstance().get("/reply/orders", params); +}; diff --git a/src/api/models/AccessToken.ts b/src/api/models/AccessToken.ts new file mode 100644 index 0000000..ffb0727 --- /dev/null +++ b/src/api/models/AccessToken.ts @@ -0,0 +1,8 @@ +import type { ApiResponseType } from './ApiResponseType'; + +export interface AccessToken { + token: string; + expiresIn: number; +}; + +export type AccessTokenResponse = ApiResponseType; diff --git a/src/api/models/AntiForgeryToken.ts b/src/api/models/AntiForgeryToken.ts new file mode 100644 index 0000000..5007e60 --- /dev/null +++ b/src/api/models/AntiForgeryToken.ts @@ -0,0 +1,8 @@ +import type { ApiResponseType } from './ApiResponseType'; + +export interface AntiForgeryToken { + headerName: string; + token: string; +}; + +export type AntiForgeryTokenResponse = ApiResponseType; diff --git a/src/api/models/ApiResponseType.ts b/src/api/models/ApiResponseType.ts new file mode 100644 index 0000000..38e562d --- /dev/null +++ b/src/api/models/ApiResponseType.ts @@ -0,0 +1,7 @@ +export interface ApiResponseType { + isSucced: boolean; + message: string | null; + data: TData | null; +} + +export type ApiResponseMessage = ApiResponseType; diff --git a/src/api/models/Category.ts b/src/api/models/Category.ts new file mode 100644 index 0000000..ce716a4 --- /dev/null +++ b/src/api/models/Category.ts @@ -0,0 +1,21 @@ +import { type ApiResponseType } from './ApiResponseType' + +export interface Category { + id: number + parentId: number + name: string + logoUrl: string + order: number + children: Array +} + +export type CategoryListResponse = ApiResponseType> + +export interface EditCategoryParams { + id: number | null + parentId: number + name: string + logo: string | null +} + +export type EditCategoryResponse = ApiResponseType diff --git a/src/api/models/ChangePassword.ts b/src/api/models/ChangePassword.ts new file mode 100644 index 0000000..d4cdae3 --- /dev/null +++ b/src/api/models/ChangePassword.ts @@ -0,0 +1,4 @@ +export interface ChangePasswordParams { + oldPassword: string; + newPassword: string; +}; diff --git a/src/api/models/District.ts b/src/api/models/District.ts new file mode 100644 index 0000000..bf7a71c --- /dev/null +++ b/src/api/models/District.ts @@ -0,0 +1,11 @@ +import type { ApiResponseType } from './ApiResponseType'; + +interface District { + id: number; + parentId: number; + level: number; + fullName: string; + children: Array; +}; + +export type DistrictsResponse = ApiResponseType>; diff --git a/src/api/models/Enums.ts b/src/api/models/Enums.ts new file mode 100644 index 0000000..8d292cd --- /dev/null +++ b/src/api/models/Enums.ts @@ -0,0 +1,58 @@ +export const UploadScences = { + Avatar: 0, + Product: 1, + Category: 2, +} as const; +export type UploadScencesType = + (typeof UploadScences)[keyof typeof UploadScences]; + +export const UserRoles = { + Seller: 0, + Buyer: 1, +} as const; +export type UserRolesType = (typeof UserRoles)[keyof typeof UserRoles]; + +export const ProductOrderBys = { + CreateTime: 0, + CreateTimeDesc: 1, + Category: 2, + CategoryDesc: 3, + SoldAmount: 4, + SoldAmountDesc: 5, +} as const; +export type ProductOrderBysType = + (typeof ProductOrderBys)[keyof typeof ProductOrderBys]; + +export const RequestOrderBys = { + PublishTime: 0, + PublishTimeDesc: 1, + CategoryId: 2, + CategoryIdDesc: 3, + ReplyAmount: 4, + ReplyAmountDesc: 5, +} as const; +export type RequestOrderBysType = + (typeof RequestOrderBys)[keyof typeof RequestOrderBys]; + +export const RequestStatus = { + All: -1, + Publish: 0, + Replied: 1, + Accepted: 2, + Sent: 3, + Completed: 4, + Commented: 5, +} as const; +export type RequestStatusType = + (typeof RequestStatus)[keyof typeof RequestStatus]; +export const RequestStatusNames: { [K in keyof typeof RequestStatus]: K } = { + All: "All", + Publish: "Publish", + Replied: "Replied", + Accepted: "Accepted", + Sent: "Sent", + Completed: "Completed", + Commented: "Commented", +} as const; +export type RequestStatusNamesType = + (typeof RequestStatusNames)[keyof typeof RequestStatusNames]; diff --git a/src/api/models/PagedResult.ts b/src/api/models/PagedResult.ts new file mode 100644 index 0000000..93a39a2 --- /dev/null +++ b/src/api/models/PagedResult.ts @@ -0,0 +1,6 @@ +export interface PagedResult { + pageCount: number; + pageSize: number; + pageIndex: number; + data: Array; +} \ No newline at end of file diff --git a/src/api/models/PagedSearchType.ts b/src/api/models/PagedSearchType.ts new file mode 100644 index 0000000..198d04e --- /dev/null +++ b/src/api/models/PagedSearchType.ts @@ -0,0 +1,4 @@ +export interface PagedSearchType { + pageIndex: number; + pageSize: number; +}; diff --git a/src/api/models/Product.ts b/src/api/models/Product.ts new file mode 100644 index 0000000..edb5c01 --- /dev/null +++ b/src/api/models/Product.ts @@ -0,0 +1,40 @@ +import type { ApiResponseType } from "./ApiResponseType"; +import type { PagedResult } from "./PagedResult"; +import type { ProductOrderBysType } from "./Enums"; +import type { PagedSearchType } from "./PagedSearchType"; + +export interface Product { + id: number; + name: string; + description: string | null; + logoUrl: string | null; + categoryName: string; + minimumUnit: string; + unitPrice: number; + soldAmount: number; + createTime: string; +} +export type ProductSearchResponse = ApiResponseType>; + +interface ProductInfo extends Product { + categoryId: number; + detail: string | null; +} +export type ProductInfoResponse = ApiResponseType; + +export interface ProductSearchParms extends PagedSearchType { + categoryId: number | null; + keyword: string | null; + orderBys: Array; +} + +export interface EditProductParams { + id: number | null; + name: string | null; + description: string | null; + logoName: string | null; + categoryId: number; + minimumUnit: string | null; + unitPrice: number; + detail: string | null; +} diff --git a/src/api/models/Reply.ts b/src/api/models/Reply.ts new file mode 100644 index 0000000..8fd8033 --- /dev/null +++ b/src/api/models/Reply.ts @@ -0,0 +1,23 @@ +import type { ApiResponseType } from "./ApiResponseType"; + +export interface ReplyParams { + requestId: number; + productId: number; + amount: number; + price: number; + memo: string | null; +} + +export interface Reply { + id: number; + productId: number; + productName: string; + unitPrice: number; + minimumUnit: string; + amount: number; + replyTime: string; + replier: string; + memo: string | null; +} + +export type ReplyResponse = ApiResponseType>; diff --git a/src/api/models/Request.ts b/src/api/models/Request.ts new file mode 100644 index 0000000..5e70496 --- /dev/null +++ b/src/api/models/Request.ts @@ -0,0 +1,35 @@ +import type { ApiResponseType } from "./ApiResponseType"; +import type { PagedResult } from "./PagedResult"; +import type { PagedSearchType } from "./PagedSearchType"; +import type { RequestOrderBysType, RequestStatusType } from "./Enums"; + +export interface CreateRequestParams { + name: string; + description: string | null; + categoryId: number; + deadline: string; +} + +export interface RequestSearchParams extends PagedSearchType { + categoryId: number | null; + keyword: string | null; + orderBys: Array; +} + +export interface RequestOrdersParams extends RequestSearchParams { + status: RequestStatusType; +} + +export interface Request { + id: number; + serialNo: string; + name: string; + description: string | null; + categoryId: number; + categoryName: string; + publisher: string; + publishTime: string; + deadline: string; + replyAmount: number; +} +export type RequestSearchResponse = ApiResponseType>; diff --git a/src/api/models/SignIn.ts b/src/api/models/SignIn.ts new file mode 100644 index 0000000..069095f --- /dev/null +++ b/src/api/models/SignIn.ts @@ -0,0 +1,17 @@ +import type { ApiResponseType } from "./ApiResponseType"; +import type { UserRolesType } from "./Enums"; +import type { AccessToken } from "./AccessToken"; + +interface SignIn { + defaultRole: UserRolesType; + accessToken: AccessToken; + avatarUrl?: string; + nickName: string; +} + +export type SignInResponse = ApiResponseType; + +export interface SignInParams { + account: string; + password: string; +} diff --git a/src/api/models/SignUp.ts b/src/api/models/SignUp.ts new file mode 100644 index 0000000..05b486f --- /dev/null +++ b/src/api/models/SignUp.ts @@ -0,0 +1,8 @@ +import type { UserRolesType } from './Enums'; + +export interface SignUpParams { + account: string; + nickName: string; + defaultRole: UserRolesType; + password: string; +}; diff --git a/src/api/models/Upload.ts b/src/api/models/Upload.ts new file mode 100644 index 0000000..8160f3f --- /dev/null +++ b/src/api/models/Upload.ts @@ -0,0 +1,14 @@ +import type { ApiResponseType } from './ApiResponseType'; +import type { UploadScencesType } from './Enums'; + +interface Upload { + newName: string; + url: string; +}; + +export type UploadResponse = ApiResponseType; + +export interface UploadParams { + scences: UploadScencesType, + file: File +}; diff --git a/src/api/models/User.ts b/src/api/models/User.ts new file mode 100644 index 0000000..63323f1 --- /dev/null +++ b/src/api/models/User.ts @@ -0,0 +1,20 @@ +import type { ApiResponseType } from './ApiResponseType'; +import type { UserRolesType } from './Enums'; + +interface User { + account: string; + nickName: string; + telephone: string | null; + defaultRole: UserRolesType; + avatarUrl: string | null; + lastLoginTime: string | null; +}; + +export type UserResponse = ApiResponseType; + +export interface EditUserParams { + nickName: string; + avatarFileName: string | null; + defaultRole: UserRolesType; + telephone: string | null; +}; diff --git a/src/api/models/index.ts b/src/api/models/index.ts new file mode 100644 index 0000000..c47b69f --- /dev/null +++ b/src/api/models/index.ts @@ -0,0 +1,16 @@ +export * from "./AccessToken"; +export * from "./AntiForgeryToken"; +export * from "./ApiResponseType"; +export * from "./ChangePassword"; +export * from "./District"; +export * from "./Enums"; +export * from "./PagedResult"; +export * from "./PagedSearchType"; +export * from "./Product"; +export * from "./Reply"; +export * from "./Request"; +export * from "./SignIn"; +export * from "./SignUp"; +export * from "./Upload"; +export * from "./User"; +export * from "./Category"; diff --git a/src/assets/signin-bg.jpeg b/src/assets/signin-bg.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c22f315d932c1f2a2453b2a8efbf9aed4811524b GIT binary patch literal 109831 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

t)m79x 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

4Sc)y3FW&47}KrT;fFaaALRkd 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 void; +} + +export function LoadMore(props: Props) { + const loader = useRef(null); + const { pageIndex, pageCount, loadMore } = props; + + useEffect(() => { + if (pageIndex >= pageCount) return; + const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) loadMore(); + }); + }, + { + root: null, + rootMargin: "0px", + threshold: 0.9, + }, + ); + + const currentLoader = loader.current; + + if (currentLoader) observer.observe(currentLoader); + + return () => { + if (currentLoader) observer.unobserve(currentLoader); + observer.disconnect(); + }; + }, [pageIndex, pageCount, loadMore]); + + function getFooter() { + if (props.pageCount == 0) { + return "没有更多数据了"; + } else { + return `${props.pageIndex >= props.pageCount ? "没有更多数据了" : "继续滚动加载更多"},当前页:${props.pageIndex},总页数:${props.pageCount}`; + } + } + return ( +

+ ); +} diff --git a/src/components/Nav/index.module.css b/src/components/Nav/index.module.css new file mode 100644 index 0000000..84de495 --- /dev/null +++ b/src/components/Nav/index.module.css @@ -0,0 +1,64 @@ +.menu { + height: 100vh; + display: flex; + flex-direction: column; + justify-content: flex-start; + + > li { + position: relative; + > a { + display: flex; + flex-direction: row; + font-size: 1.8em; + padding: 20px; + + > i { + flex: 1; + font-size: 1em; + text-align: right; + } + + > span { + flex: 1; + text-align: left; + padding-left: 10px; + } + + &.active { + font-style: italic; + color: var(--hover-color); + } + } + + &:last-child { + margin-top: auto; + } + + .settings { + border-top: 1px solid var(--border-color); + display: flex; + flex-direction: row; + justify-content: space-between; + padding: 0 20px; + + li { + flex: 1; + min-width: 0; + + a { + display: block; + text-align: left; + font-size: 1.2em; + padding: 10px 20px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + } + + &:last-of-type a { + text-align: right; + } + } + } + } +} diff --git a/src/components/Nav/index.tsx b/src/components/Nav/index.tsx new file mode 100644 index 0000000..9090857 --- /dev/null +++ b/src/components/Nav/index.tsx @@ -0,0 +1,77 @@ +import { useContext } from "react"; +import { Link, useLocation } from "react-router"; +import { AppContext } from "../../store/AppContexts"; +import styles from "./index.module.css"; + +export function Nav() { + const location = useLocation(); + const appContext = useContext(AppContext); + + return ( +
    +
  • + + + 需求大厅 + +
  • +
  • + + + 我的商品 + +
  • +
  • + + + 我的需求 + +
  • +
  • + + + 我的竞标 + +
  • +
  • + + + 消息 + +
  • +
  • +
      +
    • + +  设置 + +
    • +
    • + +   + {appContext.nickName || "登录"} + +
    • +
    +
  • +
+ ); +} diff --git a/src/components/TreeSelector/Props.ts b/src/components/TreeSelector/Props.ts new file mode 100644 index 0000000..5109ba2 --- /dev/null +++ b/src/components/TreeSelector/Props.ts @@ -0,0 +1,20 @@ +interface TreeItem { + id: number; + parentId: number; + name: string; + logoUrl: string | null; +} + +export type TreeItemWithUnknown = Omit; + +interface TreeActions { + onChecked: (item: Omit) => void; +} + +export type TreeItemWithChildren = TreeItemWithUnknown & { + children: Array; +}; + +export type TreeProps = { + items: Array; +} & TreeActions; diff --git a/src/components/TreeSelector/index.module.css b/src/components/TreeSelector/index.module.css new file mode 100644 index 0000000..f103b3d --- /dev/null +++ b/src/components/TreeSelector/index.module.css @@ -0,0 +1,89 @@ +.toggler { + border: none; + color: white; + background-color: rgba(21, 144, 251, 0.8); + padding: 5px 10px; + font-size: 1em; + + &:hover { + color: white; + background-color: rgba(19, 105, 210, 0.8); + } + i { + transition: transform 0.2s ease; + } + .show { + transform: rotate(-180deg); + } +} + +.content { + position: absolute; + width: 100%; + padding: 10px; + background-color: white; + box-shadow: 0 0 5px var(--border-color); + overflow-y: auto; + visibility: visible; + height: 100vh; + transition: all 0.1s ease-in-out; + + &.hidden { + height: 0; + visibility: hidden; + } + + .path { + padding: 5px 10px; + border-top: solid var(--border-color) 1px; + border-bottom: solid var(--border-color) 1px; + position: sticky; + top: 0; + z-index: 99; + background-color: white; + + ol { + list-style: none; + + li { + display: inline-block; + + a { + padding: 5px 10px; + font-size: 1em; + } + } + } + } + + .list { + ul { + display: flex; + flex-direction: column; + align-items: center; + + li { + width: 100%; + display: flex; + flex-direction: row; + align-items: center; + + a { + flex: 1; + text-align: center; + font-size: 2em; + + &.pager { + flex: 2; + font-size: 4em; + color: #aaa; + } + + &.pager:hover { + color: var(--hover-color); + } + } + } + } + } +} diff --git a/src/components/TreeSelector/index.tsx b/src/components/TreeSelector/index.tsx new file mode 100644 index 0000000..6f2b0b2 --- /dev/null +++ b/src/components/TreeSelector/index.tsx @@ -0,0 +1,147 @@ +import { useState, useRef, useLayoutEffect } from "react"; +import type { + TreeProps, + TreeItemWithChildren, + TreeItemWithUnknown, +} from "./Props"; +import styles from "./index.module.css"; + +export function TreeSelector(props: TreeProps) { + const contentRef = useRef(null); + const togglerRef = useRef(null); + + const defaultItem: TreeItemWithUnknown = { + id: 0, + logoUrl: "", + name: "全部分类", + parentId: 0, + }; + const [treePath, setTreePath] = useState>([ + defaultItem, + ]); + const [checkedItem, setCheckedItem] = + useState(defaultItem); + const [show, toggleShow] = useState(false); + const withoutChildren = props.items.map(({ children: _, ...rest }) => rest); + const [list, setList] = useState>(withoutChildren); + + useLayoutEffect(() => { + if (contentRef.current && togglerRef.current && show) { + const top = + togglerRef.current.offsetTop + togglerRef.current.clientHeight; + const left = contentRef.current.offsetLeft; + contentRef.current.style.position = "absolute"; + contentRef.current.style.top = `${top}px`; + contentRef.current.style.left = `$${left}px`; + } + }, [show]); + + function pathClick(item: TreeItemWithUnknown) { + if (treePath.indexOf(item) != treePath.length - 1) { + setTreePath((state) => state.slice(0, state.indexOf(item) + 1)); + setList(getChildren(item, props.items)); + } else if (item.id == 0) { + listClick(item); + } + } + + function listClick(item: TreeItemWithUnknown) { + setCheckedItem(item); + toggleShow(false); + props.onChecked(item); + } + + function prevClick(item: TreeItemWithUnknown) { + if (item.parentId == 0) return; + setTreePath((state) => state.slice(0, state.length - 1)); + setList(getSiblings(item.parentId, props.items)); + } + + function nextClick(item: TreeItemWithUnknown) { + if (treePath.indexOf(item) != treePath.length - 1) { + setTreePath((state) => [...state, item]); + const children = getChildren(item, props.items); + setList(children || []); + } + } + + function getSiblings( + id: number, + items: Array, + ): Array { + for (const i of items) { + if (i.id == id) return items; + if (i.children) { + const siblings = getSiblings(id, i.children); + if (siblings.length) return siblings; + } + } + return []; + } + + function getChildren( + item: TreeItemWithUnknown, + items: Array, + ): Array { + if (item.id == 0) return items; + for (const i of items) { + if (i.id == item.id) { + return i.children; + } + if (i.children) { + const children = getChildren(item, i.children); + if (children.length) return children; + } + } + return []; + } + + return ( + <> + + + + ); +} + +export { type TreeItemWithUnknown } from "./Props"; diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..46d61d4 --- /dev/null +++ b/src/index.css @@ -0,0 +1,84 @@ +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + --text-color: #224234; + --button-text-color: #fff; + --hover-color: #006ed5; + --primary-color: #005bb0; + --danger-color: #e50039; + --success-color: #00c951; + --success-hover-color: #04df72; + --border-color: #ccc; + --form-label-color: #aaa; +} + +* { + box-sizing: border-box; +} + +body { + margin: 0; + min-width: 320px; +} + +ul { + margin: 0; + padding: 0; + list-style: none; +} + +a, +a:visited { + color: var(--text-color); + text-decoration: none; + outline: none; +} + +a:hover { + color: var(--hover-color); + cursor: pointer; +} + +p { + margin: 0; +} + +button { + border: none; + color: var(--button-text-color); + background-color: var(--primary-color); + cursor: pointer; +} + +button:hover { + background-color: var(--hover-color); +} + +input, +textarea { + outline: none; + padding: 5px 10px; + color: var(--text-color); + border: solid var(--border-color) 1px; + box-shadow: inset 0 0 3px var(--border-color); +} + +input:hover, +textarea:hover { + box-shadow: 0 0 3px var(--border-color); +} + +input:disabled, +textarea:disabled { + cursor: not-allowed; +} + +img { + width: 100%; +} + +.ss { + display: inline-block; +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..cfd25bf --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,14 @@ +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import { RouterProvider } from "react-router"; +import { AppContextProvider } from "./store/AppContextProvider"; +import Router from "./routes"; +import "./index.css"; + +createRoot(document.body).render( + + + + + , +); diff --git a/src/pages/Error/index.tsx b/src/pages/Error/index.tsx new file mode 100644 index 0000000..9a42f0e --- /dev/null +++ b/src/pages/Error/index.tsx @@ -0,0 +1,44 @@ +import { + useRouteError, + type ErrorResponse, + isRouteErrorResponse, +} from "react-router"; + +export function ErrorPage() { + const error = useRouteError(); + + if (isRouteErrorResponse(error)) { + const statusError = error as ErrorResponse; + if (statusError.status == 404) { + return ( +
+

页面不存在

+
+ ); + } else { + return ( +
+

错误

+

状态码:{statusError.status}

+

消息:{statusError.statusText}

+

数据{JSON.stringify(statusError.data)}

+
+ ); + } + } else if (error instanceof Error) { + const err = error as Error; + return ( +
+

错误

+

名称:{err.name}

+

消息:{err.message}

+
+ ); + } else { + return ( +
+

未知错误

+
+ ); + } +} diff --git a/src/pages/Home/index.module.css b/src/pages/Home/index.module.css new file mode 100644 index 0000000..e025d1a --- /dev/null +++ b/src/pages/Home/index.module.css @@ -0,0 +1,220 @@ +.container { + display: flex; + flex-direction: column; + justify-content: center; + + .filter { + position: sticky; + top: 0; + z-index: 90; + display: flex; + flex-direction: column; + background-color: rgba(255, 255, 255, 0.6); + backdrop-filter: blur(5px); + + .search { + display: flex; + position: relative; + flex-direction: row; + font-size: 16px; + border-bottom: solid 1px var(--border-color); + + .keyword { + flex: 1; + + input { + line-height: 2em; + border: none; + border-right: solid 1px var(--border-color); + padding-right: 2em; + } + + a { + line-height: 2em; + margin-left: -1.5em; + color: var(--text-color); + } + } + } + + .sort { + display: flex; + flex-direction: row; + align-items: center; + padding: 5px 10px; + box-shadow: 0 3px 3px var(--border-color); + + li { + flex: 1; + a { + display: block; + + i { + transition: transform 0.1s ease; + &.desc { + transform: rotate(180deg); + } + } + } + } + } + } + + .content { + min-height: 50vh; + position: relative; + display: flex; + flex-direction: column; + + .card { + display: flex; + flex-direction: column; + background-color: white; + font-size: 16px; + margin-bottom: 10px; + + .head { + background-color: white; + box-shadow: 0 3px 3px var(--border-color); + display: flex; + flex-direction: row; + justify-content: space-between; + } + + .body { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + + .left { + display: flex; + flex-direction: column; + color: var(--form-label-color); + + .name { + font-weight: 600; + font-size: 1.2em; + color: var(--text-color); + } + + .desc { + color: var(--text-color); + } + } + + .right { + border-left: 1px solid var(--border-color); + padding: 0 10px; + display: flex; + flex-direction: column; + + .splitter { + height: 1px; + background-color: var(--border-color); + } + + a { + display: block; + + i { + font-size: 4em; + } + } + } + } + + p { + padding: 5px 10px; + } + } + } +} + +.aside { + .form { + display: flex; + flex-direction: column; + align-items: flex-start; + padding: 10px 20px; + + .form-group { + display: flex; + flex-direction: column; + align-items: flex-start; + padding: 5px 0; + + label { + font-size: 0.8em; + color: var(--form-label-color); + } + + .product-search { + display: flex; + flex-direction: column; + background-color: white; + box-shadow: 0 0 5px var(--border-color); + + li { + border-bottom: 1px solid var(--border-color); + padding: 5px 10px; + + .name { + font-size: 1em; + font-weight: 600; + } + + &:nth-last-of-type() { + border-bottom: none; + } + } + + &.hidden { + display: none; + } + } + } + + .btn-group { + display: flex; + flex-direction: row; + + button { + padding: 5px 10px; + font-size: 1em; + } + } + } + + .list { + display: flex; + flex-direction: column; + + .card { + display: flex; + flex-direction: column; + box-shadow: 0 5px 5px var(--border-color); + margin-bottom: 5px; + + .header { + background-color: white; + border-bottom: solid 1px var(--border-color); + display: flex; + flex-direction: row; + justify-content: space-between; + padding: 5px 10px; + } + .name { + font-weight: 600; + } + + .memo { + color: #666; + } + + > p { + padding: 5px 10px; + } + } + } +} diff --git a/src/pages/Home/index.tsx b/src/pages/Home/index.tsx new file mode 100644 index 0000000..53464d4 --- /dev/null +++ b/src/pages/Home/index.tsx @@ -0,0 +1,425 @@ +import { useEffect, useReducer, useCallback, useRef } from "react"; +import { createPortal } from "react-dom"; +import { useOutletContext } from "react-router"; +import { + TreeSelector, + type TreeItemWithUnknown, +} from "../../components/TreeSelector"; +import { LoadMore } from "../../components/LoadMore"; +import { orderByTypes } from "../../store/Types"; +import { + homeReducer, + initialState, + type ProductSearchType, +} from "../../store/home"; +import * as actions from "../../store/home/action"; +import { + getCategoryTree, + replyList, + requestSearch, + replyPost, + productSearch, +} from "../../api"; +import { + type Category, + ProductOrderBys, + type Request, + RequestOrderBys, + type RequestOrderBysType, +} from "../../api/models"; +import styles from "./index.module.css"; + +export function Component() { + const [states, dispatch] = useReducer(homeReducer, initialState); + const asideContainer = useOutletContext(); + const keywordRef = useRef(null); + + useEffect(() => { + async function getTree() { + try { + const resp = await getCategoryTree(); + if (resp.isSucced) { + dispatch(actions.setCategories(resp.data || [])); + } else { + throw Error(resp.message || ""); + } + } finally { + dispatch(actions.setLoading(false)); + } + } + + getTree(); + }, []); + + const search = useCallback(async () => { + try { + dispatch(actions.setIsSearch(true)); + + const orderBys: RequestOrderBysType[] = []; + if ( + !states.orderBys.categoryId || + states.orderBys.categoryId == orderByTypes.ASC + ) + orderBys.push(RequestOrderBys.CategoryId); + else orderBys.push(RequestOrderBys.CategoryIdDesc); + if ( + !states.orderBys.publishTime || + states.orderBys.publishTime == orderByTypes.ASC + ) + orderBys.push(RequestOrderBys.PublishTime); + else orderBys.push(RequestOrderBys.PublishTimeDesc); + if ( + !states.orderBys.replyAmount || + states.orderBys.replyAmount == orderByTypes.ASC + ) + orderBys.push(RequestOrderBys.ReplyAmount); + else orderBys.push(RequestOrderBys.ReplyAmountDesc); + + const result = await requestSearch({ + categoryId: states.categoryId, + keyword: states.keyword, + orderBys: orderBys, + pageIndex: states.pageIndex, + pageSize: states.pageSize, + }); + if (result.isSucced) { + dispatch( + actions.setSearchResult({ + pageCount: result.data?.pageCount || 0, + requests: result.data?.data || [], + }), + ); + } else { + alert(result.message || "服务器错误"); + } + } finally { + dispatch(actions.setIsSearch(false)); + } + }, [ + states.categoryId, + states.keyword, + states.orderBys, + states.pageIndex, + states.pageSize, + ]); + + useEffect(() => { + search(); + }, [search]); + + const searchProducts = useCallback(async () => { + const searchResult = await productSearch({ + categoryId: states.categoryId, + keyword: states.reply.productName || "", + orderBys: [ProductOrderBys.CreateTimeDesc], + pageIndex: 1, + pageSize: 10, + }); + if (searchResult.isSucced) { + dispatch( + actions.setSearchProducts( + searchResult.data?.data.map((p) => ({ + productId: p.id, + productName: p.name, + productDescription: p.description, + price: p.unitPrice, + })) || [], + ), + ); + } else { + throw Error(searchResult.message || "服务器错误"); + } + }, [states.categoryId, states.reply.productName]); + + useEffect(() => { + const t = setTimeout(() => { + dispatch(actions.setWillSearching(true)); + }, 500); + + return () => { + clearTimeout(t); + }; + }, [states.reply.productName]); + + useEffect(() => { + if (!states.willSearching) return; + + searchProducts(); + }, [states.willSearching, searchProducts]); + + async function onLoadMore() { + dispatch(actions.setPageIndex(states.pageIndex + 1)); + } + + function categoryChecked(item: TreeItemWithUnknown) { + const category = item as Category; + dispatch(actions.setCategoryId(category.id)); + } + + async function viewRepliersClick(requestId: number) { + try { + const replies = await replyList(requestId); + if (replies.isSucced) { + dispatch(actions.setReplies(replies.data)); + } else { + throw Error(replies.message || ""); + } + } catch (err) { + throw Error(err as string); + } + } + + function replyToClick(request: Request) { + dispatch( + actions.setReplyTo({ + categoryId: request.categoryId, + requestId: request.id, + }), + ); + } + + async function replyTo() { + try { + const reply = states.reply; + if (!reply.amount) { + alert("请输入数量"); + return; + } + if (!reply.productId) { + alert("请选择商品"); + return; + } + const replyResult = await replyPost({ + amount: reply.amount, + memo: reply.memo || null, + price: reply.price || 0, + productId: reply.productId, + requestId: reply.requestId || 0, + }); + if (replyResult.isSucced) { + alert("提交成功"); + dispatch(actions.setIsRepling(false)); + } else { + alert(replyResult.message); + } + } catch (err) { + throw Error(err as string); + } + } + + function selectProduct(product: ProductSearchType) { + dispatch( + actions.setReplyTo({ + productId: product.productId, + productName: product.productName, + price: product.price, + memo: states.reply.memo || product.productDescription || "", + }), + ); + } + + function searchClick() { + if (keywordRef.current) { + dispatch(actions.setKeyword(keywordRef.current.value)); + } + } + + return ( + <> +
+ +
+ {states.requests.map((req) => { + return ( +
+
+

发布时间:{req.publishTime}

+

序列号:{req.serialNo}

+
+
+
+

{req.name}

+

类别:{req.categoryName}

+

{req.description}

+

+ 竞标者:{req.replyAmount}人 +

+

截止日期:{req.deadline}

+

发布人:{req.publisher}

+
+ +
+
+ ); + })} + +
+
+ + {asideContainer && + createPortal( +
+ {states.isRepling ? ( +
+
+ + + dispatch( + actions.setReplyTo({ productName: e.target.value }), + ) + } + onFocus={() => dispatch(actions.setSearchFocused(true))} + onBlur={() => dispatch(actions.setSearchFocused(false))} + /> + +
+ +
+ + +
+ +
+ + + dispatch( + actions.setReplyTo({ amount: Number(e.target.value) }), + ) + } + /> +
+ +
+ + +
+
+ +
+
+
, + asideContainer, + )} + + ); +} diff --git a/src/pages/Reply/index.tsx b/src/pages/Reply/index.tsx new file mode 100644 index 0000000..b5afdfb --- /dev/null +++ b/src/pages/Reply/index.tsx @@ -0,0 +1,3 @@ +export function Component() { + return
开发中
; +} diff --git a/src/pages/Request/index.module.css b/src/pages/Request/index.module.css new file mode 100644 index 0000000..d9d1ae4 --- /dev/null +++ b/src/pages/Request/index.module.css @@ -0,0 +1,218 @@ +.container { + display: flex; + flex-direction: column; + justify-content: center; + + .filter { + position: sticky; + top: 0; + z-index: 90; + display: flex; + flex-direction: column; + background-color: rgba(255, 255, 255, 0.6); + backdrop-filter: blur(5px); + + .search { + display: flex; + position: relative; + flex-direction: row; + font-size: 16px; + border-bottom: solid 1px var(--border-color); + + .keyword { + flex: 1; + + input { + line-height: 2em; + border: none; + border-right: solid 1px var(--border-color); + padding-right: 2em; + } + + i { + line-height: 2em; + margin-left: -1.5em; + color: var(--text-color); + } + } + + .create { + margin-left: auto; + + button { + font-size: 1em; + padding: 5px 10px; + height: 100%; + background-color: var(--success-color); + + &:hover { + background-color: var(--success-hover-color); + } + } + } + } + + .status { + display: flex; + flex-direction: row; + border-bottom: solid 1px var(--border-color); + + li { + flex: 1; + + a { + display: block; + text-align: center; + &.active { + color: var(--hover-color); + } + } + } + } + + .sort { + display: flex; + flex-direction: row; + align-items: center; + padding: 5px 10px; + box-shadow: 0 3px 3px var(--border-color); + + li { + flex: 1; + a { + display: block; + + i { + transition: transform 0.1s ease; + &.desc { + transform: rotate(180deg); + } + } + } + } + } + } + + .content { + min-height: 50vh; + position: relative; + display: flex; + flex-direction: column; + + .card { + display: flex; + flex-direction: column; + background-color: white; + font-size: 16px; + margin-bottom: 10px; + + .head { + background-color: white; + box-shadow: 0 3px 3px var(--border-color); + display: flex; + flex-direction: row; + justify-content: space-between; + } + + .body { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + + .left { + display: flex; + flex-direction: column; + color: var(--form-label-color); + + .name { + font-weight: 600; + font-size: 1.2em; + color: var(--text-color); + } + + .desc { + color: var(--text-color); + } + } + + .right { + a { + display: block; + + i { + font-size: 5em; + } + } + } + } + + p { + padding: 5px 10px; + } + } + } +} + +.aside { + .form { + display: flex; + flex-direction: column; + align-items: flex-start; + padding: 10px 20px; + + .form-group { + display: flex; + flex-direction: column; + align-items: flex-start; + padding: 5px 0; + + label { + font-size: 0.8em; + color: var(--form-label-color); + } + } + + .btn-group { + display: flex; + flex-direction: row; + + button { + padding: 5px 10px; + font-size: 1em; + } + } + } + + .list { + display: flex; + flex-direction: column; + + .card { + display: flex; + flex-direction: column; + box-shadow: 0 5px 5px var(--border-color); + margin-bottom: 5px; + + .header { + background-color: white; + border-bottom: solid 1px var(--border-color); + display: flex; + flex-direction: row; + justify-content: space-between; + padding: 5px 10px; + } + .name { + font-weight: 600; + } + + .memo { + color: #666; + } + + > p { + padding: 5px 10px; + } + } + } +} diff --git a/src/pages/Request/index.tsx b/src/pages/Request/index.tsx new file mode 100644 index 0000000..2b71afa --- /dev/null +++ b/src/pages/Request/index.tsx @@ -0,0 +1,439 @@ +import { useEffect, useReducer, useCallback, useRef } from "react"; +import { createPortal } from "react-dom"; +import { Link, useOutletContext, useLocation } from "react-router"; +import { + TreeSelector, + type TreeItemWithUnknown, +} from "../../components/TreeSelector"; +import { LoadMore } from "../../components/LoadMore"; +import { orderByTypes } from "../../store/Types"; +import { requestReducer, initialState } from "../../store/request"; +import * as actions from "../../store/request/action"; +import { + getCategoryTree, + replyList, + requestOrders, + requestPublish, +} from "../../api"; +import { + type Category, + RequestOrderBys, + type RequestOrderBysType, + RequestStatus, + RequestStatusNames, + type RequestStatusNamesType, +} from "../../api/models"; +import styles from "./index.module.css"; + +export function Component() { + const [states, dispatch] = useReducer(requestReducer, initialState); + const asideContainer = useOutletContext(); + const keywordRef = useRef(null); + const location = useLocation(); + const statusMatchs = location.search.match(/status=(\w+)/); + let status: RequestStatusNamesType = RequestStatusNames.All; + if (statusMatchs && statusMatchs.length > 1) { + status = statusMatchs[1] as RequestStatusNamesType; + } + + useEffect(() => { + async function getTree() { + try { + const resp = await getCategoryTree(); + if (resp.isSucced) { + dispatch(actions.setCategories(resp.data || [])); + } else { + throw Error(resp.message || ""); + } + } finally { + dispatch(actions.setLoading(false)); + } + } + + getTree(); + }, []); + + const search = useCallback(async () => { + try { + dispatch(actions.setIsSearch(true)); + + const orderBys: RequestOrderBysType[] = []; + if ( + !states.orderBys.categoryId || + states.orderBys.categoryId == orderByTypes.ASC + ) + orderBys.push(RequestOrderBys.CategoryId); + else orderBys.push(RequestOrderBys.CategoryIdDesc); + if ( + !states.orderBys.publishTime || + states.orderBys.publishTime == orderByTypes.ASC + ) + orderBys.push(RequestOrderBys.PublishTime); + else orderBys.push(RequestOrderBys.PublishTimeDesc); + if ( + !states.orderBys.replyAmount || + states.orderBys.replyAmount == orderByTypes.ASC + ) + orderBys.push(RequestOrderBys.ReplyAmount); + else orderBys.push(RequestOrderBys.ReplyAmountDesc); + + const result = await requestOrders({ + categoryId: states.categoryId, + keyword: states.keyword, + orderBys: orderBys, + pageIndex: states.pageIndex, + pageSize: states.pageSize, + status: RequestStatus[status], + }); + if (result.isSucced) { + dispatch( + actions.setSearchResult({ + pageCount: result.data?.pageCount || 0, + requests: result.data?.data || [], + }), + ); + } else { + alert(result.message || "服务器错误"); + } + } finally { + dispatch(actions.setIsSearch(false)); + } + }, [ + states.categoryId, + states.keyword, + states.orderBys, + states.pageIndex, + states.pageSize, + status, + ]); + + useEffect(() => { + search(); + }, [search]); + + async function onLoadMore() { + dispatch(actions.setPageIndex(states.pageIndex + 1)); + } + + function categoryChecked(item: TreeItemWithUnknown) { + const category = item as Category; + dispatch(actions.setCategoryId(category.id)); + } + + async function viewRepliersClick(requestId: number) { + try { + const replies = await replyList(requestId); + if (replies.isSucced) { + dispatch(actions.setReplies(replies.data)); + } else { + throw Error(replies.message || ""); + } + } catch (err) { + throw Error(err as string); + } + } + + function create() { + if (states.categoryId <= 0) { + alert("请选择分类"); + return; + } + + dispatch(actions.setIsPublish(true)); + } + + async function publish() { + if (!states.requestPublish.deadline) { + alert("请选择截止日期"); + return; + } + if (!states.requestPublish.name) { + alert("请输入商品名"); + return; + } + try { + const result = await requestPublish({ + categoryId: states.categoryId, + deadline: states.requestPublish.deadline, + description: states.requestPublish.description || "", + name: states.requestPublish.name, + }); + if (result.isSucced) { + alert("发布成功"); + } else { + throw Error(result.message || "服务器错误"); + } + } catch (err) { + throw Error(err as string); + } + } + + function searchClick() { + if (keywordRef.current) { + dispatch(actions.setKeyword(keywordRef.current.value)); + } + } + + return ( + <> +
+
+
+ {!states.isLoading && ( + + )} +
+ dispatch(actions.setKeyword(e.target.value))} + onKeyDown={(e) => { + if (e.key == "Enter") searchClick(); + }} + /> + + + +
+
+ +
+
+
    +
  • + + 全部 + +
  • +
  • + + 已发布 + +
  • +
  • + + 有竞标 + +
  • +
  • + + 待发货 + +
  • +
  • + + 已发货 + +
  • +
  • + + 已完成 + +
  • +
  • + + 已评价 + +
  • +
+ +
+
+ {states.requests.map((req) => { + return ( +
+
+

发布时间:{req.publishTime}

+

序列号:{req.serialNo}

+
+
+
+

{req.name}

+

类别:{req.categoryName}

+

{req.description}

+

+ 竞标者:{req.replyAmount}人 +

+

截止日期:{req.deadline}

+
+ +
+
+ ); + })} + +
+
+ + {asideContainer && + createPortal( +
+ {states.isPublish ? ( +
+
+ + + dispatch( + actions.setRequestPublish({ name: e.target.value }), + ) + } + /> +
+
+ + + dispatch( + actions.setRequestPublish({ deadline: e.target.value }), + ) + } + /> +
+
+ +