diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..0552777 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ +# Editor configuration, see http://editorconfig.org + +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/.env b/.env new file mode 100644 index 0000000..9785bcc --- /dev/null +++ b/.env @@ -0,0 +1,60 @@ +# the base url of the application, the default is "/" +# if use a sub directory, it must be end with "/", like "/admin/" but not "/admin" +VITE_BASE_URL=/ + +VITE_APP_TITLE=SoybeanAdmin + +VITE_APP_DESC=SoybeanAdmin is a fresh and elegant admin template + +# the prefix of the icon name +VITE_ICON_PREFIX=icon + +# the prefix of the local svg icon component, must include VITE_ICON_PREFIX +# format {VITE_ICON_PREFIX}-{local icon name} +VITE_ICON_LOCAL_PREFIX=icon-local + +# auth route mode: static | dynamic +VITE_AUTH_ROUTE_MODE=dynamic + +# static auth route home +VITE_ROUTE_HOME=home + +# default menu icon +VITE_MENU_ICON=mdi:menu + +# whether to enable http proxy when is dev mode +VITE_HTTP_PROXY=Y + +# vue-router mode: hash | history | memory +VITE_ROUTER_HISTORY_MODE=history + +# success code of backend service, when the code is received, the request is successful +VITE_SERVICE_SUCCESS_CODE=0000 + +# logout codes of backend service, when the code is received, the user will be logged out and redirected to login page +VITE_SERVICE_LOGOUT_CODES=8888,8889 + +# modal logout codes of backend service, when the code is received, the user will be logged out by displaying a modal +VITE_SERVICE_MODAL_LOGOUT_CODES=7777,7778 + +# token expired codes of backend service, when the code is received, it will refresh the token and resend the request +VITE_SERVICE_EXPIRED_TOKEN_CODES=9999,9998,3333 + +# when the route mode is static, the defined super role +VITE_STATIC_SUPER_ROLE=R_SUPER + +# sourcemap +VITE_SOURCE_MAP=N + +# Used to differentiate storage across different domains +VITE_STORAGE_PREFIX=SOY_ + +# used to control whether the program automatically detects updates +VITE_AUTOMATICALLY_DETECT_UPDATE=Y + +# show proxy url log in terminal +VITE_PROXY_LOG=Y + +# used to control whether to launch editor +# by the way, this plugin is only available in dev mode, not in build mode +VITE_DEVTOOLS_LAUNCH_EDITOR=code diff --git a/.env.prod b/.env.prod new file mode 100644 index 0000000..9b4481c --- /dev/null +++ b/.env.prod @@ -0,0 +1,7 @@ +# backend service base url, prod environment +VITE_SERVICE_BASE_URL=http://localhost:8080 + +# other backend service base url, prod environment +VITE_OTHER_SERVICE_BASE_URL= `{ + "demo": "http://localhost:9529" +}` diff --git a/.env.test b/.env.test new file mode 100644 index 0000000..ee2b694 --- /dev/null +++ b/.env.test @@ -0,0 +1,7 @@ +# backend service base url, test environment +VITE_SERVICE_BASE_URL=http://localhost:8080 + +# other backend service base url, test environment +VITE_OTHER_SERVICE_BASE_URL= `{ + "demo": "http://localhost:9528" +}` diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..9553ccb --- /dev/null +++ b/.gitattributes @@ -0,0 +1,13 @@ +"*.vue" eol=lf +"*.js" eol=lf +"*.ts" eol=lf +"*.jsx" eol=lf +"*.tsx" eol=lf +"*.mjs" eol=lf +"*.json" eol=lf +"*.html" eol=lf +"*.css" eol=lf +"*.scss" eol=lf +"*.md" eol=lf +"*.yaml" eol=lf +"*.yml" eol=lf diff --git a/.github/ISSUE_TEMPLATE/bug-report_cn.yaml b/.github/ISSUE_TEMPLATE/bug-report_cn.yaml new file mode 100644 index 0000000..b1de7e6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report_cn.yaml @@ -0,0 +1,90 @@ +name: 🐞 Bug提交 +description: 在使用软件或功能的过程中遇到了错误 +title: '[Bug]: ' +labels: [ "bug?" ] + +body: + - type: markdown + attributes: + value: | + ## 请按照以下要求进行提交 + ### 1. 提交后需要指定标签和截止时间。 + --- + + - type: markdown + attributes: + value: | + ## 环境信息 + 请根据实际使用环境修改以下信息。 + + - type: input + id: env-program-ver + attributes: + label: 软件版本 + validations: + required: true + + - type: dropdown + id: env-vm-ver + attributes: + label: 运行环境 + description: 选择运行软件的系统版本 + options: + - Windows (64) + - Windows (32/x84) + - MacOS + - Linux + - Ubuntu + - CentOS + - ArchLinux + - UNIX (Android) + - 其它(请在下方说明) + validations: + required: true + + - type: dropdown + id: env-vm-arch + attributes: + label: 运行架构 + description: (可选) 选择运行软件的系统架构 + options: + - AMD64 + - x86 + - ARM [32] (别名:AArch32 / ARMv7) + - ARM [64] (别名:AArch64 / ARMv8) + - 其它 + + - type: textarea + id: reproduce-steps + attributes: + label: 重现步骤 + description: | + 我们需要执行哪些操作才能让 bug 出现? + 简洁清晰的重现步骤能够帮助我们更迅速地定位问题所在。 + validations: + required: true + + - type: textarea + id: expected + attributes: + label: 期望的结果是什么? + validations: + required: true + + - type: textarea + id: actual + attributes: + label: 实际的结果是什么? + validations: + required: true + + - type: textarea + id: logging + attributes: + label: 日志记录(可选) + render: golang + + - type: textarea + id: extra-desc + attributes: + label: 补充说明(可选) diff --git a/.github/ISSUE_TEMPLATE/bug-report_en.yaml b/.github/ISSUE_TEMPLATE/bug-report_en.yaml new file mode 100644 index 0000000..a3a2f12 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report_en.yaml @@ -0,0 +1,90 @@ +name: 🐞 Bug Report +description: Encountered an error while using the software or feature +title: '[Bug]: ' +labels: [ "bug?" ] + +body: + - type: markdown + attributes: + value: | + ## Please submit according to the following requirements + ### 1. After submission, you need to specify the label and deadline. + --- + + - type: markdown + attributes: + value: | + ## Environment Information + Please modify the following information according to the actual usage environment. + + - type: input + id: env-program-ver + attributes: + label: Software Version + validations: + required: true + + - type: dropdown + id: env-vm-ver + attributes: + label: Operating Environment + description: Select the system version on which the software is running + options: + - Windows (64) + - Windows (32/x84) + - MacOS + - Linux + - Ubuntu + - CentOS + - ArchLinux + - UNIX (Android) + - Other (please specify below) + validations: + required: true + + - type: dropdown + id: env-vm-arch + attributes: + label: Operating Architecture + description: (Optional) Select the system architecture on which the software is running + options: + - AMD64 + - x86 + - ARM [32] (Alias:AArch32 / ARMv7) + - ARM [64] (Alias:AArch64 / ARMv8) + - Other + + - type: textarea + id: reproduce-steps + attributes: + label: Reproduce Steps + description: | + What operations do we need to perform to make the bug appear? + The concise and clear reproduction steps can help us locate the problem more quickly. + validations: + required: true + + - type: textarea + id: expected + attributes: + label: What is the expected result? + validations: + required: true + + - type: textarea + id: actual + attributes: + label: What is the actual result? + validations: + required: true + + - type: textarea + id: logging + attributes: + label: Logging (Optional) + render: golang + + - type: textarea + id: extra-desc + attributes: + label: Additional Description (Optional) diff --git a/.github/ISSUE_TEMPLATE/feature_request_cn.yaml b/.github/ISSUE_TEMPLATE/feature_request_cn.yaml new file mode 100644 index 0000000..c98162f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request_cn.yaml @@ -0,0 +1,48 @@ +--- +name: 🚀 功能请求 +description: 提出一个想法以帮助我们改进W&B +title: "[功能]: " +labels: + - "功能请求" + +body: + - type: markdown + attributes: + value: | + **感谢 :heart: 您花时间填写此功能请求报告!** + 我们恳请您搜索看看您的功能是否[已经存在](https://github.com/soybeanjs/soybean-admin/issues?q=is%3Aissue+sort%3Acreated-desc+)。 + + 我们也很乐意接受用户的贡献。有关更多详细信息,请参阅[此处](https://github.com/soybeanjs/soybean-admin/blob/main/README.zh_CN.md#%E5%A6%82%E4%BD%95%E8%B4%A1%E7%8C%AE)。 + + - type: textarea + attributes: + label: 描述 + description: | + 对您感兴趣的功能的清晰简洁的描述。 + validations: + required: true + + - type: textarea + attributes: + label: 建议的解决方案 + description: | + 描述您想要的解决方案。对您希望发生的事情的清晰简洁的描述。 + validations: + required: true + + - type: textarea + attributes: + label: 替代方案 + description: | + 描述您考虑过的替代方案。 + 对您考虑过的任何替代解决方案或功能的清晰简洁的描述。 + validations: + required: false + + - type: textarea + attributes: + label: 额外的上下文 + description: | + 在此处添加有关问题的其他上下文。 + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/feature_request_en.yaml b/.github/ISSUE_TEMPLATE/feature_request_en.yaml new file mode 100644 index 0000000..07fc41c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request_en.yaml @@ -0,0 +1,48 @@ +--- +name: 🚀 Feature Request +description: Suggest an idea to help us improve W&B +title: "[Feature]: " +labels: + - "feature_request" + +body: + - type: markdown + attributes: + value: | + **Thanks :heart: for taking the time to fill out this feature request report!** + We kindly ask that you search to see if an issue [already exists](https://github.com/soybeanjs/soybean-admin/issues?q=is%3Aissue+sort%3Acreated-desc+) for your feature. + + We are also happy to accept contributions from our users. For more details see [here](https://github.com/soybeanjs/soybean-admin/blob/main/README.md#how-to-contribute). + + - type: textarea + attributes: + label: Description + description: | + A clear and concise description of the feature you're interested in. + validations: + required: true + + - type: textarea + attributes: + label: Suggested Solution + description: | + Describe the solution you'd like. A clear and concise description of what you want to happen. + validations: + required: true + + - type: textarea + attributes: + label: Alternatives + description: | + Describe alternatives you've considered. + A clear and concise description of any alternative solutions or features you've considered. + validations: + required: false + + - type: textarea + attributes: + label: Additional Context + description: | + Add any other context about the problem here. + validations: + required: false diff --git a/.github/PULL_REQUEST_TEMPLATE/pr_cn.md b/.github/PULL_REQUEST_TEMPLATE/pr_cn.md new file mode 100644 index 0000000..d3b86ad --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/pr_cn.md @@ -0,0 +1,50 @@ +首先,感谢你的贡献! 😄 + +新特性请提交至 feature 分支,其余可提交至 main 分支。在一个维护者审核通过后合并。请确保填写以下 pull request 的信息,谢谢!~ + +[[English Template / 英文模板](./pr_en.md)] + +### 这个变动的性质是 + +- [ ] 新特性提交 +- [ ] 日常 bug 修复 +- [ ] 站点、文档改进 +- [ ] 组件样式改进 +- [ ] TypeScript 定义更新 +- [ ] 重构 +- [ ] 代码风格优化 +- [ ] 分支合并 +- [ ] 其他改动(是关于什么的改动?) + +### 需求背景 + +> 1. 描述相关需求的来源。 +> 2. 要解决的问题。 +> 3. 相关的 issue 讨论链接。 + +### 实现方案和 API(非新功能可选) + +> 1. 基本的解决思路和其他可选方案。 +> 2. 列出最终的 API 实现和用法。 +> 3. 涉及 UI/交互变动需要有截图或 GIF。 + +### 对用户的影响和可能的风险(非新功能可选) + +> 1. 这个改动对用户端是否有影响?影响的方面有哪些? +> 2. 是否有可能隐含的 break change 和其他风险? + +### Changelog 描述(非新功能可选) + +> 1. 英文描述 +> 2. 中文描述(可选) + +### 请求合并前的自查清单 + +- [ ] 文档已补充或无须补充 +- [ ] 代码演示已提供或无须提供 +- [ ] TypeScript 定义已补充或无须补充 +- [ ] Changelog 已提供或无须提供 + +### 后续计划(非新功能可选) + +> 如果这个提交后面还有相关的其他提交和跟进信息,可以写在这里。 diff --git a/.github/PULL_REQUEST_TEMPLATE/pr_en.md b/.github/PULL_REQUEST_TEMPLATE/pr_en.md new file mode 100644 index 0000000..06560ca --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/pr_en.md @@ -0,0 +1,51 @@ +First of all, thank you for your contribution! 😄 + +New feature please send pull request to feature branch, and rest to main branch. Pull request will be merged after one of collaborators approve. Please makes sure that these form are filled before submitting your pull request, thank you! + +[[中文版模板 / Chinese template](./pr_cn.md)] + +### This is a ... + +- [ ] New feature +- [ ] Bug fix +- [ ] Site / document update +- [ ] Component style update +- [ ] TypeScript definition update +- [ ] Refactoring +- [ ] Code style optimization +- [ ] Branch merge +- [ ] Other (about what?) + +### What's the background? + +> 1. Describe the source of requirement. +> 2. Resolve what problem. +> 3. Related issue link. + +### API Realization (Optional if not new feature) + +> 1. Basic thought of solution and other optional proposal. +> 2. List final API realization and usage sample. +> 3. GIF or snapshot should be provided if includes UI/interactive modification. + +### What's the effect? (Optional if not new feature) + +> 1. Does this PR affect user? Which part will be affected? +> 2. What will say in changelog? +> 3. Does this PR contains potential break change or other risk? + +### Changelog description (Optional if not new feature) + +> 1. English description +> 2. Chinese description (optional) + +### Self Check before Merge + +- [ ] Doc is updated/provided or not needed +- [ ] Demo is updated/provided or not needed +- [ ] TypeScript definition is updated/provided or not needed +- [ ] Changelog is provided or not needed + +### Additional Plan? (Optional if not new feature) + +> If this PR related with other PR or following info. You can type here. diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml new file mode 100644 index 0000000..450ec86 --- /dev/null +++ b/.github/workflows/linter.yml @@ -0,0 +1,30 @@ +--- +name: Lint Code + +permissions: + contents: write + +on: + pull_request: + branches: [main] + +jobs: + lint: + name: Lint All Code + runs-on: ubuntu-latest + + steps: + - name: Checkout Code + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Lint Code Base + uses: github/super-linter@v4 + env: + VALIDATE_ALL_CODEBASE: false + DEFAULT_BRANCH: main + # To change branch master or main + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + FILTER_REGEX_EXCLUDE: (docs|.github) + VALIDATE_MARKDOWN: false diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..0bf7c92 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,25 @@ +name: Release + +permissions: + contents: write + +on: + push: + tags: + - "v*" + +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - uses: actions/setup-node@v3 + with: + node-version: 18.x + + - run: npx githublogen + env: + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fdd159a --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +!.vscode/settings.json +!.vscode/launch.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +package-lock.json +yarn.lock + +.VSCodeCounter diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..dfc2d68 --- /dev/null +++ b/.npmrc @@ -0,0 +1,4 @@ +registry=https://registry.npmmirror.com/ +shamefully-hoist=true +ignore-workspace-root-check=true +link-workspace-packages=true diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..83a3146 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,19 @@ +{ + "recommendations": [ + "afzalsayed96.icones", + "antfu.iconify", + "antfu.unocss", + "dbaeumer.vscode-eslint", + "editorconfig.editorconfig", + "lokalise.i18n-ally", + "mhutchie.git-graph", + "mikestead.dotenv", + "naumovs.color-highlight", + "pkief.material-icon-theme", + "sdras.vue-vscode-snippets", + "vue.volar", + "whtouche.vscode-js-console-utils", + "zhuangtongfa.material-theme", + "tu6ge.naive-ui-intelligence" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..e59c32b --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,22 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "chrome", + "request": "launch", + "name": "Vue Debugger", + "url": "http://localhost:9527", + "webRoot": "${workspaceFolder}" + }, + { + "type": "node", + "request": "launch", + "name": "TS Debugger", + "runtimeExecutable": "tsx", + "skipFiles": ["/**", "${workspaceFolder}/node_modules/**"], + "program": "${file}", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..ee081a6 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,31 @@ +{ + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + "source.organizeImports": "never" + }, + "editor.formatOnSave": false, + "eslint.validate": [ + "html", + "css", + "scss", + "json", + "jsonc", + "javascript", + "javascriptreact", + "typescript", + "typescriptreact", + "vue" + ], + "i18n-ally.displayLanguage": "zh-cn", + "i18n-ally.enabledParsers": ["ts"], + "i18n-ally.enabledFrameworks": ["vue"], + "i18n-ally.editor.preferEditor": true, + "i18n-ally.keystyle": "nested", + "i18n-ally.localesPaths": ["src/locales/langs"], + "i18n-ally.parsers.typescript.compilerOptions": { + "moduleResolution": "node" + }, + "prettier.enable": false, + "typescript.tsdk": "node_modules/typescript/lib", + "unocss.root": ["./"] +} diff --git a/BACKEND_SETUP.md b/BACKEND_SETUP.md new file mode 100644 index 0000000..9ac64ba --- /dev/null +++ b/BACKEND_SETUP.md @@ -0,0 +1,258 @@ +# Spring Boot 后端配置指南 + +## 已完成的工作 + +我已经为你创建了一个完整的 Spring Boot 后端项目,包含以下功能: + +### ✅ 实现的接口 + +1. **认证接口** + - `POST /auth/login` - 用户登录 + - `GET /auth/getUserInfo` - 获取用户信息 + - `POST /auth/refreshToken` - 刷新令牌 + - `GET /auth/error` - 自定义错误 + +2. **路由接口** + - `GET /route/getConstantRoutes` - 获取常量路由 + - `GET /route/getUserRoutes` - 获取用户路由 + - `GET /route/isRouteExist` - 检查路由是否存在 + +### 📁 项目结构 + +``` +backend/ +├── pom.xml # Maven 配置 +├── src/main/ +│ ├── java/com/soybean/admin/ +│ │ ├── SoybeanAdminApplication.java # 启动类 +│ │ ├── common/ +│ │ │ └── Result.java # 统一响应格式 +│ │ ├── config/ +│ │ │ ├── WebConfig.java # Web 配置(CORS) +│ │ │ └── InterceptorConfig.java # 拦截器配置 +│ │ ├── controller/ +│ │ │ ├── AuthController.java # 认证控制器 +│ │ │ └── RouteController.java # 路由控制器 +│ │ ├── dto/ # 数据传输对象 +│ │ ├── entity/ +│ │ │ ├── User.java # 用户实体 +│ │ │ └── Route.java # 路由实体 +│ │ ├── exception/ +│ │ │ └── GlobalExceptionHandler.java # 全局异常处理 +│ │ ├── interceptor/ +│ │ │ └── AuthInterceptor.java # JWT 认证拦截器 +│ │ ├── mapper/ +│ │ │ ├── UserMapper.java # 用户 Mapper +│ │ │ └── RouteMapper.java # 路由 Mapper +│ │ ├── service/ +│ │ │ ├── AuthService.java # 认证服务 +│ │ │ └── RouteService.java # 路由服务 +│ │ └── util/ +│ │ └── JwtUtil.java # JWT 工具类 +│ └── resources/ +│ ├── application.yml # 应用配置 +│ └── sql/ +│ └── init.sql # 数据库初始化脚本 +├── start.bat # Windows 启动脚本 +└── README.md # 项目说明文档 +``` + +## 🚀 启动步骤 + +### 1. 初始化数据库 + +```bash +# 方式一:使用 MySQL 命令行 +mysql -u root -p < backend/src/main/resources/sql/init.sql + +# 方式二:登录 MySQL 后执行 +mysql -u root -p +source backend/src/main/resources/sql/init.sql +``` + +这将创建: +- 数据库:`soybean_admin` +- 表:`sys_user`(用户表)、`sys_route`(路由表) +- 默认用户: + - 管理员:admin / admin123 + - 普通用户:user / user123 + +### 2. 启动后端服务 + +```bash +# 进入后端目录 +cd backend + +# 方式一:使用 Maven 启动 +mvn spring-boot:run + +# 方式二:Windows 双击启动脚本 +start.bat + +# 方式三:编译后运行 +mvn clean package +java -jar target/soybean-admin-backend-1.0.0.jar +``` + +服务将在 `http://localhost:8080` 启动。 + +### 3. 配置前端连接后端 + +修改前端项目的环境配置文件: + +**`.env.test`** (开发环境) +```env +# 将 Mock 地址改为本地后端地址 +VITE_SERVICE_BASE_URL=http://localhost:8080 +``` + +**`.env.prod`** (生产环境) +```env +# 生产环境后端地址 +VITE_SERVICE_BASE_URL=http://localhost:8080 +``` + +### 4. 启动前端项目 + +```bash +# 安装依赖(如果还没安装) +pnpm install + +# 启动开发服务器 +pnpm dev +``` + +## 🧪 测试接口 + +### 使用 curl 测试登录 + +```bash +curl -X POST http://localhost:8080/auth/login \ + -H "Content-Type: application/json" \ + -d "{\"userName\":\"admin\",\"password\":\"admin123\"}" +``` + +预期响应: +```json +{ + "code": "0000", + "msg": "success", + "data": { + "token": "eyJhbGc...", + "refreshToken": "eyJhbGc..." + } +} +``` + +### 使用 token 获取用户信息 + +```bash +curl -X GET http://localhost:8080/auth/getUserInfo \ + -H "Authorization: Bearer YOUR_TOKEN_HERE" +``` + +## 📊 数据库表结构 + +### sys_user (用户表) +| 字段 | 类型 | 说明 | +|------|------|------| +| id | BIGINT | 主键 | +| user_id | VARCHAR(50) | 用户ID | +| user_name | VARCHAR(50) | 用户名 | +| password | VARCHAR(100) | 密码 | +| roles | VARCHAR(200) | 角色(逗号分隔) | +| buttons | VARCHAR(500) | 按钮权限(逗号分隔) | +| status | INT | 状态:1-启用,2-禁用 | +| deleted | INT | 删除标记 | +| create_time | DATETIME | 创建时间 | +| update_time | DATETIME | 更新时间 | + +### sys_route (路由表) +| 字段 | 类型 | 说明 | +|------|------|------| +| id | BIGINT | 主键 | +| route_id | VARCHAR(50) | 路由ID | +| name | VARCHAR(50) | 路由名称 | +| path | VARCHAR(200) | 路由路径 | +| component | VARCHAR(200) | 组件路径 | +| meta | TEXT | 元信息(JSON) | +| roles | VARCHAR(200) | 可访问角色 | +| order_num | INT | 排序号 | +| status | INT | 状态 | +| deleted | INT | 删除标记 | +| create_time | DATETIME | 创建时间 | +| update_time | DATETIME | 更新时间 | + +## 🔐 默认账号 + +| 用户名 | 密码 | 角色 | 权限 | +|--------|------|------|------| +| admin | admin123 | R_SUPER, R_ADMIN | 所有权限 | +| user | user123 | R_USER | 查看权限 | + +## ⚙️ 配置说明 + +### JWT 配置 +在 `application.yml` 中: +```yaml +jwt: + secret: soybean-admin-secret-key-2024-spring-boot-jwt-token + expiration: 7200000 # 2小时 + refresh-expiration: 604800000 # 7天 +``` + +### 数据库配置 +```yaml +spring: + datasource: + url: jdbc:mysql://localhost:3306/soybean_admin + username: root + password: root +``` + +## 🎯 下一步 + +1. **添加新菜单**:在数据库 `sys_route` 表中插入新路由 +2. **添加新用户**:在数据库 `sys_user` 表中插入新用户 +3. **权限控制**:通过 `roles` 字段控制路由访问权限 +4. **密码加密**:建议在生产环境使用 BCrypt 加密密码 + +## ❗ 注意事项 + +1. **生产环境**: + - 修改 JWT 密钥 + - 使用密码加密(BCrypt) + - 配置 HTTPS + - 添加日志文件输出 + - 配置数据库连接池 + +2. **开发环境**: + - 确保 MySQL 服务已启动 + - 确保端口 8080 未被占用 + - 检查 Java 版本(需要 JDK 17+) + +## 🐛 常见问题 + +### 1. 端口被占用 +修改 `application.yml` 中的端口: +```yaml +server: + port: 8081 +``` + +### 2. 数据库连接失败 +检查 MySQL 服务是否启动,用户名密码是否正确。 + +### 3. Maven 依赖下载慢 +配置国内镜像源(阿里云)。 + +## 📞 技术支持 + +如有问题,请查看: +- `backend/README.md` - 详细文档 +- 日志输出 - 查看错误信息 +- MySQL 日志 - 检查数据库问题 + +--- + +现在你可以开始使用完整的前后端分离系统了!🎉 diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..2355444 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,3317 @@ +# Changelog + + +## [v2.0.2](https://github.com/soybeanjs/soybean-admin/compare/v2.0.1...v2.0.2) (2025-12-23) + +###    🐞 Bug Fixes + +- **hooks**: update pagination pageSize after data fetch.  -  by **Azir-11** [(64226)](https://github.com/soybeanjs/soybean-admin/commit/64226d9b) +- **projects**: fix the incorrect judgment of home by pin tab.  -  by **Azir-11** [(62a43)](https://github.com/soybeanjs/soybean-admin/commit/62a43c39) + +###    🏡 Chore + +- **deps**: update deps  -  by @soybeanjs [(ec9f9)](https://github.com/soybeanjs/soybean-admin/commit/ec9f9af9) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)   +[Azir-11](mailto:2075125282@qq.com) + +## [v2.0.1](https://github.com/soybeanjs/soybean-admin/compare/v2.0.0...v2.0.1) (2025-12-04) + +###    🚀 Features + +- **docs**: + - update QQ group image in README  -  by @soybeanjs [(46081)](https://github.com/soybeanjs/soybean-admin/commit/46081c36) +- **projects**: + - support theme presets to only set partial content.  -  by **Azir-11** [(9da84)](https://github.com/soybeanjs/soybean-admin/commit/9da847fb) + - support theme perset to override component library presets.  -  by **Azir-11** [(60517)](https://github.com/soybeanjs/soybean-admin/commit/605173a1) + - support pinning and unpinning of tabs  -  by **hooke** [(b8a76)](https://github.com/soybeanjs/soybean-admin/commit/b8a767d7) + - hybrid layout mode auto select first deepest child menu  -  by @paynezhuang [(94019)](https://github.com/soybeanjs/soybean-admin/commit/9401925f) + +###    🐞 Bug Fixes + +- **docs**: update project name in ecosystem section of README  -  by @soybeanjs [(bb232)](https://github.com/soybeanjs/soybean-admin/commit/bb232bf8) +- **types**: add missing property in theme presets  -  by **刘璐** [(4a9cf)](https://github.com/soybeanjs/soybean-admin/commit/4a9cf6c3) + +###    🛠 Optimizations + +- **projects**: simplify some theme preset configurations.  -  by **Azir-11** [(c6d97)](https://github.com/soybeanjs/soybean-admin/commit/c6d97dba) + +###    📖 Documentation + +- **projects**: add link to ecosystem document.  -  by **Azir-11** [(c472a)](https://github.com/soybeanjs/soybean-admin/commit/c472a943) + +###    🏡 Chore + +- **deps**: + - update deps  -  by @soybeanjs [(f8dc6)](https://github.com/soybeanjs/soybean-admin/commit/f8dc639e) + - update deps  -  by @soybeanjs [(7cf40)](https://github.com/soybeanjs/soybean-admin/commit/7cf4083b) +- **other**: + - remove Prettier's recommendation.  -  by **Azir-11** [(73e9a)](https://github.com/soybeanjs/soybean-admin/commit/73e9a0fe) +- **styles**: + - format code  -  by @soybeanjs [(098cd)](https://github.com/soybeanjs/soybean-admin/commit/098cd50e) + +###    🎨 Styles + +- **projects**: modify homepage prompt title to tip.  -  by **Azir-11** [(91a26)](https://github.com/soybeanjs/soybean-admin/commit/91a261c1) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![paynezhuang](https://github.com/paynezhuang.png?size=48)](https://github.com/paynezhuang)   +[hooke](mailto:hellohooke@foxmail.com), [Azir-11](mailto:2075125282@qq.com), [刘璐](mailto:hi.alue@qq.com) + +## [v2.0.0](https://github.com/soybeanjs/soybean-admin/compare/v1.3.15...v2.0.0) (2025-11-02) + +###    🚨 Breaking Changes + +- **hooks**: refactor useTable and enhance type definitions  -  by @soybeanjs [(8cc51)](https://github.com/soybeanjs/soybean-admin/commit/8cc5177c) +- **projects**: optimize layout mode, split horizontal mix component into two layouts, and rename the component.  -  by **Azir** [(b6ac3)](https://github.com/soybeanjs/soybean-admin/commit/b6ac3106) +- **request**: remove cancelRequest method and related logic from request instances  -  by @soybeanjs [(b4e12)](https://github.com/soybeanjs/soybean-admin/commit/b4e12530) + +###    🚀 Features + +- **components**: + - add the IconTooltip component.  -  by **Azir-11** [(a55b4)](https://github.com/soybeanjs/soybean-admin/commit/a55b4dc0) + - replace NTooltip with IconTooltip and optimize the layout of related components.  -  by **Azir-11** [(40057)](https://github.com/soybeanjs/soybean-admin/commit/4005763c) +- **global-tab**: + - add support for switching tabs with right mouse button click  -  by @soybeanjs [(b2c91)](https://github.com/soybeanjs/soybean-admin/commit/b2c919b6) +- **hooks**: + - add scrollX computation for total table width in useNaiveTable  -  by @Lruihao [(358e1)](https://github.com/soybeanjs/soybean-admin/commit/358e1297) +- **packages**: + - materials support slider-tab. closed #823  -  by @CyberShen in https://github.com/soybeanjs/soybean-admin/issues/823 [(61fa4)](https://github.com/soybeanjs/soybean-admin/commit/61fa4b7f) +- **projects**: + - refactor theme drawer with tabbed layout for better UX.  -  by **Azir** [(8ba71)](https://github.com/soybeanjs/soybean-admin/commit/8ba71a08) + - Add current time display option for watermark  -  by @wenyuanw in https://github.com/soybeanjs/soybean-admin/issues/772 [(f238f)](https://github.com/soybeanjs/soybean-admin/commit/f238fcbd) + - add 'vertical-hybrid-header-first' layout mode  -  by @wenyuanw [(b4e5c)](https://github.com/soybeanjs/soybean-admin/commit/b4e5c6d9) + - add prompt information for scrolling mode and tab bar caching.  -  by **Azir-11** [(29a2a)](https://github.com/soybeanjs/soybean-admin/commit/29a2a5c6) + - support theme preset function.  -  by **Azir-11** [(257f1)](https://github.com/soybeanjs/soybean-admin/commit/257f1183) + - modify the default value of the reset cache policy to 'refresh'.  -  by **Azir-11** [(3c0a5)](https://github.com/soybeanjs/soybean-admin/commit/3c0a5282) + - optimize tabs cache cleaning strategy. close #820.  -  by **Azir-11** in https://github.com/soybeanjs/soybean-admin/issues/820 [(ef7ac)](https://github.com/soybeanjs/soybean-admin/commit/ef7acc62) + - support closing tabs with middle mouse button click  -  by @wenyuanw [(a8d1e)](https://github.com/soybeanjs/soybean-admin/commit/a8d1e5d2) + - support set global redius  -  by **CyberShen123** [(24c6d)](https://github.com/soybeanjs/soybean-admin/commit/24c6df52) + - support set global redius  -  by **CyberShen123** [(3549c)](https://github.com/soybeanjs/soybean-admin/commit/3549c4db) + - compatible with the new Echarts API and optimized styles.  -  by **Azir-11** [(9755c)](https://github.com/soybeanjs/soybean-admin/commit/9755c313) +- **styles**: + - add text-autospace property to improve text layout  -  by @wenyuanw [(345aa)](https://github.com/soybeanjs/soybean-admin/commit/345aa293) + +###    🐞 Bug Fixes + +- **hooks**: + - correct chart rendering logic in useEcharts  -  by @soybeanjs [(8a7cd)](https://github.com/soybeanjs/soybean-admin/commit/8a7cd593) +- **layout**: + - fix getSiderWidth  -  by @soybeanjs [(e471e)](https://github.com/soybeanjs/soybean-admin/commit/e471e914) +- **packages**: + - fix the parsing logic for stored data to ensure correct return of boolean values  -  by @Lruihao [(9ea56)](https://github.com/soybeanjs/soybean-admin/commit/9ea56c9b) + - axios: fix json response. fixed #815  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/815 [(fd087)](https://github.com/soybeanjs/soybean-admin/commit/fd087f59) + - axios: fix json response. fixed #815  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/815 [(5be86)](https://github.com/soybeanjs/soybean-admin/commit/5be864a8) +- **projects**: + - Fix i18n-ally not working when setting moduleResolution to bundler. fixed #780  -  by @xiaobao0505 in https://github.com/soybeanjs/soybean-admin/issues/780 [(41191)](https://github.com/soybeanjs/soybean-admin/commit/41191d54) + - adjust legend position in line chart options.  -  by **Azir-11** [(0b998)](https://github.com/soybeanjs/soybean-admin/commit/0b9982bd) +- **readme**: + - update GitHub stars and forks links for gitee  -  by @soybeanjs [(923eb)](https://github.com/soybeanjs/soybean-admin/commit/923eb98a) +- **scripts**: + - update command to use 'npm-check-updates' instead of 'ncu'  -  by @soybeanjs [(8dc17)](https://github.com/soybeanjs/soybean-admin/commit/8dc17e62) +- **styles**: + - show light color scrollbar while dark mode is on  -  by **whyang** [(dac50)](https://github.com/soybeanjs/soybean-admin/commit/dac5075b) +- **table**: + - add type annotations for records in useTable hook  -  by @soybeanjs [(32b8f)](https://github.com/soybeanjs/soybean-admin/commit/32b8f990) +- **types**: + - fix proxy types  -  by @soybeanjs [(3d72f)](https://github.com/soybeanjs/soybean-admin/commit/3d72f954) + - fix proxy types  -  by @soybeanjs [(12b25)](https://github.com/soybeanjs/soybean-admin/commit/12b25e0d) + - fix ts type error  -  by @soybeanjs [(d5a3a)](https://github.com/soybeanjs/soybean-admin/commit/d5a3a25d) + +###    🛠 Optimizations + +- **hooks**: + - optimize useEcharts  -  by @soybeanjs [(936b8)](https://github.com/soybeanjs/soybean-admin/commit/936b834e) +- **packages**: + - remove ofetch package  -  by @soybeanjs [(abaaa)](https://github.com/soybeanjs/soybean-admin/commit/abaaa4a0) +- **projects**: + - improve theme drawer responsive width for mobile devices  -  by @wenyuanw [(8439a)](https://github.com/soybeanjs/soybean-admin/commit/8439a600) + - improve robustness of second-level menu key logic  -  by @wenyuanw [(8b8a2)](https://github.com/soybeanjs/soybean-admin/commit/8b8a2083) + - optimize theme drawer width  -  by @soybeanjs [(81468)](https://github.com/soybeanjs/soybean-admin/commit/8146858b) + - optimize api type file  -  by @soybeanjs [(3a343)](https://github.com/soybeanjs/soybean-admin/commit/3a343eea) + - optimize radius settings  -  by @soybeanjs [(87a66)](https://github.com/soybeanjs/soybean-admin/commit/87a66a42) +- **request**: + - enhance request options and response handling with generic types  -  by @soybeanjs [(50a5c)](https://github.com/soybeanjs/soybean-admin/commit/50a5cba0) +- **typings**: + - update component typings  -  by @soybeanjs [(1d142)](https://github.com/soybeanjs/soybean-admin/commit/1d142695) + +###    💅 Refactors + +- **hooks**: + - optimize useContext and update useMixMenuContext  -  by @soybeanjs [(c9651)](https://github.com/soybeanjs/soybean-admin/commit/c965140b) + - streamline column visibility handling in useTable and table components  -  by @soybeanjs [(ee434)](https://github.com/soybeanjs/soybean-admin/commit/ee434145) + - remove useSignal hook and update exports  -  by @soybeanjs [(87adc)](https://github.com/soybeanjs/soybean-admin/commit/87adc35f) +- **menu**: + - optimize the margin on the menu  -  by **NicholasLD** [(d7311)](https://github.com/soybeanjs/soybean-admin/commit/d7311111) +- **projects**: + - remove unnecessary logic in onRouteSwitchWhenLoggedIn  -  by @wenyuanw [(d6c81)](https://github.com/soybeanjs/soybean-admin/commit/d6c8142b) +- **request**: + - unify response transformation methods and deprecate transformBackendResponse  -  by @soybeanjs [(f83ee)](https://github.com/soybeanjs/soybean-admin/commit/f83eefbc) +- **types**: + - move Auth and Route namespaces to separate files and clean up api.d.ts  -  by **Azir** [(d37ce)](https://github.com/soybeanjs/soybean-admin/commit/d37ce046) + +###    📖 Documentation + +- **projects**: + - add github trendshift info.  -  by **恕瑞玛的皇帝** [(e18d3)](https://github.com/soybeanjs/soybean-admin/commit/e18d3972) + - add github trendshift info.  -  by **恕瑞玛的皇帝** [(2a0c9)](https://github.com/soybeanjs/soybean-admin/commit/2a0c9f1b) + - add contribution leaderboard  -  by @wenyuanw [(01744)](https://github.com/soybeanjs/soybean-admin/commit/017440c1) + +###    🏡 Chore + +- **deps**: + - update NodeJS and pnpm version requirements in package.json and documentation  -  by **Junior25306** [(a5c4b)](https://github.com/soybeanjs/soybean-admin/commit/a5c4b4e3) + - update deps  -  by @soybeanjs [(5cb1c)](https://github.com/soybeanjs/soybean-admin/commit/5cb1cebd) + - update deps  -  by @soybeanjs [(aeb63)](https://github.com/soybeanjs/soybean-admin/commit/aeb63690) + - update deps  -  by @soybeanjs [(e89b8)](https://github.com/soybeanjs/soybean-admin/commit/e89b86ce) + - update deps  -  by @soybeanjs [(c962f)](https://github.com/soybeanjs/soybean-admin/commit/c962f7b2) + - update deps  -  by @soybeanjs [(12135)](https://github.com/soybeanjs/soybean-admin/commit/1213531b) + - update deps  -  by @soybeanjs [(e33f9)](https://github.com/soybeanjs/soybean-admin/commit/e33f944a) + - update deps  -  by @soybeanjs [(9fa95)](https://github.com/soybeanjs/soybean-admin/commit/9fa951aa) + - update deps  -  by @soybeanjs [(b041f)](https://github.com/soybeanjs/soybean-admin/commit/b041fdd8) + - update deps  -  by @soybeanjs [(d567c)](https://github.com/soybeanjs/soybean-admin/commit/d567c057) + - update deps  -  by @soybeanjs [(6cbf5)](https://github.com/soybeanjs/soybean-admin/commit/6cbf5705) + - update deps  -  by @soybeanjs [(6010f)](https://github.com/soybeanjs/soybean-admin/commit/6010f518) + - update deps  -  by @soybeanjs [(232f5)](https://github.com/soybeanjs/soybean-admin/commit/232f56fd) +- **other**: + - update the ESLint validation configuration to support more file types.  -  by **Azir-11** [(8d7f9)](https://github.com/soybeanjs/soybean-admin/commit/8d7f91dc) + - update the ESLint validation configuration to support more file types.  -  by **Azir-11** [(be8f9)](https://github.com/soybeanjs/soybean-admin/commit/be8f915a) +- **packages**: + - update Vite version to 7 in package.json and documentation.  -  by **Azir** [(03dd6)](https://github.com/soybeanjs/soybean-admin/commit/03dd64c5) + - add picomatch to fix scripts  -  by @soybeanjs [(805c3)](https://github.com/soybeanjs/soybean-admin/commit/805c3381) +- **readme**: + - remove DartNode sponsorship badge from README files  -  by @soybeanjs [(33ade)](https://github.com/soybeanjs/soybean-admin/commit/33ade539) +- **vscode**: + - remove unused vue.server.hybridMode setting from .vscode/settings.json  -  by @soybeanjs [(13319)](https://github.com/soybeanjs/soybean-admin/commit/133196f3) + +###    🎨 Styles + +- **projects**: format code.  -  by **Azir-11** [(100e0)](https://github.com/soybeanjs/soybean-admin/commit/100e0ea5) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![wenyuanw](https://github.com/wenyuanw.png?size=48)](https://github.com/wenyuanw)  [![CyberShen](https://github.com/CyberShen.png?size=48)](https://github.com/CyberShen)  [![Lruihao](https://github.com/Lruihao.png?size=48)](https://github.com/Lruihao)  [![xiaobao0505](https://github.com/xiaobao0505.png?size=48)](https://github.com/xiaobao0505)   +[Azir-11](mailto:2075125282@qq.com), [CyberShen123](mailto:s.lijun@qq.com), [whyang](mailto:whyang9701@gmail.com), [HongxuanG](mailto:1359774872@qq.com), [NicholasLD](mailto:878639947@qq.com), [Junior25306](mailto:dayu429@qq.com) + +## [v2.0.0-beta.2](https://github.com/soybeanjs/soybean-admin/compare/v2.0.0-beta.1...v2.0.0-beta.2) (2025-10-27) + +###    🚀 Features + +- **global-tab**: add support for switching tabs with right mouse button click  -  by @soybeanjs [(b2c91)](https://github.com/soybeanjs/soybean-admin/commit/b2c919b6) + +###    🐞 Bug Fixes + +- **layout**: fix getSiderWidth  -  by @soybeanjs [(e471e)](https://github.com/soybeanjs/soybean-admin/commit/e471e914) +- **packages**: axios: fix json response. fixed #815  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/815 [(fd087)](https://github.com/soybeanjs/soybean-admin/commit/fd087f59) +- **readme**: update GitHub stars and forks links for gitee  -  by @soybeanjs [(923eb)](https://github.com/soybeanjs/soybean-admin/commit/923eb98a) +- **scripts**: update command to use 'npm-check-updates' instead of 'ncu'  -  by @soybeanjs [(8dc17)](https://github.com/soybeanjs/soybean-admin/commit/8dc17e62) +- **types**: fix proxy types  -  by @soybeanjs [(12b25)](https://github.com/soybeanjs/soybean-admin/commit/12b25e0d) + +###    📖 Documentation + +- **projects**: + - add github trendshift info.  -  by **恕瑞玛的皇帝** [(e18d3)](https://github.com/soybeanjs/soybean-admin/commit/e18d3972) + - add contribution leaderboard  -  by @wenyuanw [(01744)](https://github.com/soybeanjs/soybean-admin/commit/017440c1) + +###    🏡 Chore + +- **deps**: + - update deps  -  by @soybeanjs [(e33f9)](https://github.com/soybeanjs/soybean-admin/commit/e33f944a) + - update deps  -  by @soybeanjs [(9fa95)](https://github.com/soybeanjs/soybean-admin/commit/9fa951aa) +- **other**: + - update the ESLint validation configuration to support more file types.  -  by **Azir-11** [(8d7f9)](https://github.com/soybeanjs/soybean-admin/commit/8d7f91dc) +- **readme**: + - remove DartNode sponsorship badge from README files  -  by @soybeanjs [(33ade)](https://github.com/soybeanjs/soybean-admin/commit/33ade539) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![wenyuanw](https://github.com/wenyuanw.png?size=48)](https://github.com/wenyuanw)   +[恕瑞玛的皇帝](mailto:2075125282@qq.com) + +## [v2.0.0-beta.1](https://github.com/soybeanjs/soybean-admin/compare/v1.3.15...v2.0.0-beta.1) (2025-10-25) + +###    🚨 Breaking Changes + +- **hooks**: refactor useTable and enhance type definitions  -  by @soybeanjs [(8cc51)](https://github.com/soybeanjs/soybean-admin/commit/8cc5177) +- **projects**: optimize layout mode, split horizontal mix component into two layouts, and rename the component.  -  by **Azir** [(b6ac3)](https://github.com/soybeanjs/soybean-admin/commit/b6ac310) +- **request**: remove cancelRequest method and related logic from request instances  -  by @soybeanjs [(b4e12)](https://github.com/soybeanjs/soybean-admin/commit/b4e1253) + +###    🚀 Features + +- **components**: + - add the IconTooltip component.  -  by **Azir-11** [(a55b4)](https://github.com/soybeanjs/soybean-admin/commit/a55b4dc) + - replace NTooltip with IconTooltip and optimize the layout of related components.  -  by **Azir-11** [(40057)](https://github.com/soybeanjs/soybean-admin/commit/4005763) +- **hooks**: + - add scrollX computation for total table width in useNaiveTable  -  by @Lruihao [(358e1)](https://github.com/soybeanjs/soybean-admin/commit/358e129) +- **packages**: + - materials support slider-tab. closed #823  -  by @CyberShen in https://github.com/soybeanjs/soybean-admin/issues/823 [(61fa4)](https://github.com/soybeanjs/soybean-admin/commit/61fa4b7) +- **projects**: + - refactor theme drawer with tabbed layout for better UX.  -  by **Azir** [(8ba71)](https://github.com/soybeanjs/soybean-admin/commit/8ba71a0) + - Add current time display option for watermark  -  by @wenyuanw in https://github.com/soybeanjs/soybean-admin/issues/772 [(f238f)](https://github.com/soybeanjs/soybean-admin/commit/f238fcb) + - add 'vertical-hybrid-header-first' layout mode  -  by @wenyuanw [(b4e5c)](https://github.com/soybeanjs/soybean-admin/commit/b4e5c6d) + - add prompt information for scrolling mode and tab bar caching.  -  by **Azir-11** [(29a2a)](https://github.com/soybeanjs/soybean-admin/commit/29a2a5c) + - support theme preset function.  -  by **Azir-11** [(257f1)](https://github.com/soybeanjs/soybean-admin/commit/257f118) + - modify the default value of the reset cache policy to 'refresh'.  -  by **Azir-11** [(3c0a5)](https://github.com/soybeanjs/soybean-admin/commit/3c0a528) + - optimize tabs cache cleaning strategy. close #820.  -  by **Azir-11** in https://github.com/soybeanjs/soybean-admin/issues/820 [(ef7ac)](https://github.com/soybeanjs/soybean-admin/commit/ef7acc6) + - support closing tabs with middle mouse button click  -  by @wenyuanw [(a8d1e)](https://github.com/soybeanjs/soybean-admin/commit/a8d1e5d) + - support set global redius  -  by **CyberShen123** [(24c6d)](https://github.com/soybeanjs/soybean-admin/commit/24c6df5) + - support set global redius  -  by **CyberShen123** [(3549c)](https://github.com/soybeanjs/soybean-admin/commit/3549c4d) +- **styles**: + - add text-autospace property to improve text layout  -  by @wenyuanw [(345aa)](https://github.com/soybeanjs/soybean-admin/commit/345aa29) + +###    🐞 Bug Fixes + +- **hooks**: + - correct chart rendering logic in useEcharts  -  by @soybeanjs [(8a7cd)](https://github.com/soybeanjs/soybean-admin/commit/8a7cd59) +- **packages**: + - fix the parsing logic for stored data to ensure correct return of boolean values  -  by @Lruihao [(9ea56)](https://github.com/soybeanjs/soybean-admin/commit/9ea56c9) + - axios: fix json response. fixed #815  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/815 [(5be86)](https://github.com/soybeanjs/soybean-admin/commit/5be864a) +- **projects**: + - Fix i18n-ally not working when setting moduleResolution to bundler. fixed #780  -  by @xiaobao0505 in https://github.com/soybeanjs/soybean-admin/issues/780 [(41191)](https://github.com/soybeanjs/soybean-admin/commit/41191d5) +- **styles**: + - show light color scrollbar while dark mode is on  -  by **whyang** [(dac50)](https://github.com/soybeanjs/soybean-admin/commit/dac5075) +- **table**: + - add type annotations for records in useTable hook  -  by @soybeanjs [(32b8f)](https://github.com/soybeanjs/soybean-admin/commit/32b8f99) +- **types**: + - fix proxy types  -  by @soybeanjs [(3d72f)](https://github.com/soybeanjs/soybean-admin/commit/3d72f95) + - fix ts type error  -  by @soybeanjs [(d5a3a)](https://github.com/soybeanjs/soybean-admin/commit/d5a3a25) + +###    🛠 Optimizations + +- **hooks**: + - optimize useEcharts  -  by @soybeanjs [(936b8)](https://github.com/soybeanjs/soybean-admin/commit/936b834) +- **packages**: + - remove ofetch package  -  by @soybeanjs [(abaaa)](https://github.com/soybeanjs/soybean-admin/commit/abaaa4a) +- **projects**: + - improve theme drawer responsive width for mobile devices  -  by @wenyuanw [(8439a)](https://github.com/soybeanjs/soybean-admin/commit/8439a60) + - improve robustness of second-level menu key logic  -  by @wenyuanw [(8b8a2)](https://github.com/soybeanjs/soybean-admin/commit/8b8a208) + - optimize theme drawer width  -  by @soybeanjs [(81468)](https://github.com/soybeanjs/soybean-admin/commit/8146858) + - optimize api type file  -  by @soybeanjs [(3a343)](https://github.com/soybeanjs/soybean-admin/commit/3a343ee) + - optimize radius settings  -  by @soybeanjs [(87a66)](https://github.com/soybeanjs/soybean-admin/commit/87a66a4) +- **request**: + - enhance request options and response handling with generic types  -  by @soybeanjs [(50a5c)](https://github.com/soybeanjs/soybean-admin/commit/50a5cba) + +###    💅 Refactors + +- **hooks**: + - optimize useContext and update useMixMenuContext  -  by @soybeanjs [(c9651)](https://github.com/soybeanjs/soybean-admin/commit/c965140) + - streamline column visibility handling in useTable and table components  -  by @soybeanjs [(ee434)](https://github.com/soybeanjs/soybean-admin/commit/ee43414) + - remove useSignal hook and update exports  -  by @soybeanjs [(87adc)](https://github.com/soybeanjs/soybean-admin/commit/87adc35) +- **menu**: + - optimize the margin on the menu  -  by **NicholasLD** [(d7311)](https://github.com/soybeanjs/soybean-admin/commit/d731111) +- **projects**: + - remove unnecessary logic in onRouteSwitchWhenLoggedIn  -  by @wenyuanw [(d6c81)](https://github.com/soybeanjs/soybean-admin/commit/d6c8142) +- **request**: + - unify response transformation methods and deprecate transformBackendResponse  -  by @soybeanjs [(f83ee)](https://github.com/soybeanjs/soybean-admin/commit/f83eefb) +- **types**: + - move Auth and Route namespaces to separate files and clean up api.d.ts  -  by **Azir** [(d37ce)](https://github.com/soybeanjs/soybean-admin/commit/d37ce04) + +###    📖 Documentation + +- **projects**: add github trendshift info.  -  by **恕瑞玛的皇帝** [(2a0c9)](https://github.com/soybeanjs/soybean-admin/commit/2a0c9f1) + +###    🏡 Chore + +- **deps**: + - update NodeJS and pnpm version requirements in package.json and documentation  -  by **Junior25306** [(a5c4b)](https://github.com/soybeanjs/soybean-admin/commit/a5c4b4e) + - update deps  -  by @soybeanjs [(5cb1c)](https://github.com/soybeanjs/soybean-admin/commit/5cb1ceb) + - update deps  -  by @soybeanjs [(aeb63)](https://github.com/soybeanjs/soybean-admin/commit/aeb6369) + - update deps  -  by @soybeanjs [(e89b8)](https://github.com/soybeanjs/soybean-admin/commit/e89b86c) + - update deps  -  by @soybeanjs [(c962f)](https://github.com/soybeanjs/soybean-admin/commit/c962f7b) + - update deps  -  by @soybeanjs [(12135)](https://github.com/soybeanjs/soybean-admin/commit/1213531) + - update deps  -  by @soybeanjs [(b041f)](https://github.com/soybeanjs/soybean-admin/commit/b041fdd) + - update deps  -  by @soybeanjs [(d567c)](https://github.com/soybeanjs/soybean-admin/commit/d567c05) + - update deps  -  by @soybeanjs [(6cbf5)](https://github.com/soybeanjs/soybean-admin/commit/6cbf570) +- **other**: + - update the ESLint validation configuration to support more file types.  -  by **Azir-11** [(be8f9)](https://github.com/soybeanjs/soybean-admin/commit/be8f915) +- **packages**: + - update Vite version to 7 in package.json and documentation.  -  by **Azir** [(03dd6)](https://github.com/soybeanjs/soybean-admin/commit/03dd64c) + - add picomatch to fix scripts  -  by @soybeanjs [(805c3)](https://github.com/soybeanjs/soybean-admin/commit/805c338) +- **vscode**: + - remove unused vue.server.hybridMode setting from .vscode/settings.json  -  by @soybeanjs [(13319)](https://github.com/soybeanjs/soybean-admin/commit/133196f) + +###    🎨 Styles + +- **projects**: format code.  -  by **Azir-11** [(100e0)](https://github.com/soybeanjs/soybean-admin/commit/100e0ea) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![wenyuanw](https://github.com/wenyuanw.png?size=48)](https://github.com/wenyuanw)  [![CyberShen](https://github.com/CyberShen.png?size=48)](https://github.com/CyberShen)  [![Lruihao](https://github.com/Lruihao.png?size=48)](https://github.com/Lruihao)  [![xiaobao0505](https://github.com/xiaobao0505.png?size=48)](https://github.com/xiaobao0505)   +[CyberShen123](mailto:s.lijun@qq.com), [whyang](mailto:whyang9701@gmail.com), [HongxuanG](mailto:1359774872@qq.com), [Azir-11](mailto:2075125282@qq.com), [NicholasLD](mailto:878639947@qq.com), [Junior25306](mailto:dayu429@qq.com) + +## [v1.3.15](https://github.com/soybeanjs/soybean-admin/compare/v1.3.14...v1.3.15) (2025-06-24) + +###    🚀 Features + +- **projects**: add configurable user name watermark option  -  by @wenyuanw [(7c3da)](https://github.com/soybeanjs/soybean-admin/commit/7c3dac42) + +###    🐞 Bug Fixes + +- **app**: replace console.error with window.console.error for consistency  -  by @soybeanjs [(7d840)](https://github.com/soybeanjs/soybean-admin/commit/7d84062e) +- **projects**: ensure proper text color when themes are inverted  -  by @wenyuanw [(afd60)](https://github.com/soybeanjs/soybean-admin/commit/afd60421) +- **types**: The environment variable VITE_ICON_LOCAL_PREFIX has the wrong type.  -  by **chenziwen** [(da149)](https://github.com/soybeanjs/soybean-admin/commit/da149e5b) + +###    🛠 Optimizations + +- **components**: optimize spacing for lang-switch dropdown options  -  by @wenyuanw [(fcb89)](https://github.com/soybeanjs/soybean-admin/commit/fcb89883) + +###    💅 Refactors + +- **iframe-page**: remove unused lifecycle hooks and clean up script setup  -  by @soybeanjs [(276d8)](https://github.com/soybeanjs/soybean-admin/commit/276d836c) + +###    📖 Documentation + +- **other**: update docs with video tutorial link.  -  by **Azir** [(7b2e5)](https://github.com/soybeanjs/soybean-admin/commit/7b2e510a) +- **readme**: add warning about upcoming `V2` version and link to plan list  -  by @soybeanjs [(4d42d)](https://github.com/soybeanjs/soybean-admin/commit/4d42dcbe) + +###    🏡 Chore + +- **deps**: update deps  -  by @soybeanjs [(dc674)](https://github.com/soybeanjs/soybean-admin/commit/dc674ce8) +- **projects**: update deps & fix `moduleResolution`  -  by @soybeanjs [(dbd99)](https://github.com/soybeanjs/soybean-admin/commit/dbd995c1) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![wenyuanw](https://github.com/wenyuanw.png?size=48)](https://github.com/wenyuanw)   +[Azir](mailto:2075125282@qq.com), [chenziwen](mailto:chenziwen@qesong.com) + +## [v1.3.14](https://github.com/soybeanjs/soybean-admin/compare/v1.3.13...v1.3.14) (2025-06-09) + +###    🚀 Features + +- **docs**: + - add GitCode star badge to README files  -  by @soybeanjs [(05dc1)](https://github.com/soybeanjs/soybean-admin/commit/05dc11e2) + - add DartNode sponsorship badge to README files  -  by @soybeanjs [(2ed0b)](https://github.com/soybeanjs/soybean-admin/commit/2ed0b648) +- **projects**: + - support vite devtools specify the editor by launchEditor option.  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/730 [(29698)](https://github.com/soybeanjs/soybean-admin/commit/29698bef) + - clear tabs cache when switching users.  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/744 [(1ff4d)](https://github.com/soybeanjs/soybean-admin/commit/1ff4d82d) +- **theme**: + - global search button toggle  -  by **t8y2** [(75455)](https://github.com/soybeanjs/soybean-admin/commit/75455b00) +- **types**: + - enhance Option type to support customizable label types  -  by @WgoW and @testbrate in https://github.com/soybeanjs/soybean-admin/issues/735 [(123d2)](https://github.com/soybeanjs/soybean-admin/commit/123d2c90) +- **utils**: + - support quick generation of code templates.  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/733 [(8527a)](https://github.com/soybeanjs/soybean-admin/commit/8527aa80) + +###    🐞 Bug Fixes + +- **auth**: + - remove redundant authStore declaration in resetStore function  -  by @soybeanjs [(c57f8)](https://github.com/soybeanjs/soybean-admin/commit/c57f88aa) +- **hooks**: + - fixed the issue where loading was not properly closed in some cases.  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/737 [(85e40)](https://github.com/soybeanjs/soybean-admin/commit/85e40b19) + - refactor useCountDown hook for improved countdown logic and clarity.  -  by **Azir** [(dfb64)](https://github.com/soybeanjs/soybean-admin/commit/dfb647a8) +- **projects**: + - tab closure did not remove cache correctly.  -  by **Azir** [(7fb5c)](https://github.com/soybeanjs/soybean-admin/commit/7fb5c72f) + +###    🛠 Optimizations + +- **hooks**: + - remove obsolete disabling cache.  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/729 [(4e1b6)](https://github.com/soybeanjs/soybean-admin/commit/4e1b65b6) + - update detection function to cover the exceptions that occur when the request fails.  -  by **恕瑞玛的皇帝** [(22218)](https://github.com/soybeanjs/soybean-admin/commit/222187d3) +- **projects**: + - optimize tab deletion logic. closed #755  -  by @wenyuanw in https://github.com/soybeanjs/soybean-admin/issues/755 [(e6044)](https://github.com/soybeanjs/soybean-admin/commit/e6044d0f) + +###    📖 Documentation + +- **README**: + - Add supporting ecosystem tools to the open-source repository  -  by @WgoW and @testbrate in https://github.com/soybeanjs/soybean-admin/issues/740 [(a013e)](https://github.com/soybeanjs/soybean-admin/commit/a013ea2c) +- **deps**: + - update the Vite version of the project description.  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/732 [(80486)](https://github.com/soybeanjs/soybean-admin/commit/80486099) +- **projects**: + - update README  -  by @xiatianYa in https://github.com/soybeanjs/soybean-admin/issues/726 [(3cbaf)](https://github.com/soybeanjs/soybean-admin/commit/3cbaf4f4) + - add gitcode link  -  by @soybeanjs [(f35c2)](https://github.com/soybeanjs/soybean-admin/commit/f35c250a) + +###    🏡 Chore + +- **deps**: + - add vscode recommend plugin close #738  -  by @tu6ge in https://github.com/soybeanjs/soybean-admin/issues/739 and https://github.com/soybeanjs/soybean-admin/issues/738 [(61244)](https://github.com/soybeanjs/soybean-admin/commit/61244f0f) + - update deps  -  by @soybeanjs [(41b5f)](https://github.com/soybeanjs/soybean-admin/commit/41b5f493) + - update deps  -  by @soybeanjs [(3e4e1)](https://github.com/soybeanjs/soybean-admin/commit/3e4e17ab) + +###    🤖 CI + +- **hooks**: remove lint-staged in git hook. close #724  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/743 and https://github.com/soybeanjs/soybean-admin/issues/724 [(c3abc)](https://github.com/soybeanjs/soybean-admin/commit/c3abc3df) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![wenyuanw](https://github.com/wenyuanw.png?size=48)](https://github.com/wenyuanw)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)  [![WgoW](https://github.com/WgoW.png?size=48)](https://github.com/WgoW)  [![testbrate](https://github.com/testbrate.png?size=48)](https://github.com/testbrate)  [![tu6ge](https://github.com/tu6ge.png?size=48)](https://github.com/tu6ge)  [![xiatianYa](https://github.com/xiatianYa.png?size=48)](https://github.com/xiatianYa)   +[恕瑞玛的皇帝](mailto:2075125282@qq.com), [t8y2](mailto:1156263951@qq.com),  + +## [v1.3.13](https://github.com/soybeanjs/soybean-admin/compare/v1.3.12...v1.3.13) (2025-03-19) + +###    🐞 Bug Fixes + +- **projects**: fix active tab switch issue after removal  -  by @me-o in https://github.com/soybeanjs/soybean-admin/issues/723 [(a7c59)](https://github.com/soybeanjs/soybean-admin/commit/a7c59ada) + +###    📖 Documentation + +- **projects**: update README  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/718 [(3febb)](https://github.com/soybeanjs/soybean-admin/commit/3febb65d) + +###    📦 Build + +- **deps**: Restrict the minimum Node.js version.  -  by **一寸灰** in https://github.com/soybeanjs/soybean-admin/issues/720 [(a6ecd)](https://github.com/soybeanjs/soybean-admin/commit/a6ecd3e0) + +###    🏡 Chore + +- **deps**: + - update deps  -  by @soybeanjs [(5d8b7)](https://github.com/soybeanjs/soybean-admin/commit/5d8b782d) + - update deps  -  by @soybeanjs [(2e8cb)](https://github.com/soybeanjs/soybean-admin/commit/2e8cb35c) +- **projects**: + - update vscode settings and launch  -  by @soybeanjs [(8b12e)](https://github.com/soybeanjs/soybean-admin/commit/8b12ef9f) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![me-o](https://github.com/me-o.png?size=48)](https://github.com/me-o)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)   +[一寸灰](mailto:webzhangfei@163.com),  + +## [v1.3.12](https://github.com/soybeanjs/soybean-admin/compare/v1.3.11...v1.3.12) (2025-03-12) + +###    🚀 Features + +- **projects**: + - support loading page dark mode adaptation.  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/702 [(9b945)](https://github.com/soybeanjs/soybean-admin/commit/9b9455d9) + - tab support touch event  -  by @soybeanjs [(a03be)](https://github.com/soybeanjs/soybean-admin/commit/a03becda) + - support proxy log in terminal  -  by @soybeanjs [(4cc14)](https://github.com/soybeanjs/soybean-admin/commit/4cc1487f) +- **projects): feat(projects**: + - TableColumnCheck title support VNode  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/716 [(a1a5c)](https://github.com/soybeanjs/soybean-admin/commit/a1a5c74c) +- **utils**: + - support replaceTab.  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/713 [(be608)](https://github.com/soybeanjs/soybean-admin/commit/be6080ba) + +###    🐞 Bug Fixes + +- **projects**: + - hidden multi-language button in login page. fix #694  -  by **Azir** in https://github.com/soybeanjs/soybean-admin/issues/694 [(54e7d)](https://github.com/soybeanjs/soybean-admin/commit/54e7d6d0) + - fix multiple calls to the login API when clicking quickly. fixed #697  -  by @zsdycs in https://github.com/soybeanjs/soybean-admin/issues/698 and https://github.com/soybeanjs/soybean-admin/issues/697 [(86da7)](https://github.com/soybeanjs/soybean-admin/commit/86da767e) + - fix multiple calls to the login API when clicking quickly. fixed #697 "  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/698 and https://github.com/soybeanjs/soybean-admin/issues/697 [(15163)](https://github.com/soybeanjs/soybean-admin/commit/15163d70) + +###    🏡 Chore + +- **deps**: + - update deps  -  by @soybeanjs [(132e1)](https://github.com/soybeanjs/soybean-admin/commit/132e1012) + - update deps  -  by **Azir** [(52c33)](https://github.com/soybeanjs/soybean-admin/commit/52c336d7) + - update deps  -  by @soybeanjs [(b8112)](https://github.com/soybeanjs/soybean-admin/commit/b8112613) +- **projects**: + - update unocss preset  -  by @Wangijun in https://github.com/soybeanjs/soybean-admin/issues/712 [(3e007)](https://github.com/soybeanjs/soybean-admin/commit/3e0076d4) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)  [![Wangijun](https://github.com/Wangijun.png?size=48)](https://github.com/Wangijun)  [![zsdycs](https://github.com/zsdycs.png?size=48)](https://github.com/zsdycs)   +[Azir](mailto:2075125282@qq.com),  + +## [v1.3.11](https://github.com/soybeanjs/soybean-admin/compare/v1.3.10...v1.3.11) (2025-01-19) + +###    🚀 Features + +- **projects**: multi language buttons support hiding.  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/683 [(d7aeb)](https://github.com/soybeanjs/soybean-admin/commit/d7aebb7) + +###    🐞 Bug Fixes + +- **hooks**: + - The total number before assigning a value to the table is incorrect.  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/687 [(56760)](https://github.com/soybeanjs/soybean-admin/commit/5676024) +- **projects**: + - fix login success notification. fixed #688  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/688 [(60dd2)](https://github.com/soybeanjs/soybean-admin/commit/60dd226) + - fix update notifications. fixed #691, fixed #692  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/691 and https://github.com/soybeanjs/soybean-admin/issues/692 [(ac862)](https://github.com/soybeanjs/soybean-admin/commit/ac86247) + +###    🛠 Optimizations + +- **projects**: optimize code  -  by @soybeanjs [(6489e)](https://github.com/soybeanjs/soybean-admin/commit/6489ec4) + +###    📖 Documentation + +- **projects**: update README  -  by @soybeanjs [(21434)](https://github.com/soybeanjs/soybean-admin/commit/214341e) + +###    🏡 Chore + +- **deps**: update deps  -  by @soybeanjs [(c9433)](https://github.com/soybeanjs/soybean-admin/commit/c9433e1) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)   + +## [v1.3.10](https://github.com/honghuangdc/soybean-admin/compare/v1.3.9...v1.3.10) (2024-12-16) + +###    🚀 Features + +- **projects**: support show tab when not loggedIn  -  by @soybeanjs [(ba381)](https://github.com/honghuangdc/soybean-admin/commit/ba38119) + +###    🐞 Bug Fixes + +- **deps**: + - reduced eslint version to 9.14.0  -  by @soybeanjs [(af417)](https://github.com/honghuangdc/soybean-admin/commit/af4177e) +- **projects**: + - fix route guard hook `onRouteSwitchWhenLoggedIn`. fixed #680  -  by @soybeanjs in https://github.com/honghuangdc/soybean-admin/issues/680 [(ab985)](https://github.com/honghuangdc/soybean-admin/commit/ab9858c) + - check if init userInfo when initAuthRoute. fixed #680  -  by @soybeanjs in https://github.com/honghuangdc/soybean-admin/issues/680 [(9f4fb)](https://github.com/honghuangdc/soybean-admin/commit/9f4fb8c) + +###    🛠 Optimizations + +- **projects**: + - optimize router guard  -  by @soybeanjs [(0dfcf)](https://github.com/honghuangdc/soybean-admin/commit/0dfcf18) + - use `defu` to fill added theme config  -  by @soybeanjs [(101b6)](https://github.com/honghuangdc/soybean-admin/commit/101b6f9) + +###    📖 Documentation + +- **projects**: ✏️ add element-plus version link  -  by **一寸灰** in https://github.com/honghuangdc/soybean-admin/issues/679 [(5c6ab)](https://github.com/honghuangdc/soybean-admin/commit/5c6ab0b) + +###    🏡 Chore + +- rename env.d.ts to vite-env.d.ts  -  by @wzc520pyfm in https://github.com/honghuangdc/soybean-admin/issues/675 [(b93c2)](https://github.com/honghuangdc/soybean-admin/commit/b93c203) +- **projects**: update deps & fix vite config  -  by @soybeanjs [(3e0eb)](https://github.com/honghuangdc/soybean-admin/commit/3e0eb72) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![wzc520pyfm](https://github.com/wzc520pyfm.png?size=48)](https://github.com/wzc520pyfm)   +[一寸灰](mailto:webzhangfei@163.com),  + +## [v1.3.9](https://github.com/soybeanjs/soybean-admin/compare/v1.3.8...v1.3.9) (2024-11-17) + +###    🚀 Features + +- **projects**: + - support scheduled detection and update system. close #657  -  by **青菜白玉汤** in https://github.com/soybeanjs/soybean-admin/issues/669 and https://github.com/soybeanjs/soybean-admin/issues/657 [(d088f)](https://github.com/soybeanjs/soybean-admin/commit/d088f81) + - app version notification plugin support sub deploy path. close #668  -  by **Soybean** in https://github.com/soybeanjs/soybean-admin/issues/668 [(a53eb)](https://github.com/soybeanjs/soybean-admin/commit/a53eb10) + +###    🛠 Optimizations + +- **projects**: optimize code  -  by **Soybean** [(9ad5d)](https://github.com/soybeanjs/soybean-admin/commit/9ad5d71) + +###    💅 Refactors + +- **projects**: refactor router guard. fix #655  -  by **Soybean** in https://github.com/soybeanjs/soybean-admin/issues/667 and https://github.com/soybeanjs/soybean-admin/issues/655 [(09144)](https://github.com/soybeanjs/soybean-admin/commit/09144df) + +###    📖 Documentation + +- **projects**: set the Chinese version of README as default  -  by **Soybean** [(9d28b)](https://github.com/soybeanjs/soybean-admin/commit/9d28b31) + +###    🏡 Chore + +- **deps**: + - update deps  -  by **Soybean** [(91de4)](https://github.com/soybeanjs/soybean-admin/commit/91de4a8) + - update deps  -  by **Soybean** [(0c809)](https://github.com/soybeanjs/soybean-admin/commit/0c809de) +- **projects**: + - add desc for base url of app  -  by **Soybean** [(17d7e)](https://github.com/soybeanjs/soybean-admin/commit/17d7e52) + +###    ❤️ Contributors + + +[Soybean](mailto:soybeanjs@outlook.com), [青菜白玉汤](mailto:79054161+Azir-11@users.noreply.github.com) + +## [v1.3.8](https://github.com/soybeanjs/soybean-admin/compare/v1.3.7...v1.3.8) (2024-10-25) + +###    🚨 Breaking Changes + +- **projects**: refactor route cache & support reset route cache strategy  -  by @soybeanjs [(b667e)](https://github.com/soybeanjs/soybean-admin/commit/b667eab) + +###    🚀 Features + +- **packages**: + - add subpackage `@sa/alova`  -  by @JOU-amjs in https://github.com/soybeanjs/soybean-admin/issues/640 [(2072f)](https://github.com/soybeanjs/soybean-admin/commit/2072f58) + - optimistic subpackage `@sa/alova`  -  by @JOU-amjs in https://github.com/soybeanjs/soybean-admin/issues/646 [(4b3ac)](https://github.com/soybeanjs/soybean-admin/commit/4b3ac11) +- **projects**: + - login supports accessible operation.  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/637 [(cfaab)](https://github.com/soybeanjs/soybean-admin/commit/cfaab85) + +###    🐞 Bug Fixes + +- **utils**: fix `isPC`. fixed #644  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/644 [(47264)](https://github.com/soybeanjs/soybean-admin/commit/4726498) + +###    🏡 Chore + +- **deps**: + - update deps  -  by @soybeanjs [(8dcda)](https://github.com/soybeanjs/soybean-admin/commit/8dcda38) +- **projects**: + - update vscode extensions  -  by @soybeanjs [(24bb6)](https://github.com/soybeanjs/soybean-admin/commit/24bb6d9) + - update deps & fix sass usage  -  by @soybeanjs [(71e63)](https://github.com/soybeanjs/soybean-admin/commit/71e6307) +- **types**: + - remove type declaration for document.startViewTransition (TypeScript 5.6 includes it)  -  by @NHZEX in https://github.com/soybeanjs/soybean-admin/issues/633 [(83ba7)](https://github.com/soybeanjs/soybean-admin/commit/83ba798) + +###    🎨 Styles + +- **projects**: reduce ambiguity in theme configuration instructions.  -  by @Azir-11 [(75cbf)](https://github.com/soybeanjs/soybean-admin/commit/75cbfbb) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![JOU-amjs](https://github.com/JOU-amjs.png?size=48)](https://github.com/JOU-amjs)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)  [![NHZEX](https://github.com/NHZEX.png?size=48)](https://github.com/NHZEX)   + +## [v1.3.7](https://github.com/soybeanjs/soybean-admin/compare/v1.3.6...v1.3.7) (2024-09-21) + +###    🚨 Breaking Changes + +- **projects**: update scss config  -  by @soybeanjs [(24e9e)](https://github.com/soybeanjs/soybean-admin/commit/24e9e57) + +###    🐞 Bug Fixes + +- **projects**: fix global-tab click conflict with contextmenu  -  by @soybeanjs [(3e72c)](https://github.com/soybeanjs/soybean-admin/commit/3e72c3b) + +###    💅 Refactors + +- **packages**: @sa/materials: remove tab close shortcut by mouse  -  by @soybeanjs [(4da58)](https://github.com/soybeanjs/soybean-admin/commit/4da588c) + +###    🏡 Chore + +- **deps**: update deps  -  by @soybeanjs [(baefd)](https://github.com/soybeanjs/soybean-admin/commit/baefdfd) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)   + +## [v1.3.6](https://github.com/soybeanjs/soybean-admin/compare/v1.3.5...v1.3.6) (2024-09-20) + +###    🐞 Bug Fixes + +- **components**: + - fix VerticalMixMenu name  -  by @soybeanjs [(20f8e)](https://github.com/soybeanjs/soybean-admin/commit/20f8ed3) +- **projects**: + - fix click global-tab in iPad. fixed #624  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/624 [(04d05)](https://github.com/soybeanjs/soybean-admin/commit/04d0564) + - when the roles filter submenu is empty, the parent menu is not excluded. fixed #621.  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/626 and https://github.com/soybeanjs/soybean-admin/issues/621 [(0ac95)](https://github.com/soybeanjs/soybean-admin/commit/0ac95bd) + +###    🛠 Optimizations + +- **projects**: + - optimize code  -  by @soybeanjs [(6561f)](https://github.com/soybeanjs/soybean-admin/commit/6561f0b) + - optimize code  -  by @soybeanjs [(38eeb)](https://github.com/soybeanjs/soybean-admin/commit/38eeb67) + - remove defineModel setting,enabled by default  -  by @yanbowe in https://github.com/soybeanjs/soybean-admin/issues/620 [(60bbd)](https://github.com/soybeanjs/soybean-admin/commit/60bbd2d) + +###    📖 Documentation + +- **projects**: update CHANGELOG  -  by @soybeanjs [(5baf1)](https://github.com/soybeanjs/soybean-admin/commit/5baf19d) + +###    🏡 Chore + +- **deps**: + - update deps  -  by @soybeanjs [(207d6)](https://github.com/soybeanjs/soybean-admin/commit/207d6eb) + - update deps  -  by @soybeanjs [(f3562)](https://github.com/soybeanjs/soybean-admin/commit/f35627e) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)  [![yanbowe](https://github.com/yanbowe.png?size=48)](https://github.com/yanbowe)   + +## [v1.3.5](https://github.com/soybeanjs/soybean-admin/compare/v1.3.4...v1.3.5) (2024-09-07) + +###    🚀 Features + +- **packages**: + - @sa/axios: add response to flatRequest when success  -  by @soybeanjs [(c4e16)](https://github.com/soybeanjs/soybean-admin/commit/c4e1610) +- **projects**: + - README.zh_CN.md 添加合作推广  -  by @PZ-18664918826 in https://github.com/soybeanjs/soybean-admin/issues/601 [(2fa40)](https://github.com/soybeanjs/soybean-admin/commit/2fa400b) + - Add more commit types according to Apache specifications  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/610 [(878d9)](https://github.com/soybeanjs/soybean-admin/commit/878d9c3) + - does the configuration support automatic updates. close#612  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/617 and https://github.com/soybeanjs/soybean-admin/issues/612 [(4c9f4)](https://github.com/soybeanjs/soybean-admin/commit/4c9f4e0) + - add app error handler. close #587  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/587 [(be855)](https://github.com/soybeanjs/soybean-admin/commit/be8556c) + +###    🐞 Bug Fixes + +- **deps**: + - move json5 from devDependencies to dependencies to support production usage  -  by @mufeng889 in https://github.com/soybeanjs/soybean-admin/issues/618 [(7cb43)](https://github.com/soybeanjs/soybean-admin/commit/7cb43fc) +- **projects**: + - avoid retrieving cached HTML  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/605 [(ef6cf)](https://github.com/soybeanjs/soybean-admin/commit/ef6cf93) + - fix login redirect  -  by @soybeanjs [(3830e)](https://github.com/soybeanjs/soybean-admin/commit/3830ec7) + - fix vertical-mix-menu when sider collapse. fixed #608  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/608 [(c3f1f)](https://github.com/soybeanjs/soybean-admin/commit/c3f1f69) + - fix breadcrumb when activeMenu is parent menu. fixed #589  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/589 [(79b2a)](https://github.com/soybeanjs/soybean-admin/commit/79b2a28) + - fix refresh token when meet multi requests. fixed #581  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/581 [(27b52)](https://github.com/soybeanjs/soybean-admin/commit/27b5222) +- **types**: + - fix the type of TableApiFn  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/599 [(26c93)](https://github.com/soybeanjs/soybean-admin/commit/26c93df) + +###    🛠 Optimizations + +- **projects**: optimize menu selectedKey  -  by @soybeanjs [(531bf)](https://github.com/soybeanjs/soybean-admin/commit/531bfaf) + +###    📖 Documentation + +- **projects**: + - update README  -  by @mufeng889 in https://github.com/soybeanjs/soybean-admin/issues/594 [(a8f92)](https://github.com/soybeanjs/soybean-admin/commit/a8f923e) + - update README  -  by @soybeanjs [(e9a2e)](https://github.com/soybeanjs/soybean-admin/commit/e9a2ee4) + - update README  -  by @soybeanjs [(73e91)](https://github.com/soybeanjs/soybean-admin/commit/73e917a) + - update the location of important information in the document  -  by **Azir** [(9c012)](https://github.com/soybeanjs/soybean-admin/commit/9c012c7) + +###    🏡 Chore + +- **deps**: + - update deps  -  by @soybeanjs [(a1c14)](https://github.com/soybeanjs/soybean-admin/commit/a1c14a1) + - update deps  -  by @soybeanjs [(7fa55)](https://github.com/soybeanjs/soybean-admin/commit/7fa5590) + - update deps  -  by @soybeanjs [(a44ea)](https://github.com/soybeanjs/soybean-admin/commit/a44ea62) +- **projects**: + - use json5 resolve env `VITE_OTHER_SERVICE_BASE_URL` & fix proxy enable  -  by @soybeanjs [(b16a9)](https://github.com/soybeanjs/soybean-admin/commit/b16a963) + +###    🎨 Styles + +- **projects**: rename script czh to commit:zh  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/597 [(5094f)](https://github.com/soybeanjs/soybean-admin/commit/5094f0e) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![mufeng889](https://github.com/mufeng889.png?size=48)](https://github.com/mufeng889)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)  [![PZ-18664918826](https://github.com/PZ-18664918826.png?size=48)](https://github.com/PZ-18664918826)   +[Azir](mailto:2075125282@qq.com),  + +## [v1.3.4](https://github.com/honghuangdc/soybean-admin/compare/v1.3.3...v1.3.4) (2024-08-01) + +###    🚨 Breaking Changes + +- **projects**: don't reset active menu of vertical-mix layout when it is mixSiderFixed  -  by @honghuangdc [(939c5)](https://github.com/honghuangdc/soybean-admin/commit/939c512) + +###    🛠 Optimizations + +- **projects**: optimize code  -  by @honghuangdc [(cb1d4)](https://github.com/honghuangdc/soybean-admin/commit/cb1d445) + +###    🏡 Chore + +- **projects**: update deps & fix vue-router type  -  by @honghuangdc [(96837)](https://github.com/honghuangdc/soybean-admin/commit/968370b) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   + +## [v1.3.3](https://github.com/honghuangdc/soybean-admin/compare/v1.3.2...v1.3.3) (2024-07-30) + +###    🐞 Bug Fixes + +- **projects**: fix watermark settings  -  by @honghuangdc [(5646a)](https://github.com/honghuangdc/soybean-admin/commit/5646a50) + +###    📖 Documentation + +- **projects**: update CHANGELOG  -  by @honghuangdc [(ebc83)](https://github.com/honghuangdc/soybean-admin/commit/ebc838c) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   + +## [v1.3.2](https://github.com/honghuangdc/soybean-admin/compare/v1.3.1...v1.3.2) (2024-07-30) + +###    🚀 Features + +- **projects**: + - add color fading mode.close #567  -  by @Azir-11 in https://github.com/honghuangdc/soybean-admin/issues/569 and https://github.com/honghuangdc/soybean-admin/issues/567 [(4dde4)](https://github.com/honghuangdc/soybean-admin/commit/4dde4c2) + - add full screen watermark. close#571  -  by @paynezhuang in https://github.com/honghuangdc/soybean-admin/issues/573 and https://github.com/honghuangdc/soybean-admin/issues/571 [(ea8aa)](https://github.com/honghuangdc/soybean-admin/commit/ea8aa6c) + +###    🐞 Bug Fixes + +- **projects**: fix vertical-mix menu selected  -  by @honghuangdc [(59f07)](https://github.com/honghuangdc/soybean-admin/commit/59f07d8) + +###    🛠 Optimizations + +- **projects**: + - add type WatermarkProps  -  by @honghuangdc [(f26d0)](https://github.com/honghuangdc/soybean-admin/commit/f26d0a6) + - remove home NAlert closable  -  by @honghuangdc [(98b75)](https://github.com/honghuangdc/soybean-admin/commit/98b75c2) + - optimize response code comparison  -  by @honghuangdc [(cf67d)](https://github.com/honghuangdc/soybean-admin/commit/cf67d55) +- **types**: + - remove useless types.  -  by **Azir** [(eed61)](https://github.com/honghuangdc/soybean-admin/commit/eed617f) + +###    📖 Documentation + +- **projects**: update CHANGELOG  -  by @honghuangdc [(d3759)](https://github.com/honghuangdc/soybean-admin/commit/d37591d) + +###    🏡 Chore + +- **deps**: update deps  -  by @honghuangdc [(993e9)](https://github.com/honghuangdc/soybean-admin/commit/993e9ca) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![paynezhuang](https://github.com/paynezhuang.png?size=48)](https://github.com/paynezhuang)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)   +[Azir](mailto:2075125282@qq.com),  + +## [v1.3.1](https://github.com/honghuangdc/soybean-admin/compare/v1.3.0...v1.3.1) (2024-07-22) + +###    🐞 Bug Fixes + +- **projects**: + - fix the issue of abnormal width of the sidebar in the top menu mix and reverse mode  -  by @Azir-11 in https://github.com/honghuangdc/soybean-admin/issues/562 [(c4695)](https://github.com/honghuangdc/soybean-admin/commit/c469512) + - fix HorizontalMixMenu inverted. fixed #563  -  by @honghuangdc in https://github.com/honghuangdc/soybean-admin/issues/563 [(4e55b)](https://github.com/honghuangdc/soybean-admin/commit/4e55b0e) + - fix vertical-menu will not render when the layout is from mobile  -  by @honghuangdc [(84027)](https://github.com/honghuangdc/soybean-admin/commit/8402734) + +###    📖 Documentation + +- **projects**: update CHANGELOG  -  by @honghuangdc [(613c8)](https://github.com/honghuangdc/soybean-admin/commit/613c836) + +###    🎨 Styles + +- **other**: modify the Chinese name of the grayscale mode  -  by **Azir** [(53770)](https://github.com/honghuangdc/soybean-admin/commit/5377002) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)   +[Azir](mailto:2075125282@qq.com),  + +## [v1.3.0](https://github.com/soybeanjs/soybean-admin/compare/v1.2.8...v1.3.0) (2024-07-22) + +###    🚨 Breaking Changes + +- **projects**: refactor global menu & support `reversed-horizontal-mix-menu`. close #365  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/365 [(087e5)](https://github.com/soybeanjs/soybean-admin/commit/087e532) + +###    🚀 Features + +- **packages**: + - `@sa/scripts`: command `gitCommit` support chinese  -  by @mmdapl in https://github.com/soybeanjs/soybean-admin/issues/548 [(06971)](https://github.com/soybeanjs/soybean-admin/commit/06971f3) + - @sa/axios: replace CancelTokenSource by AbortController. close #530, close #532  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/530 and https://github.com/soybeanjs/soybean-admin/issues/532 [(527fd)](https://github.com/soybeanjs/soybean-admin/commit/527fd79) + - @sa/scripts: add ignore pattern list for command `gitCommitVerify`. close #504  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/504 [(958d0)](https://github.com/soybeanjs/soybean-admin/commit/958d0ba) +- **projects**: + - make branch `main` tiny & modify request retry times to 0  -  by @Azir-11 [(793b1)](https://github.com/soybeanjs/soybean-admin/commit/793b16e) + +###    🐞 Bug Fixes + +- **hooks**: prevent program freezing when pagesize returns 0  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/545 [(f4eeb)](https://github.com/soybeanjs/soybean-admin/commit/f4eeb2e) + +###    💅 Refactors + +- **projects**: + - combine `theme tokens` and `theme settings`. close #379  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/379 [(1d1b1)](https://github.com/soybeanjs/soybean-admin/commit/1d1b148) + - change css vars mount to root  -  by @honghuangdc [(00f41)](https://github.com/soybeanjs/soybean-admin/commit/00f41dd) + +###    📖 Documentation + +- **projects**: update CHANGELOG  -  by @honghuangdc [(a0b76)](https://github.com/soybeanjs/soybean-admin/commit/a0b76da) + +###    🏡 Chore + +- **deps**: update deps  -  by @honghuangdc [(f6bd6)](https://github.com/soybeanjs/soybean-admin/commit/f6bd6b8) +- **projects**: add script `czh`  -  by @honghuangdc [(02069)](https://github.com/soybeanjs/soybean-admin/commit/0206969) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![mmdapl](https://github.com/mmdapl.png?size=48)](https://github.com/mmdapl)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)   + +## [v1.2.8](https://github.com/soybeanjs/soybean-admin/compare/v1.2.7...v1.2.8) (2024-07-20) + +###    🐞 Bug Fixes + +- **packages**: + - @sa/hooks: fix searchParams of useHookTable. fixed #552  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/552 [(96c10)](https://github.com/soybeanjs/soybean-admin/commit/96c1044) +- **types**: + - Fixed the reference type error  -  by **dodu2014** in https://github.com/soybeanjs/soybean-admin/issues/551 [(3e2a9)](https://github.com/soybeanjs/soybean-admin/commit/3e2a993) + - fix data type of useHookTable  -  by @honghuangdc [(276ea)](https://github.com/soybeanjs/soybean-admin/commit/276ea7f) + +###    💅 Refactors + +- **projects**: replace `cloneDeep` of `lodash-es` with `klona`  -  by @honghuangdc [(a9133)](https://github.com/soybeanjs/soybean-admin/commit/a91335d) + +###    📖 Documentation + +- **projects**: update CHANGELOG  -  by @honghuangdc [(58fc0)](https://github.com/soybeanjs/soybean-admin/commit/58fc096) + +###    🏡 Chore + +- **deps**: update deps  -  by @honghuangdc [(cf019)](https://github.com/soybeanjs/soybean-admin/commit/cf0192a) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   +[dodu2014](mailto:dodu@live.cn) + +## [v1.2.7](https://github.com/honghuangdc/soybean-admin/compare/v1.2.6...v1.2.7) (2024-07-12) + +###    🛠 Optimizations + +- **projects**: supports custom menu icon sizes  -  by @wynn-w in https://github.com/honghuangdc/soybean-admin/issues/534 [(e035e)](https://github.com/honghuangdc/soybean-admin/commit/e035eab) + +###    🏡 Chore + +- **deps**: + - update deps  -  by @honghuangdc [(72ede)](https://github.com/honghuangdc/soybean-admin/commit/72ede8b) + - update deps  -  by @honghuangdc [(be13c)](https://github.com/honghuangdc/soybean-admin/commit/be13ca2) + - update deps  -  by @honghuangdc [(752ec)](https://github.com/honghuangdc/soybean-admin/commit/752ec1e) +- **projects**: + - Fix deprecated configuration config  -  by @paynezhuang in https://github.com/honghuangdc/soybean-admin/issues/524 [(0d20e)](https://github.com/honghuangdc/soybean-admin/commit/0d20e4c) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![wynn-w](https://github.com/wynn-w.png?size=48)](https://github.com/wynn-w)  [![paynezhuang](https://github.com/paynezhuang.png?size=48)](https://github.com/paynezhuang)   + +## [v1.2.6](https://github.com/honghuangdc/soybean-admin/compare/v1.2.5...v1.2.6) (2024-06-21) + +###    🐞 Bug Fixes + +- **projects**: + - request modal title use i18n. fixed #507  -  by @honghuangdc in https://github.com/honghuangdc/soybean-admin/issues/507 [(f7de3)](https://github.com/honghuangdc/soybean-admin/commit/f7de3fd) + - add `getDataByPage` for `useTable`. fixed #499  -  by @honghuangdc in https://github.com/honghuangdc/soybean-admin/issues/499 [(425c6)](https://github.com/honghuangdc/soybean-admin/commit/425c69a) + - fix login redirect to routeHome when routeHome of dynamic route is not same as static route. fixed #511  -  by @honghuangdc in https://github.com/honghuangdc/soybean-admin/issues/511 [(49f60)](https://github.com/honghuangdc/soybean-admin/commit/49f60b2) + +###    🛠 Optimizations + +- **projects**: optimize `getRouteQueryOfLoginRoute`  -  by @honghuangdc [(693f7)](https://github.com/honghuangdc/soybean-admin/commit/693f704) + +###    📖 Documentation + +- **projects**: + - update CHANGELOG  -  by @honghuangdc [(5c67d)](https://github.com/honghuangdc/soybean-admin/commit/5c67d06) + - update README  -  by @honghuangdc [(1e67a)](https://github.com/honghuangdc/soybean-admin/commit/1e67ae8) + +###    🏡 Chore + +- **deps**: + - update deps. close #510  -  by @honghuangdc in https://github.com/honghuangdc/soybean-admin/issues/510 [(53143)](https://github.com/honghuangdc/soybean-admin/commit/531432d) + - update deps  -  by @honghuangdc [(c7f6f)](https://github.com/honghuangdc/soybean-admin/commit/c7f6f2a) + +###    🤖 CI + +- **projects**: + - add github issues template  -  by @honghuangdc [(b5027)](https://github.com/honghuangdc/soybean-admin/commit/b5027c8) + - update github issues template  -  by @honghuangdc [(ff1d5)](https://github.com/honghuangdc/soybean-admin/commit/ff1d504) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   + +## [v1.2.5](https://github.com/soybeanjs/soybean-admin/compare/v1.2.4...v1.2.5) (2024-06-15) + +###    🐞 Bug Fixes + +- **projects**: Fix the issue of abnormal tab caching after logout. fixed #495  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/495 [(3eeac)](https://github.com/soybeanjs/soybean-admin/commit/3eeace9) + +###    🔥 Performance + +- **project**: Initializing the static routing function does not require asynchronization  -  by **CHENZL** in https://github.com/soybeanjs/soybean-admin/issues/493 [(2198b)](https://github.com/soybeanjs/soybean-admin/commit/2198b98) + +###    🛠 Optimizations + +- **projects**: optimize code  -  by @soybeanjs [(b94ba)](https://github.com/soybeanjs/soybean-admin/commit/b94baa1) +- **types**: Enhance compatibility of global types  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/494 [(cd9d5)](https://github.com/soybeanjs/soybean-admin/commit/cd9d58d) +- **utils**: Reduce code indentation and improve readability  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/496 [(ad2f2)](https://github.com/soybeanjs/soybean-admin/commit/ad2f247) + +###    📖 Documentation + +- **projects**: update CHANGELOG  -  by @soybeanjs [(b3368)](https://github.com/soybeanjs/soybean-admin/commit/b336841) + +###    🏡 Chore + +- **deps**: update deps  -  by @soybeanjs [(b094d)](https://github.com/soybeanjs/soybean-admin/commit/b094d68) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)   +[CHENZL](mailto:zlong5568863@qq.com) + +## [v1.2.4](https://github.com/soybeanjs/soybean-admin/compare/v1.2.3...v1.2.4) (2024-06-14) + +###    🛠 Optimizations + +- **projects**: + - optimize `setupAppVersionNotification`  -  by @soybeanjs [(b5a72)](https://github.com/soybeanjs/soybean-admin/commit/b5a723c) + - get buildTime with timezone 'Asia/Shanghai'  -  by @soybeanjs [(069fa)](https://github.com/soybeanjs/soybean-admin/commit/069fa8a) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)   + +## [v1.2.3](https://github.com/soybeanjs/soybean-admin/compare/v1.2.2...v1.2.3) (2024-06-13) + +###    🐞 Bug Fixes + +- **projects**: + - fix mobile browser theme issue by adding color-scheme meta tag to index.html  -  by @KickCashew in https://github.com/soybeanjs/soybean-admin/issues/488 [(c2125)](https://github.com/soybeanjs/soybean-admin/commit/c212565) + - Fix secondary directory components is empty  -  by @paynezhuang in https://github.com/soybeanjs/soybean-admin/issues/491 [(aabb2)](https://github.com/soybeanjs/soybean-admin/commit/aabb2a4) + +###    📖 Documentation + +- **projects**: + - Fixed the hyperlink pointing error  -  by **Azir** [(20a81)](https://github.com/soybeanjs/soybean-admin/commit/20a8127) + - update README  -  by @soybeanjs [(70261)](https://github.com/soybeanjs/soybean-admin/commit/7026126) + +###    🏡 Chore + +- **deps**: + - update deps  -  by @soybeanjs [(813d8)](https://github.com/soybeanjs/soybean-admin/commit/813d8ce) + - update deps  -  by @soybeanjs [(bf718)](https://github.com/soybeanjs/soybean-admin/commit/bf71837) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![paynezhuang](https://github.com/paynezhuang.png?size=48)](https://github.com/paynezhuang)  [![KickCashew](https://github.com/KickCashew.png?size=48)](https://github.com/KickCashew)   +[Azir](mailto:2075125282@qq.com) + +## [v1.2.2](https://github.com/honghuangdc/soybean-admin/compare/v1.2.1...v1.2.2) (2024-06-12) + +###    🚀 Features + +- **projects**: reset scroll position when tab change  -  by @soybeanjs [(9094b)](https://github.com/honghuangdc/soybean-admin/commit/9094b21) + +###    🐞 Bug Fixes + +- **projects**: + - hide AppVersionNotification in DEV mode  -  by @sigma-plus in https://github.com/honghuangdc/soybean-admin/issues/482 [(62592)](https://github.com/honghuangdc/soybean-admin/commit/6259287) + - fix menu-toggler hidden in mobile layout. fixed #483  -  by @soybeanjs in https://github.com/honghuangdc/soybean-admin/issues/483 [(4470c)](https://github.com/honghuangdc/soybean-admin/commit/4470cb4) + +###    📖 Documentation + +- **projects**: update README  -  by @soybeanjs [(8f9a7)](https://github.com/honghuangdc/soybean-admin/commit/8f9a705) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![sigma-plus](https://github.com/sigma-plus.png?size=48)](https://github.com/sigma-plus)   + +## [v1.2.1](https://github.com/honghuangdc/soybean-admin/compare/v1.2.0...v1.2.1) (2024-06-07) + +###    🐞 Bug Fixes + +- **projects**: + - fix get user info when page reload  -  by @soybeanjs [(ff51b)](https://github.com/honghuangdc/soybean-admin/commit/ff51b72) + - fix setupAppVersionNotification render  -  by @soybeanjs [(6a6eb)](https://github.com/honghuangdc/soybean-admin/commit/6a6eb9a) + +###    📖 Documentation + +- **projects**: update CHANGELOG  -  by @soybeanjs [(fe06b)](https://github.com/honghuangdc/soybean-admin/commit/fe06b8c) + +###    🏡 Chore + +- **deps**: update deps  -  by @soybeanjs [(08827)](https://github.com/honghuangdc/soybean-admin/commit/08827a4) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)   + +## [v1.2.0](https://github.com/soybeanjs/soybean-admin/compare/v1.1.5...v1.2.0) (2024-06-06) + +###    🚀 Features + +- **projects**: + - support system new version update notification. close #420  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/420 [(584cd)](https://github.com/soybeanjs/soybean-admin/commit/584cd54) + - get user info in router guard and remove in localStorage. close #459  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/459 [(5531a)](https://github.com/soybeanjs/soybean-admin/commit/5531a68) + +###    📖 Documentation + +- **projects**: update CHANGELOG  -  by @soybeanjs [(2bec8)](https://github.com/soybeanjs/soybean-admin/commit/2bec899) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)   + +## [v1.1.5](https://github.com/soybeanjs/soybean-admin/compare/v1.1.4...v1.1.5) (2024-06-06) + +###    🐞 Bug Fixes + +- **projects**: fix register name, CodeLogin => Register  -  by @m-xlsea in https://github.com/soybeanjs/soybean-admin/issues/478 [(ddf38)](https://github.com/soybeanjs/soybean-admin/commit/ddf3823) + +###    🏡 Chore + +- **deps**: update deps  -  by @soybeanjs [(060c0)](https://github.com/soybeanjs/soybean-admin/commit/060c0a9) +- **projects**: update vscode settings: vue official  -  by @soybeanjs [(76649)](https://github.com/soybeanjs/soybean-admin/commit/76649e2) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![m-xlsea](https://github.com/m-xlsea.png?size=48)](https://github.com/m-xlsea)   + +## [v1.1.4](https://github.com/honghuangdc/soybean-admin/compare/v1.1.3...v1.1.4) (2024-06-06) + +###    🐞 Bug Fixes + +- **utils**: modalLogout bug when esc is pressed  -  by @sigma-plus in https://github.com/honghuangdc/soybean-admin/issues/470 [(bd69c)](https://github.com/honghuangdc/soybean-admin/commit/bd69c00) + +###    🛠 Optimizations + +- **projects**: optimize RouteMeta remarks  -  by @soybeanjs [(ffb48)](https://github.com/honghuangdc/soybean-admin/commit/ffb48b1) + +###    📖 Documentation + +- **projects**: + - update CHANGELOG  -  by @soybeanjs [(756f8)](https://github.com/honghuangdc/soybean-admin/commit/756f84a) + - update Node&pnpm version  -  by @Azir-11 in https://github.com/honghuangdc/soybean-admin/issues/472 [(9b05d)](https://github.com/honghuangdc/soybean-admin/commit/9b05d73) + +###    🏡 Chore + +- **deps**: + - update deps  -  by @soybeanjs [(d0380)](https://github.com/honghuangdc/soybean-admin/commit/d0380ce) + - update deps  -  by @soybeanjs [(1f464)](https://github.com/honghuangdc/soybean-admin/commit/1f4647b) +- **projects**: + - close http proxy  -  by @soybeanjs [(d08a3)](https://github.com/honghuangdc/soybean-admin/commit/d08a381) + - update mock url  -  by @soybeanjs [(e6086)](https://github.com/honghuangdc/soybean-admin/commit/e6086f0) + - update vscode settings  -  by @soybeanjs [(910df)](https://github.com/honghuangdc/soybean-admin/commit/910dfca) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)  [![sigma-plus](https://github.com/sigma-plus.png?size=48)](https://github.com/sigma-plus)   + +## [v1.1.3](https://github.com/soybeanjs/soybean-admin/compare/v1.1.2...v1.1.3) (2024-06-02) + +###    🐞 Bug Fixes + +- **components**: + - Fix the issue of search box popping up repeatedly due to carriage return  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/468 [(5bd96)](https://github.com/soybeanjs/soybean-admin/commit/5bd96b8) +- **projects**: + - fix click menu search. fixed #466, close #467  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/466 and https://github.com/soybeanjs/soybean-admin/issues/467 [(8efdb)](https://github.com/soybeanjs/soybean-admin/commit/8efdb10) + - fix reCacheRoute. fixed #464  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/464 [(59faf)](https://github.com/soybeanjs/soybean-admin/commit/59faf15) +- **styles**: + - fix FirstLevelMenu style. fixed #450  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/450 [(db64b)](https://github.com/soybeanjs/soybean-admin/commit/db64b0e) + - fix PinToggler style. fixed #451  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/451 [(42b12)](https://github.com/soybeanjs/soybean-admin/commit/42b121a) + +###    🛠 Optimizations + +- **components**: accuracy draggable area for TableColumnSetting with animation  -  by @orangelckc in https://github.com/soybeanjs/soybean-admin/issues/465 [(2aa85)](https://github.com/soybeanjs/soybean-admin/commit/2aa85c6) +- **projects**: unocss border shortcut  -  by @soybeanjs [(40d0f)](https://github.com/soybeanjs/soybean-admin/commit/40d0f8a) + +###    📖 Documentation + +- **projects**: update CHANGELOG  -  by @soybeanjs [(87b18)](https://github.com/soybeanjs/soybean-admin/commit/87b1838) + +###    🏡 Chore + +- **other**: + - correct spell mistake  -  by @orangelckc in https://github.com/soybeanjs/soybean-admin/issues/460 [(086ba)](https://github.com/soybeanjs/soybean-admin/commit/086bad4) + - correct spell mistake  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/462 [(f1850)](https://github.com/soybeanjs/soybean-admin/commit/f185041) +- **projects**: + - update vscode launch.json  -  by @soybeanjs [(4c1c7)](https://github.com/soybeanjs/soybean-admin/commit/4c1c7e6) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)  [![orangelckc](https://github.com/orangelckc.png?size=48)](https://github.com/orangelckc)   + +## [v1.1.2](https://github.com/soybeanjs/soybean-admin/compare/v1.1.1...v1.1.2) (2024-05-24) + +###    🐞 Bug Fixes + +- **projects**: + - fix header style & fix button highlight when click global-tab. fixed #446  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/446 [(64fc0)](https://github.com/soybeanjs/soybean-admin/commit/64fc099) + - fix multi tab page only render once. fixed #441  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/441 [(e379d)](https://github.com/soybeanjs/soybean-admin/commit/e379d6c) + +###    🛠 Optimizations + +- **projects**: optimize code  -  by @honghuangdc [(bc8dc)](https://github.com/soybeanjs/soybean-admin/commit/bc8dc47) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   + +## [v1.1.1](https://github.com/soybeanjs/soybean-admin/compare/v1.1.0...v1.1.1) (2024-05-20) + +###    🚀 Features + +- **hooks**: add setOptions for useEcharts  -  by @honghuangdc [(e4d53)](https://github.com/soybeanjs/soybean-admin/commit/e4d53aa) + +###    🐞 Bug Fixes + +- **projects**: + - fix useRouter. fixed #436  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/436 [(0774a)](https://github.com/soybeanjs/soybean-admin/commit/0774a51) + - add error handle when get routes in dynamic route mode. fixed 440  -  by @honghuangdc [(57b4a)](https://github.com/soybeanjs/soybean-admin/commit/57b4a9d) +- **styles**: + - fix useTable type  -  by @honghuangdc [(07124)](https://github.com/soybeanjs/soybean-admin/commit/071241f) + +###    📖 Documentation + +- **projects**: + - update CHANGELOG  -  by @honghuangdc [(19783)](https://github.com/soybeanjs/soybean-admin/commit/1978397) + - update README.md  -  by @honghuangdc [(fa56e)](https://github.com/soybeanjs/soybean-admin/commit/fa56e9c) + - update README.md  -  by @honghuangdc [(419ea)](https://github.com/soybeanjs/soybean-admin/commit/419ea42) + +###    🏡 Chore + +- **projects**: + - update deps & fix TS error  -  by @honghuangdc [(4ea9c)](https://github.com/soybeanjs/soybean-admin/commit/4ea9c85) + - update eslint-config & fix code  -  by @honghuangdc [(68ea9)](https://github.com/soybeanjs/soybean-admin/commit/68ea974) + - update @elegant-router/vue & add error handle for resolve route. fixed #442  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/442 [(24ff8)](https://github.com/soybeanjs/soybean-admin/commit/24ff852) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   + +## [v1.1.0](https://github.com/honghuangdc/soybean-admin/compare/v1.0.9...v1.1.0) (2024-05-07) + +###    🚀 Features + +- **projects**: + - support grayscale. fixed #385  -  by @honghuangdc in https://github.com/honghuangdc/soybean-admin/issues/385 [(d335d)](https://github.com/honghuangdc/soybean-admin/commit/d335df6) + - Add prefix to local storage  -  by **Azir** [(1fc34)](https://github.com/honghuangdc/soybean-admin/commit/1fc34cc) + - add table showTotal options  -  by **paynezhuang** [(3e61e)](https://github.com/honghuangdc/soybean-admin/commit/3e61eab) + - add recommend color switch. closed #388  -  by @honghuangdc in https://github.com/honghuangdc/soybean-admin/issues/388 [(a1920)](https://github.com/honghuangdc/soybean-admin/commit/a1920fc) + - add menu route field  -  by **paynezhuang** [(dbe31)](https://github.com/honghuangdc/soybean-admin/commit/dbe31eb) + - support repeated request errors occur once in a short time. close #368, close #369  -  by @honghuangdc in https://github.com/honghuangdc/soybean-admin/issues/368 and https://github.com/honghuangdc/soybean-admin/issues/369 [(e3bd3)](https://github.com/honghuangdc/soybean-admin/commit/e3bd397) + - close tab by mouse wheel button click  -  by **JianJroh** [(d3849)](https://github.com/honghuangdc/soybean-admin/commit/d3849ba) + - page: support manage_menu more options. close #366  -  by @honghuangdc in https://github.com/honghuangdc/soybean-admin/issues/366 [(c4b5c)](https://github.com/honghuangdc/soybean-admin/commit/c4b5c65) + - useTable adds expand to display  -  by **paynezhuang** [(0a90d)](https://github.com/honghuangdc/soybean-admin/commit/0a90dd3) + +###    🐞 Bug Fixes + +- **projects**: + - menu fixedIndexInTab default null  -  by **paynezhuang** [(3d10e)](https://github.com/honghuangdc/soybean-admin/commit/3d10ef1) + - fix menu-toggler zIndex  -  by @honghuangdc [(7bd43)](https://github.com/honghuangdc/soybean-admin/commit/7bd43df) + - fix manage_menu modal style  -  by @honghuangdc [(60f3b)](https://github.com/honghuangdc/soybean-admin/commit/60f3b14) + - fix menu data when role is changed. fixed #391  -  by @honghuangdc in https://github.com/honghuangdc/soybean-admin/issues/391 [(3b47b)](https://github.com/honghuangdc/soybean-admin/commit/3b47b5a) + +###    🛠 Optimizations + +- **projects**: remove deprecated code  -  by @honghuangdc [(72ccb)](https://github.com/honghuangdc/soybean-admin/commit/72ccb6b) + +###    💅 Refactors + +- **projects**: + - refactor @sa/color-palette => @sa/color & perf @sa/utils  -  by @honghuangdc [(34999)](https://github.com/honghuangdc/soybean-admin/commit/3499997) + - menu-operate-drawer => menu-operate-modal  -  by @honghuangdc [(003e1)](https://github.com/honghuangdc/soybean-admin/commit/003e145) + +###    📖 Documentation + +- **projects**: + - add CHANGELOG.zh_CN.md  -  by @honghuangdc [(18b3f)](https://github.com/honghuangdc/soybean-admin/commit/18b3f05) + - update CHANGELOG  -  by @honghuangdc [(4d17c)](https://github.com/honghuangdc/soybean-admin/commit/4d17cfd) + +###    🏡 Chore + +- **deps**: + - update deps  -  by @honghuangdc [(1cb38)](https://github.com/honghuangdc/soybean-admin/commit/1cb3816) + - update deps  -  by @honghuangdc [(599b4)](https://github.com/honghuangdc/soybean-admin/commit/599b4e1) +- **projects**: + - merge main to v1.1.0  -  by @honghuangdc [(ebe55)](https://github.com/honghuangdc/soybean-admin/commit/ebe55af) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   +[paynezhuang](mailto:paynezhuang@gmail.com), [JianJroh](mailto:rhjian@foxmail.com), [Azir](mailto:2075125282@qq.com) + +## [v1.1.0-beta.2](https://github.com/honghuangdc/soybean-admin/compare/v1.1.0-beta.1...v1.1.0-beta.2) (2024-05-07) + +###    🚀 Features + +- **projects**: useTable adds expand to display  -  by **paynezhuang** [(0a90d)](https://github.com/honghuangdc/soybean-admin/commit/0a90dd3) + +###    🐞 Bug Fixes + +- **projects**: + - fix manage_menu modal style  -  by @honghuangdc [(60f3b)](https://github.com/honghuangdc/soybean-admin/commit/60f3b14) + - fix menu data when role is changed. fixed #391  -  by @honghuangdc in https://github.com/honghuangdc/soybean-admin/issues/391 [(3b47b)](https://github.com/honghuangdc/soybean-admin/commit/3b47b5a) + +###    🛠 Optimizations + +- **projects**: remove deprecated code  -  by @honghuangdc [(72ccb)](https://github.com/honghuangdc/soybean-admin/commit/72ccb6b) + +###    📖 Documentation + +- **projects**: add CHANGELOG.zh_CN.md  -  by @honghuangdc [(18b3f)](https://github.com/honghuangdc/soybean-admin/commit/18b3f05) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   +[paynezhuang](mailto:paynezhuang@gmail.com) + +## [v1.1.0-beta.1](https://github.com/soybeanjs/soybean-admin/compare/v1.0.9...v1.1.0-beta.1) (2024-05-07) + +###    🚀 Features + +- **projects**: + - support grayscale. fixed #385  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/385 [(d335d)](https://github.com/soybeanjs/soybean-admin/commit/d335df6) + - Add prefix to local storage  -  by **Azir** [(1fc34)](https://github.com/soybeanjs/soybean-admin/commit/1fc34cc) + - add table showTotal options  -  by **paynezhuang** [(3e61e)](https://github.com/soybeanjs/soybean-admin/commit/3e61eab) + - add recommend color switch. closed #388  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/388 [(a1920)](https://github.com/soybeanjs/soybean-admin/commit/a1920fc) + - add menu route field  -  by **paynezhuang** [(dbe31)](https://github.com/soybeanjs/soybean-admin/commit/dbe31eb) + - support repeated request errors occur once in a short time. close #368, close #369  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/368 and https://github.com/soybeanjs/soybean-admin/issues/369 [(e3bd3)](https://github.com/soybeanjs/soybean-admin/commit/e3bd397) + - close tab by mouse wheel button click  -  by **JianJroh** [(d3849)](https://github.com/soybeanjs/soybean-admin/commit/d3849ba) + - page: support manage_menu more options. close #366  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/366 [(c4b5c)](https://github.com/soybeanjs/soybean-admin/commit/c4b5c65) + +###    🐞 Bug Fixes + +- **projects**: + - menu fixedIndexInTab default null  -  by **paynezhuang** [(3d10e)](https://github.com/soybeanjs/soybean-admin/commit/3d10ef1) + - fix menu-toggler zIndex  -  by @honghuangdc [(7bd43)](https://github.com/soybeanjs/soybean-admin/commit/7bd43df) + +###    💅 Refactors + +- **projects**: + - refactor @sa/color-palette => @sa/color & perf @sa/utils  -  by @honghuangdc [(34999)](https://github.com/soybeanjs/soybean-admin/commit/3499997) + - menu-operate-drawer => menu-operate-modal  -  by @honghuangdc [(003e1)](https://github.com/soybeanjs/soybean-admin/commit/003e145) + +###    🏡 Chore + +- **deps**: + - update deps  -  by @honghuangdc [(1cb38)](https://github.com/soybeanjs/soybean-admin/commit/1cb3816) + - update deps  -  by @honghuangdc [(599b4)](https://github.com/soybeanjs/soybean-admin/commit/599b4e1) +- **projects**: + - merge main to v1.1.0  -  by @honghuangdc [(ebe55)](https://github.com/soybeanjs/soybean-admin/commit/ebe55af) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   +[JianJroh](mailto:rhjian@foxmail.com), [paynezhuang](mailto:paynezhuang@gmail.com), [Azir](mailto:2075125282@qq.com) + +## [v1.0.9](https://github.com/soybeanjs/soybean-admin/compare/v1.0.8...v1.0.9) (2024-05-05) + +###    🚀 Features + +- **packages**: @sa/scripts: add new commit type `optimize` and commit scope `packages`  -  by @honghuangdc [(fbc2e)](https://github.com/soybeanjs/soybean-admin/commit/fbc2e61) + +###    🐞 Bug Fixes + +- **projects**: fix manage page drawer operate about data reset. fixed #415, fixed #417  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/415 and https://github.com/soybeanjs/soybean-admin/issues/417 [(f4513)](https://github.com/soybeanjs/soybean-admin/commit/f4513e1) + +###    📖 Documentation + +- **projects**: + - add ecosystem to README.md  -  by @honghuangdc [(d0f17)](https://github.com/soybeanjs/soybean-admin/commit/d0f17a4) + - add PanisAdmin to README  -  by **paynezhuang** [(ce2a7)](https://github.com/soybeanjs/soybean-admin/commit/ce2a75b) + +###    🏡 Chore + +- **deps**: + - update deps  -  by @honghuangdc [(413a8)](https://github.com/soybeanjs/soybean-admin/commit/413a8b2) + - update deps  -  by @honghuangdc [(734ef)](https://github.com/soybeanjs/soybean-admin/commit/734ef98) +- **projects**: + - update .npmrc  -  by @honghuangdc [(52188)](https://github.com/soybeanjs/soybean-admin/commit/52188d8) + - update vscode settings  -  by @honghuangdc [(c137b)](https://github.com/soybeanjs/soybean-admin/commit/c137b97) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   +[paynezhuang](mailto:paynezhuang@gmail.com) + +## [v1.0.8](https://github.com/soybeanjs/soybean-admin/compare/v1.0.7...v1.0.8) (2024-04-27) + +###    🐞 Bug Fixes + +- **components**: + - fix PinToggler label. fixed #407  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/407 [(c0ed1)](https://github.com/soybeanjs/soybean-admin/commit/c0ed1f2) +- **projects**: + - text level low. #409  -  by **alleycharming** in https://github.com/soybeanjs/soybean-admin/issues/409 [(3ddb1)](https://github.com/soybeanjs/soybean-admin/commit/3ddb17a) + - fix tab fixedIndex as null case  -  by **paynezhuang** [(4708e)](https://github.com/soybeanjs/soybean-admin/commit/4708ede) + - recovery the layout config before is mobile. fixed #408, fixed #361  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/408 and https://github.com/soybeanjs/soybean-admin/issues/361 [(dae2a)](https://github.com/soybeanjs/soybean-admin/commit/dae2aa5) + +###    🔥 Performance + +- **projects**: perf judgement the fixed tab  -  by @honghuangdc [(b3e9b)](https://github.com/soybeanjs/soybean-admin/commit/b3e9bba) + +###    💅 Refactors + +- **projects**: `Soybean Admin` to `SoybeanAdmin`  -  by @honghuangdc [(a8dbc)](https://github.com/soybeanjs/soybean-admin/commit/a8dbc03) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   +[paynezhuang](mailto:paynezhuang@gmail.com), [alleycharming](mailto:alleycharming@gmail.com) + +## [v1.0.7](https://github.com/soybeanjs/soybean-admin/compare/v1.0.6...v1.0.7) (2024-04-25) + +###    🚀 Features + +- **projects**: support iframe page with diffrent url of custom route  -  by @honghuangdc [(da12d)](https://github.com/soybeanjs/soybean-admin/commit/da12d4a) + +###    🏡 Chore + +- **deps**: update deps  -  by @honghuangdc [(fbd80)](https://github.com/soybeanjs/soybean-admin/commit/fbd80c2) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   + +## [v1.0.6](https://github.com/soybeanjs/soybean-admin/compare/v1.0.5...v1.0.6) (2024-04-25) + +###    🚀 Features + +- **hooks**: add state hooks: useRef, useState, useSignal  -  by @honghuangdc [(09f64)](https://github.com/soybeanjs/soybean-admin/commit/09f6464) + +###    🐞 Bug Fixes + +- **projects**: + - added responseType judgment. #396  -  by **alleycharming** in https://github.com/soybeanjs/soybean-admin/issues/396 [(82eab)](https://github.com/soybeanjs/soybean-admin/commit/82eabab) + - supply $t import statement  -  by @honghuangdc [(b2660)](https://github.com/soybeanjs/soybean-admin/commit/b266035) + - fix mix-menu blank. fixed #389 & cache mixMenuFixed  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/389 [(93c7f)](https://github.com/soybeanjs/soybean-admin/commit/93c7ff7) + +###    🔥 Performance + +- **hooks**: + - perf useSignal  -  by @honghuangdc [(5d45c)](https://github.com/soybeanjs/soybean-admin/commit/5d45cef) +- **projects**: + - remove useless prop `title` of `NDrawer`  -  by @honghuangdc [(fdde6)](https://github.com/soybeanjs/soybean-admin/commit/fdde679) + - add tsconfig.json for @sa/color-palette  -  by @honghuangdc [(d460e)](https://github.com/soybeanjs/soybean-admin/commit/d460e5c) + +###    💅 Refactors + +- **hooks**: refactor useSignal, useComputed  -  by @honghuangdc [(3b5e4)](https://github.com/soybeanjs/soybean-admin/commit/3b5e4b3) +- **projects**: useMixMenuContext replace useMixMenu  -  by @honghuangdc [(1e142)](https://github.com/soybeanjs/soybean-admin/commit/1e14293) + +###    🏡 Chore + +- **deps**: + - update deps  -  by @honghuangdc [(e57bf)](https://github.com/soybeanjs/soybean-admin/commit/e57bf0b) +- **projects**: + - use `engines` replace `packageManager`  -  by @honghuangdc [(dcd51)](https://github.com/soybeanjs/soybean-admin/commit/dcd51f4) + - update pnpm version requirement  -  by @honghuangdc [(19e65)](https://github.com/soybeanjs/soybean-admin/commit/19e65c1) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   +[alleycharming](mailto:alleycharming@gmail.com) + +## [v1.0.5](https://github.com/honghuangdc/soybean-admin/compare/v1.0.4...v1.0.5) (2024-04-24) + +###    📖 Documentation + +- **projects**: update CHANGELOG.md  -  by @honghuangdc [(cf5bc)](https://github.com/honghuangdc/soybean-admin/commit/cf5bc88) + +###    🏡 Chore + +- **projects**: + - lower vue version to 3.4.23  -  by @honghuangdc [(b5243)](https://github.com/honghuangdc/soybean-admin/commit/b52432a) + - update pnpm-lock.yaml  -  by @honghuangdc [(516f4)](https://github.com/honghuangdc/soybean-admin/commit/516f46a) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   + +## [v1.0.4](https://github.com/soybeanjs/soybean-admin/compare/v1.0.3...v1.0.4) (2024-04-24) + +###    🐞 Bug Fixes + +- **projects**: + - fix CHANGELOG versions  -  by @honghuangdc [(d9af5)](https://github.com/soybeanjs/soybean-admin/commit/d9af5aa) + - fix disabled page animate  -  by @honghuangdc [(23f28)](https://github.com/soybeanjs/soybean-admin/commit/23f283a) + - fix routes data when role is change. fixed #391  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/391 [(cb83d)](https://github.com/soybeanjs/soybean-admin/commit/cb83d6d) + - fix tabs data when role is change. fixed #392  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/392 [(04aa0)](https://github.com/soybeanjs/soybean-admin/commit/04aa097) + - recovery pnpm-lock.yaml  -  by @honghuangdc [(c6952)](https://github.com/soybeanjs/soybean-admin/commit/c695208) + +###    💅 Refactors + +- **hooks**: refactor @sa/color  -  by @honghuangdc [(93191)](https://github.com/soybeanjs/soybean-admin/commit/9319173) + +###    📖 Documentation + +- **projects**: + - update README.md  -  by @honghuangdc [(5a523)](https://github.com/soybeanjs/soybean-admin/commit/5a5232b) + - update README.md  -  by @honghuangdc [(79d9c)](https://github.com/soybeanjs/soybean-admin/commit/79d9c51) + +###    🏡 Chore + +- **deps**: + - update deps  -  by @honghuangdc [(ac928)](https://github.com/soybeanjs/soybean-admin/commit/ac92817) + - update deps  -  by @honghuangdc [(3ceeb)](https://github.com/soybeanjs/soybean-admin/commit/3ceeb6f) + - update deps  -  by @honghuangdc [(9a669)](https://github.com/soybeanjs/soybean-admin/commit/9a66979) +- **projects**: + - update pnpm version  -  by @honghuangdc [(42e16)](https://github.com/soybeanjs/soybean-admin/commit/42e16a0) + - update deps & update pnpm version & update eslint config  -  by @honghuangdc [(7392b)](https://github.com/soybeanjs/soybean-admin/commit/7392beb) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   + +## [v1.0.3](https://github.com/soybeanjs/soybean-admin/compare/v1.0.2...v1.0.3) (2024-04-16) + +###    🚀 Features + +- **hooks**: deleting the route export of useRoutePush, use vue-router  -  by **paynezhuang** [(c6648)](https://github.com/soybeanjs/soybean-admin/commit/c6648b6) + +###    🐞 Bug Fixes + +- **projects**: + - fix menu edit rules  -  by **paynezhuang** [(00105)](https://github.com/soybeanjs/soybean-admin/commit/001059c) + - fix SvgIcon inheritAttrs warning  -  by @honghuangdc [(efc0e)](https://github.com/soybeanjs/soybean-admin/commit/efc0e25) + - fix axios createRequest: add default state  -  by @honghuangdc [(d6eda)](https://github.com/soybeanjs/soybean-admin/commit/d6eda8f) + - update union-key.d.ts  -  by @honghuangdc [(60bef)](https://github.com/soybeanjs/soybean-admin/commit/60beff7) + - fix update theme color  -  by @honghuangdc [(27c53)](https://github.com/soybeanjs/soybean-admin/commit/27c53cd) + +###    🔥 Performance + +- **projects**: perf code  -  by @honghuangdc [(b7f07)](https://github.com/soybeanjs/soybean-admin/commit/b7f0749) + +###    💅 Refactors + +- **projects**: update naive-ui.d.ts  -  by @honghuangdc [(bb74d)](https://github.com/soybeanjs/soybean-admin/commit/bb74d99) + +###    📖 Documentation + +- **projects**: update README.md  -  by @honghuangdc [(f4a9c)](https://github.com/soybeanjs/soybean-admin/commit/f4a9cf8) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   +[paynezhuang](mailto:paynezhuang@gmail.com) + +## [v1.0.2](https://github.com/soybeanjs/soybean-admin/compare/v1.0.1...v1.0.2) (2024-04-08) + +###    🐞 Bug Fixes + +- **projects**: unify border-radius of Tag. fixed #378  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/378 [(2f15a)](https://github.com/soybeanjs/soybean-admin/commit/2f15a2a) +- **styles**: fix css var is inserted repeatedly  -  by **燕博文** [(769d8)](https://github.com/soybeanjs/soybean-admin/commit/769d84a) + +###    💅 Refactors + +- **projects**: refactor addThemeVarsToHtml  -  by @honghuangdc [(41e47)](https://github.com/soybeanjs/soybean-admin/commit/41e470e) + +###    🏡 Chore + +- **deps**: update deps  -  by @honghuangdc [(a1b48)](https://github.com/soybeanjs/soybean-admin/commit/a1b484a) +- **projects**: disabled unocss eslint rule: order-attributify  -  by @honghuangdc [(1c72d)](https://github.com/soybeanjs/soybean-admin/commit/1c72dc7) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   +[燕博文](mailto:349952469@qq.com) + +## [v1.0.1](https://github.com/soybeanjs/soybean-admin/compare/v1.0.0...v1.0.1) (2024-04-03) + +###    🐞 Bug Fixes + +- **projects**: + - fix flatRequest error type. fixed #376  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/376 [(1ec5e)](https://github.com/soybeanjs/soybean-admin/commit/1ec5ea0) + - add maxWidth for GlobalTab to fix bg with gap. fixed #350  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/350 [(cc539)](https://github.com/soybeanjs/soybean-admin/commit/cc53997) + +###    📖 Documentation + +- **projects**: update README.md  -  by @honghuangdc [(76011)](https://github.com/soybeanjs/soybean-admin/commit/76011af) + +###    🏡 Chore + +- **projects**: + - update deps  -  by @honghuangdc [(4babb)](https://github.com/soybeanjs/soybean-admin/commit/4babbe1) + - update pnpm version  -  by @honghuangdc [(9125c)](https://github.com/soybeanjs/soybean-admin/commit/9125cc9) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   + +## [v1.0.0](https://github.com/soybeanjs/soybean-admin/compare/v0.10.4...v1.0.0) (2024-03-31) + +###    🚀 Features + +- internationalized menu search  -  by **Kori** [(9e115)](https://github.com/soybeanjs/soybean-admin/commit/9e115da) +- **components**: + - enhance the custom strength of the 'TableHeaderOperation' component  -  by **tnt group** [(fdf64)](https://github.com/soybeanjs/soybean-admin/commit/fdf64f7) + - add GlobalSearch components  -  by **燕博文** [(9ea87)](https://github.com/soybeanjs/soybean-admin/commit/9ea8789) +- **hooks**: + - add use-echarts  -  by @honghuangdc [(726ab)](https://github.com/soybeanjs/soybean-admin/commit/726abe4) +- **projects**: + - 1.0 beta  -  by @honghuangdc [(e918a)](https://github.com/soybeanjs/soybean-admin/commit/e918a2c) + - support Vite5  -  by @honghuangdc [(96e4a)](https://github.com/soybeanjs/soybean-admin/commit/96e4aff) + - @sa/axios: createRequest, createFlatRequest, createHookRequest  -  by @honghuangdc [(bac16)](https://github.com/soybeanjs/soybean-admin/commit/bac1632) + - add app loading  -  by @honghuangdc [(c6545)](https://github.com/soybeanjs/soybean-admin/commit/c65451b) + - add copyright, unocss shortcut: card-wrapper, update package.json  -  by @honghuangdc [(affcc)](https://github.com/soybeanjs/soybean-admin/commit/affcc26) + - add page: about  -  by @honghuangdc [(4955f)](https://github.com/soybeanjs/soybean-admin/commit/4955f1a) + - add custom route exception  -  by @honghuangdc [(b43c9)](https://github.com/soybeanjs/soybean-admin/commit/b43c925) + - filter tabs which are not in routes  -  by @honghuangdc [(f59f3)](https://github.com/soybeanjs/soybean-admin/commit/f59f348) + - packages/scripts: add command changelog,release  -  by @honghuangdc [(dafb6)](https://github.com/soybeanjs/soybean-admin/commit/dafb6fa) + - add script: gen-route  -  by @honghuangdc [(697c1)](https://github.com/soybeanjs/soybean-admin/commit/697c1b6) + - @sa/axios: add qs stringify for params  -  by @honghuangdc [(2400c)](https://github.com/soybeanjs/soybean-admin/commit/2400c02) + - page home & perf useEcharts  -  by @honghuangdc [(62e4d)](https://github.com/soybeanjs/soybean-admin/commit/62e4da0) + - finish page home  -  by @honghuangdc [(7bd1e)](https://github.com/soybeanjs/soybean-admin/commit/7bd1e47) + - add page function_tab  -  by @honghuangdc [(6ff86)](https://github.com/soybeanjs/soybean-admin/commit/6ff86e7) + - page manage_role  -  by @honghuangdc [(237c6)](https://github.com/soybeanjs/soybean-admin/commit/237c6d2) + - page manage_user  -  by @honghuangdc [(8a170)](https://github.com/soybeanjs/soybean-admin/commit/8a170ee) + - page manage_menu  -  by @honghuangdc [(87d65)](https://github.com/soybeanjs/soybean-admin/commit/87d65d3) + - page manage_menu operateDrawer  -  by @honghuangdc [(db17c)](https://github.com/soybeanjs/soybean-admin/commit/db17c91) + - Add type to TabRoute: matched  -  by @Azir-11 [(2d102)](https://github.com/soybeanjs/soybean-admin/commit/2d102a0) + - support directory menu hide all child menus. fixed #325  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/325 [(7256a)](https://github.com/soybeanjs/soybean-admin/commit/7256ad4) + - mock manage list data with pagination  -  by @honghuangdc [(1a6be)](https://github.com/soybeanjs/soybean-admin/commit/1a6be00) + - globalSearch add i18n  -  by **燕博文** [(0126d)](https://github.com/soybeanjs/soybean-admin/commit/0126da4) + - Add route meta parameter:fixedQuery  -  by @Azir-11 [(874aa)](https://github.com/soybeanjs/soybean-admin/commit/874aaca) + - update  -  by @honghuangdc [(4158a)](https://github.com/soybeanjs/soybean-admin/commit/4158a72) + - change borderRadius to 6px of naiveUI  -  by @honghuangdc [(49558)](https://github.com/soybeanjs/soybean-admin/commit/49558ca) + - pef manage role  -  by @honghuangdc [(18709)](https://github.com/soybeanjs/soybean-admin/commit/1870981) + - login page: code-login  -  by @honghuangdc [(c91dd)](https://github.com/soybeanjs/soybean-admin/commit/c91dd28) + - login page: register  -  by @honghuangdc [(1ed33)](https://github.com/soybeanjs/soybean-admin/commit/1ed33dc) + - add request refresh token & logout  -  by @honghuangdc [(11a6a)](https://github.com/soybeanjs/soybean-admin/commit/11a6a3b) + - add request exception example page  -  by @honghuangdc [(41e8b)](https://github.com/soybeanjs/soybean-admin/commit/41e8bc4) + - add auth example  -  by @honghuangdc [(c11d5)](https://github.com/soybeanjs/soybean-admin/commit/c11d56d) +- **router**: + - add sortRoutesByOrder function  -  by @Azir-11 [(0cf09)](https://github.com/soybeanjs/soybean-admin/commit/0cf09ba) + +###    🐞 Bug Fixes + +- **components**: + - fix tooltip zIndex of ButtonIcon  -  by @honghuangdc [(99097)](https://github.com/soybeanjs/soybean-admin/commit/99097b4) + - supplement the `NaiveUI` type  -  by **tnt group** [(ccc2b)](https://github.com/soybeanjs/soybean-admin/commit/ccc2b67) + - fix homeTab closeRight and disable colseLeft  -  by **~li** [(d28bf)](https://github.com/soybeanjs/soybean-admin/commit/d28bf52) +- **hooks**: + - Fix Naive Pagination's outdated API  -  by **tnt group** [(37436)](https://github.com/soybeanjs/soybean-admin/commit/3743612) +- **projects**: + - 修复路由命名为包含关系时导致导航数据出错的问题  -  by @Particaly [(76636)](https://github.com/soybeanjs/soybean-admin/commit/766369f) + - rename zh-ch  -  by @honghuangdc [(a8a77)](https://github.com/soybeanjs/soybean-admin/commit/a8a77ea) + - Fix welcome notification not closing  -  by @Azir-11 [(748cf)](https://github.com/soybeanjs/soybean-admin/commit/748cfa2) + - fix i18n vscode settings  -  by @honghuangdc [(fbf4c)](https://github.com/soybeanjs/soybean-admin/commit/fbf4cc4) + - add duration of login success notification  -  by @honghuangdc [(1335d)](https://github.com/soybeanjs/soybean-admin/commit/1335d47) + - fix menu indent  -  by @honghuangdc [(87143)](https://github.com/soybeanjs/soybean-admin/commit/8714317) + - fix theme mode segment  -  by @honghuangdc [(2372d)](https://github.com/soybeanjs/soybean-admin/commit/2372dc9) + - fix app loading theme color  -  by @honghuangdc [(0ba19)](https://github.com/soybeanjs/soybean-admin/commit/0ba19d5) + - fix page about style in mobile  -  by @honghuangdc [(8b6de)](https://github.com/soybeanjs/soybean-admin/commit/8b6de48) + - fix themeDrawer darkMode segement  -  by @honghuangdc [(1b5ca)](https://github.com/soybeanjs/soybean-admin/commit/1b5caa0) + - fix themeDrawer copy  -  by @honghuangdc [(b3779)](https://github.com/soybeanjs/soybean-admin/commit/b3779a6) + - remove space in tab content  -  by @honghuangdc [(4aae6)](https://github.com/soybeanjs/soybean-admin/commit/4aae6a5) + - fix horizontal menu  -  by @honghuangdc [(d886e)](https://github.com/soybeanjs/soybean-admin/commit/d886e50) + - perf card style  -  by @honghuangdc [(c1afb)](https://github.com/soybeanjs/soybean-admin/commit/c1afb9d) + - fix manage_user title  -  by @honghuangdc [(7770b)](https://github.com/soybeanjs/soybean-admin/commit/7770b37) + - default proxy prefix  -  by @smileluck [(da246)](https://github.com/soybeanjs/soybean-admin/commit/da24642) + - fix request msg  -  by @honghuangdc [(ae6b6)](https://github.com/soybeanjs/soybean-admin/commit/ae6b613) + - Fix the issue of tab error displaying parent localIcon  -  by @Azir-11 [(a9c98)](https://github.com/soybeanjs/soybean-admin/commit/a9c98d9) + - The matched value of TabRoute should be optional  -  by @Azir-11 [(e6fed)](https://github.com/soybeanjs/soybean-admin/commit/e6fed1f) + - fix build [unocss]: build failed to load icon "close", fixed #319  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/319 [(c18d8)](https://github.com/soybeanjs/soybean-admin/commit/c18d82f) + - fix resolve alias  -  by @honghuangdc [(3bdcb)](https://github.com/soybeanjs/soybean-admin/commit/3bdcbc7) + - Missing default value for tab icon  -  by @Azir-11 [(72a46)](https://github.com/soybeanjs/soybean-admin/commit/72a4679) + - add route icon: fucntion_hide-child  -  by @honghuangdc [(0a3ef)](https://github.com/soybeanjs/soybean-admin/commit/0a3efe3) + - fix table x-scroll. fixed #324  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/324 [(c7e2c)](https://github.com/soybeanjs/soybean-admin/commit/c7e2c55) + - Fix the logic of root route redirection to home  -  by **恕瑞玛的皇帝** [(0123c)](https://github.com/soybeanjs/soybean-admin/commit/0123c37) + - Fix homepage mount error under dynamic routing  -  by **恕瑞玛的皇帝** [(9cf2a)](https://github.com/soybeanjs/soybean-admin/commit/9cf2a51) + - fix repeat home tab  -  by @honghuangdc [(bccd6)](https://github.com/soybeanjs/soybean-admin/commit/bccd6cb) + - fix proxy config  -  by @honghuangdc [(c8019)](https://github.com/soybeanjs/soybean-admin/commit/c8019c4) + - fix proxy config  -  by @honghuangdc [(ffc95)](https://github.com/soybeanjs/soybean-admin/commit/ffc95d2) + - fix table row-key ts type  -  by @honghuangdc [(0cc8f)](https://github.com/soybeanjs/soybean-admin/commit/0cc8f05) + - fix class name conflict with unocss icon  -  by @honghuangdc [(455e4)](https://github.com/soybeanjs/soybean-admin/commit/455e48f) + - fix repeat routes  -  by @honghuangdc [(2c543)](https://github.com/soybeanjs/soybean-admin/commit/2c543f1) + - fix route init  -  by @honghuangdc [(23a40)](https://github.com/soybeanjs/soybean-admin/commit/23a4098) + - fix pin-toggler toolTip zIndex  -  by @honghuangdc [(f89e6)](https://github.com/soybeanjs/soybean-admin/commit/f89e6c0) + +###    🔥 Performance + +- **components**: + - Optimize internationalized menu search code  -  by **燕博文** [(8c1ef)](https://github.com/soybeanjs/soybean-admin/commit/8c1ef4b) + - Optimize menu search code  -  by **燕博文** [(296a2)](https://github.com/soybeanjs/soybean-admin/commit/296a2d2) + - perf count-to  -  by @honghuangdc [(b2c61)](https://github.com/soybeanjs/soybean-admin/commit/b2c61f0) + - components name is converted to uppercase  -  by **燕博文** [(04aa1)](https://github.com/soybeanjs/soybean-admin/commit/04aa10b) + - perf global-search  -  by @honghuangdc [(72745)](https://github.com/soybeanjs/soybean-admin/commit/7274522) +- **projects**: + - perf code  -  by @honghuangdc [(8081e)](https://github.com/soybeanjs/soybean-admin/commit/8081e19) + - env config  -  by @honghuangdc [(1bac3)](https://github.com/soybeanjs/soybean-admin/commit/1bac3b7) + - add detailed annotations for route role  -  by @honghuangdc [(f6bab)](https://github.com/soybeanjs/soybean-admin/commit/f6bab0c) + - perf code  -  by @honghuangdc [(5c49d)](https://github.com/soybeanjs/soybean-admin/commit/5c49d24) + - remove useless file  -  by @honghuangdc [(c624f)](https://github.com/soybeanjs/soybean-admin/commit/c624f32) + - remove @soybeanjs/cli  -  by @honghuangdc [(41349)](https://github.com/soybeanjs/soybean-admin/commit/4134955) + - echarts loading style  -  by @honghuangdc [(456c3)](https://github.com/soybeanjs/soybean-admin/commit/456c318) + - perf page manage_role, useTable  -  by @honghuangdc [(39aa7)](https://github.com/soybeanjs/soybean-admin/commit/39aa7aa) + - perf table columns style  -  by @honghuangdc [(babdb)](https://github.com/soybeanjs/soybean-admin/commit/babdb5d) + - perf page manage_menu style  -  by @honghuangdc [(0aa75)](https://github.com/soybeanjs/soybean-admin/commit/0aa75c0) + - perf code  -  by @honghuangdc [(7fa87)](https://github.com/soybeanjs/soybean-admin/commit/7fa87f5) + - perf code  -  by @honghuangdc [(05db8)](https://github.com/soybeanjs/soybean-admin/commit/05db8c0) + - perf code  -  by @honghuangdc [(dc24a)](https://github.com/soybeanjs/soybean-admin/commit/dc24a36) + - perf manage page style  -  by @honghuangdc [(779ba)](https://github.com/soybeanjs/soybean-admin/commit/779ba4e) + - perf manage menu  -  by @honghuangdc [(71f2c)](https://github.com/soybeanjs/soybean-admin/commit/71f2c55) + - manage menu: add transform to component  -  by @honghuangdc [(0abbf)](https://github.com/soybeanjs/soybean-admin/commit/0abbfa5) + - perf code  -  by @honghuangdc [(a0bad)](https://github.com/soybeanjs/soybean-admin/commit/a0bad57) + +###    💅 Refactors + +- **projects**: + - remove plugin-web-update-notification  -  by @honghuangdc [(f6c6d)](https://github.com/soybeanjs/soybean-admin/commit/f6c6dbd) + - fix conflict with locale file  -  by @honghuangdc [(3346b)](https://github.com/soybeanjs/soybean-admin/commit/3346bcd) + - refactor app-loading  -  by @honghuangdc [(b4f3d)](https://github.com/soybeanjs/soybean-admin/commit/b4f3dd2) + - use naive-ui color-picker  -  by @honghuangdc [(b5551)](https://github.com/soybeanjs/soybean-admin/commit/b5551d6) + - perf page home  -  by @honghuangdc [(4c61c)](https://github.com/soybeanjs/soybean-admin/commit/4c61c6f) + - login components => modules  -  by @honghuangdc [(59bec)](https://github.com/soybeanjs/soybean-admin/commit/59bec2d) + - perf page function_tab  -  by @honghuangdc [(b5477)](https://github.com/soybeanjs/soybean-admin/commit/b5477e8) + - update mock api  -  by @honghuangdc [(27241)](https://github.com/soybeanjs/soybean-admin/commit/2724169) + - page manage_role: extract module  -  by @honghuangdc [(0e9e2)](https://github.com/soybeanjs/soybean-admin/commit/0e9e2e1) + - perf page manage_role  -  by @honghuangdc [(a19f8)](https://github.com/soybeanjs/soybean-admin/commit/a19f895) + - manage_route => manage_menu  -  by @honghuangdc [(f8467)](https://github.com/soybeanjs/soybean-admin/commit/f8467ce) + - refactor service env config  -  by @honghuangdc [(43193)](https://github.com/soybeanjs/soybean-admin/commit/43193e2) + - refactor unocss shortcuts: wh-full => size-full  -  by @honghuangdc [(b4c00)](https://github.com/soybeanjs/soybean-admin/commit/b4c00ce) + - use enquirer replace prompts  -  by @honghuangdc [(b546f)](https://github.com/soybeanjs/soybean-admin/commit/b546ff8) + - refactor useTable  -  by @honghuangdc [(c3efa)](https://github.com/soybeanjs/soybean-admin/commit/c3efa1b) + - finish refactor useTable  -  by @honghuangdc [(86301)](https://github.com/soybeanjs/soybean-admin/commit/8630175) + - finish refactor useTable and apply  -  by @honghuangdc [(3fd15)](https://github.com/soybeanjs/soybean-admin/commit/3fd15e5) + - perf code  -  by @honghuangdc [(f91ef)](https://github.com/soybeanjs/soybean-admin/commit/f91ef30) + - new route guard  -  by @honghuangdc [(37d20)](https://github.com/soybeanjs/soybean-admin/commit/37d20b8) + +###    📖 Documentation + +- **projects**: + - update README.md  -  by @honghuangdc [(78364)](https://github.com/soybeanjs/soybean-admin/commit/783648f) + - update README.md  -  by @honghuangdc [(1ea48)](https://github.com/soybeanjs/soybean-admin/commit/1ea4817) + - add README  -  by @honghuangdc [(2371b)](https://github.com/soybeanjs/soybean-admin/commit/2371ba8) + - update README  -  by @honghuangdc [(d16a9)](https://github.com/soybeanjs/soybean-admin/commit/d16a9d5) + - update README.md  -  by @honghuangdc [(6a771)](https://github.com/soybeanjs/soybean-admin/commit/6a771ea) + - update README.md  -  by @honghuangdc [(57b6d)](https://github.com/soybeanjs/soybean-admin/commit/57b6d8a) + - update README.md  -  by @honghuangdc [(b30c0)](https://github.com/soybeanjs/soybean-admin/commit/b30c035) + - update README.md  -  by @honghuangdc [(c260f)](https://github.com/soybeanjs/soybean-admin/commit/c260fe2) + - update README.md  -  by @honghuangdc [(03c42)](https://github.com/soybeanjs/soybean-admin/commit/03c42aa) + - update README.md  -  by @honghuangdc [(0fae9)](https://github.com/soybeanjs/soybean-admin/commit/0fae993) + - update README.md  -  by @honghuangdc [(4e4d2)](https://github.com/soybeanjs/soybean-admin/commit/4e4d2de) + - update README.md  -  by @honghuangdc [(86b44)](https://github.com/soybeanjs/soybean-admin/commit/86b445c) + - update README.md  -  by @honghuangdc [(e2085)](https://github.com/soybeanjs/soybean-admin/commit/e2085e0) + - update README.md  -  by @honghuangdc [(6ea9b)](https://github.com/soybeanjs/soybean-admin/commit/6ea9b85) + - update README.md  -  by @honghuangdc [(ef4af)](https://github.com/soybeanjs/soybean-admin/commit/ef4af79) + - update README.md  -  by @honghuangdc [(41830)](https://github.com/soybeanjs/soybean-admin/commit/418302a) + - add CHANGELOG.md  -  by @honghuangdc [(46b61)](https://github.com/soybeanjs/soybean-admin/commit/46b6156) + - add communication  -  by @honghuangdc [(8c7ea)](https://github.com/soybeanjs/soybean-admin/commit/8c7ea23) + - update README.md  -  by @honghuangdc [(07d8d)](https://github.com/soybeanjs/soybean-admin/commit/07d8d25) + - update README.md  -  by @honghuangdc [(1a707)](https://github.com/soybeanjs/soybean-admin/commit/1a7070f) + - update README.md  -  by @honghuangdc [(f69e1)](https://github.com/soybeanjs/soybean-admin/commit/f69e152) + +###    🏡 Chore + +- **deps**: + - update deps  -  by @honghuangdc [(3eaf0)](https://github.com/soybeanjs/soybean-admin/commit/3eaf05b) + - update deps  -  by @honghuangdc [(36fe1)](https://github.com/soybeanjs/soybean-admin/commit/36fe1da) + - update deps  -  by @honghuangdc [(55342)](https://github.com/soybeanjs/soybean-admin/commit/5534294) + - update deps  -  by @honghuangdc [(f1b86)](https://github.com/soybeanjs/soybean-admin/commit/f1b86cc) + - update deps  -  by @honghuangdc [(840e7)](https://github.com/soybeanjs/soybean-admin/commit/840e7f9) + - update deps  -  by @honghuangdc [(6114b)](https://github.com/soybeanjs/soybean-admin/commit/6114b9f) + - update deps  -  by @honghuangdc [(9cc7e)](https://github.com/soybeanjs/soybean-admin/commit/9cc7ee5) + - update deps  -  by @honghuangdc [(9c4ba)](https://github.com/soybeanjs/soybean-admin/commit/9c4ba66) + - update deps  -  by @honghuangdc [(fb3b9)](https://github.com/soybeanjs/soybean-admin/commit/fb3b94b) + - update deps  -  by @honghuangdc [(14aa8)](https://github.com/soybeanjs/soybean-admin/commit/14aa856) + - update deps  -  by @honghuangdc [(02d4b)](https://github.com/soybeanjs/soybean-admin/commit/02d4b0a) + - update deps  -  by @honghuangdc [(b2ee9)](https://github.com/soybeanjs/soybean-admin/commit/b2ee9ee) + - update deps  -  by @honghuangdc [(0fee1)](https://github.com/soybeanjs/soybean-admin/commit/0fee104) + - update deps  -  by @honghuangdc [(c0a65)](https://github.com/soybeanjs/soybean-admin/commit/c0a65a1) + - update deps  -  by @honghuangdc [(6b513)](https://github.com/soybeanjs/soybean-admin/commit/6b5132c) + - update deps  -  by @honghuangdc [(82b53)](https://github.com/soybeanjs/soybean-admin/commit/82b53d7) +- **project**: + - delete src/locales/lang/zh-CN.ts  -  by @honghuangdc [(377db)](https://github.com/soybeanjs/soybean-admin/commit/377db82) +- **projects**: + - use eslint flat config & update config  -  by @honghuangdc [(a176d)](https://github.com/soybeanjs/soybean-admin/commit/a176dc4) + - update @sa/scripts  -  by @honghuangdc [(d7785)](https://github.com/soybeanjs/soybean-admin/commit/d778560) + - update pnpm version  -  by @honghuangdc [(55f76)](https://github.com/soybeanjs/soybean-admin/commit/55f7638) + - update eslint config  -  by @honghuangdc [(5023f)](https://github.com/soybeanjs/soybean-admin/commit/5023f37) + - lock deps versions  -  by @honghuangdc [(a24f9)](https://github.com/soybeanjs/soybean-admin/commit/a24f963) + - update pnpm version  -  by @honghuangdc [(ea02b)](https://github.com/soybeanjs/soybean-admin/commit/ea02b23) + - remove @simonwep/pickr  -  by @honghuangdc [(502a4)](https://github.com/soybeanjs/soybean-admin/commit/502a4d2) + - remove soybean.svg  -  by @honghuangdc [(4031f)](https://github.com/soybeanjs/soybean-admin/commit/4031faf) + - update pnpm version  -  by @honghuangdc [(adec0)](https://github.com/soybeanjs/soybean-admin/commit/adec0d7) + - update deps & fix keep-alive  -  by @honghuangdc [(13001)](https://github.com/soybeanjs/soybean-admin/commit/13001bc) + - update @elegant-router/vue, fix inject name in windows  -  by @honghuangdc [(0b56e)](https://github.com/soybeanjs/soybean-admin/commit/0b56e44) + - add dev and build command with service env  -  by @honghuangdc [(ebb15)](https://github.com/soybeanjs/soybean-admin/commit/ebb1548) + - update deps & remove packages docs  -  by @honghuangdc [(57963)](https://github.com/soybeanjs/soybean-admin/commit/579636b) + - update pnpm-lock.yaml  -  by @honghuangdc [(147f6)](https://github.com/soybeanjs/soybean-admin/commit/147f60d) + - update repository url  -  by @honghuangdc [(806a1)](https://github.com/soybeanjs/soybean-admin/commit/806a1cb) + - update deps & update pnpm version  -  by @honghuangdc [(9772a)](https://github.com/soybeanjs/soybean-admin/commit/9772aec) + - add unocss eslint config  -  by @honghuangdc [(40635)](https://github.com/soybeanjs/soybean-admin/commit/4063529) + - update launch.json  -  by @honghuangdc [(3db82)](https://github.com/soybeanjs/soybean-admin/commit/3db82ac) + - update vscode extensions.json  -  by @honghuangdc [(4e29a)](https://github.com/soybeanjs/soybean-admin/commit/4e29aca) + - update pnpm version  -  by @honghuangdc [(7065f)](https://github.com/soybeanjs/soybean-admin/commit/7065f6f) + - update deps & fix eslint vue rule  -  by @honghuangdc [(8143b)](https://github.com/soybeanjs/soybean-admin/commit/8143b00) + - update pnpm version  -  by @honghuangdc [(6ad51)](https://github.com/soybeanjs/soybean-admin/commit/6ad51e9) + - add .gitattributes  -  by @honghuangdc [(c0009)](https://github.com/soybeanjs/soybean-admin/commit/c000920) + +###    🎨 Styles + +- **components**: + - Uniform icon size for header  -  by @Azir-11 [(b37c1)](https://github.com/soybeanjs/soybean-admin/commit/b37c1e9) +- **projects**: + - format code  -  by @honghuangdc [(a7481)](https://github.com/soybeanjs/soybean-admin/commit/a748166) + - update theme mode segment height  -  by @honghuangdc [(4d846)](https://github.com/soybeanjs/soybean-admin/commit/4d8469e) + - fix tooltip zIndex of ButtonIcon  -  by @honghuangdc [(db747)](https://github.com/soybeanjs/soybean-admin/commit/db747c4) + - sort defineProps, defineEmits with TS type  -  by @honghuangdc [(123fd)](https://github.com/soybeanjs/soybean-admin/commit/123fd4f) + +###    🤖 CI + +- **projects**: + - add github actions config  -  by @honghuangdc [(4cb17)](https://github.com/soybeanjs/soybean-admin/commit/4cb17c7) + - update release.yml  -  by @honghuangdc [(7b298)](https://github.com/soybeanjs/soybean-admin/commit/7b298c6) + - add issue template  -  by @honghuangdc [(06e20)](https://github.com/soybeanjs/soybean-admin/commit/06e204a) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)  [![smileluck](https://github.com/smileluck.png?size=48)](https://github.com/smileluck)  [![Particaly](https://github.com/Particaly.png?size=48)](https://github.com/Particaly)   +[~li](mailto:miciili-02@outlook.com), [Azir-11](mailto:2075125282@qq.com), [燕博文](mailto:349952469@qq.com), [tnt group](mailto:dodu@live.cn), [Kori](mailto:kexin@korix.top),  + +## [v1.0.0-beta.3](https://github.com/soybeanjs/soybean-admin/compare/v1.0.0-beta.2...v1.0.0-beta.3) (2024-03-31) + +###    📖 Documentation + +- **projects**: update README.md  -  by @honghuangdc [(f69e1)](https://github.com/soybeanjs/soybean-admin/commit/f69e152) + +###    🏡 Chore + +- **deps**: update deps  -  by @honghuangdc [(82b53)](https://github.com/soybeanjs/soybean-admin/commit/82b53d7) +- **projects**: add .gitattributes  -  by @honghuangdc [(c0009)](https://github.com/soybeanjs/soybean-admin/commit/c000920) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   + +## [v1.0.0-beta.2](https://github.com/soybeanjs/soybean-admin/compare/v1.0.0-beta.1...v1.0.0-beta.2) (2024-03-27) + +###    🐞 Bug Fixes + +- **projects**: fix pin-toggler toolTip zIndex  -  by @honghuangdc [(f89e6)](https://github.com/soybeanjs/soybean-admin/commit/f89e6c0) + +###    🔥 Performance + +- **projects**: perf code  -  by @honghuangdc [(a0bad)](https://github.com/soybeanjs/soybean-admin/commit/a0bad57) + +###    📖 Documentation + +- **projects**: + - add communication  -  by @honghuangdc [(8c7ea)](https://github.com/soybeanjs/soybean-admin/commit/8c7ea23) + - update README.md  -  by @honghuangdc [(07d8d)](https://github.com/soybeanjs/soybean-admin/commit/07d8d25) + - update README.md  -  by @honghuangdc [(1a707)](https://github.com/soybeanjs/soybean-admin/commit/1a7070f) + +###    🏡 Chore + +- **deps**: update deps  -  by @honghuangdc [(6b513)](https://github.com/soybeanjs/soybean-admin/commit/6b5132c) + +###    🤖 CI + +- **projects**: + - update release.yml  -  by @honghuangdc [(7b298)](https://github.com/soybeanjs/soybean-admin/commit/7b298c6) + - add issue template  -  by @honghuangdc [(06e20)](https://github.com/soybeanjs/soybean-admin/commit/06e204a) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   + +## [v1.0.0-beta.1](https://github.com/soybeanjs/soybean-admin/compare/v0.10.4...v1.0.0-beta.1) (2024-03-25) + +###    🚀 Features + +- internationalized menu search  -  by **Kori** [(9e115)](https://github.com/soybeanjs/soybean-admin/commit/9e115da) +- **components**: + - enhance the custom strength of the 'TableHeaderOperation' component  -  by **tnt group** [(fdf64)](https://github.com/soybeanjs/soybean-admin/commit/fdf64f7) + - add GlobalSearch components  -  by **燕博文** [(9ea87)](https://github.com/soybeanjs/soybean-admin/commit/9ea8789) +- **hooks**: + - add use-echarts  -  by @honghuangdc [(726ab)](https://github.com/soybeanjs/soybean-admin/commit/726abe4) +- **projects**: + - 1.0 beta  -  by @honghuangdc [(e918a)](https://github.com/soybeanjs/soybean-admin/commit/e918a2c) + - support Vite5  -  by @honghuangdc [(96e4a)](https://github.com/soybeanjs/soybean-admin/commit/96e4aff) + - @sa/axios: createRequest, createFlatRequest, createHookRequest  -  by @honghuangdc [(bac16)](https://github.com/soybeanjs/soybean-admin/commit/bac1632) + - add app loading  -  by @honghuangdc [(c6545)](https://github.com/soybeanjs/soybean-admin/commit/c65451b) + - add copyright, unocss shortcut: card-wrapper, update package.json  -  by @honghuangdc [(affcc)](https://github.com/soybeanjs/soybean-admin/commit/affcc26) + - add page: about  -  by @honghuangdc [(4955f)](https://github.com/soybeanjs/soybean-admin/commit/4955f1a) + - add custom route exception  -  by @honghuangdc [(b43c9)](https://github.com/soybeanjs/soybean-admin/commit/b43c925) + - filter tabs which are not in routes  -  by @honghuangdc [(f59f3)](https://github.com/soybeanjs/soybean-admin/commit/f59f348) + - packages/scripts: add command changelog,release  -  by @honghuangdc [(dafb6)](https://github.com/soybeanjs/soybean-admin/commit/dafb6fa) + - add script: gen-route  -  by @honghuangdc [(697c1)](https://github.com/soybeanjs/soybean-admin/commit/697c1b6) + - @sa/axios: add qs stringify for params  -  by @honghuangdc [(2400c)](https://github.com/soybeanjs/soybean-admin/commit/2400c02) + - page home & perf useEcharts  -  by @honghuangdc [(62e4d)](https://github.com/soybeanjs/soybean-admin/commit/62e4da0) + - finish page home  -  by @honghuangdc [(7bd1e)](https://github.com/soybeanjs/soybean-admin/commit/7bd1e47) + - add page function_tab  -  by @honghuangdc [(6ff86)](https://github.com/soybeanjs/soybean-admin/commit/6ff86e7) + - page manage_role  -  by @honghuangdc [(237c6)](https://github.com/soybeanjs/soybean-admin/commit/237c6d2) + - page manage_user  -  by @honghuangdc [(8a170)](https://github.com/soybeanjs/soybean-admin/commit/8a170ee) + - page manage_menu  -  by @honghuangdc [(87d65)](https://github.com/soybeanjs/soybean-admin/commit/87d65d3) + - page manage_menu operateDrawer  -  by @honghuangdc [(db17c)](https://github.com/soybeanjs/soybean-admin/commit/db17c91) + - Add type to TabRoute: matched  -  by @Azir-11 [(2d102)](https://github.com/soybeanjs/soybean-admin/commit/2d102a0) + - support directory menu hide all child menus. fixed #325  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/325 [(7256a)](https://github.com/soybeanjs/soybean-admin/commit/7256ad4) + - mock manage list data with pagination  -  by @honghuangdc [(1a6be)](https://github.com/soybeanjs/soybean-admin/commit/1a6be00) + - globalSearch add i18n  -  by **燕博文** [(0126d)](https://github.com/soybeanjs/soybean-admin/commit/0126da4) + - Add route meta parameter:fixedQuery  -  by @Azir-11 [(874aa)](https://github.com/soybeanjs/soybean-admin/commit/874aaca) + - update  -  by @honghuangdc [(4158a)](https://github.com/soybeanjs/soybean-admin/commit/4158a72) + - change borderRadius to 6px of naiveUI  -  by @honghuangdc [(49558)](https://github.com/soybeanjs/soybean-admin/commit/49558ca) + - pef manage role  -  by @honghuangdc [(18709)](https://github.com/soybeanjs/soybean-admin/commit/1870981) + - login page: code-login  -  by @honghuangdc [(c91dd)](https://github.com/soybeanjs/soybean-admin/commit/c91dd28) + - login page: register  -  by @honghuangdc [(1ed33)](https://github.com/soybeanjs/soybean-admin/commit/1ed33dc) + - add request refresh token & logout  -  by @honghuangdc [(11a6a)](https://github.com/soybeanjs/soybean-admin/commit/11a6a3b) + - add request exception example page  -  by @honghuangdc [(41e8b)](https://github.com/soybeanjs/soybean-admin/commit/41e8bc4) + - add auth example  -  by @honghuangdc [(c11d5)](https://github.com/soybeanjs/soybean-admin/commit/c11d56d) +- **router**: + - add sortRoutesByOrder function  -  by @Azir-11 [(0cf09)](https://github.com/soybeanjs/soybean-admin/commit/0cf09ba) + +###    🐞 Bug Fixes + +- **components**: + - fix tooltip zIndex of ButtonIcon  -  by @honghuangdc [(99097)](https://github.com/soybeanjs/soybean-admin/commit/99097b4) + - supplement the `NaiveUI` type  -  by **tnt group** [(ccc2b)](https://github.com/soybeanjs/soybean-admin/commit/ccc2b67) + - fix homeTab closeRight and disable colseLeft  -  by **~li** [(d28bf)](https://github.com/soybeanjs/soybean-admin/commit/d28bf52) +- **hooks**: + - Fix Naive Pagination's outdated API  -  by **tnt group** [(37436)](https://github.com/soybeanjs/soybean-admin/commit/3743612) +- **projects**: + - 修复路由命名为包含关系时导致导航数据出错的问题  -  by **pantao** [(76636)](https://github.com/soybeanjs/soybean-admin/commit/766369f) + - rename zh-ch  -  by @honghuangdc [(a8a77)](https://github.com/soybeanjs/soybean-admin/commit/a8a77ea) + - Fix welcome notification not closing  -  by @Azir-11 [(748cf)](https://github.com/soybeanjs/soybean-admin/commit/748cfa2) + - fix i18n vscode settings  -  by @honghuangdc [(fbf4c)](https://github.com/soybeanjs/soybean-admin/commit/fbf4cc4) + - add duration of login success notification  -  by @honghuangdc [(1335d)](https://github.com/soybeanjs/soybean-admin/commit/1335d47) + - fix menu indent  -  by @honghuangdc [(87143)](https://github.com/soybeanjs/soybean-admin/commit/8714317) + - fix theme mode segment  -  by @honghuangdc [(2372d)](https://github.com/soybeanjs/soybean-admin/commit/2372dc9) + - fix app loading theme color  -  by @honghuangdc [(0ba19)](https://github.com/soybeanjs/soybean-admin/commit/0ba19d5) + - fix page about style in mobile  -  by @honghuangdc [(8b6de)](https://github.com/soybeanjs/soybean-admin/commit/8b6de48) + - fix themeDrawer darkMode segement  -  by @honghuangdc [(1b5ca)](https://github.com/soybeanjs/soybean-admin/commit/1b5caa0) + - fix themeDrawer copy  -  by @honghuangdc [(b3779)](https://github.com/soybeanjs/soybean-admin/commit/b3779a6) + - remove space in tab content  -  by @honghuangdc [(4aae6)](https://github.com/soybeanjs/soybean-admin/commit/4aae6a5) + - fix horizontal menu  -  by @honghuangdc [(d886e)](https://github.com/soybeanjs/soybean-admin/commit/d886e50) + - perf card style  -  by @honghuangdc [(c1afb)](https://github.com/soybeanjs/soybean-admin/commit/c1afb9d) + - fix manage_user title  -  by @honghuangdc [(7770b)](https://github.com/soybeanjs/soybean-admin/commit/7770b37) + - default proxy prefix  -  by @smileluck [(da246)](https://github.com/soybeanjs/soybean-admin/commit/da24642) + - fix request msg  -  by @honghuangdc [(ae6b6)](https://github.com/soybeanjs/soybean-admin/commit/ae6b613) + - Fix the issue of tab error displaying parent localIcon  -  by @Azir-11 [(a9c98)](https://github.com/soybeanjs/soybean-admin/commit/a9c98d9) + - The matched value of TabRoute should be optional  -  by @Azir-11 [(e6fed)](https://github.com/soybeanjs/soybean-admin/commit/e6fed1f) + - fix build [unocss]: build failed to load icon "close", fixed #319  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/319 [(c18d8)](https://github.com/soybeanjs/soybean-admin/commit/c18d82f) + - fix resolve alias  -  by @honghuangdc [(3bdcb)](https://github.com/soybeanjs/soybean-admin/commit/3bdcbc7) + - Missing default value for tab icon  -  by @Azir-11 [(72a46)](https://github.com/soybeanjs/soybean-admin/commit/72a4679) + - add route icon: fucntion_hide-child  -  by @honghuangdc [(0a3ef)](https://github.com/soybeanjs/soybean-admin/commit/0a3efe3) + - fix table x-scroll. fixed #324  -  by @honghuangdc in https://github.com/soybeanjs/soybean-admin/issues/324 [(c7e2c)](https://github.com/soybeanjs/soybean-admin/commit/c7e2c55) + - Fix the logic of root route redirection to home  -  by **恕瑞玛的皇帝** [(0123c)](https://github.com/soybeanjs/soybean-admin/commit/0123c37) + - Fix homepage mount error under dynamic routing  -  by **恕瑞玛的皇帝** [(9cf2a)](https://github.com/soybeanjs/soybean-admin/commit/9cf2a51) + - fix repeat home tab  -  by @honghuangdc [(bccd6)](https://github.com/soybeanjs/soybean-admin/commit/bccd6cb) + - fix proxy config  -  by @honghuangdc [(c8019)](https://github.com/soybeanjs/soybean-admin/commit/c8019c4) + - fix proxy config  -  by @honghuangdc [(ffc95)](https://github.com/soybeanjs/soybean-admin/commit/ffc95d2) + - fix table row-key ts type  -  by @honghuangdc [(0cc8f)](https://github.com/soybeanjs/soybean-admin/commit/0cc8f05) + - fix class name conflict with unocss icon  -  by @honghuangdc [(455e4)](https://github.com/soybeanjs/soybean-admin/commit/455e48f) + - fix repeat routes  -  by @honghuangdc [(2c543)](https://github.com/soybeanjs/soybean-admin/commit/2c543f1) + - fix route init  -  by @honghuangdc [(23a40)](https://github.com/soybeanjs/soybean-admin/commit/23a4098) + +###    🔥 Performance + +- **components**: + - Optimize internationalized menu search code  -  by **燕博文** [(8c1ef)](https://github.com/soybeanjs/soybean-admin/commit/8c1ef4b) + - Optimize menu search code  -  by **燕博文** [(296a2)](https://github.com/soybeanjs/soybean-admin/commit/296a2d2) + - perf count-to  -  by @honghuangdc [(b2c61)](https://github.com/soybeanjs/soybean-admin/commit/b2c61f0) + - components name is converted to uppercase  -  by **燕博文** [(04aa1)](https://github.com/soybeanjs/soybean-admin/commit/04aa10b) + - perf global-search  -  by @honghuangdc [(72745)](https://github.com/soybeanjs/soybean-admin/commit/7274522) +- **projects**: + - perf code  -  by @honghuangdc [(8081e)](https://github.com/soybeanjs/soybean-admin/commit/8081e19) + - env config  -  by @honghuangdc [(1bac3)](https://github.com/soybeanjs/soybean-admin/commit/1bac3b7) + - add detailed annotations for route role  -  by @honghuangdc [(f6bab)](https://github.com/soybeanjs/soybean-admin/commit/f6bab0c) + - perf code  -  by @honghuangdc [(5c49d)](https://github.com/soybeanjs/soybean-admin/commit/5c49d24) + - remove useless file  -  by @honghuangdc [(c624f)](https://github.com/soybeanjs/soybean-admin/commit/c624f32) + - remove @soybeanjs/cli  -  by @honghuangdc [(41349)](https://github.com/soybeanjs/soybean-admin/commit/4134955) + - echarts loading style  -  by @honghuangdc [(456c3)](https://github.com/soybeanjs/soybean-admin/commit/456c318) + - perf page manage_role, useTable  -  by @honghuangdc [(39aa7)](https://github.com/soybeanjs/soybean-admin/commit/39aa7aa) + - perf table columns style  -  by @honghuangdc [(babdb)](https://github.com/soybeanjs/soybean-admin/commit/babdb5d) + - perf page manage_menu style  -  by @honghuangdc [(0aa75)](https://github.com/soybeanjs/soybean-admin/commit/0aa75c0) + - perf code  -  by @honghuangdc [(7fa87)](https://github.com/soybeanjs/soybean-admin/commit/7fa87f5) + - perf code  -  by @honghuangdc [(05db8)](https://github.com/soybeanjs/soybean-admin/commit/05db8c0) + - perf code  -  by @honghuangdc [(dc24a)](https://github.com/soybeanjs/soybean-admin/commit/dc24a36) + - perf manage page style  -  by @honghuangdc [(779ba)](https://github.com/soybeanjs/soybean-admin/commit/779ba4e) + - perf manage menu  -  by @honghuangdc [(71f2c)](https://github.com/soybeanjs/soybean-admin/commit/71f2c55) + - manage menu: add transform to component  -  by @honghuangdc [(0abbf)](https://github.com/soybeanjs/soybean-admin/commit/0abbfa5) + +###    💅 Refactors + +- **projects**: + - remove plugin-web-update-notification  -  by @honghuangdc [(f6c6d)](https://github.com/soybeanjs/soybean-admin/commit/f6c6dbd) + - fix conflict with locale file  -  by @honghuangdc [(3346b)](https://github.com/soybeanjs/soybean-admin/commit/3346bcd) + - refactor app-loading  -  by @honghuangdc [(b4f3d)](https://github.com/soybeanjs/soybean-admin/commit/b4f3dd2) + - use naive-ui color-picker  -  by @honghuangdc [(b5551)](https://github.com/soybeanjs/soybean-admin/commit/b5551d6) + - perf page home  -  by @honghuangdc [(4c61c)](https://github.com/soybeanjs/soybean-admin/commit/4c61c6f) + - login components => modules  -  by @honghuangdc [(59bec)](https://github.com/soybeanjs/soybean-admin/commit/59bec2d) + - perf page function_tab  -  by @honghuangdc [(b5477)](https://github.com/soybeanjs/soybean-admin/commit/b5477e8) + - update mock api  -  by @honghuangdc [(27241)](https://github.com/soybeanjs/soybean-admin/commit/2724169) + - page manage_role: extract module  -  by @honghuangdc [(0e9e2)](https://github.com/soybeanjs/soybean-admin/commit/0e9e2e1) + - perf page manage_role  -  by @honghuangdc [(a19f8)](https://github.com/soybeanjs/soybean-admin/commit/a19f895) + - manage_route => manage_menu  -  by @honghuangdc [(f8467)](https://github.com/soybeanjs/soybean-admin/commit/f8467ce) + - refactor service env config  -  by @honghuangdc [(43193)](https://github.com/soybeanjs/soybean-admin/commit/43193e2) + - refactor unocss shortcuts: wh-full => size-full  -  by @honghuangdc [(b4c00)](https://github.com/soybeanjs/soybean-admin/commit/b4c00ce) + - use enquirer replace prompts  -  by @honghuangdc [(b546f)](https://github.com/soybeanjs/soybean-admin/commit/b546ff8) + - refactor useTable  -  by @honghuangdc [(c3efa)](https://github.com/soybeanjs/soybean-admin/commit/c3efa1b) + - finish refactor useTable  -  by @honghuangdc [(86301)](https://github.com/soybeanjs/soybean-admin/commit/8630175) + - finish refactor useTable and apply  -  by @honghuangdc [(3fd15)](https://github.com/soybeanjs/soybean-admin/commit/3fd15e5) + - perf code  -  by @honghuangdc [(f91ef)](https://github.com/soybeanjs/soybean-admin/commit/f91ef30) + - new route guard  -  by @honghuangdc [(37d20)](https://github.com/soybeanjs/soybean-admin/commit/37d20b8) + +###    📖 Documentation + +- **projects**: + - update README.md  -  by @honghuangdc [(78364)](https://github.com/soybeanjs/soybean-admin/commit/783648f) + - update README.md  -  by @honghuangdc [(1ea48)](https://github.com/soybeanjs/soybean-admin/commit/1ea4817) + - add README  -  by @honghuangdc [(2371b)](https://github.com/soybeanjs/soybean-admin/commit/2371ba8) + - update README  -  by @honghuangdc [(d16a9)](https://github.com/soybeanjs/soybean-admin/commit/d16a9d5) + - update README.md  -  by @honghuangdc [(6a771)](https://github.com/soybeanjs/soybean-admin/commit/6a771ea) + - update README.md  -  by @honghuangdc [(57b6d)](https://github.com/soybeanjs/soybean-admin/commit/57b6d8a) + - update README.md  -  by @honghuangdc [(b30c0)](https://github.com/soybeanjs/soybean-admin/commit/b30c035) + - update README.md  -  by @honghuangdc [(c260f)](https://github.com/soybeanjs/soybean-admin/commit/c260fe2) + - update README.md  -  by @honghuangdc [(03c42)](https://github.com/soybeanjs/soybean-admin/commit/03c42aa) + - update README.md  -  by @honghuangdc [(0fae9)](https://github.com/soybeanjs/soybean-admin/commit/0fae993) + - update README.md  -  by @honghuangdc [(4e4d2)](https://github.com/soybeanjs/soybean-admin/commit/4e4d2de) + - update README.md  -  by @honghuangdc [(86b44)](https://github.com/soybeanjs/soybean-admin/commit/86b445c) + - update README.md  -  by @honghuangdc [(e2085)](https://github.com/soybeanjs/soybean-admin/commit/e2085e0) + - update README.md  -  by @honghuangdc [(6ea9b)](https://github.com/soybeanjs/soybean-admin/commit/6ea9b85) + - update README.md  -  by @honghuangdc [(ef4af)](https://github.com/soybeanjs/soybean-admin/commit/ef4af79) + - update README.md  -  by @honghuangdc [(41830)](https://github.com/soybeanjs/soybean-admin/commit/418302a) + - add CHANGELOG.md  -  by @honghuangdc [(46b61)](https://github.com/soybeanjs/soybean-admin/commit/46b6156) + +###    🏡 Chore + +- **deps**: + - update deps  -  by @honghuangdc [(3eaf0)](https://github.com/soybeanjs/soybean-admin/commit/3eaf05b) + - update deps  -  by @honghuangdc [(36fe1)](https://github.com/soybeanjs/soybean-admin/commit/36fe1da) + - update deps  -  by @honghuangdc [(55342)](https://github.com/soybeanjs/soybean-admin/commit/5534294) + - update deps  -  by @honghuangdc [(f1b86)](https://github.com/soybeanjs/soybean-admin/commit/f1b86cc) + - update deps  -  by @honghuangdc [(840e7)](https://github.com/soybeanjs/soybean-admin/commit/840e7f9) + - update deps  -  by @honghuangdc [(6114b)](https://github.com/soybeanjs/soybean-admin/commit/6114b9f) + - update deps  -  by @honghuangdc [(9cc7e)](https://github.com/soybeanjs/soybean-admin/commit/9cc7ee5) + - update deps  -  by @honghuangdc [(9c4ba)](https://github.com/soybeanjs/soybean-admin/commit/9c4ba66) + - update deps  -  by @honghuangdc [(fb3b9)](https://github.com/soybeanjs/soybean-admin/commit/fb3b94b) + - update deps  -  by @honghuangdc [(14aa8)](https://github.com/soybeanjs/soybean-admin/commit/14aa856) + - update deps  -  by @honghuangdc [(02d4b)](https://github.com/soybeanjs/soybean-admin/commit/02d4b0a) + - update deps  -  by @honghuangdc [(b2ee9)](https://github.com/soybeanjs/soybean-admin/commit/b2ee9ee) + - update deps  -  by @honghuangdc [(0fee1)](https://github.com/soybeanjs/soybean-admin/commit/0fee104) + - update deps  -  by @honghuangdc [(c0a65)](https://github.com/soybeanjs/soybean-admin/commit/c0a65a1) +- **project**: + - delete src/locales/lang/zh-CN.ts  -  by @honghuangdc [(377db)](https://github.com/soybeanjs/soybean-admin/commit/377db82) +- **projects**: + - use eslint flat config & update config  -  by @honghuangdc [(a176d)](https://github.com/soybeanjs/soybean-admin/commit/a176dc4) + - update @sa/scripts  -  by @honghuangdc [(d7785)](https://github.com/soybeanjs/soybean-admin/commit/d778560) + - update pnpm version  -  by @honghuangdc [(55f76)](https://github.com/soybeanjs/soybean-admin/commit/55f7638) + - update eslint config  -  by @honghuangdc [(5023f)](https://github.com/soybeanjs/soybean-admin/commit/5023f37) + - lock deps versions  -  by @honghuangdc [(a24f9)](https://github.com/soybeanjs/soybean-admin/commit/a24f963) + - update pnpm version  -  by @honghuangdc [(ea02b)](https://github.com/soybeanjs/soybean-admin/commit/ea02b23) + - remove @simonwep/pickr  -  by @honghuangdc [(502a4)](https://github.com/soybeanjs/soybean-admin/commit/502a4d2) + - remove soybean.svg  -  by @honghuangdc [(4031f)](https://github.com/soybeanjs/soybean-admin/commit/4031faf) + - update pnpm version  -  by @honghuangdc [(adec0)](https://github.com/soybeanjs/soybean-admin/commit/adec0d7) + - update deps & fix keep-alive  -  by @honghuangdc [(13001)](https://github.com/soybeanjs/soybean-admin/commit/13001bc) + - update @elegant-router/vue, fix inject name in windows  -  by @honghuangdc [(0b56e)](https://github.com/soybeanjs/soybean-admin/commit/0b56e44) + - add dev and build command with service env  -  by @honghuangdc [(ebb15)](https://github.com/soybeanjs/soybean-admin/commit/ebb1548) + - update deps & remove packages docs  -  by @honghuangdc [(57963)](https://github.com/soybeanjs/soybean-admin/commit/579636b) + - update pnpm-lock.yaml  -  by @honghuangdc [(147f6)](https://github.com/soybeanjs/soybean-admin/commit/147f60d) + - update repository url  -  by @honghuangdc [(806a1)](https://github.com/soybeanjs/soybean-admin/commit/806a1cb) + - update deps & update pnpm version  -  by @honghuangdc [(9772a)](https://github.com/soybeanjs/soybean-admin/commit/9772aec) + - add unocss eslint config  -  by @honghuangdc [(40635)](https://github.com/soybeanjs/soybean-admin/commit/4063529) + - update launch.json  -  by @honghuangdc [(3db82)](https://github.com/soybeanjs/soybean-admin/commit/3db82ac) + - update vscode extensions.json  -  by @honghuangdc [(4e29a)](https://github.com/soybeanjs/soybean-admin/commit/4e29aca) + - update pnpm version  -  by @honghuangdc [(7065f)](https://github.com/soybeanjs/soybean-admin/commit/7065f6f) + - update deps & fix eslint vue rule  -  by @honghuangdc [(8143b)](https://github.com/soybeanjs/soybean-admin/commit/8143b00) + - update pnpm version  -  by @honghuangdc [(6ad51)](https://github.com/soybeanjs/soybean-admin/commit/6ad51e9) + +###    🎨 Styles + +- **components**: + - Uniform icon size for header  -  by @Azir-11 [(b37c1)](https://github.com/soybeanjs/soybean-admin/commit/b37c1e9) +- **projects**: + - format code  -  by @honghuangdc [(a7481)](https://github.com/soybeanjs/soybean-admin/commit/a748166) + - update theme mode segment height  -  by @honghuangdc [(4d846)](https://github.com/soybeanjs/soybean-admin/commit/4d8469e) + - fix tooltip zIndex of ButtonIcon  -  by @honghuangdc [(db747)](https://github.com/soybeanjs/soybean-admin/commit/db747c4) + - sort defineProps, defineEmits with TS type  -  by @honghuangdc [(123fd)](https://github.com/soybeanjs/soybean-admin/commit/123fd4f) + +###    🤖 CI + +- **projects**: add github actions config  -  by @honghuangdc [(4cb17)](https://github.com/soybeanjs/soybean-admin/commit/4cb17c7) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)  [![smileluck](https://github.com/smileluck.png?size=48)](https://github.com/smileluck)  [![Particaly](https://github.com/Particaly.png?size=48)](https://github.com/Particaly)   +[~li](mailto:miciili-02@outlook.com), [Azir-11](mailto:2075125282@qq.com), [燕博文](mailto:349952469@qq.com), [tnt group](mailto:dodu@live.cn), [Kori](mailto:kexin@korix.top),  + +## [v0.10.4](https://github.com/honghuangdc/soybean-admin/compare/v0.10.3...v0.10.4) (23-09-20) + +###    🚀 Features + +- **auth**: + - 防止多次刷新token  -  by @eAliwei [(0eaa3)](https://github.com/honghuangdc/soybean-admin/commit/0eaa327) +- **hooks**: + - add useHookTable  -  by @honghuangdc [(b3ae7)](https://github.com/honghuangdc/soybean-admin/commit/b3ae760) +- **projects**: + - add websocket demo  -  by @honghuangdc [(af53e)](https://github.com/honghuangdc/soybean-admin/commit/af53ec7) + - add switch for customize darkmode transition  -  by @honghuangdc [(6e0cc)](https://github.com/honghuangdc/soybean-admin/commit/6e0cce4) + - new i18n function $t & login page and setting drawer config i18n  -  by @honghuangdc [(854d0)](https://github.com/honghuangdc/soybean-admin/commit/854d0bc) + - add plugin-web-update-notification  -  by @honghuangdc [(c9164)](https://github.com/honghuangdc/soybean-admin/commit/c91644b) + +###    🐞 Bug Fixes + +- **components**: + - 修复动态路由主页404  -  by @lapislazulisch [(3ae19)](https://github.com/honghuangdc/soybean-admin/commit/3ae1952) + - 修复动态路由home页404  -  by @lapislazulisch [(ad6ac)](https://github.com/honghuangdc/soybean-admin/commit/ad6ac72) +- **projects**: + - fix set tab title (fixed #256)  -  by @honghuangdc in https://github.com/honghuangdc/soybean-admin/issues/256 [(13f6c)](https://github.com/honghuangdc/soybean-admin/commit/13f6cd8) + - correct the lang file name & add recommend vscode plugin i18n-ally  -  by @honghuangdc [(864ec)](https://github.com/honghuangdc/soybean-admin/commit/864ec47) + - fix reload button animate  -  by @honghuangdc [(41f23)](https://github.com/honghuangdc/soybean-admin/commit/41f2338) +- **styles**: + - 用户管理页面布局自适应屏幕高度 (fixed #253)  -  by @honghuangdc in https://github.com/honghuangdc/soybean-admin/issues/253 [(0f7b9)](https://github.com/honghuangdc/soybean-admin/commit/0f7b9d5) + +###    🔥 Performance + +- **hooks**: + - perf use-table  -  by @honghuangdc [(33180)](https://github.com/honghuangdc/soybean-admin/commit/3318041) + - perf useHookTable  -  by @honghuangdc [(809fa)](https://github.com/honghuangdc/soybean-admin/commit/809fa85) +- **projects**: + - add type declaration for document startViewTransition  -  by @honghuangdc [(d3ebe)](https://github.com/honghuangdc/soybean-admin/commit/d3ebe95) + +###    💅 Refactors + +- **projects**: + - 生产环境缓存主题变更为sessionStorage  -  by @honghuangdc [(c46a5)](https://github.com/honghuangdc/soybean-admin/commit/c46a592) + - add reCacheRoute method  -  by @honghuangdc [(f92ee)](https://github.com/honghuangdc/soybean-admin/commit/f92ee77) + - update soybean domain  -  by @honghuangdc [(073fd)](https://github.com/honghuangdc/soybean-admin/commit/073fd16) + +###    📖 Documentation + +- **projects**: + - update README.md logo  -  by @honghuangdc [(19141)](https://github.com/honghuangdc/soybean-admin/commit/19141a7) + - update Docker deployment method  -  by @snowords [(00da0)](https://github.com/honghuangdc/soybean-admin/commit/00da000) + - update git hooks init command  -  by @snowords [(7f35e)](https://github.com/honghuangdc/soybean-admin/commit/7f35e87) + - update README.md  -  by @eltociear [(93ed5)](https://github.com/honghuangdc/soybean-admin/commit/93ed5ad) + +###    🏡 Chore + +- **deps**: + - update deps  -  by @honghuangdc [(bba68)](https://github.com/honghuangdc/soybean-admin/commit/bba68bf) + - update deps  -  by @honghuangdc [(0e6d2)](https://github.com/honghuangdc/soybean-admin/commit/0e6d289) + - update deps  -  by @honghuangdc [(135ce)](https://github.com/honghuangdc/soybean-admin/commit/135ce77) + - update deps  -  by @honghuangdc [(44ba3)](https://github.com/honghuangdc/soybean-admin/commit/44ba327) + - update deps  -  by @honghuangdc [(9296e)](https://github.com/honghuangdc/soybean-admin/commit/9296e69) + - update deps  -  by @honghuangdc [(751de)](https://github.com/honghuangdc/soybean-admin/commit/751ded4) + - update deps  -  by @honghuangdc [(305d9)](https://github.com/honghuangdc/soybean-admin/commit/305d956) +- **projects**: + - update deps and fix swiper  -  by @honghuangdc [(9d105)](https://github.com/honghuangdc/soybean-admin/commit/9d1051b) + - update package.json  -  by @honghuangdc [(d7aea)](https://github.com/honghuangdc/soybean-admin/commit/d7aea9d) + - update deps & fix eslint code  -  by @honghuangdc [(08e0c)](https://github.com/honghuangdc/soybean-admin/commit/08e0cf5) + - update pnpm-lock.yaml  -  by @honghuangdc [(94644)](https://github.com/honghuangdc/soybean-admin/commit/9464473) + - update VSCode setting  -  by @honghuangdc [(56c77)](https://github.com/honghuangdc/soybean-admin/commit/56c770c) + - correct the word spell  -  by @honghuangdc [(458e3)](https://github.com/honghuangdc/soybean-admin/commit/458e387) + - correct word spell & eslint fix code  -  by @honghuangdc [(cffc3)](https://github.com/honghuangdc/soybean-admin/commit/cffc30a) + - When tab is switched, keep the page without refreshing  -  by @linjiangl [(83f25)](https://github.com/honghuangdc/soybean-admin/commit/83f2514) + +###    🎨 Styles + +- **projects**: + - unify card border radius, 16px to 8px  -  by @honghuangdc [(cbda4)](https://github.com/honghuangdc/soybean-admin/commit/cbda4a3) + - update default theme color  -  by @honghuangdc [(43ac2)](https://github.com/honghuangdc/soybean-admin/commit/43ac23f) + - prettier format code  -  by @honghuangdc [(24cf1)](https://github.com/honghuangdc/soybean-admin/commit/24cf1d9) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![eltociear](https://github.com/eltociear.png?size=48)](https://github.com/eltociear)  [![linjiangl](https://github.com/linjiangl.png?size=48)](https://github.com/linjiangl)  [![lapislazulisch](https://github.com/lapislazulisch.png?size=48)](https://github.com/lapislazulisch)  [![snowords](https://github.com/snowords.png?size=48)](https://github.com/snowords)  [![eAliwei](https://github.com/eAliwei.png?size=48)](https://github.com/eAliwei)  [![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   + +## [v0.10.3](https://github.com/honghuangdc/soybean-admin/compare/v0.10.2...v0.10.3) (23-06-15) + +###    🐞 Bug Fixes + +- **projects**: fix userRoleOptions  -  by @soybeanjs [(2ca2b)](https://github.com/honghuangdc/soybean-admin/commit/2ca2b76) +- **styles**: fix toggle-lang bg  -  by @soybeanjs [(47309)](https://github.com/honghuangdc/soybean-admin/commit/473095b) + +###    🔥 Performance + +- **projects**: + - remove useless code  -  by @soybeanjs [(eb8e4)](https://github.com/honghuangdc/soybean-admin/commit/eb8e49e) + - use transformObjectToOption to generate option of object labels  -  by @soybeanjs [(da611)](https://github.com/honghuangdc/soybean-admin/commit/da611fb) + +###    📖 Documentation + +- **projects**: + - CHANGELOG.md  -  by @soybeanjs [(ff5bf)](https://github.com/honghuangdc/soybean-admin/commit/ff5bf62) + - generate full CHANGELOG.md  -  by @soybeanjs [(055d4)](https://github.com/honghuangdc/soybean-admin/commit/055d4cc) + - update README.md  -  by @soybeanjs [(3c7e1)](https://github.com/honghuangdc/soybean-admin/commit/3c7e1cf) + - update README.md  -  by @soybeanjs [(1681c)](https://github.com/honghuangdc/soybean-admin/commit/1681c34) + - update README.md picture url  -  by @soybeanjs [(4eefc)](https://github.com/honghuangdc/soybean-admin/commit/4eefc95) + - update README.md  -  by @soybeanjs [(8f24a)](https://github.com/honghuangdc/soybean-admin/commit/8f24a94) + - update CHANGELOG.md by regenerate changelog  -  by @soybeanjs [(2a9b7)](https://github.com/honghuangdc/soybean-admin/commit/2a9b725) + +###    🏡 Chore + +- **deps**: + - update deps  -  by @soybeanjs [(f9d47)](https://github.com/honghuangdc/soybean-admin/commit/f9d47c0) + - update deps  -  by @soybeanjs [(47ab0)](https://github.com/honghuangdc/soybean-admin/commit/47ab018) + - decrease vite-plugin-page-route  -  by @soybeanjs [(882f2)](https://github.com/honghuangdc/soybean-admin/commit/882f281) + - update deps  -  by @soybeanjs [(e6abf)](https://github.com/honghuangdc/soybean-admin/commit/e6abf93) +- **projects**: + - remove bumpp & add release script  -  by @soybeanjs [(a3dfe)](https://github.com/honghuangdc/soybean-admin/commit/a3dfe61) + - update @soybeanjs/cli and generate total changelog  -  by @soybeanjs [(58591)](https://github.com/honghuangdc/soybean-admin/commit/58591f6) + - update deps & update unocss deprecated api exclude  -  by @soybeanjs [(0907d)](https://github.com/honghuangdc/soybean-admin/commit/0907d38) + - update deps & update package.json  -  by @soybeanjs [(0b2f6)](https://github.com/honghuangdc/soybean-admin/commit/0b2f68a) + - add vite-plugin-vue-devtools  -  by @soybeanjs [(c1bee)](https://github.com/honghuangdc/soybean-admin/commit/c1bee40) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)   + +## [v0.10.2](https://github.com/honghuangdc/soybean-admin/compare/v0.10.1...v0.10.2) (2023-06-01) + +###    🐞 Bug Fixes + +- **components**: fix mix-menu layout when the locale is English (fixed 241)  -  by @soybeanjs [(5c085)](https://github.com/honghuangdc/soybean-admin/commit/5c085a1) + +###    📖 Documentation + +- **projects**: + - CHANGELOG.md  -  by @soybeanjs [(bb2ea)](https://github.com/honghuangdc/soybean-admin/commit/bb2eab6) + - update README.md: update example image url [更新示例图片的链接]  -  by @soybeanjs [(4f512)](https://github.com/honghuangdc/soybean-admin/commit/4f51263) + - fix README.md: example image link  -  by @soybeanjs [(56ea8)](https://github.com/honghuangdc/soybean-admin/commit/56ea893) + +###    🏡 Chore + +- release v0.10.2  -  by @soybeanjs [(1f6d0)](https://github.com/honghuangdc/soybean-admin/commit/1f6d079) +- **projects**: update deps and use soy lint-staged replace lint-staged  -  by @soybeanjs [(9a238)](https://github.com/honghuangdc/soybean-admin/commit/9a23817) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)   + +## [v0.10.1](https://github.com/honghuangdc/soybean-admin/compare/v0.10.0...v0.10.1) (2023-05-31) + +###    📖 Documentation + +- **projects**: + - CHANGELOG.md  -  by @soybeanjs [(a2521)](https://github.com/honghuangdc/soybean-admin/commit/a252138) + - update README.md  -  by @soybeanjs [(b5839)](https://github.com/honghuangdc/soybean-admin/commit/b5839ea) + +###    🏡 Chore + +- release v0.10.1  -  by @soybeanjs [(44e4c)](https://github.com/honghuangdc/soybean-admin/commit/44e4c04) +- **projects**: add switch for pageRoute plugin [添加自动生成路由的插件的开关]  -  by @soybeanjs [(780ac)](https://github.com/honghuangdc/soybean-admin/commit/780ac75) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)   + +## [v0.10.0](https://github.com/honghuangdc/soybean-admin/compare/v0.9.9...v0.10.0) (2023-05-31) + +###    🚀 Features + +- **components**: + - Add tree related component instances  -  by **small_happy** [(d203a)](https://github.com/honghuangdc/soybean-admin/commit/d203a35) + - Add routing data related to tree components and page display optimization  -  by **small_happy** [(a0f55)](https://github.com/honghuangdc/soybean-admin/commit/a0f55ac) +- **projects**: + - 返回顶部功能适配新布局  -  by @yanbowe [(54e2c)](https://github.com/honghuangdc/soybean-admin/commit/54e2cb5) + - 增加i18n支持翻译菜单,tab,title  -  by **cc** [(3d48a)](https://github.com/honghuangdc/soybean-admin/commit/3d48aa8) + - add menu translate [翻译菜单]  -  by @soybeanjs [(f6828)](https://github.com/honghuangdc/soybean-admin/commit/f68285f) + - 增加主题切换过渡效果  -  by **cc** [(8da88)](https://github.com/honghuangdc/soybean-admin/commit/8da8843) + - support mobile layout [支持移动端布局]  -  by @soybeanjs [(f2b51)](https://github.com/honghuangdc/soybean-admin/commit/f2b518e) + +###    🐞 Bug Fixes + +- **projects**: + - fix router guide [修复路由跳转异常] fixed #216  -  by @soybeanjs in https://github.com/honghuangdc/soybean-admin/issues/216 [(59578)](https://github.com/honghuangdc/soybean-admin/commit/5957833) + - fix better-mock usage [修复better-mock用法]  -  by @soybeanjs [(c5764)](https://github.com/honghuangdc/soybean-admin/commit/c57640a) + - tsconfig missing isolatedModules  -  by @kirklin [(ab49a)](https://github.com/honghuangdc/soybean-admin/commit/ab49afd) + - fix mockjs [修复mockjs]  -  by @soybeanjs [(9b19f)](https://github.com/honghuangdc/soybean-admin/commit/9b19f96) + - add prod mockjs switch [添加生产模式的mockjs的开关]  -  by @soybeanjs [(9f563)](https://github.com/honghuangdc/soybean-admin/commit/9f5638f) + - 修复面包屑导航下拉菜单语言显示问题  -  by **cc** [(ee8fa)](https://github.com/honghuangdc/soybean-admin/commit/ee8fa04) + - hide the drawer when it is initial mobile mode [初始化时为移动端布局则隐藏侧边栏] fixed #238  -  by @soybeanjs in https://github.com/honghuangdc/soybean-admin/issues/238 [(0abde)](https://github.com/honghuangdc/soybean-admin/commit/0abde46) + +###    🔥 Performance + +- **projects**: + - complete dynamic route translate [补充动态路由的翻译]  -  by @soybeanjs [(7b746)](https://github.com/honghuangdc/soybean-admin/commit/7b746fa) + - move changing document title by locale to global event of composables & add appLoading unmount  -  by @soybeanjs [(08e19)](https://github.com/honghuangdc/soybean-admin/commit/08e194e) + +###    💅 Refactors + +- **projects**: + - update useTable  -  by @soybeanjs [(211ae)](https://github.com/honghuangdc/soybean-admin/commit/211ae1f) + - remove page examples: tree [去除tree相关示例页面]  -  by @soybeanjs [(f3090)](https://github.com/honghuangdc/soybean-admin/commit/f309003) + - use better-mock replace mockjs [用better-mock替换mockjs]  -  by @soybeanjs [(9d3c7)](https://github.com/honghuangdc/soybean-admin/commit/9d3c732) + - upgrade vue3.3, official support defineOptions  -  by @kirklin [(86a37)](https://github.com/honghuangdc/soybean-admin/commit/86a370f) + +###    📖 Documentation + +- **projects**: + - add qq to README.md [文档添加QQ群]  -  by @soybeanjs [(f74a6)](https://github.com/honghuangdc/soybean-admin/commit/f74a642) + - update README.md [更新README.md]  -  by @soybeanjs [(39709)](https://github.com/honghuangdc/soybean-admin/commit/397092c) + - update README.md [更新README.md]  -  by @soybeanjs [(5a4f8)](https://github.com/honghuangdc/soybean-admin/commit/5a4f842) + - update README.md [更新README.md]  -  by @soybeanjs [(a765d)](https://github.com/honghuangdc/soybean-admin/commit/a765da6) + - update README.md [更新README.md]  -  by @soybeanjs [(a989b)](https://github.com/honghuangdc/soybean-admin/commit/a989b44) + - 优化README.md  -  by @greper [(6ea75)](https://github.com/honghuangdc/soybean-admin/commit/6ea755f) + - readme.md 二次开发的项目内容换行  -  by @greper [(f3a17)](https://github.com/honghuangdc/soybean-admin/commit/f3a1707) + - update CHANGELOG.md  -  by @soybeanjs [(5f6ca)](https://github.com/honghuangdc/soybean-admin/commit/5f6caab) + +###    📦 Build + +- **deps**: + - update deps  -  by @soybeanjs [(db629)](https://github.com/honghuangdc/soybean-admin/commit/db62959) + - update deps [升级依赖]  -  by @soybeanjs [(f2e82)](https://github.com/honghuangdc/soybean-admin/commit/f2e82da) + - update deps and remove vite-plugin-html [升级依赖,去除vite-plugin-html]  -  by @soybeanjs [(eaf36)](https://github.com/honghuangdc/soybean-admin/commit/eaf3678) + - update deps [升级依赖]  -  by @soybeanjs [(bae17)](https://github.com/honghuangdc/soybean-admin/commit/bae1767) + - update deps [升级依赖]  -  by @soybeanjs [(c2642)](https://github.com/honghuangdc/soybean-admin/commit/c264216) + - update deps [升级依赖]  -  by @soybeanjs [(40f85)](https://github.com/honghuangdc/soybean-admin/commit/40f8587) +- **projects**: + - remove old layout,tab package [去除旧的布局和页签依赖]  -  by @soybeanjs [(42e6d)](https://github.com/honghuangdc/soybean-admin/commit/42e6de3) + - update deps and fix type error [升级依赖并修复类型问题]  -  by @soybeanjs [(34f02)](https://github.com/honghuangdc/soybean-admin/commit/34f023c) + - update deps and fix style [升级依赖&修复代码格式]  -  by @soybeanjs [(c1c43)](https://github.com/honghuangdc/soybean-admin/commit/c1c4335) + +###    🏡 Chore + +- release v0.10.0  -  by @soybeanjs [(270a0)](https://github.com/honghuangdc/soybean-admin/commit/270a055) +- **deps**: update deps  -  by @soybeanjs [(cebbe)](https://github.com/honghuangdc/soybean-admin/commit/cebbef6) +- **projects**: remove useless packages, update lint-staged config, add githublogen  -  by @soybeanjs [(5aaa3)](https://github.com/honghuangdc/soybean-admin/commit/5aaa318) + +###    🎨 Styles + +- **projects**: per style [完善样式]  -  by @soybeanjs [(209ef)](https://github.com/honghuangdc/soybean-admin/commit/209ef3d) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![greper](https://github.com/greper.png?size=48)](https://github.com/greper)  [![kirklin](https://github.com/kirklin.png?size=48)](https://github.com/kirklin)  [![yanbowe](https://github.com/yanbowe.png?size=48)](https://github.com/yanbowe)   +[cc](mailto:cc@qq.com), [small_happy](mailto:5304122+small_happy@user.noreply.gitee.com),  + +## [v0.9.9](https://github.com/honghuangdc/soybean-admin/compare/v0.9.8...v0.9.9) (2023-03-13) + +###    🚀 Features + +- **hooks**: + - add useNaiveTable  -  by @soybeanjs [(cc13f)](https://github.com/honghuangdc/soybean-admin/commit/cc13fcc) +- **projects**: + - custom unocss colors support opacity  -  by @soybeanjs [(488e6)](https://github.com/honghuangdc/soybean-admin/commit/488e6e3) + - new layout,tab and add update theme settings  -  by @soybeanjs [(912c3)](https://github.com/honghuangdc/soybean-admin/commit/912c353) + +###    🐞 Bug Fixes + +- **components**: + - 页面跳转被拦截, 则会出现 tab 页签与页面不一致的问题  -  by @taisha [(bd5dd)](https://github.com/honghuangdc/soybean-admin/commit/bd5dd2c) + - 修复iconSelect选择器点击事件失效  -  by @yanbowe [(7e505)](https://github.com/honghuangdc/soybean-admin/commit/7e505f9) + - refresh cached routes  -  by @taisha [(b0f98)](https://github.com/honghuangdc/soybean-admin/commit/b0f98e4) +- **projects**: + - fix eslint svg cause incorrect icon render  -  by @soybeanjs [(0b5af)](https://github.com/honghuangdc/soybean-admin/commit/0b5afda) + - sortRoutes recursively  -  by @sunhao1256 [(91889)](https://github.com/honghuangdc/soybean-admin/commit/9188941) + - not only `/login` claim dynamic path scenario , but also others , eg:/user/1  -  by @sunhao1256 [(60598)](https://github.com/honghuangdc/soybean-admin/commit/6059891) + - the length of routes children list should greater than 0  -  by @Shadowsight9 [(e1afc)](https://github.com/honghuangdc/soybean-admin/commit/e1afc10) + - fix pwa logo  -  by @soybeanjs [(bf2f6)](https://github.com/honghuangdc/soybean-admin/commit/bf2f617) + - fix github bug-report  -  by @soybeanjs [(f73e3)](https://github.com/honghuangdc/soybean-admin/commit/f73e3f6) +- **utils**: + - make AxiosRequestConfig optional for request.handleDelete()  -  by @guuuuo [(4a6fe)](https://github.com/honghuangdc/soybean-admin/commit/4a6fec8) + +###    💅 Refactors + +- **projects**: + - all file and folder use kebab-case  -  by @soybeanjs [(cea60)](https://github.com/honghuangdc/soybean-admin/commit/cea600f) + - update service and proxy config  -  by @soybeanjs [(8debf)](https://github.com/honghuangdc/soybean-admin/commit/8debfe7) + - remove enum  -  by @soybeanjs [(21d52)](https://github.com/honghuangdc/soybean-admin/commit/21d5214) + - rename union key  -  by @soybeanjs [(e2b32)](https://github.com/honghuangdc/soybean-admin/commit/e2b320a) + +###    📖 Documentation + +- **projects**: + - update README.md  -  by @soybeanjs [(cf8c7)](https://github.com/honghuangdc/soybean-admin/commit/cf8c7cb) + - update README.md  -  by @soybeanjs [(1ef1b)](https://github.com/honghuangdc/soybean-admin/commit/1ef1b6b) + - update README.md  -  by @soybeanjs [(aaef0)](https://github.com/honghuangdc/soybean-admin/commit/aaef0be) + +###    📦 Build + +- **deps**: + - update deps  -  by @soybeanjs [(61998)](https://github.com/honghuangdc/soybean-admin/commit/6199888) +- **projects**: + - update deps and fix project config  -  by @soybeanjs [(da521)](https://github.com/honghuangdc/soybean-admin/commit/da521b3) + - perf logo  -  by @soybeanjs [(a8a6e)](https://github.com/honghuangdc/soybean-admin/commit/a8a6ed9) + - update vscode config  -  by @soybeanjs [(608d7)](https://github.com/honghuangdc/soybean-admin/commit/608d7fb) + - update unocss config  -  by @soybeanjs [(3503d)](https://github.com/honghuangdc/soybean-admin/commit/3503dff) + - update deps, add prettier format command  -  by @soybeanjs [(36e5f)](https://github.com/honghuangdc/soybean-admin/commit/36e5fea) + +###    🏡 Chore + +- **projects**: + - add github action  -  by @lixin59 [(f355a)](https://github.com/honghuangdc/soybean-admin/commit/f355a69) + - 修复issue模板格式问题  -  by @lixin59 [(d8bab)](https://github.com/honghuangdc/soybean-admin/commit/d8baba5) +- **release**: + - 0.9.9  -  by @soybeanjs [(c0066)](https://github.com/honghuangdc/soybean-admin/commit/c0066b2) + +###    🎨 Styles + +- **projects**: format yaml  -  by @soybeanjs [(fb46d)](https://github.com/honghuangdc/soybean-admin/commit/fb46d7e) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![guuuuo](https://github.com/guuuuo.png?size=48)](https://github.com/guuuuo)  [![lixin59](https://github.com/lixin59.png?size=48)](https://github.com/lixin59)  [![taisha](https://github.com/taisha.png?size=48)](https://github.com/taisha)  [![Shadowsight9](https://github.com/Shadowsight9.png?size=48)](https://github.com/Shadowsight9)  [![sunhao1256](https://github.com/sunhao1256.png?size=48)](https://github.com/sunhao1256)  [![yanbowe](https://github.com/yanbowe.png?size=48)](https://github.com/yanbowe)   + +## [v0.9.8](https://github.com/honghuangdc/soybean-admin/compare/v0.9.7...v0.9.8) (2023-01-15) + +###    🚀 Features + +- setting 页面新增 是否显示footer的开关  -  by @zuihou [(d064f)](https://github.com/honghuangdc/soybean-admin/commit/d064f62) +- 新增 affix 属性,用于将其固定在tab卡  -  by @zuihou [(e772f)](https://github.com/honghuangdc/soybean-admin/commit/e772ff0) +- **projects**: + - add compress script [添加压缩命令]  -  by @soybeanjs [(be6d4)](https://github.com/honghuangdc/soybean-admin/commit/be6d431) + - add script about generating png logo from [添加根据svg生成png图标的命令]  -  by @soybeanjs [(70aee)](https://github.com/honghuangdc/soybean-admin/commit/70aeefe) + - add generate logo script  -  by @soybeanjs [(25daa)](https://github.com/honghuangdc/soybean-admin/commit/25daa23) + - add new route plugin @soybeanjs/vite-plugin-vue-page-route [集成新的路由插件]  -  by @soybeanjs [(3131e)](https://github.com/honghuangdc/soybean-admin/commit/3131e00) + +###    🐞 Bug Fixes + +- remove height limit h-360px  -  by @codearhat [(b5c57)](https://github.com/honghuangdc/soybean-admin/commit/b5c570a) +- set password attributes  -  by @codearhat [(a9a37)](https://github.com/honghuangdc/soybean-admin/commit/a9a3703) +- **components**: + - 修复路由在path中包含重复路单词径菜单时,被激活会错误展开  -  by @shabby2333 [(264da)](https://github.com/honghuangdc/soybean-admin/commit/264da00) +- **projects**: + - fix vite-pwa plugin config  -  by @soybeanjs [(94098)](https://github.com/honghuangdc/soybean-admin/commit/94098d0) + - add router-page.d.ts to git [将router-page.d.ts添加git提交]  -  by @soybeanjs [(7a580)](https://github.com/honghuangdc/soybean-admin/commit/7a58035) + - fix router when the dynamic routes api was failed [修复当动态路由接口失败后路由异常问题]  -  by @soybeanjs [(f2b58)](https://github.com/honghuangdc/soybean-admin/commit/f2b580f) + - fix login success message [修复登录成功的消息提示]  -  by @soybeanjs [(81039)](https://github.com/honghuangdc/soybean-admin/commit/810398a) + - 修复tabs在static路由模式下可以关闭首页  -  by @yanbowe [(7211a)](https://github.com/honghuangdc/soybean-admin/commit/7211a17) + - 修复动态路由模式下路由不排序的问题  -  by @HnyLi [(58b27)](https://github.com/honghuangdc/soybean-admin/commit/58b27c9) + +###    💅 Refactors + +- **czg**: + - update cz-git,czg breaking changes  -  by @yanbowe [(fcb7a)](https://github.com/honghuangdc/soybean-admin/commit/fcb7ad9) +- **hooks**: + - 重构hook函数取消监听方式  -  by @yanbowe [(fd948)](https://github.com/honghuangdc/soybean-admin/commit/fd94886) +- **projects**: + - format code style [调整代码格式]  -  by @soybeanjs [(a9d58)](https://github.com/honghuangdc/soybean-admin/commit/a9d58f8) + - import cz-git, czg replace @soybeanjs/cli [引入cz-git、czg替换@soybeanjs/cli]  -  by @soybeanjs [(1bdd8)](https://github.com/honghuangdc/soybean-admin/commit/1bdd81a) + - perfect scrollbar style [完善滚动条]  -  by @soybeanjs [(1a02c)](https://github.com/honghuangdc/soybean-admin/commit/1a02cab) + - refactor app init loading [重构系统初始化的加载]  -  by @soybeanjs [(57bfe)](https://github.com/honghuangdc/soybean-admin/commit/57bfe27) + - new storage system [新的本地数据存储系统]  -  by @soybeanjs [(97191)](https://github.com/honghuangdc/soybean-admin/commit/9719159) + - add simple-git-hooks replace husky  -  by @soybeanjs [(9110d)](https://github.com/honghuangdc/soybean-admin/commit/9110d87) + +###    📖 Documentation + +- **projects**: + - update README  -  by @soybeanjs [(828a2)](https://github.com/honghuangdc/soybean-admin/commit/828a2f5) + - update README  -  by @soybeanjs [(a3562)](https://github.com/honghuangdc/soybean-admin/commit/a3562d9) + +###    📦 Build + +- **deps**: + - update deps  -  by @soybeanjs [(84567)](https://github.com/honghuangdc/soybean-admin/commit/8456750) + - update deps  -  by @soybeanjs [(fcc65)](https://github.com/honghuangdc/soybean-admin/commit/fcc65c3) + - update deps  -  by @soybeanjs [(c097b)](https://github.com/honghuangdc/soybean-admin/commit/c097b56) +- **projects**: + - update plugin config  -  by @soybeanjs [(6a344)](https://github.com/honghuangdc/soybean-admin/commit/6a344ff) + - update deps and perfect the details [升级依赖,完善细节]  -  by @soybeanjs [(61a43)](https://github.com/honghuangdc/soybean-admin/commit/61a43b8) + - update deps and update config  -  by @soybeanjs [(b08c3)](https://github.com/honghuangdc/soybean-admin/commit/b08c389) + - update lint-staged config  -  by @soybeanjs [(0882c)](https://github.com/honghuangdc/soybean-admin/commit/0882c25) + - add VSCode debug config file  -  by @soybeanjs [(0c126)](https://github.com/honghuangdc/soybean-admin/commit/0c12665) + - update deps  -  by @soybeanjs [(f7181)](https://github.com/honghuangdc/soybean-admin/commit/f71812d) + +###    🏡 Chore + +- **release**: 0.9.8  -  by @soybeanjs [(34ffd)](https://github.com/honghuangdc/soybean-admin/commit/34ffd9c) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![shabby2333](https://github.com/shabby2333.png?size=48)](https://github.com/shabby2333)  [![HnyLi](https://github.com/HnyLi.png?size=48)](https://github.com/HnyLi)  [![yanbowe](https://github.com/yanbowe.png?size=48)](https://github.com/yanbowe)  [![zuihou](https://github.com/zuihou.png?size=48)](https://github.com/zuihou)  [![codearhat](https://github.com/codearhat.png?size=48)](https://github.com/codearhat)  [![RockerHX](https://github.com/RockerHX.png?size=48)](https://github.com/RockerHX)   + +## [v0.9.7](https://github.com/honghuangdc/soybean-admin/compare/v0.9.6...v0.9.7) (2022-11-08) + +###    🚀 Features + +- **projects**: + - 增加系统消息组件  -  by @yanbowe [(afa01)](https://github.com/honghuangdc/soybean-admin/commit/afa0134) + - 系统消息组件代码优化  -  by @yanbowe [(95183)](https://github.com/honghuangdc/soybean-admin/commit/9518372) + - 增加返回顶部功能  -  by @yanbowe [(894b0)](https://github.com/honghuangdc/soybean-admin/commit/894b0f1) + - 添加生产的主题配置缓存  -  by @soybeanjs [(718c3)](https://github.com/honghuangdc/soybean-admin/commit/718c362) + - 添加provide、inject上下文示例  -  by @soybeanjs [(a4447)](https://github.com/honghuangdc/soybean-admin/commit/a444731) + - 添加组件名称,调整vue文件里面的类型声明位置  -  by @soybeanjs [(f64bc)](https://github.com/honghuangdc/soybean-admin/commit/f64bc91) + - 适配移动端,修复Tab关闭图标的bug  -  by @soybeanjs [(296b1)](https://github.com/honghuangdc/soybean-admin/commit/296b154) + - 添加系统管理的页面  -  by @soybeanjs [(c33b5)](https://github.com/honghuangdc/soybean-admin/commit/c33b5eb) + - useNaiveTable函数:类型部分  -  by @soybeanjs [(02992)](https://github.com/honghuangdc/soybean-admin/commit/02992dc) + - 添加请求适配adapter层应用的示例页面  -  by @soybeanjs [(8d11a)](https://github.com/honghuangdc/soybean-admin/commit/8d11a6a) + - 实现用户管理页面  -  by @soybeanjs [(472f9)](https://github.com/honghuangdc/soybean-admin/commit/472f93b) + - 全局搜索菜单及消息通知适配移动端  -  by @yanbowe [(97e2f)](https://github.com/honghuangdc/soybean-admin/commit/97e2ffd) + - support constant route without login status[支持未登录状态下访问自定义的固定路由]  -  by @soybeanjs [(a5391)](https://github.com/honghuangdc/soybean-admin/commit/a539112) + - add pinia setup syntax example: setup-store[添加setup syntax的pinia示例setup-store]  -  by @soybeanjs [(82c4b)](https://github.com/honghuangdc/soybean-admin/commit/82c4b09) + - add constant route page without login status[添加未登录可访问的固定路由示例页面]  -  by @soybeanjs [(78efd)](https://github.com/honghuangdc/soybean-admin/commit/78efd77) + - refactor icon system, unify icon usage [重构图标系统,统一图标用法]  -  by @soybeanjs [(811f8)](https://github.com/honghuangdc/soybean-admin/commit/811f820) + - import i18n [引入i18n]  -  by @soybeanjs [(b632b)](https://github.com/honghuangdc/soybean-admin/commit/b632b7f) + - new router system [新的路由系统]  -  by @soybeanjs [(c7b6a)](https://github.com/honghuangdc/soybean-admin/commit/c7b6a3f) +- **tabs**: + - 多页签增加关闭所有  -  by @yanbowe [(8237a)](https://github.com/honghuangdc/soybean-admin/commit/8237adb) + +###    🐞 Bug Fixes + +- **deps**: + - decrease @types/node version to fix TS type error [降低@types/node版本修复TS的类型错误]  -  by @soybeanjs [(149d2)](https://github.com/honghuangdc/soybean-admin/commit/149d22a) +- **projects**: + - 修复tab不显示路由首页的问题  -  by @soybeanjs [(a792b)](https://github.com/honghuangdc/soybean-admin/commit/a792bb5) + - 修复多个后端服务时的本地代理  -  by @soybeanjs [(2aba5)](https://github.com/honghuangdc/soybean-admin/commit/2aba58c) + - 修复图标的TS类型  -  by @soybeanjs [(dbd67)](https://github.com/honghuangdc/soybean-admin/commit/dbd6760) + - 修复import.meta.env的TS类型  -  by @soybeanjs [(19942)](https://github.com/honghuangdc/soybean-admin/commit/1994262) + - 修复构建后mockjs对xhr的影响问题  -  by @soybeanjs [(77572)](https://github.com/honghuangdc/soybean-admin/commit/7757285) + - 修复TS类型问题  -  by @soybeanjs [(16dce)](https://github.com/honghuangdc/soybean-admin/commit/16dce9a) + - 修复eslint规则  -  by @soybeanjs [(d7f5b)](https://github.com/honghuangdc/soybean-admin/commit/d7f5bf3) + - add iconify json  -  by @soybeanjs [(8a1ec)](https://github.com/honghuangdc/soybean-admin/commit/8a1ec93) +- **svg-icon**: + - 自定义图标在Dropdown组件下hover状态无法显示图标  -  by @yanbowe [(0523f)](https://github.com/honghuangdc/soybean-admin/commit/0523f08) +- **utils**: + - 修复iconifyRender  -  by @soybeanjs [(c37d0)](https://github.com/honghuangdc/soybean-admin/commit/c37d0ac) + +###    🔥 Performance + +- **components**: + - 添加更多主题颜色设置模态窗的层级  -  by @xiaotao2018 [(ee7eb)](https://github.com/honghuangdc/soybean-admin/commit/ee7eb3a) + - 添加更多主题颜色设置模态窗的层级,z-index为int  -  by @xiaotao2018 [(e2d65)](https://github.com/honghuangdc/soybean-admin/commit/e2d6554) + +###    💅 Refactors + +- **projects**: + - 代码优化  -  by @yanbowe [(41147)](https://github.com/honghuangdc/soybean-admin/commit/41147b3) + - 添加subscribeAppStore  -  by @soybeanjs [(aa2f7)](https://github.com/honghuangdc/soybean-admin/commit/aa2f78a) + - 代码优化  -  by @soybeanjs [(b60db)](https://github.com/honghuangdc/soybean-admin/commit/b60db89) + - 代码优化  -  by @soybeanjs [(61436)](https://github.com/honghuangdc/soybean-admin/commit/6143605) + - 请求适配器函数范型重构、优化请求相关的命名  -  by @soybeanjs [(7f9c9)](https://github.com/honghuangdc/soybean-admin/commit/7f9c98a) + - 更新搜索弹窗的图标  -  by @soybeanjs [(ed9cd)](https://github.com/honghuangdc/soybean-admin/commit/ed9cd6c) + - 抽离格式化相关依赖配置  -  by @soybeanjs [(f4d37)](https://github.com/honghuangdc/soybean-admin/commit/f4d37cf) + - 代码优化  -  by @soybeanjs [(49f95)](https://github.com/honghuangdc/soybean-admin/commit/49f95c4) + - cancel autoinstall @iconify-json [取消@iconify-json自动安装]  -  by @soybeanjs [(c29b8)](https://github.com/honghuangdc/soybean-admin/commit/c29b887) + - refactor page: user-management [重构用户管理页面]  -  by @soybeanjs [(468b4)](https://github.com/honghuangdc/soybean-admin/commit/468b4bb) + +###    📖 Documentation + +- **projects**: + - update README.md  -  by @soybeanjs [(e2727)](https://github.com/honghuangdc/soybean-admin/commit/e2727e6) + - revert docs  -  by @soybeanjs [(2c562)](https://github.com/honghuangdc/soybean-admin/commit/2c56233) + +###    📦 Build + +- **deps**: + - update deps  -  by @soybeanjs [(69e39)](https://github.com/honghuangdc/soybean-admin/commit/69e39c1) + - update deps  -  by @soybeanjs [(ea1a3)](https://github.com/honghuangdc/soybean-admin/commit/ea1a336) + - update deps  -  by @soybeanjs [(73fa3)](https://github.com/honghuangdc/soybean-admin/commit/73fa3d1) + - update deps  -  by @soybeanjs [(973ab)](https://github.com/honghuangdc/soybean-admin/commit/973ab14) + - update deps  -  by @soybeanjs [(75000)](https://github.com/honghuangdc/soybean-admin/commit/750000e) + - update deps  -  by @soybeanjs [(8dcfb)](https://github.com/honghuangdc/soybean-admin/commit/8dcfbb2) + - update deps  -  by @soybeanjs [(1523c)](https://github.com/honghuangdc/soybean-admin/commit/1523c7b) + - update deps  -  by @soybeanjs [(da407)](https://github.com/honghuangdc/soybean-admin/commit/da407b6) + - update deps  -  by @soybeanjs [(cec0f)](https://github.com/honghuangdc/soybean-admin/commit/cec0f25) + - update deps  -  by @soybeanjs [(d9cfe)](https://github.com/honghuangdc/soybean-admin/commit/d9cfeab) + - update deps  -  by @soybeanjs [(dd113)](https://github.com/honghuangdc/soybean-admin/commit/dd11324) + - update deps  -  by @soybeanjs [(d0823)](https://github.com/honghuangdc/soybean-admin/commit/d0823b0) + - update deps  -  by @soybeanjs [(94ff7)](https://github.com/honghuangdc/soybean-admin/commit/94ff787) + - update deps  -  by @soybeanjs [(b32bc)](https://github.com/honghuangdc/soybean-admin/commit/b32bca4) + - update deps  -  by @soybeanjs [(f6b61)](https://github.com/honghuangdc/soybean-admin/commit/f6b6141) + - update deps  -  by @soybeanjs [(0f0cd)](https://github.com/honghuangdc/soybean-admin/commit/0f0cd0b) + - 更新@soybeanjs/eslint-config  -  by @soybeanjs [(36f06)](https://github.com/honghuangdc/soybean-admin/commit/36f06bc) + - update deps  -  by @soybeanjs [(d9324)](https://github.com/honghuangdc/soybean-admin/commit/d9324f0) + - update deps  -  by @soybeanjs [(1ad92)](https://github.com/honghuangdc/soybean-admin/commit/1ad92a2) + - 升级依赖  -  by @soybeanjs [(7240b)](https://github.com/honghuangdc/soybean-admin/commit/7240be8) + - update deps  -  by @soybeanjs [(c5ba6)](https://github.com/honghuangdc/soybean-admin/commit/c5ba631) + - update deps  -  by @soybeanjs [(3e0cc)](https://github.com/honghuangdc/soybean-admin/commit/3e0cc8c) + - update deps  -  by @soybeanjs [(21b6f)](https://github.com/honghuangdc/soybean-admin/commit/21b6fb6) + - update deps  -  by @soybeanjs [(d823e)](https://github.com/honghuangdc/soybean-admin/commit/d823ee5) + - unplugin-vue-define-options替换为unplugin-vue-macros  -  by @soybeanjs [(22c90)](https://github.com/honghuangdc/soybean-admin/commit/22c9025) + - update deps  -  by @soybeanjs [(7dd7c)](https://github.com/honghuangdc/soybean-admin/commit/7dd7c71) + - update deps  -  by @soybeanjs [(fe8ca)](https://github.com/honghuangdc/soybean-admin/commit/fe8cab3) + - unplugin-icon autoinstall @iconify-json [unplugin-icon自动安装@iconify-json]  -  by @soybeanjs [(c045e)](https://github.com/honghuangdc/soybean-admin/commit/c045e3f) + - update deps [升级依赖]  -  by @soybeanjs [(331b1)](https://github.com/honghuangdc/soybean-admin/commit/331b14e) + - update deps  -  by @soybeanjs [(88e53)](https://github.com/honghuangdc/soybean-admin/commit/88e535f) + - update deps  -  by @soybeanjs [(89985)](https://github.com/honghuangdc/soybean-admin/commit/8998581) + - update deps  -  by @soybeanjs [(65ac6)](https://github.com/honghuangdc/soybean-admin/commit/65ac69e) + - update deps  -  by @soybeanjs [(abd02)](https://github.com/honghuangdc/soybean-admin/commit/abd02d1) + - update deps  -  by @soybeanjs [(d6b15)](https://github.com/honghuangdc/soybean-admin/commit/d6b1530) + - update deps  -  by @soybeanjs [(8e801)](https://github.com/honghuangdc/soybean-admin/commit/8e801dd) + - update deps  -  by @soybeanjs [(41b3b)](https://github.com/honghuangdc/soybean-admin/commit/41b3bcb) + - update deps  -  by @soybeanjs [(1f3e6)](https://github.com/honghuangdc/soybean-admin/commit/1f3e6e4) + - update deps  -  by @soybeanjs [(74772)](https://github.com/honghuangdc/soybean-admin/commit/74772a1) +- **projects**: + - 代码优化  -  by @soybeanjs [(5c1b0)](https://github.com/honghuangdc/soybean-admin/commit/5c1b086) + - update tsconfig  -  by @soybeanjs [(9ce58)](https://github.com/honghuangdc/soybean-admin/commit/9ce5807) + - update vscode settings  -  by @soybeanjs [(3fe4e)](https://github.com/honghuangdc/soybean-admin/commit/3fe4e92) + - 添加.gitattributes  -  by @soybeanjs [(896e6)](https://github.com/honghuangdc/soybean-admin/commit/896e6f2) + - 代码优化  -  by @soybeanjs [(6a9a3)](https://github.com/honghuangdc/soybean-admin/commit/6a9a362) + - 升级依赖,添加对json的eslint检测及格式化  -  by @soybeanjs [(711a4)](https://github.com/honghuangdc/soybean-admin/commit/711a4ae) + - update deps and README.md  -  by @soybeanjs [(35aee)](https://github.com/honghuangdc/soybean-admin/commit/35aeedf) + - 升级依赖、vite配置optimizeDeps  -  by @soybeanjs [(ee434)](https://github.com/honghuangdc/soybean-admin/commit/ee434b4) + - 去除prettier,已集成进@soybeanjs/eslint-config  -  by @soybeanjs [(182da)](https://github.com/honghuangdc/soybean-admin/commit/182dac0) + - update eslint  -  by @soybeanjs [(907cf)](https://github.com/honghuangdc/soybean-admin/commit/907cf44) + - 引入pwa插件,更新配置  -  by @soybeanjs [(695ec)](https://github.com/honghuangdc/soybean-admin/commit/695ec7e) + - 更新依赖、调整页面  -  by @soybeanjs [(40ecc)](https://github.com/honghuangdc/soybean-admin/commit/40ecc32) + - 引入vite-plugin-progress  -  by @soybeanjs [(44ab0)](https://github.com/honghuangdc/soybean-admin/commit/44ab077) + - 升级依赖、修复T标签右键菜单连续显示问题  -  by @soybeanjs [(639c4)](https://github.com/honghuangdc/soybean-admin/commit/639c445) + - 引入TS高级类型库  -  by @soybeanjs [(71a75)](https://github.com/honghuangdc/soybean-admin/commit/71a753f) + - 更换eslint依赖为eslint-config-soybeanjs-vue  -  by @soybeanjs [(07325)](https://github.com/honghuangdc/soybean-admin/commit/07325a4) + - 升级依赖,降低naive-ui版本修复打包问题  -  by @soybeanjs [(f408e)](https://github.com/honghuangdc/soybean-admin/commit/f408ea0) + - 升级依赖,修复TS类型  -  by @soybeanjs [(73ce5)](https://github.com/honghuangdc/soybean-admin/commit/73ce53a) + - 引入@unocss/vite替换unocss,精简体积  -  by @soybeanjs [(3540b)](https://github.com/honghuangdc/soybean-admin/commit/3540b75) + - update deps, update logos  -  by @soybeanjs [(22c05)](https://github.com/honghuangdc/soybean-admin/commit/22c0567) + - add constant page content  -  by @soybeanjs [(13d0c)](https://github.com/honghuangdc/soybean-admin/commit/13d0c41) + - add tauri scripts, change tauri icon, fix mockjs [添加tauri相关的命令,变更tauri图标,修复mockjs]  -  by @soybeanjs [(1b45b)](https://github.com/honghuangdc/soybean-admin/commit/1b45b71) + - use @soybeanjs/cli replace commitizen  -  by @soybeanjs [(428d4)](https://github.com/honghuangdc/soybean-admin/commit/428d41b) + - use pnpm patch replace @milahu/patch-package  -  by @soybeanjs [(9455a)](https://github.com/honghuangdc/soybean-admin/commit/9455ad9) + - remove useless file: commitlint.config.js  -  by @soybeanjs [(67736)](https://github.com/honghuangdc/soybean-admin/commit/6773659) + - move tauri to branch tauri  -  by @soybeanjs [(6c14b)](https://github.com/honghuangdc/soybean-admin/commit/6c14bfe) + - update deps and update config  -  by @soybeanjs [(7d699)](https://github.com/honghuangdc/soybean-admin/commit/7d69992) + - new router branch  -  by @soybeanjs [(288d5)](https://github.com/honghuangdc/soybean-admin/commit/288d586) + - add vite plugin @soybeanjs/router-page  -  by @soybeanjs [(40c1e)](https://github.com/honghuangdc/soybean-admin/commit/40c1e13) + +###    🏡 Chore + +- **other**: + - release v0.9.7  -  by @soybeanjs [(cc00c)](https://github.com/honghuangdc/soybean-admin/commit/cc00c8f) +- **projects**: + - 更新.cz-config  -  by @soybeanjs [(b18c4)](https://github.com/honghuangdc/soybean-admin/commit/b18c49e) + - 更新eslint配置  -  by @soybeanjs [(872bb)](https://github.com/honghuangdc/soybean-admin/commit/872bb84) + +###    🤖 CI + +- add docker build  -  by @zq-xu [(af740)](https://github.com/honghuangdc/soybean-admin/commit/af74046) +- change docker image name  -  by @zq-xu [(6fbde)](https://github.com/honghuangdc/soybean-admin/commit/6fbde1e) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![hhstore](https://github.com/hhstore.png?size=48)](https://github.com/hhstore)  [![zq-xu](https://github.com/zq-xu.png?size=48)](https://github.com/zq-xu)  [![yanbowe](https://github.com/yanbowe.png?size=48)](https://github.com/yanbowe)  [![xiaotao2018](https://github.com/xiaotao2018.png?size=48)](https://github.com/xiaotao2018)   + +## [v0.9.6](https://github.com/honghuangdc/soybean-admin/compare/v0.9.5...v0.9.6) (2022-06-16) + +###    🚀 Features + +- **projects**: + - 新增Antv G2图表示例  -  by @soybeanjs [(2d64a)](https://github.com/honghuangdc/soybean-admin/commit/2d64a2e) + - 上下结构,菜单支持横向滚动  -  by @suiyingsky [(80805)](https://github.com/honghuangdc/soybean-admin/commit/808051b) + - 增加设置当前Tab页签名称功能  -  by @yanbowe [(48721)](https://github.com/honghuangdc/soybean-admin/commit/487213b) + - 本地svg动态渲染图标  -  by @soybeanjs [(c3c97)](https://github.com/honghuangdc/soybean-admin/commit/c3c975e) + +###    🐞 Bug Fixes + +- **projects**: + - 修复顶部菜单的位置失效问题  -  by @honghuangdc [(4ee0d)](https://github.com/honghuangdc/soybean-admin/commit/4ee0d94) + - 设置tab标题导致meta属性丢失  -  by @yanbowe [(efcfa)](https://github.com/honghuangdc/soybean-admin/commit/efcfa57) + +###    💅 Refactors + +- **projects**: + - 优化菜单支持横向滚动  -  by @soybeanjs [(8f3e8)](https://github.com/honghuangdc/soybean-admin/commit/8f3e855) + - 代码优化  -  by @honghuangdc [(5fa82)](https://github.com/honghuangdc/soybean-admin/commit/5fa822f) + +###    📖 Documentation + +- **projects**: update README.md  -  by @soybeanjs [(0c70a)](https://github.com/honghuangdc/soybean-admin/commit/0c70a9e) + +###    📦 Build + +- **deps**: + - update deps  -  by @soybeanjs [(906ae)](https://github.com/honghuangdc/soybean-admin/commit/906aed5) + - update deps  -  by @soybeanjs [(9917b)](https://github.com/honghuangdc/soybean-admin/commit/9917b5e) + - update deps  -  by @soybeanjs [(83301)](https://github.com/honghuangdc/soybean-admin/commit/833018a) +- **projects**: + - update deps, update config  -  by @honghuangdc [(8e6e7)](https://github.com/honghuangdc/soybean-admin/commit/8e6e787) + +###    🏡 Chore + +- **release**: 0.9.6  -  by @soybeanjs [(65c21)](https://github.com/honghuangdc/soybean-admin/commit/65c2181) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![yanbowe](https://github.com/yanbowe.png?size=48)](https://github.com/yanbowe)  [![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![suiyingsky](https://github.com/suiyingsky.png?size=48)](https://github.com/suiyingsky)   + +## [v0.9.5](https://github.com/honghuangdc/soybean-admin/compare/v0.9.4...v0.9.5) (2022-06-07) + +###    🚀 Features + +- **projects**: + - 添加自动跟随系统主题设置  -  by @toolvcn [(ba07b)](https://github.com/honghuangdc/soybean-admin/commit/ba07b69) + - 引入echarts替换antvG2plot  -  by @soybeanjs [(e7ad0)](https://github.com/honghuangdc/soybean-admin/commit/e7ad086) + - 添加百度地图、升级依赖  -  by @soybeanjs [(39854)](https://github.com/honghuangdc/soybean-admin/commit/39854a4) + - 添加插件页面:图表  -  by @soybeanjs [(0a46e)](https://github.com/honghuangdc/soybean-admin/commit/0a46ea0) + - 添加antv g2图表示例  -  by @soybeanjs [(44b02)](https://github.com/honghuangdc/soybean-admin/commit/44b022a) + - 补充更多的ECharts示例  -  by @soybeanjs [(c7762)](https://github.com/honghuangdc/soybean-admin/commit/c776249) + - 动态路由根路由重定向只需取决于后端返回的路由首页  -  by @soybeanjs [(434ab)](https://github.com/honghuangdc/soybean-admin/commit/434ab1c) + - 支持同一路由根据不同query和hash同时显示不同Tab  -  by @soybeanjs [(41226)](https://github.com/honghuangdc/soybean-admin/commit/4122685) +- **route**: + - 路由meta新增activeMenu属性  -  by @yanbowe [(ebd16)](https://github.com/honghuangdc/soybean-admin/commit/ebd16a4) + +###    🐞 Bug Fixes + +- **projects**: + - 修复插件不存在的错误提示  -  by @ThinkDevelop [(71652)](https://github.com/honghuangdc/soybean-admin/commit/7165282) + - 修复权限切换路由数据未更新的问题  -  by @soybeanjs [(60f91)](https://github.com/honghuangdc/soybean-admin/commit/60f9125) + - 修复页面切换时导致的溢出滚动条  -  by @soybeanjs [(e0233)](https://github.com/honghuangdc/soybean-admin/commit/e023306) + - 修复@antv/g2生产环境报错  -  by @soybeanjs [(4558c)](https://github.com/honghuangdc/soybean-admin/commit/4558c24) +- **route**: + - 当为左侧混合菜单时activeMenu无效情况  -  by @yanbowe [(3e4f9)](https://github.com/honghuangdc/soybean-admin/commit/3e4f9e2) + +###    💅 Refactors + +- **layouts**: + - layout/header 反转色样式补充  -  by **元家怿** [(01d0b)](https://github.com/honghuangdc/soybean-admin/commit/01d0bcb) +- **projects**: + - 代码优化  -  by @honghuangdc [(14c14)](https://github.com/honghuangdc/soybean-admin/commit/14c145e) + - 代码优化  -  by @soybeanjs [(3590b)](https://github.com/honghuangdc/soybean-admin/commit/3590b65) + - 代码优化  -  by @soybeanjs [(a1c7e)](https://github.com/honghuangdc/soybean-admin/commit/a1c7e10) + - 代码优化  -  by @soybeanjs [(44ab5)](https://github.com/honghuangdc/soybean-admin/commit/44ab55d) + - 代码优化  -  by @soybeanjs [(095c4)](https://github.com/honghuangdc/soybean-admin/commit/095c432) + - 代码优化  -  by @soybeanjs [(d28b9)](https://github.com/honghuangdc/soybean-admin/commit/d28b903) + - 代码优化  -  by @soybeanjs [(4c2f5)](https://github.com/honghuangdc/soybean-admin/commit/4c2f535) + - 代码优化  -  by @soybeanjs [(d9ac7)](https://github.com/honghuangdc/soybean-admin/commit/d9ac7e4) +- **styles**: + - 代码格式  -  by @soybeanjs [(8f6d6)](https://github.com/honghuangdc/soybean-admin/commit/8f6d6ce) + +###    📖 Documentation + +- **projects**: + - update README.md  -  by @soybeanjs [(3d8be)](https://github.com/honghuangdc/soybean-admin/commit/3d8befa) + - update README.md  -  by @honghuangdc [(21e63)](https://github.com/honghuangdc/soybean-admin/commit/21e6399) + - update README.md  -  by @honghuangdc [(0811f)](https://github.com/honghuangdc/soybean-admin/commit/0811ffa) + - update README.md  -  by @soybeanjs [(84cb0)](https://github.com/honghuangdc/soybean-admin/commit/84cb07b) + - update README.md  -  by @soybeanjs [(4b80a)](https://github.com/honghuangdc/soybean-admin/commit/4b80a66) + - update docs  -  by @honghuangdc [(e9656)](https://github.com/honghuangdc/soybean-admin/commit/e9656c6) + - update README.md  -  by @honghuangdc [(ae99e)](https://github.com/honghuangdc/soybean-admin/commit/ae99e57) + +###    📦 Build + +- **deps**: + - update deps  -  by @honghuangdc [(518f7)](https://github.com/honghuangdc/soybean-admin/commit/518f7ee) + - update deps  -  by @soybeanjs [(92b84)](https://github.com/honghuangdc/soybean-admin/commit/92b8406) + - update deps  -  by @soybeanjs [(50d7c)](https://github.com/honghuangdc/soybean-admin/commit/50d7ccd) + - update deps  -  by @soybeanjs [(3f822)](https://github.com/honghuangdc/soybean-admin/commit/3f822a7) + - update deps  -  by @soybeanjs [(02809)](https://github.com/honghuangdc/soybean-admin/commit/028096e) + - update deps  -  by @soybeanjs [(be45d)](https://github.com/honghuangdc/soybean-admin/commit/be45d83) + - update deps  -  by @soybeanjs [(6a5a3)](https://github.com/honghuangdc/soybean-admin/commit/6a5a357) + - 依赖升级  -  by @honghuangdc [(e3c4a)](https://github.com/honghuangdc/soybean-admin/commit/e3c4a6e) +- **other**: + - update cz config  -  by @honghuangdc [(07baa)](https://github.com/honghuangdc/soybean-admin/commit/07baac7) +- **projects**: + - update config  -  by @soybeanjs [(a0c40)](https://github.com/honghuangdc/soybean-admin/commit/a0c405d) + - 代码优化  -  by @soybeanjs [(de09f)](https://github.com/honghuangdc/soybean-admin/commit/de09f82) + - 配置优化  -  by @honghuangdc [(fd787)](https://github.com/honghuangdc/soybean-admin/commit/fd78791) + - 配置更改  -  by @honghuangdc [(c8717)](https://github.com/honghuangdc/soybean-admin/commit/c8717c2) + +###    🏡 Chore + +- **deps**: + - update deps  -  by @soybeanjs [(a70e4)](https://github.com/honghuangdc/soybean-admin/commit/a70e416) + - update deps  -  by @soybeanjs [(7487a)](https://github.com/honghuangdc/soybean-admin/commit/7487ab7) +- **release**: + - 0.9.5  -  by @soybeanjs [(08d83)](https://github.com/honghuangdc/soybean-admin/commit/08d83ec) + +###    🎨 Styles + +- **GlobalBreadcrumb**: 代码格式fix  -  by @tclyjy [(0243b)](https://github.com/honghuangdc/soybean-admin/commit/0243b27) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![yanbowe](https://github.com/yanbowe.png?size=48)](https://github.com/yanbowe)  [![ThinkDevelop](https://github.com/ThinkDevelop.png?size=48)](https://github.com/ThinkDevelop)  [![tclyjy](https://github.com/tclyjy.png?size=48)](https://github.com/tclyjy)  [![toolvcn](https://github.com/toolvcn.png?size=48)](https://github.com/toolvcn)   +[元家怿](mailto:jiayi.yuan@lkcoffee.com),  + +## [v0.9.4](https://github.com/honghuangdc/soybean-admin/compare/main-0428...v0.9.4) (2022-04-29) + +###    🚀 Features + +- **layouts**: + - 添加侧边栏/头部的反转模式来增加对比度  -  by **元家怿** [(861c8)](https://github.com/honghuangdc/soybean-admin/commit/861c8b9) +- **projects**: + - 引入unocss替换windicss  -  by @honghuangdc [(c9d3e)](https://github.com/honghuangdc/soybean-admin/commit/c9d3e5a) + - HTML lang 修改为 zh-cmn-Hans  -  by @toolvcn [(b9c5c)](https://github.com/honghuangdc/soybean-admin/commit/b9c5c34) + - 权限完善及权限示例页面  -  by @soybeanjs [(80744)](https://github.com/honghuangdc/soybean-admin/commit/807448a) + - mock添加权限过滤  -  by @soybeanjs [(7f435)](https://github.com/honghuangdc/soybean-admin/commit/7f4350a) + +###    🐞 Bug Fixes + +- **projects**: + - 添加.npmrc修复无法获取自动引入的全局组件声明类型  -  by @honghuangdc [(e8488)](https://github.com/honghuangdc/soybean-admin/commit/e8488e4) + - 修复样式  -  by @honghuangdc [(e8999)](https://github.com/honghuangdc/soybean-admin/commit/e899914) + +###    💅 Refactors + +- **projects**: + - mock权限相关数据优化  -  by @soybeanjs [(41e46)](https://github.com/honghuangdc/soybean-admin/commit/41e46a5) + - 代码优化  -  by @soybeanjs [(251b5)](https://github.com/honghuangdc/soybean-admin/commit/251b5b9) + - 代码优化  -  by @honghuangdc [(a7824)](https://github.com/honghuangdc/soybean-admin/commit/a782461) + - 细节优化  -  by @soybeanjs [(c275f)](https://github.com/honghuangdc/soybean-admin/commit/c275f26) + - layout和tab组件依赖名称变更、样式修复  -  by @soybeanjs [(de5fb)](https://github.com/honghuangdc/soybean-admin/commit/de5fb84) + - merge branch unocss to main  -  by @soybeanjs [(69d51)](https://github.com/honghuangdc/soybean-admin/commit/69d5131) + - 动态路由权限完善  -  by @soybeanjs [(55ddc)](https://github.com/honghuangdc/soybean-admin/commit/55ddc9c) + +###    📖 Documentation + +- **projects**: update README.md  -  by @soybeanjs [(d5c75)](https://github.com/honghuangdc/soybean-admin/commit/d5c7511) + +###    📦 Build + +- **deps**: update deps  -  by @honghuangdc [(5c75e)](https://github.com/honghuangdc/soybean-admin/commit/5c75e9d) +- **projects**: 细节调整  -  by @soybeanjs [(401f0)](https://github.com/honghuangdc/soybean-admin/commit/401f0c7) + +###    🏡 Chore + +- **release**: 0.9.4  -  by @soybeanjs [(97c92)](https://github.com/honghuangdc/soybean-admin/commit/97c9262) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![toolvcn](https://github.com/toolvcn.png?size=48)](https://github.com/toolvcn)   +[元家怿](mailto:jiayi.yuan@luckincoffee.com),  + +## [v0.10.2](https://github.com/honghuangdc/soybean-admin/compare/v0.9.3...main-0428) (23-06-07) + +###    🚀 Features + +- **layouts**: + - 添加侧边栏/头部的反转模式来增加对比度  -  by **元家怿** [(3c8dd)](https://github.com/honghuangdc/soybean-admin/commit/3c8dd77) +- **projects**: + - 新增静态路由  -  by @soybeanjs [(ca2df)](https://github.com/honghuangdc/soybean-admin/commit/ca2dfa6) + - 插件方式按需引入naiveUI  -  by @soybeanjs [(6bed9)](https://github.com/honghuangdc/soybean-admin/commit/6bed9ea) + - 添加请求适配器的请求示例  -  by @soybeanjs [(bed42)](https://github.com/honghuangdc/soybean-admin/commit/bed4292) + - 登录页面适配移动端  -  by @soybeanjs [(ec077)](https://github.com/honghuangdc/soybean-admin/commit/ec0776e) + - 登录页背景图片位置适配移动端  -  by @soybeanjs [(24010)](https://github.com/honghuangdc/soybean-admin/commit/24010d0) + - HTML lang 修改为 zh-cmn-Hans  -  by @toolvcn [(dbeb5)](https://github.com/honghuangdc/soybean-admin/commit/dbeb595) + +###    🐞 Bug Fixes + +- **projects**: + - 修复vite alias  -  by @soybeanjs [(cd7ca)](https://github.com/honghuangdc/soybean-admin/commit/cd7ca8f) + - 修复路由守卫的动态路由逻辑  -  by @soybeanjs [(e6c26)](https://github.com/honghuangdc/soybean-admin/commit/e6c26fc) + - 全局搜索弹窗弹出时动画闪屏问题  -  by @yanbowe [(bb1bb)](https://github.com/honghuangdc/soybean-admin/commit/bb1bbf2) + - 去除从环境文件引入端口号导致的错误  -  by @soybeanjs [(2d6d1)](https://github.com/honghuangdc/soybean-admin/commit/2d6d179) + - 修复在新版vite下环境变量获取不到的问题  -  by @soybeanjs [(3fb13)](https://github.com/honghuangdc/soybean-admin/commit/3fb13ca) + - 修复获取vite环境变量的方式  -  by @soybeanjs [(46e1a)](https://github.com/honghuangdc/soybean-admin/commit/46e1ae7) + - 添加获取路由组件文件未找到时的错误提示  -  by @honghuangdc [(219f8)](https://github.com/honghuangdc/soybean-admin/commit/219f87f) + +###    🔥 Performance + +- refresh-koken命名  -  by @southliu [(17155)](https://github.com/honghuangdc/soybean-admin/commit/1715504) + +###    💅 Refactors + +- **projects**: + - lint命令修改  -  by @soybeanjs [(20911)](https://github.com/honghuangdc/soybean-admin/commit/20911dd) + - 代码优化  -  by @soybeanjs [(e8b53)](https://github.com/honghuangdc/soybean-admin/commit/e8b534b) + - 去除在pinia的getters的函数调用副作用,用watch代替  -  by @soybeanjs [(b35ed)](https://github.com/honghuangdc/soybean-admin/commit/b35ed89) + - 代码优化  -  by @honghuangdc [(5e276)](https://github.com/honghuangdc/soybean-admin/commit/5e27642) + +###    📖 Documentation + +- **projects**: + - update README.md  -  by @honghuangdc [(21645)](https://github.com/honghuangdc/soybean-admin/commit/2164553) + - update README.md  -  by @honghuangdc [(9a90f)](https://github.com/honghuangdc/soybean-admin/commit/9a90f18) + - update README.md  -  by @honghuangdc [(60a55)](https://github.com/honghuangdc/soybean-admin/commit/60a55a7) + +###    📦 Build + +- **deps**: update deps  -  by @soybeanjs [(cecce)](https://github.com/honghuangdc/soybean-admin/commit/cecce83) +- **projects**: vite.config代码优化  -  by @soybeanjs [(ca707)](https://github.com/honghuangdc/soybean-admin/commit/ca707a4) + +###    🏡 Chore + +- **deps**: update deps  -  by @soybeanjs [(4eb46)](https://github.com/honghuangdc/soybean-admin/commit/4eb46ea) + +###    🎨 Styles + +- **projects**: update prettier config  -  by @honghuangdc [(df56a)](https://github.com/honghuangdc/soybean-admin/commit/df56abe) + +###    ❤️ Contributors + +[![toolvcn](https://github.com/toolvcn.png?size=48)](https://github.com/toolvcn)  [![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![yanbowe](https://github.com/yanbowe.png?size=48)](https://github.com/yanbowe)  [![southliu](https://github.com/southliu.png?size=48)](https://github.com/southliu)  [![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   +[元家怿](mailto:jiayi.yuan@luckincoffee.com),  + +## [v0.9.3](https://github.com/honghuangdc/soybean-admin/compare/old-version...v0.9.3) (2022-03-12) + +###    🚀 Features + +- **components**: + - svgIcon,添加type,调整size方案  -  by @Lsq128 [(ce4e0)](https://github.com/honghuangdc/soybean-admin/commit/ce4e039) +- **projects**: + - 路由页面跳转权限完成  -  by @soybeanjs [(0d2a5)](https://github.com/honghuangdc/soybean-admin/commit/0d2a562) + - 集成naiveUI主题配置,将css vars添加至html  -  by @soybeanjs [(2c196)](https://github.com/honghuangdc/soybean-admin/commit/2c19684) + - 初始化加载效果:应用主题颜色  -  by @honghuangdc [(035fa)](https://github.com/honghuangdc/soybean-admin/commit/035fa11) + - 登录页面开始迁移  -  by @honghuangdc [(f5a36)](https://github.com/honghuangdc/soybean-admin/commit/f5a36a0) + - 迁移登录完成  -  by @soybeanjs [(b93b8)](https://github.com/honghuangdc/soybean-admin/commit/b93b80c) + - 添加NaiveProvider组件  -  by @honghuangdc [(c804b)](https://github.com/honghuangdc/soybean-admin/commit/c804b21) + - 多级路由的所有子路由转换成二级路由  -  by @honghuangdc [(85b55)](https://github.com/honghuangdc/soybean-admin/commit/85b55bb) + - 新增BasicLayout布局  -  by @soybeanjs [(00646)](https://github.com/honghuangdc/soybean-admin/commit/006467a) + - 创建自定义布局组件SoybeanLayout  -  by @honghuangdc [(0653f)](https://github.com/honghuangdc/soybean-admin/commit/0653fb1) + - 添加抽屉  -  by @honghuangdc [(10e4d)](https://github.com/honghuangdc/soybean-admin/commit/10e4d81) + - theme store完成  -  by @soybeanjs [(bf020)](https://github.com/honghuangdc/soybean-admin/commit/bf020a8) + - 主题配置抽屉:迁移暗黑模式、布局模式、添加颜色选择面板  -  by @soybeanjs [(912bf)](https://github.com/honghuangdc/soybean-admin/commit/912bfdf) + - 主题配置抽屉: 迁移其他功能  -  by @soybeanjs [(6d132)](https://github.com/honghuangdc/soybean-admin/commit/6d132c5) + - 添加头部折叠按钮  -  by @honghuangdc [(a090d)](https://github.com/honghuangdc/soybean-admin/commit/a090d39) + - 添加侧边菜单  -  by @soybeanjs [(e25af)](https://github.com/honghuangdc/soybean-admin/commit/e25afe2) + - 面包屑  -  by @honghuangdc [(09c76)](https://github.com/honghuangdc/soybean-admin/commit/09c7658) + - 请求拦截器添加刷新token  -  by @honghuangdc [(839b8)](https://github.com/honghuangdc/soybean-admin/commit/839b82b) + - 细节完善  -  by @soybeanjs [(cc290)](https://github.com/honghuangdc/soybean-admin/commit/cc290ac) + - 迁移多页签  -  by @soybeanjs [(28efb)](https://github.com/honghuangdc/soybean-admin/commit/28efbdb) + - 细节完善、迁移页面  -  by @soybeanjs [(ce531)](https://github.com/honghuangdc/soybean-admin/commit/ce531ce) + - 添加页面缓存、记录在tab中的缓存页面的滚动条位置  -  by @soybeanjs [(1d63a)](https://github.com/honghuangdc/soybean-admin/commit/1d63a83) + - 添加缓存主题色  -  by @soybeanjs [(37092)](https://github.com/honghuangdc/soybean-admin/commit/3709297) + - 新版重构完成  -  by @soybeanjs [(68b42)](https://github.com/honghuangdc/soybean-admin/commit/68b4230) + - 迁移全局搜索菜单功能  -  by @yanbowe [(554d7)](https://github.com/honghuangdc/soybean-admin/commit/554d7fd) + - 添加naiveUI按需引入  -  by @soybeanjs [(a810e)](https://github.com/honghuangdc/soybean-admin/commit/a810ef8) + - 添加SvgIcon,配置vite plugin  -  by **Liushengqun** [(378d5)](https://github.com/honghuangdc/soybean-admin/commit/378d55a) + - 引入soybean-admin-tab、去除vite-plugin-svg-icons,用unplugin-icons实现自定义svg的iconify写法、代码优化  -  by @soybeanjs [(a1a57)](https://github.com/honghuangdc/soybean-admin/commit/a1a57a1) + - 新增子菜单图标和多页签图标  -  by @soybeanjs [(f5c56)](https://github.com/honghuangdc/soybean-admin/commit/f5c56c3) + - 重构项目的TS类型架构,去除interface文件夹  -  by @soybeanjs [(81914)](https://github.com/honghuangdc/soybean-admin/commit/8191490) + - 添加网络代理  -  by @soybeanjs [(094dc)](https://github.com/honghuangdc/soybean-admin/commit/094dca9) + - 添加全局组件自动引入注册  -  by @soybeanjs [(f5a04)](https://github.com/honghuangdc/soybean-admin/commit/f5a043b) + - 新增自定义svg图标动态渲染  -  by @soybeanjs [(f83c7)](https://github.com/honghuangdc/soybean-admin/commit/f83c7b5) + +###    🐞 Bug Fixes + +- **components**: + - 修复Tab在移动端设备无法点击的问题  -  by @honghuangdc [(2c966)](https://github.com/honghuangdc/soybean-admin/commit/2c9660f) + - 修复组件LoadingEmptyWrapper适应暗黑模式  -  by @soybeanjs [(811b1)](https://github.com/honghuangdc/soybean-admin/commit/811b15e) + - 组件LoadingEmptyWrapper添加背景颜色动画过渡  -  by @soybeanjs [(7add5)](https://github.com/honghuangdc/soybean-admin/commit/7add5c2) +- **projects**: + - 修复redirect-not-found子路由  -  by @honghuangdc [(5bfb8)](https://github.com/honghuangdc/soybean-admin/commit/5bfb819) + - 去除Layout组件冗余代码  -  by @honghuangdc [(0e783)](https://github.com/honghuangdc/soybean-admin/commit/0e783bc) + - 修复面包屑数据  -  by @honghuangdc [(28b5d)](https://github.com/honghuangdc/soybean-admin/commit/28b5d22) + - 修复vertical-mix布局、重构初始化的loading  -  by @soybeanjs [(579e0)](https://github.com/honghuangdc/soybean-admin/commit/579e074) + - 修复未登录时会调用获取用户路由的接口  -  by @soybeanjs [(21bab)](https://github.com/honghuangdc/soybean-admin/commit/21bab1f) + - 修复路由守卫的动态路由逻辑  -  by @soybeanjs [(b61b0)](https://github.com/honghuangdc/soybean-admin/commit/b61b0ce) + - vite配置修复  -  by @soybeanjs [(facc0)](https://github.com/honghuangdc/soybean-admin/commit/facc00e) + - 修复分析页和工作台的布局问题  -  by @honghuangdc [(e93b9)](https://github.com/honghuangdc/soybean-admin/commit/e93b94c) + - 修复项目配置拷贝功能  -  by @soybeanjs [(a7a26)](https://github.com/honghuangdc/soybean-admin/commit/a7a269d) + - 修复页面切换动画无变化  -  by @soybeanjs [(c4546)](https://github.com/honghuangdc/soybean-admin/commit/c4546bd) + - 修复页面切换动画开关不生效  -  by @bundlejs [(9d4ed)](https://github.com/honghuangdc/soybean-admin/commit/9d4ed61) + - 修复 BASE_URL 没有生效的问题  -  by @pany-ang [(72d7d)](https://github.com/honghuangdc/soybean-admin/commit/72d7dcf) + +###    💅 Refactors + +- **components**: + - 去除packages的soybean-layout,通过npm的方式引入  -  by @soybeanjs [(c1182)](https://github.com/honghuangdc/soybean-admin/commit/c1182fe) +- **projects**: + - 精简版+动态路由权限初步  -  by @soybeanjs [(de205)](https://github.com/honghuangdc/soybean-admin/commit/de2057f) + - 单独一级路由相关逻辑重构  -  by @honghuangdc [(ab9a6)](https://github.com/honghuangdc/soybean-admin/commit/ab9a6a2) + - 单独路由逻辑重构、路由转换函数优化  -  by @soybeanjs [(b36a6)](https://github.com/honghuangdc/soybean-admin/commit/b36a62b) + - 恢复pinia默认写法  -  by @soybeanjs [(b2a4d)](https://github.com/honghuangdc/soybean-admin/commit/b2a4ddf) + - 请求构造函数适配不同后端接口的数据结构  -  by @soybeanjs [(4f9d5)](https://github.com/honghuangdc/soybean-admin/commit/4f9d544) + - 细节完善  -  by @soybeanjs [(651e5)](https://github.com/honghuangdc/soybean-admin/commit/651e58d) + - 重构路由页面组件的导入  -  by @honghuangdc [(e6503)](https://github.com/honghuangdc/soybean-admin/commit/e65034d) + - 代码优化  -  by @soybeanjs [(4e31a)](https://github.com/honghuangdc/soybean-admin/commit/4e31abd) + +###    📖 Documentation + +- **other**: + - 注释文案修改  -  by **毛博文** [(d0064)](https://github.com/honghuangdc/soybean-admin/commit/d00643c) +- **projects**: + - update README.md  -  by @soybeanjs [(5eddb)](https://github.com/honghuangdc/soybean-admin/commit/5eddb49) + - update README.md  -  by @soybeanjs [(02c51)](https://github.com/honghuangdc/soybean-admin/commit/02c51e6) + - update README.md  -  by @honghuangdc [(47f28)](https://github.com/honghuangdc/soybean-admin/commit/47f2871) + - update README.md  -  by @honghuangdc [(7ed5d)](https://github.com/honghuangdc/soybean-admin/commit/7ed5d0d) + - update README.md  -  by @honghuangdc [(3befb)](https://github.com/honghuangdc/soybean-admin/commit/3befb22) + - update README.md  -  by @honghuangdc [(e856c)](https://github.com/honghuangdc/soybean-admin/commit/e856cdb) + - update README.md  -  by @soybeanjs [(3aded)](https://github.com/honghuangdc/soybean-admin/commit/3aded40) + - update README.md  -  by @soybeanjs [(225e7)](https://github.com/honghuangdc/soybean-admin/commit/225e712) + - update README.md  -  by @honghuangdc [(5b401)](https://github.com/honghuangdc/soybean-admin/commit/5b401a7) + - update README.md  -  by @honghuangdc [(8cdad)](https://github.com/honghuangdc/soybean-admin/commit/8cdad54) + - update README.md  -  by @soybeanjs [(a0dfa)](https://github.com/honghuangdc/soybean-admin/commit/a0dfa3d) + - update README.md  -  by @soybeanjs [(b8db2)](https://github.com/honghuangdc/soybean-admin/commit/b8db211) + +###    📦 Build + +- **deps**: + - 升级依赖  -  by @soybeanjs [(284af)](https://github.com/honghuangdc/soybean-admin/commit/284af63) + - 升级依赖  -  by @soybeanjs [(57c69)](https://github.com/honghuangdc/soybean-admin/commit/57c692b) + - 升级依赖  -  by @soybeanjs [(7ba33)](https://github.com/honghuangdc/soybean-admin/commit/7ba332c) + - upgrade deps  -  by @soybeanjs [(50c8b)](https://github.com/honghuangdc/soybean-admin/commit/50c8b9d) + - upgrade deps  -  by @soybeanjs [(8d00b)](https://github.com/honghuangdc/soybean-admin/commit/8d00b23) + - upgrade deps  -  by @soybeanjs [(b298a)](https://github.com/honghuangdc/soybean-admin/commit/b298af1) +- **projects**: + - 修改vscode配置  -  by @honghuangdc [(0c577)](https://github.com/honghuangdc/soybean-admin/commit/0c5770d) + - 添加vercel打包的环境  -  by @honghuangdc [(371fa)](https://github.com/honghuangdc/soybean-admin/commit/371fad4) + - add license  -  by @soybeanjs [(b1672)](https://github.com/honghuangdc/soybean-admin/commit/b16721b) + - 更新tsconfig.json  -  by @soybeanjs [(f42ee)](https://github.com/honghuangdc/soybean-admin/commit/f42ee9d) + - update tsconfig、eslintrc  -  by @soybeanjs [(75de2)](https://github.com/honghuangdc/soybean-admin/commit/75de2b0) + +###    🏡 Chore + +- **release**: + - 0.1.1 精简版发布  -  by @soybeanjs [(db3c2)](https://github.com/honghuangdc/soybean-admin/commit/db3c25e) + - 0.1.2  -  by @soybeanjs [(db75c)](https://github.com/honghuangdc/soybean-admin/commit/db75c91) + - 0.1.3  -  by @soybeanjs [(32a7c)](https://github.com/honghuangdc/soybean-admin/commit/32a7cc4) + - 0.9.1  -  by @soybeanjs [(be374)](https://github.com/honghuangdc/soybean-admin/commit/be37408) + - 0.9.2  -  by @honghuangdc [(11407)](https://github.com/honghuangdc/soybean-admin/commit/1140722) + - 0.9.3  -  by @soybeanjs [(d0522)](https://github.com/honghuangdc/soybean-admin/commit/d0522ce) + +###    🎨 Styles + +- **components**: 代码优化  -  by @soybeanjs [(1e2fd)](https://github.com/honghuangdc/soybean-admin/commit/1e2fdda) +- **projects**: 路由相关文件夹简化  -  by @honghuangdc [(e5793)](https://github.com/honghuangdc/soybean-admin/commit/e5793e1) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![pany-ang](https://github.com/pany-ang.png?size=48)](https://github.com/pany-ang)  [![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![bundlejs](https://github.com/bundlejs.png?size=48)](https://github.com/bundlejs)  [![Lsq128](https://github.com/Lsq128.png?size=48)](https://github.com/Lsq128)  [![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![yanbowe](https://github.com/yanbowe.png?size=48)](https://github.com/yanbowe)   +[毛博文](mailto:maobowen@bonc.com.cn), [Liushengqun](mailto:18232366809@163.com),  + +## [v0.10.2](https://github.com/honghuangdc/soybean-admin/compare/v0.9.2...old-version) (23-06-07) + +###    🚀 Features + +- **projects**: + - 路由页面跳转权限完成  -  by @soybeanjs [(0d2a5)](https://github.com/honghuangdc/soybean-admin/commit/0d2a562) + - 集成naiveUI主题配置,将css vars添加至html  -  by @soybeanjs [(2c196)](https://github.com/honghuangdc/soybean-admin/commit/2c19684) + - 初始化加载效果:应用主题颜色  -  by @honghuangdc [(035fa)](https://github.com/honghuangdc/soybean-admin/commit/035fa11) + - 登录页面开始迁移  -  by @honghuangdc [(f5a36)](https://github.com/honghuangdc/soybean-admin/commit/f5a36a0) + - 迁移登录完成  -  by @soybeanjs [(b93b8)](https://github.com/honghuangdc/soybean-admin/commit/b93b80c) + - 添加NaiveProvider组件  -  by @honghuangdc [(c804b)](https://github.com/honghuangdc/soybean-admin/commit/c804b21) + - 多级路由的所有子路由转换成二级路由  -  by @honghuangdc [(85b55)](https://github.com/honghuangdc/soybean-admin/commit/85b55bb) + - 新增BasicLayout布局  -  by @soybeanjs [(00646)](https://github.com/honghuangdc/soybean-admin/commit/006467a) + - 创建自定义布局组件SoybeanLayout  -  by @honghuangdc [(0653f)](https://github.com/honghuangdc/soybean-admin/commit/0653fb1) + - 添加抽屉  -  by @honghuangdc [(10e4d)](https://github.com/honghuangdc/soybean-admin/commit/10e4d81) + - theme store完成  -  by @soybeanjs [(bf020)](https://github.com/honghuangdc/soybean-admin/commit/bf020a8) + - 主题配置抽屉:迁移暗黑模式、布局模式、添加颜色选择面板  -  by @soybeanjs [(912bf)](https://github.com/honghuangdc/soybean-admin/commit/912bfdf) + - 主题配置抽屉: 迁移其他功能  -  by @soybeanjs [(6d132)](https://github.com/honghuangdc/soybean-admin/commit/6d132c5) + - 添加头部折叠按钮  -  by @honghuangdc [(a090d)](https://github.com/honghuangdc/soybean-admin/commit/a090d39) + - 添加侧边菜单  -  by @soybeanjs [(e25af)](https://github.com/honghuangdc/soybean-admin/commit/e25afe2) + - 面包屑  -  by @honghuangdc [(09c76)](https://github.com/honghuangdc/soybean-admin/commit/09c7658) + - 请求拦截器添加刷新token  -  by @honghuangdc [(839b8)](https://github.com/honghuangdc/soybean-admin/commit/839b82b) + - 细节完善  -  by @soybeanjs [(cc290)](https://github.com/honghuangdc/soybean-admin/commit/cc290ac) + - 迁移多页签  -  by @soybeanjs [(28efb)](https://github.com/honghuangdc/soybean-admin/commit/28efbdb) + - 细节完善、迁移页面  -  by @soybeanjs [(ce531)](https://github.com/honghuangdc/soybean-admin/commit/ce531ce) + - 添加页面缓存、记录在tab中的缓存页面的滚动条位置  -  by @soybeanjs [(1d63a)](https://github.com/honghuangdc/soybean-admin/commit/1d63a83) + - 添加缓存主题色  -  by @soybeanjs [(37092)](https://github.com/honghuangdc/soybean-admin/commit/3709297) + - 新版重构完成  -  by @soybeanjs [(68b42)](https://github.com/honghuangdc/soybean-admin/commit/68b4230) + - 迁移全局搜索菜单功能  -  by @yanbowe [(554d7)](https://github.com/honghuangdc/soybean-admin/commit/554d7fd) + +###    🐞 Bug Fixes + +- **components**: + - 修复Tab在移动端设备无法点击的问题  -  by @honghuangdc [(2c966)](https://github.com/honghuangdc/soybean-admin/commit/2c9660f) +- **projects**: + - 修复redirect-not-found子路由  -  by @honghuangdc [(5bfb8)](https://github.com/honghuangdc/soybean-admin/commit/5bfb819) + - 去除Layout组件冗余代码  -  by @honghuangdc [(0e783)](https://github.com/honghuangdc/soybean-admin/commit/0e783bc) + - 修复面包屑数据  -  by @honghuangdc [(28b5d)](https://github.com/honghuangdc/soybean-admin/commit/28b5d22) + - 修复vertical-mix布局、重构初始化的loading  -  by @soybeanjs [(579e0)](https://github.com/honghuangdc/soybean-admin/commit/579e074) + - 修复未登录时会调用获取用户路由的接口  -  by @soybeanjs [(21bab)](https://github.com/honghuangdc/soybean-admin/commit/21bab1f) + - 修复路由守卫的动态路由逻辑  -  by @soybeanjs [(b61b0)](https://github.com/honghuangdc/soybean-admin/commit/b61b0ce) + - vite配置修复  -  by @soybeanjs [(facc0)](https://github.com/honghuangdc/soybean-admin/commit/facc00e) + - 修复分析页和工作台的布局问题  -  by @honghuangdc [(e93b9)](https://github.com/honghuangdc/soybean-admin/commit/e93b94c) + - 修复项目配置拷贝功能  -  by @soybeanjs [(a7a26)](https://github.com/honghuangdc/soybean-admin/commit/a7a269d) + +###    💅 Refactors + +- **projects**: + - 精简版+动态路由权限初步  -  by @soybeanjs [(de205)](https://github.com/honghuangdc/soybean-admin/commit/de2057f) + - 单独一级路由相关逻辑重构  -  by @honghuangdc [(ab9a6)](https://github.com/honghuangdc/soybean-admin/commit/ab9a6a2) + - 单独路由逻辑重构、路由转换函数优化  -  by @soybeanjs [(b36a6)](https://github.com/honghuangdc/soybean-admin/commit/b36a62b) + - 恢复pinia默认写法  -  by @soybeanjs [(b2a4d)](https://github.com/honghuangdc/soybean-admin/commit/b2a4ddf) + - 请求构造函数适配不同后端接口的数据结构  -  by @soybeanjs [(4f9d5)](https://github.com/honghuangdc/soybean-admin/commit/4f9d544) + - 细节完善  -  by @soybeanjs [(651e5)](https://github.com/honghuangdc/soybean-admin/commit/651e58d) + - 重构路由页面组件的导入  -  by @honghuangdc [(e6503)](https://github.com/honghuangdc/soybean-admin/commit/e65034d) + +###    📖 Documentation + +- **projects**: + - update README.md  -  by @soybeanjs [(5eddb)](https://github.com/honghuangdc/soybean-admin/commit/5eddb49) + - update README.md  -  by @soybeanjs [(02c51)](https://github.com/honghuangdc/soybean-admin/commit/02c51e6) + - update README.md  -  by @honghuangdc [(47f28)](https://github.com/honghuangdc/soybean-admin/commit/47f2871) + - update README.md  -  by @honghuangdc [(7ed5d)](https://github.com/honghuangdc/soybean-admin/commit/7ed5d0d) + - update README.md  -  by @honghuangdc [(3befb)](https://github.com/honghuangdc/soybean-admin/commit/3befb22) + +###    📦 Build + +- **projects**: + - 修改vscode配置  -  by @honghuangdc [(0c577)](https://github.com/honghuangdc/soybean-admin/commit/0c5770d) + - 添加vercel打包的环境  -  by @honghuangdc [(371fa)](https://github.com/honghuangdc/soybean-admin/commit/371fad4) + - add license  -  by @soybeanjs [(b1672)](https://github.com/honghuangdc/soybean-admin/commit/b16721b) + +###    🏡 Chore + +- **release**: + - 0.1.1 精简版发布  -  by @soybeanjs [(db3c2)](https://github.com/honghuangdc/soybean-admin/commit/db3c25e) + - 0.1.2  -  by @soybeanjs [(db75c)](https://github.com/honghuangdc/soybean-admin/commit/db75c91) + - 0.1.3  -  by @soybeanjs [(32a7c)](https://github.com/honghuangdc/soybean-admin/commit/32a7cc4) + - 0.9.1  -  by @soybeanjs [(be374)](https://github.com/honghuangdc/soybean-admin/commit/be37408) + - 0.9.2  -  by @honghuangdc [(11407)](https://github.com/honghuangdc/soybean-admin/commit/1140722) + +###    🎨 Styles + +- **projects**: 路由相关文件夹简化  -  by @honghuangdc [(e5793)](https://github.com/honghuangdc/soybean-admin/commit/e5793e1) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![yanbowe](https://github.com/yanbowe.png?size=48)](https://github.com/yanbowe)   + +## [v0.9.2](https://github.com/honghuangdc/soybean-admin/compare/v0.9.1...v0.9.2) (2022-02-11) + +###    🚀 Features + +- **projects**: 迁移全局搜索菜单功能  -  by @yanbowe [(554d7)](https://github.com/honghuangdc/soybean-admin/commit/554d7fd) + +###    🐞 Bug Fixes + +- **components**: + - 修复Tab在移动端设备无法点击的问题  -  by @honghuangdc [(2c966)](https://github.com/honghuangdc/soybean-admin/commit/2c9660f) +- **projects**: + - vite配置修复  -  by @soybeanjs [(facc0)](https://github.com/honghuangdc/soybean-admin/commit/facc00e) + - 修复分析页和工作台的布局问题  -  by @honghuangdc [(e93b9)](https://github.com/honghuangdc/soybean-admin/commit/e93b94c) + - 修复项目配置拷贝功能  -  by @soybeanjs [(a7a26)](https://github.com/honghuangdc/soybean-admin/commit/a7a269d) + +###    💅 Refactors + +- **projects**: 重构路由页面组件的导入  -  by @honghuangdc [(e6503)](https://github.com/honghuangdc/soybean-admin/commit/e65034d) + +###    📖 Documentation + +- **projects**: + - update README.md  -  by @soybeanjs [(02c51)](https://github.com/honghuangdc/soybean-admin/commit/02c51e6) + - update README.md  -  by @honghuangdc [(47f28)](https://github.com/honghuangdc/soybean-admin/commit/47f2871) + - update README.md  -  by @honghuangdc [(7ed5d)](https://github.com/honghuangdc/soybean-admin/commit/7ed5d0d) + - update README.md  -  by @honghuangdc [(3befb)](https://github.com/honghuangdc/soybean-admin/commit/3befb22) + +###    📦 Build + +- **projects**: add license  -  by @soybeanjs [(b1672)](https://github.com/honghuangdc/soybean-admin/commit/b16721b) + +###    🏡 Chore + +- **release**: 0.9.2  -  by @honghuangdc [(11407)](https://github.com/honghuangdc/soybean-admin/commit/1140722) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![yanbowe](https://github.com/yanbowe.png?size=48)](https://github.com/yanbowe)   + +## [v0.9.1](https://github.com/honghuangdc/soybean-admin/compare/v0.1.3...v0.9.1) (2022-01-24) + +###    🚀 Features + +- **projects**: 新版重构完成  -  by @soybeanjs [(68b42)](https://github.com/honghuangdc/soybean-admin/commit/68b4230) + +###    🏡 Chore + +- **release**: 0.9.1  -  by @soybeanjs [(be374)](https://github.com/honghuangdc/soybean-admin/commit/be37408) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)   + +## [v0.1.3](https://github.com/honghuangdc/soybean-admin/compare/v0.1.2...v0.1.3) (2022-01-24) + +###    🐞 Bug Fixes + +- **projects**: + - 修复未登录时会调用获取用户路由的接口  -  by @soybeanjs [(21bab)](https://github.com/honghuangdc/soybean-admin/commit/21bab1f) + - 修复路由守卫的动态路由逻辑  -  by @soybeanjs [(b61b0)](https://github.com/honghuangdc/soybean-admin/commit/b61b0ce) + +###    💅 Refactors + +- **projects**: + - 请求构造函数适配不同后端接口的数据结构  -  by @soybeanjs [(4f9d5)](https://github.com/honghuangdc/soybean-admin/commit/4f9d544) + - 细节完善  -  by @soybeanjs [(651e5)](https://github.com/honghuangdc/soybean-admin/commit/651e58d) + +###    🏡 Chore + +- **release**: 0.1.3  -  by @soybeanjs [(32a7c)](https://github.com/honghuangdc/soybean-admin/commit/32a7cc4) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)   + +## [v0.1.2](https://github.com/honghuangdc/soybean-admin/compare/v0.1.1...v0.1.2) (2022-01-22) + +###    🚀 Features + +- **projects**: + - 添加页面缓存、记录在tab中的缓存页面的滚动条位置  -  by @soybeanjs [(1d63a)](https://github.com/honghuangdc/soybean-admin/commit/1d63a83) + - 添加缓存主题色  -  by @soybeanjs [(37092)](https://github.com/honghuangdc/soybean-admin/commit/3709297) + +###    🏡 Chore + +- **release**: 0.1.2  -  by @soybeanjs [(db75c)](https://github.com/honghuangdc/soybean-admin/commit/db75c91) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)   + +## [v0.1.1](https://github.com/honghuangdc/soybean-admin/compare/v0.0.5...v0.1.1) (2022-01-20) + +###    🚀 Features + +- **projects**: + - 添加路由跳转浏览器新标签  -  by @honghuangdc [(987ce)](https://github.com/honghuangdc/soybean-admin/commit/987cef3) + - 添加常用组件、composables函数  -  by @soybeanjs [(230a5)](https://github.com/honghuangdc/soybean-admin/commit/230a50a) + - 添加表格页面示例  -  by @soybeanjs [(51c74)](https://github.com/honghuangdc/soybean-admin/commit/51c744c) + - 增加Icon选择器组件  -  by @yanbowe [(9472b)](https://github.com/honghuangdc/soybean-admin/commit/9472b51) + - 图标选择器增加扩展树形  -  by @yanbowe [(04101)](https://github.com/honghuangdc/soybean-admin/commit/041012b) + - 增加项目文档外链  -  by @yanbowe [(1901a)](https://github.com/honghuangdc/soybean-admin/commit/1901a0b) + - 引入mockjs  -  by @soybeanjs [(9bc68)](https://github.com/honghuangdc/soybean-admin/commit/9bc682d) + - 增加全局搜索菜单功能  -  by @yanbowe [(b9ce6)](https://github.com/honghuangdc/soybean-admin/commit/b9ce691) + - 菜单搜索增加大小写转换  -  by @yanbowe [(29078)](https://github.com/honghuangdc/soybean-admin/commit/2907868) + - 添加cryptojs,对本地缓存数据进行加密  -  by @soybeanjs [(7a064)](https://github.com/honghuangdc/soybean-admin/commit/7a0648d) + - 路由页面跳转权限完成  -  by @soybeanjs [(0d2a5)](https://github.com/honghuangdc/soybean-admin/commit/0d2a562) + - 集成naiveUI主题配置,将css vars添加至html  -  by @soybeanjs [(2c196)](https://github.com/honghuangdc/soybean-admin/commit/2c19684) + - 初始化加载效果:应用主题颜色  -  by @honghuangdc [(035fa)](https://github.com/honghuangdc/soybean-admin/commit/035fa11) + - 登录页面开始迁移  -  by @honghuangdc [(f5a36)](https://github.com/honghuangdc/soybean-admin/commit/f5a36a0) + - 迁移登录完成  -  by @soybeanjs [(b93b8)](https://github.com/honghuangdc/soybean-admin/commit/b93b80c) + - 添加NaiveProvider组件  -  by @honghuangdc [(c804b)](https://github.com/honghuangdc/soybean-admin/commit/c804b21) + - 多级路由的所有子路由转换成二级路由  -  by @honghuangdc [(85b55)](https://github.com/honghuangdc/soybean-admin/commit/85b55bb) + - 新增BasicLayout布局  -  by @soybeanjs [(00646)](https://github.com/honghuangdc/soybean-admin/commit/006467a) + - 创建自定义布局组件SoybeanLayout  -  by @honghuangdc [(0653f)](https://github.com/honghuangdc/soybean-admin/commit/0653fb1) + - 添加抽屉  -  by @honghuangdc [(10e4d)](https://github.com/honghuangdc/soybean-admin/commit/10e4d81) + - theme store完成  -  by @soybeanjs [(bf020)](https://github.com/honghuangdc/soybean-admin/commit/bf020a8) + - 主题配置抽屉:迁移暗黑模式、布局模式、添加颜色选择面板  -  by @soybeanjs [(912bf)](https://github.com/honghuangdc/soybean-admin/commit/912bfdf) + - 主题配置抽屉: 迁移其他功能  -  by @soybeanjs [(6d132)](https://github.com/honghuangdc/soybean-admin/commit/6d132c5) + - 添加头部折叠按钮  -  by @honghuangdc [(a090d)](https://github.com/honghuangdc/soybean-admin/commit/a090d39) + - 添加侧边菜单  -  by @soybeanjs [(e25af)](https://github.com/honghuangdc/soybean-admin/commit/e25afe2) + - 面包屑  -  by @honghuangdc [(09c76)](https://github.com/honghuangdc/soybean-admin/commit/09c7658) + - 请求拦截器添加刷新token  -  by @honghuangdc [(839b8)](https://github.com/honghuangdc/soybean-admin/commit/839b82b) + - 细节完善  -  by @soybeanjs [(cc290)](https://github.com/honghuangdc/soybean-admin/commit/cc290ac) + - 迁移多页签  -  by @soybeanjs [(28efb)](https://github.com/honghuangdc/soybean-admin/commit/28efbdb) + - 细节完善、迁移页面  -  by @soybeanjs [(ce531)](https://github.com/honghuangdc/soybean-admin/commit/ce531ce) + +###    🐞 Bug Fixes + +- **deps**: + - 降低vite版本  -  by @honghuangdc [(c9c5c)](https://github.com/honghuangdc/soybean-admin/commit/c9c5ca9) +- **projects**: + - 修复网络请求错误空信息的提示  -  by @honghuangdc [(ff921)](https://github.com/honghuangdc/soybean-admin/commit/ff9216b) + - 请求相关细节修复  -  by @honghuangdc [(2ad1a)](https://github.com/honghuangdc/soybean-admin/commit/2ad1ad3) + - 修复redirect-not-found子路由  -  by @honghuangdc [(5bfb8)](https://github.com/honghuangdc/soybean-admin/commit/5bfb819) + - 去除Layout组件冗余代码  -  by @honghuangdc [(0e783)](https://github.com/honghuangdc/soybean-admin/commit/0e783bc) + - 修复面包屑数据  -  by @honghuangdc [(28b5d)](https://github.com/honghuangdc/soybean-admin/commit/28b5d22) + - 修复vertical-mix布局、重构初始化的loading  -  by @soybeanjs [(579e0)](https://github.com/honghuangdc/soybean-admin/commit/579e074) + +###    💅 Refactors + +- **projects**: + - 登录模块由query变更为动态路由params  -  by @honghuangdc [(225c4)](https://github.com/honghuangdc/soybean-admin/commit/225c4fe) + - 精简版+动态路由权限初步  -  by @soybeanjs [(de205)](https://github.com/honghuangdc/soybean-admin/commit/de2057f) + - 单独一级路由相关逻辑重构  -  by @honghuangdc [(ab9a6)](https://github.com/honghuangdc/soybean-admin/commit/ab9a6a2) + - 单独路由逻辑重构、路由转换函数优化  -  by @soybeanjs [(b36a6)](https://github.com/honghuangdc/soybean-admin/commit/b36a62b) + - 恢复pinia默认写法  -  by @soybeanjs [(b2a4d)](https://github.com/honghuangdc/soybean-admin/commit/b2a4ddf) +- **styles**: + - 样式调整  -  by @honghuangdc [(f2910)](https://github.com/honghuangdc/soybean-admin/commit/f29106e) + +###    📖 Documentation + +- **projects**: + - update README.md  -  by @honghuangdc [(659e4)](https://github.com/honghuangdc/soybean-admin/commit/659e460) + - update README.md  -  by @honghuangdc [(90ddf)](https://github.com/honghuangdc/soybean-admin/commit/90ddf98) + - update README.md  -  by @soybeanjs [(5eddb)](https://github.com/honghuangdc/soybean-admin/commit/5eddb49) + +###    📦 Build + +- **deps**: + - 升级依赖  -  by @soybeanjs [(ae7ec)](https://github.com/honghuangdc/soybean-admin/commit/ae7ec99) + - 升级依赖  -  by @soybeanjs [(e755c)](https://github.com/honghuangdc/soybean-admin/commit/e755caa) + - 升级依赖  -  by @honghuangdc [(f3c86)](https://github.com/honghuangdc/soybean-admin/commit/f3c86ef) + - 升级依赖  -  by @honghuangdc [(e776d)](https://github.com/honghuangdc/soybean-admin/commit/e776df4) + - 升级依赖  -  by @soybeanjs [(777cf)](https://github.com/honghuangdc/soybean-admin/commit/777cf8e) +- **projects**: + - 环境变量获取方式变更  -  by @honghuangdc [(21c2f)](https://github.com/honghuangdc/soybean-admin/commit/21c2f5a) + - 修改vscode配置  -  by @honghuangdc [(0c577)](https://github.com/honghuangdc/soybean-admin/commit/0c5770d) + - 添加vercel打包的环境  -  by @honghuangdc [(371fa)](https://github.com/honghuangdc/soybean-admin/commit/371fad4) + +###    🏡 Chore + +- **release**: 0.1.1 精简版发布  -  by @soybeanjs [(db3c2)](https://github.com/honghuangdc/soybean-admin/commit/db3c25e) + +###    🎨 Styles + +- **projects**: 路由相关文件夹简化  -  by @honghuangdc [(e5793)](https://github.com/honghuangdc/soybean-admin/commit/e5793e1) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![yanbowe](https://github.com/yanbowe.png?size=48)](https://github.com/yanbowe)  [![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   + +## [v0.0.5](https://github.com/honghuangdc/soybean-admin/compare/v0.0.4...v0.0.5) (2021-11-28) + +###    🚀 Features + +- **projects**: 新增组件页面:按钮、卡片示例  -  by @soybeanjs [(bdc39)](https://github.com/honghuangdc/soybean-admin/commit/bdc39af) + +###    🐞 Bug Fixes + +- **components**: 修复HorizontalLayout布局  -  by @soybeanjs [(9fb64)](https://github.com/honghuangdc/soybean-admin/commit/9fb641f) + +###    💅 Refactors + +- **projects**: + - 重构路由类型和路由元数据类型,重构多级菜单路由写法  -  by @soybeanjs [(d6838)](https://github.com/honghuangdc/soybean-admin/commit/d683894) + - 优化路由导入页面写法,页面路由调整  -  by @soybeanjs [(0b10b)](https://github.com/honghuangdc/soybean-admin/commit/0b10b50) + +###    📦 Build + +- **deps**: 升级依赖  -  by @soybeanjs [(a6bdc)](https://github.com/honghuangdc/soybean-admin/commit/a6bdc38) + +###    🏡 Chore + +- **release**: 0.0.5  -  by @soybeanjs [(e53e7)](https://github.com/honghuangdc/soybean-admin/commit/e53e793) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)   + +## [v0.0.4](https://github.com/honghuangdc/soybean-admin/compare/v0.0.3...v0.0.4) (2021-11-25) + +###    🚀 Features + +- **components**: 添加多页签Tab点击后自动往中间滚动  -  by @soybeanjs [(8ce62)](https://github.com/honghuangdc/soybean-admin/commit/8ce627a) +- **projects**: 新增网址导航页面  -  by @honghuangdc [(32aa5)](https://github.com/honghuangdc/soybean-admin/commit/32aa5ee) +- **storage**: local存储增加有效期  -  by @yanbowe [(e6c9b)](https://github.com/honghuangdc/soybean-admin/commit/e6c9b35) + +###    🐞 Bug Fixes + +- **components**: + - 修复多页签Tab自动滚动问题  -  by @soybeanjs [(20aa3)](https://github.com/honghuangdc/soybean-admin/commit/20aa39f) + - 修复多页签按钮风格的tab滚动问题  -  by @soybeanjs [(c429c)](https://github.com/honghuangdc/soybean-admin/commit/c429cd0) +- **projects**: + - 修复打包构建时图标错误  -  by @soybeanjs [(93f9a)](https://github.com/honghuangdc/soybean-admin/commit/93f9aa9) + - 添加西瓜视频实例在onUnMounted的销毁,多页签居中距离精确  -  by @soybeanjs [(73896)](https://github.com/honghuangdc/soybean-admin/commit/738964a) +- **types**: + - 添加dotEnv类型的非空判断  -  by @soybeanjs [(cff11)](https://github.com/honghuangdc/soybean-admin/commit/cff11d9) + +###    💅 Refactors + +- **components**: + - blankLayout引入GlobalContent  -  by @soybeanjs [(1ffb7)](https://github.com/honghuangdc/soybean-admin/commit/1ffb75a) +- **projects**: + - axios处理的请求结果去除网路状态  -  by @honghuangdc [(05696)](https://github.com/honghuangdc/soybean-admin/commit/0569666) + - 文件夹位置规范  -  by @honghuangdc [(f5a5f)](https://github.com/honghuangdc/soybean-admin/commit/f5a5f44) + - 细节完善  -  by @honghuangdc [(62611)](https://github.com/honghuangdc/soybean-admin/commit/6261156) + +###    📖 Documentation + +- **projects**: + - update README.md  -  by @soybeanjs [(54577)](https://github.com/honghuangdc/soybean-admin/commit/54577f1) + - update README.md  -  by @honghuangdc [(1b346)](https://github.com/honghuangdc/soybean-admin/commit/1b3463d) + - update README.md  -  by @honghuangdc [(98a7d)](https://github.com/honghuangdc/soybean-admin/commit/98a7d25) + +###    🏡 Chore + +- **release**: 0.0.4  -  by @soybeanjs [(8b27f)](https://github.com/honghuangdc/soybean-admin/commit/8b27fc8) + +###    ❤️ Contributors + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![yanbowe](https://github.com/yanbowe.png?size=48)](https://github.com/yanbowe)   + +## [v0.0.3](https://github.com/honghuangdc/soybean-admin/compare/v0.0.2...v0.0.3) (2021-11-23) + +###    💅 Refactors + +- **projects**: + - 请求函数重构初步  -  by @soybeanjs [(9f643)](https://github.com/honghuangdc/soybean-admin/commit/9f64321) + - axios封装:文件夹规范,错误处理完善  -  by @honghuangdc [(451c7)](https://github.com/honghuangdc/soybean-admin/commit/451c754) + - axios封装完成  -  by @soybeanjs [(03b39)](https://github.com/honghuangdc/soybean-admin/commit/03b398a) + +###    📦 Build + +- **deps**: + - 升级依赖  -  by @soybeanjs [(4e04a)](https://github.com/honghuangdc/soybean-admin/commit/4e04a8f) + - 升级依赖  -  by @soybeanjs [(c8122)](https://github.com/honghuangdc/soybean-admin/commit/c81221e) + +###    🏡 Chore + +- **release**: 0.0.3  -  by @honghuangdc [(e1dac)](https://github.com/honghuangdc/soybean-admin/commit/e1dacdb) + +###    ❤️ Contributors + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)   + + + diff --git a/CHANGELOG.zh_CN.md b/CHANGELOG.zh_CN.md new file mode 100644 index 0000000..79587cd --- /dev/null +++ b/CHANGELOG.zh_CN.md @@ -0,0 +1,634 @@ +# 更新日志 + +## [v1.3.5](https://github.com/soybeanjs/soybean-admin/compare/v1.3.4...v1.3.5) (2024-09-07) + +###    🚀 新功能 + +- **packages**: + - @sa/axios: 成功时将响应添加到 flatRequest  -  by @soybeanjs [(c4e16)](https://github.com/soybeanjs/soybean-admin/commit/c4e1610) +- **projects**: + - README.zh_CN.md 添加合作推广  -  by @PZ-18664918826 in https://github.com/soybeanjs/soybean-admin/issues/601 [(2fa40)](https://github.com/soybeanjs/soybean-admin/commit/2fa400b) + - 根据 Apache 规范添加更多提交类型  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/610 [(878d9)](https://github.com/soybeanjs/soybean-admin/commit/878d9c3) + - 配置是否支持自动更新。关闭#612  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/617 和 https://github.com/soybeanjs/soybean-admin/issues/612 [(4c9f4)](https://github.com/soybeanjs/soybean-admin/commit/4c9f4e0) + - 添加应用错误处理程序。关闭 #587  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/587 [(be855)](https://github.com/soybeanjs/soybean-admin/commit/be8556c) + +###    🐞 Bug 修复 + +- **deps**: + - 将 json5 从 devDependencies 移到 dependencies 以支持生产环境使用  -  by @mufeng889 in https://github.com/soybeanjs/soybean-admin/issues/618 [(7cb43)](https://github.com/soybeanjs/soybean-admin/commit/7cb43fc) +- **projects**: + - 避免检索缓存的 HTML  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/605 [(ef6cf)](https://github.com/soybeanjs/soybean-admin/commit/ef6cf93) + - 修复登录重定向  -  by @soybeanjs [(3830e)](https://github.com/soybeanjs/soybean-admin/commit/3830ec7) + - 修复侧边栏折叠时的 vertical-mix-menu。修复 #608  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/608 [(c3f1f)](https://github.com/soybeanjs/soybean-admin/commit/c3f1f69) + - 修复 activeMenu 为父菜单时的面包屑。修复 #589  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/589 [(79b2a)](https://github.com/soybeanjs/soybean-admin/commit/79b2a28) + - 修复遇到多请求时的刷新令牌。修复 #581  -  by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/581 [(27b52)](https://github.com/soybeanjs/soybean-admin/commit/27b5222) +- **types**: + - 修复 TableApiFn 的类型  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/599 [(26c93)](https://github.com/soybeanjs/soybean-admin/commit/26c93df) + +###    🛠 优化 + +- **projects**: 优化菜单 selectedKey  -  by @soybeanjs [(531bf)](https://github.com/soybeanjs/soybean-admin/commit/531bfaf) + +###    📖 文档 + +- **projects**: + - 更新 README  -  by @mufeng889 in https://github.com/soybeanjs/soybean-admin/issues/594 [(a8f92)](https://github.com/soybeanjs/soybean-admin/commit/a8f923e) + - 更新 README  -  by @soybeanjs [(e9a2e)](https://github.com/soybeanjs/soybean-admin/commit/e9a2ee4) + - 更新 README  -  by @soybeanjs [(73e91)](https://github.com/soybeanjs/soybean-admin/commit/73e917a) + - 更新文档中重要信息的位置  -  by **Azir** [(9c012)](https://github.com/soybeanjs/soybean-admin/commit/9c012c7) + +###    🏡 杂项 + +- **deps**: + - 更新依赖  -  by @soybeanjs [(a1c14)](https://github.com/soybeanjs/soybean-admin/commit/a1c14a1) + - 更新依赖  -  by @soybeanjs [(7fa55)](https://github.com/soybeanjs/soybean-admin/commit/7fa5590) + - 更新依赖  -  by @soybeanjs [(a44ea)](https://github.com/soybeanjs/soybean-admin/commit/a44ea62) +- **projects**: + - 使用 json5 解析环境变量 `VITE_OTHER_SERVICE_BASE_URL` 并修复代理启用  -  by @soybeanjs [(b16a9)](https://github.com/soybeanjs/soybean-admin/commit/b16a963) + +###    🎨 样式 + +- **projects**: 将脚本 czh 重命名为 commit:zh  -  by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/597 [(5094f)](https://github.com/soybeanjs/soybean-admin/commit/5094f0e) + +###    ❤️ 贡献者 + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![mufeng889](https://github.com/mufeng889.png?size=48)](https://github.com/mufeng889)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)  [![PZ-18664918826](https://github.com/PZ-18664918826.png?size=48)](https://github.com/PZ-18664918826)   +[Azir](mailto:2075125282@qq.com),  + +## [v1.3.4](https://github.com/honghuangdc/soybean-admin/compare/v1.3.3...v1.3.4) (2024-08-01) + +###    🚨 重大变更 + +- **projects**: 当 vertical-mix 布局为 mixSiderFixed 时,不重置活动菜单  -  by @honghuangdc [(939c5)](https://github.com/honghuangdc/soybean-admin/commit/939c512) + +###    🛠 优化 + +- **projects**: 优化代码  -  by @honghuangdc [(cb1d4)](https://github.com/honghuangdc/soybean-admin/commit/cb1d445) + +###    🏡 杂项 + +- **projects**: 更新依赖并修复 vue-router 类型  -  by @honghuangdc [(96837)](https://github.com/honghuangdc/soybean-admin/commit/968370b) + +###    ❤️ 贡献者 + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   + +## [v1.3.3](https://github.com/honghuangdc/soybean-admin/compare/v1.3.2...v1.3.3) (2024-07-30) + +###    🐞 Bug 修复 + +- **projects**: 修复水印设置  -  by @honghuangdc [(5646a)](https://github.com/honghuangdc/soybean-admin/commit/5646a50) + +###    📖 文档 + +- **projects**: 更新 CHANGELOG  -  by @honghuangdc [(ebc83)](https://github.com/honghuangdc/soybean-admin/commit/ebc838c) + +###    ❤️ 贡献者 + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   + +## [v1.3.2](https://github.com/honghuangdc/soybean-admin/compare/v1.3.1...v1.3.2) (2024-07-30) + +###    🚀 新功能 + +- **项目**: + - 添加颜色渐变模式。关闭 #567  -  由 @Azir-11 在 https://github.com/honghuangdc/soybean-admin/issues/569 和 https://github.com/honghuangdc/soybean-admin/issues/567 [(4dde4)](https://github.com/honghuangdc/soybean-admin/commit/4dde4c2) + - 添加全屏水印。关闭 #571  -  由 @paynezhuang 在 https://github.com/honghuangdc/soybean-admin/issues/573 和 https://github.com/honghuangdc/soybean-admin/issues/571 [(ea8aa)](https://github.com/honghuangdc/soybean-admin/commit/ea8aa6c) + +###    🐞 Bug 修复 + +- **项目**: 修复 vertical-mix 菜单选中问题  -  由 @honghuangdc [(59f07)](https://github.com/honghuangdc/soybean-admin/commit/59f07d8) + +###    🛠 优化 + +- **项目**: + - 添加类型 WatermarkProps  -  由 @honghuangdc [(f26d0)](https://github.com/honghuangdc/soybean-admin/commit/f26d0a6) + - 移除 home NAlert 可关闭  -  由 @honghuangdc [(98b75)](https://github.com/honghuangdc/soybean-admin/commit/98b75c2) + - 优化响应代码比较  -  由 @honghuangdc [(cf67d)](https://github.com/honghuangdc/soybean-admin/commit/cf67d55) +- **类型**: + - 移除无用类型。  -  由 **Azir** [(eed61)](https://github.com/honghuangdc/soybean-admin/commit/eed617f) + +###    📖 文档 + +- **项目**: 更新更新日志  -  由 @honghuangdc [(d3759)](https://github.com/honghuangdc/soybean-admin/commit/d37591d) + +###    🏡 杂项 + +- **依赖**: 更新依赖  -  由 @honghuangdc [(993e9)](https://github.com/honghuangdc/soybean-admin/commit/993e9ca) + +###    ❤️ 贡献者 + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![paynezhuang](https://github.com/paynezhuang.png?size=48)](https://github.com/paynezhuang)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)   +[Azir](mailto:2075125282@qq.com),  + +## [v1.3.1](https://github.com/honghuangdc/soybean-admin/compare/v1.3.0...v1.3.1) (2024-07-22) + +###    🐞 Bug 修复 + +- **项目**: + - 修复顶部菜单混合和反向模式下侧边栏宽度异常的问题  -  由 @Azir-11 在 https://github.com/honghuangdc/soybean-admin/issues/562 修复 [(c4695)](https://github.com/honghuangdc/soybean-admin/commit/c469512) + - 修复水平混合菜单反转问题。修复 #563  -  由 @honghuangdc 在 https://github.com/honghuangdc/soybean-admin/issues/563 修复 [(4e55b)](https://github.com/honghuangdc/soybean-admin/commit/4e55b0e) + - 修复当布局来自移动端时垂直菜单不渲染的问题  -  由 @honghuangdc 修复 [(84027)](https://github.com/honghuangdc/soybean-admin/commit/8402734) + +###    📖 文档 + +- **项目**: 更新更新日志  -  由 @honghuangdc 更新 [(613c8)](https://github.com/honghuangdc/soybean-admin/commit/613c836) + +###    🎨 样式 + +- **其他**: 修改灰度模式的中文名称  -  由 **Azir** 修改 [(53770)](https://github.com/honghuangdc/soybean-admin/commit/5377002) + +###    ❤️ 贡献者 + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)   +[Azir](mailto:2075125282@qq.com),  + + +## [v1.3.0](https://github.com/soybeanjs/soybean-admin/compare/v1.2.8...v1.3.0) (2024-07-22) + +###    🚨 破坏性变更 + +- **项目**: 重构全局菜单 & 支持 `reversed-horizontal-mix-menu`。关闭 #365  -  由 @honghuangdc 在 https://github.com/soybeanjs/soybean-admin/issues/365 提出 [(087e5)](https://github.com/soybeanjs/soybean-admin/commit/087e532) + +###    🚀 功能 + +- **包**: + - `@sa/scripts`: 命令 `gitCommit` 支持中文  -  由 @mmdapl 在 https://github.com/soybeanjs/soybean-admin/issues/548 提出 [(06971)](https://github.com/soybeanjs/soybean-admin/commit/06971f3) + - @sa/axios: 用 AbortController 替换 CancelTokenSource。关闭 #530, 关闭 #532  -  由 @honghuangdc 在 https://github.com/soybeanjs/soybean-admin/issues/530 和 https://github.com/soybeanjs/soybean-admin/issues/532 提出 [(527fd)](https://github.com/soybeanjs/soybean-admin/commit/527fd79) + - @sa/scripts: 为命令 `gitCommitVerify` 添加忽略模式列表。关闭 #504  -  由 @honghuangdc 在 https://github.com/soybeanjs/soybean-admin/issues/504 提出 [(958d0)](https://github.com/soybeanjs/soybean-admin/commit/958d0ba) +- **项目**: + - 使分支 `main` 更精简 & 修改请求重试次数为 0  -  由 @Azir-11 提出 [(793b1)](https://github.com/soybeanjs/soybean-admin/commit/793b16e) + +###    🐞 修复 + +- **钩子**: 当 pagesize 返回 0 时防止程序冻结  -  由 @Azir-11 在 https://github.com/soybeanjs/soybean-admin/issues/545 提出 [(f4eeb)](https://github.com/soybeanjs/soybean-admin/commit/f4eeb2e) + +###    💅 重构 + +- **项目**: + - 合并 `theme tokens` 和 `theme settings`。关闭 #379  -  由 @honghuangdc 在 https://github.com/soybeanjs/soybean-admin/issues/379 提出 [(1d1b1)](https://github.com/soybeanjs/soybean-admin/commit/1d1b148) + - 将 css 变量挂载到 root  -  由 @honghuangdc 提出 [(00f41)](https://github.com/soybeanjs/soybean-admin/commit/00f41dd) + +###    📖 文档 + +- **项目**: 更新更新日志  -  由 @honghuangdc 提出 [(a0b76)](https://github.com/soybeanjs/soybean-admin/commit/a0b76da) + +###    🏡 杂务 + +- **依赖**: 更新依赖  -  由 @honghuangdc 提出 [(f6bd6)](https://github.com/soybeanjs/soybean-admin/commit/f6bd6b8) +- **项目**: 添加脚本 `czh`  -  由 @honghuangdc 提出 [(02069)](https://github.com/soybeanjs/soybean-admin/commit/0206969) + +###    ❤️ 贡献者 + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![mmdapl](https://github.com/mmdapl.png?size=48)](https://github.com/mmdapl)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)   + + +## [v1.2.8](https://github.com/soybeanjs/soybean-admin/compare/v1.2.7...v1.2.8) (2024-07-20) + +###    🐞 修复 + +- **包**: + - @sa/hooks: 修复 useHookTable 的 searchParams。修复了 #552  -  由 @honghuangdc 在 https://github.com/soybeanjs/soybean-admin/issues/552 提出 [(96c10)](https://github.com/soybeanjs/soybean-admin/commit/96c1044) +- **类型**: + - 修复了引用类型错误  -  由 **dodu2014** 在 https://github.com/soybeanjs/soybean-admin/issues/551 提出 [(3e2a9)](https://github.com/soybeanjs/soybean-admin/commit/3e2a993) + - 修复 useHookTable 的数据类型  -  由 @honghuangdc 提出 [(276ea)](https://github.com/soybeanjs/soybean-admin/commit/276ea7f) + +###    💅 重构 + +- **项目**: 用 `klona` 替换 `lodash-es` 的 `cloneDeep`  -  由 @honghuangdc 提出 [(a9133)](https://github.com/soybeanjs/soybean-admin/commit/a91335d) + +###    📖 文档 + +- **项目**: 更新更新日志  -  由 @honghuangdc 提出 [(58fc0)](https://github.com/soybeanjs/soybean-admin/commit/58fc096) + +###    🏡 杂务 + +- **依赖**: 更新依赖  -  由 @honghuangdc 提出 [(cf019)](https://github.com/soybeanjs/soybean-admin/commit/cf0192a) + +###    ❤️ 贡献者 + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   +[dodu2014](mailto:dodu@live.cn) + + +## [v1.2.7](https://github.com/honghuangdc/soybean-admin/compare/v1.2.6...v1.2.7) (2024-07-12) + +###    🛠 优化 + +- **项目**: 支持自定义菜单图标大小  -  由 @wynn-w 在 https://github.com/honghuangdc/soybean-admin/issues/534 提出 [(e035e)](https://github.com/honghuangdc/soybean-admin/commit/e035eab) + +###    🏡 杂务 + +- **依赖**: + - 更新依赖  -  由 @honghuangdc [(72ede)](https://github.com/honghuangdc/soybean-admin/commit/72ede8b) + - 更新依赖  -  由 @honghuangdc [(be13c)](https://github.com/honghuangdc/soybean-admin/commit/be13ca2) + - 更新依赖  -  由 @honghuangdc [(752ec)](https://github.com/honghuangdc/soybean-admin/commit/752ec1e) +- **项目**: + - 修复已弃用的配置配置  -  由 @paynezhuang 在 https://github.com/honghuangdc/soybean-admin/issues/524 提出 [(0d20e)](https://github.com/honghuangdc/soybean-admin/commit/0d20e4c) + +###    ❤️ 贡献者 + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![wynn-w](https://github.com/wynn-w.png?size=48)](https://github.com/wynn-w)  [![paynezhuang](https://github.com/paynezhuang.png?size=48)](https://github.com/paynezhuang)   + +## [v1.2.6](https://github.com/honghuangdc/soybean-admin/compare/v1.2.5...v1.2.6) (2024-06-21) + +###    🐞 修复 + +- **项目**: + - 请求模态标题使用 i18n。修复 #507  -  由 @honghuangdc 在 https://github.com/honghuangdc/soybean-admin/issues/507 提出 [(f7de3)](https://github.com/honghuangdc/soybean-admin/commit/f7de3fd) + - 为 `useTable` 添加 `getDataByPage`。修复 #499  -  由 @honghuangdc 在 https://github.com/honghuangdc/soybean-admin/issues/499 提出 [(425c6)](https://github.com/honghuangdc/soybean-admin/commit/425c69a) + - 修复登录重定向到 routeHome 时,动态路由的 routeHome 与静态路由不同的问题。修复 #511  -  由 @honghuangdc 在 https://github.com/honghuangdc/soybean-admin/issues/511 提出 [(49f60)](https://github.com/honghuangdc/soybean-admin/commit/49f60b2) + +###    🛠 优化 + +- **项目**: 优化 `getRouteQueryOfLoginRoute`  -  由 @honghuangdc [(693f7)](https://github.com/honghuangdc/soybean-admin/commit/693f704) + +###    📖 文档 + +- **项目**: + - 更新更新日志  -  由 @honghuangdc [(5c67d)](https://github.com/honghuangdc/soybean-admin/commit/5c67d06) + - 更新自述文件  -  由 @honghuangdc [(1e67a)](https://github.com/honghuangdc/soybean-admin/commit/1e67ae8) + +###    🏡 杂务 + +- **依赖**: + - 更新依赖。关闭 #510  -  由 @honghuangdc 在 https://github.com/honghuangdc/soybean-admin/issues/510 提出 [(53143)](https://github.com/honghuangdc/soybean-admin/commit/531432d) + - 更新依赖  -  由 @honghuangdc [(c7f6f)](https://github.com/honghuangdc/soybean-admin/commit/c7f6f2a) + +###    🤖 CI + +- **项目**: + - 添加 github 问题模板  -  由 @honghuangdc [(b5027)](https://github.com/honghuangdc/soybean-admin/commit/b5027c8) + - 更新 github 问题模板  -  由 @honghuangdc [(ff1d5)](https://github.com/honghuangdc/soybean-admin/commit/ff1d504) + +###    ❤️ 贡献者 + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   + +## [v1.2.5](https://github.com/soybeanjs/soybean-admin/compare/v1.2.4...v1.2.5) (2024-06-15) + +###    🐞 错误修复 + +- **项目**: 修复登出后标签页异常缓存的问题。已修复 #495  -  由 @Azir-11 在 https://github.com/soybeanjs/soybean-admin/issues/495 [(3eeac)](https://github.com/soybeanjs/soybean-admin/commit/3eeace9) + +###    🔥 性能 + +- **项目**: 初始化静态路由功能不需要异步  -  由 **CHENZL** 在 https://github.com/soybeanjs/soybean-admin/issues/493 [(2198b)](https://github.com/soybeanjs/soybean-admin/commit/2198b98) + +###    🛠 优化 + +- **项目**: 优化代码  -  由 @soybeanjs [(b94ba)](https://github.com/soybeanjs/soybean-admin/commit/b94baa1) +- **类型**: 提高全局类型的兼容性  -  由 @Azir-11 在 https://github.com/soybeanjs/soybean-admin/issues/494 [(cd9d5)](https://github.com/soybeanjs/soybean-admin/commit/cd9d58d) +- **工具**: 减少代码缩进,提高可读性  -  由 @Azir-11 在 https://github.com/soybeanjs/soybean-admin/issues/496 [(ad2f2)](https://github.com/soybeanjs/soybean-admin/commit/ad2f247) + +###    📖 文档 + +- **项目**: 更新CHANGELOG  -  由 @soybeanjs [(f70d2)](https://github.com/soybeanjs/soybean-admin/commit/f70d29b) + +###    🏡 杂项 + +- **依赖**: 更新依赖  -  由 @soybeanjs [(b094d)](https://github.com/soybeanjs/soybean-admin/commit/b094d68) + +###    ❤️ 贡献者 + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)   +[CHENZL](mailto:zlong5568863@qq.com) + + +## [v1.2.4](https://github.com/soybeanjs/soybean-admin/compare/v1.2.3...v1.2.4) (2024-06-14) + +###    🛠 优化 + +- **项目**: + - 优化 `setupAppVersionNotification`  -  由 @soybeanjs 提交 [(b5a72)](https://github.com/soybeanjs/soybean-admin/commit/b5a723c) + - 获取 'Asia/Shanghai' 时区的构建时间  -  由 @soybeanjs 提交 [(069fa)](https://github.com/soybeanjs/soybean-admin/commit/069fa8a) + +###    ❤️ 贡献者 + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)   + +## [v1.2.3](https://github.com/soybeanjs/soybean-admin/compare/v1.2.2...v1.2.3) (2024-06-13) + +###    🐞 修复错误 + +- **项目**: + - 通过在index.html中添加color-scheme元标签修复移动浏览器主题问题  -  由 @KickCashew 在 https://github.com/soybeanjs/soybean-admin/issues/488 中提交 [(c2125)](https://github.com/soybeanjs/soybean-admin/commit/c212565) + - 修复二级目录组件为空  -  由 @paynezhuang 在 https://github.com/soybeanjs/soybean-admin/issues/491 中提交 [(aabb2)](https://github.com/soybeanjs/soybean-admin/commit/aabb2a4) + +###    📖 文档 + +- **项目**: + - 修复超链接指向错误  -  由 **Azir** 提交 [(20a81)](https://github.com/soybeanjs/soybean-admin/commit/20a8127) + - 更新 README  -  由 @soybeanjs 提交 [(70261)](https://github.com/soybeanjs/soybean-admin/commit/7026126) + +###    🏡 杂项 + +- **依赖**: + - 更新依赖  -  由 @soybeanjs 提交 [(813d8)](https://github.com/soybeanjs/soybean-admin/commit/813d8ce) + - 更新依赖  -  由 @soybeanjs 提交 [(bf718)](https://github.com/soybeanjs/soybean-admin/commit/bf71837) + +###    ❤️ 贡献者 + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![paynezhuang](https://github.com/paynezhuang.png?size=48)](https://github.com/paynezhuang)  [![KickCashew](https://github.com/KickCashew.png?size=48)](https://github.com/KickCashew)   +[Azir](mailto:2075125282@qq.com) + +## [v1.2.2](https://github.com/honghuangdc/soybean-admin/compare/v1.2.1...v1.2.2) (2024-06-12) + +###    🚀 特性 + +- **项目**: 切换标签时重置滚动位置  -  由 @soybeanjs 提交 [(9094b)](https://github.com/honghuangdc/soybean-admin/commit/9094b21) + +###    🐞 修复错误 + +- **项目**: + - 在DEV模式下隐藏AppVersionNotification  -  由 @sigma-plus 在 https://github.com/honghuangdc/soybean-admin/issues/482 中提交 [(62592)](https://github.com/honghuangdc/soybean-admin/commit/6259287) + - 修复在移动布局中隐藏menu-toggler。fixed #483  -  由 @soybeanjs 在 https://github.com/honghuangdc/soybean-admin/issues/483 中提交 [(4470c)](https://github.com/honghuangdc/soybean-admin/commit/4470cb4) + +###    📖 文档 + +- **项目**: 更新 README  -  由 @soybeanjs 提交 [(8f9a7)](https://github.com/honghuangdc/soybean-admin/commit/8f9a705) + +###    ❤️ 贡献者 + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![sigma-plus](https://github.com/sigma-plus.png?size=48)](https://github.com/sigma-plus)   + +## [v1.2.1](https://github.com/honghuangdc/soybean-admin/compare/v1.2.0...v1.2.1) (2024-06-07) + +###    🐞 修复错误 + +- **项目**: + - 修复页面重新加载时获取用户信息  -  由 @soybeanjs 提交 [(ff51b)](https://github.com/honghuangdc/soybean-admin/commit/ff51b72) + - 修复setupAppVersionNotification渲染  -  由 @soybeanjs 提交 [(6a6eb)](https://github.com/honghuangdc/soybean-admin/commit/6a6eb9a) + +###    📖 文档 + +- **项目**: 更新CHANGELOG  -  由 @soybeanjs [(fe06b)](https://github.com/honghuangdc/soybean-admin/commit/fe06b8c)完成 + +###    🏡 日常任务 + +- **依赖**: 更新依赖  -  由 @soybeanjs [(08827)](https://github.com/honghuangdc/soybean-admin/commit/08827a4)完成 + +###    ❤️ 贡献者 + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)   + + +## [v1.2.0](https://github.com/soybeanjs/soybean-admin/compare/v1.1.5...v1.2.0) (2024-06-06) + +###    🚀 功能 + +- **项目**: + - 支持系统新版本更新通知。关闭 #420  -  由 @soybeanjs 在 https://github.com/soybeanjs/soybean-admin/issues/420 [(584cd)](https://github.com/soybeanjs/soybean-admin/commit/584cd54) + - 在路由守卫中获取用户信息并从localStorage中移除。关闭 #459  -  由 @soybeanjs 在 https://github.com/soybeanjs/soybean-admin/issues/459 [(5531a)](https://github.com/soybeanjs/soybean-admin/commit/5531a68) + +###    📖 文档 + +- **项目**: 更新CHANGELOG  -  由 @soybeanjs [(2bec8)](https://github.com/soybeanjs/soybean-admin/commit/2bec899) + +###    ❤️ 贡献者 + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)   + +## [v1.1.5](https://github.com/soybeanjs/soybean-admin/compare/v1.1.4...v1.1.5) (2024-06-06) + +###    🐞 错误修复 + +- **项目**: 修复注册组件名,CodeLogin => Register  -  由 @m-xlsea 在 https://github.com/soybeanjs/soybean-admin/issues/478 [(ddf38)](https://github.com/soybeanjs/soybean-admin/commit/ddf3823) + +###    🏡 杂务 + +- **依赖**: 更新依赖  -  由 @soybeanjs [(060c0)](https://github.com/soybeanjs/soybean-admin/commit/060c0a9) +- **项目**: 更新 vscode 设置: vue 官方  -  由 @soybeanjs [(76649)](https://github.com/soybeanjs/soybean-admin/commit/76649e2) + +###    ❤️ 贡献者 + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![m-xlsea](https://github.com/m-xlsea.png?size=48)](https://github.com/m-xlsea)   + +## [v1.1.4](https://github.com/honghuangdc/soybean-admin/compare/v1.1.3...v1.1.4) (2024-06-06) + +###    🐞 错误修复 + +- **utils**: 修复了按esc键时modalLogout的错误  -  由 @sigma-plus 在 https://github.com/honghuangdc/soybean-admin/issues/470 中提出 [(bd69c)](https://github.com/honghuangdc/soybean-admin/commit/bd69c00) + +###    🛠 优化 + +- **projects**: 优化了RouteMeta的备注  -  由 @soybeanjs 提出 [(ffb48)](https://github.com/honghuangdc/soybean-admin/commit/ffb48b1) + +###    📖 文档 + +- **projects**: + - 更新了CHANGELOG  -  由 @soybeanjs 提出 [(756f8)](https://github.com/honghuangdc/soybean-admin/commit/756f84a) + - 更新了Node&pnpm版本  -  由 @Azir-11 在 https://github.com/honghuangdc/soybean-admin/issues/472 中提出 [(9b05d)](https://github.com/honghuangdc/soybean-admin/commit/9b05d73) + +###    🏡 杂项 + +- **deps**: + - 更新了依赖  -  由 @soybeanjs 提出 [(d0380)](https://github.com/honghuangdc/soybean-admin/commit/d0380ce) + - 更新了依赖  -  由 @soybeanjs 提出 [(1f464)](https://github.com/honghuangdc/soybean-admin/commit/1f4647b) +- **projects**: + - 关闭了http代理  -  由 @soybeanjs 提出 [(d08a3)](https://github.com/honghuangdc/soybean-admin/commit/d08a381) + - 更新了mock url  -  由 @soybeanjs 提出 [(e6086)](https://github.com/honghuangdc/soybean-admin/commit/e6086f0) + - 更新了vscode设置  -  由 @soybeanjs 提出 [(910df)](https://github.com/honghuangdc/soybean-admin/commit/910dfca) + +###    ❤️ 贡献者 + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)  [![sigma-plus](https://github.com/sigma-plus.png?size=48)](https://github.com/sigma-plus)   + +## [v1.1.3](https://github.com/soybeanjs/soybean-admin/compare/v1.1.2...v1.1.3) (2024-06-02) + +###    🐞 错误修复 + +- **组件**: + - 修复了由于回车导致搜索框反复弹出的问题  -  由 @Azir-11 在 https://github.com/soybeanjs/soybean-admin/issues/468 中修复 [(5bd96)](https://github.com/soybeanjs/soybean-admin/commit/5bd96b8) +- **项目**: + - 修复点击菜单搜索。修复了 #466,关闭 #467  -  由 @soybeanjs 在 https://github.com/soybeanjs/soybean-admin/issues/466 和 https://github.com/soybeanjs/soybean-admin/issues/467 中修复 [(8efdb)](https://github.com/soybeanjs/soybean-admin/commit/8efdb10) + - 修复 reCacheRoute。修复了 #464  -  由 @soybeanjs 在 https://github.com/soybeanjs/soybean-admin/issues/464 中修复 [(59faf)](https://github.com/soybeanjs/soybean-admin/commit/59faf15) +- **样式**: + - 修复 FirstLevelMenu 样式。修复了 #450  -  由 @soybeanjs 在 https://github.com/soybeanjs/soybean-admin/issues/450 中修复 [(db64b)](https://github.com/soybeanjs/soybean-admin/commit/db64b0e) + - 修复 PinToggler 样式。修复了 #451  -  由 @soybeanjs 在 https://github.com/soybeanjs/soybean-admin/issues/451 中修复 [(42b12)](https://github.com/soybeanjs/soybean-admin/commit/42b121a) + +###    🛠 优化 + +- **组件**: 提高 TableColumnSetting 的拖动区域精度,带有动画  -  由 @orangelckc 在 https://github.com/soybeanjs/soybean-admin/issues/465 中优化 [(2aa85)](https://github.com/soybeanjs/soybean-admin/commit/2aa85c6) +- **项目**: unocss 边框快捷方式  -  由 @soybeanjs 优化 [(40d0f)](https://github.com/soybeanjs/soybean-admin/commit/40d0f8a) + +###    📖 文档 + +- **项目**: 更新 CHANGELOG  -  由 @soybeanjs 更新 [(87b18)](https://github.com/soybeanjs/soybean-admin/commit/87b1838) + +###    🏡 杂项 + +- **其他**: + - 纠正拼写错误  -  由 @orangelckc 在 https://github.com/soybeanjs/soybean-admin/issues/460 中纠正 [(086ba)](https://github.com/soybeanjs/soybean-admin/commit/086bad4) + - 纠正拼写错误  -  由 @Azir-11 在 https://github.com/soybeanjs/soybean-admin/issues/462 中纠正 [(f1850)](https://github.com/soybeanjs/soybean-admin/commit/f185041) +- **项目**: + - 更新 vscode launch.json  -  由 @soybeanjs 更新 [(4c1c7)](https://github.com/soybeanjs/soybean-admin/commit/4c1c7e6) + +###    ❤️ 贡献者 + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)  [![orangelckc](https://github.com/orangelckc.png?size=48)](https://github.com/orangelckc)   + +## [v1.1.2](https://github.com/soybeanjs/soybean-admin/compare/v1.1.1...v1.1.2) (2024-05-24) + +###    🐞 错误修复 + +- **项目**: + - 修复头部样式 & 修复点击全局标签时按钮高亮。修复了 #446  -  由 @honghuangdc 在 https://github.com/soybeanjs/soybean-admin/issues/446 [(64fc0)](https://github.com/soybeanjs/soybean-admin/commit/64fc099) + - 修复多标签页只渲染一次。修复了 #441  -  由 @honghuangdc 在 https://github.com/soybeanjs/soybean-admin/issues/441 [(e379d)](https://github.com/soybeanjs/soybean-admin/commit/e379d6c) + +###    🛠 优化 + +- **项目**: 优化代码  -  由 @honghuangdc [(bc8dc)](https://github.com/soybeanjs/soybean-admin/commit/bc8dc47) + +###    ❤️ 贡献者 + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   + +## [v1.1.1](https://github.com/soybeanjs/soybean-admin/compare/v1.1.0...v1.1.1) (2024-05-20) + +###    🚀 功能 + +- **hooks**: 为 useEcharts 添加 setOptions  -  由 @honghuangdc 提交 [(e4d53)](https://github.com/soybeanjs/soybean-admin/commit/e4d53aa) + +###    🐞 修复错误 + +- **projects**: + - 修复 useRouter。修复了 #436  -  由 @honghuangdc 在 https://github.com/soybeanjs/soybean-admin/issues/436 提交 [(0774a)](https://github.com/soybeanjs/soybean-admin/commit/0774a51) + - 在动态路由模式下获取路由时添加错误处理。修复了 440  -  由 @honghuangdc 提交 [(57b4a)](https://github.com/soybeanjs/soybean-admin/commit/57b4a9d) +- **styles**: + - 修复 useTable 类型  -  由 @honghuangdc 提交 [(07124)](https://github.com/soybeanjs/soybean-admin/commit/071241f) + +###    📖 文档 + +- **projects**: + - 更新 CHANGELOG  -  由 @honghuangdc 提交 [(19783)](https://github.com/soybeanjs/soybean-admin/commit/1978397) + - 更新 README.md  -  由 @honghuangdc 提交 [(fa56e)](https://github.com/soybeanjs/soybean-admin/commit/fa56e9c) + - 更新 README.md  -  由 @honghuangdc 提交 [(419ea)](https://github.com/soybeanjs/soybean-admin/commit/419ea42) + +###    🏡 杂项 + +- **projects**: + - 更新依赖并修复 TS 错误  -  由 @honghuangdc 提交 [(4ea9c)](https://github.com/soybeanjs/soybean-admin/commit/4ea9c85) + - 更新 eslint-config 并修复代码  -  由 @honghuangdc 提交 [(68ea9)](https://github.com/soybeanjs/soybean-admin/commit/68ea974) + - 更新 @elegant-router/vue 并为 resolve route 添加错误处理。修复了 #442  -  由 @honghuangdc 在 https://github.com/soybeanjs/soybean-admin/issues/442 提交 [(24ff8)](https://github.com/soybeanjs/soybean-admin/commit/24ff852) + +###    ❤️ 贡献者 + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   + +## [v1.1.0](https://github.com/honghuangdc/soybean-admin/compare/v1.0.9...v1.1.0) (2024-05-07) + +###    🚀 功能 + +- **项目**: + - 支持灰度。修复了 #385  -  由 @honghuangdc 在 https://github.com/honghuangdc/soybean-admin/issues/385 [(d335d)](https://github.com/honghuangdc/soybean-admin/commit/d335df6) + - 添加前缀到本地存储  -  由 **Azir** [(1fc34)](https://github.com/honghuangdc/soybean-admin/commit/1fc34cc) + - 添加表格显示总数选项  -  由 **paynezhuang** [(3e61e)](https://github.com/honghuangdc/soybean-admin/commit/3e61eab) + - 添加推荐颜色切换。关闭了 #388  -  由 @honghuangdc 在 https://github.com/honghuangdc/soybean-admin/issues/388 [(a1920)](https://github.com/honghuangdc/soybean-admin/commit/a1920fc) + - 添加菜单路由字段  -  由 **paynezhuang** [(dbe31)](https://github.com/honghuangdc/soybean-admin/commit/dbe31eb) + - 支持短时间内重复请求错误只出现一次。关闭了 #368, 关闭了 #369  -  由 @honghuangdc 在 https://github.com/honghuangdc/soybean-admin/issues/368 和 https://github.com/honghuangdc/soybean-admin/issues/369 [(e3bd3)](https://github.com/honghuangdc/soybean-admin/commit/e3bd397) + - 通过鼠标滚轮按钮点击关闭标签  -  由 **JianJroh** [(d3849)](https://github.com/honghuangdc/soybean-admin/commit/d3849ba) + - 页面:支持管理菜单更多选项。关闭了 #366  -  由 @honghuangdc 在 https://github.com/honghuangdc/soybean-admin/issues/366 [(c4b5c)](https://github.com/honghuangdc/soybean-admin/commit/c4b5c65) + - useTable 添加展开显示  -  由 **paynezhuang** [(0a90d)](https://github.com/honghuangdc/soybean-admin/commit/0a90dd3) + +###    🐞 错误修复 + +- **项目**: + - 菜单 fixedIndexInTab 默认为 null  -  由 **paynezhuang** [(3d10e)](https://github.com/honghuangdc/soybean-admin/commit/3d10ef1) + - 修复菜单切换器 zIndex  -  由 @honghuangdc [(7bd43)](https://github.com/honghuangdc/soybean-admin/commit/7bd43df) + - 修复管理菜单模态样式  -  由 @honghuangdc [(60f3b)](https://github.com/honghuangdc/soybean-admin/commit/60f3b14) + - 当角色改变时修复菜单数据。修复了 #391  -  由 @honghuangdc 在 https://github.com/honghuangdc/soybean-admin/issues/391 [(3b47b)](https://github.com/honghuangdc/soybean-admin/commit/3b47b5a) + +###    🛠 优化 + +- **项目**: 移除废弃的代码  -  由 @honghuangdc [(72ccb)](https://github.com/honghuangdc/soybean-admin/commit/72ccb6b) + +###    💅 重构 + +- **项目**: + - 重构 @sa/color-palette => @sa/color & 优化 @sa/utils 代码  -  由 @honghuangdc [(34999)](https://github.com/honghuangdc/soybean-admin/commit/3499997) + - menu-operate-drawer => menu-operate-modal  -  由 @honghuangdc [(003e1)](https://github.com/honghuangdc/soybean-admin/commit/003e145) + +###    📖 文档 + +- **项目**: + - 添加 CHANGELOG.zh_CN.md  -  由 @honghuangdc [(18b3f)](https://github.com/honghuangdc/soybean-admin/commit/18b3f05) + - 更新 CHANGELOG  -  由 @honghuangdc [(4d17c)](https://github.com/honghuangdc/soybean-admin/commit/4d17cfd) + +###    🏡 杂项 + +- **依赖**: + - 更新依赖  -  由 @honghuangdc [(1cb38)](https://github.com/honghuangdc/soybean-admin/commit/1cb3816) + - 更新依赖  -  由 @honghuangdc [(599b4)](https://github.com/honghuangdc/soybean-admin/commit/599b4e1) +- **项目**: + - 合并 main 到 v1.1.0  -  由 @honghuangdc [(ebe55)](https://github.com/honghuangdc/soybean-admin/commit/ebe55af) + +###    ❤️ 贡献者 + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   +[paynezhuang](mailto:paynezhuang@gmail.com), [JianJroh](mailto:rhjian@foxmail.com), [Azir](mailto:2075125282@qq.com) + +## [v1.1.0-beta.2](https://github.com/honghuangdc/soybean-admin/compare/v1.1.0-beta.1...v1.1.0-beta.2) (2024-05-07) + +###    🚀 特性 + +- **项目**: useTable添加展开以显示  -  由 **paynezhuang** [(0a90d)](https://github.com/honghuangdc/soybean-admin/commit/0a90dd3) 提供 + +###    🐞 修复的错误 + +- **项目**: + - 修复 manage_menu 模态样式  -  由 @honghuangdc [(60f3b)](https://github.com/honghuangdc/soybean-admin/commit/60f3b14) 提供 + - 当角色改变时修复菜单数据。修复了 #391  -  由 @honghuangdc 在 https://github.com/honghuangdc/soybean-admin/issues/391 [(3b47b)](https://github.com/honghuangdc/soybean-admin/commit/3b47b5a) 提供 + +###    🛠 优化 + +- **项目**: 删除废弃的代码  -  由 @honghuangdc [(72ccb)](https://github.com/honghuangdc/soybean-admin/commit/72ccb6b) 提供 + +###    📖 文档 + +- **项目**: 添加 CHANGELOG.zh_CN.md  -  由 @honghuangdc [(18b3f)](https://github.com/honghuangdc/soybean-admin/commit/18b3f05) 提供 + +###    ❤️ 贡献者 + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   +[paynezhuang](mailto:paynezhuang@gmail.com) + + +## [v1.1.0-beta.1](https://github.com/soybeanjs/soybean-admin/compare/v1.0.9...v1.1.0-beta.1) (2024-05-07) + +###    🚀 功能 + +- **项目**: + - 支持灰度。修复了 #385  -  由 @honghuangdc 在 https://github.com/soybeanjs/soybean-admin/issues/385 [(d335d)](https://github.com/soybeanjs/soybean-admin/commit/d335df6) + - 添加前缀到本地存储  -  由 **Azir** [(1fc34)](https://github.com/soybeanjs/soybean-admin/commit/1fc34cc) + - 添加表格 showTotal 选项  -  由 **paynezhuang** [(3e61e)](https://github.com/soybeanjs/soybean-admin/commit/3e61eab) + - 添加推荐颜色切换。关闭了 #388  -  由 @honghuangdc 在 https://github.com/soybeanjs/soybean-admin/issues/388 [(a1920)](https://github.com/soybeanjs/soybean-admin/commit/a1920fc) + - 添加菜单路由字段  -  由 **paynezhuang** [(dbe31)](https://github.com/soybeanjs/soybean-admin/commit/dbe31eb) + - 支持短时间内重复请求错误只发生一次。关闭了 #368, 关闭了 #369  -  由 @honghuangdc 在 https://github.com/soybeanjs/soybean-admin/issues/368 和 https://github.com/soybeanjs/soybean-admin/issues/369 [(e3bd3)](https://github.com/soybeanjs/soybean-admin/commit/e3bd397) + - 通过鼠标滚轮按钮点击关闭标签  -  由 **JianJroh** [(d3849)](https://github.com/soybeanjs/soybean-admin/commit/d3849ba) + - 页面:支持更多的 manage_menu 选项。关闭了 #366  -  由 @honghuangdc 在 https://github.com/soybeanjs/soybean-admin/issues/366 [(c4b5c)](https://github.com/soybeanjs/soybean-admin/commit/c4b5c65) + +###    🐞 错误修复 + +- **项目**: + - 修复菜单 fixedIndexInTab 默认为 null  -  由 **paynezhuang** [(3d10e)](https://github.com/soybeanjs/soybean-admin/commit/3d10ef1)完成 + - 修复菜单切换器 zIndex  -  由 @honghuangdc [(7bd43)](https://github.com/soybeanjs/soybean-admin/commit/7bd43df)完成 + +###    💅 重构 + +- **项目**: + - 重构 @sa/color-palette => @sa/color & 性能优化 @sa/utils  -  由 @honghuangdc [(34999)](https://github.com/soybeanjs/soybean-admin/commit/3499997)完成 + - menu-operate-drawer => menu-operate-modal  -  由 @honghuangdc [(003e1)](https://github.com/soybeanjs/soybean-admin/commit/003e145)完成 + +###    🏡 杂务 + +- **依赖**: + - 更新依赖  -  由 @honghuangdc [(1cb38)](https://github.com/soybeanjs/soybean-admin/commit/1cb3816)完成 + - 更新依赖  -  由 @honghuangdc [(599b4)](https://github.com/soybeanjs/soybean-admin/commit/599b4e1)完成 +- **项目**: + - 合并主分支到 v1.1.0  -  由 @honghuangdc [(ebe55)](https://github.com/soybeanjs/soybean-admin/commit/ebe55af)完成 + +###    ❤️ 贡献者 + +[![honghuangdc](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)   +[JianJroh](mailto:rhjian@foxmail.com), [paynezhuang](mailto:paynezhuang@gmail.com), [Azir](mailto:2075125282@qq.com) diff --git a/EXECUTE_THIS_FIX.sql b/EXECUTE_THIS_FIX.sql new file mode 100644 index 0000000..655b20d --- /dev/null +++ b/EXECUTE_THIS_FIX.sql @@ -0,0 +1,42 @@ +-- ======================================== +-- 执行此 SQL 脚本来修复组件路径问题 +-- ======================================== +-- 问题说明: +-- 1. 路由名称(name)使用下划线:user_manage, my_device +-- 2. 但组件路径(component)必须使用连字符匹配实际文件夹:user-manage, my-device +-- 3. 之前的路由名称修复导致 component 路径不匹配,引发前端错误 +-- ======================================== + +USE soybean_admin; + +-- 修复 user-manage 相关组件(文件夹是 user-manage) +UPDATE sys_route SET component = 'layout.base$view.user-manage' WHERE name = 'user_manage'; +UPDATE sys_route SET component = 'layout.base$view.user-manage_list' WHERE name = 'user_manage_list'; +UPDATE sys_route SET component = 'layout.base$view.user-manage_role' WHERE name = 'user_manage_role'; +UPDATE sys_route SET component = 'layout.base$view.user-manage_permission' WHERE name = 'user_manage_permission'; + +-- 修复 my-device 相关组件(文件夹是 my-device) +UPDATE sys_route SET component = 'layout.base$view.my-device' WHERE name = 'my_device'; +UPDATE sys_route SET component = 'layout.base$view.my-device_status' WHERE name = 'my_device_status'; +UPDATE sys_route SET component = 'layout.base$view.my-device_power-control' WHERE name = 'my_device_power'; +UPDATE sys_route SET component = 'layout.base$view.my-device_remote-control' WHERE name = 'my_device_remote'; + +-- 修复 my-application 相关组件(文件夹是 my-application) +UPDATE sys_route SET component = 'layout.base$view.my-application' WHERE name = 'my_application'; +UPDATE sys_route SET component = 'layout.base$view.my-application_apply' WHERE name = 'my_application_apply'; +UPDATE sys_route SET component = 'layout.base$view.my-application_my-list' WHERE name = 'my_application_list'; + +-- 验证修复结果 +SELECT + name AS '路由名称(下划线)', + path AS '路径', + component AS '组件路径(连字符)' +FROM sys_route +WHERE name LIKE '%user%' OR name LIKE '%my_%' +ORDER BY name; + +-- 预期结果示例: +-- user_manage | /user-manage | layout.base$view.user-manage +-- user_manage_list | /user-manage/list | layout.base$view.user-manage_list +-- my_device | /my-device | layout.base$view.my-device +-- my_device_status | /my-device/status | layout.base$view.my-device_status diff --git a/FINAL_FIX_ALL.bat b/FINAL_FIX_ALL.bat new file mode 100644 index 0000000..7e178f4 --- /dev/null +++ b/FINAL_FIX_ALL.bat @@ -0,0 +1,33 @@ +@echo off +echo ======================================== +echo 最终完整修复所有路由问题 +echo ======================================== +echo. +echo 此脚本将: +echo 1. 修复所有路由名称(与前端 routeMap 一致) +echo 2. 修复所有组件路径 +echo 3. 更新所有角色的菜单配置 +echo 4. 验证修复结果 +echo. +pause + +mysql -u root -proot < FINAL_FIX_ALL.sql + +echo. +echo ======================================== +echo 修复完成!请查看上面的验证结果 +echo ======================================== +echo. +echo 重要提示: +echo 1. 检查"用户管理路由配置"是否正确 +echo 2. 检查"检查子路由是否在角色配置中"全部显示 YES +echo 3. 如果全部正确,重启后端服务 +echo 4. 清除浏览器缓存(Ctrl+Shift+Delete) +echo 5. 刷新浏览器(Ctrl+F5) +echo. +echo 如果用户管理还是显示为按钮: +echo - 查看后端控制台日志 +echo - 搜索"路由: user-manage_list - 是否允许" +echo - 如果显示 false,说明角色配置还有问题 +echo. +pause diff --git a/FINAL_FIX_ALL.sql b/FINAL_FIX_ALL.sql new file mode 100644 index 0000000..b2d14e0 --- /dev/null +++ b/FINAL_FIX_ALL.sql @@ -0,0 +1,145 @@ +-- 最终完整修复所有路由问题 +USE soybean_admin; + +-- ============================================ +-- 第一步:修复所有路由的 name 字段 +-- 必须与前端 routeMap 完全一致 +-- ============================================ + +-- 设备管理 +UPDATE sys_route SET name = 'device' WHERE route_id = 'device'; +UPDATE sys_route SET name = 'device_list' WHERE route_id = 'device_list'; +UPDATE sys_route SET name = 'device_online' WHERE route_id = 'device_online'; +UPDATE sys_route SET name = 'device_power' WHERE route_id = 'device_power'; +UPDATE sys_route SET name = 'device_monitor' WHERE route_id = 'device_monitor'; +UPDATE sys_route SET name = 'device_group' WHERE route_id = 'device_group'; + +-- 屏幕监控 +UPDATE sys_route SET name = 'screen' WHERE route_id = 'screen'; +UPDATE sys_route SET name = 'screen_wall' WHERE route_id = 'screen_wall'; +UPDATE sys_route SET name = 'screen_control' WHERE route_id = 'screen_control'; +UPDATE sys_route SET name = 'screen_record' WHERE route_id = 'screen_record'; + +-- 用户管理(关键!) +UPDATE sys_route SET name = 'user-manage' WHERE route_id = 'user_manage'; +UPDATE sys_route SET name = 'user-manage_list' WHERE route_id = 'user_list'; +UPDATE sys_route SET name = 'user-manage_role' WHERE route_id = 'user_role'; +UPDATE sys_route SET name = 'user-manage_permission' WHERE route_id = 'user_permission'; + +-- 申请管理 +UPDATE sys_route SET name = 'application' WHERE route_id = 'application'; +UPDATE sys_route SET name = 'application_approval' WHERE route_id = 'application_approval'; +UPDATE sys_route SET name = 'application_history' WHERE route_id = 'application_history'; + +-- 系统设置 +UPDATE sys_route SET name = 'system' WHERE route_id = 'system'; +UPDATE sys_route SET name = 'system_amt' WHERE route_id = 'system_amt'; +UPDATE sys_route SET name = 'system_agent' WHERE route_id = 'system_agent'; +UPDATE sys_route SET name = 'system_log' WHERE route_id = 'system_log'; + +-- 我的设备 +UPDATE sys_route SET name = 'my-device' WHERE route_id = 'my_device'; +UPDATE sys_route SET name = 'my-device_status' WHERE route_id = 'my_device_status'; +UPDATE sys_route SET name = 'my-device_power-control' WHERE route_id = 'my_device_power'; +UPDATE sys_route SET name = 'my-device_remote-control' WHERE route_id = 'my_device_remote'; + +-- 设备申请 +UPDATE sys_route SET name = 'my-application' WHERE route_id = 'my_application'; +UPDATE sys_route SET name = 'my-application_apply' WHERE route_id = 'my_application_apply'; +UPDATE sys_route SET name = 'my-application_my-list' WHERE route_id = 'my_application_list'; + +-- ============================================ +-- 第二步:修复所有组件路径 +-- 父路由用 layout.base,子路由用 view.xxx +-- ============================================ + +-- 父路由 +UPDATE sys_route SET component = 'layout.base' WHERE route_id IN ('device', 'screen', 'user_manage', 'application', 'system', 'my_device', 'my_application'); + +-- 设备管理子路由 +UPDATE sys_route SET component = 'view.device_list' WHERE route_id = 'device_list'; +UPDATE sys_route SET component = 'view.device_online' WHERE route_id = 'device_online'; +UPDATE sys_route SET component = 'view.device_power' WHERE route_id = 'device_power'; +UPDATE sys_route SET component = 'view.device_monitor' WHERE route_id = 'device_monitor'; +UPDATE sys_route SET component = 'view.device_group' WHERE route_id = 'device_group'; + +-- 屏幕监控子路由 +UPDATE sys_route SET component = 'view.screen_wall' WHERE route_id = 'screen_wall'; +UPDATE sys_route SET component = 'view.screen_control' WHERE route_id = 'screen_control'; +UPDATE sys_route SET component = 'view.screen_record' WHERE route_id = 'screen_record'; + +-- 用户管理子路由 +UPDATE sys_route SET component = 'view.user-manage_list' WHERE route_id = 'user_list'; +UPDATE sys_route SET component = 'view.user-manage_role' WHERE route_id = 'user_role'; +UPDATE sys_route SET component = 'view.user-manage_permission' WHERE route_id = 'user_permission'; + +-- 申请管理子路由 +UPDATE sys_route SET component = 'view.application_approval' WHERE route_id = 'application_approval'; +UPDATE sys_route SET component = 'view.application_history' WHERE route_id = 'application_history'; + +-- 系统设置子路由 +UPDATE sys_route SET component = 'view.system_amt' WHERE route_id = 'system_amt'; +UPDATE sys_route SET component = 'view.system_agent' WHERE route_id = 'system_agent'; +UPDATE sys_route SET component = 'view.system_log' WHERE route_id = 'system_log'; + +-- 我的设备子路由 +UPDATE sys_route SET component = 'view.my-device_status' WHERE route_id = 'my_device_status'; +UPDATE sys_route SET component = 'view.my-device_power-control' WHERE route_id = 'my_device_power'; +UPDATE sys_route SET component = 'view.my-device_remote-control' WHERE route_id = 'my_device_remote'; + +-- 设备申请子路由 +UPDATE sys_route SET component = 'view.my-application_apply' WHERE route_id = 'my_application_apply'; +UPDATE sys_route SET component = 'view.my-application_my-list' WHERE route_id = 'my_application_list'; + +-- ============================================ +-- 第三步:更新角色菜单配置(最关键!) +-- 必须包含所有父路由和子路由的 name +-- ============================================ + +UPDATE sys_role +SET menus = 'device,device_list,device_group,device_monitor,device_online,device_power,screen,screen_wall,screen_control,screen_record,user-manage,user-manage_list,user-manage_role,user-manage_permission,application,application_approval,application_history,system,system_agent,system_amt,system_log,my-device,my-device_status,my-device_remote-control,my-device_power-control,my-application,my-application_apply,my-application_my-list' +WHERE role_code = 'R_SUPER'; + +UPDATE sys_role +SET menus = 'device,device_list,device_group,device_monitor,device_online,device_power,screen,screen_wall,screen_control,screen_record,user-manage,user-manage_list,user-manage_role,application,application_approval,application_history' +WHERE role_code = 'R_ADMIN'; + +UPDATE sys_role +SET menus = 'my-device,my-device_status,my-device_remote-control,my-device_power-control,my-application,my-application_apply,my-application_my-list' +WHERE role_code = 'R_USER'; + +-- ============================================ +-- 第四步:验证修复结果 +-- ============================================ + +SELECT '========================================' AS ''; +SELECT '用户管理路由配置' AS ''; +SELECT '========================================' AS ''; +SELECT route_id, name, path, component +FROM sys_route +WHERE route_id IN ('user_manage', 'user_list', 'user_role', 'user_permission') +ORDER BY order_num; + +SELECT '' AS ''; +SELECT '========================================' AS ''; +SELECT 'R_SUPER 角色菜单配置(前200字符)' AS ''; +SELECT '========================================' AS ''; +SELECT role_code, role_name, SUBSTRING(menus, 1, 200) AS menus_preview +FROM sys_role +WHERE role_code = 'R_SUPER'; + +SELECT '' AS ''; +SELECT '========================================' AS ''; +SELECT '检查子路由是否在角色配置中' AS ''; +SELECT '========================================' AS ''; +SELECT + r.name AS route_name, + CASE + WHEN role.menus LIKE CONCAT('%', r.name, '%') THEN '✓ YES' + ELSE '✗ NO - 这会导致路由被过滤!' + END AS in_role_config +FROM sys_route r +CROSS JOIN sys_role role +WHERE role.role_code = 'R_SUPER' + AND r.route_id IN ('user_manage', 'user_list', 'user_role', 'user_permission') +ORDER BY r.order_num; diff --git a/FIX_INSTRUCTIONS.md b/FIX_INSTRUCTIONS.md new file mode 100644 index 0000000..cace88f --- /dev/null +++ b/FIX_INSTRUCTIONS.md @@ -0,0 +1,109 @@ +# 菜单显示问题修复说明 + +## 问题原因 + +在实现动态路由权限时,我们将路由名称从连字符改为下划线格式: +- `user-manage` → `user_manage` +- `my-device` → `my_device` +- `my-application` → `my_application` + +但是,**组件路径(component)必须与实际文件夹结构保持一致**,而实际文件夹使用的是连字符: +- `src/views/user-manage/` +- `src/views/my-device/` +- `src/views/my-application/` + +这导致前端无法找到对应的组件文件,出现错误和菜单显示异常。 + +## 解决方案 + +保持以下规则: +1. **路由名称(name)** 使用下划线:`user_manage`, `my_device`, `my_application` +2. **组件路径(component)** 使用连字符匹配实际文件夹:`view.user-manage`, `view.my-device` + +## 修复步骤 + +### 方法一:使用批处理脚本(推荐) + +1. 双击运行 `fix_database.bat` +2. 按任意键开始执行 +3. 等待修复完成 +4. 重启后端服务 +5. 刷新浏览器测试 + +### 方法二:手动执行 SQL + +1. 打开 MySQL 客户端或命令行 +2. 连接到数据库: + ```bash + mysql -h localhost -P 3306 -u root -proot soybean_admin + ``` +3. 执行 SQL 文件: + ```sql + source EXECUTE_THIS_FIX.sql; + ``` + 或者直接复制 `EXECUTE_THIS_FIX.sql` 中的 SQL 语句执行 + +4. 重启后端服务 +5. 刷新浏览器测试 + +## 验证修复 + +执行 SQL 后,应该看到类似以下的结果: + +| 路由名称(下划线) | 路径 | 组件路径(连字符) | +|---|---|---| +| user_manage | /user-manage | layout.base$view.user-manage | +| user_manage_list | /user-manage/list | layout.base$view.user-manage_list | +| my_device | /my-device | layout.base$view.my-device | +| my_device_status | /my-device/status | layout.base$view.my-device_status | + +## 重启服务 + +修复数据库后,必须重启后端服务: + +```bash +cd backend +start.bat +``` + +## 测试 + +1. 清除浏览器缓存(Ctrl+Shift+Delete) +2. 强制刷新页面(Ctrl+Shift+R) +3. 重新登录 +4. 检查菜单是否正常显示 +5. 检查是否还有重复菜单 +6. 检查父子菜单层级是否正确 + +## 如果还有问题 + +如果修复后仍有问题,请检查: + +1. 后端日志中是否有错误信息 +2. 浏览器控制台是否有错误 +3. 数据库中的 component 字段是否已正确更新 +4. 是否已重启后端服务 +5. 是否已清除浏览器缓存 + +## 技术细节 + +### 路由名称规则(用于权限判断) +- 使用下划线分隔 +- 父菜单:0-1个下划线(如 `user_manage`, `device`) +- 子菜单:2个或以上下划线(如 `user_manage_list`, `device_online`) + +### 组件路径规则(用于加载 Vue 组件) +- 必须与实际文件夹结构完全一致 +- 文件夹使用连字符:`user-manage`, `my-device` +- 子文件夹也使用连字符:`power-control`, `my-list` +- 格式:`layout.base$view.{folder}_{subfolder}` + +### 示例对照表 + +| 路由名称 | 文件夹路径 | 组件路径 | +|---|---|---| +| user_manage | src/views/user-manage/ | layout.base$view.user-manage | +| user_manage_list | src/views/user-manage/list/ | layout.base$view.user-manage_list | +| my_device | src/views/my-device/ | layout.base$view.my-device | +| my_device_status | src/views/my-device/status/ | layout.base$view.my-device_status | +| my_device_power | src/views/my-device/power-control/ | layout.base$view.my-device_power-control | diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..20547de --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Soybean + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/MENU_SETUP.md b/MENU_SETUP.md new file mode 100644 index 0000000..0648511 --- /dev/null +++ b/MENU_SETUP.md @@ -0,0 +1,187 @@ +# 机房管控系统菜单配置指南 + +## 📋 菜单结构 + +### 管理员菜单 (R_SUPER, R_ADMIN) + +1. **首页** 🏠 + - 系统概览和统计信息 + +2. **设备管理** 💻 + - 设备列表 - 所有设备的增删改查 + - 在线状态 - 实时监控设备在线情况 + - 电源管理 - 远程控制设备电源 + - 远程监控 - 查看设备屏幕 + - 设备分组 - 按维度分组管理(未来扩展) + +3. **屏幕监控** 🖥 + - 监控墙 - 多屏幕同时监控 + - 单屏控制 - 单个设备控制 + - 控制记录 - 操作审计 + +4. **用户管理** 👤 + - 用户列表 - 用户增删改查 + - 角色管理 - 角色配置 + - 权限管理 - 权限分配(仅超级管理员) + +5. **使用申请** 📄 + - 申请审批 - 审批用户申请 + - 使用记录 - 查看使用历史 + +6. **系统设置** ⚙ (仅超级管理员) + - AMT设置 - Intel AMT配置 + - Agent设置 - 客户端程序管理 + - 日志中心 - 系统日志查询 + +### 普通用户菜单 (R_USER) + +1. **首页** 🏠 + - 个人使用概览 + +2. **我的设备** 💻 + - 设备状态 - 查看我的设备 + - 电源控制 - 控制设备电源 + - 远程控制 - 远程操作设备 + +3. **设备申请** 📄 + - 申请使用 - 提交使用申请 + - 我的申请 - 查看申请状态 + +## 🚀 部署步骤 + +### 1. 执行数据库脚本 + +```bash +# 登录 MySQL +mysql -u root -p + +# 执行路由初始化脚本 +source backend/src/main/resources/sql/add_all_routes.sql +``` + +或者在 MySQL 客户端中直接执行 `backend/src/main/resources/sql/add_all_routes.sql` 文件。 + +### 2. 生成前端路由 + +```bash +# 在项目根目录执行 +pnpm gen-route +``` + +这会自动扫描 `src/views` 目录并生成路由配置。 + +### 3. 重启服务 + +**后端:** +```bash +cd backend +mvn spring-boot:run +``` + +**前端:** +```bash +pnpm dev +``` + +### 4. 测试菜单 + +**管理员账号:** +- 用户名:`admin` +- 密码:`admin123` +- 可见菜单:所有管理员菜单 + +**普通用户账号:** +- 用户名:`user` +- 密码:`user123` +- 可见菜单:仅普通用户菜单 + +## 📁 文件结构 + +``` +src/views/ +├── home/ # 首页 +├── device/ # 设备管理 +│ ├── index.vue +│ ├── _meta.ts +│ ├── list/ # 设备列表 +│ ├── online/ # 在线状态 +│ ├── power/ # 电源管理 +│ ├── monitor/ # 远程监控 +│ └── group/ # 设备分组 +├── screen/ # 屏幕监控 +│ ├── index.vue +│ ├── _meta.ts +│ ├── wall/ # 监控墙 +│ ├── control/ # 单屏控制 +│ └── record/ # 控制记录 +├── user-manage/ # 用户管理 +│ ├── index.vue +│ ├── _meta.ts +│ ├── list/ # 用户列表 +│ ├── role/ # 角色管理 +│ └── permission/ # 权限管理 +├── application/ # 申请管理 +│ ├── index.vue +│ ├── _meta.ts +│ ├── approval/ # 申请审批 +│ └── history/ # 使用记录 +├── system/ # 系统设置 +│ ├── index.vue +│ ├── _meta.ts +│ ├── amt/ # AMT设置 +│ ├── agent/ # Agent设置 +│ └── log/ # 日志中心 +├── my-device/ # 我的设备(普通用户) +│ ├── index.vue +│ ├── _meta.ts +│ ├── status/ # 设备状态 +│ ├── power-control/ # 电源控制 +│ └── remote-control/ # 远程控制 +└── my-application/ # 设备申请(普通用户) + ├── index.vue + ├── _meta.ts + ├── apply/ # 申请使用 + └── my-list/ # 我的申请 +``` + +## 🎨 路由元信息配置 + +每个页面的 `_meta.ts` 文件配置示例: + +```typescript +export default { + title: '设备管理', // 菜单标题 + i18nKey: 'route.device', // 国际化key + icon: 'mdi:desktop-classic', // 图标 + order: 2, // 排序 + roles: ['R_SUPER', 'R_ADMIN'] // 可访问角色(可选) +}; +``` + +## 🔐 权限说明 + +- **R_SUPER**: 超级管理员 - 所有权限 +- **R_ADMIN**: 管理员 - 除系统设置外的所有权限 +- **R_USER**: 普通用户 - 仅个人相关功能 + +## 📝 注意事项 + +1. 当前使用的是**静态路由模式** (`VITE_AUTH_ROUTE_MODE=static`) +2. 路由根据角色自动过滤,不同角色看到不同菜单 +3. 所有页面都是示例页面,需要根据实际需求开发具体功能 +4. 图标使用 Material Design Icons (mdi) + +## 🔄 如何添加新菜单 + +1. 在 `src/views` 下创建新的页面文件夹 +2. 创建 `index.vue` 页面组件 +3. 创建 `_meta.ts` 配置文件 +4. 运行 `pnpm gen-route` 生成路由 +5. 在 `src/locales/langs/zh-cn.ts` 添加国际化配置 + +## 📞 技术支持 + +如有问题,请查看: +- 前端路由配置:`src/router/elegant/routes.ts` +- 后端路由数据:数据库 `sys_route` 表 +- 国际化配置:`src/locales/langs/zh-cn.ts` diff --git a/QUICK_FIX.md b/QUICK_FIX.md new file mode 100644 index 0000000..78b4fac --- /dev/null +++ b/QUICK_FIX.md @@ -0,0 +1,32 @@ +# 快速修复指南 + +## 问题 +菜单显示异常、重复、前端报错 + +## 原因 +路由名称改成了下划线,但组件路径也跟着改了,导致找不到实际的文件夹(文件夹用的是连字符) + +## 修复(3步) + +### 1. 执行数据库修复 +双击运行: +``` +fix_database.bat +``` + +### 2. 重启后端 +```bash +cd backend +start.bat +``` + +### 3. 刷新浏览器 +按 `Ctrl + Shift + R` 强制刷新 + +## 完成! + +现在菜单应该正常显示了,不会重复,也有正确的父子层级。 + +--- + +详细说明请查看 `FIX_INSTRUCTIONS.md` diff --git a/README.en_US.md b/README.en_US.md new file mode 100644 index 0000000..4b8bd91 --- /dev/null +++ b/README.en_US.md @@ -0,0 +1,216 @@ +
+ +

SoybeanAdmin

+ 中文 | English +
+ +--- + +[![license](https://img.shields.io/badge/license-MIT-green.svg)](./LICENSE) +[![github stars](https://img.shields.io/github/stars/honghuangdc/soybean-admin)](https://github.com/soybeanjs/soybean-admin) +[![github forks](https://img.shields.io/github/forks/honghuangdc/soybean-admin)](https://github.com/soybeanjs/soybean-admin) +[![gitee stars](https://gitee.com/honghuangdc/soybean-admin/badge/star.svg)](https://gitee.com/honghuangdc/soybean-admin) +[![gitcode star](https://gitcode.com/soybeanjs/soybean-admin/star/badge.svg)](https://gitcode.com/soybeanjs/soybean-admin) + +
+ soybeanjs%2Fsoybean-admin | Trendshift + Featured|HelloGitHub +
+ +> [!NOTE] +> If you think `SoybeanAdmin` is helpful to you, or you like our project, please give us a ⭐️ on GitHub. Your support is the driving force for us to continue to improve and add new features! Thank you for your support! + +> [!NOTE] +> The `SoybeanAdmin` quick start series videos have been uploaded to [Bilibili](https://www.bilibili.com/video/BV1YKdRYXELC) Go online [click here](https://www.bilibili.com/video/BV1YKdRYXELC) Go check it out + +> [!WARNING] +> `SoybeanAdmin` is planning to develop a `V2` version, see [plan list](https://github.com/soybeanjs/soybean-admin/issues/767) + +## Introduction + +[`SoybeanAdmin`](https://github.com/soybeanjs/soybean-admin) is a clean, elegant, beautiful and powerful admin template, based on the latest front-end technology stack, including Vue3, Vite7, TypeScript, Pinia and UnoCSS. It has built-in rich theme configuration and components, strict code specifications, and an automated file routing system. In addition, it also uses the online mock data solution based on ApiFox. `SoybeanAdmin` provides you with a one-stop admin solution, no additional configuration, and out of the box. It is also a best practice for learning cutting-edge technologies quickly. + + +## Features + +- **Cutting-edge technology application**: using the latest popular technology stack such as Vue3, Vite7, TypeScript, Pinia and UnoCSS. +- **Clear project architecture**: using pnpm monorepo architecture, clear structure, elegant and easy to understand. +- **Strict code specifications**: follow the [SoybeanJS specification](https://docs.soybeanjs.cn/standard), integrate eslint, prettier and simple-git-hooks to ensure the code is standardized. +- **TypeScript**: support strict type checking to improve code maintainability. +- **Rich theme configuration**: built-in a variety of theme configurations, perfectly integrated with UnoCSS. +- **Built-in internationalization solution**: easily realize multi-language support. +- **Automated file routing system**: automatically generate route import, declaration and type. For more details, please refer to [Elegant Router](https://github.com/soybeanjs/elegant-router). +- **Flexible permission routing**: support both front-end static routing and back-end dynamic routing. +- **Rich page components**: built-in a variety of pages and components, including 403, 404, 500 pages, as well as layout components, tag components, theme configuration components, etc. +- **Command line tool**: built-in efficient command line tool, git commit, delete file, release, etc. +- **Mobile adaptation**: perfectly support mobile terminal to realize adaptive layout. + + +## Version + +- **NaiveUI Version:** + - [Preview Link](https://naive.soybeanjs.cn/) + - [Github Repository](https://github.com/soybeanjs/soybean-admin) + - [Gitee Repository](https://gitee.com/honghuangdc/soybean-admin) + - [Gitcode Repository](https://gitcode.com/soybeanjs/soybean-admin) + +- **AntDesignVue Version:** + - [Preview Link](https://antd.soybeanjs.cn/) + - [Github Repository](https://github.com/soybeanjs/soybean-admin-antd) + - [Gitee Repository](https://gitee.com/honghuangdc/soybean-admin-antd) + - [Gitcode Repository](https://gitcode.com/soybeanjs/soybean-admin-antd) + +- **ElementPlus Version:** + - [Preview Link](https://elp.soybeanjs.cn/) + - [Github Repository](https://github.com/soybeanjs/soybean-admin-element-plus) + - [Gitee Repository](https://gitee.com/honghuangdc/soybean-admin-element-plus) + - [Gitcode Repository](https://gitcode.com/soybeanjs/soybean-admin-element-plus) + +- **Legacy Version:** + - [Preview Link](https://legacy.soybeanjs.cn/) + - [Github Repository](https://github.com/soybeanjs/soybean-admin/tree/legacy) + - [Gitee Repository](https://gitee.com/honghuangdc/soybean-admin/tree/legacy) + - [Gitcode Repository](https://gitcode.com/soybeanjs/soybean-admin/tree/legacy) + + +## Documentation + +- [Link](https://docs.soybeanjs.cn) +- [Legacy Docs](https://legacy-docs.soybeanjs.cn) + +## Example Images + +![](https://soybeanjs-1300612522.cos.ap-guangzhou.myqcloud.com/uPic/soybean-admin-v1-01.png) +![](https://soybeanjs-1300612522.cos.ap-guangzhou.myqcloud.com/uPic/soybean-admin-v1-02.png) +![](https://soybeanjs-1300612522.cos.ap-guangzhou.myqcloud.com/uPic/soybean-admin-v1-03.png) +![](https://soybeanjs-1300612522.cos.ap-guangzhou.myqcloud.com/uPic/soybean-admin-v1-04.png) +![](https://soybeanjs-1300612522.cos.ap-guangzhou.myqcloud.com/uPic/soybean-admin-v1-05.png) +![](https://soybeanjs-1300612522.cos.ap-guangzhou.myqcloud.com/uPic/soybean-admin-v1-06.png) +![](https://soybeanjs-1300612522.cos.ap-guangzhou.myqcloud.com/uPic/soybean-admin-v1-07.png) +![](https://soybeanjs-1300612522.cos.ap-guangzhou.myqcloud.com/uPic/soybean-admin-v1-08.png) +![](https://soybeanjs-1300612522.cos.ap-guangzhou.myqcloud.com/uPic/soybean-admin-v1-09.png) +![](https://soybeanjs-1300612522.cos.ap-guangzhou.myqcloud.com/uPic/soybean-admin-v1-10.png) +![](https://soybeanjs-1300612522.cos.ap-guangzhou.myqcloud.com/uPic/soybean-admin-v1-mobile.png) + + +## Usage + +**Environment Preparation** + +Make sure your environment meets the following requirements: + +- **git**: you need git to clone and manage project versions. +- **NodeJS**: >=20.19.0, recommended 20.19.0 or higher. +- **pnpm**: >= 10.5.0, recommended 10.5.0 or higher. + +**Clone Project** + +```bash +# github +git clone https://github.com/soybeanjs/soybean-admin.git +# gitee +git clone https://gitee.com/honghuangdc/soybean-admin.git +# gitcode +git clone https://gitcode.com/soybeanjs/soybean-admin.git +``` + +**Install Dependencies** + +```bash +pnpm i +``` +> Since this project uses the pnpm monorepo management method, please do not use npm or yarn to install dependencies. + +**Start Project** + +```bash +pnpm dev +``` + +**Build Project** + +```bash +pnpm build +``` + +**Code Synchronization** + +Refer to the [Code Synchronization](https://docs.soybeanjs.cn/guide/sync) document. + +## Ecosystem + +- [skyroc-admin](https://github.com/Ohh-889/skyroc-admin): SoybeanAdmin's React version implementation. +- [electron-mock-admin](https://github.com/lixin59/electron-mock-api): A Mock Api management system that helps front-end developers quickly implement interface mocks. +- [T-Shell](https://github.com/TheBlindM/T-Shell): A terminal emulator and SSH client with configurable command prompts. +- [pea](https://github.com/haitang1894/pea) : Adopting SpringBoot3.2 + JDK21, MyBatis-Plus, SpringSecurity security framework, etc., suitable for the simple permission system developed by [soybean-admin](https://gitee.com/honghuangdc/soybean-admin). +- [MalusAdmin](https://github.com/pridejoy/MalusAdmin): A backend management framework developed based on Vue3/TypeScript/NaiveUI and NET7 & Sqlsugar. It is implemented in the most original and simplest way, with a fresh and elegant front-end, a clear and elegant backend structure, and powerful functions. +- [PanisAdmin](https://github.com/paynezhuang/panis-admin): Adopting SpringBoot 3, SaToken, MySQL and other frameworks to develop and modify [soybean-admin](https://github.com/soybeanjs/soybean-admin) for the second time, adapting dynamic menu/button-level authorization. Retaining the original flavor, fresh and elegant, high-value back-end management system scaffold. +- [snail-job](https://github.com/aizuda/snail-job): A distributed task retry and task scheduling platform with "high performance, high value and high activity". +- [SuperApi](https://github.com/TmmTop/SuperApi): Quickly turn your idea into an online stable product! Entity-less library and table building, add, delete, change and check entity-less library table, support 15 kinds of condition query, as well as paging, list, unlimited tree list and other functions of the API deployment! With interface documentation, Auth authorisation, interface flow restriction, access to the client's real IP, advanced server caching components, dynamic APIs and other features, we look forward to your experience! +- [FastSoyAdmin](https://github.com/sleep1223/fast-soy-admin): A modern Management Platform based on FastAPI+Vue3+Naive UI. +- [ba](https://github.com/xiatianYa/Ba-Server): Backend service docking with soybean admin based on goFrame framework, adapted to dynamic routing, and interface authentication permissions. +- [soybean-admin-go](https://github.com/WgoW/soybean-admin-go):A Go backend service developed based on the Gin and GORM frameworks, integrated with the example branch of Soybean Admin. It supports dynamic routing and API permission authentication. + +More ecosystem please refer to [Ecosystem](https://docs.soybeanjs.cn/awesome) document. + + +## How to Contribute + +We warmly welcome and appreciate all forms of contributions. If you have any ideas or suggestions, please feel free to share them by submitting [pull requests](https://github.com/soybeanjs/soybean-admin/pulls) or creating GitHub [issue](https://github.com/soybeanjs/soybean-admin/issues/new). + +## Git Commit Guidelines + +This project has built-in `commit` command, you can execute `pnpm commit` to generate commit information that conforms to [Conventional Commits](https://www.conventionalcommits.org/) specification. When submitting PR, please be sure to use `commit` command to create commit information to ensure the standardization of information. + +## Browser Support + +It is recommended to use the latest version of Chrome in development for a better experience. + +| [IE](http://godban.github.io/browsers-support-badges/) | [ Edge](http://godban.github.io/browsers-support-badges/) | [Firefox](http://godban.github.io/browsers-support-badges/) | [Chrome](http://godban.github.io/browsers-support-badges/) | [Safari](http://godban.github.io/browsers-support-badges/) | +| --- | --- | --- | --- | --- | +| not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions | + +## OpenSource Author + +[Soybean](https://github.com/honghuangdc) + +## Contributors + +Thanks the following people for their contributions. If you want to contribute to this project, please refer to [How to Contribute](#how-to-contribute). + + + + + +--- + +Here are the most active contributors from the past year. Thank you all for your support, which has enabled the project's continued development. + + + Contribution Leaderboard + + +## Communication + +`SoybeanAdmin` is a completely open source and free project, helping developers to develop medium and large-scale management systems more conveniently. It also provides WeChat and QQ communication groups. If you have any questions, please feel free to ask in the group. + +
+

QQ Group

+ +
+ +
+

Add the following WeChat to invite to the WeChat group

+ +
+ +## Star Trend + +[![Star History Chart](https://api.star-history.com/svg?repos=soybeanjs/soybean-admin&type=Date)](https://star-history.com/#soybeanjs/soybean-admin&Date) + +## License + +This project is based on the [MIT © 2021 Soybean](./LICENSE) protocol, for learning purposes only, please retain the author's copyright information for commercial use, the author does not guarantee and is not responsible for the software. diff --git a/ROLE_PERMISSION_TEST.md b/ROLE_PERMISSION_TEST.md new file mode 100644 index 0000000..d104cf2 --- /dev/null +++ b/ROLE_PERMISSION_TEST.md @@ -0,0 +1,148 @@ +# 角色权限功能测试指南 + +## 功能说明 + +现在系统已经实现了完整的基于角色的菜单权限控制: + +1. **角色管理**:可以创建、编辑、删除角色 +2. **权限配置**:可以为每个角色配置可访问的菜单 +3. **用户管理**:可以为用户分配一个或多个角色 +4. **权限生效**:用户登录后只能看到其角色配置的菜单 + +## 测试步骤 + +### 1. 创建测试角色 + +进入 **用户管理 > 角色管理**,创建以下测试角色: + +- **角色1:设备管理员** + - 角色编码:`R_DEVICE_ADMIN` + - 角色名称:设备管理员 + - 描述:负责设备管理相关功能 + +- **角色2:屏幕管理员** + - 角色编码:`R_SCREEN_ADMIN` + - 角色名称:屏幕管理员 + - 描述:负责屏幕监控相关功能 + +### 2. 配置角色权限 + +进入 **用户管理 > 权限管理**: + +#### 为"设备管理员"配置权限: +点击"配置权限"按钮,选择以下菜单: +- ✅ home(首页) +- ✅ device(设备管理) + - ✅ device_list(设备列表) + - ✅ device_group(设备分组) + - ✅ device_monitor(设备监控) + - ✅ device_online(在线设备) + - ✅ device_power(电源管理) + +#### 为"屏幕管理员"配置权限: +点击"配置权限"按钮,选择以下菜单: +- ✅ home(首页) +- ✅ screen(屏幕监控) + - ✅ screen_wall(监控墙) + - ✅ screen_control(远程控制) + - ✅ screen_record(录像回放) + +### 3. 创建测试用户 + +进入 **用户管理 > 用户列表**: + +#### 创建设备管理员用户: +- 用户ID:`device_admin` +- 用户名:设备管理员 +- 密码:`123456` +- 角色:选择"设备管理员" +- 状态:启用 + +#### 创建屏幕管理员用户: +- 用户ID:`screen_admin` +- 用户名:屏幕管理员 +- 密码:`123456` +- 角色:选择"屏幕管理员" +- 状态:启用 + +#### 创建多角色用户: +- 用户ID:`multi_admin` +- 用户名:多角色管理员 +- 密码:`123456` +- 角色:同时选择"设备管理员"和"屏幕管理员" +- 状态:启用 + +### 4. 验证权限 + +#### 测试1:设备管理员登录 +1. 退出当前账号 +2. 使用 `device_admin` / `123456` 登录 +3. **预期结果**: + - ✅ 可以看到"首页"菜单 + - ✅ 可以看到"设备管理"及其所有子菜单 + - ❌ 看不到"屏幕监控"菜单 + - ❌ 看不到"用户管理"菜单 + +#### 测试2:屏幕管理员登录 +1. 退出当前账号 +2. 使用 `screen_admin` / `123456` 登录 +3. **预期结果**: + - ✅ 可以看到"首页"菜单 + - ✅ 可以看到"屏幕监控"及其所有子菜单 + - ❌ 看不到"设备管理"菜单 + - ❌ 看不到"用户管理"菜单 + +#### 测试3:多角色用户登录 +1. 退出当前账号 +2. 使用 `multi_admin` / `123456` 登录 +3. **预期结果**: + - ✅ 可以看到"首页"菜单 + - ✅ 可以看到"设备管理"及其所有子菜单 + - ✅ 可以看到"屏幕监控"及其所有子菜单 + - ❌ 看不到"用户管理"菜单 + +#### 测试4:超级管理员 +1. 使用 `admin` / `admin123` 登录 +2. **预期结果**: + - ✅ 可以看到所有菜单(需要先为 R_SUPER 角色配置所有菜单权限) + +## 技术实现 + +### 后端实现 +- `RouteService.getUserRoutes()` 方法会: + 1. 查询用户的角色列表 + 2. 从 `sys_role` 表查询角色配置的菜单 + 3. 合并所有角色的菜单权限 + 4. 返回用户可访问的路由列表 + +### 前端实现 +- 用户列表页面动态加载角色选项 +- 角色选择器显示角色中文名称 +- 表格中显示角色名称(带颜色标签) + +### 数据库 +- `sys_role.menus` 字段存储角色可访问的菜单(逗号分隔) +- `sys_user.roles` 字段存储用户的角色列表(逗号分隔) + +## 注意事项 + +1. **首次使用**:需要先为现有的 `R_SUPER` 和 `R_ADMIN` 角色配置菜单权限 +2. **角色状态**:只有启用状态的角色才会生效 +3. **多角色**:用户可以拥有多个角色,权限会合并 +4. **空权限**:如果角色没有配置任何菜单,用户将看不到任何菜单(除了首页) +5. **实时生效**:修改角色权限后,用户需要重新登录才能看到变化 + +## 故障排查 + +### 问题1:用户看不到任何菜单 +- 检查用户是否分配了角色 +- 检查角色是否为启用状态 +- 检查角色是否配置了菜单权限 + +### 问题2:权限修改后没有生效 +- 用户需要退出并重新登录 +- 检查后端日志是否有错误 + +### 问题3:角色选择器是空的 +- 检查是否有启用状态的角色 +- 检查浏览器控制台是否有 API 错误 diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..ad9e2ab --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,42 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Maven ### +.mvn/ +mvnw +mvnw.cmd + +### Logs ### +*.log +logs/ diff --git a/backend/README.md b/backend/README.md new file mode 100644 index 0000000..4a6ca23 --- /dev/null +++ b/backend/README.md @@ -0,0 +1,208 @@ +# Soybean Admin Backend + +基于 Spring Boot 3.2 的后端服务,为 Soybean Admin 前端提供 API 支持。 + +## 技术栈 + +- Spring Boot 3.2.0 +- MyBatis Plus 3.5.5 +- MySQL 8.0+ +- JWT (jjwt 0.12.3) +- Lombok + +## 快速开始 + +### 1. 环境要求 + +- JDK 17+ +- Maven 3.6+ +- MySQL 8.0+ + +### 2. 数据库初始化 + +```bash +# 登录 MySQL +mysql -u root -p + +# 执行初始化脚本 +source src/main/resources/sql/init.sql +``` + +或者直接在 MySQL 客户端中执行 `src/main/resources/sql/init.sql` 文件。 + +### 3. 配置数据库 + +编辑 `src/main/resources/application.yml`,确认数据库配置: + +```yaml +spring: + datasource: + url: jdbc:mysql://localhost:3306/soybean_admin?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false + username: root + password: root +``` + +### 4. 启动项目 + +```bash +# 使用 Maven 启动 +mvn spring-boot:run + +# 或者先编译再运行 +mvn clean package +java -jar target/soybean-admin-backend-1.0.0.jar +``` + +服务将在 `http://localhost:8080` 启动。 + +## 默认账号 + +| 用户名 | 密码 | 角色 | 说明 | +|--------|------|------|------| +| admin | admin123 | R_SUPER, R_ADMIN | 超级管理员 | +| user | user123 | R_USER | 普通用户 | + +## API 接口 + +### 认证接口 + +#### 1. 登录 +``` +POST /auth/login +Content-Type: application/json + +{ + "userName": "admin", + "password": "admin123" +} +``` + +#### 2. 获取用户信息 +``` +GET /auth/getUserInfo +Authorization: Bearer {token} +``` + +#### 3. 刷新令牌 +``` +POST /auth/refreshToken +Content-Type: application/json + +{ + "refreshToken": "xxx" +} +``` + +### 路由接口 + +#### 1. 获取常量路由 +``` +GET /route/getConstantRoutes +Authorization: Bearer {token} +``` + +#### 2. 获取用户路由 +``` +GET /route/getUserRoutes +Authorization: Bearer {token} +``` + +#### 3. 检查路由是否存在 +``` +GET /route/isRouteExist?routeName=home +Authorization: Bearer {token} +``` + +## 响应格式 + +所有接口统一返回格式: + +```json +{ + "code": "0000", + "msg": "success", + "data": {} +} +``` + +- `code`: "0000" 表示成功,其他表示失败 +- `msg`: 响应消息 +- `data`: 响应数据 + +## 错误码 + +| 错误码 | 说明 | +|--------|------| +| 0000 | 成功 | +| 1111 | 通用错误 | +| 7777 | 需要弹窗提示的登出 | +| 8888 | 直接登出 | +| 9999 | Token 过期 | + +## 项目结构 + +``` +backend/ +├── src/main/java/com/soybean/admin/ +│ ├── common/ # 通用类 +│ │ └── Result.java # 统一响应格式 +│ ├── config/ # 配置类 +│ │ ├── WebConfig.java +│ │ └── InterceptorConfig.java +│ ├── controller/ # 控制器 +│ │ ├── AuthController.java +│ │ └── RouteController.java +│ ├── dto/ # 数据传输对象 +│ ├── entity/ # 实体类 +│ │ ├── User.java +│ │ └── Route.java +│ ├── interceptor/ # 拦截器 +│ │ └── AuthInterceptor.java +│ ├── mapper/ # MyBatis Mapper +│ │ ├── UserMapper.java +│ │ └── RouteMapper.java +│ ├── service/ # 服务层 +│ │ ├── AuthService.java +│ │ └── RouteService.java +│ └── util/ # 工具类 +│ └── JwtUtil.java +└── src/main/resources/ + ├── application.yml # 配置文件 + └── sql/ + └── init.sql # 数据库初始化脚本 +``` + +## 前端配置 + +修改前端项目的 `.env.test` 或 `.env.prod` 文件: + +```env +VITE_SERVICE_BASE_URL=http://localhost:8080 +``` + +## 开发说明 + +### 添加新接口 + +1. 在 `entity` 包中创建实体类 +2. 在 `mapper` 包中创建 Mapper 接口 +3. 在 `service` 包中创建服务类 +4. 在 `controller` 包中创建控制器 +5. 在 `dto` 包中创建 DTO 类(如需要) + +### 权限控制 + +- 不需要认证的接口在 `InterceptorConfig` 中配置 `excludePathPatterns` +- 需要特定角色的路由在数据库 `sys_route` 表的 `roles` 字段配置 + +## 注意事项 + +1. 生产环境请修改 JWT 密钥(`application.yml` 中的 `jwt.secret`) +2. 生产环境请使用加密的密码存储(建议使用 BCrypt) +3. 建议配置日志输出到文件 +4. 建议添加全局异常处理 +5. 建议添加接口限流和防重放攻击 + +## License + +MIT diff --git a/backend/pom.xml b/backend/pom.xml new file mode 100644 index 0000000..2f91cf1 --- /dev/null +++ b/backend/pom.xml @@ -0,0 +1,96 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.7.18 + + + + com.soybean + soybean-admin-backend + 1.0.0 + soybean-admin-backend + Backend for Soybean Admin + + + 17 + 3.5.5 + 0.11.5 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-validation + + + + + com.mysql + mysql-connector-j + runtime + + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + + + io.jsonwebtoken + jjwt-api + ${jwt.version} + + + io.jsonwebtoken + jjwt-impl + ${jwt.version} + runtime + + + io.jsonwebtoken + jjwt-jackson + ${jwt.version} + runtime + + + + + org.projectlombok + lombok + true + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/backend/src/main/java/com/soybean/admin/SoybeanAdminApplication.java b/backend/src/main/java/com/soybean/admin/SoybeanAdminApplication.java new file mode 100644 index 0000000..2d09f6b --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/SoybeanAdminApplication.java @@ -0,0 +1,13 @@ +package com.soybean.admin; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +@MapperScan("com.soybean.admin.mapper") +public class SoybeanAdminApplication { + public static void main(String[] args) { + SpringApplication.run(SoybeanAdminApplication.class, args); + } +} diff --git a/backend/src/main/java/com/soybean/admin/common/Result.java b/backend/src/main/java/com/soybean/admin/common/Result.java new file mode 100644 index 0000000..4c6bc51 --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/common/Result.java @@ -0,0 +1,29 @@ +package com.soybean.admin.common; + +import lombok.Data; + +@Data +public class Result { + private String code; + private String msg; + private T data; + + public static Result success(T data) { + Result result = new Result<>(); + result.setCode("0000"); + result.setMsg("success"); + result.setData(data); + return result; + } + + public static Result error(String code, String msg) { + Result result = new Result<>(); + result.setCode(code); + result.setMsg(msg); + return result; + } + + public static Result error(String msg) { + return error("1111", msg); + } +} diff --git a/backend/src/main/java/com/soybean/admin/config/InterceptorConfig.java b/backend/src/main/java/com/soybean/admin/config/InterceptorConfig.java new file mode 100644 index 0000000..215a521 --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/config/InterceptorConfig.java @@ -0,0 +1,24 @@ +package com.soybean.admin.config; + +import com.soybean.admin.interceptor.AuthInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class InterceptorConfig implements WebMvcConfigurer { + + @Autowired + private AuthInterceptor authInterceptor; + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(authInterceptor) + .addPathPatterns("/**") + .excludePathPatterns( + "/auth/login", + "/auth/error" + ); + } +} diff --git a/backend/src/main/java/com/soybean/admin/config/WebConfig.java b/backend/src/main/java/com/soybean/admin/config/WebConfig.java new file mode 100644 index 0000000..610b081 --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/config/WebConfig.java @@ -0,0 +1,19 @@ +package com.soybean.admin.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOriginPatterns("*") + .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") + .allowedHeaders("*") + .allowCredentials(true) + .maxAge(3600); + } +} diff --git a/backend/src/main/java/com/soybean/admin/controller/AuthController.java b/backend/src/main/java/com/soybean/admin/controller/AuthController.java new file mode 100644 index 0000000..061be59 --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/controller/AuthController.java @@ -0,0 +1,56 @@ +package com.soybean.admin.controller; + +import com.soybean.admin.common.Result; +import com.soybean.admin.dto.LoginRequest; +import com.soybean.admin.dto.LoginToken; +import com.soybean.admin.dto.UserInfo; +import com.soybean.admin.service.AuthService; +import javax.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +@RestController +@RequestMapping("/auth") +public class AuthController { + + @Autowired + private AuthService authService; + + @PostMapping("/login") + public Result login(@Valid @RequestBody LoginRequest request) { + try { + LoginToken token = authService.login(request.getUserName(), request.getPassword()); + return Result.success(token); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } + + @GetMapping("/getUserInfo") + public Result getUserInfo(@RequestAttribute("userId") String userId) { + try { + UserInfo userInfo = authService.getUserInfo(userId); + return Result.success(userInfo); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } + + @PostMapping("/refreshToken") + public Result refreshToken(@RequestBody Map request) { + try { + String refreshToken = request.get("refreshToken"); + LoginToken token = authService.refreshToken(refreshToken); + return Result.success(token); + } catch (Exception e) { + return Result.error("9999", e.getMessage()); + } + } + + @GetMapping("/error") + public Result error(@RequestParam String code, @RequestParam String msg) { + return Result.error(code, msg); + } +} diff --git a/backend/src/main/java/com/soybean/admin/controller/PermissionController.java b/backend/src/main/java/com/soybean/admin/controller/PermissionController.java new file mode 100644 index 0000000..05c8f19 --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/controller/PermissionController.java @@ -0,0 +1,17 @@ +package com.soybean.admin.controller; + +import com.soybean.admin.common.Result; +import com.soybean.admin.service.PermissionService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/permission") +public class PermissionController { + + @Autowired + private PermissionService permissionService; + + // 权限管理现在通过角色管理页面的menus字段实现 + // 不需要单独的权限接口 +} diff --git a/backend/src/main/java/com/soybean/admin/controller/RoleController.java b/backend/src/main/java/com/soybean/admin/controller/RoleController.java new file mode 100644 index 0000000..50ad9db --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/controller/RoleController.java @@ -0,0 +1,90 @@ +package com.soybean.admin.controller; + +import com.soybean.admin.common.Result; +import com.soybean.admin.dto.PageRequest; +import com.soybean.admin.dto.PageResponse; +import com.soybean.admin.dto.RoleDTO; +import com.soybean.admin.service.RoleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +@RestController +@RequestMapping("/role") +public class RoleController { + + @Autowired + private RoleService roleService; + + @PostMapping("/list") + public Result> getRoleList(@RequestBody PageRequest request) { + try { + PageResponse response = roleService.getRoleList(request); + return Result.success(response); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } + + @GetMapping("/all") + public Result> getAllRoles() { + try { + List roles = roleService.getAllRoles(); + return Result.success(roles); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } + + @GetMapping("/{id}") + public Result getRoleById(@PathVariable Long id) { + try { + RoleDTO role = roleService.getRoleById(id); + return Result.success(role); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } + + @PostMapping + public Result createRole(@Valid @RequestBody RoleDTO dto) { + try { + roleService.createRole(dto); + return Result.success(null); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } + + @PutMapping + public Result updateRole(@Valid @RequestBody RoleDTO dto) { + try { + roleService.updateRole(dto); + return Result.success(null); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } + + @DeleteMapping("/{id}") + public Result deleteRole(@PathVariable Long id) { + try { + roleService.deleteRole(id); + return Result.success(null); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } + + @PostMapping("/batchDelete") + public Result batchDelete(@RequestBody List ids) { + try { + roleService.batchDelete(ids); + return Result.success(null); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } +} diff --git a/backend/src/main/java/com/soybean/admin/controller/RouteController.java b/backend/src/main/java/com/soybean/admin/controller/RouteController.java new file mode 100644 index 0000000..6a20521 --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/controller/RouteController.java @@ -0,0 +1,58 @@ +package com.soybean.admin.controller; + +import com.soybean.admin.common.Result; +import com.soybean.admin.dto.MenuRoute; +import com.soybean.admin.dto.UserRoute; +import com.soybean.admin.service.RouteService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/route") +public class RouteController { + + @Autowired + private RouteService routeService; + + @GetMapping("/getConstantRoutes") + public Result> getConstantRoutes() { + try { + List routes = routeService.getConstantRoutes(); + return Result.success(routes); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } + + @GetMapping("/getUserRoutes") + public Result getUserRoutes(@RequestAttribute("userId") String userId) { + try { + UserRoute userRoute = routeService.getUserRoutes(userId); + return Result.success(userRoute); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } + + @GetMapping("/isRouteExist") + public Result isRouteExist(@RequestParam String routeName) { + try { + boolean exists = routeService.isRouteExist(routeName); + return Result.success(exists); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } + + @GetMapping("/getAllMenus") + public Result> getAllMenus() { + try { + List menus = routeService.getConstantRoutes(); + return Result.success(menus); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } +} diff --git a/backend/src/main/java/com/soybean/admin/controller/UserController.java b/backend/src/main/java/com/soybean/admin/controller/UserController.java new file mode 100644 index 0000000..e7cc24c --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/controller/UserController.java @@ -0,0 +1,80 @@ +package com.soybean.admin.controller; + +import com.soybean.admin.common.Result; +import com.soybean.admin.dto.PageRequest; +import com.soybean.admin.dto.PageResponse; +import com.soybean.admin.dto.UserDTO; +import com.soybean.admin.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +@RestController +@RequestMapping("/user") +public class UserController { + + @Autowired + private UserService userService; + + @PostMapping("/list") + public Result> getUserList(@RequestBody PageRequest request) { + try { + PageResponse response = userService.getUserList(request); + return Result.success(response); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } + + @GetMapping("/{id}") + public Result getUserById(@PathVariable Long id) { + try { + UserDTO user = userService.getUserById(id); + return Result.success(user); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } + + @PostMapping + public Result createUser(@Valid @RequestBody UserDTO dto) { + try { + userService.createUser(dto); + return Result.success(null); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } + + @PutMapping + public Result updateUser(@Valid @RequestBody UserDTO dto) { + try { + userService.updateUser(dto); + return Result.success(null); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } + + @DeleteMapping("/{id}") + public Result deleteUser(@PathVariable Long id) { + try { + userService.deleteUser(id); + return Result.success(null); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } + + @PostMapping("/batchDelete") + public Result batchDelete(@RequestBody List ids) { + try { + userService.batchDelete(ids); + return Result.success(null); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } +} diff --git a/backend/src/main/java/com/soybean/admin/dto/LoginRequest.java b/backend/src/main/java/com/soybean/admin/dto/LoginRequest.java new file mode 100644 index 0000000..a6d0fc8 --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/dto/LoginRequest.java @@ -0,0 +1,13 @@ +package com.soybean.admin.dto; + +import lombok.Data; +import javax.validation.constraints.NotBlank; + +@Data +public class LoginRequest { + @NotBlank(message = "用户名不能为空") + private String userName; + + @NotBlank(message = "密码不能为空") + private String password; +} diff --git a/backend/src/main/java/com/soybean/admin/dto/LoginToken.java b/backend/src/main/java/com/soybean/admin/dto/LoginToken.java new file mode 100644 index 0000000..6d50764 --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/dto/LoginToken.java @@ -0,0 +1,13 @@ +package com.soybean.admin.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LoginToken { + private String token; + private String refreshToken; +} diff --git a/backend/src/main/java/com/soybean/admin/dto/MenuRoute.java b/backend/src/main/java/com/soybean/admin/dto/MenuRoute.java new file mode 100644 index 0000000..73df5e0 --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/dto/MenuRoute.java @@ -0,0 +1,16 @@ +package com.soybean.admin.dto; + +import lombok.Data; +import java.util.List; +import java.util.Map; + +@Data +public class MenuRoute { + private String id; + private String name; + private String path; + private String component; + private Boolean props; + private Map meta; + private List children; +} diff --git a/backend/src/main/java/com/soybean/admin/dto/PageRequest.java b/backend/src/main/java/com/soybean/admin/dto/PageRequest.java new file mode 100644 index 0000000..0b6e260 --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/dto/PageRequest.java @@ -0,0 +1,13 @@ +package com.soybean.admin.dto; + +import lombok.Data; + +@Data +public class PageRequest { + private Integer current = 1; + private Integer size = 10; + private String userName; + private String roleName; + private String permissionName; + private Integer status; +} diff --git a/backend/src/main/java/com/soybean/admin/dto/PageResponse.java b/backend/src/main/java/com/soybean/admin/dto/PageResponse.java new file mode 100644 index 0000000..5b666de --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/dto/PageResponse.java @@ -0,0 +1,16 @@ +package com.soybean.admin.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PageResponse { + private List records; + private Long total; + private Integer current; + private Integer size; +} diff --git a/backend/src/main/java/com/soybean/admin/dto/RoleDTO.java b/backend/src/main/java/com/soybean/admin/dto/RoleDTO.java new file mode 100644 index 0000000..e22f81e --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/dto/RoleDTO.java @@ -0,0 +1,23 @@ +package com.soybean.admin.dto; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.time.LocalDateTime; + +@Data +public class RoleDTO { + private Long id; + + @NotBlank(message = "角色编码不能为空") + private String roleCode; + + @NotBlank(message = "角色名称不能为空") + private String roleName; + + private String description; + private String menus; + private Integer status; + private LocalDateTime createTime; + private LocalDateTime updateTime; +} diff --git a/backend/src/main/java/com/soybean/admin/dto/UserDTO.java b/backend/src/main/java/com/soybean/admin/dto/UserDTO.java new file mode 100644 index 0000000..b704b72 --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/dto/UserDTO.java @@ -0,0 +1,23 @@ +package com.soybean.admin.dto; + +import lombok.Data; +import javax.validation.constraints.NotBlank; + +@Data +public class UserDTO { + private Long id; + + @NotBlank(message = "用户ID不能为空") + private String userId; + + @NotBlank(message = "用户名不能为空") + private String userName; + + private String password; + + private String roles; + + private String buttons; + + private Integer status; +} diff --git a/backend/src/main/java/com/soybean/admin/dto/UserInfo.java b/backend/src/main/java/com/soybean/admin/dto/UserInfo.java new file mode 100644 index 0000000..1765dc8 --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/dto/UserInfo.java @@ -0,0 +1,16 @@ +package com.soybean.admin.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UserInfo { + private String userId; + private String userName; + private List roles; + private List buttons; +} diff --git a/backend/src/main/java/com/soybean/admin/dto/UserRoute.java b/backend/src/main/java/com/soybean/admin/dto/UserRoute.java new file mode 100644 index 0000000..ba4ad76 --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/dto/UserRoute.java @@ -0,0 +1,14 @@ +package com.soybean.admin.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UserRoute { + private List routes; + private String home; +} diff --git a/backend/src/main/java/com/soybean/admin/entity/Role.java b/backend/src/main/java/com/soybean/admin/entity/Role.java new file mode 100644 index 0000000..c22c5c3 --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/entity/Role.java @@ -0,0 +1,24 @@ +package com.soybean.admin.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@TableName("sys_role") +public class Role { + @TableId(type = IdType.AUTO) + private Long id; + + private String roleCode; + private String roleName; + private String description; + private String menus; + private Integer status; + private Integer deleted; + private LocalDateTime createTime; + private LocalDateTime updateTime; +} diff --git a/backend/src/main/java/com/soybean/admin/entity/Route.java b/backend/src/main/java/com/soybean/admin/entity/Route.java new file mode 100644 index 0000000..f492591 --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/entity/Route.java @@ -0,0 +1,25 @@ +package com.soybean.admin.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import java.time.LocalDateTime; + +@Data +@TableName("sys_route") +public class Route { + @TableId(type = IdType.AUTO) + private Long id; + private String routeId; + private String name; + private String path; + private String component; + private String meta; + private String roles; + private Integer orderNum; + private Integer status; + private Integer deleted; + private LocalDateTime createTime; + private LocalDateTime updateTime; +} diff --git a/backend/src/main/java/com/soybean/admin/entity/User.java b/backend/src/main/java/com/soybean/admin/entity/User.java new file mode 100644 index 0000000..322eaef --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/entity/User.java @@ -0,0 +1,23 @@ +package com.soybean.admin.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import java.time.LocalDateTime; + +@Data +@TableName("sys_user") +public class User { + @TableId(type = IdType.AUTO) + private Long id; + private String userId; + private String userName; + private String password; + private String roles; + private String buttons; + private Integer status; + private Integer deleted; + private LocalDateTime createTime; + private LocalDateTime updateTime; +} diff --git a/backend/src/main/java/com/soybean/admin/exception/GlobalExceptionHandler.java b/backend/src/main/java/com/soybean/admin/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..5aec505 --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/exception/GlobalExceptionHandler.java @@ -0,0 +1,36 @@ +package com.soybean.admin.exception; + +import com.soybean.admin.common.Result; +import org.springframework.validation.BindException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(Exception.class) + public Result handleException(Exception e) { + e.printStackTrace(); + return Result.error("1111", e.getMessage()); + } + + @ExceptionHandler(RuntimeException.class) + public Result handleRuntimeException(RuntimeException e) { + return Result.error("1111", e.getMessage()); + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + public Result handleValidationException(MethodArgumentNotValidException e) { + String message = e.getBindingResult().getFieldError() != null ? + e.getBindingResult().getFieldError().getDefaultMessage() : "参数校验失败"; + return Result.error("1111", message); + } + + @ExceptionHandler(BindException.class) + public Result handleBindException(BindException e) { + String message = e.getBindingResult().getFieldError() != null ? + e.getBindingResult().getFieldError().getDefaultMessage() : "参数绑定失败"; + return Result.error("1111", message); + } +} diff --git a/backend/src/main/java/com/soybean/admin/interceptor/AuthInterceptor.java b/backend/src/main/java/com/soybean/admin/interceptor/AuthInterceptor.java new file mode 100644 index 0000000..d763f8f --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/interceptor/AuthInterceptor.java @@ -0,0 +1,35 @@ +package com.soybean.admin.interceptor; + +import com.soybean.admin.util.JwtUtil; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +@Component +public class AuthInterceptor implements HandlerInterceptor { + + @Autowired + private JwtUtil jwtUtil; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + if ("OPTIONS".equals(request.getMethod())) { + return true; + } + + String authorization = request.getHeader("Authorization"); + if (authorization != null && authorization.startsWith("Bearer ")) { + String token = authorization.substring(7); + if (jwtUtil.validateToken(token)) { + String userId = jwtUtil.getUserIdFromToken(token); + request.setAttribute("userId", userId); + return true; + } + } + + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + return false; + } +} diff --git a/backend/src/main/java/com/soybean/admin/mapper/RoleMapper.java b/backend/src/main/java/com/soybean/admin/mapper/RoleMapper.java new file mode 100644 index 0000000..d39b554 --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/mapper/RoleMapper.java @@ -0,0 +1,9 @@ +package com.soybean.admin.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.soybean.admin.entity.Role; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RoleMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/soybean/admin/mapper/RouteMapper.java b/backend/src/main/java/com/soybean/admin/mapper/RouteMapper.java new file mode 100644 index 0000000..e4d2b4a --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/mapper/RouteMapper.java @@ -0,0 +1,9 @@ +package com.soybean.admin.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.soybean.admin.entity.Route; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RouteMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/soybean/admin/mapper/UserMapper.java b/backend/src/main/java/com/soybean/admin/mapper/UserMapper.java new file mode 100644 index 0000000..bd78a4d --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/mapper/UserMapper.java @@ -0,0 +1,9 @@ +package com.soybean.admin.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.soybean.admin.entity.User; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface UserMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/soybean/admin/service/AuthService.java b/backend/src/main/java/com/soybean/admin/service/AuthService.java new file mode 100644 index 0000000..06ba604 --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/service/AuthService.java @@ -0,0 +1,84 @@ +package com.soybean.admin.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.soybean.admin.dto.LoginToken; +import com.soybean.admin.dto.UserInfo; +import com.soybean.admin.entity.User; +import com.soybean.admin.mapper.UserMapper; +import com.soybean.admin.util.JwtUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +@Service +public class AuthService { + + @Autowired + private UserMapper userMapper; + + @Autowired + private JwtUtil jwtUtil; + + public LoginToken login(String userName, String password) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(User::getUserName, userName); + User user = userMapper.selectOne(wrapper); + + if (user == null) { + throw new RuntimeException("用户不存在"); + } + + if (!user.getPassword().equals(password)) { + throw new RuntimeException("密码错误"); + } + + if (user.getStatus() != 1) { + throw new RuntimeException("用户已被禁用"); + } + + String token = jwtUtil.generateToken(user.getUserId(), user.getUserName()); + String refreshToken = jwtUtil.generateRefreshToken(user.getUserId()); + + return new LoginToken(token, refreshToken); + } + + public UserInfo getUserInfo(String userId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(User::getUserId, userId); + User user = userMapper.selectOne(wrapper); + + if (user == null) { + throw new RuntimeException("用户不存在"); + } + + List roles = user.getRoles() != null ? + Arrays.asList(user.getRoles().split(",")) : Collections.emptyList(); + List buttons = user.getButtons() != null ? + Arrays.asList(user.getButtons().split(",")) : Collections.emptyList(); + + return new UserInfo(user.getUserId(), user.getUserName(), roles, buttons); + } + + public LoginToken refreshToken(String refreshToken) { + if (!jwtUtil.validateToken(refreshToken)) { + throw new RuntimeException("刷新令牌无效或已过期"); + } + + String userId = jwtUtil.getUserIdFromToken(refreshToken); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(User::getUserId, userId); + User user = userMapper.selectOne(wrapper); + + if (user == null) { + throw new RuntimeException("用户不存在"); + } + + String newToken = jwtUtil.generateToken(user.getUserId(), user.getUserName()); + String newRefreshToken = jwtUtil.generateRefreshToken(user.getUserId()); + + return new LoginToken(newToken, newRefreshToken); + } +} diff --git a/backend/src/main/java/com/soybean/admin/service/PermissionService.java b/backend/src/main/java/com/soybean/admin/service/PermissionService.java new file mode 100644 index 0000000..25b4a42 --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/service/PermissionService.java @@ -0,0 +1,9 @@ +package com.soybean.admin.service; + +import org.springframework.stereotype.Service; + +@Service +public class PermissionService { + // 权限管理现在通过角色表的menus字段实现 + // 不需要单独的权限服务 +} diff --git a/backend/src/main/java/com/soybean/admin/service/RoleService.java b/backend/src/main/java/com/soybean/admin/service/RoleService.java new file mode 100644 index 0000000..2c46435 --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/service/RoleService.java @@ -0,0 +1,132 @@ +package com.soybean.admin.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.soybean.admin.dto.PageRequest; +import com.soybean.admin.dto.PageResponse; +import com.soybean.admin.dto.RoleDTO; +import com.soybean.admin.entity.Role; +import com.soybean.admin.mapper.RoleMapper; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class RoleService { + + @Autowired + private RoleMapper roleMapper; + + public PageResponse getRoleList(PageRequest request) { + Page page = new Page<>(request.getCurrent(), request.getSize()); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + + if (StringUtils.hasText(request.getRoleName())) { + wrapper.like(Role::getRoleName, request.getRoleName()); + } + + if (request.getStatus() != null) { + wrapper.eq(Role::getStatus, request.getStatus()); + } + + wrapper.orderByDesc(Role::getCreateTime); + + IPage rolePage = roleMapper.selectPage(page, wrapper); + + List records = rolePage.getRecords().stream().map(role -> { + RoleDTO dto = new RoleDTO(); + BeanUtils.copyProperties(role, dto); + return dto; + }).collect(Collectors.toList()); + + return new PageResponse<>(records, rolePage.getTotal(), + request.getCurrent(), request.getSize()); + } + + public List getAllRoles() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + // 不过滤状态,返回所有角色 + wrapper.orderBy(true, true, Role::getCreateTime); + + List roles = roleMapper.selectList(wrapper); + return roles.stream().map(role -> { + RoleDTO dto = new RoleDTO(); + BeanUtils.copyProperties(role, dto); + return dto; + }).collect(Collectors.toList()); + } + + public RoleDTO getRoleById(Long id) { + Role role = roleMapper.selectById(id); + if (role == null) { + throw new RuntimeException("角色不存在"); + } + + RoleDTO dto = new RoleDTO(); + BeanUtils.copyProperties(role, dto); + return dto; + } + + public void createRole(RoleDTO dto) { + // 检查角色编码是否已存在 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Role::getRoleCode, dto.getRoleCode()); + if (roleMapper.selectCount(wrapper) > 0) { + throw new RuntimeException("角色编码已存在"); + } + + Role role = new Role(); + BeanUtils.copyProperties(dto, role); + role.setCreateTime(LocalDateTime.now()); + role.setUpdateTime(LocalDateTime.now()); + role.setDeleted(0); + + if (role.getStatus() == null) { + role.setStatus(1); + } + + roleMapper.insert(role); + } + + public void updateRole(RoleDTO dto) { + Role existRole = roleMapper.selectById(dto.getId()); + if (existRole == null) { + throw new RuntimeException("角色不存在"); + } + + // 检查角色编码是否被其他角色使用 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Role::getRoleCode, dto.getRoleCode()); + wrapper.ne(Role::getId, dto.getId()); + if (roleMapper.selectCount(wrapper) > 0) { + throw new RuntimeException("角色编码已被使用"); + } + + Role role = new Role(); + BeanUtils.copyProperties(dto, role); + role.setUpdateTime(LocalDateTime.now()); + + roleMapper.updateById(role); + } + + public void deleteRole(Long id) { + Role role = roleMapper.selectById(id); + if (role == null) { + throw new RuntimeException("角色不存在"); + } + + roleMapper.deleteById(id); + } + + public void batchDelete(List ids) { + for (Long id : ids) { + deleteRole(id); + } + } +} diff --git a/backend/src/main/java/com/soybean/admin/service/RouteService.java b/backend/src/main/java/com/soybean/admin/service/RouteService.java new file mode 100644 index 0000000..002af55 --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/service/RouteService.java @@ -0,0 +1,274 @@ +package com.soybean.admin.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.soybean.admin.dto.MenuRoute; +import com.soybean.admin.dto.UserRoute; +import com.soybean.admin.entity.Role; +import com.soybean.admin.entity.Route; +import com.soybean.admin.entity.User; +import com.soybean.admin.mapper.RoleMapper; +import com.soybean.admin.mapper.RouteMapper; +import com.soybean.admin.mapper.UserMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class RouteService { + + @Autowired + private RouteMapper routeMapper; + + @Autowired + private UserMapper userMapper; + + @Autowired + private RoleMapper roleMapper; + + @Autowired + private ObjectMapper objectMapper; + + public List getConstantRoutes() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Route::getStatus, 1) + .orderByAsc(Route::getOrderNum); + + List routes = routeMapper.selectList(wrapper); + return convertToMenuRoutes(routes); + } + + public UserRoute getUserRoutes(String userId) { + // 1. 获取用户信息 + LambdaQueryWrapper userWrapper = new LambdaQueryWrapper<>(); + userWrapper.eq(User::getUserId, userId); + User user = userMapper.selectOne(userWrapper); + + if (user == null) { + throw new RuntimeException("用户不存在"); + } + + System.out.println("=== 用户路由权限调试 ==="); + System.out.println("用户ID: " + userId); + System.out.println("用户角色: " + user.getRoles()); + + // 2. 获取用户的角色列表 + Set userRoleCodes = user.getRoles() != null ? + new HashSet<>(Arrays.asList(user.getRoles().split(","))) : new HashSet<>(); + + if (userRoleCodes.isEmpty()) { + System.out.println("用户没有角色,返回空路由"); + // 如果用户没有角色,返回空路由 + return new UserRoute(new ArrayList<>(), "home"); + } + + // 3. 查询用户角色配置的菜单权限 + LambdaQueryWrapper roleWrapper = new LambdaQueryWrapper<>(); + roleWrapper.in(Role::getRoleCode, userRoleCodes) + .eq(Role::getStatus, 1); + List roles = roleMapper.selectList(roleWrapper); + + System.out.println("查询到的角色数量: " + roles.size()); + + // 4. 收集所有角色配置的菜单名称 + Set allowedMenus = new HashSet<>(); + for (Role role : roles) { + System.out.println("角色: " + role.getRoleCode() + " - " + role.getRoleName()); + System.out.println("配置的菜单: " + role.getMenus()); + + if (role.getMenus() != null && !role.getMenus().isEmpty()) { + String[] menus = role.getMenus().split(","); + for (String menu : menus) { + if (menu != null && !menu.trim().isEmpty()) { + String trimmedMenu = menu.trim(); + allowedMenus.add(trimmedMenu); + + // 如果是子菜单,自动添加父菜单 + if (trimmedMenu.contains("_")) { + String parentMenu = trimmedMenu.substring(0, trimmedMenu.lastIndexOf("_")); + allowedMenus.add(parentMenu); + System.out.println("自动添加父菜单: " + parentMenu); + } + } + } + } + } + + System.out.println("允许访问的菜单: " + allowedMenus); + + // 5. 如果角色没有配置任何菜单,返回空路由 + if (allowedMenus.isEmpty()) { + System.out.println("角色没有配置菜单,返回空路由"); + return new UserRoute(new ArrayList<>(), "home"); + } + + // 6. 获取所有启用的路由 + LambdaQueryWrapper routeWrapper = new LambdaQueryWrapper<>(); + routeWrapper.eq(Route::getStatus, 1) + .orderByAsc(Route::getOrderNum); + List allRoutes = routeMapper.selectList(routeWrapper); + + System.out.println("数据库中的路由总数: " + allRoutes.size()); + + // 7. 根据角色配置的菜单过滤路由,排除 home(home 是常量路由,由前端管理) + List filteredRoutes = allRoutes.stream() + .filter(route -> { + // 排除 home 路由,它应该由前端的 constantRoutes 管理 + if ("home".equals(route.getName())) { + System.out.println("路由: " + route.getName() + " - 跳过(常量路由)"); + return false; + } + boolean allowed = allowedMenus.contains(route.getName()); + System.out.println("路由: " + route.getName() + " - 是否允许: " + allowed); + return allowed; + }) + .collect(Collectors.toList()); + + System.out.println("过滤后的路由数量: " + filteredRoutes.size()); + + // 8. 转换为菜单路由并返回 + List menuRoutes = convertToMenuRoutes(filteredRoutes); + + System.out.println("最终返回的路由数量: " + menuRoutes.size()); + for (MenuRoute route : menuRoutes) { + System.out.println("根路由: " + route.getName() + + " - 子路由数: " + (route.getChildren() != null ? route.getChildren().size() : 0)); + if (route.getChildren() != null) { + for (MenuRoute child : route.getChildren()) { + System.out.println(" 子路由: " + child.getName()); + } + } + } + System.out.println("=== 调试结束 ==="); + + return new UserRoute(menuRoutes, "home"); + } + + public boolean isRouteExist(String routeName) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Route::getName, routeName) + .eq(Route::getStatus, 1); + return routeMapper.selectCount(wrapper) > 0; + } + + private List convertToMenuRoutes(List routes) { + System.out.println("=== 开始构建路由树 ==="); + System.out.println("输入路由数量: " + routes.size()); + + // 先转换所有路由为 MenuRoute + List allMenuRoutes = routes.stream().map(route -> { + MenuRoute menuRoute = new MenuRoute(); + menuRoute.setId(route.getRouteId()); + menuRoute.setName(route.getName()); + menuRoute.setPath(route.getPath()); + menuRoute.setComponent(route.getComponent()); + + try { + if (route.getMeta() != null && !route.getMeta().isEmpty()) { + Map meta = objectMapper.readValue( + route.getMeta(), + new TypeReference>() {} + ); + menuRoute.setMeta(meta); + } + } catch (Exception e) { + menuRoute.setMeta(new HashMap<>()); + } + + return menuRoute; + }).collect(Collectors.toList()); + + // 构建父子关系 + Map routeMap = new HashMap<>(); + Set childRouteNames = new HashSet<>(); // 记录所有子路由的名称 + + // 第一遍:将所有路由放入 map + for (MenuRoute menuRoute : allMenuRoutes) { + routeMap.put(menuRoute.getName(), menuRoute); + menuRoute.setChildren(new ArrayList<>()); + } + + // 第二遍:根据 path 识别父子关系 + for (MenuRoute menuRoute : allMenuRoutes) { + String path = menuRoute.getPath(); + String name = menuRoute.getName(); + + // 计算路径中的斜杠数量 + int slashCount = path.length() - path.replace("/", "").length(); + + // 如果路径有2个或以上斜杠(如 /device/list),说明是子路由 + if (slashCount >= 2) { + childRouteNames.add(name); + System.out.println("识别子路由: " + name + " (path: " + path + ")"); + } + } + + // 第三遍:建立父子关系 + for (MenuRoute menuRoute : allMenuRoutes) { + String path = menuRoute.getPath(); + String name = menuRoute.getName(); + int slashCount = path.length() - path.replace("/", "").length(); + + // 如果路径有2个或以上斜杠,说明是子路由 + if (slashCount >= 2) { + // 从路径中提取父路径(如 /device/list -> /device) + String parentPath = path.substring(0, path.lastIndexOf("/")); + + // 查找父路由 + MenuRoute parent = null; + for (MenuRoute route : allMenuRoutes) { + if (route.getPath().equals(parentPath)) { + parent = route; + break; + } + } + + if (parent != null) { + parent.getChildren().add(menuRoute); + System.out.println("添加子路由: " + name + " -> 父路由: " + parent.getName()); + } else { + System.out.println("警告:找不到父路由 (path: " + parentPath + ") for " + name); + } + } + } + + // 第四遍:只将非子路由添加到根路由列表 + List rootRoutes = new ArrayList<>(); + for (MenuRoute menuRoute : allMenuRoutes) { + if (!childRouteNames.contains(menuRoute.getName())) { + rootRoutes.add(menuRoute); + System.out.println("添加根路由: " + menuRoute.getName()); + } + } + + // 清理空的 children 列表 + cleanEmptyChildren(rootRoutes); + + System.out.println("=== 路由树构建完成 ==="); + System.out.println("最终返回的根路由数量: " + rootRoutes.size()); + for (MenuRoute route : rootRoutes) { + System.out.println("根路由: " + route.getName() + + " - 子路由数: " + (route.getChildren() != null ? route.getChildren().size() : 0)); + if (route.getChildren() != null) { + for (MenuRoute child : route.getChildren()) { + System.out.println(" 子路由: " + child.getName()); + } + } + } + + return rootRoutes; + } + + private void cleanEmptyChildren(List routes) { + for (MenuRoute route : routes) { + if (route.getChildren() != null && route.getChildren().isEmpty()) { + route.setChildren(null); + } else if (route.getChildren() != null) { + cleanEmptyChildren(route.getChildren()); + } + } + } +} diff --git a/backend/src/main/java/com/soybean/admin/service/UserService.java b/backend/src/main/java/com/soybean/admin/service/UserService.java new file mode 100644 index 0000000..267fa5a --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/service/UserService.java @@ -0,0 +1,140 @@ +package com.soybean.admin.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.soybean.admin.dto.PageRequest; +import com.soybean.admin.dto.PageResponse; +import com.soybean.admin.dto.UserDTO; +import com.soybean.admin.entity.User; +import com.soybean.admin.mapper.UserMapper; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class UserService { + + @Autowired + private UserMapper userMapper; + + public PageResponse getUserList(PageRequest request) { + Page page = new Page<>(request.getCurrent(), request.getSize()); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + + // 排除 admin 账号 + wrapper.ne(User::getUserName, "admin"); + + if (StringUtils.hasText(request.getUserName())) { + wrapper.like(User::getUserName, request.getUserName()); + } + + if (request.getStatus() != null) { + wrapper.eq(User::getStatus, request.getStatus()); + } + + wrapper.orderByDesc(User::getCreateTime); + + IPage userPage = userMapper.selectPage(page, wrapper); + + List records = userPage.getRecords().stream().map(user -> { + UserDTO dto = new UserDTO(); + BeanUtils.copyProperties(user, dto); + dto.setPassword(null); // 不返回密码 + return dto; + }).collect(Collectors.toList()); + + return new PageResponse<>(records, userPage.getTotal(), + request.getCurrent(), request.getSize()); + } + + public UserDTO getUserById(Long id) { + User user = userMapper.selectById(id); + if (user == null) { + throw new RuntimeException("用户不存在"); + } + + if ("admin".equals(user.getUserName())) { + throw new RuntimeException("无法操作管理员账号"); + } + + UserDTO dto = new UserDTO(); + BeanUtils.copyProperties(user, dto); + dto.setPassword(null); + return dto; + } + + public void createUser(UserDTO dto) { + // 检查用户名是否已存在 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(User::getUserName, dto.getUserName()); + if (userMapper.selectCount(wrapper) > 0) { + throw new RuntimeException("用户名已存在"); + } + + // 检查用户ID是否已存在 + wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(User::getUserId, dto.getUserId()); + if (userMapper.selectCount(wrapper) > 0) { + throw new RuntimeException("用户ID已存在"); + } + + User user = new User(); + BeanUtils.copyProperties(dto, user); + user.setCreateTime(LocalDateTime.now()); + user.setUpdateTime(LocalDateTime.now()); + user.setDeleted(0); + + if (user.getStatus() == null) { + user.setStatus(1); + } + + userMapper.insert(user); + } + + public void updateUser(UserDTO dto) { + User existUser = userMapper.selectById(dto.getId()); + if (existUser == null) { + throw new RuntimeException("用户不存在"); + } + + if ("admin".equals(existUser.getUserName())) { + throw new RuntimeException("无法修改管理员账号"); + } + + User user = new User(); + BeanUtils.copyProperties(dto, user); + user.setUpdateTime(LocalDateTime.now()); + + // 如果没有提供密码,则不更新密码 + if (!StringUtils.hasText(dto.getPassword())) { + user.setPassword(null); + } + + userMapper.updateById(user); + } + + public void deleteUser(Long id) { + User user = userMapper.selectById(id); + if (user == null) { + throw new RuntimeException("用户不存在"); + } + + if ("admin".equals(user.getUserName())) { + throw new RuntimeException("无法删除管理员账号"); + } + + userMapper.deleteById(id); + } + + public void batchDelete(List ids) { + for (Long id : ids) { + deleteUser(id); + } + } +} diff --git a/backend/src/main/java/com/soybean/admin/util/JwtUtil.java b/backend/src/main/java/com/soybean/admin/util/JwtUtil.java new file mode 100644 index 0000000..d40092d --- /dev/null +++ b/backend/src/main/java/com/soybean/admin/util/JwtUtil.java @@ -0,0 +1,88 @@ +package com.soybean.admin.util; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import io.jsonwebtoken.security.Keys; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.crypto.SecretKey; +import java.nio.charset.StandardCharsets; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +@Component +public class JwtUtil { + + @Value("${jwt.secret}") + private String secret; + + @Value("${jwt.expiration}") + private Long expiration; + + @Value("${jwt.refresh-expiration}") + private Long refreshExpiration; + + private SecretKey getSignKey() { + return Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8)); + } + + public String generateToken(String userId, String userName) { + Map claims = new HashMap<>(); + claims.put("userId", userId); + claims.put("userName", userName); + return createToken(claims, userId, expiration); + } + + public String generateRefreshToken(String userId) { + Map claims = new HashMap<>(); + claims.put("userId", userId); + return createToken(claims, userId, refreshExpiration); + } + + private String createToken(Map claims, String subject, Long expiration) { + Date now = new Date(); + Date expiryDate = new Date(now.getTime() + expiration); + + return Jwts.builder() + .setClaims(claims) + .setSubject(subject) + .setIssuedAt(now) + .setExpiration(expiryDate) + .signWith(getSignKey(), SignatureAlgorithm.HS256) + .compact(); + } + + public Claims parseToken(String token) { + return Jwts.parserBuilder() + .setSigningKey(getSignKey()) + .build() + .parseClaimsJws(token) + .getBody(); + } + + public String getUserIdFromToken(String token) { + Claims claims = parseToken(token); + return claims.get("userId", String.class); + } + + public boolean isTokenExpired(String token) { + try { + Claims claims = parseToken(token); + return claims.getExpiration().before(new Date()); + } catch (Exception e) { + return true; + } + } + + public boolean validateToken(String token) { + try { + parseToken(token); + return !isTokenExpired(token); + } catch (Exception e) { + return false; + } + } +} diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml new file mode 100644 index 0000000..e59196c --- /dev/null +++ b/backend/src/main/resources/application.yml @@ -0,0 +1,32 @@ +spring: + application: + name: soybean-admin-backend + + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/soybean_admin?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false + username: root + password: root + + jackson: + time-zone: GMT+8 + date-format: yyyy-MM-dd HH:mm:ss + +server: + port: 8080 + +mybatis-plus: + configuration: + map-underscore-to-camel-case: true + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + global-config: + db-config: + id-type: auto + logic-delete-field: deleted + logic-delete-value: 1 + logic-not-delete-value: 0 + +jwt: + secret: soybean-admin-secret-key-2024-spring-boot-jwt-token + expiration: 7200000 + refresh-expiration: 604800000 diff --git a/backend/src/main/resources/sql/add_all_routes.sql b/backend/src/main/resources/sql/add_all_routes.sql new file mode 100644 index 0000000..c7b6baa --- /dev/null +++ b/backend/src/main/resources/sql/add_all_routes.sql @@ -0,0 +1,156 @@ +-- 添加所有菜单路由 +USE soybean_admin; + +-- 清理旧数据(保留home) +DELETE FROM sys_route WHERE route_id NOT IN ('1'); + +-- 管理员菜单 +-- 1. 首页 (已存在) + +-- 2. 设备管理 +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('device', 'device', '/device', 'layout.base$view.device', + '{"title":"设备管理","i18nKey":"route.device","icon":"mdi:desktop-classic","order":2}', + 'R_SUPER,R_ADMIN', 2, 1); + +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('device_list', 'device_list', '/device/list', 'layout.base$view.device_list', + '{"title":"设备列表","i18nKey":"route.device_list","icon":"mdi:format-list-bulleted","order":1}', + 'R_SUPER,R_ADMIN', 2.1, 1); + +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('device_online', 'device_online', '/device/online', 'layout.base$view.device_online', + '{"title":"在线状态","i18nKey":"route.device_online","icon":"mdi:lan-connect","order":2}', + 'R_SUPER,R_ADMIN', 2.2, 1); + +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('device_power', 'device_power', '/device/power', 'layout.base$view.device_power', + '{"title":"电源管理","i18nKey":"route.device_power","icon":"mdi:power","order":3}', + 'R_SUPER,R_ADMIN', 2.3, 1); + +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('device_monitor', 'device_monitor', '/device/monitor', 'layout.base$view.device_monitor', + '{"title":"远程监控","i18nKey":"route.device_monitor","icon":"mdi:monitor-eye","order":4}', + 'R_SUPER,R_ADMIN', 2.4, 1); + +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('device_group', 'device_group', '/device/group', 'layout.base$view.device_group', + '{"title":"设备分组","i18nKey":"route.device_group","icon":"mdi:group","order":5}', + 'R_SUPER,R_ADMIN', 2.5, 1); + +-- 3. 屏幕监控 +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('screen', 'screen', '/screen', 'layout.base$view.screen', + '{"title":"屏幕监控","i18nKey":"route.screen","icon":"mdi:monitor-screenshot","order":3}', + 'R_SUPER,R_ADMIN', 3, 1); + +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('screen_wall', 'screen_wall', '/screen/wall', 'layout.base$view.screen_wall', + '{"title":"监控墙","i18nKey":"route.screen_wall","icon":"mdi:view-grid","order":1}', + 'R_SUPER,R_ADMIN', 3.1, 1); + +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('screen_control', 'screen_control', '/screen/control', 'layout.base$view.screen_control', + '{"title":"单屏控制","i18nKey":"route.screen_control","icon":"mdi:cursor-default-click","order":2}', + 'R_SUPER,R_ADMIN', 3.2, 1); + +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('screen_record', 'screen_record', '/screen/record', 'layout.base$view.screen_record', + '{"title":"控制记录","i18nKey":"route.screen_record","icon":"mdi:history","order":3}', + 'R_SUPER,R_ADMIN', 3.3, 1); + +-- 4. 用户管理 +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('user_manage', 'user-manage', '/user-manage', 'layout.base$view.user-manage', + '{"title":"用户管理","i18nKey":"route.user-manage","icon":"mdi:account-group","order":4}', + 'R_SUPER,R_ADMIN', 4, 1); + +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('user_list', 'user_list', '/user-manage/list', 'layout.base$view.user-manage_list', + '{"title":"用户列表","i18nKey":"route.user_list","icon":"mdi:account-multiple","order":1}', + 'R_SUPER,R_ADMIN', 4.1, 1); + +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('user_role', 'user_role', '/user-manage/role', 'layout.base$view.user-manage_role', + '{"title":"角色管理","i18nKey":"route.user_role","icon":"mdi:shield-account","order":2}', + 'R_SUPER,R_ADMIN', 4.2, 1); + +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('user_permission', 'user_permission', '/user-manage/permission', 'layout.base$view.user-manage_permission', + '{"title":"权限管理","i18nKey":"route.user_permission","icon":"mdi:key","order":3}', + 'R_SUPER', 4.3, 1); + +-- 5. 申请管理 +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('application', 'application', '/application', 'layout.base$view.application', + '{"title":"使用申请","i18nKey":"route.application","icon":"mdi:file-document-edit","order":5}', + 'R_SUPER,R_ADMIN', 5, 1); + +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('application_approval', 'application_approval', '/application/approval', 'layout.base$view.application_approval', + '{"title":"申请审批","i18nKey":"route.application_approval","icon":"mdi:clipboard-check","order":1}', + 'R_SUPER,R_ADMIN', 5.1, 1); + +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('application_history', 'application_history', '/application/history', 'layout.base$view.application_history', + '{"title":"使用记录","i18nKey":"route.application_history","icon":"mdi:history","order":2}', + 'R_SUPER,R_ADMIN', 5.2, 1); + +-- 6. 系统设置 +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('system', 'system', '/system', 'layout.base$view.system', + '{"title":"系统设置","i18nKey":"route.system","icon":"mdi:cog","order":6}', + 'R_SUPER', 6, 1); + +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('system_amt', 'system_amt', '/system/amt', 'layout.base$view.system_amt', + '{"title":"AMT设置","i18nKey":"route.system_amt","icon":"mdi:chip","order":1}', + 'R_SUPER', 6.1, 1); + +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('system_agent', 'system_agent', '/system/agent', 'layout.base$view.system_agent', + '{"title":"Agent设置","i18nKey":"route.system_agent","icon":"mdi:application-cog","order":2}', + 'R_SUPER', 6.2, 1); + +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('system_log', 'system_log', '/system/log', 'layout.base$view.system_log', + '{"title":"日志中心","i18nKey":"route.system_log","icon":"mdi:text-box-multiple","order":3}', + 'R_SUPER', 6.3, 1); + +-- 普通用户菜单 +-- 7. 我的设备 +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('my_device', 'my-device', '/my-device', 'layout.base$view.my-device', + '{"title":"我的设备","i18nKey":"route.my_device","icon":"mdi:laptop","order":7}', + 'R_USER', 7, 1); + +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('my_device_status', 'my_device_status', '/my-device/status', 'layout.base$view.my-device_status', + '{"title":"设备状态","i18nKey":"route.my_device_status","icon":"mdi:information","order":1}', + 'R_USER', 7.1, 1); + +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('my_device_power', 'my_device_power', '/my-device/power-control', 'layout.base$view.my-device_power-control', + '{"title":"电源控制","i18nKey":"route.my_device_power","icon":"mdi:power-settings","order":2}', + 'R_USER', 7.2, 1); + +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('my_device_remote', 'my_device_remote', '/my-device/remote-control', 'layout.base$view.my-device_remote-control', + '{"title":"远程控制","i18nKey":"route.my_device_remote","icon":"mdi:remote-desktop","order":3}', + 'R_USER', 7.3, 1); + +-- 8. 设备申请 +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('my_application', 'my-application', '/my-application', 'layout.base$view.my-application', + '{"title":"设备申请","i18nKey":"route.my_application","icon":"mdi:file-document","order":8}', + 'R_USER', 8, 1); + +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('my_application_apply', 'my_application_apply', '/my-application/apply', 'layout.base$view.my-application_apply', + '{"title":"申请使用","i18nKey":"route.my_application_apply","icon":"mdi:file-plus","order":1}', + 'R_USER', 8.1, 1); + +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('my_application_list', 'my_application_list', '/my-application/my-list', 'layout.base$view.my-application_my-list', + '{"title":"我的申请","i18nKey":"route.my_application_list","icon":"mdi:format-list-checks","order":2}', + 'R_USER', 8.2, 1); diff --git a/backend/src/main/resources/sql/add_role_table.sql b/backend/src/main/resources/sql/add_role_table.sql new file mode 100644 index 0000000..9cf33fc --- /dev/null +++ b/backend/src/main/resources/sql/add_role_table.sql @@ -0,0 +1,22 @@ +USE soybean_admin; + +-- 角色表 +CREATE TABLE IF NOT EXISTS sys_role ( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + role_code VARCHAR(50) NOT NULL UNIQUE COMMENT '角色编码', + role_name VARCHAR(50) NOT NULL COMMENT '角色名称', + description VARCHAR(200) COMMENT '角色描述', + menus TEXT COMMENT '可访问菜单列表,逗号分隔', + status INT DEFAULT 1 COMMENT '状态:1-启用,2-禁用', + deleted INT DEFAULT 0 COMMENT '删除标记:0-未删除,1-已删除', + create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + INDEX idx_role_code (role_code), + INDEX idx_status (status) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表'; + +-- 插入默认角色 +INSERT INTO sys_role (role_code, role_name, description, menus, status) VALUES +('R_SUPER', '超级管理员', '拥有系统所有权限', NULL, 1), +('R_ADMIN', '管理员', '拥有管理权限', NULL, 1), +('R_USER', '普通用户', '普通用户权限', NULL, 1); diff --git a/backend/src/main/resources/sql/add_user_route.sql b/backend/src/main/resources/sql/add_user_route.sql new file mode 100644 index 0000000..d6f6fc5 --- /dev/null +++ b/backend/src/main/resources/sql/add_user_route.sql @@ -0,0 +1,11 @@ +-- 添加用户管理路由 +USE soybean_admin; + +-- 先删除可能存在的旧记录 +DELETE FROM sys_route WHERE route_id = 'user_manage'; + +-- 插入用户管理路由,order_num 设置为 1.5,这样会排在 home(order=1) 后面 +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('user_manage', 'user-manage', '/user-manage', 'layout.base$view.user-manage', + '{"title":"用户管理","i18nKey":"route.user-manage","icon":"mdi:account-group","order":1.5}', + 'R_SUPER,R_ADMIN', 1.5, 1); diff --git a/backend/src/main/resources/sql/fix_component_names.sql b/backend/src/main/resources/sql/fix_component_names.sql new file mode 100644 index 0000000..63de49d --- /dev/null +++ b/backend/src/main/resources/sql/fix_component_names.sql @@ -0,0 +1,22 @@ +-- 修复 component 字段,确保组件路径与实际文件夹结构一致(使用连字符) +-- 注意:路由名称(name)使用下划线,但组件路径(component)必须使用连字符匹配实际文件夹 + +-- 修复 user-manage 相关组件(文件夹是 user-manage) +UPDATE sys_route SET component = 'layout.base$view.user-manage' WHERE name = 'user_manage'; +UPDATE sys_route SET component = 'layout.base$view.user-manage_list' WHERE name = 'user_manage_list'; +UPDATE sys_route SET component = 'layout.base$view.user-manage_role' WHERE name = 'user_manage_role'; +UPDATE sys_route SET component = 'layout.base$view.user-manage_permission' WHERE name = 'user_manage_permission'; + +-- 修复 my-device 相关组件(文件夹是 my-device) +UPDATE sys_route SET component = 'layout.base$view.my-device' WHERE name = 'my_device'; +UPDATE sys_route SET component = 'layout.base$view.my-device_status' WHERE name = 'my_device_status'; +UPDATE sys_route SET component = 'layout.base$view.my-device_power-control' WHERE name = 'my_device_power'; +UPDATE sys_route SET component = 'layout.base$view.my-device_remote-control' WHERE name = 'my_device_remote'; + +-- 修复 my-application 相关组件(文件夹是 my-application) +UPDATE sys_route SET component = 'layout.base$view.my-application' WHERE name = 'my_application'; +UPDATE sys_route SET component = 'layout.base$view.my-application_apply' WHERE name = 'my_application_apply'; +UPDATE sys_route SET component = 'layout.base$view.my-application_my-list' WHERE name = 'my_application_list'; + +-- 查看修复结果 +SELECT name, path, component FROM sys_route WHERE name LIKE '%user%' OR name LIKE '%my_%' ORDER BY name; diff --git a/backend/src/main/resources/sql/fix_route_names.sql b/backend/src/main/resources/sql/fix_route_names.sql new file mode 100644 index 0000000..bed9281 --- /dev/null +++ b/backend/src/main/resources/sql/fix_route_names.sql @@ -0,0 +1,19 @@ +-- 修复路由名称,统一使用下划线而不是连字符 +-- 这样父子路由才能正确匹配 + +-- 修复 user-manage 相关路由 +UPDATE sys_route SET name = 'user_manage' WHERE name = 'user-manage'; +UPDATE sys_route SET name = 'user_manage_list' WHERE name = 'user_list'; +UPDATE sys_route SET name = 'user_manage_role' WHERE name = 'user_role'; +UPDATE sys_route SET name = 'user_manage_permission' WHERE name = 'user_permission'; + +-- 修复 my-device 相关路由 +UPDATE sys_route SET name = 'my_device' WHERE name = 'my-device'; +-- my_device 的子路由已经是正确的格式了 + +-- 修复 my-application 相关路由 +UPDATE sys_route SET name = 'my_application' WHERE name = 'my-application'; +-- my_application 的子路由已经是正确的格式了 + +-- 查看修复结果 +SELECT id, name, path FROM sys_route WHERE name LIKE '%user%' OR name LIKE '%my_%' ORDER BY name; diff --git a/backend/src/main/resources/sql/init.sql b/backend/src/main/resources/sql/init.sql new file mode 100644 index 0000000..810bc42 --- /dev/null +++ b/backend/src/main/resources/sql/init.sql @@ -0,0 +1,64 @@ +-- 创建数据库 +CREATE DATABASE IF NOT EXISTS soybean_admin DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +USE soybean_admin; + +-- 用户表 +CREATE TABLE IF NOT EXISTS sys_user ( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + user_id VARCHAR(50) NOT NULL UNIQUE COMMENT '用户ID', + user_name VARCHAR(50) NOT NULL COMMENT '用户名', + password VARCHAR(100) NOT NULL COMMENT '密码', + roles VARCHAR(200) COMMENT '角色列表,逗号分隔', + buttons VARCHAR(500) COMMENT '按钮权限列表,逗号分隔', + status INT DEFAULT 1 COMMENT '状态:1-启用,2-禁用', + deleted INT DEFAULT 0 COMMENT '删除标记:0-未删除,1-已删除', + create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + INDEX idx_user_name (user_name), + INDEX idx_user_id (user_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; + +-- 路由表 +CREATE TABLE IF NOT EXISTS sys_route ( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + route_id VARCHAR(50) NOT NULL UNIQUE COMMENT '路由ID', + name VARCHAR(50) NOT NULL COMMENT '路由名称', + path VARCHAR(200) NOT NULL COMMENT '路由路径', + component VARCHAR(200) COMMENT '组件路径', + meta TEXT COMMENT '路由元信息JSON', + roles VARCHAR(200) COMMENT '可访问角色,逗号分隔', + order_num INT DEFAULT 0 COMMENT '排序号', + status INT DEFAULT 1 COMMENT '状态:1-启用,2-禁用', + deleted INT DEFAULT 0 COMMENT '删除标记:0-未删除,1-已删除', + create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + INDEX idx_name (name), + INDEX idx_status (status) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='路由表'; + +-- 插入默认管理员用户 (密码: admin123) +INSERT INTO sys_user (user_id, user_name, password, roles, buttons, status) +VALUES ('1', 'admin', 'admin123', 'R_SUPER,R_ADMIN', 'B_ADD,B_EDIT,B_DELETE', 1); + +-- 插入普通用户 (密码: user123) +INSERT INTO sys_user (user_id, user_name, password, roles, buttons, status) +VALUES ('2', 'user', 'user123', 'R_USER', 'B_VIEW', 1); + +-- 插入默认路由 +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('1', 'home', '/home', 'layout.base$view.home', + '{"title":"首页","i18nKey":"route.home","icon":"mdi:monitor-dashboard","order":1}', + NULL, 1, 1); + +-- 插入示例路由(用户管理) +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('2', 'user', '/user', 'layout.base$view.user', + '{"title":"用户管理","i18nKey":"route.user","icon":"mdi:account-group","order":2}', + 'R_SUPER,R_ADMIN', 2, 1); + +-- 插入示例路由(系统设置) +INSERT INTO sys_route (route_id, name, path, component, meta, roles, order_num, status) VALUES +('3', 'system', '/system', 'layout.base$view.system', + '{"title":"系统设置","i18nKey":"route.system","icon":"mdi:cog","order":3}', + 'R_SUPER', 3, 1); diff --git a/backend/src/main/resources/sql/init_role_menus.sql b/backend/src/main/resources/sql/init_role_menus.sql new file mode 100644 index 0000000..cc45792 --- /dev/null +++ b/backend/src/main/resources/sql/init_role_menus.sql @@ -0,0 +1,20 @@ +-- 初始化角色的菜单权限 +-- 这个脚本会为现有的角色配置默认的菜单权限 + +-- 为超级管理员配置所有菜单 +UPDATE sys_role +SET menus = 'home,user-manage,user-manage_list,user-manage_role,user-manage_permission,device,device_list,device_group,device_monitor,device_online,device_power,screen,screen_wall,screen_control,screen_record,application,application_approval,application_history,my-application,my-application_apply,my-application_my-list,my-device,my-device_status,my-device_remote-control,my-device_power-control,system,system_agent,system_amt,system_log' +WHERE role_code = 'R_SUPER'; + +-- 为管理员配置大部分菜单(除了系统设置) +UPDATE sys_role +SET menus = 'home,user-manage,user-manage_list,user-manage_role,user-manage_permission,device,device_list,device_group,device_monitor,device_online,device_power,screen,screen_wall,screen_control,screen_record,application,application_approval,application_history' +WHERE role_code = 'R_ADMIN'; + +-- 为普通用户配置基本菜单 +UPDATE sys_role +SET menus = 'home,my-application,my-application_apply,my-application_my-list,my-device,my-device_status,my-device_remote-control,my-device_power-control' +WHERE role_code = 'R_USER'; + +-- 查看更新结果 +SELECT role_code, role_name, menus FROM sys_role; diff --git a/backend/start.bat b/backend/start.bat new file mode 100644 index 0000000..14ec3df --- /dev/null +++ b/backend/start.bat @@ -0,0 +1,14 @@ +@echo off +echo ======================================== +echo Soybean Admin Backend Starting... +echo ======================================== +echo. + +echo Checking Java version... +java -version +echo. + +echo Starting Spring Boot application... +mvn spring-boot:run + +pause diff --git a/build/config/index.ts b/build/config/index.ts new file mode 100644 index 0000000..8a9621a --- /dev/null +++ b/build/config/index.ts @@ -0,0 +1,2 @@ +export * from './proxy'; +export * from './time'; diff --git a/build/config/proxy.ts b/build/config/proxy.ts new file mode 100644 index 0000000..5b34a57 --- /dev/null +++ b/build/config/proxy.ts @@ -0,0 +1,55 @@ +import type { ProxyOptions } from 'vite'; +import { bgRed, bgYellow, green, lightBlue } from 'kolorist'; +import { consola } from 'consola'; +import { createServiceConfig } from '../../src/utils/service'; + +/** + * Set http proxy + * + * @param env - The current env + * @param enable - If enable http proxy + */ +export function createViteProxy(env: Env.ImportMeta, enable: boolean) { + const isEnableHttpProxy = enable && env.VITE_HTTP_PROXY === 'Y'; + + if (!isEnableHttpProxy) return undefined; + + const isEnableProxyLog = env.VITE_PROXY_LOG === 'Y'; + + const { baseURL, proxyPattern, other } = createServiceConfig(env); + + const proxy: Record = createProxyItem({ baseURL, proxyPattern }, isEnableProxyLog); + + other.forEach(item => { + Object.assign(proxy, createProxyItem(item, isEnableProxyLog)); + }); + + return proxy; +} + +function createProxyItem(item: App.Service.ServiceConfigItem, enableLog: boolean) { + const proxy: Record = {}; + + proxy[item.proxyPattern] = { + target: item.baseURL, + changeOrigin: true, + configure: (_proxy, options) => { + _proxy.on('proxyReq', (_proxyReq, req, _res) => { + if (!enableLog) return; + + const requestUrl = `${lightBlue('[proxy url]')}: ${bgYellow(` ${req.method} `)} ${green(`${item.proxyPattern}${req.url}`)}`; + + const proxyUrl = `${lightBlue('[real request url]')}: ${green(`${options.target}${req.url}`)}`; + + consola.log(`${requestUrl}\n${proxyUrl}`); + }); + _proxy.on('error', (_err, req, _res) => { + if (!enableLog) return; + consola.log(bgRed(`Error: ${req.method} `), green(`${options.target}${req.url}`)); + }); + }, + rewrite: path => path.replace(new RegExp(`^${item.proxyPattern}`), '') + }; + + return proxy; +} diff --git a/build/config/time.ts b/build/config/time.ts new file mode 100644 index 0000000..3b57146 --- /dev/null +++ b/build/config/time.ts @@ -0,0 +1,12 @@ +import dayjs from 'dayjs'; +import utc from 'dayjs/plugin/utc'; +import timezone from 'dayjs/plugin/timezone'; + +export function getBuildTime() { + dayjs.extend(utc); + dayjs.extend(timezone); + + const buildTime = dayjs.tz(Date.now(), 'Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss'); + + return buildTime; +} diff --git a/build/plugins/devtools.ts b/build/plugins/devtools.ts new file mode 100644 index 0000000..34c08d1 --- /dev/null +++ b/build/plugins/devtools.ts @@ -0,0 +1,9 @@ +import VueDevtools from 'vite-plugin-vue-devtools'; + +export function setupDevtoolsPlugin(viteEnv: Env.ImportMeta) { + const { VITE_DEVTOOLS_LAUNCH_EDITOR } = viteEnv; + + return VueDevtools({ + launchEditor: VITE_DEVTOOLS_LAUNCH_EDITOR + }); +} diff --git a/build/plugins/html.ts b/build/plugins/html.ts new file mode 100644 index 0000000..b94d24f --- /dev/null +++ b/build/plugins/html.ts @@ -0,0 +1,13 @@ +import type { Plugin } from 'vite'; + +export function setupHtmlPlugin(buildTime: string) { + const plugin: Plugin = { + name: 'html-plugin', + apply: 'build', + transformIndexHtml(html) { + return html.replace('', `\n `); + } + }; + + return plugin; +} diff --git a/build/plugins/index.ts b/build/plugins/index.ts new file mode 100644 index 0000000..1243fc2 --- /dev/null +++ b/build/plugins/index.ts @@ -0,0 +1,24 @@ +import type { PluginOption } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import progress from 'vite-plugin-progress'; +import { setupElegantRouter } from './router'; +import { setupUnocss } from './unocss'; +import { setupUnplugin } from './unplugin'; +import { setupHtmlPlugin } from './html'; +import { setupDevtoolsPlugin } from './devtools'; + +export function setupVitePlugins(viteEnv: Env.ImportMeta, buildTime: string) { + const plugins: PluginOption = [ + vue(), + vueJsx(), + setupDevtoolsPlugin(viteEnv), + setupElegantRouter(), + setupUnocss(viteEnv), + ...setupUnplugin(viteEnv), + progress(), + setupHtmlPlugin(buildTime) + ]; + + return plugins; +} diff --git a/build/plugins/router.ts b/build/plugins/router.ts new file mode 100644 index 0000000..3d6917e --- /dev/null +++ b/build/plugins/router.ts @@ -0,0 +1,41 @@ +import type { RouteMeta } from 'vue-router'; +import ElegantVueRouter from '@elegant-router/vue/vite'; +import type { RouteKey } from '@elegant-router/types'; + +export function setupElegantRouter() { + return ElegantVueRouter({ + layouts: { + base: 'src/layouts/base-layout/index.vue', + blank: 'src/layouts/blank-layout/index.vue' + }, + routePathTransformer(routeName, routePath) { + const key = routeName as RouteKey; + + if (key === 'login') { + const modules: UnionKey.LoginModule[] = ['pwd-login', 'code-login', 'register', 'reset-pwd', 'bind-wechat']; + + const moduleReg = modules.join('|'); + + return `/login/:module(${moduleReg})?`; + } + + return routePath; + }, + onRouteMetaGen(routeName) { + const key = routeName as RouteKey; + + const constantRoutes: RouteKey[] = ['login', '403', '404', '500']; + + const meta: Partial = { + title: key, + i18nKey: `route.${key}` as App.I18n.I18nKey + }; + + if (constantRoutes.includes(key)) { + meta.constant = true; + } + + return meta; + } + }); +} diff --git a/build/plugins/unocss.ts b/build/plugins/unocss.ts new file mode 100644 index 0000000..06b41d3 --- /dev/null +++ b/build/plugins/unocss.ts @@ -0,0 +1,32 @@ +import process from 'node:process'; +import path from 'node:path'; +import unocss from '@unocss/vite'; +import presetIcons from '@unocss/preset-icons'; +import { FileSystemIconLoader } from '@iconify/utils/lib/loader/node-loaders'; + +export function setupUnocss(viteEnv: Env.ImportMeta) { + const { VITE_ICON_PREFIX, VITE_ICON_LOCAL_PREFIX } = viteEnv; + + const localIconPath = path.join(process.cwd(), 'src/assets/svg-icon'); + + /** The name of the local icon collection */ + const collectionName = VITE_ICON_LOCAL_PREFIX.replace(`${VITE_ICON_PREFIX}-`, ''); + + return unocss({ + presets: [ + presetIcons({ + prefix: `${VITE_ICON_PREFIX}-`, + scale: 1, + extraProperties: { + display: 'inline-block' + }, + collections: { + [collectionName]: FileSystemIconLoader(localIconPath, svg => + svg.replace(/^ + svg.replace(/^ 1; + +-- 检查 user-manage 和 my-device 相关路由 +SELECT + name AS '路由名称', + component AS '组件路径' +FROM sys_route +WHERE (name LIKE '%user%' OR name LIKE '%my_%') + AND status = 1 +ORDER BY name; diff --git a/check_role_menus.sql b/check_role_menus.sql new file mode 100644 index 0000000..f3742a9 --- /dev/null +++ b/check_role_menus.sql @@ -0,0 +1,14 @@ +-- 检查角色配置的菜单 +USE soybean_admin; + +SELECT role_code, role_name, menus +FROM sys_role +WHERE role_code IN ('R_SUPER', 'R_ADMIN') + AND status = 1; + +-- 检查数据库中实际的路由名称 +SELECT name, path +FROM sys_route +WHERE name LIKE '%user%' + AND status = 1 +ORDER BY name; diff --git a/check_user_manage_routes.sql b/check_user_manage_routes.sql new file mode 100644 index 0000000..5993b83 --- /dev/null +++ b/check_user_manage_routes.sql @@ -0,0 +1,8 @@ +-- 检查用户管理相关路由 +USE soybean_admin; + +SELECT '=== 用户管理相关路由 ===' AS info; +SELECT route_id, name, path, component +FROM sys_route +WHERE route_id IN ('user_manage', 'user_list', 'user_role', 'user_permission') +ORDER BY order_num; diff --git a/debug_user_manage.sql b/debug_user_manage.sql new file mode 100644 index 0000000..2e06d3b --- /dev/null +++ b/debug_user_manage.sql @@ -0,0 +1,28 @@ +-- 调试用户管理路由配置 +USE soybean_admin; + +SELECT '=== 用户管理所有路由 ===' AS info; +SELECT route_id, name, path, component, order_num, status +FROM sys_route +WHERE name LIKE '%user%' OR name LIKE '%manage%' +ORDER BY order_num; + +SELECT '' AS ''; +SELECT '=== R_SUPER 角色的菜单配置 ===' AS info; +SELECT role_code, menus +FROM sys_role +WHERE role_code = 'R_SUPER'; + +SELECT '' AS ''; +SELECT '=== 检查子路由是否在角色配置中 ===' AS info; +SELECT + r.name AS route_name, + CASE + WHEN role.menus LIKE CONCAT('%', r.name, '%') THEN 'YES' + ELSE 'NO' + END AS in_role_config +FROM sys_route r +CROSS JOIN sys_role role +WHERE role.role_code = 'R_SUPER' + AND r.name LIKE '%user%' +ORDER BY r.order_num; diff --git a/diagnose_user_manage.sql b/diagnose_user_manage.sql new file mode 100644 index 0000000..a0a20f0 --- /dev/null +++ b/diagnose_user_manage.sql @@ -0,0 +1,36 @@ +-- 诊断用户管理菜单问题 +USE soybean_admin; + +SELECT '========================================' AS ''; +SELECT '检查用户管理相关路由' AS ''; +SELECT '========================================' AS ''; +SELECT route_id, name, path, component, status, order_num +FROM sys_route +WHERE route_id LIKE 'user%' OR name LIKE 'user%' +ORDER BY order_num; + +SELECT '' AS ''; +SELECT '========================================' AS ''; +SELECT '检查 R_SUPER 角色的菜单配置' AS ''; +SELECT '========================================' AS ''; +SELECT role_code, role_name, menus +FROM sys_role +WHERE role_code = 'R_SUPER'; + +SELECT '' AS ''; +SELECT '========================================' AS ''; +SELECT '检查子路由是否在角色配置中' AS ''; +SELECT '========================================' AS ''; +SELECT + r.route_id, + r.name AS route_name, + r.path, + CASE + WHEN role.menus LIKE CONCAT('%', r.name, '%') THEN '✓ 在配置中' + ELSE '✗ 不在配置中 - 会被过滤!' + END AS in_role_config +FROM sys_route r +CROSS JOIN sys_role role +WHERE role.role_code = 'R_SUPER' + AND (r.route_id LIKE 'user%' OR r.name LIKE 'user%') +ORDER BY r.order_num; diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..00537e3 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,24 @@ +import { defineConfig } from '@soybeanjs/eslint-config'; + +export default defineConfig( + { vue: true, unocss: true }, + { + rules: { + 'vue/multi-word-component-names': [ + 'warn', + { + ignores: ['index', 'App', 'Register', '[id]', '[url]'] + } + ], + 'vue/component-name-in-template-casing': [ + 'warn', + 'PascalCase', + { + registeredComponentsOnly: false, + ignores: ['/^icon-/'] + } + ], + 'unocss/order-attributify': 'off' + } + } +); diff --git a/fix_all_routes_final.bat b/fix_all_routes_final.bat new file mode 100644 index 0000000..c6c9334 --- /dev/null +++ b/fix_all_routes_final.bat @@ -0,0 +1,24 @@ +@echo off +echo ======================================== +echo 最终完整修复所有路由配置 +echo ======================================== +echo. +echo 此脚本将修复: +echo 1. 路由名称(与前端 routeMap 保持一致) +echo 2. 组件路径(父路由用 layout.base,子路由用 view.xxx) +echo 3. 角色菜单配置(使用正确的路由名称) +echo. + +mysql -u root -proot < fix_all_routes_final.sql + +echo. +echo ======================================== +echo 修复完成! +echo ======================================== +echo. +echo 下一步操作: +echo 1. 重启后端服务(运行 backend\start.bat) +echo 2. 清除浏览器缓存(Ctrl+Shift+Delete) +echo 3. 刷新浏览器页面(Ctrl+F5) +echo. +pause diff --git a/fix_all_routes_final.sql b/fix_all_routes_final.sql new file mode 100644 index 0000000..9390ed2 --- /dev/null +++ b/fix_all_routes_final.sql @@ -0,0 +1,127 @@ +-- 最终完整修复所有路由配置 +-- 此脚本将路由名称与前端 routeMap 保持一致 +USE soybean_admin; + +-- ============================================ +-- 第一部分:修复所有路由的 name 字段 +-- 规则:与前端 src/router/elegant/transform.ts 中的 routeMap 保持一致 +-- ============================================ + +-- 设备管理 +UPDATE sys_route SET name = 'device' WHERE route_id = 'device'; +UPDATE sys_route SET name = 'device_list' WHERE route_id = 'device_list'; +UPDATE sys_route SET name = 'device_online' WHERE route_id = 'device_online'; +UPDATE sys_route SET name = 'device_power' WHERE route_id = 'device_power'; +UPDATE sys_route SET name = 'device_monitor' WHERE route_id = 'device_monitor'; +UPDATE sys_route SET name = 'device_group' WHERE route_id = 'device_group'; + +-- 屏幕监控 +UPDATE sys_route SET name = 'screen' WHERE route_id = 'screen'; +UPDATE sys_route SET name = 'screen_wall' WHERE route_id = 'screen_wall'; +UPDATE sys_route SET name = 'screen_control' WHERE route_id = 'screen_control'; +UPDATE sys_route SET name = 'screen_record' WHERE route_id = 'screen_record'; + +-- 用户管理(父路由用连字符,子路由用连字符+下划线) +UPDATE sys_route SET name = 'user-manage' WHERE route_id = 'user_manage'; +UPDATE sys_route SET name = 'user-manage_list' WHERE route_id = 'user_list'; +UPDATE sys_route SET name = 'user-manage_role' WHERE route_id = 'user_role'; +UPDATE sys_route SET name = 'user-manage_permission' WHERE route_id = 'user_permission'; + +-- 申请管理 +UPDATE sys_route SET name = 'application' WHERE route_id = 'application'; +UPDATE sys_route SET name = 'application_approval' WHERE route_id = 'application_approval'; +UPDATE sys_route SET name = 'application_history' WHERE route_id = 'application_history'; + +-- 系统设置 +UPDATE sys_route SET name = 'system' WHERE route_id = 'system'; +UPDATE sys_route SET name = 'system_amt' WHERE route_id = 'system_amt'; +UPDATE sys_route SET name = 'system_agent' WHERE route_id = 'system_agent'; +UPDATE sys_route SET name = 'system_log' WHERE route_id = 'system_log'; + +-- 我的设备(父路由用连字符,子路由用连字符+下划线) +UPDATE sys_route SET name = 'my-device' WHERE route_id = 'my_device'; +UPDATE sys_route SET name = 'my-device_status' WHERE route_id = 'my_device_status'; +UPDATE sys_route SET name = 'my-device_power-control' WHERE route_id = 'my_device_power'; +UPDATE sys_route SET name = 'my-device_remote-control' WHERE route_id = 'my_device_remote'; + +-- 设备申请(父路由用连字符,子路由用连字符+下划线) +UPDATE sys_route SET name = 'my-application' WHERE route_id = 'my_application'; +UPDATE sys_route SET name = 'my-application_apply' WHERE route_id = 'my_application_apply'; +UPDATE sys_route SET name = 'my-application_my-list' WHERE route_id = 'my_application_list'; + +-- ============================================ +-- 第二部分:修复组件路径 +-- 规则:父路由只用 layout.base,子路由用 view.{folder}_{subfolder} +-- ============================================ + +-- 设备管理 +UPDATE sys_route SET component = 'layout.base' WHERE route_id = 'device'; +UPDATE sys_route SET component = 'view.device_list' WHERE route_id = 'device_list'; +UPDATE sys_route SET component = 'view.device_online' WHERE route_id = 'device_online'; +UPDATE sys_route SET component = 'view.device_power' WHERE route_id = 'device_power'; +UPDATE sys_route SET component = 'view.device_monitor' WHERE route_id = 'device_monitor'; +UPDATE sys_route SET component = 'view.device_group' WHERE route_id = 'device_group'; + +-- 屏幕监控 +UPDATE sys_route SET component = 'layout.base' WHERE route_id = 'screen'; +UPDATE sys_route SET component = 'view.screen_wall' WHERE route_id = 'screen_wall'; +UPDATE sys_route SET component = 'view.screen_control' WHERE route_id = 'screen_control'; +UPDATE sys_route SET component = 'view.screen_record' WHERE route_id = 'screen_record'; + +-- 用户管理 +UPDATE sys_route SET component = 'layout.base' WHERE route_id = 'user_manage'; +UPDATE sys_route SET component = 'view.user-manage_list' WHERE route_id = 'user_list'; +UPDATE sys_route SET component = 'view.user-manage_role' WHERE route_id = 'user_role'; +UPDATE sys_route SET component = 'view.user-manage_permission' WHERE route_id = 'user_permission'; + +-- 申请管理 +UPDATE sys_route SET component = 'layout.base' WHERE route_id = 'application'; +UPDATE sys_route SET component = 'view.application_approval' WHERE route_id = 'application_approval'; +UPDATE sys_route SET component = 'view.application_history' WHERE route_id = 'application_history'; + +-- 系统设置 +UPDATE sys_route SET component = 'layout.base' WHERE route_id = 'system'; +UPDATE sys_route SET component = 'view.system_amt' WHERE route_id = 'system_amt'; +UPDATE sys_route SET component = 'view.system_agent' WHERE route_id = 'system_agent'; +UPDATE sys_route SET component = 'view.system_log' WHERE route_id = 'system_log'; + +-- 我的设备 +UPDATE sys_route SET component = 'layout.base' WHERE route_id = 'my_device'; +UPDATE sys_route SET component = 'view.my-device_status' WHERE route_id = 'my_device_status'; +UPDATE sys_route SET component = 'view.my-device_power-control' WHERE route_id = 'my_device_power'; +UPDATE sys_route SET component = 'view.my-device_remote-control' WHERE route_id = 'my_device_remote'; + +-- 设备申请 +UPDATE sys_route SET component = 'layout.base' WHERE route_id = 'my_application'; +UPDATE sys_route SET component = 'view.my-application_apply' WHERE route_id = 'my_application_apply'; +UPDATE sys_route SET component = 'view.my-application_my-list' WHERE route_id = 'my_application_list'; + +-- ============================================ +-- 第三部分:更新角色的菜单配置 +-- 规则:使用与路由 name 字段完全一致的名称 +-- ============================================ + +UPDATE sys_role +SET menus = 'device,device_list,device_group,device_monitor,device_online,device_power,screen,screen_wall,screen_control,screen_record,user-manage,user-manage_list,user-manage_role,user-manage_permission,application,application_approval,application_history,system,system_agent,system_amt,system_log,my-device,my-device_status,my-device_remote-control,my-device_power-control,my-application,my-application_apply,my-application_my-list' +WHERE role_code = 'R_SUPER'; + +UPDATE sys_role +SET menus = 'device,device_list,device_group,device_monitor,device_online,device_power,screen,screen_wall,screen_control,screen_record,user-manage,user-manage_list,user-manage_role,application,application_approval,application_history' +WHERE role_code = 'R_ADMIN'; + +UPDATE sys_role +SET menus = 'my-device,my-device_status,my-device_remote-control,my-device_power-control,my-application,my-application_apply,my-application_my-list' +WHERE role_code = 'R_USER'; + +-- ============================================ +-- 第四部分:验证修改结果 +-- ============================================ + +SELECT '=== 所有路由名称和组件路径 ===' AS info; +SELECT route_id, name, path, component, order_num +FROM sys_route +WHERE status = 1 +ORDER BY order_num; + +SELECT '=== 角色菜单配置 ===' AS info; +SELECT role_code, role_name, menus FROM sys_role; diff --git a/fix_database.bat b/fix_database.bat new file mode 100644 index 0000000..4f79de0 --- /dev/null +++ b/fix_database.bat @@ -0,0 +1,40 @@ +@echo off +echo ======================================== +echo 修复数据库组件路径 +echo ======================================== +echo. +echo 此脚本将执行 SQL 修复,解决菜单显示问题 +echo. +echo 请确保: +echo 1. MySQL 服务正在运行 +echo 2. 数据库连接信息正确(localhost:3306, root/root) +echo. +pause + +mysql -h localhost -P 3306 -u root -proot soybean_admin < EXECUTE_THIS_FIX.sql + +if %errorlevel% equ 0 ( + echo. + echo ======================================== + echo 修复成功! + echo ======================================== + echo. + echo 接下来请: + echo 1. 重启后端服务(backend/start.bat) + echo 2. 刷新浏览器(Ctrl+Shift+R 强制刷新) + echo 3. 重新登录测试 + echo. +) else ( + echo. + echo ======================================== + echo 修复失败! + echo ======================================== + echo. + echo 请检查: + echo 1. MySQL 是否正在运行 + echo 2. 数据库连接信息是否正确 + echo 3. 是否有足够的权限 + echo. +) + +pause diff --git a/fix_parent_routes_component.bat b/fix_parent_routes_component.bat new file mode 100644 index 0000000..ffb5f99 --- /dev/null +++ b/fix_parent_routes_component.bat @@ -0,0 +1,18 @@ +@echo off +echo ======================================== +echo 修复父路由组件路径 +echo ======================================== +echo. +echo 将所有父路由的 component 改为 layout.base +echo. + +mysql -u root -proot < fix_parent_routes_component.sql + +echo. +echo ======================================== +echo 修复完成! +echo ======================================== +echo. +echo 下一步:重启后端服务并刷新浏览器 +echo. +pause diff --git a/fix_parent_routes_component.sql b/fix_parent_routes_component.sql new file mode 100644 index 0000000..3c47a82 --- /dev/null +++ b/fix_parent_routes_component.sql @@ -0,0 +1,18 @@ +-- 修复父路由的组件路径 +-- 父路由(有子菜单的)应该只用 layout.base,不需要指定具体视图 +USE soybean_admin; + +-- 修复所有父路由的 component 字段 +UPDATE sys_route SET component = 'layout.base' WHERE route_id = 'device'; +UPDATE sys_route SET component = 'layout.base' WHERE route_id = 'screen'; +UPDATE sys_route SET component = 'layout.base' WHERE route_id = 'user_manage'; +UPDATE sys_route SET component = 'layout.base' WHERE route_id = 'application'; +UPDATE sys_route SET component = 'layout.base' WHERE route_id = 'system'; +UPDATE sys_route SET component = 'layout.base' WHERE route_id = 'my_device'; +UPDATE sys_route SET component = 'layout.base' WHERE route_id = 'my_application'; + +-- 验证修改结果 +SELECT '=== 父路由组件路径(应该都是 layout.base)===' AS info; +SELECT route_id, name, component +FROM sys_route +WHERE route_id IN ('device', 'screen', 'user_manage', 'application', 'system', 'my_device', 'my_application'); diff --git a/fix_route_id_name.bat b/fix_route_id_name.bat new file mode 100644 index 0000000..a3037e0 --- /dev/null +++ b/fix_route_id_name.bat @@ -0,0 +1,28 @@ +@echo off +echo ======================================== +echo 修复路由 ID 和名称不一致问题 +echo ======================================== +echo. +echo 这将修复数据库中 route_id 和 name 字段的不一致 +echo. +pause + +mysql -h localhost -P 3306 -u root -proot soybean_admin < fix_route_id_name.sql + +if %errorlevel% equ 0 ( + echo. + echo ======================================== + echo 修复成功! + echo ======================================== + echo. + echo 请重启后端服务并刷新浏览器测试 + echo. +) else ( + echo. + echo ======================================== + echo 修复失败! + echo ======================================== + echo. +) + +pause diff --git a/fix_route_id_name.sql b/fix_route_id_name.sql new file mode 100644 index 0000000..50ce8d3 --- /dev/null +++ b/fix_route_id_name.sql @@ -0,0 +1,19 @@ +-- 修复数据库中 route_id 和 name 字段的混乱 +-- 问题:route_id 和 name 字段值不一致,导致路由层级判断错误 + +USE soybean_admin; + +-- 查看当前问题数据 +SELECT route_id AS '错误的route_id', name AS '正确的name', path +FROM sys_route +WHERE route_id != name +ORDER BY order_num; + +-- 修复:将 route_id 设置为与 name 一致 +UPDATE sys_route SET route_id = name WHERE route_id != name; + +-- 验证修复结果 +SELECT route_id, name, path, component +FROM sys_route +WHERE status = 1 +ORDER BY order_num; diff --git a/fix_user_manage_children.bat b/fix_user_manage_children.bat new file mode 100644 index 0000000..98a588c --- /dev/null +++ b/fix_user_manage_children.bat @@ -0,0 +1,16 @@ +@echo off +echo ======================================== +echo 修复用户管理子路由组件路径 +echo ======================================== +echo. + +mysql -u root -proot < fix_user_manage_children.sql + +echo. +echo ======================================== +echo 修复完成! +echo ======================================== +echo. +echo 下一步:重启后端服务并刷新浏览器 +echo. +pause diff --git a/fix_user_manage_children.sql b/fix_user_manage_children.sql new file mode 100644 index 0000000..6a3f782 --- /dev/null +++ b/fix_user_manage_children.sql @@ -0,0 +1,14 @@ +-- 修复用户管理子路由的组件路径 +USE soybean_admin; + +-- 修复用户管理的三个子路由 +UPDATE sys_route SET component = 'view.user-manage_list' WHERE route_id = 'user_list'; +UPDATE sys_route SET component = 'view.user-manage_role' WHERE route_id = 'user_role'; +UPDATE sys_route SET component = 'view.user-manage_permission' WHERE route_id = 'user_permission'; + +-- 验证修改结果 +SELECT '=== 用户管理路由配置 ===' AS info; +SELECT route_id, name, path, component +FROM sys_route +WHERE route_id IN ('user_manage', 'user_list', 'user_role', 'user_permission') +ORDER BY order_num; diff --git a/fix_user_manage_final.bat b/fix_user_manage_final.bat new file mode 100644 index 0000000..f22419c --- /dev/null +++ b/fix_user_manage_final.bat @@ -0,0 +1,6 @@ +@echo off +echo 修复用户管理菜单问题... +mysql -u root -proot < fix_user_manage_final.sql +echo. +echo 修复完成!请重启后端服务并刷新浏览器。 +pause diff --git a/fix_user_manage_final.sql b/fix_user_manage_final.sql new file mode 100644 index 0000000..f7f5eec --- /dev/null +++ b/fix_user_manage_final.sql @@ -0,0 +1,77 @@ +-- 修复用户管理菜单问题 +USE soybean_admin; + +-- ============================================ +-- 修复用户管理路由的 name 字段 +-- 必须与前端 routeMap 和角色配置完全一致 +-- ============================================ + +-- 父路由:user-manage(使用连字符) +UPDATE sys_route +SET name = 'user-manage' +WHERE route_id = 'user_manage'; + +-- 子路由:user-manage_list, user-manage_role, user-manage_permission +UPDATE sys_route +SET name = 'user-manage_list' +WHERE route_id = 'user_manage_list'; + +UPDATE sys_route +SET name = 'user-manage_role' +WHERE route_id = 'user_manage_role'; + +UPDATE sys_route +SET name = 'user-manage_permission' +WHERE route_id = 'user_manage_permission'; + +-- ============================================ +-- 修复组件路径 +-- 父路由用 layout.base,子路由用 view.xxx +-- ============================================ + +-- 父路由 +UPDATE sys_route +SET component = 'layout.base' +WHERE route_id = 'user_manage'; + +-- 子路由 +UPDATE sys_route +SET component = 'view.user-manage_list' +WHERE route_id = 'user_manage_list'; + +UPDATE sys_route +SET component = 'view.user-manage_role' +WHERE route_id = 'user_manage_role'; + +UPDATE sys_route +SET component = 'view.user-manage_permission' +WHERE route_id = 'user_manage_permission'; + +-- ============================================ +-- 验证修复结果 +-- ============================================ + +SELECT '========================================' AS ''; +SELECT '修复后的用户管理路由' AS ''; +SELECT '========================================' AS ''; +SELECT route_id, name, path, component +FROM sys_route +WHERE route_id LIKE 'user%' +ORDER BY order_num; + +SELECT '' AS ''; +SELECT '========================================' AS ''; +SELECT '检查是否匹配角色配置' AS ''; +SELECT '========================================' AS ''; +SELECT + r.route_id, + r.name AS route_name, + CASE + WHEN role.menus LIKE CONCAT('%', r.name, '%') THEN '✓ 匹配' + ELSE '✗ 不匹配' + END AS matches_role_config +FROM sys_route r +CROSS JOIN sys_role role +WHERE role.role_code = 'R_SUPER' + AND r.route_id LIKE 'user%' +ORDER BY r.order_num; diff --git a/fix_user_manage_names_final.bat b/fix_user_manage_names_final.bat new file mode 100644 index 0000000..1fcef40 --- /dev/null +++ b/fix_user_manage_names_final.bat @@ -0,0 +1,24 @@ +@echo off +echo ======================================== +echo 最终修复用户管理路由 +echo ======================================== +echo. +echo 此脚本将: +echo 1. 修复路由名称为 user-manage, user-manage_list 等 +echo 2. 修复组件路径 +echo 3. 更新角色菜单配置 +echo. + +mysql -u root -proot < fix_user_manage_names_final.sql + +echo. +echo ======================================== +echo 修复完成! +echo ======================================== +echo. +echo 下一步: +echo 1. 重启后端服务 +echo 2. 清除浏览器缓存(Ctrl+Shift+Delete) +echo 3. 刷新浏览器(Ctrl+F5) +echo. +pause diff --git a/fix_user_manage_names_final.sql b/fix_user_manage_names_final.sql new file mode 100644 index 0000000..d3d729b --- /dev/null +++ b/fix_user_manage_names_final.sql @@ -0,0 +1,37 @@ +-- 最终修复用户管理路由的名称和组件 +USE soybean_admin; + +-- 1. 修复路由名称(必须与前端 routeMap 一致) +UPDATE sys_route SET name = 'user-manage' WHERE route_id = 'user_manage'; +UPDATE sys_route SET name = 'user-manage_list' WHERE route_id = 'user_list'; +UPDATE sys_route SET name = 'user-manage_role' WHERE route_id = 'user_role'; +UPDATE sys_route SET name = 'user-manage_permission' WHERE route_id = 'user_permission'; + +-- 2. 修复组件路径 +UPDATE sys_route SET component = 'layout.base' WHERE route_id = 'user_manage'; +UPDATE sys_route SET component = 'view.user-manage_list' WHERE route_id = 'user_list'; +UPDATE sys_route SET component = 'view.user-manage_role' WHERE route_id = 'user_role'; +UPDATE sys_route SET component = 'view.user-manage_permission' WHERE route_id = 'user_permission'; + +-- 3. 更新角色菜单配置(使用新的路由名称) +UPDATE sys_role +SET menus = 'device,device_list,device_group,device_monitor,device_online,device_power,screen,screen_wall,screen_control,screen_record,user-manage,user-manage_list,user-manage_role,user-manage_permission,application,application_approval,application_history,system,system_agent,system_amt,system_log,my-device,my-device_status,my-device_remote-control,my-device_power-control,my-application,my-application_apply,my-application_my-list' +WHERE role_code = 'R_SUPER'; + +UPDATE sys_role +SET menus = 'device,device_list,device_group,device_monitor,device_online,device_power,screen,screen_wall,screen_control,screen_record,user-manage,user-manage_list,user-manage_role,application,application_approval,application_history' +WHERE role_code = 'R_ADMIN'; + +-- 4. 验证修改结果 +SELECT '=== 用户管理路由配置 ===' AS info; +SELECT route_id, name, path, component +FROM sys_route +WHERE route_id IN ('user_manage', 'user_list', 'user_role', 'user_permission') +ORDER BY order_num; + +SELECT '' AS ''; +SELECT '=== 角色菜单配置(应包含 user-manage 相关)===' AS info; +SELECT role_code, role_name, + SUBSTRING(menus, 1, 100) AS menus_preview +FROM sys_role +WHERE role_code IN ('R_SUPER', 'R_ADMIN'); diff --git a/fix_user_manage_routes.bat b/fix_user_manage_routes.bat new file mode 100644 index 0000000..ed8bc6c --- /dev/null +++ b/fix_user_manage_routes.bat @@ -0,0 +1,24 @@ +@echo off +echo ======================================== +echo 完整修复所有路由配置 +echo ======================================== +echo. +echo 此脚本将修复: +echo 1. 所有路由名称(统一使用下划线) +echo 2. 所有组件路径(修复父路由组件引用) +echo 3. 角色菜单配置(匹配新的路由名称) +echo. + +mysql -u root -proot < fix_user_manage_routes.sql + +echo. +echo ======================================== +echo 修复完成! +echo ======================================== +echo. +echo 下一步操作: +echo 1. 重启后端服务(运行 backend\start.bat) +echo 2. 清除浏览器缓存 +echo 3. 刷新浏览器页面 +echo. +pause diff --git a/fix_user_manage_routes.sql b/fix_user_manage_routes.sql new file mode 100644 index 0000000..a006010 --- /dev/null +++ b/fix_user_manage_routes.sql @@ -0,0 +1,124 @@ +-- 完整修复所有路由名称和组件路径 +USE soybean_admin; + +-- ============================================ +-- 第一部分:修复所有路由的 name 字段(与前端 routeMap 保持一致) +-- ============================================ + +-- 设备管理(父路由用连字符,子路由用下划线) +UPDATE sys_route SET name = 'device' WHERE route_id = 'device'; +UPDATE sys_route SET name = 'device_list' WHERE route_id = 'device_list'; +UPDATE sys_route SET name = 'device_online' WHERE route_id = 'device_online'; +UPDATE sys_route SET name = 'device_power' WHERE route_id = 'device_power'; +UPDATE sys_route SET name = 'device_monitor' WHERE route_id = 'device_monitor'; +UPDATE sys_route SET name = 'device_group' WHERE route_id = 'device_group'; + +-- 屏幕监控 +UPDATE sys_route SET name = 'screen' WHERE route_id = 'screen'; +UPDATE sys_route SET name = 'screen_wall' WHERE route_id = 'screen_wall'; +UPDATE sys_route SET name = 'screen_control' WHERE route_id = 'screen_control'; +UPDATE sys_route SET name = 'screen_record' WHERE route_id = 'screen_record'; + +-- 用户管理(关键修复:父路由用连字符,子路由用连字符+下划线) +UPDATE sys_route SET name = 'user-manage' WHERE route_id = 'user_manage'; +UPDATE sys_route SET name = 'user-manage_list' WHERE route_id = 'user_list'; +UPDATE sys_route SET name = 'user-manage_role' WHERE route_id = 'user_role'; +UPDATE sys_route SET name = 'user-manage_permission' WHERE route_id = 'user_permission'; + +-- 申请管理 +UPDATE sys_route SET name = 'application' WHERE route_id = 'application'; +UPDATE sys_route SET name = 'application_approval' WHERE route_id = 'application_approval'; +UPDATE sys_route SET name = 'application_history' WHERE route_id = 'application_history'; + +-- 系统设置 +UPDATE sys_route SET name = 'system' WHERE route_id = 'system'; +UPDATE sys_route SET name = 'system_amt' WHERE route_id = 'system_amt'; +UPDATE sys_route SET name = 'system_agent' WHERE route_id = 'system_agent'; +UPDATE sys_route SET name = 'system_log' WHERE route_id = 'system_log'; + +-- 我的设备(父路由用连字符,子路由用连字符+下划线) +UPDATE sys_route SET name = 'my-device' WHERE route_id = 'my_device'; +UPDATE sys_route SET name = 'my-device_status' WHERE route_id = 'my_device_status'; +UPDATE sys_route SET name = 'my-device_power-control' WHERE route_id = 'my_device_power'; +UPDATE sys_route SET name = 'my-device_remote-control' WHERE route_id = 'my_device_remote'; + +-- 设备申请(父路由用连字符,子路由用连字符+下划线) +UPDATE sys_route SET name = 'my-application' WHERE route_id = 'my_application'; +UPDATE sys_route SET name = 'my-application_apply' WHERE route_id = 'my_application_apply'; +UPDATE sys_route SET name = 'my-application_my-list' WHERE route_id = 'my_application_list'; + +-- ============================================ +-- 第二部分:修复组件路径(子路由用下划线,父路由用连字符) +-- ============================================ + +-- 设备管理 +UPDATE sys_route SET component = 'layout.base$view.device' WHERE route_id = 'device'; +UPDATE sys_route SET component = 'view.device_list' WHERE route_id = 'device_list'; +UPDATE sys_route SET component = 'view.device_online' WHERE route_id = 'device_online'; +UPDATE sys_route SET component = 'view.device_power' WHERE route_id = 'device_power'; +UPDATE sys_route SET component = 'view.device_monitor' WHERE route_id = 'device_monitor'; +UPDATE sys_route SET component = 'view.device_group' WHERE route_id = 'device_group'; + +-- 屏幕监控 +UPDATE sys_route SET component = 'layout.base$view.screen' WHERE route_id = 'screen'; +UPDATE sys_route SET component = 'view.screen_wall' WHERE route_id = 'screen_wall'; +UPDATE sys_route SET component = 'view.screen_control' WHERE route_id = 'screen_control'; +UPDATE sys_route SET component = 'view.screen_record' WHERE route_id = 'screen_record'; + +-- 用户管理 +UPDATE sys_route SET component = 'layout.base$view.user-manage' WHERE route_id = 'user_manage'; +UPDATE sys_route SET component = 'view.user-manage_list' WHERE route_id = 'user_list'; +UPDATE sys_route SET component = 'view.user-manage_role' WHERE route_id = 'user_role'; +UPDATE sys_route SET component = 'view.user-manage_permission' WHERE route_id = 'user_permission'; + +-- 申请管理 +UPDATE sys_route SET component = 'layout.base$view.application' WHERE route_id = 'application'; +UPDATE sys_route SET component = 'view.application_approval' WHERE route_id = 'application_approval'; +UPDATE sys_route SET component = 'view.application_history' WHERE route_id = 'application_history'; + +-- 系统设置 +UPDATE sys_route SET component = 'layout.base$view.system' WHERE route_id = 'system'; +UPDATE sys_route SET component = 'view.system_amt' WHERE route_id = 'system_amt'; +UPDATE sys_route SET component = 'view.system_agent' WHERE route_id = 'system_agent'; +UPDATE sys_route SET component = 'view.system_log' WHERE route_id = 'system_log'; + +-- 我的设备 +UPDATE sys_route SET component = 'layout.base$view.my-device' WHERE route_id = 'my_device'; +UPDATE sys_route SET component = 'view.my-device_status' WHERE route_id = 'my_device_status'; +UPDATE sys_route SET component = 'view.my-device_power-control' WHERE route_id = 'my_device_power'; +UPDATE sys_route SET component = 'view.my-device_remote-control' WHERE route_id = 'my_device_remote'; + +-- 设备申请 +UPDATE sys_route SET component = 'layout.base$view.my-application' WHERE route_id = 'my_application'; +UPDATE sys_route SET component = 'view.my-application_apply' WHERE route_id = 'my_application_apply'; +UPDATE sys_route SET component = 'view.my-application_my-list' WHERE route_id = 'my_application_list'; + +-- ============================================ +-- 第三部分:更新角色的菜单配置 +-- ============================================ + +UPDATE sys_role +SET menus = 'device,device_list,device_group,device_monitor,device_online,device_power,screen,screen_wall,screen_control,screen_record,user_manage,user_manage_list,user_manage_role,user_manage_permission,application,application_approval,application_history,system,system_agent,system_amt,system_log,my_device,my_device_status,my_device_remote,my_device_power,my_application,my_application_apply,my_application_list' +WHERE role_code = 'R_SUPER'; + +UPDATE sys_role +SET menus = 'device,device_list,device_group,device_monitor,device_online,device_power,screen,screen_wall,screen_control,screen_record,user_manage,user_manage_list,user_manage_role,application,application_approval,application_history' +WHERE role_code = 'R_ADMIN'; + +UPDATE sys_role +SET menus = 'my_device,my_device_status,my_device_remote,my_device_power,my_application,my_application_apply,my_application_list' +WHERE role_code = 'R_USER'; + +-- ============================================ +-- 第四部分:验证修改结果 +-- ============================================ + +SELECT '=== 所有路由名称和组件路径 ===' AS ''; +SELECT route_id, name, path, component, order_num +FROM sys_route +WHERE status = 1 +ORDER BY order_num; + +SELECT '' AS ''; +SELECT '=== 角色菜单配置 ===' AS ''; +SELECT role_code, role_name, menus FROM sys_role; diff --git a/index.html b/index.html new file mode 100644 index 0000000..b04ac55 --- /dev/null +++ b/index.html @@ -0,0 +1,14 @@ + + + + + + + + %VITE_APP_TITLE% + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..230cdb4 --- /dev/null +++ b/package.json @@ -0,0 +1,110 @@ +{ + "name": "soybean-admin", + "type": "module", + "version": "2.0.2", + "description": "A fresh and elegant admin template, based on Vue3、Vite7、TypeScript、NaiveUI and UnoCSS. 一个基于Vue3、Vite7、TypeScript、NaiveUI and UnoCSS的清新优雅的中后台模版。", + "author": { + "name": "Soybean", + "email": "soybeanjs@outlook.com", + "url": "https://github.com/soybeanjs" + }, + "license": "MIT", + "homepage": "https://github.com/soybeanjs/soybean-admin", + "repository": { + "url": "https://github.com/soybeanjs/soybean-admin.git" + }, + "bugs": { + "url": "https://github.com/soybeanjs/soybean-admin/issues" + }, + "keywords": [ + "Vue3 admin ", + "vue-admin-template", + "Vite7", + "TypeScript", + "naive-ui", + "naive-ui-admin", + "ant-design-vue v4", + "UnoCSS" + ], + "engines": { + "node": ">=20.19.0", + "pnpm": ">=10.5.0" + }, + "scripts": { + "build": "vite build --mode prod", + "build:test": "vite build --mode test", + "cleanup": "sa cleanup", + "commit": "sa git-commit", + "commit:zh": "sa git-commit -l=zh-cn", + "dev": "vite --mode test", + "dev:prod": "vite --mode prod", + "gen-route": "sa gen-route", + "lint": "eslint . --fix", + "prepare": "simple-git-hooks", + "preview": "vite preview", + "release": "sa release", + "typecheck": "vue-tsc --noEmit --skipLibCheck", + "update-pkg": "sa update-pkg" + }, + "dependencies": { + "@better-scroll/core": "2.5.1", + "@iconify/vue": "5.0.0", + "@sa/axios": "workspace:*", + "@sa/color": "workspace:*", + "@sa/hooks": "workspace:*", + "@sa/materials": "workspace:*", + "@sa/utils": "workspace:*", + "@vueuse/core": "14.1.0", + "clipboard": "2.0.11", + "dayjs": "1.11.19", + "defu": "6.1.4", + "echarts": "6.0.0", + "json5": "2.2.3", + "naive-ui": "2.43.2", + "nprogress": "0.2.0", + "pinia": "3.0.4", + "tailwind-merge": "3.4.0", + "vue": "3.5.26", + "vue-draggable-plus": "0.6.0", + "vue-i18n": "11.2.7", + "vue-router": "4.6.4" + }, + "devDependencies": { + "@elegant-router/vue": "0.3.8", + "@iconify/json": "2.2.417", + "@sa/scripts": "workspace:*", + "@sa/uno-preset": "workspace:*", + "@soybeanjs/eslint-config": "1.7.4", + "@types/node": "25.0.3", + "@types/nprogress": "0.2.3", + "@unocss/eslint-config": "66.5.10", + "@unocss/preset-icons": "66.5.10", + "@unocss/preset-uno": "66.5.10", + "@unocss/transformer-directives": "66.5.10", + "@unocss/transformer-variant-group": "66.5.10", + "@unocss/vite": "66.5.10", + "@vitejs/plugin-vue": "6.0.3", + "@vitejs/plugin-vue-jsx": "5.1.2", + "consola": "3.4.2", + "eslint": "9.39.2", + "eslint-plugin-vue": "10.6.2", + "kolorist": "1.8.0", + "sass": "1.97.1", + "simple-git-hooks": "2.13.1", + "tsx": "4.21.0", + "typescript": "5.9.3", + "unplugin-icons": "22.5.0", + "unplugin-vue-components": "30.0.0", + "vite": "7.3.0", + "vite-plugin-progress": "0.0.7", + "vite-plugin-svg-icons": "2.0.1", + "vite-plugin-vue-devtools": "8.0.5", + "vue-eslint-parser": "10.2.0", + "vue-tsc": "3.2.1" + }, + "simple-git-hooks": { + "commit-msg": "pnpm sa git-commit-verify", + "pre-commit": "pnpm typecheck && pnpm lint && git diff --exit-code" + }, + "website": "https://admin.soybeanjs.cn" +} diff --git a/packages/alova/package.json b/packages/alova/package.json new file mode 100644 index 0000000..a4d7434 --- /dev/null +++ b/packages/alova/package.json @@ -0,0 +1,20 @@ +{ + "name": "@sa/alova", + "version": "2.0.2", + "exports": { + ".": "./src/index.ts", + "./fetch": "./src/fetch.ts", + "./client": "./src/client.ts", + "./mock": "./src/mock.ts" + }, + "typesVersions": { + "*": { + "*": ["./src/*"] + } + }, + "dependencies": { + "@alova/mock": "2.0.18", + "@sa/utils": "workspace:*", + "alova": "3.4.1" + } +} diff --git a/packages/alova/src/client.ts b/packages/alova/src/client.ts new file mode 100644 index 0000000..0d76ebb --- /dev/null +++ b/packages/alova/src/client.ts @@ -0,0 +1 @@ +export * from 'alova/client'; diff --git a/packages/alova/src/constant.ts b/packages/alova/src/constant.ts new file mode 100644 index 0000000..be5c43c --- /dev/null +++ b/packages/alova/src/constant.ts @@ -0,0 +1,2 @@ +/** the backend error code key */ +export const BACKEND_ERROR_CODE = 'BACKEND_ERROR'; diff --git a/packages/alova/src/fetch.ts b/packages/alova/src/fetch.ts new file mode 100644 index 0000000..8511ce4 --- /dev/null +++ b/packages/alova/src/fetch.ts @@ -0,0 +1,2 @@ +import adapterFetch from 'alova/fetch'; +export default adapterFetch; diff --git a/packages/alova/src/index.ts b/packages/alova/src/index.ts new file mode 100644 index 0000000..4264253 --- /dev/null +++ b/packages/alova/src/index.ts @@ -0,0 +1,77 @@ +import { createAlova } from 'alova'; +import type { AlovaDefaultCacheAdapter, AlovaGenerics, AlovaGlobalCacheAdapter, AlovaRequestAdapter } from 'alova'; +import VueHook from 'alova/vue'; +import type { VueHookType } from 'alova/vue'; +import adapterFetch from 'alova/fetch'; +import { createServerTokenAuthentication } from 'alova/client'; +import type { FetchRequestInit } from 'alova/fetch'; +import { BACKEND_ERROR_CODE } from './constant'; +import type { CustomAlovaConfig, RequestOptions } from './type'; + +export const createAlovaRequest = < + RequestConfig = FetchRequestInit, + ResponseType = Response, + ResponseHeader = Headers, + L1Cache extends AlovaGlobalCacheAdapter = AlovaDefaultCacheAdapter, + L2Cache extends AlovaGlobalCacheAdapter = AlovaDefaultCacheAdapter +>( + customConfig: CustomAlovaConfig< + AlovaGenerics + >, + options: RequestOptions> +) => { + const { tokenRefresher } = options; + const { onAuthRequired, onResponseRefreshToken } = createServerTokenAuthentication< + VueHookType, + AlovaRequestAdapter + >({ + refreshTokenOnSuccess: { + isExpired: (response, method) => tokenRefresher?.isExpired(response, method) || false, + handler: async (response, method) => tokenRefresher?.handler(response, method) + }, + refreshTokenOnError: { + isExpired: (response, method) => tokenRefresher?.isExpired(response, method) || false, + handler: async (response, method) => tokenRefresher?.handler(response, method) + } + }); + + const instance = createAlova({ + ...customConfig, + timeout: customConfig.timeout ?? 10 * 1000, + requestAdapter: (customConfig.requestAdapter as any) ?? adapterFetch(), + statesHook: VueHook, + beforeRequest: onAuthRequired(options.onRequest as any), + responded: onResponseRefreshToken({ + onSuccess: async (response, method) => { + // check if http status is success + let error: any = null; + let transformedData: any = null; + try { + if (await options.isBackendSuccess(response)) { + transformedData = await options.transformBackendResponse(response); + } else { + error = new Error('the backend request error'); + error.code = BACKEND_ERROR_CODE; + } + } catch (err) { + error = err; + } + + if (error) { + await options.onError?.(error, response, method); + throw error; + } + + return transformedData; + }, + onComplete: options.onComplete, + onError: (error, method) => options.onError?.(error, null, method) + }) + }); + + return instance; +}; + +export { BACKEND_ERROR_CODE }; +export type * from './type'; +export type * from 'alova'; diff --git a/packages/alova/src/mock.ts b/packages/alova/src/mock.ts new file mode 100644 index 0000000..f3aaf08 --- /dev/null +++ b/packages/alova/src/mock.ts @@ -0,0 +1 @@ +export * from '@alova/mock'; diff --git a/packages/alova/src/type.ts b/packages/alova/src/type.ts new file mode 100644 index 0000000..27b84b2 --- /dev/null +++ b/packages/alova/src/type.ts @@ -0,0 +1,52 @@ +import type { AlovaGenerics, AlovaOptions, AlovaRequestAdapter, Method, ResponseCompleteHandler } from 'alova'; + +export type CustomAlovaConfig = Omit< + AlovaOptions, + 'statesHook' | 'beforeRequest' | 'responded' | 'requestAdapter' +> & { + /** request adapter. all request of alova will be sent by it. */ + requestAdapter?: AlovaRequestAdapter; +}; + +export interface RequestOptions { + /** + * The hook before request + * + * For example: You can add header token in this hook + * + * @param method alova Method Instance + */ + onRequest?: AlovaOptions['beforeRequest']; + /** + * The hook to check backend response is success or not + * + * @param response alova response + */ + isBackendSuccess: (response: AG['Response']) => Promise; + + /** The config to refresh token */ + tokenRefresher?: { + /** detect the token is expired */ + isExpired(response: AG['Response'], Method: Method): Promise | boolean; + /** refresh token handler */ + handler(response: AG['Response'], Method: Method): Promise; + }; + + /** The hook after backend request complete */ + onComplete?: ResponseCompleteHandler; + + /** + * The hook to handle error + * + * For example: You can show error message in this hook + * + * @param error + */ + onError?: (error: any, response: AG['Response'] | null, methodInstance: Method) => any | Promise; + /** + * transform backend response when the responseType is json + * + * @param response alova response + */ + transformBackendResponse: (response: AG['Response']) => any; +} diff --git a/packages/alova/tsconfig.json b/packages/alova/tsconfig.json new file mode 100644 index 0000000..5823ed5 --- /dev/null +++ b/packages/alova/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ESNext", + "jsx": "preserve", + "lib": ["DOM", "ESNext"], + "baseUrl": ".", + "module": "ESNext", + "moduleResolution": "node", + "resolveJsonModule": true, + "types": ["node"], + "strict": true, + "strictNullChecks": true, + "noUnusedLocals": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/axios/package.json b/packages/axios/package.json new file mode 100644 index 0000000..902101e --- /dev/null +++ b/packages/axios/package.json @@ -0,0 +1,21 @@ +{ + "name": "@sa/axios", + "version": "2.0.2", + "exports": { + ".": "./src/index.ts" + }, + "typesVersions": { + "*": { + "*": ["./src/*"] + } + }, + "dependencies": { + "@sa/utils": "workspace:*", + "axios": "1.13.2", + "axios-retry": "4.5.0", + "qs": "6.14.0" + }, + "devDependencies": { + "@types/qs": "6.14.0" + } +} diff --git a/packages/axios/src/constant.ts b/packages/axios/src/constant.ts new file mode 100644 index 0000000..d6c5a33 --- /dev/null +++ b/packages/axios/src/constant.ts @@ -0,0 +1,5 @@ +/** request id key */ +export const REQUEST_ID_KEY = 'X-Request-Id'; + +/** the backend error code key */ +export const BACKEND_ERROR_CODE = 'BACKEND_ERROR'; diff --git a/packages/axios/src/index.ts b/packages/axios/src/index.ts new file mode 100644 index 0000000..08af572 --- /dev/null +++ b/packages/axios/src/index.ts @@ -0,0 +1,179 @@ +import axios, { AxiosError } from 'axios'; +import type { AxiosResponse, CreateAxiosDefaults, InternalAxiosRequestConfig } from 'axios'; +import axiosRetry from 'axios-retry'; +import { nanoid } from '@sa/utils'; +import { createAxiosConfig, createDefaultOptions, createRetryOptions } from './options'; +import { transformResponse } from './shared'; +import { BACKEND_ERROR_CODE, REQUEST_ID_KEY } from './constant'; +import type { + CustomAxiosRequestConfig, + FlatRequestInstance, + MappedType, + RequestInstance, + RequestOption, + ResponseType +} from './type'; + +function createCommonRequest< + ResponseData, + ApiData = ResponseData, + State extends Record = Record +>(axiosConfig?: CreateAxiosDefaults, options?: Partial>) { + const opts = createDefaultOptions(options); + + const axiosConf = createAxiosConfig(axiosConfig); + const instance = axios.create(axiosConf); + + const abortControllerMap = new Map(); + + // config axios retry + const retryOptions = createRetryOptions(axiosConf); + axiosRetry(instance, retryOptions); + + instance.interceptors.request.use(conf => { + const config: InternalAxiosRequestConfig = { ...conf }; + + // set request id + const requestId = nanoid(); + config.headers.set(REQUEST_ID_KEY, requestId); + + // config abort controller + if (!config.signal) { + const abortController = new AbortController(); + config.signal = abortController.signal; + abortControllerMap.set(requestId, abortController); + } + + // handle config by hook + const handledConfig = opts.onRequest?.(config) || config; + + return handledConfig; + }); + + instance.interceptors.response.use( + async response => { + const responseType: ResponseType = (response.config?.responseType as ResponseType) || 'json'; + + await transformResponse(response); + + if (responseType !== 'json' || opts.isBackendSuccess(response)) { + return Promise.resolve(response); + } + + const fail = await opts.onBackendFail(response, instance); + if (fail) { + return fail; + } + + const backendError = new AxiosError( + 'the backend request error', + BACKEND_ERROR_CODE, + response.config, + response.request, + response + ); + + await opts.onError(backendError); + + return Promise.reject(backendError); + }, + async (error: AxiosError) => { + await opts.onError(error); + + return Promise.reject(error); + } + ); + + function cancelAllRequest() { + abortControllerMap.forEach(abortController => { + abortController.abort(); + }); + abortControllerMap.clear(); + } + + return { + instance, + opts, + cancelAllRequest + }; +} + +/** + * create a request instance + * + * @param axiosConfig axios config + * @param options request options + */ +export function createRequest>( + axiosConfig?: CreateAxiosDefaults, + options?: Partial> +) { + const { instance, opts, cancelAllRequest } = createCommonRequest(axiosConfig, options); + + const request: RequestInstance = async function request< + T extends ApiData = ApiData, + R extends ResponseType = 'json' + >(config: CustomAxiosRequestConfig) { + const response: AxiosResponse = await instance(config); + + const responseType = response.config?.responseType || 'json'; + + if (responseType === 'json') { + return opts.transform(response); + } + + return response.data as MappedType; + } as RequestInstance; + + request.cancelAllRequest = cancelAllRequest; + request.state = {} as State; + + return request; +} + +/** + * create a flat request instance + * + * The response data is a flat object: { data: any, error: AxiosError } + * + * @param axiosConfig axios config + * @param options request options + */ +export function createFlatRequest>( + axiosConfig?: CreateAxiosDefaults, + options?: Partial> +) { + const { instance, opts, cancelAllRequest } = createCommonRequest(axiosConfig, options); + + const flatRequest: FlatRequestInstance = async function flatRequest< + T extends ApiData = ApiData, + R extends ResponseType = 'json' + >(config: CustomAxiosRequestConfig) { + try { + const response: AxiosResponse = await instance(config); + + const responseType = response.config?.responseType || 'json'; + + if (responseType === 'json') { + const data = await opts.transform(response); + + return { data, error: null, response }; + } + + return { data: response.data as MappedType, error: null, response }; + } catch (error) { + return { data: null, error, response: (error as AxiosError).response }; + } + } as FlatRequestInstance; + + flatRequest.cancelAllRequest = cancelAllRequest; + flatRequest.state = { + ...opts.defaultState + } as State; + + return flatRequest; +} + +export { BACKEND_ERROR_CODE, REQUEST_ID_KEY }; +export type * from './type'; +export type { CreateAxiosDefaults, AxiosError }; diff --git a/packages/axios/src/options.ts b/packages/axios/src/options.ts new file mode 100644 index 0000000..e786639 --- /dev/null +++ b/packages/axios/src/options.ts @@ -0,0 +1,60 @@ +import type { CreateAxiosDefaults } from 'axios'; +import type { IAxiosRetryConfig } from 'axios-retry'; +import { stringify } from 'qs'; +import { isHttpSuccess } from './shared'; +import type { RequestOption } from './type'; + +export function createDefaultOptions< + ResponseData, + ApiData = ResponseData, + State extends Record = Record +>(options?: Partial>) { + const opts: RequestOption = { + defaultState: {} as State, + transform: async response => response.data as unknown as ApiData, + transformBackendResponse: async response => response.data as unknown as ApiData, + onRequest: async config => config, + isBackendSuccess: _response => true, + onBackendFail: async () => {}, + onError: async () => {} + }; + + if (options?.transform) { + opts.transform = options.transform; + } else { + opts.transform = options?.transformBackendResponse || opts.transform; + } + + Object.assign(opts, options); + + return opts; +} + +export function createRetryOptions(config?: Partial) { + const retryConfig: IAxiosRetryConfig = { + retries: 0 + }; + + Object.assign(retryConfig, config); + + return retryConfig; +} + +export function createAxiosConfig(config?: Partial) { + const TEN_SECONDS = 10 * 1000; + + const axiosConfig: CreateAxiosDefaults = { + timeout: TEN_SECONDS, + headers: { + 'Content-Type': 'application/json' + }, + validateStatus: isHttpSuccess, + paramsSerializer: params => { + return stringify(params); + } + }; + + Object.assign(axiosConfig, config); + + return axiosConfig; +} diff --git a/packages/axios/src/shared.ts b/packages/axios/src/shared.ts new file mode 100644 index 0000000..1bb68f0 --- /dev/null +++ b/packages/axios/src/shared.ts @@ -0,0 +1,79 @@ +import type { AxiosHeaderValue, AxiosResponse, InternalAxiosRequestConfig } from 'axios'; +import type { ResponseType } from './type'; + +export function getContentType(config: InternalAxiosRequestConfig) { + const contentType: AxiosHeaderValue = config.headers?.['Content-Type'] || 'application/json'; + + return contentType; +} + +/** + * check if http status is success + * + * @param status + */ +export function isHttpSuccess(status: number) { + const isSuccessCode = status >= 200 && status < 300; + return isSuccessCode || status === 304; +} + +/** + * is response json + * + * @param response axios response + */ +export function isResponseJson(response: AxiosResponse) { + const { responseType } = response.config; + + return responseType === 'json' || responseType === undefined; +} + +export async function transformResponse(response: AxiosResponse) { + const responseType: ResponseType = (response.config?.responseType as ResponseType) || 'json'; + if (responseType === 'json') return; + + const isJson = response.headers['content-type']?.includes('application/json'); + if (!isJson) return; + + if (responseType === 'blob') { + await transformBlobToJson(response); + } + + if (responseType === 'arrayBuffer') { + await transformArrayBufferToJson(response); + } +} + +export async function transformBlobToJson(response: AxiosResponse) { + try { + let data = response.data; + + if (typeof data === 'string') { + data = JSON.parse(data); + } + + if (Object.prototype.toString.call(data) === '[object Blob]') { + const json = await data.text(); + data = JSON.parse(json); + } + + response.data = data; + } catch {} +} + +export async function transformArrayBufferToJson(response: AxiosResponse) { + try { + let data = response.data; + + if (typeof data === 'string') { + data = JSON.parse(data); + } + + if (Object.prototype.toString.call(data) === '[object ArrayBuffer]') { + const json = new TextDecoder().decode(data); + data = JSON.parse(json); + } + + response.data = data; + } catch {} +} diff --git a/packages/axios/src/type.ts b/packages/axios/src/type.ts new file mode 100644 index 0000000..0fa6caa --- /dev/null +++ b/packages/axios/src/type.ts @@ -0,0 +1,130 @@ +import type { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios'; + +export type ContentType = + | 'text/html' + | 'text/plain' + | 'multipart/form-data' + | 'application/json' + | 'application/x-www-form-urlencoded' + | 'application/octet-stream'; + +export type ResponseTransform = (input: Input) => Output | Promise; + +export interface RequestOption< + ResponseData, + ApiData = ResponseData, + State extends Record = Record +> { + /** + * The default state + */ + defaultState?: State; + /** + * transform the response data to the api data + * + * @param response Axios response + */ + transform: ResponseTransform, ApiData>; + /** + * transform the response data to the api data + * + * @deprecated use `transform` instead, will be removed in the next major version v3 + * @param response Axios response + */ + transformBackendResponse: ResponseTransform, ApiData>; + /** + * The hook before request + * + * For example: You can add header token in this hook + * + * @param config Axios config + */ + onRequest: (config: InternalAxiosRequestConfig) => InternalAxiosRequestConfig | Promise; + /** + * The hook to check backend response is success or not + * + * @param response Axios response + */ + isBackendSuccess: (response: AxiosResponse) => boolean; + /** + * The hook after backend request fail + * + * For example: You can handle the expired token in this hook + * + * @param response Axios response + * @param instance Axios instance + */ + onBackendFail: ( + response: AxiosResponse, + instance: AxiosInstance + ) => Promise | Promise; + /** + * The hook to handle error + * + * For example: You can show error message in this hook + * + * @param error + */ + onError: (error: AxiosError) => void | Promise; +} + +interface ResponseMap { + blob: Blob; + text: string; + arrayBuffer: ArrayBuffer; + stream: ReadableStream; + document: Document; +} +export type ResponseType = keyof ResponseMap | 'json'; + +export type MappedType = R extends keyof ResponseMap + ? ResponseMap[R] + : JsonType; + +export type CustomAxiosRequestConfig = Omit & { + responseType?: R; +}; + +export interface RequestInstanceCommon> { + /** + * cancel all request + * + * if the request provide abort controller sign from config, it will not collect in the abort controller map + */ + cancelAllRequest: () => void; + /** you can set custom state in the request instance */ + state: State; +} + +/** The request instance */ +export interface RequestInstance> extends RequestInstanceCommon { + ( + config: CustomAxiosRequestConfig + ): Promise>; +} + +export type FlatResponseSuccessData = { + data: ApiData; + error: null; + response: AxiosResponse; +}; + +export type FlatResponseFailData = { + data: null; + error: AxiosError; + response: AxiosResponse; +}; + +export type FlatResponseData = + | FlatResponseSuccessData + | FlatResponseFailData; + +export interface FlatRequestInstance< + ResponseData, + ApiData, + State extends Record +> extends RequestInstanceCommon { + ( + config: CustomAxiosRequestConfig + ): Promise>>; +} diff --git a/packages/axios/tsconfig.json b/packages/axios/tsconfig.json new file mode 100644 index 0000000..5823ed5 --- /dev/null +++ b/packages/axios/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ESNext", + "jsx": "preserve", + "lib": ["DOM", "ESNext"], + "baseUrl": ".", + "module": "ESNext", + "moduleResolution": "node", + "resolveJsonModule": true, + "types": ["node"], + "strict": true, + "strictNullChecks": true, + "noUnusedLocals": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/color/package.json b/packages/color/package.json new file mode 100644 index 0000000..2668a42 --- /dev/null +++ b/packages/color/package.json @@ -0,0 +1,16 @@ +{ + "name": "@sa/color", + "version": "2.0.2", + "exports": { + ".": "./src/index.ts" + }, + "typesVersions": { + "*": { + "*": ["./src/*"] + } + }, + "dependencies": { + "@sa/utils": "workspace:*", + "colord": "2.9.3" + } +} diff --git a/packages/color/src/constant/index.ts b/packages/color/src/constant/index.ts new file mode 100644 index 0000000..cefbcdb --- /dev/null +++ b/packages/color/src/constant/index.ts @@ -0,0 +1,2 @@ +export * from './name'; +export * from './palette'; diff --git a/packages/color/src/constant/name.ts b/packages/color/src/constant/name.ts new file mode 100644 index 0000000..36648c3 --- /dev/null +++ b/packages/color/src/constant/name.ts @@ -0,0 +1,1579 @@ +export const colorNames: [hex: string, name: string][] = [ + ['#000000', 'Black'], + ['#000080', 'Navy Blue'], + ['#0000c8', 'Dark Blue'], + ['#0000ff', 'Blue'], + ['#000741', 'Stratos'], + ['#001b1c', 'Swamp'], + ['#002387', 'Resolution Blue'], + ['#002900', 'Deep Fir'], + ['#002e20', 'Burnham'], + ['#002fa7', 'International Klein Blue'], + ['#003153', 'Prussian Blue'], + ['#003366', 'Midnight Blue'], + ['#003399', 'Smalt'], + ['#003532', 'Deep Teal'], + ['#003e40', 'Cyprus'], + ['#004620', 'Kaitoke Green'], + ['#0047ab', 'Cobalt'], + ['#004816', 'Crusoe'], + ['#004950', 'Sherpa Blue'], + ['#0056a7', 'Endeavour'], + ['#00581a', 'Camarone'], + ['#0066cc', 'Science Blue'], + ['#0066ff', 'Blue Ribbon'], + ['#00755e', 'Tropical Rain Forest'], + ['#0076a3', 'Allports'], + ['#007ba7', 'Deep Cerulean'], + ['#007ec7', 'Lochmara'], + ['#007fff', 'Azure Radiance'], + ['#008080', 'Teal'], + ['#0095b6', 'Bondi Blue'], + ['#009dc4', 'Pacific Blue'], + ['#00a693', 'Persian Green'], + ['#00a86b', 'Jade'], + ['#00cc99', 'Caribbean Green'], + ['#00cccc', "Robin's Egg Blue"], + ['#00ff00', 'Green'], + ['#00ff7f', 'Spring Green'], + ['#00ffff', 'Cyan Aqua'], + ['#010d1a', 'Blue Charcoal'], + ['#011635', 'Midnight'], + ['#011d13', 'Holly'], + ['#012731', 'Daintree'], + ['#01361c', 'Cardin Green'], + ['#01371a', 'County Green'], + ['#013e62', 'Astronaut Blue'], + ['#013f6a', 'Regal Blue'], + ['#014b43', 'Aqua Deep'], + ['#015e85', 'Orient'], + ['#016162', 'Blue Stone'], + ['#016d39', 'Fun Green'], + ['#01796f', 'Pine Green'], + ['#017987', 'Blue Lagoon'], + ['#01826b', 'Deep Sea'], + ['#01a368', 'Green Haze'], + ['#022d15', 'English Holly'], + ['#02402c', 'Sherwood Green'], + ['#02478e', 'Congress Blue'], + ['#024e46', 'Evening Sea'], + ['#026395', 'Bahama Blue'], + ['#02866f', 'Observatory'], + ['#02a4d3', 'Cerulean'], + ['#03163c', 'Tangaroa'], + ['#032b52', 'Green Vogue'], + ['#036a6e', 'Mosque'], + ['#041004', 'Midnight Moss'], + ['#041322', 'Black Pearl'], + ['#042e4c', 'Blue Whale'], + ['#044022', 'Zuccini'], + ['#044259', 'Teal Blue'], + ['#051040', 'Deep Cove'], + ['#051657', 'Gulf Blue'], + ['#055989', 'Venice Blue'], + ['#056f57', 'Watercourse'], + ['#062a78', 'Catalina Blue'], + ['#063537', 'Tiber'], + ['#069b81', 'Gossamer'], + ['#06a189', 'Niagara'], + ['#073a50', 'Tarawera'], + ['#080110', 'Jaguar'], + ['#081910', 'Black Bean'], + ['#082567', 'Deep Sapphire'], + ['#088370', 'Elf Green'], + ['#08e8de', 'Bright Turquoise'], + ['#092256', 'Downriver'], + ['#09230f', 'Palm Green'], + ['#09255d', 'Madison'], + ['#093624', 'Bottle Green'], + ['#095859', 'Deep Sea Green'], + ['#097f4b', 'Salem'], + ['#0a001c', 'Black Russian'], + ['#0a480d', 'Dark Fern'], + ['#0a6906', 'Japanese Laurel'], + ['#0a6f75', 'Atoll'], + ['#0b0b0b', 'Cod Gray'], + ['#0b0f08', 'Marshland'], + ['#0b1107', 'Gordons Green'], + ['#0b1304', 'Black Forest'], + ['#0b6207', 'San Felix'], + ['#0bda51', 'Malachite'], + ['#0c0b1d', 'Ebony'], + ['#0c0d0f', 'Woodsmoke'], + ['#0c1911', 'Racing Green'], + ['#0c7a79', 'Surfie Green'], + ['#0c8990', 'Blue Chill'], + ['#0d0332', 'Black Rock'], + ['#0d1117', 'Bunker'], + ['#0d1c19', 'Aztec'], + ['#0d2e1c', 'Bush'], + ['#0e0e18', 'Cinder'], + ['#0e2a30', 'Firefly'], + ['#0f2d9e', 'Torea Bay'], + ['#10121d', 'Vulcan'], + ['#101405', 'Green Waterloo'], + ['#105852', 'Eden'], + ['#110c6c', 'Arapawa'], + ['#120a8f', 'Ultramarine'], + ['#123447', 'Elephant'], + ['#126b40', 'Jewel'], + ['#130000', 'Diesel'], + ['#130a06', 'Asphalt'], + ['#13264d', 'Blue Zodiac'], + ['#134f19', 'Parsley'], + ['#140600', 'Nero'], + ['#1450aa', 'Tory Blue'], + ['#151f4c', 'Bunting'], + ['#1560bd', 'Denim'], + ['#15736b', 'Genoa'], + ['#161928', 'Mirage'], + ['#161d10', 'Hunter Green'], + ['#162a40', 'Big Stone'], + ['#163222', 'Celtic'], + ['#16322c', 'Timber Green'], + ['#163531', 'Gable Green'], + ['#171f04', 'Pine Tree'], + ['#175579', 'Chathams Blue'], + ['#182d09', 'Deep Forest Green'], + ['#18587a', 'Blumine'], + ['#19330e', 'Palm Leaf'], + ['#193751', 'Nile Blue'], + ['#1959a8', 'Fun Blue'], + ['#1a1a68', 'Lucky Point'], + ['#1ab385', 'Mountain Meadow'], + ['#1b0245', 'Tolopea'], + ['#1b1035', 'Haiti'], + ['#1b127b', 'Deep Koamaru'], + ['#1b1404', 'Acadia'], + ['#1b2f11', 'Seaweed'], + ['#1b3162', 'Biscay'], + ['#1b659d', 'Matisse'], + ['#1c1208', 'Crowshead'], + ['#1c1e13', 'Rangoon Green'], + ['#1c39bb', 'Persian Blue'], + ['#1c402e', 'Everglade'], + ['#1c7c7d', 'Elm'], + ['#1d6142', 'Green Pea'], + ['#1e0f04', 'Creole'], + ['#1e1609', 'Karaka'], + ['#1e1708', 'El Paso'], + ['#1e385b', 'Cello'], + ['#1e433c', 'Te Papa Green'], + ['#1e90ff', 'Dodger Blue'], + ['#1e9ab0', 'Eastern Blue'], + ['#1f120f', 'Night Rider'], + ['#1fc2c2', 'Java'], + ['#20208d', 'Jacksons Purple'], + ['#202e54', 'Cloud Burst'], + ['#204852', 'Blue Dianne'], + ['#211a0e', 'Eternity'], + ['#220878', 'Deep Blue'], + ['#228b22', 'Forest Green'], + ['#233418', 'Mallard'], + ['#240a40', 'Violet'], + ['#240c02', 'Kilamanjaro'], + ['#242a1d', 'Log Cabin'], + ['#242e16', 'Black Olive'], + ['#24500f', 'Green House'], + ['#251607', 'Graphite'], + ['#251706', 'Cannon Black'], + ['#251f4f', 'Port Gore'], + ['#25272c', 'Shark'], + ['#25311c', 'Green Kelp'], + ['#2596d1', 'Curious Blue'], + ['#260368', 'Paua'], + ['#26056a', 'Paris M'], + ['#261105', 'Wood Bark'], + ['#261414', 'Gondola'], + ['#262335', 'Steel Gray'], + ['#26283b', 'Ebony Clay'], + ['#273a81', 'Bay Of Many'], + ['#27504b', 'Plantation'], + ['#278a5b', 'Eucalyptus'], + ['#281e15', 'Oil'], + ['#283a77', 'Astronaut'], + ['#286acd', 'Mariner'], + ['#290c5e', 'Violent Violet'], + ['#292130', 'Bastille'], + ['#292319', 'Zeus'], + ['#292937', 'Charade'], + ['#297b9a', 'Jelly Bean'], + ['#29ab87', 'Jungle Green'], + ['#2a0359', 'Cherry Pie'], + ['#2a140e', 'Coffee Bean'], + ['#2a2630', 'Baltic Sea'], + ['#2a380b', 'Turtle Green'], + ['#2a52be', 'Cerulean Blue'], + ['#2b0202', 'Sepia Black'], + ['#2b194f', 'Valhalla'], + ['#2b3228', 'Heavy Metal'], + ['#2c0e8c', 'Blue Gem'], + ['#2c1632', 'Revolver'], + ['#2c2133', 'Bleached Cedar'], + ['#2c8c84', 'Lochinvar'], + ['#2d2510', 'Mikado'], + ['#2d383a', 'Outer Space'], + ['#2d569b', 'St Tropaz'], + ['#2e0329', 'Jacaranda'], + ['#2e1905', 'Jacko Bean'], + ['#2e3222', 'Rangitoto'], + ['#2e3f62', 'Rhino'], + ['#2e8b57', 'Sea Green'], + ['#2ebfd4', 'Scooter'], + ['#2f270e', 'Onion'], + ['#2f3cb3', 'Governor Bay'], + ['#2f519e', 'Sapphire'], + ['#2f5a57', 'Spectra'], + ['#2f6168', 'Casal'], + ['#300529', 'Melanzane'], + ['#301f1e', 'Cocoa Brown'], + ['#302a0f', 'Woodrush'], + ['#304b6a', 'San Juan'], + ['#30d5c8', 'Turquoise'], + ['#311c17', 'Eclipse'], + ['#314459', 'Pickled Bluewood'], + ['#315ba1', 'Azure'], + ['#31728d', 'Calypso'], + ['#317d82', 'Paradiso'], + ['#32127a', 'Persian Indigo'], + ['#32293a', 'Blackcurrant'], + ['#323232', 'Mine Shaft'], + ['#325d52', 'Stromboli'], + ['#327c14', 'Bilbao'], + ['#327da0', 'Astral'], + ['#33036b', 'Christalle'], + ['#33292f', 'Thunder'], + ['#33cc99', 'Shamrock'], + ['#341515', 'Tamarind'], + ['#350036', 'Mardi Gras'], + ['#350e42', 'Valentino'], + ['#350e57', 'Jagger'], + ['#353542', 'Tuna'], + ['#354e8c', 'Chambray'], + ['#363050', 'Martinique'], + ['#363534', 'Tuatara'], + ['#363c0d', 'Waiouru'], + ['#36747d', 'Ming'], + ['#368716', 'La Palma'], + ['#370202', 'Chocolate'], + ['#371d09', 'Clinker'], + ['#37290e', 'Brown Tumbleweed'], + ['#373021', 'Birch'], + ['#377475', 'Oracle'], + ['#380474', 'Blue Diamond'], + ['#381a51', 'Grape'], + ['#383533', 'Dune'], + ['#384555', 'Oxford Blue'], + ['#384910', 'Clover'], + ['#394851', 'Limed Spruce'], + ['#396413', 'Dell'], + ['#3a0020', 'Toledo'], + ['#3a2010', 'Sambuca'], + ['#3a2a6a', 'Jacarta'], + ['#3a686c', 'William'], + ['#3a6a47', 'Killarney'], + ['#3ab09e', 'Keppel'], + ['#3b000b', 'Temptress'], + ['#3b0910', 'Aubergine'], + ['#3b1f1f', 'Jon'], + ['#3b2820', 'Treehouse'], + ['#3b7a57', 'Amazon'], + ['#3b91b4', 'Boston Blue'], + ['#3c0878', 'Windsor'], + ['#3c1206', 'Rebel'], + ['#3c1f76', 'Meteorite'], + ['#3c2005', 'Dark Ebony'], + ['#3c3910', 'Camouflage'], + ['#3c4151', 'Bright Gray'], + ['#3c4443', 'Cape Cod'], + ['#3c493a', 'Lunar Green'], + ['#3d0c02', 'Bean '], + ['#3d2b1f', 'Bistre'], + ['#3d7d52', 'Goblin'], + ['#3e0480', 'Kingfisher Daisy'], + ['#3e1c14', 'Cedar'], + ['#3e2b23', 'English Walnut'], + ['#3e2c1c', 'Black Marlin'], + ['#3e3a44', 'Ship Gray'], + ['#3eabbf', 'Pelorous'], + ['#3f2109', 'Bronze'], + ['#3f2500', 'Cola'], + ['#3f3002', 'Madras'], + ['#3f307f', 'Minsk'], + ['#3f4c3a', 'Cabbage Pont'], + ['#3f583b', 'Tom Thumb'], + ['#3f5d53', 'Mineral Green'], + ['#3fc1aa', 'Puerto Rico'], + ['#3fff00', 'Harlequin'], + ['#401801', 'Brown Pod'], + ['#40291d', 'Cork'], + ['#403b38', 'Masala'], + ['#403d19', 'Thatch Green'], + ['#405169', 'Fiord'], + ['#40826d', 'Viridian'], + ['#40a860', 'Chateau Green'], + ['#410056', 'Ripe Plum'], + ['#411f10', 'Paco'], + ['#412010', 'Deep Oak'], + ['#413c37', 'Merlin'], + ['#414257', 'Gun Powder'], + ['#414c7d', 'East Bay'], + ['#4169e1', 'Royal Blue'], + ['#41aa78', 'Ocean Green'], + ['#420303', 'Burnt Maroon'], + ['#423921', 'Lisbon Brown'], + ['#427977', 'Faded Jade'], + ['#431560', 'Scarlet Gum'], + ['#433120', 'Iroko'], + ['#433e37', 'Armadillo'], + ['#434c59', 'River Bed'], + ['#436a0d', 'Green Leaf'], + ['#44012d', 'Barossa'], + ['#441d00', 'Morocco Brown'], + ['#444954', 'Mako'], + ['#454936', 'Kelp'], + ['#456cac', 'San Marino'], + ['#45b1e8', 'Picton Blue'], + ['#460b41', 'Loulou'], + ['#462425', 'Crater Brown'], + ['#465945', 'Gray Asparagus'], + ['#4682b4', 'Steel Blue'], + ['#480404', 'Rustic Red'], + ['#480607', 'Bulgarian Rose'], + ['#480656', 'Clairvoyant'], + ['#481c1c', 'Cocoa Bean'], + ['#483131', 'Woody Brown'], + ['#483c32', 'Taupe'], + ['#49170c', 'Van Cleef'], + ['#492615', 'Brown Derby'], + ['#49371b', 'Metallic Bronze'], + ['#495400', 'Verdun Green'], + ['#496679', 'Blue Bayoux'], + ['#497183', 'Bismark'], + ['#4a2a04', 'Bracken'], + ['#4a3004', 'Deep Bronze'], + ['#4a3c30', 'Mondo'], + ['#4a4244', 'Tundora'], + ['#4a444b', 'Gravel'], + ['#4a4e5a', 'Trout'], + ['#4b0082', 'Pigment Indigo'], + ['#4b5d52', 'Nandor'], + ['#4c3024', 'Saddle'], + ['#4c4f56', 'Abbey'], + ['#4d0135', 'Blackberry'], + ['#4d0a18', 'Cab Sav'], + ['#4d1e01', 'Indian Tan'], + ['#4d282d', 'Cowboy'], + ['#4d282e', 'Livid Brown'], + ['#4d3833', 'Rock'], + ['#4d3d14', 'Punga'], + ['#4d400f', 'Bronzetone'], + ['#4d5328', 'Woodland'], + ['#4e0606', 'Mahogany'], + ['#4e2a5a', 'Bossanova'], + ['#4e3b41', 'Matterhorn'], + ['#4e420c', 'Bronze Olive'], + ['#4e4562', 'Mulled Wine'], + ['#4e6649', 'Axolotl'], + ['#4e7f9e', 'Wedgewood'], + ['#4eabd1', 'Shakespeare'], + ['#4f1c70', 'Honey Flower'], + ['#4f2398', 'Daisy Bush'], + ['#4f69c6', 'Indigo'], + ['#4f7942', 'Fern Green'], + ['#4f9d5d', 'Fruit Salad'], + ['#4fa83d', 'Apple'], + ['#504351', 'Mortar'], + ['#507096', 'Kashmir Blue'], + ['#507672', 'Cutty Sark'], + ['#50c878', 'Emerald'], + ['#514649', 'Emperor'], + ['#516e3d', 'Chalet Green'], + ['#517c66', 'Como'], + ['#51808f', 'Smalt Blue'], + ['#52001f', 'Castro'], + ['#520c17', 'Maroon Oak'], + ['#523c94', 'Gigas'], + ['#533455', 'Voodoo'], + ['#534491', 'Victoria'], + ['#53824b', 'Hippie Green'], + ['#541012', 'Heath'], + ['#544333', 'Judge Gray'], + ['#54534d', 'Fuscous Gray'], + ['#549019', 'Vida Loca'], + ['#55280c', 'Cioccolato'], + ['#555b10', 'Saratoga'], + ['#556d56', 'Finlandia'], + ['#5590d9', 'Havelock Blue'], + ['#56b4be', 'Fountain Blue'], + ['#578363', 'Spring Leaves'], + ['#583401', 'Saddle Brown'], + ['#585562', 'Scarpa Flow'], + ['#587156', 'Cactus'], + ['#589aaf', 'Hippie Blue'], + ['#591d35', 'Wine Berry'], + ['#592804', 'Brown Bramble'], + ['#593737', 'Congo Brown'], + ['#594433', 'Millbrook'], + ['#5a6e9c', 'Waikawa Gray'], + ['#5a87a0', 'Horizon'], + ['#5b3013', 'Jambalaya'], + ['#5c0120', 'Bordeaux'], + ['#5c0536', 'Mulberry Wood'], + ['#5c2e01', 'Carnaby Tan'], + ['#5c5d75', 'Comet'], + ['#5d1e0f', 'Redwood'], + ['#5d4c51', 'Don Juan'], + ['#5d5c58', 'Chicago'], + ['#5d5e37', 'Verdigris'], + ['#5d7747', 'Dingley'], + ['#5da19f', 'Breaker Bay'], + ['#5e483e', 'Kabul'], + ['#5e5d3b', 'Hemlock'], + ['#5f3d26', 'Irish Coffee'], + ['#5f5f6e', 'Mid Gray'], + ['#5f6672', 'Shuttle Gray'], + ['#5fa777', 'Aqua Forest'], + ['#5fb3ac', 'Tradewind'], + ['#604913', 'Horses Neck'], + ['#605b73', 'Smoky'], + ['#606e68', 'Corduroy'], + ['#6093d1', 'Danube'], + ['#612718', 'Espresso'], + ['#614051', 'Eggplant'], + ['#615d30', 'Costa Del Sol'], + ['#61845f', 'Glade Green'], + ['#622f30', 'Buccaneer'], + ['#623f2d', 'Quincy'], + ['#624e9a', 'Butterfly Bush'], + ['#625119', 'West Coast'], + ['#626649', 'Finch'], + ['#639a8f', 'Patina'], + ['#63b76c', 'Fern'], + ['#6456b7', 'Blue Violet'], + ['#646077', 'Dolphin'], + ['#646463', 'Storm Dust'], + ['#646a54', 'Siam'], + ['#646e75', 'Nevada'], + ['#6495ed', 'Cornflower Blue'], + ['#64ccdb', 'Viking'], + ['#65000b', 'Rosewood'], + ['#651a14', 'Cherrywood'], + ['#652dc1', 'Purple Heart'], + ['#657220', 'Fern Frond'], + ['#65745d', 'Willow Grove'], + ['#65869f', 'Hoki'], + ['#660045', 'Pompadour'], + ['#660099', 'Purple'], + ['#66023c', 'Tyrian Purple'], + ['#661010', 'Dark Tan'], + ['#66b58f', 'Silver Tree'], + ['#66ff00', 'Bright Green'], + ['#66ff66', 'Screamin Green'], + ['#67032d', 'Black Rose'], + ['#675fa6', 'Scampi'], + ['#676662', 'Ironside Gray'], + ['#678975', 'Viridian Green'], + ['#67a712', 'Christi'], + ['#683600', 'Nutmeg Wood Finish'], + ['#685558', 'Zambezi'], + ['#685e6e', 'Salt Box'], + ['#692545', 'Tawny Port'], + ['#692d54', 'Finn'], + ['#695f62', 'Scorpion'], + ['#697e9a', 'Lynch'], + ['#6a442e', 'Spice'], + ['#6a5d1b', 'Himalaya'], + ['#6a6051', 'Soya Bean'], + ['#6b2a14', 'Hairy Heath'], + ['#6b3fa0', 'Royal Purple'], + ['#6b4e31', 'Shingle Fawn'], + ['#6b5755', 'Dorado'], + ['#6b8ba2', 'Bermuda Gray'], + ['#6b8e23', 'Olive Drab'], + ['#6c3082', 'Eminence'], + ['#6cdae7', 'Turquoise Blue'], + ['#6d0101', 'Lonestar'], + ['#6d5e54', 'Pine Cone'], + ['#6d6c6c', 'Dove Gray'], + ['#6d9292', 'Juniper'], + ['#6d92a1', 'Gothic'], + ['#6e0902', 'Red Oxide'], + ['#6e1d14', 'Moccaccino'], + ['#6e4826', 'Pickled Bean'], + ['#6e4b26', 'Dallas'], + ['#6e6d57', 'Kokoda'], + ['#6e7783', 'Pale Sky'], + ['#6f440c', 'Cafe Royale'], + ['#6f6a61', 'Flint'], + ['#6f8e63', 'Highland'], + ['#6f9d02', 'Limeade'], + ['#6fd0c5', 'Downy'], + ['#701c1c', 'Persian Plum'], + ['#704214', 'Sepia'], + ['#704a07', 'Antique Bronze'], + ['#704f50', 'Ferra'], + ['#706555', 'Coffee'], + ['#708090', 'Slate Gray'], + ['#711a00', 'Cedar Wood Finish'], + ['#71291d', 'Metallic Copper'], + ['#714693', 'Affair'], + ['#714ab2', 'Studio'], + ['#715d47', 'Tobacco Brown'], + ['#716338', 'Yellow Metal'], + ['#716b56', 'Peat'], + ['#716e10', 'Olivetone'], + ['#717486', 'Storm Gray'], + ['#718080', 'Sirocco'], + ['#71d9e2', 'Aquamarine Blue'], + ['#72010f', 'Venetian Red'], + ['#724a2f', 'Old Copper'], + ['#726d4e', 'Go Ben'], + ['#727b89', 'Raven'], + ['#731e8f', 'Seance'], + ['#734a12', 'Raw Umber'], + ['#736c9f', 'Kimberly'], + ['#736d58', 'Crocodile'], + ['#737829', 'Crete'], + ['#738678', 'Xanadu'], + ['#74640d', 'Spicy Mustard'], + ['#747d63', 'Limed Ash'], + ['#747d83', 'Rolling Stone'], + ['#748881', 'Blue Smoke'], + ['#749378', 'Laurel'], + ['#74c365', 'Mantis'], + ['#755a57', 'Russett'], + ['#7563a8', 'Deluge'], + ['#76395d', 'Cosmic'], + ['#7666c6', 'Blue Marguerite'], + ['#76bd17', 'Lima'], + ['#76d7ea', 'Sky Blue'], + ['#770f05', 'Dark Burgundy'], + ['#771f1f', 'Crown Of Thorns'], + ['#773f1a', 'Walnut'], + ['#776f61', 'Pablo'], + ['#778120', 'Pacifika'], + ['#779e86', 'Oxley'], + ['#77dd77', 'Pastel Green'], + ['#780109', 'Japanese Maple'], + ['#782d19', 'Mocha'], + ['#782f16', 'Peanut'], + ['#78866b', 'Camouflage Green'], + ['#788a25', 'Wasabi'], + ['#788bba', 'Ship Cove'], + ['#78a39c', 'Sea Nymph'], + ['#795d4c', 'Roman Coffee'], + ['#796878', 'Old Lavender'], + ['#796989', 'Rum'], + ['#796a78', 'Fedora'], + ['#796d62', 'Sandstone'], + ['#79deec', 'Spray'], + ['#7a013a', 'Siren'], + ['#7a58c1', 'Fuchsia Blue'], + ['#7a7a7a', 'Boulder'], + ['#7a89b8', 'Wild Blue Yonder'], + ['#7ac488', 'De York'], + ['#7b3801', 'Red Beech'], + ['#7b3f00', 'Cinnamon'], + ['#7b6608', 'Yukon Gold'], + ['#7b7874', 'Tapa'], + ['#7b7c94', 'Waterloo '], + ['#7b8265', 'Flax Smoke'], + ['#7b9f80', 'Amulet'], + ['#7ba05b', 'Asparagus'], + ['#7c1c05', 'Kenyan Copper'], + ['#7c7631', 'Pesto'], + ['#7c778a', 'Topaz'], + ['#7c7b7a', 'Concord'], + ['#7c7b82', 'Jumbo'], + ['#7c881a', 'Trendy Green'], + ['#7ca1a6', 'Gumbo'], + ['#7cb0a1', 'Acapulco'], + ['#7cb7bb', 'Neptune'], + ['#7d2c14', 'Pueblo'], + ['#7da98d', 'Bay Leaf'], + ['#7dc8f7', 'Malibu'], + ['#7dd8c6', 'Bermuda'], + ['#7e3a15', 'Copper Canyon'], + ['#7f1734', 'Claret'], + ['#7f3a02', 'Peru Tan'], + ['#7f626d', 'Falcon'], + ['#7f7589', 'Mobster'], + ['#7f76d3', 'Moody Blue'], + ['#7fff00', 'Chartreuse'], + ['#7fffd4', 'Aquamarine'], + ['#800000', 'Maroon'], + ['#800b47', 'Rose Bud Cherry'], + ['#801818', 'Falu Red'], + ['#80341f', 'Red Robin'], + ['#803790', 'Vivid Violet'], + ['#80461b', 'Russet'], + ['#807e79', 'Friar Gray'], + ['#808000', 'Olive'], + ['#808080', 'Gray'], + ['#80b3ae', 'Gulf Stream'], + ['#80b3c4', 'Glacier'], + ['#80ccea', 'Seagull'], + ['#81422c', 'Nutmeg'], + ['#816e71', 'Spicy Pink'], + ['#817377', 'Empress'], + ['#819885', 'Spanish Green'], + ['#826f65', 'Sand Dune'], + ['#828685', 'Gunsmoke'], + ['#828f72', 'Battleship Gray'], + ['#831923', 'Merlot'], + ['#837050', 'Shadow'], + ['#83aa5d', 'Chelsea Cucumber'], + ['#83d0c6', 'Monte Carlo'], + ['#843179', 'Plum'], + ['#84a0a0', 'Granny Smith'], + ['#8581d9', 'Chetwode Blue'], + ['#858470', 'Bandicoot'], + ['#859faf', 'Bali Hai'], + ['#85c4cc', 'Half Baked'], + ['#860111', 'Red Devil'], + ['#863c3c', 'Lotus'], + ['#86483c', 'Ironstone'], + ['#864d1e', 'Bull Shot'], + ['#86560a', 'Rusty Nail'], + ['#868974', 'Bitter'], + ['#86949f', 'Regent Gray'], + ['#871550', 'Disco'], + ['#87756e', 'Americano'], + ['#877c7b', 'Hurricane'], + ['#878d91', 'Oslo Gray'], + ['#87ab39', 'Sushi'], + ['#885342', 'Spicy Mix'], + ['#886221', 'Kumera'], + ['#888387', 'Suva Gray'], + ['#888d65', 'Avocado'], + ['#893456', 'Camelot'], + ['#893843', 'Solid Pink'], + ['#894367', 'Cannon Pink'], + ['#897d6d', 'Makara'], + ['#8a3324', 'Burnt Umber'], + ['#8a73d6', 'True V'], + ['#8a8360', 'Clay Creek'], + ['#8a8389', 'Monsoon'], + ['#8a8f8a', 'Stack'], + ['#8ab9f1', 'Jordy Blue'], + ['#8b00ff', 'Electric Violet'], + ['#8b0723', 'Monarch'], + ['#8b6b0b', 'Corn Harvest'], + ['#8b8470', 'Olive Haze'], + ['#8b847e', 'Schooner'], + ['#8b8680', 'Natural Gray'], + ['#8b9c90', 'Mantle'], + ['#8b9fee', 'Portage'], + ['#8ba690', 'Envy'], + ['#8ba9a5', 'Cascade'], + ['#8be6d8', 'Riptide'], + ['#8c055e', 'Cardinal Pink'], + ['#8c472f', 'Mule Fawn'], + ['#8c5738', 'Potters Clay'], + ['#8c6495', 'Trendy Pink'], + ['#8d0226', 'Paprika'], + ['#8d3d38', 'Sanguine Brown'], + ['#8d3f3f', 'Tosca'], + ['#8d7662', 'Cement'], + ['#8d8974', 'Granite Green'], + ['#8d90a1', 'Manatee'], + ['#8da8cc', 'Polo Blue'], + ['#8e0000', 'Red Berry'], + ['#8e4d1e', 'Rope'], + ['#8e6f70', 'Opium'], + ['#8e775e', 'Domino'], + ['#8e8190', 'Mamba'], + ['#8eabc1', 'Nepal'], + ['#8f021c', 'Pohutukawa'], + ['#8f3e33', 'El Salva'], + ['#8f4b0e', 'Korma'], + ['#8f8176', 'Squirrel'], + ['#8fd6b4', 'Vista Blue'], + ['#900020', 'Burgundy'], + ['#901e1e', 'Old Brick'], + ['#907874', 'Hemp'], + ['#907b71', 'Almond Frost'], + ['#908d39', 'Sycamore'], + ['#92000a', 'Sangria'], + ['#924321', 'Cumin'], + ['#926f5b', 'Beaver'], + ['#928573', 'Stonewall'], + ['#928590', 'Venus'], + ['#9370db', 'Medium Purple'], + ['#93ccea', 'Cornflower'], + ['#93dfb8', 'Algae Green'], + ['#944747', 'Copper Rust'], + ['#948771', 'Arrowtown'], + ['#950015', 'Scarlett'], + ['#956387', 'Strikemaster'], + ['#959396', 'Mountain Mist'], + ['#960018', 'Carmine'], + ['#964b00', 'Brown'], + ['#967059', 'Leather'], + ['#9678b6', "Purple Mountain's Majesty"], + ['#967bb6', 'Lavender Purple'], + ['#96a8a1', 'Pewter'], + ['#96bbab', 'Summer Green'], + ['#97605d', 'Au Chico'], + ['#9771b5', 'Wisteria'], + ['#97cd2d', 'Atlantis'], + ['#983d61', 'Vin Rouge'], + ['#9874d3', 'Lilac Bush'], + ['#98777b', 'Bazaar'], + ['#98811b', 'Hacienda'], + ['#988d77', 'Pale Oyster'], + ['#98ff98', 'Mint Green'], + ['#990066', 'Fresh Eggplant'], + ['#991199', 'Violet Eggplant'], + ['#991613', 'Tamarillo'], + ['#991b07', 'Totem Pole'], + ['#996666', 'Copper Rose'], + ['#9966cc', 'Amethyst'], + ['#997a8d', 'Mountbatten Pink'], + ['#9999cc', 'Blue Bell'], + ['#9a3820', 'Prairie Sand'], + ['#9a6e61', 'Toast'], + ['#9a9577', 'Gurkha'], + ['#9ab973', 'Olivine'], + ['#9ac2b8', 'Shadow Green'], + ['#9b4703', 'Oregon'], + ['#9b9e8f', 'Lemon Grass'], + ['#9c3336', 'Stiletto'], + ['#9d5616', 'Hawaiian Tan'], + ['#9dacb7', 'Gull Gray'], + ['#9dc209', 'Pistachio'], + ['#9de093', 'Granny Smith Apple'], + ['#9de5ff', 'Anakiwa'], + ['#9e5302', 'Chelsea Gem'], + ['#9e5b40', 'Sepia Skin'], + ['#9ea587', 'Sage'], + ['#9ea91f', 'Citron'], + ['#9eb1cd', 'Rock Blue'], + ['#9edee0', 'Morning Glory'], + ['#9f381d', 'Cognac'], + ['#9f821c', 'Reef Gold'], + ['#9f9f9c', 'Star Dust'], + ['#9fa0b1', 'Santas Gray'], + ['#9fd7d3', 'Sinbad'], + ['#9fdd8c', 'Feijoa'], + ['#a02712', 'Tabasco'], + ['#a1750d', 'Buttered Rum'], + ['#a1adb5', 'Hit Gray'], + ['#a1c50a', 'Citrus'], + ['#a1dad7', 'Aqua Island'], + ['#a1e9de', 'Water Leaf'], + ['#a2006d', 'Flirt'], + ['#a23b6c', 'Rouge'], + ['#a26645', 'Cape Palliser'], + ['#a2aab3', 'Gray Chateau'], + ['#a2aeab', 'Edward'], + ['#a3807b', 'Pharlap'], + ['#a397b4', 'Amethyst Smoke'], + ['#a3e3ed', 'Blizzard Blue'], + ['#a4a49d', 'Delta'], + ['#a4a6d3', 'Wistful'], + ['#a4af6e', 'Green Smoke'], + ['#a50b5e', 'Jazzberry Jam'], + ['#a59b91', 'Zorba'], + ['#a5cb0c', 'Bahia'], + ['#a62f20', 'Roof Terracotta'], + ['#a65529', 'Paarl'], + ['#a68b5b', 'Barley Corn'], + ['#a69279', 'Donkey Brown'], + ['#a6a29a', 'Dawn'], + ['#a72525', 'Mexican Red'], + ['#a7882c', 'Luxor Gold'], + ['#a85307', 'Rich Gold'], + ['#a86515', 'Reno Sand'], + ['#a86b6b', 'Coral Tree'], + ['#a8989b', 'Dusty Gray'], + ['#a899e6', 'Dull Lavender'], + ['#a8a589', 'Tallow'], + ['#a8ae9c', 'Bud'], + ['#a8af8e', 'Locust'], + ['#a8bd9f', 'Norway'], + ['#a8e3bd', 'Chinook'], + ['#a9a491', 'Gray Olive'], + ['#a9acb6', 'Aluminium'], + ['#a9b2c3', 'Cadet Blue'], + ['#a9b497', 'Schist'], + ['#a9bdbf', 'Tower Gray'], + ['#a9bef2', 'Perano'], + ['#a9c6c2', 'Opal'], + ['#aa375a', 'Night Shadz'], + ['#aa4203', 'Fire'], + ['#aa8b5b', 'Muesli'], + ['#aa8d6f', 'Sandal'], + ['#aaa5a9', 'Shady Lady'], + ['#aaa9cd', 'Logan'], + ['#aaabb7', 'Spun Pearl'], + ['#aad6e6', 'Regent St Blue'], + ['#aaf0d1', 'Magic Mint'], + ['#ab0563', 'Lipstick'], + ['#ab3472', 'Royal Heath'], + ['#ab917a', 'Sandrift'], + ['#aba0d9', 'Cold Purple'], + ['#aba196', 'Bronco'], + ['#ac8a56', 'Limed Oak'], + ['#ac91ce', 'East Side'], + ['#ac9e22', 'Lemon Ginger'], + ['#aca494', 'Napa'], + ['#aca586', 'Hillary'], + ['#aca59f', 'Cloudy'], + ['#acacac', 'Silver Chalice'], + ['#acb78e', 'Swamp Green'], + ['#accbb1', 'Spring Rain'], + ['#acdd4d', 'Conifer'], + ['#ace1af', 'Celadon'], + ['#ad781b', 'Mandalay'], + ['#adbed1', 'Casper'], + ['#addfad', 'Moss Green'], + ['#ade6c4', 'Padua'], + ['#adff2f', 'Green Yellow'], + ['#ae4560', 'Hippie Pink'], + ['#ae6020', 'Desert'], + ['#ae809e', 'Bouquet'], + ['#af4035', 'Medium Carmine'], + ['#af4d43', 'Apple Blossom'], + ['#af593e', 'Brown Rust'], + ['#af8751', 'Driftwood'], + ['#af8f2c', 'Alpine'], + ['#af9f1c', 'Lucky'], + ['#afa09e', 'Martini'], + ['#afb1b8', 'Bombay'], + ['#afbdd9', 'Pigeon Post'], + ['#b04c6a', 'Cadillac'], + ['#b05d54', 'Matrix'], + ['#b05e81', 'Tapestry'], + ['#b06608', 'Mai Tai'], + ['#b09a95', 'Del Rio'], + ['#b0e0e6', 'Powder Blue'], + ['#b0e313', 'Inch Worm'], + ['#b10000', 'Bright Red'], + ['#b14a0b', 'Vesuvius'], + ['#b1610b', 'Pumpkin Skin'], + ['#b16d52', 'Santa Fe'], + ['#b19461', 'Teak'], + ['#b1e2c1', 'Fringy Flower'], + ['#b1f4e7', 'Ice Cold'], + ['#b20931', 'Shiraz'], + ['#b2a1ea', 'Biloba Flower'], + ['#b32d29', 'Tall Poppy'], + ['#b35213', 'Fiery Orange'], + ['#b38007', 'Hot Toddy'], + ['#b3af95', 'Taupe Gray'], + ['#b3c110', 'La Rioja'], + ['#b43332', 'Well Read'], + ['#b44668', 'Blush'], + ['#b4cfd3', 'Jungle Mist'], + ['#b57281', 'Turkish Rose'], + ['#b57edc', 'Lavender'], + ['#b5a27f', 'Mongoose'], + ['#b5b35c', 'Olive Green'], + ['#b5d2ce', 'Jet Stream'], + ['#b5ecdf', 'Cruise'], + ['#b6316c', 'Hibiscus'], + ['#b69d98', 'Thatch'], + ['#b6b095', 'Heathered Gray'], + ['#b6baa4', 'Eagle'], + ['#b6d1ea', 'Spindle'], + ['#b6d3bf', 'Gum Leaf'], + ['#b7410e', 'Rust'], + ['#b78e5c', 'Muddy Waters'], + ['#b7a214', 'Sahara'], + ['#b7a458', 'Husk'], + ['#b7b1b1', 'Nobel'], + ['#b7c3d0', 'Heather'], + ['#b7f0be', 'Madang'], + ['#b81104', 'Milano Red'], + ['#b87333', 'Copper'], + ['#b8b56a', 'Gimblet'], + ['#b8c1b1', 'Green Spring'], + ['#b8c25d', 'Celery'], + ['#b8e0f9', 'Sail'], + ['#b94e48', 'Chestnut'], + ['#b95140', 'Crail'], + ['#b98d28', 'Marigold'], + ['#b9c46a', 'Wild Willow'], + ['#b9c8ac', 'Rainee'], + ['#ba0101', 'Guardsman Red'], + ['#ba450c', 'Rock Spray'], + ['#ba6f1e', 'Bourbon'], + ['#ba7f03', 'Pirate Gold'], + ['#bab1a2', 'Nomad'], + ['#bac7c9', 'Submarine'], + ['#baeef9', 'Charlotte'], + ['#bb3385', 'Medium Red Violet'], + ['#bb8983', 'Brandy Rose'], + ['#bbd009', 'Rio Grande'], + ['#bbd7c1', 'Surf'], + ['#bcc9c2', 'Powder Ash'], + ['#bd5e2e', 'Tuscany'], + ['#bd978e', 'Quicksand'], + ['#bdb1a8', 'Silk'], + ['#bdb2a1', 'Malta'], + ['#bdb3c7', 'Chatelle'], + ['#bdbbd7', 'Lavender Gray'], + ['#bdbdc6', 'French Gray'], + ['#bdc8b3', 'Clay Ash'], + ['#bdc9ce', 'Loblolly'], + ['#bdedfd', 'French Pass'], + ['#bea6c3', 'London Hue'], + ['#beb5b7', 'Pink Swan'], + ['#bede0d', 'Fuego'], + ['#bf5500', 'Rose Of Sharon'], + ['#bfb8b0', 'Tide'], + ['#bfbed8', 'Blue Haze'], + ['#bfc1c2', 'Silver Sand'], + ['#bfc921', 'Key Lime Pie'], + ['#bfdbe2', 'Ziggurat'], + ['#bfff00', 'Lime'], + ['#c02b18', 'Thunderbird'], + ['#c04737', 'Mojo'], + ['#c08081', 'Old Rose'], + ['#c0c0c0', 'Silver'], + ['#c0d3b9', 'Pale Leaf'], + ['#c0d8b6', 'Pixie Green'], + ['#c1440e', 'Tia Maria'], + ['#c154c1', 'Fuchsia Pink'], + ['#c1a004', 'Buddha Gold'], + ['#c1b7a4', 'Bison Hide'], + ['#c1bab0', 'Tea'], + ['#c1becd', 'Gray Suit'], + ['#c1d7b0', 'Sprout'], + ['#c1f07c', 'Sulu'], + ['#c26b03', 'Indochine'], + ['#c2955d', 'Twine'], + ['#c2bdb6', 'Cotton Seed'], + ['#c2cac4', 'Pumice'], + ['#c2e8e5', 'Jagged Ice'], + ['#c32148', 'Maroon Flush'], + ['#c3b091', 'Indian Khaki'], + ['#c3bfc1', 'Pale Slate'], + ['#c3c3bd', 'Gray Nickel'], + ['#c3cde6', 'Periwinkle Gray'], + ['#c3d1d1', 'Tiara'], + ['#c3ddf9', 'Tropical Blue'], + ['#c41e3a', 'Cardinal'], + ['#c45655', 'Fuzzy Wuzzy Brown'], + ['#c45719', 'Orange Roughy'], + ['#c4c4bc', 'Mist Gray'], + ['#c4d0b0', 'Coriander'], + ['#c4f4eb', 'Mint Tulip'], + ['#c54b8c', 'Mulberry'], + ['#c59922', 'Nugget'], + ['#c5994b', 'Tussock'], + ['#c5dbca', 'Sea Mist'], + ['#c5e17a', 'Yellow Green'], + ['#c62d42', 'Brick Red'], + ['#c6726b', 'Contessa'], + ['#c69191', 'Oriental Pink'], + ['#c6a84b', 'Roti'], + ['#c6c3b5', 'Ash'], + ['#c6c8bd', 'Kangaroo'], + ['#c6e610', 'Las Palmas'], + ['#c7031e', 'Monza'], + ['#c71585', 'Red Violet'], + ['#c7bca2', 'Coral Reef'], + ['#c7c1ff', 'Melrose'], + ['#c7c4bf', 'Cloud'], + ['#c7c9d5', 'Ghost'], + ['#c7cd90', 'Pine Glade'], + ['#c7dde5', 'Botticelli'], + ['#c88a65', 'Antique Brass'], + ['#c8a2c8', 'Lilac'], + ['#c8a528', 'Hokey Pokey'], + ['#c8aabf', 'Lily'], + ['#c8b568', 'Laser'], + ['#c8e3d7', 'Edgewater'], + ['#c96323', 'Piper'], + ['#c99415', 'Pizza'], + ['#c9a0dc', 'Light Wisteria'], + ['#c9b29b', 'Rodeo Dust'], + ['#c9b35b', 'Sundance'], + ['#c9b93b', 'Earls Green'], + ['#c9c0bb', 'Silver Rust'], + ['#c9d9d2', 'Conch'], + ['#c9ffa2', 'Reef'], + ['#c9ffe5', 'Aero Blue'], + ['#ca3435', 'Flush Mahogany'], + ['#cabb48', 'Turmeric'], + ['#cadcd4', 'Paris White'], + ['#cae00d', 'Bitter Lemon'], + ['#cae6da', 'Skeptic'], + ['#cb8fa9', 'Viola'], + ['#cbcab6', 'Foggy Gray'], + ['#cbd3b0', 'Green Mist'], + ['#cbdbd6', 'Nebula'], + ['#cc3333', 'Persian Red'], + ['#cc5500', 'Burnt Orange'], + ['#cc7722', 'Ochre'], + ['#cc8899', 'Puce'], + ['#cccaa8', 'Thistle Green'], + ['#ccccff', 'Periwinkle'], + ['#ccff00', 'Electric Lime'], + ['#cd5700', 'Tenn'], + ['#cd5c5c', 'Chestnut Rose'], + ['#cd8429', 'Brandy Punch'], + ['#cdf4ff', 'Onahau'], + ['#ceb98f', 'Sorrell Brown'], + ['#cebaba', 'Cold Turkey'], + ['#cec291', 'Yuma'], + ['#cec7a7', 'Chino'], + ['#cfa39d', 'Eunry'], + ['#cfb53b', 'Old Gold'], + ['#cfdccf', 'Tasman'], + ['#cfe5d2', 'Surf Crest'], + ['#cff9f3', 'Humming Bird'], + ['#cffaf4', 'Scandal'], + ['#d05f04', 'Red Stage'], + ['#d06da1', 'Hopbush'], + ['#d07d12', 'Meteor'], + ['#d0bef8', 'Perfume'], + ['#d0c0e5', 'Prelude'], + ['#d0f0c0', 'Tea Green'], + ['#d18f1b', 'Geebung'], + ['#d1bea8', 'Vanilla'], + ['#d1c6b4', 'Soft Amber'], + ['#d1d2ca', 'Celeste'], + ['#d1d2dd', 'Mischka'], + ['#d1e231', 'Pear'], + ['#d2691e', 'Hot Cinnamon'], + ['#d27d46', 'Raw Sienna'], + ['#d29eaa', 'Careys Pink'], + ['#d2b48c', 'Tan'], + ['#d2da97', 'Deco'], + ['#d2f6de', 'Blue Romance'], + ['#d2f8b0', 'Gossip'], + ['#d3cbba', 'Sisal'], + ['#d3cdc5', 'Swirl'], + ['#d47494', 'Charm'], + ['#d4b6af', 'Clam Shell'], + ['#d4bf8d', 'Straw'], + ['#d4c4a8', 'Akaroa'], + ['#d4cd16', 'Bird Flower'], + ['#d4d7d9', 'Iron'], + ['#d4dfe2', 'Geyser'], + ['#d4e2fc', 'Hawkes Blue'], + ['#d54600', 'Grenadier'], + ['#d591a4', 'Can Can'], + ['#d59a6f', 'Whiskey'], + ['#d5d195', 'Winter Hazel'], + ['#d5f6e3', 'Granny Apple'], + ['#d69188', 'My Pink'], + ['#d6c562', 'Tacha'], + ['#d6cef6', 'Moon Raker'], + ['#d6d6d1', 'Quill Gray'], + ['#d6ffdb', 'Snowy Mint'], + ['#d7837f', 'New York Pink'], + ['#d7c498', 'Pavlova'], + ['#d7d0ff', 'Fog'], + ['#d84437', 'Valencia'], + ['#d87c63', 'Japonica'], + ['#d8bfd8', 'Thistle'], + ['#d8c2d5', 'Maverick'], + ['#d8fcfa', 'Foam'], + ['#d94972', 'Cabaret'], + ['#d99376', 'Burning Sand'], + ['#d9b99b', 'Cameo'], + ['#d9d6cf', 'Timberwolf'], + ['#d9dcc1', 'Tana'], + ['#d9e4f5', 'Link Water'], + ['#d9f7ff', 'Mabel'], + ['#da3287', 'Cerise'], + ['#da5b38', 'Flame Pea'], + ['#da6304', 'Bamboo'], + ['#da6a41', 'Red Damask'], + ['#da70d6', 'Orchid'], + ['#da8a67', 'Copperfield'], + ['#daa520', 'Golden Grass'], + ['#daecd6', 'Zanah'], + ['#daf4f0', 'Iceberg'], + ['#dafaff', 'Oyster Bay'], + ['#db5079', 'Cranberry'], + ['#db9690', 'Petite Orchid'], + ['#db995e', 'Di Serria'], + ['#dbdbdb', 'Alto'], + ['#dbfff8', 'Frosted Mint'], + ['#dc143c', 'Crimson'], + ['#dc4333', 'Punch'], + ['#dcb20c', 'Galliano'], + ['#dcb4bc', 'Blossom'], + ['#dcd747', 'Wattle'], + ['#dcd9d2', 'Westar'], + ['#dcddcc', 'Moon Mist'], + ['#dcedb4', 'Caper'], + ['#dcf0ea', 'Swans Down'], + ['#ddd6d5', 'Swiss Coffee'], + ['#ddf9f1', 'White Ice'], + ['#de3163', 'Cerise Red'], + ['#de6360', 'Roman'], + ['#dea681', 'Tumbleweed'], + ['#deba13', 'Gold Tips'], + ['#dec196', 'Brandy'], + ['#decbc6', 'Wafer'], + ['#ded4a4', 'Sapling'], + ['#ded717', 'Barberry'], + ['#dee5c0', 'Beryl Green'], + ['#def5ff', 'Pattens Blue'], + ['#df73ff', 'Heliotrope'], + ['#dfbe6f', 'Apache'], + ['#dfcd6f', 'Chenin'], + ['#dfcfdb', 'Lola'], + ['#dfecda', 'Willow Brook'], + ['#dfff00', 'Chartreuse Yellow'], + ['#e0b0ff', 'Mauve'], + ['#e0b646', 'Anzac'], + ['#e0b974', 'Harvest Gold'], + ['#e0c095', 'Calico'], + ['#e0ffff', 'Baby Blue'], + ['#e16865', 'Sunglo'], + ['#e1bc64', 'Equator'], + ['#e1c0c8', 'Pink Flare'], + ['#e1e6d6', 'Periglacial Blue'], + ['#e1ead4', 'Kidnapper'], + ['#e1f6e8', 'Tara'], + ['#e25465', 'Mandy'], + ['#e2725b', 'Terracotta'], + ['#e28913', 'Golden Bell'], + ['#e292c0', 'Shocking'], + ['#e29418', 'Dixie'], + ['#e29cd2', 'Light Orchid'], + ['#e2d8ed', 'Snuff'], + ['#e2ebed', 'Mystic'], + ['#e2f3ec', 'Apple Green'], + ['#e30b5c', 'Razzmatazz'], + ['#e32636', 'Alizarin Crimson'], + ['#e34234', 'Cinnabar'], + ['#e3bebe', 'Cavern Pink'], + ['#e3f5e1', 'Peppermint'], + ['#e3f988', 'Mindaro'], + ['#e47698', 'Deep Blush'], + ['#e49b0f', 'Gamboge'], + ['#e4c2d5', 'Melanie'], + ['#e4cfde', 'Twilight'], + ['#e4d1c0', 'Bone'], + ['#e4d422', 'Sunflower'], + ['#e4d5b7', 'Grain Brown'], + ['#e4d69b', 'Zombie'], + ['#e4f6e7', 'Frostee'], + ['#e4ffd1', 'Snow Flurry'], + ['#e52b50', 'Amaranth'], + ['#e5841b', 'Zest'], + ['#e5ccc9', 'Dust Storm'], + ['#e5d7bd', 'Stark White'], + ['#e5d8af', 'Hampton'], + ['#e5e0e1', 'Bon Jour'], + ['#e5e5e5', 'Mercury'], + ['#e5f9f6', 'Polar'], + ['#e64e03', 'Trinidad'], + ['#e6be8a', 'Gold Sand'], + ['#e6bea5', 'Cashmere'], + ['#e6d7b9', 'Double Spanish White'], + ['#e6e4d4', 'Satin Linen'], + ['#e6f2ea', 'Harp'], + ['#e6f8f3', 'Off Green'], + ['#e6ffe9', 'Hint Of Green'], + ['#e6ffff', 'Tranquil'], + ['#e77200', 'Mango Tango'], + ['#e7730a', 'Christine'], + ['#e79f8c', 'Tonys Pink'], + ['#e79fc4', 'Kobi'], + ['#e7bcb4', 'Rose Fog'], + ['#e7bf05', 'Corn'], + ['#e7cd8c', 'Putty'], + ['#e7ece6', 'Gray Nurse'], + ['#e7f8ff', 'Lily White'], + ['#e7feff', 'Bubbles'], + ['#e89928', 'Fire Bush'], + ['#e8b9b3', 'Shilo'], + ['#e8e0d5', 'Pearl Bush'], + ['#e8ebe0', 'Green White'], + ['#e8f1d4', 'Chrome White'], + ['#e8f2eb', 'Gin'], + ['#e8f5f2', 'Aqua Squeeze'], + ['#e96e00', 'Clementine'], + ['#e97451', 'Burnt Sienna'], + ['#e97c07', 'Tahiti Gold'], + ['#e9cecd', 'Oyster Pink'], + ['#e9d75a', 'Confetti'], + ['#e9e3e3', 'Ebb'], + ['#e9f8ed', 'Ottoman'], + ['#e9fffd', 'Clear Day'], + ['#ea88a8', 'Carissma'], + ['#eaae69', 'Porsche'], + ['#eab33b', 'Tulip Tree'], + ['#eac674', 'Rob Roy'], + ['#eadab8', 'Raffia'], + ['#eae8d4', 'White Rock'], + ['#eaf6ee', 'Panache'], + ['#eaf6ff', 'Solitude'], + ['#eaf9f5', 'Aqua Spring'], + ['#eafffe', 'Dew'], + ['#eb9373', 'Apricot'], + ['#ebc2af', 'Zinnwaldite'], + ['#eca927', 'Fuel Yellow'], + ['#ecc54e', 'Ronchi'], + ['#ecc7ee', 'French Lilac'], + ['#eccdb9', 'Just Right'], + ['#ece090', 'Wild Rice'], + ['#ecebbd', 'Fall Green'], + ['#ecebce', 'Aths Special'], + ['#ecf245', 'Starship'], + ['#ed0a3f', 'Red Ribbon'], + ['#ed7a1c', 'Tango'], + ['#ed9121', 'Carrot Orange'], + ['#ed989e', 'Sea Pink'], + ['#edb381', 'Tacao'], + ['#edc9af', 'Desert Sand'], + ['#edcdab', 'Pancho'], + ['#eddcb1', 'Chamois'], + ['#edea99', 'Primrose'], + ['#edf5dd', 'Frost'], + ['#edf5f5', 'Aqua Haze'], + ['#edf6ff', 'Zumthor'], + ['#edf9f1', 'Narvik'], + ['#edfc84', 'Honeysuckle'], + ['#ee82ee', 'Lavender Magenta'], + ['#eec1be', 'Beauty Bush'], + ['#eed794', 'Chalky'], + ['#eed9c4', 'Almond'], + ['#eedc82', 'Flax'], + ['#eededa', 'Bizarre'], + ['#eee3ad', 'Double Colonial White'], + ['#eeeee8', 'Cararra'], + ['#eeef78', 'Manz'], + ['#eef0c8', 'Tahuna Sands'], + ['#eef0f3', 'Athens Gray'], + ['#eef3c3', 'Tusk'], + ['#eef4de', 'Loafer'], + ['#eef6f7', 'Catskill White'], + ['#eefdff', 'Twilight Blue'], + ['#eeff9a', 'Jonquil'], + ['#eeffe2', 'Rice Flower'], + ['#ef863f', 'Jaffa'], + ['#efefef', 'Gallery'], + ['#eff2f3', 'Porcelain'], + ['#f091a9', 'Mauvelous'], + ['#f0d52d', 'Golden Dream'], + ['#f0db7d', 'Golden Sand'], + ['#f0dc82', 'Buff'], + ['#f0e2ec', 'Prim'], + ['#f0e68c', 'Khaki'], + ['#f0eefd', 'Selago'], + ['#f0eeff', 'Titan White'], + ['#f0f8ff', 'Alice Blue'], + ['#f0fcea', 'Feta'], + ['#f18200', 'Gold Drop'], + ['#f19bab', 'Wewak'], + ['#f1e788', 'Sahara Sand'], + ['#f1e9d2', 'Parchment'], + ['#f1e9ff', 'Blue Chalk'], + ['#f1eec1', 'Mint Julep'], + ['#f1f1f1', 'Seashell'], + ['#f1f7f2', 'Saltpan'], + ['#f1ffad', 'Tidal'], + ['#f1ffc8', 'Chiffon'], + ['#f2552a', 'Flamingo'], + ['#f28500', 'Tangerine'], + ['#f2c3b2', 'Mandys Pink'], + ['#f2f2f2', 'Concrete'], + ['#f2fafa', 'Black Squeeze'], + ['#f34723', 'Pomegranate'], + ['#f3ad16', 'Buttercup'], + ['#f3d69d', 'New Orleans'], + ['#f3d9df', 'Vanilla Ice'], + ['#f3e7bb', 'Sidecar'], + ['#f3e9e5', 'Dawn Pink'], + ['#f3edcf', 'Wheatfield'], + ['#f3fb62', 'Canary'], + ['#f3fbd4', 'Orinoco'], + ['#f3ffd8', 'Carla'], + ['#f400a1', 'Hollywood Cerise'], + ['#f4a460', 'Sandy brown'], + ['#f4c430', 'Saffron'], + ['#f4d81c', 'Ripe Lemon'], + ['#f4ebd3', 'Janna'], + ['#f4f2ee', 'Pampas'], + ['#f4f4f4', 'Wild Sand'], + ['#f4f8ff', 'Zircon'], + ['#f57584', 'Froly'], + ['#f5c85c', 'Cream Can'], + ['#f5c999', 'Manhattan'], + ['#f5d5a0', 'Maize'], + ['#f5deb3', 'Wheat'], + ['#f5e7a2', 'Sandwisp'], + ['#f5e7e2', 'Pot Pourri'], + ['#f5e9d3', 'Albescent White'], + ['#f5edef', 'Soft Peach'], + ['#f5f3e5', 'Ecru White'], + ['#f5f5dc', 'Beige'], + ['#f5fb3d', 'Golden Fizz'], + ['#f5ffbe', 'Australian Mint'], + ['#f64a8a', 'French Rose'], + ['#f653a6', 'Brilliant Rose'], + ['#f6a4c9', 'Illusion'], + ['#f6f0e6', 'Merino'], + ['#f6f7f7', 'Black Haze'], + ['#f6ffdc', 'Spring Sun'], + ['#f7468a', 'Violet Red'], + ['#f77703', 'Chilean Fire'], + ['#f77fbe', 'Persian Pink'], + ['#f7b668', 'Rajah'], + ['#f7c8da', 'Azalea'], + ['#f7dbe6', 'We Peep'], + ['#f7f2e1', 'Quarter Spanish White'], + ['#f7f5fa', 'Whisper'], + ['#f7faf7', 'Snow Drift'], + ['#f8b853', 'Casablanca'], + ['#f8c3df', 'Chantilly'], + ['#f8d9e9', 'Cherub'], + ['#f8db9d', 'Marzipan'], + ['#f8dd5c', 'Energy Yellow'], + ['#f8e4bf', 'Givry'], + ['#f8f0e8', 'White Linen'], + ['#f8f4ff', 'Magnolia'], + ['#f8f6f1', 'Spring Wood'], + ['#f8f7dc', 'Coconut Cream'], + ['#f8f7fc', 'White Lilac'], + ['#f8f8f7', 'Desert Storm'], + ['#f8f99c', 'Texas'], + ['#f8facd', 'Corn Field'], + ['#f8fdd3', 'Mimosa'], + ['#f95a61', 'Carnation'], + ['#f9bf58', 'Saffron Mango'], + ['#f9e0ed', 'Carousel Pink'], + ['#f9e4bc', 'Dairy Cream'], + ['#f9e663', 'Portica'], + ['#f9eaf3', 'Amour'], + ['#f9f8e4', 'Rum Swizzle'], + ['#f9ff8b', 'Dolly'], + ['#f9fff6', 'Sugar Cane'], + ['#fa7814', 'Ecstasy'], + ['#fa9d5a', 'Tan Hide'], + ['#fad3a2', 'Corvette'], + ['#fadfad', 'Peach Yellow'], + ['#fae600', 'Turbo'], + ['#faeab9', 'Astra'], + ['#faeccc', 'Champagne'], + ['#faf0e6', 'Linen'], + ['#faf3f0', 'Fantasy'], + ['#faf7d6', 'Citrine White'], + ['#fafafa', 'Alabaster'], + ['#fafde4', 'Hint Of Yellow'], + ['#faffa4', 'Milan'], + ['#fb607f', 'Brink Pink'], + ['#fb8989', 'Geraldine'], + ['#fba0e3', 'Lavender Rose'], + ['#fba129', 'Sea Buckthorn'], + ['#fbac13', 'Sun'], + ['#fbaed2', 'Lavender Pink'], + ['#fbb2a3', 'Rose Bud'], + ['#fbbeda', 'Cupid'], + ['#fbcce7', 'Classic Rose'], + ['#fbceb1', 'Apricot Peach'], + ['#fbe7b2', 'Banana Mania'], + ['#fbe870', 'Marigold Yellow'], + ['#fbe96c', 'Festival'], + ['#fbea8c', 'Sweet Corn'], + ['#fbec5d', 'Candy Corn'], + ['#fbf9f9', 'Hint Of Red'], + ['#fbffba', 'Shalimar'], + ['#fc0fc0', 'Shocking Pink'], + ['#fc80a5', 'Tickle Me Pink'], + ['#fc9c1d', 'Tree Poppy'], + ['#fcc01e', 'Lightning Yellow'], + ['#fcd667', 'Goldenrod'], + ['#fcd917', 'Candlelight'], + ['#fcda98', 'Cherokee'], + ['#fcf4d0', 'Double Pearl Lusta'], + ['#fcf4dc', 'Pearl Lusta'], + ['#fcf8f7', 'Vista White'], + ['#fcfbf3', 'Bianca'], + ['#fcfeda', 'Moon Glow'], + ['#fcffe7', 'China Ivory'], + ['#fcfff9', 'Ceramic'], + ['#fd0e35', 'Torch Red'], + ['#fd5b78', 'Wild Watermelon'], + ['#fd7b33', 'Crusta'], + ['#fd7c07', 'Sorbus'], + ['#fd9fa2', 'Sweet Pink'], + ['#fdd5b1', 'Light Apricot'], + ['#fdd7e4', 'Pig Pink'], + ['#fde1dc', 'Cinderella'], + ['#fde295', 'Golden Glow'], + ['#fde910', 'Lemon'], + ['#fdf5e6', 'Old Lace'], + ['#fdf6d3', 'Half Colonial White'], + ['#fdf7ad', 'Drover'], + ['#fdfeb8', 'Pale Prim'], + ['#fdffd5', 'Cumulus'], + ['#fe28a2', 'Persian Rose'], + ['#fe4c40', 'Sunset Orange'], + ['#fe6f5e', 'Bittersweet'], + ['#fe9d04', 'California'], + ['#fea904', 'Yellow Sea'], + ['#febaad', 'Melon'], + ['#fed33c', 'Bright Sun'], + ['#fed85d', 'Dandelion'], + ['#fedb8d', 'Salomie'], + ['#fee5ac', 'Cape Honey'], + ['#feebf3', 'Remy'], + ['#feefce', 'Oasis'], + ['#fef0ec', 'Bridesmaid'], + ['#fef2c7', 'Beeswax'], + ['#fef3d8', 'Bleach White'], + ['#fef4cc', 'Pipi'], + ['#fef4db', 'Half Spanish White'], + ['#fef4f8', 'Wisp Pink'], + ['#fef5f1', 'Provincial Pink'], + ['#fef7de', 'Half Dutch White'], + ['#fef8e2', 'Solitaire'], + ['#fef8ff', 'White Pointer'], + ['#fef9e3', 'Off Yellow'], + ['#fefced', 'Orange White'], + ['#ff0000', 'Red'], + ['#ff007f', 'Rose'], + ['#ff00cc', 'Purple Pizzazz'], + ['#ff00ff', 'Magenta Fuchsia'], + ['#ff2400', 'Scarlet'], + ['#ff3399', 'Wild Strawberry'], + ['#ff33cc', 'Razzle Dazzle Rose'], + ['#ff355e', 'Radical Red'], + ['#ff3f34', 'Red Orange'], + ['#ff4040', 'Coral Red'], + ['#ff4d00', 'Vermilion'], + ['#ff4f00', 'International Orange'], + ['#ff6037', 'Outrageous Orange'], + ['#ff6600', 'Blaze Orange'], + ['#ff66ff', 'Pink Flamingo'], + ['#ff681f', 'Orange'], + ['#ff69b4', 'Hot Pink'], + ['#ff6b53', 'Persimmon'], + ['#ff6fff', 'Blush Pink'], + ['#ff7034', 'Burning Orange'], + ['#ff7518', 'Pumpkin'], + ['#ff7d07', 'Flamenco'], + ['#ff7f00', 'Flush Orange'], + ['#ff7f50', 'Coral'], + ['#ff8c69', 'Salmon'], + ['#ff9000', 'Pizazz'], + ['#ff910f', 'West Side'], + ['#ff91a4', 'Pink Salmon'], + ['#ff9933', 'Neon Carrot'], + ['#ff9966', 'Atomic Tangerine'], + ['#ff9980', 'Vivid Tangerine'], + ['#ff9e2c', 'Sunshade'], + ['#ffa000', 'Orange Peel'], + ['#ffa194', 'Mona Lisa'], + ['#ffa500', 'Web Orange'], + ['#ffa6c9', 'Carnation Pink'], + ['#ffab81', 'Hit Pink'], + ['#ffae42', 'Yellow Orange'], + ['#ffb0ac', 'Cornflower Lilac'], + ['#ffb1b3', 'Sundown'], + ['#ffb31f', 'My Sin'], + ['#ffb555', 'Texas Rose'], + ['#ffb7d5', 'Cotton Candy'], + ['#ffb97b', 'Macaroni And Cheese'], + ['#ffba00', 'Selective Yellow'], + ['#ffbd5f', 'Koromiko'], + ['#ffbf00', 'Amber'], + ['#ffc0a8', 'Wax Flower'], + ['#ffc0cb', 'Pink'], + ['#ffc3c0', 'Your Pink'], + ['#ffc901', 'Supernova'], + ['#ffcba4', 'Flesh'], + ['#ffcc33', 'Sunglow'], + ['#ffcc5c', 'Golden Tainoi'], + ['#ffcc99', 'Peach Orange'], + ['#ffcd8c', 'Chardonnay'], + ['#ffd1dc', 'Pastel Pink'], + ['#ffd2b7', 'Romantic'], + ['#ffd38c', 'Grandis'], + ['#ffd700', 'Gold'], + ['#ffd800', 'School Bus Yellow'], + ['#ffd8d9', 'Cosmos'], + ['#ffdb58', 'Mustard'], + ['#ffdcd6', 'Peach Schnapps'], + ['#ffddaf', 'Caramel'], + ['#ffddcd', 'Tuft Bush'], + ['#ffddcf', 'Watusi'], + ['#ffddf4', 'Pink Lace'], + ['#ffdead', 'Navajo White'], + ['#ffdeb3', 'Frangipani'], + ['#ffe1df', 'Pippin'], + ['#ffe1f2', 'Pale Rose'], + ['#ffe2c5', 'Negroni'], + ['#ffe5a0', 'Cream Brulee'], + ['#ffe5b4', 'Peach'], + ['#ffe6c7', 'Tequila'], + ['#ffe772', 'Kournikova'], + ['#ffeac8', 'Sandy Beach'], + ['#ffead4', 'Karry'], + ['#ffec13', 'Broom'], + ['#ffedbc', 'Colonial White'], + ['#ffeed8', 'Derby'], + ['#ffefa1', 'Vis Vis'], + ['#ffefc1', 'Egg White'], + ['#ffefd5', 'Papaya Whip'], + ['#ffefec', 'Fair Pink'], + ['#fff0db', 'Peach Cream'], + ['#fff0f5', 'Lavender Blush'], + ['#fff14f', 'Gorse'], + ['#fff1b5', 'Buttermilk'], + ['#fff1d8', 'Pink Lady'], + ['#fff1ee', 'Forget Me Not'], + ['#fff1f9', 'Tutu'], + ['#fff39d', 'Picasso'], + ['#fff3f1', 'Chardon'], + ['#fff46e', 'Paris Daisy'], + ['#fff4ce', 'Barley White'], + ['#fff4dd', 'Egg Sour'], + ['#fff4e0', 'Sazerac'], + ['#fff4e8', 'Serenade'], + ['#fff4f3', 'Chablis'], + ['#fff5ee', 'Seashell Peach'], + ['#fff5f3', 'Sauvignon'], + ['#fff6d4', 'Milk Punch'], + ['#fff6df', 'Varden'], + ['#fff6f5', 'Rose White'], + ['#fff8d1', 'Baja White'], + ['#fff9e2', 'Gin Fizz'], + ['#fff9e6', 'Early Dawn'], + ['#fffacd', 'Lemon Chiffon'], + ['#fffaf4', 'Bridal Heath'], + ['#fffbdc', 'Scotch Mist'], + ['#fffbf9', 'Soapstone'], + ['#fffc99', 'Witch Haze'], + ['#fffcea', 'Buttery White'], + ['#fffcee', 'Island Spice'], + ['#fffdd0', 'Cream'], + ['#fffde6', 'Chilean Heath'], + ['#fffde8', 'Travertine'], + ['#fffdf3', 'Orchid White'], + ['#fffdf4', 'Quarter Pearl Lusta'], + ['#fffee1', 'Half And Half'], + ['#fffeec', 'Apricot White'], + ['#fffef0', 'Rice Cake'], + ['#fffef6', 'Black White'], + ['#fffefd', 'Romance'], + ['#ffff00', 'Yellow'], + ['#ffff66', 'Laser Lemon'], + ['#ffff99', 'Pale Canary'], + ['#ffffb4', 'Portafino'], + ['#fffff0', 'Ivory'], + ['#ffffff', 'White'] +]; + +/** + * Map Of hex color values to color names + * + * - key: hex value + * - value: color name + */ +export const colorNameMap = colorNames.reduce>((acc, [hex, name]) => { + acc[hex] = name; + return acc; +}, {}); diff --git a/packages/color/src/constant/palette.ts b/packages/color/src/constant/palette.ts new file mode 100644 index 0000000..9f62664 --- /dev/null +++ b/packages/color/src/constant/palette.ts @@ -0,0 +1,356 @@ +import type { ColorPaletteFamily } from '../types'; + +export const colorPalettes: ColorPaletteFamily[] = [ + { + name: 'Slate', + palettes: [ + { hex: '#f8fafc', number: 50 }, + { hex: '#f1f5f9', number: 100 }, + { hex: '#e2e8f0', number: 200 }, + { hex: '#cbd5e1', number: 300 }, + { hex: '#94a3b8', number: 400 }, + { hex: '#64748b', number: 500 }, + { hex: '#475569', number: 600 }, + { hex: '#334155', number: 700 }, + { hex: '#1e293b', number: 800 }, + { hex: '#0f172a', number: 900 }, + { hex: '#020617', number: 950 } + ] + }, + { + name: 'Gray', + palettes: [ + { hex: '#f9fafb', number: 50 }, + { hex: '#f3f4f6', number: 100 }, + { hex: '#e5e7eb', number: 200 }, + { hex: '#d1d5db', number: 300 }, + { hex: '#9ca3af', number: 400 }, + { hex: '#6b7280', number: 500 }, + { hex: '#4b5563', number: 600 }, + { hex: '#374151', number: 700 }, + { hex: '#1f2937', number: 800 }, + { hex: '#111827', number: 900 }, + { hex: '#030712', number: 950 } + ] + }, + { + name: 'Zinc', + palettes: [ + { hex: '#fafafa', number: 50 }, + { hex: '#f4f4f5', number: 100 }, + { hex: '#e4e4e7', number: 200 }, + { hex: '#d4d4d8', number: 300 }, + { hex: '#a1a1aa', number: 400 }, + { hex: '#71717a', number: 500 }, + { hex: '#52525b', number: 600 }, + { hex: '#3f3f46', number: 700 }, + { hex: '#27272a', number: 800 }, + { hex: '#18181b', number: 900 }, + { hex: '#09090b', number: 950 } + ] + }, + { + name: 'Neutral', + palettes: [ + { hex: '#fafafa', number: 50 }, + { hex: '#f5f5f5', number: 100 }, + { hex: '#e5e5e5', number: 200 }, + { hex: '#d4d4d4', number: 300 }, + { hex: '#a3a3a3', number: 400 }, + { hex: '#737373', number: 500 }, + { hex: '#525252', number: 600 }, + { hex: '#404040', number: 700 }, + { hex: '#262626', number: 800 }, + { hex: '#171717', number: 900 }, + { hex: '#0a0a0a', number: 950 } + ] + }, + { + name: 'Stone', + palettes: [ + { hex: '#fafaf9', number: 50 }, + { hex: '#f5f5f4', number: 100 }, + { hex: '#e7e5e4', number: 200 }, + { hex: '#d6d3d1', number: 300 }, + { hex: '#a8a29e', number: 400 }, + { hex: '#78716c', number: 500 }, + { hex: '#57534e', number: 600 }, + { hex: '#44403c', number: 700 }, + { hex: '#292524', number: 800 }, + { hex: '#1c1917', number: 900 }, + { hex: '#0c0a09', number: 950 } + ] + }, + { + name: 'Red', + palettes: [ + { hex: '#fef2f2', number: 50 }, + { hex: '#fee2e2', number: 100 }, + { hex: '#fecaca', number: 200 }, + { hex: '#fca5a5', number: 300 }, + { hex: '#f87171', number: 400 }, + { hex: '#ef4444', number: 500 }, + { hex: '#dc2626', number: 600 }, + { hex: '#b91c1c', number: 700 }, + { hex: '#991b1b', number: 800 }, + { hex: '#7f1d1d', number: 900 }, + { hex: '#450a0a', number: 950 } + ] + }, + { + name: 'Orange', + palettes: [ + { hex: '#fff7ed', number: 50 }, + { hex: '#ffedd5', number: 100 }, + { hex: '#fed7aa', number: 200 }, + { hex: '#fdba74', number: 300 }, + { hex: '#fb923c', number: 400 }, + { hex: '#f97316', number: 500 }, + { hex: '#ea580c', number: 600 }, + { hex: '#c2410c', number: 700 }, + { hex: '#9a3412', number: 800 }, + { hex: '#7c2d12', number: 900 }, + { hex: '#431407', number: 950 } + ] + }, + { + name: 'Amber', + palettes: [ + { hex: '#fffbeb', number: 50 }, + { hex: '#fef3c7', number: 100 }, + { hex: '#fde68a', number: 200 }, + { hex: '#fcd34d', number: 300 }, + { hex: '#fbbf24', number: 400 }, + { hex: '#f59e0b', number: 500 }, + { hex: '#d97706', number: 600 }, + { hex: '#b45309', number: 700 }, + { hex: '#92400e', number: 800 }, + { hex: '#78350f', number: 900 }, + { hex: '#451a03', number: 950 } + ] + }, + { + name: 'Yellow', + palettes: [ + { hex: '#fefce8', number: 50 }, + { hex: '#fef9c3', number: 100 }, + { hex: '#fef08a', number: 200 }, + { hex: '#fde047', number: 300 }, + { hex: '#facc15', number: 400 }, + { hex: '#eab308', number: 500 }, + { hex: '#ca8a04', number: 600 }, + { hex: '#a16207', number: 700 }, + { hex: '#854d0e', number: 800 }, + { hex: '#713f12', number: 900 }, + { hex: '#422006', number: 950 } + ] + }, + { + name: 'Lime', + palettes: [ + { hex: '#f7fee7', number: 50 }, + { hex: '#ecfccb', number: 100 }, + { hex: '#d9f99d', number: 200 }, + { hex: '#bef264', number: 300 }, + { hex: '#a3e635', number: 400 }, + { hex: '#84cc16', number: 500 }, + { hex: '#65a30d', number: 600 }, + { hex: '#4d7c0f', number: 700 }, + { hex: '#3f6212', number: 800 }, + { hex: '#365314', number: 900 }, + { hex: '#1a2e05', number: 950 } + ] + }, + { + name: 'Green', + palettes: [ + { hex: '#f0fdf4', number: 50 }, + { hex: '#dcfce7', number: 100 }, + { hex: '#bbf7d0', number: 200 }, + { hex: '#86efac', number: 300 }, + { hex: '#4ade80', number: 400 }, + { hex: '#22c55e', number: 500 }, + { hex: '#16a34a', number: 600 }, + { hex: '#15803d', number: 700 }, + { hex: '#166534', number: 800 }, + { hex: '#14532d', number: 900 }, + { hex: '#052e16', number: 950 } + ] + }, + { + name: 'Emerald', + palettes: [ + { hex: '#ecfdf5', number: 50 }, + { hex: '#d1fae5', number: 100 }, + { hex: '#a7f3d0', number: 200 }, + { hex: '#6ee7b7', number: 300 }, + { hex: '#34d399', number: 400 }, + { hex: '#10b981', number: 500 }, + { hex: '#059669', number: 600 }, + { hex: '#047857', number: 700 }, + { hex: '#065f46', number: 800 }, + { hex: '#064e3b', number: 900 }, + { hex: '#022c22', number: 950 } + ] + }, + { + name: 'Teal', + palettes: [ + { hex: '#f0fdfa', number: 50 }, + { hex: '#ccfbf1', number: 100 }, + { hex: '#99f6e4', number: 200 }, + { hex: '#5eead4', number: 300 }, + { hex: '#2dd4bf', number: 400 }, + { hex: '#14b8a6', number: 500 }, + { hex: '#0d9488', number: 600 }, + { hex: '#0f766e', number: 700 }, + { hex: '#115e59', number: 800 }, + { hex: '#134e4a', number: 900 }, + { hex: '#042f2e', number: 950 } + ] + }, + { + name: 'Cyan', + palettes: [ + { hex: '#ecfeff', number: 50 }, + { hex: '#cffafe', number: 100 }, + { hex: '#a5f3fc', number: 200 }, + { hex: '#67e8f9', number: 300 }, + { hex: '#22d3ee', number: 400 }, + { hex: '#06b6d4', number: 500 }, + { hex: '#0891b2', number: 600 }, + { hex: '#0e7490', number: 700 }, + { hex: '#155e75', number: 800 }, + { hex: '#164e63', number: 900 }, + { hex: '#083344', number: 950 } + ] + }, + { + name: 'Sky', + palettes: [ + { hex: '#f0f9ff', number: 50 }, + { hex: '#e0f2fe', number: 100 }, + { hex: '#bae6fd', number: 200 }, + { hex: '#7dd3fc', number: 300 }, + { hex: '#38bdf8', number: 400 }, + { hex: '#0ea5e9', number: 500 }, + { hex: '#0284c7', number: 600 }, + { hex: '#0369a1', number: 700 }, + { hex: '#075985', number: 800 }, + { hex: '#0c4a6e', number: 900 }, + { hex: '#082f49', number: 950 } + ] + }, + { + name: 'Blue', + palettes: [ + { hex: '#eff6ff', number: 50 }, + { hex: '#dbeafe', number: 100 }, + { hex: '#bfdbfe', number: 200 }, + { hex: '#93c5fd', number: 300 }, + { hex: '#60a5fa', number: 400 }, + { hex: '#3b82f6', number: 500 }, + { hex: '#2563eb', number: 600 }, + { hex: '#1d4ed8', number: 700 }, + { hex: '#1e40af', number: 800 }, + { hex: '#1e3a8a', number: 900 }, + { hex: '#172554', number: 950 } + ] + }, + { + name: 'Indigo', + palettes: [ + { hex: '#eef2ff', number: 50 }, + { hex: '#e0e7ff', number: 100 }, + { hex: '#c7d2fe', number: 200 }, + { hex: '#a5b4fc', number: 300 }, + { hex: '#818cf8', number: 400 }, + { hex: '#6366f1', number: 500 }, + { hex: '#4f46e5', number: 600 }, + { hex: '#4338ca', number: 700 }, + { hex: '#3730a3', number: 800 }, + { hex: '#312e81', number: 900 }, + { hex: '#1e1b4b', number: 950 } + ] + }, + { + name: 'Violet', + palettes: [ + { hex: '#f5f3ff', number: 50 }, + { hex: '#ede9fe', number: 100 }, + { hex: '#ddd6fe', number: 200 }, + { hex: '#c4b5fd', number: 300 }, + { hex: '#a78bfa', number: 400 }, + { hex: '#8b5cf6', number: 500 }, + { hex: '#7c3aed', number: 600 }, + { hex: '#6d28d9', number: 700 }, + { hex: '#5b21b6', number: 800 }, + { hex: '#4c1d95', number: 900 }, + { hex: '#2e1065', number: 950 } + ] + }, + { + name: 'Purple', + palettes: [ + { hex: '#faf5ff', number: 50 }, + { hex: '#f3e8ff', number: 100 }, + { hex: '#e9d5ff', number: 200 }, + { hex: '#d8b4fe', number: 300 }, + { hex: '#c084fc', number: 400 }, + { hex: '#a855f7', number: 500 }, + { hex: '#9333ea', number: 600 }, + { hex: '#7e22ce', number: 700 }, + { hex: '#6b21a8', number: 800 }, + { hex: '#581c87', number: 900 }, + { hex: '#3b0764', number: 950 } + ] + }, + { + name: 'Fuchsia', + palettes: [ + { hex: '#fdf4ff', number: 50 }, + { hex: '#fae8ff', number: 100 }, + { hex: '#f5d0fe', number: 200 }, + { hex: '#f0abfc', number: 300 }, + { hex: '#e879f9', number: 400 }, + { hex: '#d946ef', number: 500 }, + { hex: '#c026d3', number: 600 }, + { hex: '#a21caf', number: 700 }, + { hex: '#86198f', number: 800 }, + { hex: '#701a75', number: 900 }, + { hex: '#4a044e', number: 950 } + ] + }, + { + name: 'Pink', + palettes: [ + { hex: '#fdf2f8', number: 50 }, + { hex: '#fce7f3', number: 100 }, + { hex: '#fbcfe8', number: 200 }, + { hex: '#f9a8d4', number: 300 }, + { hex: '#f472b6', number: 400 }, + { hex: '#ec4899', number: 500 }, + { hex: '#db2777', number: 600 }, + { hex: '#be185d', number: 700 }, + { hex: '#9d174d', number: 800 }, + { hex: '#831843', number: 900 }, + { hex: '#500724', number: 950 } + ] + }, + { + name: 'Rose', + palettes: [ + { hex: '#fff1f2', number: 50 }, + { hex: '#ffe4e6', number: 100 }, + { hex: '#fecdd3', number: 200 }, + { hex: '#fda4af', number: 300 }, + { hex: '#fb7185', number: 400 }, + { hex: '#f43f5e', number: 500 }, + { hex: '#e11d48', number: 600 }, + { hex: '#be123c', number: 700 }, + { hex: '#9f1239', number: 800 }, + { hex: '#881337', number: 900 }, + { hex: '#4c0519', number: 950 } + ] + } +]; diff --git a/packages/color/src/index.ts b/packages/color/src/index.ts new file mode 100644 index 0000000..42a4d54 --- /dev/null +++ b/packages/color/src/index.ts @@ -0,0 +1,7 @@ +import { colorPalettes } from './constant'; + +export * from './palette'; +export * from './shared'; +export { colorPalettes }; + +export * from './types'; diff --git a/packages/color/src/palette/antd.ts b/packages/color/src/palette/antd.ts new file mode 100644 index 0000000..c3d5b48 --- /dev/null +++ b/packages/color/src/palette/antd.ts @@ -0,0 +1,176 @@ +import type { AnyColor, HsvColor } from 'colord'; +import { getHex, getHsv, isValidColor, mixColor } from '../shared'; +import type { ColorIndex } from '../types'; + +/** Hue step */ +const hueStep = 2; +/** Saturation step, light color part */ +const saturationStep = 16; +/** Saturation step, dark color part */ +const saturationStep2 = 5; +/** Brightness step, light color part */ +const brightnessStep1 = 5; +/** Brightness step, dark color part */ +const brightnessStep2 = 15; +/** Light color count, main color up */ +const lightColorCount = 5; +/** Dark color count, main color down */ +const darkColorCount = 4; + +/** + * Get AntD palette color by index + * + * @param color - Color + * @param index - The color index of color palette (the main color index is 6) + * @returns Hex color + */ +export function getAntDPaletteColorByIndex(color: AnyColor, index: ColorIndex): string { + if (!isValidColor(color)) { + throw new Error('invalid input color value'); + } + + if (index === 6) { + return getHex(color); + } + + const isLight = index < 6; + const hsv = getHsv(color); + const i = isLight ? lightColorCount + 1 - index : index - lightColorCount - 1; + + const newHsv: HsvColor = { + h: getHue(hsv, i, isLight), + s: getSaturation(hsv, i, isLight), + v: getValue(hsv, i, isLight) + }; + + return getHex(newHsv); +} + +/** Map of dark color index and opacity */ +const darkColorMap = [ + { index: 7, opacity: 0.15 }, + { index: 6, opacity: 0.25 }, + { index: 5, opacity: 0.3 }, + { index: 5, opacity: 0.45 }, + { index: 5, opacity: 0.65 }, + { index: 5, opacity: 0.85 }, + { index: 5, opacity: 0.9 }, + { index: 4, opacity: 0.93 }, + { index: 3, opacity: 0.95 }, + { index: 2, opacity: 0.97 }, + { index: 1, opacity: 0.98 } +]; + +/** + * Get AntD color palette + * + * @param color - Color + * @param darkTheme - Dark theme + * @param darkThemeMixColor - Dark theme mix color (default: #141414) + */ +export function getAntDColorPalette(color: AnyColor, darkTheme = false, darkThemeMixColor = '#141414'): string[] { + const indexes: ColorIndex[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + + const patterns = indexes.map(index => getAntDPaletteColorByIndex(color, index)); + + if (darkTheme) { + const darkPatterns = darkColorMap.map(({ index, opacity }) => { + const darkColor = mixColor(darkThemeMixColor, patterns[index], opacity); + + return darkColor; + }); + + return darkPatterns.map(item => getHex(item)); + } + + return patterns; +} + +/** + * Get hue + * + * @param hsv - Hsv format color + * @param i - The relative distance from 6 + * @param isLight - Is light color + */ +function getHue(hsv: HsvColor, i: number, isLight: boolean) { + let hue: number; + + const hsvH = Math.round(hsv.h); + + if (hsvH >= 60 && hsvH <= 240) { + hue = isLight ? hsvH - hueStep * i : hsvH + hueStep * i; + } else { + hue = isLight ? hsvH + hueStep * i : hsvH - hueStep * i; + } + + if (hue < 0) { + hue += 360; + } + + if (hue >= 360) { + hue -= 360; + } + + return hue; +} + +/** + * Get saturation + * + * @param hsv - Hsv format color + * @param i - The relative distance from 6 + * @param isLight - Is light color + */ +function getSaturation(hsv: HsvColor, i: number, isLight: boolean) { + if (hsv.h === 0 && hsv.s === 0) { + return hsv.s; + } + + let saturation: number; + + if (isLight) { + saturation = hsv.s - saturationStep * i; + } else if (i === darkColorCount) { + saturation = hsv.s + saturationStep; + } else { + saturation = hsv.s + saturationStep2 * i; + } + + if (saturation > 100) { + saturation = 100; + } + + if (isLight && i === lightColorCount && saturation > 10) { + saturation = 10; + } + + if (saturation < 6) { + saturation = 6; + } + + return saturation; +} + +/** + * Get value of hsv + * + * @param hsv - Hsv format color + * @param i - The relative distance from 6 + * @param isLight - Is light color + */ +function getValue(hsv: HsvColor, i: number, isLight: boolean) { + let value: number; + + if (isLight) { + value = hsv.v + brightnessStep1 * i; + } else { + value = hsv.v - brightnessStep2 * i; + } + + if (value > 100) { + value = 100; + } + + return value; +} diff --git a/packages/color/src/palette/index.ts b/packages/color/src/palette/index.ts new file mode 100644 index 0000000..ba3b853 --- /dev/null +++ b/packages/color/src/palette/index.ts @@ -0,0 +1,45 @@ +import type { AnyColor } from 'colord'; +import { getHex } from '../shared'; +import type { ColorPaletteNumber } from '../types'; +import { getRecommendedColorPalette } from './recommend'; +import { getAntDColorPalette } from './antd'; + +/** + * get color palette by provided color + * + * @param color + * @param recommended whether to get recommended color palette (the provided color may not be the main color) + */ +export function getColorPalette(color: AnyColor, recommended = false) { + const colorMap = new Map(); + + if (recommended) { + const colorPalette = getRecommendedColorPalette(getHex(color)); + colorPalette.palettes.forEach(palette => { + colorMap.set(palette.number, palette.hex); + }); + } else { + const colors = getAntDColorPalette(color); + + const colorNumbers: ColorPaletteNumber[] = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950]; + + colorNumbers.forEach((number, index) => { + colorMap.set(number, colors[index]); + }); + } + + return colorMap; +} + +/** + * get color palette color by number + * + * @param color the provided color + * @param number the color palette number + * @param recommended whether to get recommended color palette (the provided color may not be the main color) + */ +export function getPaletteColorByNumber(color: AnyColor, number: ColorPaletteNumber, recommended = false) { + const colorMap = getColorPalette(color, recommended); + + return colorMap.get(number as ColorPaletteNumber)!; +} diff --git a/packages/color/src/palette/recommend.ts b/packages/color/src/palette/recommend.ts new file mode 100644 index 0000000..904cae2 --- /dev/null +++ b/packages/color/src/palette/recommend.ts @@ -0,0 +1,152 @@ +import { getColorName, getDeltaE, getHsl, isValidColor, transformHslToHex } from '../shared'; +import { colorPalettes } from '../constant'; +import type { + ColorPalette, + ColorPaletteFamily, + ColorPaletteFamilyWithNearestPalette, + ColorPaletteMatch, + ColorPaletteNumber +} from '../types'; + +/** + * get recommended color palette by provided color + * + * @param color the provided color + */ +export function getRecommendedColorPalette(color: string) { + const colorPaletteFamily = getRecommendedColorPaletteFamily(color); + + const colorMap = new Map(); + + colorPaletteFamily.palettes.forEach(palette => { + colorMap.set(palette.number, palette); + }); + + const mainColor = colorMap.get(500)!; + const matchColor = colorPaletteFamily.palettes.find(palette => palette.hex === color)!; + + const colorPalette: ColorPaletteMatch = { + ...colorPaletteFamily, + colorMap, + main: mainColor, + match: matchColor + }; + + return colorPalette; +} + +/** + * get recommended palette color by provided color + * + * @param color the provided color + * @param number the color palette number + */ +export function getRecommendedPaletteColorByNumber(color: string, number: ColorPaletteNumber) { + const colorPalette = getRecommendedColorPalette(color); + + const { hex } = colorPalette.colorMap.get(number)!; + + return hex; +} + +/** + * get color palette family by provided color and color name + * + * @param color the provided color + */ +export function getRecommendedColorPaletteFamily(color: string) { + if (!isValidColor(color)) { + throw new Error('Invalid color, please check color value!'); + } + + let colorName = getColorName(color); + + colorName = colorName.toLowerCase().replace(/\s/g, '-'); + + const { h: h1, s: s1 } = getHsl(color); + + const { nearestLightnessPalette, palettes } = getNearestColorPaletteFamily(color, colorPalettes); + + const { number, hex } = nearestLightnessPalette; + + const { h: h2, s: s2 } = getHsl(hex); + + const deltaH = h1 - h2; + + const sRatio = s1 / s2; + + const colorPaletteFamily: ColorPaletteFamily = { + name: colorName, + palettes: palettes.map(palette => { + let hexValue = color; + + const isSame = number === palette.number; + + if (!isSame) { + const { h: h3, s: s3, l } = getHsl(palette.hex); + + const newH = deltaH < 0 ? h3 + deltaH : h3 - deltaH; + const newS = s3 * sRatio; + + hexValue = transformHslToHex({ + h: newH, + s: newS, + l + }); + } + + return { + hex: hexValue, + number: palette.number + }; + }) + }; + + return colorPaletteFamily; +} + +/** + * get nearest color palette family + * + * @param color color + * @param families color palette families + */ +function getNearestColorPaletteFamily(color: string, families: ColorPaletteFamily[]) { + const familyWithConfig = families.map(family => { + const palettes = family.palettes.map(palette => { + return { + ...palette, + delta: getDeltaE(color, palette.hex) + }; + }); + + const nearestPalette = palettes.reduce((prev, curr) => (prev.delta < curr.delta ? prev : curr)); + + return { + ...family, + palettes, + nearestPalette + }; + }); + + const nearestPaletteFamily = familyWithConfig.reduce((prev, curr) => + prev.nearestPalette.delta < curr.nearestPalette.delta ? prev : curr + ); + + const { l } = getHsl(color); + + const paletteFamily: ColorPaletteFamilyWithNearestPalette = { + ...nearestPaletteFamily, + nearestLightnessPalette: nearestPaletteFamily.palettes.reduce((prev, curr) => { + const { l: prevLightness } = getHsl(prev.hex); + const { l: currLightness } = getHsl(curr.hex); + + const deltaPrev = Math.abs(prevLightness - l); + const deltaCurr = Math.abs(currLightness - l); + + return deltaPrev < deltaCurr ? prev : curr; + }) + }; + + return paletteFamily; +} diff --git a/packages/color/src/shared/colord.ts b/packages/color/src/shared/colord.ts new file mode 100644 index 0000000..4c52330 --- /dev/null +++ b/packages/color/src/shared/colord.ts @@ -0,0 +1,93 @@ +import { colord, extend } from 'colord'; +import namesPlugin from 'colord/plugins/names'; +import mixPlugin from 'colord/plugins/mix'; +import labPlugin from 'colord/plugins/lab'; +import type { AnyColor, HslColor, RgbColor } from 'colord'; + +extend([namesPlugin, mixPlugin, labPlugin]); + +export function isValidColor(color: AnyColor) { + return colord(color).isValid(); +} + +export function getHex(color: AnyColor) { + return colord(color).toHex(); +} + +export function getRgb(color: AnyColor) { + return colord(color).toRgb(); +} + +export function getHsl(color: AnyColor) { + return colord(color).toHsl(); +} + +export function getHsv(color: AnyColor) { + return colord(color).toHsv(); +} + +export function getDeltaE(color1: AnyColor, color2: AnyColor) { + return colord(color1).delta(color2); +} + +export function transformHslToHex(color: HslColor) { + return colord(color).toHex(); +} + +/** + * Add color alpha + * + * @param color - Color + * @param alpha - Alpha (0 - 1) + */ +export function addColorAlpha(color: AnyColor, alpha: number) { + return colord(color).alpha(alpha).toHex(); +} + +/** + * Mix color + * + * @param firstColor - First color + * @param secondColor - Second color + * @param ratio - The ratio of the second color (0 - 1) + */ +export function mixColor(firstColor: AnyColor, secondColor: AnyColor, ratio: number) { + return colord(firstColor).mix(secondColor, ratio).toHex(); +} + +/** + * Transform color with opacity to similar color without opacity + * + * @param color - Color + * @param alpha - Alpha (0 - 1) + * @param bgColor Background color (usually white or black) + */ +export function transformColorWithOpacity(color: AnyColor, alpha: number, bgColor = '#ffffff') { + const originColor = addColorAlpha(color, alpha); + const { r: oR, g: oG, b: oB } = colord(originColor).toRgb(); + + const { r: bgR, g: bgG, b: bgB } = colord(bgColor).toRgb(); + + function calRgb(or: number, bg: number, al: number) { + return bg + (or - bg) * al; + } + + const resultRgb: RgbColor = { + r: calRgb(oR, bgR, alpha), + g: calRgb(oG, bgG, alpha), + b: calRgb(oB, bgB, alpha) + }; + + return colord(resultRgb).toHex(); +} + +/** + * Is white color + * + * @param color - Color + */ +export function isWhiteColor(color: AnyColor) { + return colord(color).isEqual('#ffffff'); +} + +export { colord }; diff --git a/packages/color/src/shared/index.ts b/packages/color/src/shared/index.ts new file mode 100644 index 0000000..ae293ce --- /dev/null +++ b/packages/color/src/shared/index.ts @@ -0,0 +1,2 @@ +export * from './colord'; +export * from './name'; diff --git a/packages/color/src/shared/name.ts b/packages/color/src/shared/name.ts new file mode 100644 index 0000000..866bd33 --- /dev/null +++ b/packages/color/src/shared/name.ts @@ -0,0 +1,49 @@ +import { colorNames } from '../constant'; +import { getHex, getHsl, getRgb } from './colord'; + +/** + * Get color name + * + * @param color + */ +export function getColorName(color: string) { + const hex = getHex(color); + const rgb = getRgb(color); + const hsl = getHsl(color); + + let ndf = 0; + let ndf1 = 0; + let ndf2 = 0; + let cl = -1; + let df = -1; + + let name = ''; + + colorNames.some((item, index) => { + const [hexValue, colorName] = item; + + const match = hex === hexValue; + + if (match) { + name = colorName; + } else { + const { r, g, b } = getRgb(hexValue); + const { h, s, l } = getHsl(hexValue); + + ndf1 = (rgb.r - r) ** 2 + (rgb.g - g) ** 2 + (rgb.b - b) ** 2; + ndf2 = (hsl.h - h) ** 2 + (hsl.s - s) ** 2 + (hsl.l - l) ** 2; + + ndf = ndf1 + ndf2 * 2; + if (df < 0 || df > ndf) { + df = ndf; + cl = index; + } + } + + return match; + }); + + name = colorNames[cl][1]; + + return name; +} diff --git a/packages/color/src/types/index.ts b/packages/color/src/types/index.ts new file mode 100644 index 0000000..3a63bc8 --- /dev/null +++ b/packages/color/src/types/index.ts @@ -0,0 +1,58 @@ +/** + * the color palette number + * + * the main color number is 500 + */ +export type ColorPaletteNumber = 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 950; + +/** the color palette */ +export type ColorPalette = { + /** the color hex value */ + hex: string; + /** + * the color number + * + * - 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 950 + */ + number: ColorPaletteNumber; +}; + +/** the color palette family */ +export type ColorPaletteFamily = { + /** the color palette family name */ + name: string; + /** the color palettes */ + palettes: ColorPalette[]; +}; + +/** the color palette with delta */ +export type ColorPaletteWithDelta = ColorPalette & { + delta: number; +}; + +/** the color palette family with nearest palette */ +export type ColorPaletteFamilyWithNearestPalette = ColorPaletteFamily & { + nearestPalette: ColorPaletteWithDelta; + nearestLightnessPalette: ColorPaletteWithDelta; +}; + +/** the color palette match */ +export type ColorPaletteMatch = ColorPaletteFamily & { + /** the color map of the palette */ + colorMap: Map; + /** + * the main color of the palette + * + * which number is 500 + */ + main: ColorPalette; + /** the match color of the palette */ + match: ColorPalette; +}; + +/** + * The color index of color palette + * + * From left to right, the color is from light to dark, 6 is main color + */ +export type ColorIndex = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11; diff --git a/packages/color/tsconfig.json b/packages/color/tsconfig.json new file mode 100644 index 0000000..5823ed5 --- /dev/null +++ b/packages/color/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ESNext", + "jsx": "preserve", + "lib": ["DOM", "ESNext"], + "baseUrl": ".", + "module": "ESNext", + "moduleResolution": "node", + "resolveJsonModule": true, + "types": ["node"], + "strict": true, + "strictNullChecks": true, + "noUnusedLocals": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/hooks/package.json b/packages/hooks/package.json new file mode 100644 index 0000000..301ffdc --- /dev/null +++ b/packages/hooks/package.json @@ -0,0 +1,16 @@ +{ + "name": "@sa/hooks", + "version": "2.0.2", + "exports": { + ".": "./src/index.ts" + }, + "typesVersions": { + "*": { + "*": ["./src/*"] + } + }, + "dependencies": { + "@sa/axios": "workspace:*", + "@sa/utils": "workspace:*" + } +} diff --git a/packages/hooks/src/index.ts b/packages/hooks/src/index.ts new file mode 100644 index 0000000..3a73bbc --- /dev/null +++ b/packages/hooks/src/index.ts @@ -0,0 +1,9 @@ +import useBoolean from './use-boolean'; +import useLoading from './use-loading'; +import useCountDown from './use-count-down'; +import useContext from './use-context'; +import useSvgIconRender from './use-svg-icon-render'; +import useTable from './use-table'; + +export { useBoolean, useLoading, useCountDown, useContext, useSvgIconRender, useTable }; +export type * from './use-table'; diff --git a/packages/hooks/src/use-boolean.ts b/packages/hooks/src/use-boolean.ts new file mode 100644 index 0000000..a60d45a --- /dev/null +++ b/packages/hooks/src/use-boolean.ts @@ -0,0 +1,31 @@ +import { ref } from 'vue'; + +/** + * Boolean + * + * @param initValue Init value + */ +export default function useBoolean(initValue = false) { + const bool = ref(initValue); + + function setBool(value: boolean) { + bool.value = value; + } + function setTrue() { + setBool(true); + } + function setFalse() { + setBool(false); + } + function toggle() { + setBool(!bool.value); + } + + return { + bool, + setBool, + setTrue, + setFalse, + toggle + }; +} diff --git a/packages/hooks/src/use-context.ts b/packages/hooks/src/use-context.ts new file mode 100644 index 0000000..cea9164 --- /dev/null +++ b/packages/hooks/src/use-context.ts @@ -0,0 +1,96 @@ +import { inject, provide } from 'vue'; + +/** + * Use context + * + * @example + * ```ts + * // there are three vue files: A.vue, B.vue, C.vue, and A.vue is the parent component of B.vue and C.vue + * + * // context.ts + * import { ref } from 'vue'; + * import { useContext } from '@sa/hooks'; + * + * export const [provideDemoContext, useDemoContext] = useContext('demo', () => { + * const count = ref(0); + * + * function increment() { + * count.value++; + * } + * + * function decrement() { + * count.value--; + * } + * + * return { + * count, + * increment, + * decrement + * }; + * }) + * ``` // A.vue + * ```vue + * + * + * ``` // B.vue + * ```vue + * + * + * ```; + * + * // C.vue is same as B.vue + * + * @param contextName Context name + * @param fn Context function + */ +export default function useContext, T>( + contextName: string, + composable: (...args: Arguments) => T +) { + const key = Symbol(contextName); + + /** + * Injects the context value. + * + * @param consumerName - The name of the component that is consuming the context. If provided, the component must be + * used within the context provider. + * @param defaultValue - The default value to return if the context is not provided. + * @returns The context value. + */ + const useInject = ( + consumerName?: N, + defaultValue?: T + ): N extends null | undefined ? T | null : T => { + const value = inject(key, defaultValue); + + if (consumerName && !value) { + throw new Error(`\`${consumerName}\` must be used within \`${contextName}\``); + } + + // @ts-expect-error - we want to return null if the value is undefined or null + return value || null; + }; + + const useProvide = (...args: Arguments) => { + const value = composable(...args); + + provide(key, value); + + return value; + }; + + return [useProvide, useInject] as const; +} diff --git a/packages/hooks/src/use-count-down.ts b/packages/hooks/src/use-count-down.ts new file mode 100644 index 0000000..4f95b73 --- /dev/null +++ b/packages/hooks/src/use-count-down.ts @@ -0,0 +1,68 @@ +import { computed, onScopeDispose, ref } from 'vue'; +import { useRafFn } from '@vueuse/core'; + +/** + * A hook for implementing a countdown timer. It uses `requestAnimationFrame` for smooth and accurate timing, + * independent of the screen refresh rate. + * + * @param initialSeconds - The total number of seconds for the countdown. + */ +export default function useCountDown(initialSeconds: number) { + const remainingSeconds = ref(0); + + const count = computed(() => Math.ceil(remainingSeconds.value)); + + const isCounting = computed(() => remainingSeconds.value > 0); + + const { pause, resume } = useRafFn( + ({ delta }) => { + // delta: milliseconds elapsed since the last frame. + + // If countdown already reached zero or below, ensure it's 0 and stop. + if (remainingSeconds.value <= 0) { + remainingSeconds.value = 0; + pause(); + return; + } + + // Calculate seconds passed since the last frame. + const secondsPassed = delta / 1000; + remainingSeconds.value -= secondsPassed; + + // If countdown has finished after decrementing. + if (remainingSeconds.value <= 0) { + remainingSeconds.value = 0; + pause(); + } + }, + { immediate: false } // The timer does not start automatically. + ); + + /** + * Starts the countdown. + * + * @param [updatedSeconds=initialSeconds] - Optionally, start with a new duration. Default is `initialSeconds` + */ + function start(updatedSeconds: number = initialSeconds) { + remainingSeconds.value = updatedSeconds; + resume(); + } + + /** Stops the countdown and resets the remaining time to 0. */ + function stop() { + remainingSeconds.value = 0; + pause(); + } + + // Ensure the rAF loop is cleaned up when the component is unmounted. + onScopeDispose(() => { + pause(); + }); + + return { + count, + isCounting, + start, + stop + }; +} diff --git a/packages/hooks/src/use-loading.ts b/packages/hooks/src/use-loading.ts new file mode 100644 index 0000000..b8f89ad --- /dev/null +++ b/packages/hooks/src/use-loading.ts @@ -0,0 +1,16 @@ +import useBoolean from './use-boolean'; + +/** + * Loading + * + * @param initValue Init value + */ +export default function useLoading(initValue = false) { + const { bool: loading, setTrue: startLoading, setFalse: endLoading } = useBoolean(initValue); + + return { + loading, + startLoading, + endLoading + }; +} diff --git a/packages/hooks/src/use-request.ts b/packages/hooks/src/use-request.ts new file mode 100644 index 0000000..51784af --- /dev/null +++ b/packages/hooks/src/use-request.ts @@ -0,0 +1,82 @@ +import { ref } from 'vue'; +import type { Ref } from 'vue'; +import { createFlatRequest } from '@sa/axios'; +import type { + AxiosError, + CreateAxiosDefaults, + CustomAxiosRequestConfig, + MappedType, + RequestInstanceCommon, + RequestOption, + ResponseType +} from '@sa/axios'; +import useLoading from './use-loading'; + +export type HookRequestInstanceResponseSuccessData = { + data: Ref; + error: Ref; +}; + +export type HookRequestInstanceResponseFailData = { + data: Ref; + error: Ref>; +}; + +export type HookRequestInstanceResponseData = { + loading: Ref; +} & (HookRequestInstanceResponseSuccessData | HookRequestInstanceResponseFailData); + +export interface HookRequestInstance< + ResponseData, + ApiData, + State extends Record +> extends RequestInstanceCommon { + ( + config: CustomAxiosRequestConfig + ): HookRequestInstanceResponseData>; +} + +/** + * create a hook request instance + * + * @param axiosConfig + * @param options + */ +export default function createHookRequest>( + axiosConfig?: CreateAxiosDefaults, + options?: Partial> +) { + const request = createFlatRequest(axiosConfig, options); + + const hookRequest: HookRequestInstance = function hookRequest< + T extends ApiData = ApiData, + R extends ResponseType = 'json' + >(config: CustomAxiosRequestConfig) { + const { loading, startLoading, endLoading } = useLoading(); + + const data = ref(null) as Ref>; + const error = ref(null) as Ref | null>; + + startLoading(); + + request(config).then(res => { + if (res.data) { + data.value = res.data as MappedType; + } else { + error.value = res.error; + } + + endLoading(); + }); + + return { + loading, + data, + error + }; + } as HookRequestInstance; + + hookRequest.cancelAllRequest = request.cancelAllRequest; + + return hookRequest; +} diff --git a/packages/hooks/src/use-svg-icon-render.ts b/packages/hooks/src/use-svg-icon-render.ts new file mode 100644 index 0000000..62c2206 --- /dev/null +++ b/packages/hooks/src/use-svg-icon-render.ts @@ -0,0 +1,50 @@ +import { h } from 'vue'; +import type { Component } from 'vue'; + +/** + * Svg icon render hook + * + * @param SvgIcon Svg icon component + */ +export default function useSvgIconRender(SvgIcon: Component) { + interface IconConfig { + /** Iconify icon name */ + icon?: string; + /** Local icon name */ + localIcon?: string; + /** Icon color */ + color?: string; + /** Icon size */ + fontSize?: number; + } + + type IconStyle = Partial>; + + /** + * Svg icon VNode + * + * @param config + */ + const SvgIconVNode = (config: IconConfig) => { + const { color, fontSize, icon, localIcon } = config; + + const style: IconStyle = {}; + + if (color) { + style.color = color; + } + if (fontSize) { + style.fontSize = `${fontSize}px`; + } + + if (!icon && !localIcon) { + return undefined; + } + + return () => h(SvgIcon, { icon, localIcon, style }); + }; + + return { + SvgIconVNode + }; +} diff --git a/packages/hooks/src/use-table.ts b/packages/hooks/src/use-table.ts new file mode 100644 index 0000000..5b03852 --- /dev/null +++ b/packages/hooks/src/use-table.ts @@ -0,0 +1,132 @@ +import { computed, ref } from 'vue'; +import type { Ref, VNodeChild } from 'vue'; +import useBoolean from './use-boolean'; +import useLoading from './use-loading'; + +export interface PaginationData { + data: T[]; + pageNum: number; + pageSize: number; + total: number; +} + +type GetApiData = Pagination extends true ? PaginationData : ApiData[]; + +type Transform = ( + response: ResponseData +) => GetApiData; + +export type TableColumnCheckTitle = string | ((...args: any) => VNodeChild); + +export type TableColumnCheck = { + key: string; + title: TableColumnCheckTitle; + checked: boolean; + visible: boolean; +}; + +export interface UseTableOptions { + /** + * api function to get table data + */ + api: () => Promise; + /** + * whether to enable pagination + */ + pagination?: Pagination; + /** + * transform api response to table data + */ + transform: Transform; + /** + * columns factory + */ + columns: () => Column[]; + /** + * get column checks + */ + getColumnChecks: (columns: Column[]) => TableColumnCheck[]; + /** + * get columns + */ + getColumns: (columns: Column[], checks: TableColumnCheck[]) => Column[]; + /** + * callback when response fetched + */ + onFetched?: (data: GetApiData) => void | Promise; + /** + * whether to get data immediately + * + * @default true + */ + immediate?: boolean; +} + +export default function useTable( + options: UseTableOptions +) { + const { loading, startLoading, endLoading } = useLoading(); + const { bool: empty, setBool: setEmpty } = useBoolean(); + + const { api, pagination, transform, columns, getColumnChecks, getColumns, onFetched, immediate = true } = options; + + const data = ref([]) as Ref; + + const columnChecks = ref(getColumnChecks(columns())) as Ref; + + const $columns = computed(() => getColumns(columns(), columnChecks.value)); + + function reloadColumns() { + const checkMap = new Map(columnChecks.value.map(col => [col.key, col.checked])); + + const defaultChecks = getColumnChecks(columns()); + + columnChecks.value = defaultChecks.map(col => ({ + ...col, + checked: checkMap.get(col.key) ?? col.checked + })); + } + + async function getData() { + try { + startLoading(); + + const response = await api(); + + const transformed = transform(response); + + data.value = getTableData(transformed, pagination); + + setEmpty(data.value.length === 0); + + await onFetched?.(transformed); + } finally { + endLoading(); + } + } + + if (immediate) { + getData(); + } + + return { + loading, + empty, + data, + columns: $columns, + columnChecks, + reloadColumns, + getData + }; +} + +function getTableData( + data: GetApiData, + pagination?: Pagination +) { + if (pagination) { + return (data as PaginationData).data; + } + + return data as ApiData[]; +} diff --git a/packages/hooks/tsconfig.json b/packages/hooks/tsconfig.json new file mode 100644 index 0000000..5823ed5 --- /dev/null +++ b/packages/hooks/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ESNext", + "jsx": "preserve", + "lib": ["DOM", "ESNext"], + "baseUrl": ".", + "module": "ESNext", + "moduleResolution": "node", + "resolveJsonModule": true, + "types": ["node"], + "strict": true, + "strictNullChecks": true, + "noUnusedLocals": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/materials/package.json b/packages/materials/package.json new file mode 100644 index 0000000..4f70202 --- /dev/null +++ b/packages/materials/package.json @@ -0,0 +1,19 @@ +{ + "name": "@sa/materials", + "version": "2.0.2", + "exports": { + ".": "./src/index.ts" + }, + "typesVersions": { + "*": { + "*": ["./src/*"] + } + }, + "dependencies": { + "@sa/utils": "workspace:*", + "simplebar-vue": "2.4.2" + }, + "devDependencies": { + "typed-css-modules": "0.9.1" + } +} diff --git a/packages/materials/src/index.ts b/packages/materials/src/index.ts new file mode 100644 index 0000000..f6ca01d --- /dev/null +++ b/packages/materials/src/index.ts @@ -0,0 +1,6 @@ +import AdminLayout, { LAYOUT_MAX_Z_INDEX, LAYOUT_SCROLL_EL_ID } from './libs/admin-layout'; +import PageTab from './libs/page-tab'; +import SimpleScrollbar from './libs/simple-scrollbar'; + +export { AdminLayout, LAYOUT_SCROLL_EL_ID, LAYOUT_MAX_Z_INDEX, PageTab, SimpleScrollbar }; +export * from './types'; diff --git a/packages/materials/src/libs/admin-layout/index.module.css b/packages/materials/src/libs/admin-layout/index.module.css new file mode 100644 index 0000000..e5c8ac8 --- /dev/null +++ b/packages/materials/src/libs/admin-layout/index.module.css @@ -0,0 +1,63 @@ +/* @type */ + +.layout-header, +.layout-header-placement { + height: var(--soy-header-height); +} + +.layout-header { + z-index: var(--soy-header-z-index); +} + +.layout-tab { + top: var(--soy-header-height); + height: var(--soy-tab-height); + z-index: var(--soy-tab-z-index); +} + +.layout-tab-placement { + height: var(--soy-tab-height); +} + +.layout-sider { + width: var(--soy-sider-width); + z-index: var(--soy-sider-z-index); +} + +.layout-mobile-sider { + z-index: var(--soy-sider-z-index); +} + +.layout-mobile-sider-mask { + z-index: var(--soy-mobile-sider-z-index); +} + +.layout-sider_collapsed { + width: var(--soy-sider-collapsed-width); + z-index: var(--soy-sider-z-index); +} + +.layout-footer, +.layout-footer-placement { + height: var(--soy-footer-height); +} + +.layout-footer { + z-index: var(--soy-footer-z-index); +} + +.left-gap { + padding-left: var(--soy-sider-width); +} + +.left-gap_collapsed { + padding-left: var(--soy-sider-collapsed-width); +} + +.sider-padding-top { + padding-top: var(--soy-header-height); +} + +.sider-padding-bottom { + padding-bottom: var(--soy-footer-height); +} diff --git a/packages/materials/src/libs/admin-layout/index.module.css.d.ts b/packages/materials/src/libs/admin-layout/index.module.css.d.ts new file mode 100644 index 0000000..c326c84 --- /dev/null +++ b/packages/materials/src/libs/admin-layout/index.module.css.d.ts @@ -0,0 +1,18 @@ +declare const styles: { + readonly 'layout-header': string; + readonly 'layout-header-placement': string; + readonly 'layout-tab': string; + readonly 'layout-tab-placement': string; + readonly 'layout-sider': string; + readonly 'layout-mobile-sider': string; + readonly 'layout-mobile-sider-mask': string; + readonly 'layout-sider_collapsed': string; + readonly 'layout-footer': string; + readonly 'layout-footer-placement': string; + readonly 'left-gap': string; + readonly 'left-gap_collapsed': string; + readonly 'sider-padding-top': string; + readonly 'sider-padding-bottom': string; +}; + +export default styles; diff --git a/packages/materials/src/libs/admin-layout/index.ts b/packages/materials/src/libs/admin-layout/index.ts new file mode 100644 index 0000000..0687362 --- /dev/null +++ b/packages/materials/src/libs/admin-layout/index.ts @@ -0,0 +1,5 @@ +import AdminLayout from './index.vue'; +import { LAYOUT_MAX_Z_INDEX, LAYOUT_SCROLL_EL_ID } from './shared'; + +export default AdminLayout; +export { LAYOUT_SCROLL_EL_ID, LAYOUT_MAX_Z_INDEX }; diff --git a/packages/materials/src/libs/admin-layout/index.vue b/packages/materials/src/libs/admin-layout/index.vue new file mode 100644 index 0000000..8bbc552 --- /dev/null +++ b/packages/materials/src/libs/admin-layout/index.vue @@ -0,0 +1,236 @@ + + + + + diff --git a/packages/materials/src/libs/admin-layout/shared.ts b/packages/materials/src/libs/admin-layout/shared.ts new file mode 100644 index 0000000..940451e --- /dev/null +++ b/packages/materials/src/libs/admin-layout/shared.ts @@ -0,0 +1,68 @@ +import type { AdminLayoutProps, LayoutCssVars, LayoutCssVarsProps } from '../../types'; + +/** The id of the scroll element of the layout */ +export const LAYOUT_SCROLL_EL_ID = '__SCROLL_EL_ID__'; + +/** The max z-index of the layout */ +export const LAYOUT_MAX_Z_INDEX = 100; + +/** + * Create layout css vars by css vars props + * + * @param props Css vars props + */ +function createLayoutCssVarsByCssVarsProps(props: LayoutCssVarsProps) { + const cssVars: LayoutCssVars = { + '--soy-header-height': `${props.headerHeight}px`, + '--soy-header-z-index': props.headerZIndex, + '--soy-tab-height': `${props.tabHeight}px`, + '--soy-tab-z-index': props.tabZIndex, + '--soy-sider-width': `${props.siderWidth}px`, + '--soy-sider-collapsed-width': `${props.siderCollapsedWidth}px`, + '--soy-sider-z-index': props.siderZIndex, + '--soy-mobile-sider-z-index': props.mobileSiderZIndex, + '--soy-footer-height': `${props.footerHeight}px`, + '--soy-footer-z-index': props.footerZIndex + }; + + return cssVars; +} + +/** + * Create layout css vars + * + * @param props + */ +export function createLayoutCssVars(props: AdminLayoutProps) { + const { + mode, + isMobile, + maxZIndex = LAYOUT_MAX_Z_INDEX, + headerHeight, + tabHeight, + siderWidth, + siderCollapsedWidth, + footerHeight + } = props; + + const headerZIndex = maxZIndex - 3; + const tabZIndex = maxZIndex - 5; + const siderZIndex = mode === 'vertical' || isMobile ? maxZIndex - 1 : maxZIndex - 4; + const mobileSiderZIndex = isMobile ? maxZIndex - 2 : 0; + const footerZIndex = maxZIndex - 5; + + const cssProps: LayoutCssVarsProps = { + headerHeight, + headerZIndex, + tabHeight, + tabZIndex, + siderWidth, + siderZIndex, + mobileSiderZIndex, + siderCollapsedWidth, + footerHeight, + footerZIndex + }; + + return createLayoutCssVarsByCssVarsProps(cssProps); +} diff --git a/packages/materials/src/libs/page-tab/button-tab.vue b/packages/materials/src/libs/page-tab/button-tab.vue new file mode 100644 index 0000000..0826e71 --- /dev/null +++ b/packages/materials/src/libs/page-tab/button-tab.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/packages/materials/src/libs/page-tab/chrome-tab-bg.vue b/packages/materials/src/libs/page-tab/chrome-tab-bg.vue new file mode 100644 index 0000000..151e03a --- /dev/null +++ b/packages/materials/src/libs/page-tab/chrome-tab-bg.vue @@ -0,0 +1,31 @@ + + + + + diff --git a/packages/materials/src/libs/page-tab/chrome-tab.vue b/packages/materials/src/libs/page-tab/chrome-tab.vue new file mode 100644 index 0000000..e4509b0 --- /dev/null +++ b/packages/materials/src/libs/page-tab/chrome-tab.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/packages/materials/src/libs/page-tab/index.module.css b/packages/materials/src/libs/page-tab/index.module.css new file mode 100644 index 0000000..d2baf65 --- /dev/null +++ b/packages/materials/src/libs/page-tab/index.module.css @@ -0,0 +1,121 @@ +/* @type */ + +.button-tab { + border-color: #e5e7eb; +} + +.button-tab_dark { + border-color: #ffffff3d; +} + +.button-tab:hover { + color: var(--soy-primary-color); + border-color: var(--soy-primary-color-opacity3); +} + +.button-tab_active { + color: var(--soy-primary-color); + border-color: var(--soy-primary-color-opacity3); + background-color: var(--soy-primary-color-opacity1); +} + +.button-tab_active_dark { + background-color: var(--soy-primary-color-opacity2); +} + +.button-tab .svg-close:hover { + font-size: 12px; + color: #ffffff; + background-color: var(--soy-primary-color); +} + +.button-tab_dark .svg-close:hover { + color: #000000; +} + +.chrome-tab:hover { + z-index: 9; +} + +.chrome-tab_active { + z-index: 10; + color: var(--soy-primary-color); +} + +.chrome-tab__bg { + color: transparent; +} + +.chrome-tab_active .chrome-tab__bg { + color: var(--soy-primary-color1); +} + +.chrome-tab_active_dark .chrome-tab__bg { + color: var(--soy-primary-color2); +} + +.chrome-tab:hover .chrome-tab__bg { + color: #dee1e6; +} + +.chrome-tab_active:hover .chrome-tab__bg { + color: var(--soy-primary-color1); +} + +.chrome-tab_dark:hover .chrome-tab__bg { + color: #333333; +} + +.chrome-tab_active_dark:hover .chrome-tab__bg { + color: var(--soy-primary-color2); +} + +.chrome-tab .svg-close:hover { + font-size: 12px; + color: #ffffff; + background-color: #9ca3af; +} + +.chrome-tab_active .svg-close:hover { + background-color: var(--soy-primary-color); +} + +.chrome-tab_dark .svg-close:hover { + color: #000000; +} + +.chrome-tab_active .chrome-tab-divider { + opacity: 0; +} + +.chrome-tab:hover .chrome-tab-divider { + opacity: 0; +} + +.chrome-tab_dark .chrome-tab-divider { + background-color: rgba(255, 255, 255, 0.9); +} + +.slider-tab { + background-color: transparent; + height: 100%; + border-bottom: 2px solid transparent; +} + +.slider-tab_dark { + background-color: transparent; +} + +.slider-tab:hover { + color: var(--soy-primary-color); +} + +.slider-tab_active { + color: var(--soy-primary-color); + background-color: var(--soy-primary-color-opacity1); + border-bottom-color: var(--soy-primary-color); +} + +.slider-tab_active_dark { + background-color: var(--soy-primary-color-opacity2); +} diff --git a/packages/materials/src/libs/page-tab/index.module.css.d.ts b/packages/materials/src/libs/page-tab/index.module.css.d.ts new file mode 100644 index 0000000..47c5999 --- /dev/null +++ b/packages/materials/src/libs/page-tab/index.module.css.d.ts @@ -0,0 +1,19 @@ +declare const styles: { + readonly 'button-tab': string; + readonly 'button-tab_dark': string; + readonly 'button-tab_active': string; + readonly 'button-tab_active_dark': string; + readonly 'chrome-tab': string; + readonly 'chrome-tab_active': string; + readonly 'chrome-tab__bg': string; + readonly 'chrome-tab_active_dark': string; + readonly 'chrome-tab_dark': string; + readonly 'chrome-tab-divider': string; + readonly 'svg-close': string; + readonly 'slider-tab': string; + readonly 'slider-tab_active': string; + readonly 'slider-tab_active_dark': string; + readonly 'slider-tab_dark': string; +}; + +export default styles; diff --git a/packages/materials/src/libs/page-tab/index.ts b/packages/materials/src/libs/page-tab/index.ts new file mode 100644 index 0000000..b402adf --- /dev/null +++ b/packages/materials/src/libs/page-tab/index.ts @@ -0,0 +1,3 @@ +import PageTab from './index.vue'; + +export default PageTab; diff --git a/packages/materials/src/libs/page-tab/index.vue b/packages/materials/src/libs/page-tab/index.vue new file mode 100644 index 0000000..c1f6b62 --- /dev/null +++ b/packages/materials/src/libs/page-tab/index.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/packages/materials/src/libs/page-tab/shared.ts b/packages/materials/src/libs/page-tab/shared.ts new file mode 100644 index 0000000..db71f5d --- /dev/null +++ b/packages/materials/src/libs/page-tab/shared.ts @@ -0,0 +1,31 @@ +import { addColorAlpha, transformColorWithOpacity } from '@sa/color'; +import type { PageTabCssVars, PageTabCssVarsProps } from '../../types'; + +/** The active color of the tab */ +export const ACTIVE_COLOR = '#1890ff'; + +function createCssVars(props: PageTabCssVarsProps) { + const cssVars: PageTabCssVars = { + '--soy-primary-color': props.primaryColor, + '--soy-primary-color1': props.primaryColor1, + '--soy-primary-color2': props.primaryColor2, + '--soy-primary-color-opacity1': props.primaryColorOpacity1, + '--soy-primary-color-opacity2': props.primaryColorOpacity2, + '--soy-primary-color-opacity3': props.primaryColorOpacity3 + }; + + return cssVars; +} + +export function createTabCssVars(primaryColor: string) { + const cssProps: PageTabCssVarsProps = { + primaryColor, + primaryColor1: transformColorWithOpacity(primaryColor, 0.1, '#ffffff'), + primaryColor2: transformColorWithOpacity(primaryColor, 0.3, '#000000'), + primaryColorOpacity1: addColorAlpha(primaryColor, 0.1), + primaryColorOpacity2: addColorAlpha(primaryColor, 0.15), + primaryColorOpacity3: addColorAlpha(primaryColor, 0.3) + }; + + return createCssVars(cssProps); +} diff --git a/packages/materials/src/libs/page-tab/slider-tab.vue b/packages/materials/src/libs/page-tab/slider-tab.vue new file mode 100644 index 0000000..3521e5f --- /dev/null +++ b/packages/materials/src/libs/page-tab/slider-tab.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/packages/materials/src/libs/page-tab/svg-close.vue b/packages/materials/src/libs/page-tab/svg-close.vue new file mode 100644 index 0000000..26ba07a --- /dev/null +++ b/packages/materials/src/libs/page-tab/svg-close.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/packages/materials/src/libs/simple-scrollbar/index.ts b/packages/materials/src/libs/simple-scrollbar/index.ts new file mode 100644 index 0000000..1453a06 --- /dev/null +++ b/packages/materials/src/libs/simple-scrollbar/index.ts @@ -0,0 +1,3 @@ +import SimpleScrollbar from './index.vue'; + +export default SimpleScrollbar; diff --git a/packages/materials/src/libs/simple-scrollbar/index.vue b/packages/materials/src/libs/simple-scrollbar/index.vue new file mode 100644 index 0000000..1e8076b --- /dev/null +++ b/packages/materials/src/libs/simple-scrollbar/index.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/packages/materials/src/types/index.ts b/packages/materials/src/types/index.ts new file mode 100644 index 0000000..e0649f1 --- /dev/null +++ b/packages/materials/src/types/index.ts @@ -0,0 +1,291 @@ +/** Header config */ +interface AdminLayoutHeaderConfig { + /** + * Whether header is visible + * + * @default true + */ + headerVisible?: boolean; + /** + * Header height + * + * @default 56px + */ + headerHeight?: number; +} + +/** Tab config */ +interface AdminLayoutTabConfig { + /** + * Whether tab is visible + * + * @default true + */ + tabVisible?: boolean; + /** + * Tab class + * + * @default '' + */ + tabClass?: string; + /** + * Tab height + * + * @default 48px + */ + tabHeight?: number; +} + +/** Sider config */ +interface AdminLayoutSiderConfig { + /** + * Whether sider is visible + * + * @default true + */ + siderVisible?: boolean; + /** + * Sider class + * + * @default '' + */ + siderClass?: string; + /** + * Mobile sider class + * + * @default '' + */ + mobileSiderClass?: string; + /** + * Sider collapse status + * + * @default false + */ + siderCollapse?: boolean; + /** + * Sider width when collapse is false + * + * @default '220px' + */ + siderWidth?: number; + /** + * Sider width when collapse is true + * + * @default '64px' + */ + siderCollapsedWidth?: number; +} + +/** Content config */ +export interface AdminLayoutContentConfig { + /** + * Content class + * + * @default '' + */ + contentClass?: string; + /** + * Whether content is full the page + * + * If true, other elements will be hidden by `display: none` + */ + fullContent?: boolean; +} + +/** Footer config */ +export interface AdminLayoutFooterConfig { + /** + * Whether footer is visible + * + * @default true + */ + footerVisible?: boolean; + /** + * Whether footer is fixed + * + * @default true + */ + fixedFooter?: boolean; + /** + * Footer class + * + * @default '' + */ + footerClass?: string; + /** + * Footer height + * + * @default 48px + */ + footerHeight?: number; + /** + * Whether footer is on the right side + * + * When the layout is vertical, the footer is on the right side + */ + rightFooter?: boolean; +} + +/** + * Layout mode + * + * - Horizontal + * - Vertical + */ +export type LayoutMode = 'horizontal' | 'vertical'; + +/** + * The scroll mode when content overflow + * + * - Wrapper: the layout component's wrapper element has a scrollbar + * - Content: the layout component's content element has a scrollbar + * + * @default 'wrapper' + */ +export type LayoutScrollMode = 'wrapper' | 'content'; + +/** Admin layout props */ +export interface AdminLayoutProps + extends + AdminLayoutHeaderConfig, + AdminLayoutTabConfig, + AdminLayoutSiderConfig, + AdminLayoutContentConfig, + AdminLayoutFooterConfig { + /** + * Layout mode + * + * - {@link LayoutMode} + */ + mode?: LayoutMode; + /** Is mobile layout */ + isMobile?: boolean; + /** + * Scroll mode + * + * - {@link ScrollMode} + */ + scrollMode?: LayoutScrollMode; + /** + * The id of the scroll element of the layout + * + * It can be used to get the corresponding Dom and scroll it + * + * @example + * use the default id by import + * ```ts + * import { adminLayoutScrollElId } from '@sa/vue-materials'; + * ``` + * + * @default + * ```ts + * const adminLayoutScrollElId = '__ADMIN_LAYOUT_SCROLL_EL_ID__' + * ``` + */ + scrollElId?: string; + /** The class of the scroll element */ + scrollElClass?: string; + /** The class of the scroll wrapper element */ + scrollWrapperClass?: string; + /** + * The common class of the layout + * + * Is can be used to configure the transition animation + * + * @default 'transition-all-300' + */ + commonClass?: string; + /** + * Whether fix the header and tab + * + * @default true + */ + fixedTop?: boolean; + /** + * The max z-index of the layout + * + * The z-index of Header,Tab,Sider and Footer will not exceed this value + */ + maxZIndex?: number; +} + +type Kebab = S extends Uncapitalize ? S : `-${Uncapitalize}`; + +type KebabCase = S extends `${infer Start}${infer End}` + ? `${Uncapitalize}${KebabCase>}` + : S; + +type Prefix = '--soy-'; + +export type LayoutCssVarsProps = Pick< + AdminLayoutProps, + 'headerHeight' | 'tabHeight' | 'siderWidth' | 'siderCollapsedWidth' | 'footerHeight' +> & { + headerZIndex?: number; + tabZIndex?: number; + siderZIndex?: number; + mobileSiderZIndex?: number; + footerZIndex?: number; +}; + +export type LayoutCssVars = { + [K in keyof LayoutCssVarsProps as `${Prefix}${KebabCase}`]: string | number; +}; + +/** + * The mode of the tab + * + * - Button: button style + * - Chrome: chrome style + * + * @default chrome + */ +export type PageTabMode = 'button' | 'chrome' | 'slider'; + +export interface PageTabProps { + /** Whether is dark mode */ + darkMode?: boolean; + /** + * The mode of the tab + * + * - {@link TabMode} + */ + mode?: PageTabMode; + /** + * The common class of the layout + * + * Is can be used to configure the transition animation + * + * @default 'transition-all-300' + */ + commonClass?: string; + /** The class of the button tab */ + buttonClass?: string; + /** The class of the chrome tab */ + chromeClass?: string; + /** The class of the title tab */ + sliderClass?: string; + /** Whether the tab is active */ + active?: boolean; + /** The color of the active tab */ + activeColor?: string; + /** + * Whether the tab is closable + * + * Show the close icon when true + */ + closable?: boolean; +} + +export type PageTabCssVarsProps = { + primaryColor: string; + primaryColor1: string; + primaryColor2: string; + primaryColorOpacity1: string; + primaryColorOpacity2: string; + primaryColorOpacity3: string; +}; + +export type PageTabCssVars = { + [K in keyof PageTabCssVarsProps as `${Prefix}${KebabCase}`]: string | number; +}; diff --git a/packages/materials/tsconfig.json b/packages/materials/tsconfig.json new file mode 100644 index 0000000..5823ed5 --- /dev/null +++ b/packages/materials/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ESNext", + "jsx": "preserve", + "lib": ["DOM", "ESNext"], + "baseUrl": ".", + "module": "ESNext", + "moduleResolution": "node", + "resolveJsonModule": true, + "types": ["node"], + "strict": true, + "strictNullChecks": true, + "noUnusedLocals": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/scripts/bin.ts b/packages/scripts/bin.ts new file mode 100644 index 0000000..1a1817b --- /dev/null +++ b/packages/scripts/bin.ts @@ -0,0 +1,3 @@ +#!/usr/bin/env tsx + +import './src/index.ts'; diff --git a/packages/scripts/package.json b/packages/scripts/package.json new file mode 100644 index 0000000..60589a1 --- /dev/null +++ b/packages/scripts/package.json @@ -0,0 +1,28 @@ +{ + "name": "@sa/scripts", + "version": "2.0.2", + "bin": { + "sa": "./bin.ts" + }, + "exports": { + ".": "./src/index.ts" + }, + "typesVersions": { + "*": { + "*": ["./src/*"] + } + }, + "devDependencies": { + "@soybeanjs/changelog": "0.3.25", + "bumpp": "10.3.2", + "c12": "3.3.3", + "cac": "6.7.14", + "consola": "3.4.2", + "enquirer": "2.4.1", + "execa": "9.6.1", + "kolorist": "1.8.0", + "npm-check-updates": "19.2.0", + "picomatch": "4.0.3", + "rimraf": "6.1.2" + } +} diff --git a/packages/scripts/src/commands/changelog.ts b/packages/scripts/src/commands/changelog.ts new file mode 100644 index 0000000..e01ce40 --- /dev/null +++ b/packages/scripts/src/commands/changelog.ts @@ -0,0 +1,10 @@ +import { generateChangelog, generateTotalChangelog } from '@soybeanjs/changelog'; +import type { ChangelogOption } from '@soybeanjs/changelog'; + +export async function genChangelog(options?: Partial, total = false) { + if (total) { + await generateTotalChangelog(options); + } else { + await generateChangelog(options); + } +} diff --git a/packages/scripts/src/commands/cleanup.ts b/packages/scripts/src/commands/cleanup.ts new file mode 100644 index 0000000..a9d3990 --- /dev/null +++ b/packages/scripts/src/commands/cleanup.ts @@ -0,0 +1,5 @@ +import { rimraf } from 'rimraf'; + +export async function cleanup(paths: string[]) { + await rimraf(paths, { glob: true }); +} diff --git a/packages/scripts/src/commands/git-commit.ts b/packages/scripts/src/commands/git-commit.ts new file mode 100644 index 0000000..35c0df5 --- /dev/null +++ b/packages/scripts/src/commands/git-commit.ts @@ -0,0 +1,84 @@ +import path from 'node:path'; +import { readFileSync } from 'node:fs'; +import { prompt } from 'enquirer'; +import { execCommand } from '../shared'; +import { locales } from '../locales'; +import type { Lang } from '../locales'; + +interface PromptObject { + types: string; + scopes: string; + description: string; +} + +/** + * Git commit with Conventional Commits standard + * + * @param lang + */ +export async function gitCommit(lang: Lang = 'en-us') { + const { gitCommitMessages, gitCommitTypes, gitCommitScopes } = locales[lang]; + + const typesChoices = gitCommitTypes.map(([value, msg]) => { + const nameWithSuffix = `${value}:`; + + const message = `${nameWithSuffix.padEnd(12)}${msg}`; + + return { + name: value, + message + }; + }); + + const scopesChoices = gitCommitScopes.map(([value, msg]) => ({ + name: value, + message: `${value.padEnd(30)} (${msg})` + })); + + const result = await prompt([ + { + name: 'types', + type: 'select', + message: gitCommitMessages.types, + choices: typesChoices + }, + { + name: 'scopes', + type: 'select', + message: gitCommitMessages.scopes, + choices: scopesChoices + }, + { + name: 'description', + type: 'text', + message: gitCommitMessages.description + } + ]); + + const breaking = result.description.startsWith('!') ? '!' : ''; + + const description = result.description.replace(/^!/, '').trim(); + + const commitMsg = `${result.types}(${result.scopes})${breaking}: ${description}`; + + await execCommand('git', ['commit', '-m', commitMsg], { stdio: 'inherit' }); +} + +/** Git commit message verify */ +export async function gitCommitVerify(lang: Lang = 'en-us', ignores: RegExp[] = []) { + const gitPath = await execCommand('git', ['rev-parse', '--show-toplevel']); + + const gitMsgPath = path.join(gitPath, '.git', 'COMMIT_EDITMSG'); + + const commitMsg = readFileSync(gitMsgPath, 'utf8').trim(); + + if (ignores.some(regExp => regExp.test(commitMsg))) return; + + const REG_EXP = /(?[a-z]+)(?:\((?.+)\))?(?!)?: (?.+)/i; + + if (!REG_EXP.test(commitMsg)) { + const errorMsg = locales[lang].gitCommitVerify; + + throw new Error(errorMsg); + } +} diff --git a/packages/scripts/src/commands/index.ts b/packages/scripts/src/commands/index.ts new file mode 100644 index 0000000..db4fc15 --- /dev/null +++ b/packages/scripts/src/commands/index.ts @@ -0,0 +1,6 @@ +export * from './git-commit'; +export * from './cleanup'; +export * from './update-pkg'; +export * from './changelog'; +export * from './release'; +export * from './router'; diff --git a/packages/scripts/src/commands/release.ts b/packages/scripts/src/commands/release.ts new file mode 100644 index 0000000..1cf3bc3 --- /dev/null +++ b/packages/scripts/src/commands/release.ts @@ -0,0 +1,12 @@ +import { versionBump } from 'bumpp'; + +export async function release(execute = 'pnpm sa changelog', push = true) { + await versionBump({ + files: ['**/package.json', '!**/node_modules'], + execute, + all: true, + tag: true, + commit: 'chore(projects): release v%s', + push + }); +} diff --git a/packages/scripts/src/commands/router.ts b/packages/scripts/src/commands/router.ts new file mode 100644 index 0000000..f407589 --- /dev/null +++ b/packages/scripts/src/commands/router.ts @@ -0,0 +1,90 @@ +import process from 'node:process'; +import path from 'node:path'; +import { writeFile } from 'node:fs/promises'; +import { existsSync, mkdirSync } from 'node:fs'; +import { prompt } from 'enquirer'; +import { green, red } from 'kolorist'; + +interface PromptObject { + routeName: string; + addRouteParams: boolean; + routeParams: string; +} + +/** generate route */ +export async function generateRoute() { + const result = await prompt([ + { + name: 'routeName', + type: 'text', + message: 'please enter route name', + initial: 'demo-route_child' + }, + { + name: 'addRouteParams', + type: 'confirm', + message: 'add route params?', + initial: false + } + ]); + + if (result.addRouteParams) { + const answers = await prompt({ + name: 'routeParams', + type: 'text', + message: 'please enter route params', + initial: 'id' + }); + + Object.assign(result, answers); + } + + const PAGE_DIR_NAME_PATTERN = /^[\w-]+[0-9a-zA-Z]+$/; + + if (!PAGE_DIR_NAME_PATTERN.test(result.routeName)) { + throw new Error(`${red('route name is invalid, it only allow letters, numbers, "-" or "_"')}. +For example: +(1) one level route: ${green('demo-route')} +(2) two level route: ${green('demo-route_child')} +(3) multi level route: ${green('demo-route_child_child')} +(4) group route: ${green('_ignore_demo-route')}' +`); + } + + const PARAM_REG = /^\w+$/g; + + if (result.routeParams && !PARAM_REG.test(result.routeParams)) { + throw new Error(red('route params is invalid, it only allow letters, numbers or "_".')); + } + + const cwd = process.cwd(); + + const [dir, ...rest] = result.routeName.split('_') as string[]; + + let routeDir = path.join(cwd, 'src', 'views', dir); + + if (rest.length) { + routeDir = path.join(routeDir, rest.join('_')); + } + + if (!existsSync(routeDir)) { + mkdirSync(routeDir, { recursive: true }); + } else { + throw new Error(red('route already exists')); + } + + const fileName = result.routeParams ? `[${result.routeParams}].vue` : 'index.vue'; + + const vueTemplate = ` + + + + +`; + + const filePath = path.join(routeDir, fileName); + + await writeFile(filePath, vueTemplate); +} diff --git a/packages/scripts/src/commands/update-pkg.ts b/packages/scripts/src/commands/update-pkg.ts new file mode 100644 index 0000000..25e168e --- /dev/null +++ b/packages/scripts/src/commands/update-pkg.ts @@ -0,0 +1,5 @@ +import { execCommand } from '../shared'; + +export async function updatePkg(args: string[] = ['--deep', '-u']) { + execCommand('npx', ['npm-check-updates', ...args], { stdio: 'inherit' }); +} diff --git a/packages/scripts/src/config/index.ts b/packages/scripts/src/config/index.ts new file mode 100644 index 0000000..0fd9fbe --- /dev/null +++ b/packages/scripts/src/config/index.ts @@ -0,0 +1,39 @@ +import process from 'node:process'; +import { loadConfig } from 'c12'; +import type { CliOption } from '../types'; + +const defaultOptions: CliOption = { + cwd: process.cwd(), + cleanupDirs: [ + '**/dist', + '**/package-lock.json', + '**/yarn.lock', + '**/pnpm-lock.yaml', + '**/node_modules', + '!node_modules/**' + ], + ncuCommandArgs: ['--deep', '-u'], + changelogOptions: {}, + gitCommitVerifyIgnores: [ + /^((Merge pull request)|(Merge (.*?) into (.*?)|(Merge branch (.*?)))(?:\r?\n)*$)/m, + /^(Merge tag (.*?))(?:\r?\n)*$/m, + /^(R|r)evert (.*)/, + /^(amend|fixup|squash)!/, + /^(Merged (.*?)(in|into) (.*)|Merged PR (.*): (.*))/, + /^Merge remote-tracking branch(\s*)(.*)/, + /^Automatic merge(.*)/, + /^Auto-merged (.*?) into (.*)/ + ] +}; + +export async function loadCliOptions(overrides?: Partial, cwd = process.cwd()) { + const { config } = await loadConfig>({ + name: 'soybean', + defaults: defaultOptions, + overrides, + cwd, + packageJson: true + }); + + return config as CliOption; +} diff --git a/packages/scripts/src/index.ts b/packages/scripts/src/index.ts new file mode 100644 index 0000000..34367d7 --- /dev/null +++ b/packages/scripts/src/index.ts @@ -0,0 +1,109 @@ +import cac from 'cac'; +import { blue, lightGreen } from 'kolorist'; +import { version } from '../package.json'; +import { cleanup, genChangelog, generateRoute, gitCommit, gitCommitVerify, release, updatePkg } from './commands'; +import { loadCliOptions } from './config'; +import type { Lang } from './locales'; + +type Command = 'cleanup' | 'update-pkg' | 'git-commit' | 'git-commit-verify' | 'changelog' | 'release' | 'gen-route'; + +type CommandAction = (args?: A) => Promise | void; + +type CommandWithAction = Record }>; + +interface CommandArg { + /** Execute additional command after bumping and before git commit. Defaults to 'pnpm sa changelog' */ + execute?: string; + /** Indicates whether to push the git commit and tag. Defaults to true */ + push?: boolean; + /** Generate changelog by total tags */ + total?: boolean; + /** + * The glob pattern of dirs to clean up + * + * If not set, it will use the default value + * + * Multiple values use "," to separate them + */ + cleanupDir?: string; + /** + * display lang of cli + * + * @default 'en-us' + */ + lang?: Lang; +} + +export async function setupCli() { + const cliOptions = await loadCliOptions(); + + const cli = cac(blue('soybean-admin')); + + cli + .version(lightGreen(version)) + .option( + '-e, --execute [command]', + "Execute additional command after bumping and before git commit. Defaults to 'npx soy changelog'" + ) + .option('-p, --push', 'Indicates whether to push the git commit and tag') + .option('-t, --total', 'Generate changelog by total tags') + .option( + '-c, --cleanupDir ', + 'The glob pattern of dirs to cleanup, If not set, it will use the default value, Multiple values use "," to separate them' + ) + .option('-l, --lang ', 'display lang of cli', { default: 'en-us', type: [String] }) + .help(); + + const commands: CommandWithAction = { + cleanup: { + desc: 'delete dirs: node_modules, dist, etc.', + action: async () => { + await cleanup(cliOptions.cleanupDirs); + } + }, + 'update-pkg': { + desc: 'update package.json dependencies versions', + action: async () => { + await updatePkg(cliOptions.ncuCommandArgs); + } + }, + 'git-commit': { + desc: 'git commit, generate commit message which match Conventional Commits standard', + action: async args => { + await gitCommit(args?.lang); + } + }, + 'git-commit-verify': { + desc: 'verify git commit message, make sure it match Conventional Commits standard', + action: async args => { + await gitCommitVerify(args?.lang, cliOptions.gitCommitVerifyIgnores); + } + }, + changelog: { + desc: 'generate changelog', + action: async args => { + await genChangelog(cliOptions.changelogOptions, args?.total); + } + }, + release: { + desc: 'release: update version, generate changelog, commit code', + action: async args => { + await release(args?.execute, args?.push); + } + }, + 'gen-route': { + desc: 'generate route', + action: async () => { + await generateRoute(); + } + } + }; + + for (const [command, { desc, action }] of Object.entries(commands)) { + cli.command(command, lightGreen(desc)).action(action); + } + + cli.parse(); +} + +setupCli(); diff --git a/packages/scripts/src/locales/index.ts b/packages/scripts/src/locales/index.ts new file mode 100644 index 0000000..74321d0 --- /dev/null +++ b/packages/scripts/src/locales/index.ts @@ -0,0 +1,82 @@ +import { bgRed, green, red, yellow } from 'kolorist'; + +export type Lang = 'zh-cn' | 'en-us'; + +export const locales = { + 'zh-cn': { + gitCommitMessages: { + types: '请选择提交类型', + scopes: '请选择提交范围', + description: `请输入描述信息(${yellow('!')}开头表示破坏性改动` + }, + gitCommitTypes: [ + ['feat', '新功能'], + ['feat-wip', '开发中的功能,比如某功能的部分代码'], + ['fix', '修复Bug'], + ['docs', '只涉及文档更新'], + ['typo', '代码或文档勘误,比如错误拼写'], + ['style', '修改代码风格,不影响代码含义的变更'], + ['refactor', '代码重构,既不修复 bug 也不添加功能的代码变更'], + ['perf', '可提高性能的代码更改'], + ['optimize', '优化代码质量的代码更改'], + ['test', '添加缺失的测试或更正现有测试'], + ['build', '影响构建系统或外部依赖项的更改'], + ['ci', '对 CI 配置文件和脚本的更改'], + ['chore', '没有修改src或测试文件的其他变更'], + ['revert', '还原先前的提交'] + ] as [string, string][], + gitCommitScopes: [ + ['projects', '项目'], + ['packages', '包'], + ['components', '组件'], + ['hooks', '钩子函数'], + ['utils', '工具函数'], + ['types', 'TS类型声明'], + ['styles', '代码风格'], + ['deps', '项目依赖'], + ['release', '发布项目新版本'], + ['other', '其他的变更'] + ] as [string, string][], + gitCommitVerify: `${bgRed(' 错误 ')} ${red('git 提交信息必须符合 Conventional Commits 标准!')}\n\n${green( + '推荐使用命令 `pnpm commit` 生成符合 Conventional Commits 标准的提交信息。\n获取有关 Conventional Commits 的更多信息,请访问此链接: https://conventionalcommits.org' + )}` + }, + 'en-us': { + gitCommitMessages: { + types: 'Please select a type', + scopes: 'Please select a scope', + description: `Please enter a description (add prefix ${yellow('!')} to indicate breaking change)` + }, + gitCommitTypes: [ + ['feat', 'A new feature'], + ['feat-wip', 'Features in development, such as partial code for a certain feature'], + ['fix', 'A bug fix'], + ['docs', 'Documentation only changes'], + ['typo', 'Code or document corrections, such as spelling errors'], + ['style', 'Changes that do not affect the meaning of the code'], + ['refactor', 'A code change that neither fixes a bug nor adds a feature'], + ['perf', 'A code change that improves performance'], + ['optimize', 'A code change that optimizes code quality'], + ['test', 'Adding missing tests or correcting existing tests'], + ['build', 'Changes that affect the build system or external dependencies'], + ['ci', 'Changes to our CI configuration files and scripts'], + ['chore', "Other changes that don't modify src or test files"], + ['revert', 'Reverts a previous commit'] + ] as [string, string][], + gitCommitScopes: [ + ['projects', 'project'], + ['packages', 'packages'], + ['components', 'components'], + ['hooks', 'hook functions'], + ['utils', 'utils functions'], + ['types', 'TS declaration'], + ['styles', 'style'], + ['deps', 'project dependencies'], + ['release', 'release project'], + ['other', 'other changes'] + ] as [string, string][], + gitCommitVerify: `${bgRed(' ERROR ')} ${red('git commit message must match the Conventional Commits standard!')}\n\n${green( + 'Recommended to use the command `pnpm commit` to generate Conventional Commits compliant commit information.\nGet more info about Conventional Commits, follow this link: https://conventionalcommits.org' + )}` + } +} satisfies Record>; diff --git a/packages/scripts/src/shared/index.ts b/packages/scripts/src/shared/index.ts new file mode 100644 index 0000000..9b1763f --- /dev/null +++ b/packages/scripts/src/shared/index.ts @@ -0,0 +1,7 @@ +import type { Options } from 'execa'; + +export async function execCommand(cmd: string, args: string[], options?: Options) { + const { execa } = await import('execa'); + const res = await execa(cmd, args, options); + return (res?.stdout as string)?.trim() || ''; +} diff --git a/packages/scripts/src/types/index.ts b/packages/scripts/src/types/index.ts new file mode 100644 index 0000000..32bc091 --- /dev/null +++ b/packages/scripts/src/types/index.ts @@ -0,0 +1,31 @@ +import type { ChangelogOption } from '@soybeanjs/changelog'; + +export interface CliOption { + /** The project root directory */ + cwd: string; + /** + * Cleanup dirs + * + * Glob pattern syntax {@link https://github.com/isaacs/minimatch} + * + * @default + * ```json + * ["** /dist", "** /pnpm-lock.yaml", "** /node_modules", "!node_modules/**"] + * ``` + */ + cleanupDirs: string[]; + /** + * Npm-check-updates command args + * + * @default ['--deep', '-u'] + */ + ncuCommandArgs: string[]; + /** + * Options of generate changelog + * + * @link https://github.com/soybeanjs/changelog + */ + changelogOptions: Partial; + /** The ignore pattern list of git commit verify */ + gitCommitVerifyIgnores: RegExp[]; +} diff --git a/packages/scripts/tsconfig.json b/packages/scripts/tsconfig.json new file mode 100644 index 0000000..67ab8a4 --- /dev/null +++ b/packages/scripts/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ESNext", + "jsx": "preserve", + "lib": ["DOM", "ESNext"], + "baseUrl": ".", + "module": "ESNext", + "moduleResolution": "node", + "resolveJsonModule": true, + "types": ["node"], + "strict": true, + "strictNullChecks": true, + "noUnusedLocals": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/**/*", "typings/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/uno-preset/package.json b/packages/uno-preset/package.json new file mode 100644 index 0000000..5412cb2 --- /dev/null +++ b/packages/uno-preset/package.json @@ -0,0 +1,12 @@ +{ + "name": "@sa/uno-preset", + "version": "2.0.2", + "exports": { + ".": "./src/index.ts" + }, + "typesVersions": { + "*": { + "*": ["./src/*"] + } + } +} diff --git a/packages/uno-preset/src/index.ts b/packages/uno-preset/src/index.ts new file mode 100644 index 0000000..6a1ae42 --- /dev/null +++ b/packages/uno-preset/src/index.ts @@ -0,0 +1,55 @@ +// @unocss-include + +import type { Preset } from '@unocss/core'; +import type { Theme } from '@unocss/preset-uno'; + +export function presetSoybeanAdmin(): Preset { + const preset: Preset = { + name: 'preset-soybean-admin', + shortcuts: [ + { + 'flex-center': 'flex justify-center items-center', + 'flex-x-center': 'flex justify-center', + 'flex-y-center': 'flex items-center', + 'flex-col': 'flex flex-col', + 'flex-col-center': 'flex-center flex-col', + 'flex-col-stretch': 'flex-col items-stretch', + 'i-flex-center': 'inline-flex justify-center items-center', + 'i-flex-x-center': 'inline-flex justify-center', + 'i-flex-y-center': 'inline-flex items-center', + 'i-flex-col': 'flex-col inline-flex', + 'i-flex-col-center': 'flex-col i-flex-center', + 'i-flex-col-stretch': 'i-flex-col items-stretch', + 'flex-1-hidden': 'flex-1 overflow-hidden' + }, + { + 'absolute-lt': 'absolute left-0 top-0', + 'absolute-lb': 'absolute left-0 bottom-0', + 'absolute-rt': 'absolute right-0 top-0', + 'absolute-rb': 'absolute right-0 bottom-0', + 'absolute-tl': 'absolute-lt', + 'absolute-tr': 'absolute-rt', + 'absolute-bl': 'absolute-lb', + 'absolute-br': 'absolute-rb', + 'absolute-center': 'absolute-lt flex-center size-full', + 'fixed-lt': 'fixed left-0 top-0', + 'fixed-lb': 'fixed left-0 bottom-0', + 'fixed-rt': 'fixed right-0 top-0', + 'fixed-rb': 'fixed right-0 bottom-0', + 'fixed-tl': 'fixed-lt', + 'fixed-tr': 'fixed-rt', + 'fixed-bl': 'fixed-lb', + 'fixed-br': 'fixed-rb', + 'fixed-center': 'fixed-lt flex-center size-full' + }, + { + 'nowrap-hidden': 'overflow-hidden whitespace-nowrap', + 'ellipsis-text': 'nowrap-hidden text-ellipsis' + } + ] + }; + + return preset; +} + +export default presetSoybeanAdmin; diff --git a/packages/uno-preset/tsconfig.json b/packages/uno-preset/tsconfig.json new file mode 100644 index 0000000..5823ed5 --- /dev/null +++ b/packages/uno-preset/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ESNext", + "jsx": "preserve", + "lib": ["DOM", "ESNext"], + "baseUrl": ".", + "module": "ESNext", + "moduleResolution": "node", + "resolveJsonModule": true, + "types": ["node"], + "strict": true, + "strictNullChecks": true, + "noUnusedLocals": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/utils/package.json b/packages/utils/package.json new file mode 100644 index 0000000..7074bca --- /dev/null +++ b/packages/utils/package.json @@ -0,0 +1,22 @@ +{ + "name": "@sa/utils", + "version": "2.0.2", + "exports": { + ".": "./src/index.ts" + }, + "typesVersions": { + "*": { + "*": ["./src/*"] + } + }, + "dependencies": { + "colord": "2.9.3", + "crypto-js": "4.2.0", + "klona": "2.0.6", + "localforage": "1.10.0", + "nanoid": "5.1.6" + }, + "devDependencies": { + "@types/crypto-js": "4.2.2" + } +} diff --git a/packages/utils/src/crypto.ts b/packages/utils/src/crypto.ts new file mode 100644 index 0000000..dc173c8 --- /dev/null +++ b/packages/utils/src/crypto.ts @@ -0,0 +1,27 @@ +import CryptoJS from 'crypto-js'; + +export class Crypto { + /** Secret */ + secret: string; + + constructor(secret: string) { + this.secret = secret; + } + + encrypt(data: T): string { + const dataString = JSON.stringify(data); + const encrypted = CryptoJS.AES.encrypt(dataString, this.secret); + return encrypted.toString(); + } + + decrypt(encrypted: string) { + const decrypted = CryptoJS.AES.decrypt(encrypted, this.secret); + const dataString = decrypted.toString(CryptoJS.enc.Utf8); + try { + return JSON.parse(dataString) as T; + } catch { + // avoid parse error + return null; + } + } +} diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts new file mode 100644 index 0000000..079fba6 --- /dev/null +++ b/packages/utils/src/index.ts @@ -0,0 +1,4 @@ +export * from './crypto'; +export * from './storage'; +export * from './nanoid'; +export * from './klona'; diff --git a/packages/utils/src/klona.ts b/packages/utils/src/klona.ts new file mode 100644 index 0000000..2fe5927 --- /dev/null +++ b/packages/utils/src/klona.ts @@ -0,0 +1,3 @@ +import { klona as jsonClone } from 'klona/json'; + +export { jsonClone }; diff --git a/packages/utils/src/nanoid.ts b/packages/utils/src/nanoid.ts new file mode 100644 index 0000000..5cc1d2e --- /dev/null +++ b/packages/utils/src/nanoid.ts @@ -0,0 +1,3 @@ +import { nanoid } from 'nanoid'; + +export { nanoid }; diff --git a/packages/utils/src/storage.ts b/packages/utils/src/storage.ts new file mode 100644 index 0000000..e4aad14 --- /dev/null +++ b/packages/utils/src/storage.ts @@ -0,0 +1,77 @@ +import localforage from 'localforage'; + +/** The storage type */ +export type StorageType = 'local' | 'session'; + +export function createStorage(type: StorageType, storagePrefix: string) { + const stg = type === 'session' ? window.sessionStorage : window.localStorage; + + const storage = { + /** + * Set session + * + * @param key Session key + * @param value Session value + */ + set(key: K, value: T[K]) { + const json = JSON.stringify(value); + + stg.setItem(`${storagePrefix}${key as string}`, json); + }, + /** + * Get session + * + * @param key Session key + */ + get(key: K): T[K] | null { + const json = stg.getItem(`${storagePrefix}${key as string}`); + if (json) { + let storageData: T[K] | null = null; + + try { + storageData = JSON.parse(json); + } catch {} + + // storageData may be `false` if it is boolean type + if (storageData !== null) { + return storageData as T[K]; + } + } + + stg.removeItem(`${storagePrefix}${key as string}`); + + return null; + }, + remove(key: keyof T) { + stg.removeItem(`${storagePrefix}${key as string}`); + }, + clear() { + stg.clear(); + } + }; + return storage; +} + +type LocalForage = Omit & { + getItem(key: K, callback?: (err: any, value: T[K] | null) => void): Promise; + + setItem(key: K, value: T[K], callback?: (err: any, value: T[K]) => void): Promise; + + removeItem(key: keyof T, callback?: (err: any) => void): Promise; +}; + +type LocalforageDriver = 'local' | 'indexedDB' | 'webSQL'; + +export function createLocalforage(driver: LocalforageDriver) { + const driverMap: Record = { + local: localforage.LOCALSTORAGE, + indexedDB: localforage.INDEXEDDB, + webSQL: localforage.WEBSQL + }; + + localforage.config({ + driver: driverMap[driver] + }); + + return localforage as LocalForage; +} diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json new file mode 100644 index 0000000..5823ed5 --- /dev/null +++ b/packages/utils/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ESNext", + "jsx": "preserve", + "lib": ["DOM", "ESNext"], + "baseUrl": ".", + "module": "ESNext", + "moduleResolution": "node", + "resolveJsonModule": true, + "types": ["node"], + "strict": true, + "strictNullChecks": true, + "noUnusedLocals": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..d935639 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,8161 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@better-scroll/core': + specifier: 2.5.1 + version: 2.5.1 + '@iconify/vue': + specifier: 5.0.0 + version: 5.0.0(vue@3.5.26(typescript@5.9.3)) + '@sa/axios': + specifier: workspace:* + version: link:packages/axios + '@sa/color': + specifier: workspace:* + version: link:packages/color + '@sa/hooks': + specifier: workspace:* + version: link:packages/hooks + '@sa/materials': + specifier: workspace:* + version: link:packages/materials + '@sa/utils': + specifier: workspace:* + version: link:packages/utils + '@vueuse/core': + specifier: 14.1.0 + version: 14.1.0(vue@3.5.26(typescript@5.9.3)) + clipboard: + specifier: 2.0.11 + version: 2.0.11 + dayjs: + specifier: 1.11.19 + version: 1.11.19 + defu: + specifier: 6.1.4 + version: 6.1.4 + echarts: + specifier: 6.0.0 + version: 6.0.0 + json5: + specifier: 2.2.3 + version: 2.2.3 + naive-ui: + specifier: 2.43.2 + version: 2.43.2(vue@3.5.26(typescript@5.9.3)) + nprogress: + specifier: 0.2.0 + version: 0.2.0 + pinia: + specifier: 3.0.4 + version: 3.0.4(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3)) + tailwind-merge: + specifier: 3.4.0 + version: 3.4.0 + vue: + specifier: 3.5.26 + version: 3.5.26(typescript@5.9.3) + vue-draggable-plus: + specifier: 0.6.0 + version: 0.6.0(@types/sortablejs@1.15.9) + vue-i18n: + specifier: 11.2.7 + version: 11.2.7(vue@3.5.26(typescript@5.9.3)) + vue-router: + specifier: 4.6.4 + version: 4.6.4(vue@3.5.26(typescript@5.9.3)) + devDependencies: + '@elegant-router/vue': + specifier: 0.3.8 + version: 0.3.8 + '@iconify/json': + specifier: 2.2.417 + version: 2.2.417 + '@sa/scripts': + specifier: workspace:* + version: link:packages/scripts + '@sa/uno-preset': + specifier: workspace:* + version: link:packages/uno-preset + '@soybeanjs/eslint-config': + specifier: 1.7.4 + version: 1.7.4(@typescript-eslint/utils@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(@unocss/eslint-config@66.5.10(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-plugin-vue@10.6.2(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))))(eslint@9.39.2(jiti@2.6.1))(svelte-eslint-parser@1.4.1)(typescript@5.9.3)(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))) + '@types/node': + specifier: 25.0.3 + version: 25.0.3 + '@types/nprogress': + specifier: 0.2.3 + version: 0.2.3 + '@unocss/eslint-config': + specifier: 66.5.10 + version: 66.5.10(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@unocss/preset-icons': + specifier: 66.5.10 + version: 66.5.10 + '@unocss/preset-uno': + specifier: 66.5.10 + version: 66.5.10 + '@unocss/transformer-directives': + specifier: 66.5.10 + version: 66.5.10 + '@unocss/transformer-variant-group': + specifier: 66.5.10 + version: 66.5.10 + '@unocss/vite': + specifier: 66.5.10 + version: 66.5.10(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitejs/plugin-vue': + specifier: 6.0.3 + version: 6.0.3(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)) + '@vitejs/plugin-vue-jsx': + specifier: 5.1.2 + version: 5.1.2(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)) + consola: + specifier: 3.4.2 + version: 3.4.2 + eslint: + specifier: 9.39.2 + version: 9.39.2(jiti@2.6.1) + eslint-plugin-vue: + specifier: 10.6.2 + version: 10.6.2(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))) + kolorist: + specifier: 1.8.0 + version: 1.8.0 + sass: + specifier: 1.97.1 + version: 1.97.1 + simple-git-hooks: + specifier: 2.13.1 + version: 2.13.1 + tsx: + specifier: 4.21.0 + version: 4.21.0 + typescript: + specifier: 5.9.3 + version: 5.9.3 + unplugin-icons: + specifier: 22.5.0 + version: 22.5.0(@vue/compiler-sfc@3.5.26) + unplugin-vue-components: + specifier: 30.0.0 + version: 30.0.0(@babel/parser@7.28.5)(vue@3.5.26(typescript@5.9.3)) + vite: + specifier: 7.3.0 + version: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite-plugin-progress: + specifier: 0.0.7 + version: 0.0.7(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + vite-plugin-svg-icons: + specifier: 2.0.1 + version: 2.0.1(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + vite-plugin-vue-devtools: + specifier: 8.0.5 + version: 8.0.5(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)) + vue-eslint-parser: + specifier: 10.2.0 + version: 10.2.0(eslint@9.39.2(jiti@2.6.1)) + vue-tsc: + specifier: 3.2.1 + version: 3.2.1(typescript@5.9.3) + + packages/alova: + dependencies: + '@alova/mock': + specifier: 2.0.18 + version: 2.0.18(alova@3.4.1) + '@sa/utils': + specifier: workspace:* + version: link:../utils + alova: + specifier: 3.4.1 + version: 3.4.1 + + packages/axios: + dependencies: + '@sa/utils': + specifier: workspace:* + version: link:../utils + axios: + specifier: 1.13.2 + version: 1.13.2 + axios-retry: + specifier: 4.5.0 + version: 4.5.0(axios@1.13.2) + qs: + specifier: 6.14.0 + version: 6.14.0 + devDependencies: + '@types/qs': + specifier: 6.14.0 + version: 6.14.0 + + packages/color: + dependencies: + '@sa/utils': + specifier: workspace:* + version: link:../utils + colord: + specifier: 2.9.3 + version: 2.9.3 + + packages/hooks: + dependencies: + '@sa/axios': + specifier: workspace:* + version: link:../axios + '@sa/utils': + specifier: workspace:* + version: link:../utils + + packages/materials: + dependencies: + '@sa/utils': + specifier: workspace:* + version: link:../utils + simplebar-vue: + specifier: 2.4.2 + version: 2.4.2(vue@3.5.26(typescript@5.9.3)) + devDependencies: + typed-css-modules: + specifier: 0.9.1 + version: 0.9.1 + + packages/scripts: + devDependencies: + '@soybeanjs/changelog': + specifier: 0.3.25 + version: 0.3.25(@typescript-eslint/utils@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(@unocss/eslint-config@66.5.10(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-plugin-vue@10.6.2(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))))(eslint@9.39.2(jiti@2.6.1))(svelte-eslint-parser@1.4.1)(typescript@5.9.3)(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))) + bumpp: + specifier: 10.3.2 + version: 10.3.2(magicast@0.3.4) + c12: + specifier: 3.3.3 + version: 3.3.3(magicast@0.3.4) + cac: + specifier: 6.7.14 + version: 6.7.14 + consola: + specifier: 3.4.2 + version: 3.4.2 + enquirer: + specifier: 2.4.1 + version: 2.4.1 + execa: + specifier: 9.6.1 + version: 9.6.1 + kolorist: + specifier: 1.8.0 + version: 1.8.0 + npm-check-updates: + specifier: 19.2.0 + version: 19.2.0 + picomatch: + specifier: 4.0.3 + version: 4.0.3 + rimraf: + specifier: 6.1.2 + version: 6.1.2 + + packages/uno-preset: {} + + packages/utils: + dependencies: + colord: + specifier: 2.9.3 + version: 2.9.3 + crypto-js: + specifier: 4.2.0 + version: 4.2.0 + klona: + specifier: 2.0.6 + version: 2.0.6 + localforage: + specifier: 1.10.0 + version: 1.10.0 + nanoid: + specifier: 5.1.6 + version: 5.1.6 + devDependencies: + '@types/crypto-js': + specifier: 4.2.2 + version: 4.2.2 + +packages: + + '@alova/mock@2.0.18': + resolution: {integrity: sha512-XMwn0Nsmd5pNz+/+iHYy5UQCkb3PobbsMj5of1wlRqRymxyPBc00NImExchkE1wJkTt0sT3BDHnv1jDP9SJE6w==} + peerDependencies: + alova: ^3.0.20 + + '@alova/shared@1.3.2': + resolution: {integrity: sha512-1XvDLWgYpVZ99MmLl1f3Fw4T6S6pPYk5afz5cwRVjuq8JXEGsDn9IygDKfvRyWqkqCBx7Jif07LIct1O+MVEow==} + + '@antfu/eslint-define-config@1.23.0-2': + resolution: {integrity: sha512-LvxY21+ZhpuBf/aHeBUtGQhSEfad4PkNKXKvDOSvukaM3XVTfBhwmHX2EKwAsdq5DlfjbT3qqYyMiueBIO5iDQ==} + engines: {node: '>=18.0.0', npm: '>=9.0.0', pnpm: '>= 8.6.0'} + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.28.5': + resolution: {integrity: sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.28.5': + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-proposal-decorators@7.28.0': + resolution: {integrity: sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-decorators@7.27.1': + resolution: {integrity: sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.28.5': + resolution: {integrity: sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@better-scroll/core@2.5.1': + resolution: {integrity: sha512-koKOuYA55dQ04FJRIVUpMGDr1hbCfWmfX0MGp1hKagkQSWSRpwblqACiwtggVauoj9aaJRJZ9hDsTM4weaavlg==} + + '@better-scroll/shared-utils@2.5.1': + resolution: {integrity: sha512-AplkfSjXVYP9LZiD6JsKgmgQJ/mG4uuLmBuwLz8W5OsYc7AYTfN8kw6GqZ5OwCGoXkVhBGyd8NeC4xwYItp0aw==} + + '@css-render/plugin-bem@0.15.14': + resolution: {integrity: sha512-QK513CJ7yEQxm/P3EwsI+d+ha8kSOcjGvD6SevM41neEMxdULE+18iuQK6tEChAWMOQNQPLG/Rw3Khb69r5neg==} + peerDependencies: + css-render: ~0.15.14 + + '@css-render/vue3-ssr@0.15.14': + resolution: {integrity: sha512-//8027GSbxE9n3QlD73xFY6z4ZbHbvrOVB7AO6hsmrEzGbg+h2A09HboUyDgu+xsmj7JnvJD39Irt+2D0+iV8g==} + peerDependencies: + vue: ^3.0.11 + + '@elegant-router/core@0.3.8': + resolution: {integrity: sha512-q8CihD9la9V2H+/OYIzMLftXSBkbT234UMwhMxDL1Gq7BGKU3kEIEJvifRM7htbiRD77bkQhwMGBY3WZacqw8A==} + + '@elegant-router/vue@0.3.8': + resolution: {integrity: sha512-K9x2275vw9kQB25WnZ7ROTLsT3o8bxu8acvwF09Do8hexIKG2i6elV0+pWxaufNZ4XCuBxT+lKHfHeyBbRhtYQ==} + + '@emnapi/core@1.7.1': + resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + + '@emnapi/runtime@1.7.1': + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@emotion/hash@0.8.0': + resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} + + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/compat@1.4.1': + resolution: {integrity: sha512-cfO82V9zxxGBxcQDr1lfaYB7wykTa0b00mGa36FrJl7iTFd0Z2cHfEYuxcBRP/iNijCsWsEkA+jzT8hGYmv33w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.40 || 9 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.2': + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@iconify/json@2.2.417': + resolution: {integrity: sha512-/MzthgckJ4vEwdHmAbAn6Bph5WnR4tzVcHMs/nZl3v5hOVRw80SK28UPnG7jjsCB41WWjWPnWdMEdOZfUMZS5w==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@3.1.0': + resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==} + + '@iconify/vue@5.0.0': + resolution: {integrity: sha512-C+KuEWIF5nSBrobFJhT//JS87OZ++QDORB6f2q2Wm6fl2mueSTpFBeBsveK0KW9hWiZ4mNiPjsh6Zs4jjdROSg==} + peerDependencies: + vue: '>=3' + + '@intlify/core-base@11.2.7': + resolution: {integrity: sha512-+Ra9I/LAzXDnmv/IrTO03WMCiLya7pHRmGJvNl9fKwx/W4REJ0xaMk2PxCRqnxcBsX443amEMdebQ3R1geiuIw==} + engines: {node: '>= 16'} + + '@intlify/message-compiler@11.2.7': + resolution: {integrity: sha512-TFamC+GzJAotAFwUNvbtRVBgvuSn2nCwKNresmPUHv3IIVMmXJt7QQJj/DORI1h8hs46ZF6L0Fs2xBohSOE4iQ==} + engines: {node: '>= 16'} + + '@intlify/shared@11.2.7': + resolution: {integrity: sha512-uvlkvc/0uQ4FDlHQZccpUnmcOwNcaI3i+69ck2YJ+GqM35AoVbuS63b+YfirV4G0SZh64Ij2UMcFRMmB4nr95w==} + engines: {node: '>= 16'} + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@juggle/resize-observer@3.4.0': + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@quansync/fs@1.0.0': + resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + + '@rolldown/pluginutils@1.0.0-beta.53': + resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} + + '@rolldown/pluginutils@1.0.0-beta.56': + resolution: {integrity: sha512-cw9jwAgCs024Nic4OB8PeFDLBHLD1Athcv3bRvyYATIVD9B/gL5X5cJkezT94Y7m7Dk9HXaUMcvb7ypvSX46sA==} + + '@rollup/rollup-android-arm-eabi@4.54.0': + resolution: {integrity: sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.54.0': + resolution: {integrity: sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.54.0': + resolution: {integrity: sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.54.0': + resolution: {integrity: sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.54.0': + resolution: {integrity: sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.54.0': + resolution: {integrity: sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.54.0': + resolution: {integrity: sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.54.0': + resolution: {integrity: sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.54.0': + resolution: {integrity: sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.54.0': + resolution: {integrity: sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.54.0': + resolution: {integrity: sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-gnu@4.54.0': + resolution: {integrity: sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-gnu@4.54.0': + resolution: {integrity: sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.54.0': + resolution: {integrity: sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.54.0': + resolution: {integrity: sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.54.0': + resolution: {integrity: sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.54.0': + resolution: {integrity: sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openharmony-arm64@4.54.0': + resolution: {integrity: sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.54.0': + resolution: {integrity: sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.54.0': + resolution: {integrity: sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.54.0': + resolution: {integrity: sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.54.0': + resolution: {integrity: sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==} + cpu: [x64] + os: [win32] + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@soybeanjs/changelog@0.3.25': + resolution: {integrity: sha512-WtntSBlZ8w4i5pW95GShb6JFwZ2+8LzDYtRa7448vlZBge/mUa4ZekA4Mk8G8isy/VYiBMF/cB3aalWMtSPPTg==} + engines: {node: '>=16', pnpm: '>=9'} + + '@soybeanjs/eslint-config@1.7.4': + resolution: {integrity: sha512-N+CQLLN72cahzuCpEult61d66w7OD6Kz1RTlNEhrfvdqPZzs7xlQJTaJvLN9dbG091nY6opatGvaGuZ+zHO3Aw==} + peerDependencies: + '@toml-tools/parser': '*' + '@unocss/eslint-config': '>=0.58.0' + eslint: '>=8.40.0' + eslint-plugin-astro: '>=0.30.0' + eslint-plugin-react: '>=7.0.0' + eslint-plugin-react-hooks: '>=4.0.0' + eslint-plugin-react-native: '>=4.0.0' + eslint-plugin-react-refresh: '>=0.4.0' + eslint-plugin-solid: '>=0.10.0' + eslint-plugin-svelte: '>=2.0.0' + eslint-plugin-vue: '>=9.19.0' + prettier-plugin-astro: '>=0.12.0' + prettier-plugin-svelte: '>=3.0.0' + prettier-plugin-toml: '>=2.0.0' + svelte-eslint-parser: '>=1.0.0' + typescript: '>=5.0.0' + vue-eslint-parser: '>=9.3.2' + peerDependenciesMeta: + '@toml-tools/parser': + optional: true + '@unocss/eslint-config': + optional: true + eslint-plugin-astro: + optional: true + eslint-plugin-react: + optional: true + eslint-plugin-react-hooks: + optional: true + eslint-plugin-react-native: + optional: true + eslint-plugin-react-refresh: + optional: true + eslint-plugin-solid: + optional: true + eslint-plugin-svelte: + optional: true + eslint-plugin-vue: + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-svelte: + optional: true + prettier-plugin-toml: + optional: true + vue-eslint-parser: + optional: true + + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/crypto-js@4.2.2': + resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/katex@0.16.7': + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.21': + resolution: {integrity: sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==} + + '@types/node@10.17.60': + resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} + + '@types/node@25.0.3': + resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==} + + '@types/nprogress@0.2.3': + resolution: {integrity: sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==} + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/sortablejs@1.15.9': + resolution: {integrity: sha512-7HP+rZGE2p886PKV9c9OJzLBI6BBJu1O7lJGYnPyG3fS4/duUCcngkNCjsLwIMV+WMqANe3tt4irrXHSIe68OQ==} + + '@types/svgo@2.6.4': + resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@typescript-eslint/eslint-plugin@8.50.0': + resolution: {integrity: sha512-O7QnmOXYKVtPrfYzMolrCTfkezCJS9+ljLdKW/+DCvRsc3UAz+sbH6Xcsv7p30+0OwUbeWfUDAQE0vpabZ3QLg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.50.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@8.50.0': + resolution: {integrity: sha512-6/cmF2piao+f6wSxUsJLZjck7OQsYyRtcOZS02k7XINSNlz93v6emM8WutDQSXnroG2xwYlEVHJI+cPA7CPM3Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.50.0': + resolution: {integrity: sha512-Cg/nQcL1BcoTijEWyx4mkVC56r8dj44bFDvBdygifuS20f3OZCHmFbjF34DPSi07kwlFvqfv/xOLnJ5DquxSGQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@8.50.0': + resolution: {integrity: sha512-xCwfuCZjhIqy7+HKxBLrDVT5q/iq7XBVBXLn57RTIIpelLtEIZHXAF/Upa3+gaCpeV1NNS5Z9A+ID6jn50VD4A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.50.0': + resolution: {integrity: sha512-vxd3G/ybKTSlm31MOA96gqvrRGv9RJ7LGtZCn2Vrc5htA0zCDvcMqUkifcjrWNNKXHUU3WCkYOzzVSFBd0wa2w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.50.0': + resolution: {integrity: sha512-7OciHT2lKCewR0mFoBrvZJ4AXTMe/sYOe87289WAViOocEmDjjv8MvIOT2XESuKj9jp8u3SZYUSh89QA4S1kQw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@8.50.0': + resolution: {integrity: sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.50.0': + resolution: {integrity: sha512-W7SVAGBR/IX7zm1t70Yujpbk+zdPq/u4soeFSknWFdXIFuWsBGBOUu/Tn/I6KHSKvSh91OiMuaSnYp3mtPt5IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.50.0': + resolution: {integrity: sha512-87KgUXET09CRjGCi2Ejxy3PULXna63/bMYv72tCAlDJC3Yqwln0HiFJ3VJMst2+mEtNtZu5oFvX4qJGjKsnAgg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@8.50.0': + resolution: {integrity: sha512-Xzmnb58+Db78gT/CCj/PVCvK+zxbnsw6F+O1oheYszJbBSdEjVhQi3C/Xttzxgi/GLmpvOggRs1RFpiJ8+c34Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@unocss/config@66.5.10': + resolution: {integrity: sha512-udBhfMe+2MU70ZdjnRLnwLQ+0EHYJ4f5JjjvHsfmQ0If4KeYmSStWBuX+/LHNQidhl487JiwW1lBDQ8pKHmbiw==} + engines: {node: '>=14'} + + '@unocss/core@66.5.10': + resolution: {integrity: sha512-SEmPE4pWNn9VcCvZqovPwFGuG/j69W3zh+x1Ky4z/I2pnyoB0Y0lBmq22KVu/dwExe+ZKKTQpxa0j5rbE27rDQ==} + + '@unocss/eslint-config@66.5.10': + resolution: {integrity: sha512-kDoXTBZcI7RCdWPekKrjgiuRcNYfdwjEkG6HtS1++jM0LhK6QgaMfu4p+4j0gfAz86ZNotghM3u8aWO6Fu0nRA==} + engines: {node: '>=14'} + + '@unocss/eslint-plugin@66.5.10': + resolution: {integrity: sha512-Fzvl5ISMoGnALo9tqI15nNNWZza2ICqmzyujQCyzsxDZEVZzajNvt8wACVHoEz+dUZykjMPJqqdmX5ZijcPZ1w==} + engines: {node: '>=14'} + + '@unocss/extractor-arbitrary-variants@66.5.10': + resolution: {integrity: sha512-9JsAY1a68WZaIbSiwQa7LLAO+t4T5nnhgmNxY3MGaK58k6Qa9ayZb4AG4fqOpw+Zn8tmKd7yXJ0s+27sx1n2BA==} + + '@unocss/inspector@66.5.10': + resolution: {integrity: sha512-L/Nvi4bkXFxbGNOi7TPNnIIDfY1zKghfJ+cF7To/WrXplP1Y4nEZa2kGwcVBcsaysACri0whU19Dh3yf+bG+Pg==} + + '@unocss/preset-icons@66.5.10': + resolution: {integrity: sha512-zf4Sev/F2QQgVjGjKBCw3BKc15HQAtvUrNX2zymXXbAjt83Lf27ofYzTAUVUO9mi/oQhXcP5sQrIGIe7iQX3hw==} + + '@unocss/preset-mini@66.5.10': + resolution: {integrity: sha512-jRmweaPhaTGBSDKFuhEGayGyuGr66rTRRqzv5EAdHH4x43TFlJ1RO5SVlzzJdo1zJy4vyGSINIVKeI49FYhEKQ==} + + '@unocss/preset-uno@66.5.10': + resolution: {integrity: sha512-O3R99td+Jt3XAJh1pVbOSTu3z7jUosg80y90iu6JQIpvXI/pGanWJEhoEz95SgJmRV+vXNEn4f6tIvfUXkTd/w==} + + '@unocss/preset-wind3@66.5.10': + resolution: {integrity: sha512-N2Wgu+AnTSr4jIEAfajOfUtwESE/Zzr0GxwW88+MHIw6Tzj6tZeCEKNNKFzsgwfGkoNjvwIeIbkaIrIGJ7SveA==} + + '@unocss/rule-utils@66.5.10': + resolution: {integrity: sha512-497GPWZpArNG25cto0Yq3/Yw+i0x7/N/ySq1HHeE3lB43sdmCv6+m6QEv14I/9/e5WJhQOmrY5LmHZYXC7xxMw==} + engines: {node: '>=14'} + + '@unocss/transformer-directives@66.5.10': + resolution: {integrity: sha512-EDak3DGW+rSYjoZNwU8xJIXbwif+q9e3cjhCZy48ll1nfyg2E1Znqtwv/X8vLRr8fJ0gWn75P2uGi4jfGLZzMg==} + + '@unocss/transformer-variant-group@66.5.10': + resolution: {integrity: sha512-9DWi9bLOGwdw6whCTdywVD9+lA5lkeqcgy9sMoizfUa4CfT1bSdMT27VoAbYhxeEznV92BCW2jCYt0I8M00phw==} + + '@unocss/vite@66.5.10': + resolution: {integrity: sha512-GegFDmcWe0V2CR/uN1f+iQuDh2R1vA6EAwSvl1nyL+6ue0/zLyF9yhdVnypIVlJnS6RK/xaLPOP6vWJnqRGhZg==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.11.1': + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.11.1': + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + cpu: [x64] + os: [win32] + + '@vitejs/plugin-vue-jsx@5.1.2': + resolution: {integrity: sha512-3a2BOryRjG/Iih87x87YXz5c8nw27eSlHytvSKYfp8ZIsp5+FgFQoKeA7k2PnqWpjJrv6AoVTMnvmuKUXb771A==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + vue: ^3.0.0 + + '@vitejs/plugin-vue@6.0.3': + resolution: {integrity: sha512-TlGPkLFLVOY3T7fZrwdvKpjprR3s4fxRln0ORDo1VQ7HHyxJwTlrjKU3kpVWTlaAjIEuCTokmjkZnr8Tpc925w==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + vue: ^3.2.25 + + '@volar/language-core@2.4.27': + resolution: {integrity: sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ==} + + '@volar/source-map@2.4.27': + resolution: {integrity: sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg==} + + '@volar/typescript@2.4.27': + resolution: {integrity: sha512-eWaYCcl/uAPInSK2Lze6IqVWaBu/itVqR5InXcHXFyles4zO++Mglt3oxdgj75BDcv1Knr9Y93nowS8U3wqhxg==} + + '@vue/babel-helper-vue-transform-on@1.5.0': + resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==} + + '@vue/babel-helper-vue-transform-on@2.0.1': + resolution: {integrity: sha512-uZ66EaFbnnZSYqYEyplWvn46GhZ1KuYSThdT68p+am7MgBNbQ3hphTL9L+xSIsWkdktwhPYLwPgVWqo96jDdRA==} + + '@vue/babel-plugin-jsx@1.5.0': + resolution: {integrity: sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + + '@vue/babel-plugin-jsx@2.0.1': + resolution: {integrity: sha512-a8CaLQjD/s4PVdhrLD/zT574ZNPnZBOY+IhdtKWRB4HRZ0I2tXBi5ne7d9eCfaYwp5gU5+4KIyFTV1W1YL9xZA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + + '@vue/babel-plugin-resolve-type@1.5.0': + resolution: {integrity: sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@vue/babel-plugin-resolve-type@2.0.1': + resolution: {integrity: sha512-ybwgIuRGRRBhOU37GImDoWQoz+TlSqap65qVI6iwg/J7FfLTLmMf97TS7xQH9I7Qtr/gp161kYVdhr1ZMraSYQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@vue/compiler-core@3.5.26': + resolution: {integrity: sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w==} + + '@vue/compiler-dom@3.5.26': + resolution: {integrity: sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A==} + + '@vue/compiler-sfc@3.5.26': + resolution: {integrity: sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA==} + + '@vue/compiler-ssr@3.5.26': + resolution: {integrity: sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/devtools-api@7.7.9': + resolution: {integrity: sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==} + + '@vue/devtools-core@8.0.5': + resolution: {integrity: sha512-dpCw8nl0GDBuiL9SaY0mtDxoGIEmU38w+TQiYEPOLhW03VDC0lfNMYXS/qhl4I0YlysGp04NLY4UNn6xgD0VIQ==} + peerDependencies: + vue: ^3.0.0 + + '@vue/devtools-kit@7.7.9': + resolution: {integrity: sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==} + + '@vue/devtools-kit@8.0.5': + resolution: {integrity: sha512-q2VV6x1U3KJMTQPUlRMyWEKVbcHuxhqJdSr6Jtjz5uAThAIrfJ6WVZdGZm5cuO63ZnSUz0RCsVwiUUb0mDV0Yg==} + + '@vue/devtools-shared@7.7.9': + resolution: {integrity: sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==} + + '@vue/devtools-shared@8.0.5': + resolution: {integrity: sha512-bRLn6/spxpmgLk+iwOrR29KrYnJjG9DGpHGkDFG82UM21ZpJ39ztUT9OXX3g+usW7/b2z+h46I9ZiYyB07XMXg==} + + '@vue/language-core@3.2.1': + resolution: {integrity: sha512-g6oSenpnGMtpxHGAwKuu7HJJkNZpemK/zg3vZzZbJ6cnnXq1ssxuNrXSsAHYM3NvH8p4IkTw+NLmuxyeYz4r8A==} + + '@vue/reactivity@3.5.26': + resolution: {integrity: sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ==} + + '@vue/runtime-core@3.5.26': + resolution: {integrity: sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q==} + + '@vue/runtime-dom@3.5.26': + resolution: {integrity: sha512-XLLd/+4sPC2ZkN/6+V4O4gjJu6kSDbHAChvsyWgm1oGbdSO3efvGYnm25yCjtFm/K7rrSDvSfPDgN1pHgS4VNQ==} + + '@vue/server-renderer@3.5.26': + resolution: {integrity: sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA==} + peerDependencies: + vue: 3.5.26 + + '@vue/shared@3.5.26': + resolution: {integrity: sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A==} + + '@vueuse/core@14.1.0': + resolution: {integrity: sha512-rgBinKs07hAYyPF834mDTigH7BtPqvZ3Pryuzt1SD/lg5wEcWqvwzXXYGEDb2/cP0Sj5zSvHl3WkmMELr5kfWw==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/metadata@14.1.0': + resolution: {integrity: sha512-7hK4g015rWn2PhKcZ99NyT+ZD9sbwm7SGvp7k+k+rKGWnLjS/oQozoIZzWfCewSUeBmnJkIb+CNr7Zc/EyRnnA==} + + '@vueuse/shared@14.1.0': + resolution: {integrity: sha512-EcKxtYvn6gx1F8z9J5/rsg3+lTQnvOruQd8fUecW99DCK04BkWD7z5KQ/wTAx+DazyoEE9dJt/zV8OIEQbM6kw==} + peerDependencies: + vue: ^3.5.0 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + alien-signals@3.1.1: + resolution: {integrity: sha512-ogkIWbVrLwKtHY6oOAXaYkAxP+cTH7V5FZ5+Tm4NZFd8VDZ6uNMDrfzqctTZ42eTMCSR3ne3otpcxmqSnFfPYA==} + + alova@3.4.1: + resolution: {integrity: sha512-xGChKIiCHDqcMglF9RyuWAsk+ltwnja8Dp4MgRIRbUlhOi8XFiQnaoWwIQzJcODKeblmmiFAK7YrYnpskFZWLA==} + engines: {node: '>= 18.0.0'} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + args-tokenizer@0.3.0: + resolution: {integrity: sha512-xXAd7G2Mll5W8uo37GETpQ2VrE84M181Z7ugHFGQnJZ50M2mbOv0osSZ9VsSgPfJQ+LVG0prSi0th+ELMsno7Q==} + + arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + + arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + + arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axios-retry@4.5.0: + resolution: {integrity: sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==} + peerDependencies: + axios: 0.x || 1.x + + axios@1.13.2: + resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + + baseline-browser-mapping@2.9.11: + resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} + hasBin: true + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + builtin-modules@5.0.0: + resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} + engines: {node: '>=18.20'} + + bumpp@10.3.2: + resolution: {integrity: sha512-yUUkVx5zpTywLNX97MlrqtpanI7eMMwFwLntWR2EBVDw3/Pm3aRIzCoDEGHATLIiHK9PuJC7xWI4XNWqXItSPg==} + engines: {node: '>=18'} + hasBin: true + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + c12@3.3.3: + resolution: {integrity: sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q==} + peerDependencies: + magicast: '*' + peerDependenciesMeta: + magicast: + optional: true + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001761: + resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==} + + chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + ci-info@4.3.1: + resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} + engines: {node: '>=8'} + + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + + class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + + clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + + cli-progress@3.12.0: + resolution: {integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==} + engines: {node: '>=4'} + + clipboard@2.0.11: + resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + comment-parser@1.4.1: + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + engines: {node: '>= 12.0.0'} + + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + + consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + convert-gitmoji@0.1.5: + resolution: {integrity: sha512-4wqOafJdk2tqZC++cjcbGcaJ13BZ3kwldf06PTiAQRAB76Z1KJwZNL1SaRZMi2w1FM9RYTgZ6QErS8NUl/GBmQ==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + copy-anything@4.0.5: + resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} + engines: {node: '>=18'} + + copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + + core-js-compat@3.47.0: + resolution: {integrity: sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + css-render@0.15.14: + resolution: {integrity: sha512-9nF4PdUle+5ta4W5SyZdLCCmFd37uVimSjg1evcTqKJCyvCEEj12WKzOSBNak6r4im4J4iYXKH1OWpUV5LBYFg==} + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + + csstype@3.0.11: + resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + date-fns-tz@3.2.0: + resolution: {integrity: sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==} + peerDependencies: + date-fns: ^3.0.0 || ^4.0.0 + + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + + dayjs@1.11.15: + resolution: {integrity: sha512-MC+DfnSWiM9APs7fpiurHGCoeIx0Gdl6QZBy+5lu8MbYKN5FZEXqOgrundfibdfhGZ15o9hzmZ2xJjZnbvgKXQ==} + + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.4.0: + resolution: {integrity: sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==} + engines: {node: '>=18'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + + define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + + define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegate@3.2.0: + resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + dom-serializer@0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@2.4.2: + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domutils@1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + echarts@6.0.0: + resolution: {integrity: sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==} + + electron-to-chromium@1.5.267: + resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + enhanced-resolve@5.18.4: + resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} + engines: {node: '>=10.13.0'} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + entities@1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@7.0.0: + resolution: {integrity: sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==} + engines: {node: '>=0.12'} + + error-stack-parser-es@1.0.5: + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + + es-abstract@1.24.1: + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-compat-utils@0.5.1: + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + + eslint-config-flat-gitignore@2.1.0: + resolution: {integrity: sha512-cJzNJ7L+psWp5mXM7jBX+fjHtBvvh06RBlcweMhKD8jWqQw0G78hOW5tpVALGHGFPsBV+ot2H+pdDGJy6CV8pA==} + peerDependencies: + eslint: ^9.5.0 + + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-context@0.1.9: + resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + peerDependencies: + unrs-resolver: ^1.0.0 + peerDependenciesMeta: + unrs-resolver: + optional: true + + eslint-parser-plain@0.1.1: + resolution: {integrity: sha512-KRgd6wuxH4U8kczqPp+Oyk4irThIhHWxgFgLDtpgjUGVIS3wGrJntvZW/p6hHq1T4FOwnOtCNkvAI4Kr+mQ/Hw==} + + eslint-plugin-es-x@7.8.0: + resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' + + eslint-plugin-import-x@4.16.1: + resolution: {integrity: sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/utils': ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 + eslint-import-resolver-node: '*' + peerDependenciesMeta: + '@typescript-eslint/utils': + optional: true + eslint-import-resolver-node: + optional: true + + eslint-plugin-n@17.23.1: + resolution: {integrity: sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=8.23.0' + + eslint-plugin-prettier@5.5.4: + resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-unicorn@62.0.0: + resolution: {integrity: sha512-HIlIkGLkvf29YEiS/ImuDZQbP12gWyx5i3C6XrRxMvVdqMroCI9qoVYCoIl17ChN+U89pn9sVwLxhIWj5nEc7g==} + engines: {node: ^20.10.0 || >=21.0.0} + peerDependencies: + eslint: '>=9.38.0' + + eslint-plugin-vue@10.6.2: + resolution: {integrity: sha512-nA5yUs/B1KmKzvC42fyD0+l9Yd+LtEpVhWRbXuDj0e+ZURcTtyRbMDWUeJmTAh2wC6jC83raS63anNM2YT3NPw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@stylistic/eslint-plugin': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + '@typescript-eslint/parser': ^7.0.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 + vue-eslint-parser: ^10.0.0 + peerDependenciesMeta: + '@stylistic/eslint-plugin': + optional: true + '@typescript-eslint/parser': + optional: true + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + evtd@0.2.4: + resolution: {integrity: sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==} + + execa@9.6.0: + resolution: {integrity: sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==} + engines: {node: ^18.19.0 || >=20.5.0} + + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} + + expand-brackets@2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + + extglob@2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up-simple@1.0.1: + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} + engines: {node: '>=18'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + + get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + + giget@2.0.0: + resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} + hasBin: true + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + hasBin: true + + glob@13.0.0: + resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} + engines: {node: 20 || >=22} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + globals@16.5.0: + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + good-listener@1.2.2: + resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + + has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + + has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + + has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + + has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + htmlparser2@3.10.1: + resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} + + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + + icss-replace-symbols@1.1.0: + resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + immutable@5.1.4: + resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + is-accessor-descriptor@1.0.1: + resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} + engines: {node: '>= 0.10'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-builtin-module@5.0.0: + resolution: {integrity: sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==} + engines: {node: '>=18.20'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-data-descriptor@1.0.1: + resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-descriptor@0.1.7: + resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} + engines: {node: '>= 0.4'} + + is-descriptor@1.0.3: + resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} + engines: {node: '>= 0.4'} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-retry-allowed@2.2.0: + resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} + engines: {node: '>=10'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-there@4.5.2: + resolution: {integrity: sha512-ixMkfz3rtS1vEsLf0TjgjqUn96Q0ukpUVDMnPYVocJyTzu2G/QgEtqYddcHZawHO+R31cKVPggJmBLrm1vJCOg==} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + is-what@5.5.0: + resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} + engines: {node: '>=18'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + js-base64@2.6.4: + resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + + kind-of@5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lie@3.1.1: + resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + + loader-utils@1.4.2: + resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} + engines: {node: '>=4.0.0'} + + local-pkg@1.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} + engines: {node: '>=14'} + + localforage@1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash-es@4.17.22: + resolution: {integrity: sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.2.4: + resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.3.4: + resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} + + map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + + map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + + merge-options@1.0.1: + resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==} + engines: {node: '>=4'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@3.1.0: + resolution: {integrity: sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==} + engines: {node: '>=0.10.0'} + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + naive-ui@2.43.2: + resolution: {integrity: sha512-YlLMnGrwGTOc+zMj90sG3ubaH5/7czsgLgGcjTLA981IUaz8r6t4WIujNt8r9PNr+dqv6XNEr0vxkARgPPjfBQ==} + peerDependencies: + vue: ^3.0.0 + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.1.6: + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} + engines: {node: ^18 || >=20} + hasBin: true + + nanomatch@1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + + napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-check-updates@19.2.0: + resolution: {integrity: sha512-XSIuL0FNgzXPDZa4lje7+OwHjiyEt84qQm6QMsQRbixNY5EHEM9nhgOjxjlK9jIbN+ysvSqOV8DKNS0zydwbdg==} + engines: {node: '>=20.0.0', npm: '>=8.12.1'} + hasBin: true + + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + + nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + nypm@0.6.2: + resolution: {integrity: sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==} + engines: {node: ^14.16.0 || >=16.10.0} + hasBin: true + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + + ofetch@1.4.1: + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@1.6.0: + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.1: + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} + engines: {node: 20 || >=22} + + pathe@0.2.0: + resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + perfect-debounce@2.0.0: + resolution: {integrity: sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pinia@3.0.4: + resolution: {integrity: sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==} + peerDependencies: + typescript: '>=4.5.0' + vue: ^3.5.11 + peerDependenciesMeta: + typescript: + optional: true + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.1: + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-prefix-selector@1.16.1: + resolution: {integrity: sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==} + peerDependencies: + postcss: '>4 <9' + + postcss-scss@4.0.9: + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.4.29 + + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@5.2.18: + resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==} + engines: {node: '>=0.12'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + posthtml-parser@0.2.1: + resolution: {integrity: sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==} + + posthtml-rename-id@1.0.12: + resolution: {integrity: sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==} + + posthtml-render@1.4.0: + resolution: {integrity: sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==} + engines: {node: '>=10'} + + posthtml-svg-mode@1.0.3: + resolution: {integrity: sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==} + + posthtml@0.9.2: + resolution: {integrity: sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==} + engines: {node: '>=0.10.0'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier-plugin-json-sort@0.0.2: + resolution: {integrity: sha512-xd5VVfneeUBdWhTm5uh0rAto3qnkkosbte6poO5WVTZEAiQdndMQMRPv1SROXx968zfyAlS+Z+C6rkr4jbVOgg==} + peerDependencies: + prettier: '>=2.0.0' + + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + + prettier@3.7.4: + resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} + engines: {node: '>=14'} + hasBin: true + + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + quansync@1.0.0: + resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} + + query-string@4.3.4: + resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==} + engines: {node: '>=0.10.0'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + rate-limiter-flexible@5.0.5: + resolution: {integrity: sha512-+/dSQfo+3FYwYygUs/V2BBdwGa9nFtakDwKt4l0bnvNB53TNT++QSFewwHX9qXrZJuMe9j+TUaU21lm5ARgqdQ==} + + rc9@2.1.2: + resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + + rd@2.0.1: + resolution: {integrity: sha512-/XdKU4UazUZTXFmI0dpABt8jSXPWcEyaGdk340KdHnsEOdkTctlX23aAK7ChQDn39YGNlAJr1M5uvaKt4QnpNw==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + + recast@0.23.9: + resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==} + engines: {node: '>= 4'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + regjsparser@0.13.0: + resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} + hasBin: true + + repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + + ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rimraf@6.1.2: + resolution: {integrity: sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==} + engines: {node: 20 || >=22} + hasBin: true + + rollup@4.54.0: + resolution: {integrity: sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + + sass@1.97.1: + resolution: {integrity: sha512-uf6HoO8fy6ClsrShvMgaKUn14f2EHQLQRtpsZZLeU/Mv0Q1K5P0+x2uvH6Cub39TVVbWNSrraUhDAoFph6vh0A==} + engines: {node: '>=14.0.0'} + hasBin: true + + seemly@0.3.10: + resolution: {integrity: sha512-2+SMxtG1PcsL0uyhkumlOU6Qo9TAQ/WyH7tthnPIOQB05/12jz9naq6GZ6iZ6ApVsO3rr2gsnTf3++OV63kE1Q==} + + select@1.1.2: + resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-git-hooks@2.13.1: + resolution: {integrity: sha512-WszCLXwT4h2k1ufIXAgsbiTOazqqevFCIncOuUBZJ91DdvWcC5+OFkluWRQPrcuSYd8fjq+o2y1QfWqYMoAToQ==} + hasBin: true + + simplebar-core@1.3.2: + resolution: {integrity: sha512-qKgTTuTqapjsFGkNhCjyPhysnbZGpQqNmjk0nOYjFN5ordC/Wjvg+RbYCyMSnW60l/Z0ZS82GbNltly6PMUH1w==} + + simplebar-vue@2.4.2: + resolution: {integrity: sha512-QQKzQ6wQdld5Nwop4Bfd7hitzmWqwfhRaJbtgan/xu7V6WcvspXrAH9fapJNH2Lqny34P43m4rRREp97NcdiiQ==} + peerDependencies: + vue: '>=2.5.17' + + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + + snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + + snapdragon@0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + + source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + + stable-hash-x@0.2.0: + resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} + engines: {node: '>=12.0.0'} + + stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + + static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + + strip-indent@4.1.1: + resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + superjson@2.2.6: + resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} + engines: {node: '>=16'} + + supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + + supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + svelte-eslint-parser@1.4.1: + resolution: {integrity: sha512-1eqkfQ93goAhjAXxZiu1SaKI9+0/sxp4JIWQwUpsz7ybehRE5L8dNuz7Iry7K22R47p5/+s9EM+38nHV2OlgXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0, pnpm: 10.24.0} + peerDependencies: + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + + svg-baker@1.7.0: + resolution: {integrity: sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==} + + svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + + synckit@0.11.11: + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + engines: {node: ^14.18.0 || >=16.0.0} + + tailwind-merge@3.4.0: + resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + tiny-emitter@2.1.0: + resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + + to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + traverse@0.6.11: + resolution: {integrity: sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==} + engines: {node: '>= 0.4'} + + treemate@0.3.11: + resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==} + + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-declaration-location@1.0.7: + resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==} + peerDependencies: + typescript: '>=4.0.0' + + tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typed-css-modules@0.9.1: + resolution: {integrity: sha512-W2HWKncdKd+bLWsnuWB2EyuQBzZ7KJ9Byr/67KLiiyGegcN52rOveun9JR8yAvuL5IXunRMxt0eORMtAUj5bmA==} + engines: {node: '>=18.0.0'} + hasBin: true + + typedarray.prototype.slice@1.0.5: + resolution: {integrity: sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==} + engines: {node: '>= 0.4'} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + unconfig-core@7.4.2: + resolution: {integrity: sha512-VgPCvLWugINbXvMQDf8Jh0mlbvNjNC6eSUziHsBCMpxR05OPrNrvDnyatdMjRgcHaaNsCqz+wjNXxNw1kRLHUg==} + + unconfig@7.4.2: + resolution: {integrity: sha512-nrMlWRQ1xdTjSnSUqvYqJzbTBFugoqHobQj58B2bc8qxHKBBHMNNsWQFP3Cd3/JZK907voM2geYPWqD4VK3MPQ==} + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unplugin-icons@22.5.0: + resolution: {integrity: sha512-MBlMtT5RuMYZy4TZgqUL2OTtOdTUVsS1Mhj6G1pEzMlFJlEnq6mhUfoIt45gBWxHcsOdXJDWLg3pRZ+YmvAVWQ==} + peerDependencies: + '@svgr/core': '>=7.0.0' + '@svgx/core': ^1.0.1 + '@vue/compiler-sfc': ^3.0.2 || ^2.7.0 + svelte: ^3.0.0 || ^4.0.0 || ^5.0.0 + vue-template-compiler: ^2.6.12 + vue-template-es2015-compiler: ^1.9.0 + peerDependenciesMeta: + '@svgr/core': + optional: true + '@svgx/core': + optional: true + '@vue/compiler-sfc': + optional: true + svelte: + optional: true + vue-template-compiler: + optional: true + vue-template-es2015-compiler: + optional: true + + unplugin-utils@0.3.1: + resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==} + engines: {node: '>=20.19.0'} + + unplugin-vue-components@30.0.0: + resolution: {integrity: sha512-4qVE/lwCgmdPTp6h0qsRN2u642tt4boBQtcpn4wQcWZAsr8TQwq+SPT3NDu/6kBFxzo/sSEK4ioXhOOBrXc3iw==} + engines: {node: '>=14'} + peerDependencies: + '@babel/parser': ^7.15.8 + '@nuxt/kit': ^3.2.2 || ^4.0.0 + vue: 2 || 3 + peerDependenciesMeta: + '@babel/parser': + optional: true + '@nuxt/kit': + optional: true + + unplugin@1.12.0: + resolution: {integrity: sha512-KeczzHl2sATPQUx1gzo+EnUkmN4VmGBYRRVOZSGvGITE9rGHRDGqft6ONceP3vgXcyJ2XjX5axG5jMWUwNCYLw==} + engines: {node: '>=14.0.0'} + + unplugin@2.3.11: + resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} + engines: {node: '>=18.12.0'} + + unrs-resolver@1.11.1: + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + + unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + + use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vdirs@0.1.8: + resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==} + peerDependencies: + vue: ^3.0.11 + + vite-dev-rpc@1.1.0: + resolution: {integrity: sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0 + + vite-hot-client@2.1.0: + resolution: {integrity: sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==} + peerDependencies: + vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 + + vite-plugin-inspect@11.3.3: + resolution: {integrity: sha512-u2eV5La99oHoYPHE6UvbwgEqKKOQGz86wMg40CCosP6q8BkB6e5xPneZfYagK4ojPJSj5anHCrnvC20DpwVdRA==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': '*' + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + + vite-plugin-progress@0.0.7: + resolution: {integrity: sha512-zyvKdcc/X+6hnw3J1HVV1TKrlFKC4Rh8GnDnWG/2qhRXjqytTcM++xZ+SAPnoDsSyWl8O93ymK0wZRgHAoglEQ==} + engines: {node: '>=14', pnpm: '>=7.0.0'} + peerDependencies: + vite: '>2.0.0-0' + + vite-plugin-svg-icons@2.0.1: + resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==} + peerDependencies: + vite: '>=2.0.0' + + vite-plugin-vue-devtools@8.0.5: + resolution: {integrity: sha512-p619BlKFOqQXJ6uDWS1vUPQzuJOD6xJTfftj57JXBGoBD/yeQCowR7pnWcr/FEX4/HVkFbreI6w2uuGBmQOh6A==} + engines: {node: '>=v14.21.3'} + peerDependencies: + vite: ^6.0.0 || ^7.0.0-0 + + vite-plugin-vue-inspector@5.3.2: + resolution: {integrity: sha512-YvEKooQcSiBTAs0DoYLfefNja9bLgkFM7NI2b07bE2SruuvX0MEa9cMaxjKVMkeCp5Nz9FRIdcN1rOdFVBeL6Q==} + peerDependencies: + vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 + + vite@7.3.0: + resolution: {integrity: sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + 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 + + vooks@0.2.12: + resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==} + peerDependencies: + vue: ^3.0.0 + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + vue-demi@0.13.11: + resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-draggable-plus@0.6.0: + resolution: {integrity: sha512-G5TSfHrt9tX9EjdG49InoFJbt2NYk0h3kgjgKxkFWr3ulIUays0oFObr5KZ8qzD4+QnhtALiRwIqY6qul4egqw==} + peerDependencies: + '@types/sortablejs': ^1.15.0 + '@vue/composition-api': '*' + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-eslint-parser@10.2.0: + resolution: {integrity: sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + vue-flow-layout@0.2.0: + resolution: {integrity: sha512-zKgsWWkXq0xrus7H4Mc+uFs1ESrmdTXlO0YNbR6wMdPaFvosL3fMB8N7uTV308UhGy9UvTrGhIY7mVz9eN+L0Q==} + + vue-i18n@11.2.7: + resolution: {integrity: sha512-LPv8bAY5OA0UvFEXl4vBQOBqJzRrlExy92tWgRuwW7tbykHf7CH71G2Y4TM2OwGcIS4+hyqKHS2EVBqaYwPY9Q==} + engines: {node: '>= 16'} + peerDependencies: + vue: ^3.0.0 + + vue-router@4.6.4: + resolution: {integrity: sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==} + peerDependencies: + vue: ^3.5.0 + + vue-tsc@3.2.1: + resolution: {integrity: sha512-I23Rk8dkQfmcSbxDO0dmg9ioMLjKA1pjlU3Lz6Jfk2pMGu3Uryu9810XkcZH24IzPbhzPCnkKo2rEMRX0skSrw==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + + vue@3.5.26: + resolution: {integrity: sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + vueuc@0.4.65: + resolution: {integrity: sha512-lXuMl+8gsBmruudfxnMF9HW4be8rFziylXFu1VHVNbLVhRTXXV4njvpRuJapD/8q+oFEMSfQMH16E/85VoWRyQ==} + peerDependencies: + vue: ^3.0.11 + + webpack-sources@3.3.3: + resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} + engines: {node: '>=10.13.0'} + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + + zrender@6.0.0: + resolution: {integrity: sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==} + +snapshots: + + '@alova/mock@2.0.18(alova@3.4.1)': + dependencies: + '@alova/shared': 1.3.2 + alova: 3.4.1 + + '@alova/shared@1.3.2': {} + + '@antfu/eslint-define-config@1.23.0-2': {} + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.6.0 + tinyexec: 1.0.2 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.5': {} + + '@babel/core@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.5 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.5 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.28.5': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.5 + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/plugin-proposal-decorators@7.28.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typescript@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + '@babel/traverse@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@better-scroll/core@2.5.1': + dependencies: + '@better-scroll/shared-utils': 2.5.1 + + '@better-scroll/shared-utils@2.5.1': {} + + '@css-render/plugin-bem@0.15.14(css-render@0.15.14)': + dependencies: + css-render: 0.15.14 + + '@css-render/vue3-ssr@0.15.14(vue@3.5.26(typescript@5.9.3))': + dependencies: + vue: 3.5.26(typescript@5.9.3) + + '@elegant-router/core@0.3.8': + dependencies: + chokidar: 3.6.0 + consola: 3.2.3 + fast-glob: 3.3.2 + kolorist: 1.8.0 + micromatch: 4.0.7 + + '@elegant-router/vue@0.3.8': + dependencies: + '@elegant-router/core': 0.3.8 + consola: 3.2.3 + kolorist: 1.8.0 + magic-string: 0.30.11 + magicast: 0.3.4 + prettier: 3.3.3 + recast: 0.23.9 + unplugin: 1.12.0 + + '@emnapi/core@1.7.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.7.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emotion/hash@0.8.0': {} + + '@esbuild/aix-ppc64@0.27.2': + optional: true + + '@esbuild/android-arm64@0.27.2': + optional: true + + '@esbuild/android-arm@0.27.2': + optional: true + + '@esbuild/android-x64@0.27.2': + optional: true + + '@esbuild/darwin-arm64@0.27.2': + optional: true + + '@esbuild/darwin-x64@0.27.2': + optional: true + + '@esbuild/freebsd-arm64@0.27.2': + optional: true + + '@esbuild/freebsd-x64@0.27.2': + optional: true + + '@esbuild/linux-arm64@0.27.2': + optional: true + + '@esbuild/linux-arm@0.27.2': + optional: true + + '@esbuild/linux-ia32@0.27.2': + optional: true + + '@esbuild/linux-loong64@0.27.2': + optional: true + + '@esbuild/linux-mips64el@0.27.2': + optional: true + + '@esbuild/linux-ppc64@0.27.2': + optional: true + + '@esbuild/linux-riscv64@0.27.2': + optional: true + + '@esbuild/linux-s390x@0.27.2': + optional: true + + '@esbuild/linux-x64@0.27.2': + optional: true + + '@esbuild/netbsd-arm64@0.27.2': + optional: true + + '@esbuild/netbsd-x64@0.27.2': + optional: true + + '@esbuild/openbsd-arm64@0.27.2': + optional: true + + '@esbuild/openbsd-x64@0.27.2': + optional: true + + '@esbuild/openharmony-arm64@0.27.2': + optional: true + + '@esbuild/sunos-x64@0.27.2': + optional: true + + '@esbuild/win32-arm64@0.27.2': + optional: true + + '@esbuild/win32-ia32@0.27.2': + optional: true + + '@esbuild/win32-x64@0.27.2': + optional: true + + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2(jiti@2.6.1))': + dependencies: + eslint: 9.39.2(jiti@2.6.1) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/compat@1.4.1(eslint@9.39.2(jiti@2.6.1))': + dependencies: + '@eslint/core': 0.17.0 + optionalDependencies: + eslint: 9.39.2(jiti@2.6.1) + + '@eslint/config-array@0.21.1': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.3': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.39.2': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@iconify/json@2.2.417': + dependencies: + '@iconify/types': 2.0.0 + pathe: 2.0.3 + + '@iconify/types@2.0.0': {} + + '@iconify/utils@3.1.0': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@iconify/types': 2.0.0 + mlly: 1.8.0 + + '@iconify/vue@5.0.0(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@iconify/types': 2.0.0 + vue: 3.5.26(typescript@5.9.3) + + '@intlify/core-base@11.2.7': + dependencies: + '@intlify/message-compiler': 11.2.7 + '@intlify/shared': 11.2.7 + + '@intlify/message-compiler@11.2.7': + dependencies: + '@intlify/shared': 11.2.7 + source-map-js: 1.2.1 + + '@intlify/shared@11.2.7': {} + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@juggle/resize-observer@3.4.0': {} + + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.7.1 + '@emnapi/runtime': 1.7.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + optional: true + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.2.9': {} + + '@polka/url@1.0.0-next.29': {} + + '@quansync/fs@1.0.0': + dependencies: + quansync: 1.0.0 + + '@rolldown/pluginutils@1.0.0-beta.53': {} + + '@rolldown/pluginutils@1.0.0-beta.56': {} + + '@rollup/rollup-android-arm-eabi@4.54.0': + optional: true + + '@rollup/rollup-android-arm64@4.54.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.54.0': + optional: true + + '@rollup/rollup-darwin-x64@4.54.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.54.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.54.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.54.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.54.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.54.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.54.0': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.54.0': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.54.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.54.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.54.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.54.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.54.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.54.0': + optional: true + + '@rollup/rollup-openharmony-arm64@4.54.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.54.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.54.0': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.54.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.54.0': + optional: true + + '@sec-ant/readable-stream@0.4.1': {} + + '@sindresorhus/merge-streams@4.0.0': {} + + '@soybeanjs/changelog@0.3.25(@typescript-eslint/utils@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(@unocss/eslint-config@66.5.10(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-plugin-vue@10.6.2(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))))(eslint@9.39.2(jiti@2.6.1))(svelte-eslint-parser@1.4.1)(typescript@5.9.3)(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1)))': + dependencies: + '@soybeanjs/eslint-config': 1.7.4(@typescript-eslint/utils@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(@unocss/eslint-config@66.5.10(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-plugin-vue@10.6.2(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))))(eslint@9.39.2(jiti@2.6.1))(svelte-eslint-parser@1.4.1)(typescript@5.9.3)(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))) + cli-progress: 3.12.0 + convert-gitmoji: 0.1.5 + dayjs: 1.11.15 + execa: 9.6.0 + ofetch: 1.4.1 + semver: 7.7.2 + transitivePeerDependencies: + - '@toml-tools/parser' + - '@types/eslint' + - '@typescript-eslint/utils' + - '@unocss/eslint-config' + - eslint + - eslint-import-resolver-node + - eslint-plugin-astro + - eslint-plugin-react + - eslint-plugin-react-hooks + - eslint-plugin-react-native + - eslint-plugin-react-refresh + - eslint-plugin-solid + - eslint-plugin-svelte + - eslint-plugin-vue + - prettier-plugin-astro + - prettier-plugin-svelte + - prettier-plugin-toml + - supports-color + - svelte-eslint-parser + - typescript + - vue-eslint-parser + + '@soybeanjs/eslint-config@1.7.4(@typescript-eslint/utils@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(@unocss/eslint-config@66.5.10(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-plugin-vue@10.6.2(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))))(eslint@9.39.2(jiti@2.6.1))(svelte-eslint-parser@1.4.1)(typescript@5.9.3)(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1)))': + dependencies: + '@antfu/eslint-define-config': 1.23.0-2 + '@antfu/install-pkg': 1.1.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.2 + '@typescript-eslint/eslint-plugin': 8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + eslint-config-flat-gitignore: 2.1.0(eslint@9.39.2(jiti@2.6.1)) + eslint-config-prettier: 10.1.8(eslint@9.39.2(jiti@2.6.1)) + eslint-parser-plain: 0.1.1 + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-n: 17.23.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-prettier: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))(prettier@3.7.4) + eslint-plugin-unicorn: 62.0.0(eslint@9.39.2(jiti@2.6.1)) + globals: 16.5.0 + local-pkg: 1.1.2 + prettier: 3.7.4 + prettier-plugin-json-sort: 0.0.2(prettier@3.7.4) + prompts: 2.4.2 + svelte-eslint-parser: 1.4.1 + typescript: 5.9.3 + optionalDependencies: + '@unocss/eslint-config': 66.5.10(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-vue: 10.6.2(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))) + vue-eslint-parser: 10.2.0(eslint@9.39.2(jiti@2.6.1)) + transitivePeerDependencies: + - '@types/eslint' + - '@typescript-eslint/utils' + - eslint-import-resolver-node + - supports-color + + '@trysound/sax@0.2.0': {} + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/crypto-js@4.2.2': {} + + '@types/estree@1.0.8': {} + + '@types/json-schema@7.0.15': {} + + '@types/katex@0.16.7': {} + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.21 + + '@types/lodash@4.17.21': {} + + '@types/node@10.17.60': {} + + '@types/node@25.0.3': + dependencies: + undici-types: 7.16.0 + + '@types/nprogress@0.2.3': {} + + '@types/qs@6.14.0': {} + + '@types/sortablejs@1.15.9': {} + + '@types/svgo@2.6.4': + dependencies: + '@types/node': 25.0.3 + + '@types/web-bluetooth@0.0.21': {} + + '@typescript-eslint/eslint-plugin@8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.50.0 + '@typescript-eslint/type-utils': 8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.50.0 + eslint: 9.39.2(jiti@2.6.1) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.50.0 + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.50.0 + debug: 4.4.3 + eslint: 9.39.2(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.50.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3) + '@typescript-eslint/types': 8.50.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.50.0': + dependencies: + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/visitor-keys': 8.50.0 + + '@typescript-eslint/tsconfig-utils@8.50.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.39.2(jiti@2.6.1) + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.50.0': {} + + '@typescript-eslint/typescript-estree@8.50.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.50.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3) + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/visitor-keys': 8.50.0 + debug: 4.4.3 + minimatch: 9.0.5 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.50.0 + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.50.0': + dependencies: + '@typescript-eslint/types': 8.50.0 + eslint-visitor-keys: 4.2.1 + + '@unocss/config@66.5.10': + dependencies: + '@unocss/core': 66.5.10 + unconfig: 7.4.2 + + '@unocss/core@66.5.10': {} + + '@unocss/eslint-config@66.5.10(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@unocss/eslint-plugin': 66.5.10(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + transitivePeerDependencies: + - eslint + - supports-color + - typescript + + '@unocss/eslint-plugin@66.5.10(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/utils': 8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@unocss/config': 66.5.10 + '@unocss/core': 66.5.10 + '@unocss/rule-utils': 66.5.10 + magic-string: 0.30.21 + synckit: 0.11.11 + transitivePeerDependencies: + - eslint + - supports-color + - typescript + + '@unocss/extractor-arbitrary-variants@66.5.10': + dependencies: + '@unocss/core': 66.5.10 + + '@unocss/inspector@66.5.10': + dependencies: + '@unocss/core': 66.5.10 + '@unocss/rule-utils': 66.5.10 + colorette: 2.0.20 + gzip-size: 6.0.0 + sirv: 3.0.2 + vue-flow-layout: 0.2.0 + + '@unocss/preset-icons@66.5.10': + dependencies: + '@iconify/utils': 3.1.0 + '@unocss/core': 66.5.10 + ofetch: 1.5.1 + + '@unocss/preset-mini@66.5.10': + dependencies: + '@unocss/core': 66.5.10 + '@unocss/extractor-arbitrary-variants': 66.5.10 + '@unocss/rule-utils': 66.5.10 + + '@unocss/preset-uno@66.5.10': + dependencies: + '@unocss/core': 66.5.10 + '@unocss/preset-wind3': 66.5.10 + + '@unocss/preset-wind3@66.5.10': + dependencies: + '@unocss/core': 66.5.10 + '@unocss/preset-mini': 66.5.10 + '@unocss/rule-utils': 66.5.10 + + '@unocss/rule-utils@66.5.10': + dependencies: + '@unocss/core': 66.5.10 + magic-string: 0.30.21 + + '@unocss/transformer-directives@66.5.10': + dependencies: + '@unocss/core': 66.5.10 + '@unocss/rule-utils': 66.5.10 + css-tree: 3.1.0 + + '@unocss/transformer-variant-group@66.5.10': + dependencies: + '@unocss/core': 66.5.10 + + '@unocss/vite@66.5.10(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))': + dependencies: + '@jridgewell/remapping': 2.3.5 + '@unocss/config': 66.5.10 + '@unocss/core': 66.5.10 + '@unocss/inspector': 66.5.10 + chokidar: 3.6.0 + magic-string: 0.30.21 + pathe: 2.0.3 + tinyglobby: 0.2.15 + unplugin-utils: 0.3.1 + vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + optional: true + + '@unrs/resolver-binding-android-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + optional: true + + '@vitejs/plugin-vue-jsx@5.1.2(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) + '@rolldown/pluginutils': 1.0.0-beta.56 + '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.28.5) + vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vue: 3.5.26(typescript@5.9.3) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-vue@6.0.3(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@rolldown/pluginutils': 1.0.0-beta.53 + vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vue: 3.5.26(typescript@5.9.3) + + '@volar/language-core@2.4.27': + dependencies: + '@volar/source-map': 2.4.27 + + '@volar/source-map@2.4.27': {} + + '@volar/typescript@2.4.27': + dependencies: + '@volar/language-core': 2.4.27 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue/babel-helper-vue-transform-on@1.5.0': {} + + '@vue/babel-helper-vue-transform-on@2.0.1': {} + + '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.28.5)': + dependencies: + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@vue/babel-helper-vue-transform-on': 1.5.0 + '@vue/babel-plugin-resolve-type': 1.5.0(@babel/core@7.28.5) + '@vue/shared': 3.5.26 + optionalDependencies: + '@babel/core': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-jsx@2.0.1(@babel/core@7.28.5)': + dependencies: + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@vue/babel-helper-vue-transform-on': 2.0.1 + '@vue/babel-plugin-resolve-type': 2.0.1(@babel/core@7.28.5) + '@vue/shared': 3.5.26 + optionalDependencies: + '@babel/core': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-resolve-type@1.5.0(@babel/core@7.28.5)': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/parser': 7.28.5 + '@vue/compiler-sfc': 3.5.26 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-resolve-type@2.0.1(@babel/core@7.28.5)': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/parser': 7.28.5 + '@vue/compiler-sfc': 3.5.26 + transitivePeerDependencies: + - supports-color + + '@vue/compiler-core@3.5.26': + dependencies: + '@babel/parser': 7.28.5 + '@vue/shared': 3.5.26 + entities: 7.0.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.26': + dependencies: + '@vue/compiler-core': 3.5.26 + '@vue/shared': 3.5.26 + + '@vue/compiler-sfc@3.5.26': + dependencies: + '@babel/parser': 7.28.5 + '@vue/compiler-core': 3.5.26 + '@vue/compiler-dom': 3.5.26 + '@vue/compiler-ssr': 3.5.26 + '@vue/shared': 3.5.26 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.6 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.26': + dependencies: + '@vue/compiler-dom': 3.5.26 + '@vue/shared': 3.5.26 + + '@vue/devtools-api@6.6.4': {} + + '@vue/devtools-api@7.7.9': + dependencies: + '@vue/devtools-kit': 7.7.9 + + '@vue/devtools-core@8.0.5(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@vue/devtools-kit': 8.0.5 + '@vue/devtools-shared': 8.0.5 + mitt: 3.0.1 + nanoid: 5.1.6 + pathe: 2.0.3 + vite-hot-client: 2.1.0(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + vue: 3.5.26(typescript@5.9.3) + transitivePeerDependencies: + - vite + + '@vue/devtools-kit@7.7.9': + dependencies: + '@vue/devtools-shared': 7.7.9 + birpc: 2.9.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.6 + + '@vue/devtools-kit@8.0.5': + dependencies: + '@vue/devtools-shared': 8.0.5 + birpc: 2.9.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 2.0.0 + speakingurl: 14.0.1 + superjson: 2.2.6 + + '@vue/devtools-shared@7.7.9': + dependencies: + rfdc: 1.4.1 + + '@vue/devtools-shared@8.0.5': + dependencies: + rfdc: 1.4.1 + + '@vue/language-core@3.2.1': + dependencies: + '@volar/language-core': 2.4.27 + '@vue/compiler-dom': 3.5.26 + '@vue/shared': 3.5.26 + alien-signals: 3.1.1 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + picomatch: 4.0.3 + + '@vue/reactivity@3.5.26': + dependencies: + '@vue/shared': 3.5.26 + + '@vue/runtime-core@3.5.26': + dependencies: + '@vue/reactivity': 3.5.26 + '@vue/shared': 3.5.26 + + '@vue/runtime-dom@3.5.26': + dependencies: + '@vue/reactivity': 3.5.26 + '@vue/runtime-core': 3.5.26 + '@vue/shared': 3.5.26 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.26(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@vue/compiler-ssr': 3.5.26 + '@vue/shared': 3.5.26 + vue: 3.5.26(typescript@5.9.3) + + '@vue/shared@3.5.26': {} + + '@vueuse/core@14.1.0(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 14.1.0 + '@vueuse/shared': 14.1.0(vue@3.5.26(typescript@5.9.3)) + vue: 3.5.26(typescript@5.9.3) + + '@vueuse/metadata@14.1.0': {} + + '@vueuse/shared@14.1.0(vue@3.5.26(typescript@5.9.3))': + dependencies: + vue: 3.5.26(typescript@5.9.3) + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + alien-signals@3.1.1: {} + + alova@3.4.1: + dependencies: + '@alova/shared': 1.3.2 + rate-limiter-flexible: 5.0.5 + + ansi-colors@4.1.3: {} + + ansi-regex@2.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@2.2.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + ansis@4.2.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@2.0.1: {} + + args-tokenizer@0.3.0: {} + + arr-diff@4.0.0: {} + + arr-flatten@1.1.0: {} + + arr-union@3.1.0: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-unique@0.3.2: {} + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + assign-symbols@1.0.0: {} + + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + + async-function@1.0.0: {} + + async-validator@4.2.5: {} + + asynckit@0.4.0: {} + + atob@2.1.2: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axios-retry@4.5.0(axios@1.13.2): + dependencies: + axios: 1.13.2 + is-retry-allowed: 2.2.0 + + axios@1.13.2: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + base@0.11.2: + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.1 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + + baseline-browser-mapping@2.9.11: {} + + big.js@5.2.2: {} + + binary-extensions@2.3.0: {} + + birpc@2.9.0: {} + + bluebird@3.7.2: {} + + boolbase@1.0.0: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@2.3.2: + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.9.11 + caniuse-lite: 1.0.30001761 + electron-to-chromium: 1.5.267 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + + builtin-modules@5.0.0: {} + + bumpp@10.3.2(magicast@0.3.4): + dependencies: + ansis: 4.2.0 + args-tokenizer: 0.3.0 + c12: 3.3.3(magicast@0.3.4) + cac: 6.7.14 + escalade: 3.2.0 + jsonc-parser: 3.3.1 + package-manager-detector: 1.6.0 + semver: 7.7.3 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + yaml: 2.8.2 + transitivePeerDependencies: + - magicast + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + + c12@3.3.3(magicast@0.3.4): + dependencies: + chokidar: 5.0.0 + confbox: 0.2.2 + defu: 6.1.4 + dotenv: 17.2.3 + exsolve: 1.0.8 + giget: 2.0.0 + jiti: 2.6.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.0.0 + pkg-types: 2.3.0 + rc9: 2.1.2 + optionalDependencies: + magicast: 0.3.4 + + cac@6.7.14: {} + + cache-base@1.0.1: + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.1 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001761: {} + + chalk@1.1.3: + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + change-case@5.4.4: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + + ci-info@4.3.1: {} + + citty@0.1.6: + dependencies: + consola: 3.4.2 + + class-utils@0.3.6: + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + + clean-regexp@1.0.0: + dependencies: + escape-string-regexp: 1.0.5 + + cli-progress@3.12.0: + dependencies: + string-width: 4.2.3 + + clipboard@2.0.11: + dependencies: + good-listener: 1.2.2 + select: 1.1.2 + tiny-emitter: 2.1.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@2.1.2: {} + + collection-visit@1.0.0: + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colord@2.9.3: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@7.2.0: {} + + comment-parser@1.4.1: {} + + component-emitter@1.3.1: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + confbox@0.2.2: {} + + consola@3.2.3: {} + + consola@3.4.2: {} + + convert-gitmoji@0.1.5: {} + + convert-source-map@2.0.0: {} + + copy-anything@4.0.5: + dependencies: + is-what: 5.5.0 + + copy-descriptor@0.1.1: {} + + core-js-compat@3.47.0: + dependencies: + browserslist: 4.28.1 + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-js@4.2.0: {} + + css-render@0.15.14: + dependencies: + '@emotion/hash': 0.8.0 + csstype: 3.0.11 + + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + css-tree@1.1.3: + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + + css-what@6.2.2: {} + + cssesc@3.0.0: {} + + csso@4.2.0: + dependencies: + css-tree: 1.1.3 + + csstype@3.0.11: {} + + csstype@3.2.3: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + date-fns-tz@3.2.0(date-fns@4.1.0): + dependencies: + date-fns: 4.1.0 + + date-fns@4.1.0: {} + + dayjs@1.11.15: {} + + dayjs@1.11.19: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decode-uri-component@0.2.2: {} + + deep-is@0.1.4: {} + + default-browser-id@5.0.1: {} + + default-browser@5.4.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-lazy-prop@3.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + define-property@0.2.5: + dependencies: + is-descriptor: 0.1.7 + + define-property@1.0.0: + dependencies: + is-descriptor: 1.0.3 + + define-property@2.0.2: + dependencies: + is-descriptor: 1.0.3 + isobject: 3.0.1 + + defu@6.1.4: {} + + delayed-stream@1.0.0: {} + + delegate@3.2.0: {} + + destr@2.0.5: {} + + detect-libc@1.0.3: + optional: true + + dom-serializer@0.2.2: + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + domelementtype@1.3.1: {} + + domelementtype@2.3.0: {} + + domhandler@2.4.2: + dependencies: + domelementtype: 1.3.1 + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domutils@1.7.0: + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + dotenv@17.2.3: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer@0.1.2: {} + + eastasianwidth@0.2.0: {} + + echarts@6.0.0: + dependencies: + tslib: 2.3.0 + zrender: 6.0.0 + + electron-to-chromium@1.5.267: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + emojis-list@3.0.0: {} + + enhanced-resolve@5.18.4: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + entities@1.1.2: {} + + entities@2.2.0: {} + + entities@7.0.0: {} + + error-stack-parser-es@1.0.5: {} + + es-abstract@1.24.1: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild@0.27.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 + + escalade@3.2.0: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + eslint-compat-utils@0.5.1(eslint@9.39.2(jiti@2.6.1)): + dependencies: + eslint: 9.39.2(jiti@2.6.1) + semver: 7.7.3 + + eslint-config-flat-gitignore@2.1.0(eslint@9.39.2(jiti@2.6.1)): + dependencies: + '@eslint/compat': 1.4.1(eslint@9.39.2(jiti@2.6.1)) + eslint: 9.39.2(jiti@2.6.1) + + eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)): + dependencies: + eslint: 9.39.2(jiti@2.6.1) + + eslint-import-context@0.1.9(unrs-resolver@1.11.1): + dependencies: + get-tsconfig: 4.13.0 + stable-hash-x: 0.2.0 + optionalDependencies: + unrs-resolver: 1.11.1 + + eslint-parser-plain@0.1.1: {} + + eslint-plugin-es-x@7.8.0(eslint@9.39.2(jiti@2.6.1)): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + eslint: 9.39.2(jiti@2.6.1) + eslint-compat-utils: 0.5.1(eslint@9.39.2(jiti@2.6.1)) + + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)): + dependencies: + '@typescript-eslint/types': 8.50.0 + comment-parser: 1.4.1 + debug: 4.4.3 + eslint: 9.39.2(jiti@2.6.1) + eslint-import-context: 0.1.9(unrs-resolver@1.11.1) + is-glob: 4.0.3 + minimatch: 10.1.1 + semver: 7.7.3 + stable-hash-x: 0.2.0 + unrs-resolver: 1.11.1 + optionalDependencies: + '@typescript-eslint/utils': 8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + transitivePeerDependencies: + - supports-color + + eslint-plugin-n@17.23.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) + enhanced-resolve: 5.18.4 + eslint: 9.39.2(jiti@2.6.1) + eslint-plugin-es-x: 7.8.0(eslint@9.39.2(jiti@2.6.1)) + get-tsconfig: 4.13.0 + globals: 15.15.0 + globrex: 0.1.2 + ignore: 5.3.2 + semver: 7.7.3 + ts-declaration-location: 1.0.7(typescript@5.9.3) + transitivePeerDependencies: + - typescript + + eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))(prettier@3.7.4): + dependencies: + eslint: 9.39.2(jiti@2.6.1) + prettier: 3.7.4 + prettier-linter-helpers: 1.0.0 + synckit: 0.11.11 + optionalDependencies: + eslint-config-prettier: 10.1.8(eslint@9.39.2(jiti@2.6.1)) + + eslint-plugin-unicorn@62.0.0(eslint@9.39.2(jiti@2.6.1)): + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) + '@eslint/plugin-kit': 0.4.1 + change-case: 5.4.4 + ci-info: 4.3.1 + clean-regexp: 1.0.0 + core-js-compat: 3.47.0 + eslint: 9.39.2(jiti@2.6.1) + esquery: 1.6.0 + find-up-simple: 1.0.1 + globals: 16.5.0 + indent-string: 5.0.0 + is-builtin-module: 5.0.0 + jsesc: 3.1.0 + pluralize: 8.0.0 + regexp-tree: 0.1.27 + regjsparser: 0.13.0 + semver: 7.7.3 + strip-indent: 4.1.1 + + eslint-plugin-vue@10.6.2(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) + eslint: 9.39.2(jiti@2.6.1) + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 7.1.1 + semver: 7.7.3 + vue-eslint-parser: 10.2.0(eslint@9.39.2(jiti@2.6.1)) + xml-name-validator: 4.0.0 + optionalDependencies: + '@typescript-eslint/parser': 8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@9.39.2(jiti@2.6.1): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.2 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + esprima@4.0.1: {} + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + evtd@0.2.4: {} + + execa@9.6.0: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.2 + + execa@9.6.1: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.2 + + expand-brackets@2.1.4: + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + exsolve@1.0.8: {} + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend-shallow@3.0.2: + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + + extglob@2.0.4: + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@4.0.0: + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up-simple@1.0.1: {} + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + follow-redirects@1.15.11: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + for-in@1.0.2: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fragment-cache@0.2.1: + dependencies: + map-cache: 0.2.2 + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-tsconfig@4.13.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + get-value@2.0.6: {} + + giget@2.0.0: + dependencies: + citty: 0.1.6 + consola: 3.4.2 + defu: 6.1.4 + node-fetch-native: 1.6.7 + nypm: 0.6.2 + pathe: 2.0.3 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@13.0.0: + dependencies: + minimatch: 10.1.1 + minipass: 7.1.2 + path-scurry: 2.0.1 + + globals@14.0.0: {} + + globals@15.15.0: {} + + globals@16.5.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globrex@0.1.2: {} + + good-listener@1.2.2: + dependencies: + delegate: 3.2.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + gzip-size@6.0.0: + dependencies: + duplexer: 0.1.2 + + has-ansi@2.0.0: + dependencies: + ansi-regex: 2.1.1 + + has-bigints@1.1.0: {} + + has-flag@1.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + has-value@0.3.1: + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + + has-value@1.0.0: + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + + has-values@0.1.4: {} + + has-values@1.0.0: + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + highlight.js@11.11.1: {} + + hookable@5.5.3: {} + + htmlparser2@3.10.1: + dependencies: + domelementtype: 1.3.1 + domhandler: 2.4.2 + domutils: 1.7.0 + entities: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + + human-signals@8.0.1: {} + + icss-replace-symbols@1.1.0: {} + + icss-utils@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + image-size@0.5.5: {} + + immediate@3.0.6: {} + + immutable@5.1.4: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + indent-string@5.0.0: {} + + inherits@2.0.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + is-accessor-descriptor@1.0.1: + dependencies: + hasown: 2.0.2 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-buffer@1.1.6: {} + + is-builtin-module@5.0.0: + dependencies: + builtin-modules: 5.0.0 + + is-callable@1.2.7: {} + + is-data-descriptor@1.0.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-descriptor@0.1.7: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + is-descriptor@1.0.3: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + is-docker@3.0.0: {} + + is-extendable@0.1.1: {} + + is-extendable@1.0.1: + dependencies: + is-plain-object: 2.0.4 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@3.0.0: + dependencies: + kind-of: 3.2.2 + + is-number@7.0.0: {} + + is-plain-obj@1.1.0: {} + + is-plain-obj@4.1.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-retry-allowed@2.2.0: {} + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-stream@4.0.1: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-there@4.5.2: {} + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-unicode-supported@2.1.0: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-what@5.5.0: {} + + is-windows@1.0.2: {} + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isobject@2.1.0: + dependencies: + isarray: 1.0.0 + + isobject@3.0.1: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@2.6.1: {} + + js-base64@2.6.4: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + json5@2.2.3: {} + + jsonc-parser@3.3.1: {} + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + kind-of@4.0.0: + dependencies: + is-buffer: 1.1.6 + + kind-of@5.1.0: {} + + kind-of@6.0.3: {} + + kleur@3.0.3: {} + + klona@2.0.6: {} + + kolorist@1.8.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lie@3.1.1: + dependencies: + immediate: 3.0.6 + + loader-utils@1.4.2: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 1.0.2 + + local-pkg@1.1.2: + dependencies: + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 + + localforage@1.10.0: + dependencies: + lie: 3.1.1 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash-es@4.17.22: {} + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + lru-cache@10.4.3: {} + + lru-cache@11.2.4: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.30.11: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.3.4: + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + source-map-js: 1.2.1 + + map-cache@0.2.2: {} + + map-visit@1.0.0: + dependencies: + object-visit: 1.0.1 + + math-intrinsics@1.1.0: {} + + mdn-data@2.0.14: {} + + mdn-data@2.12.2: {} + + merge-options@1.0.1: + dependencies: + is-plain-obj: 1.1.0 + + merge2@1.4.1: {} + + micromatch@3.1.0: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 1.0.0 + extend-shallow: 2.0.1 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 5.1.0 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + optional: true + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@10.1.1: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mitt@3.0.1: {} + + mixin-deep@1.3.2: + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + + mkdirp@3.0.1: {} + + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + + mrmime@2.0.1: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + naive-ui@2.43.2(vue@3.5.26(typescript@5.9.3)): + dependencies: + '@css-render/plugin-bem': 0.15.14(css-render@0.15.14) + '@css-render/vue3-ssr': 0.15.14(vue@3.5.26(typescript@5.9.3)) + '@types/katex': 0.16.7 + '@types/lodash': 4.17.21 + '@types/lodash-es': 4.17.12 + async-validator: 4.2.5 + css-render: 0.15.14 + csstype: 3.2.3 + date-fns: 4.1.0 + date-fns-tz: 3.2.0(date-fns@4.1.0) + evtd: 0.2.4 + highlight.js: 11.11.1 + lodash: 4.17.21 + lodash-es: 4.17.22 + seemly: 0.3.10 + treemate: 0.3.11 + vdirs: 0.1.8(vue@3.5.26(typescript@5.9.3)) + vooks: 0.2.12(vue@3.5.26(typescript@5.9.3)) + vue: 3.5.26(typescript@5.9.3) + vueuc: 0.4.65(vue@3.5.26(typescript@5.9.3)) + + nanoid@3.3.11: {} + + nanoid@5.1.6: {} + + nanomatch@1.2.13: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + napi-postinstall@0.3.4: {} + + natural-compare@1.4.0: {} + + node-addon-api@7.1.1: + optional: true + + node-fetch-native@1.6.7: {} + + node-releases@2.0.27: {} + + normalize-path@3.0.0: {} + + npm-check-updates@19.2.0: {} + + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + + nprogress@0.2.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + nypm@0.6.2: + dependencies: + citty: 0.1.6 + consola: 3.4.2 + pathe: 2.0.3 + pkg-types: 2.3.0 + tinyexec: 1.0.2 + + object-assign@4.1.1: {} + + object-copy@0.1.0: + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object-visit@1.0.1: + dependencies: + isobject: 3.0.1 + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.pick@1.3.0: + dependencies: + isobject: 3.0.1 + + ofetch@1.4.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.1 + + ofetch@1.5.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.1 + + ohash@2.0.11: {} + + open@10.2.0: + dependencies: + default-browser: 5.4.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + package-json-from-dist@1.0.1: {} + + package-manager-detector@1.6.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-ms@4.0.0: {} + + pascalcase@0.1.1: {} + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-scurry@2.0.1: + dependencies: + lru-cache: 11.2.4 + minipass: 7.1.2 + + pathe@0.2.0: {} + + pathe@2.0.3: {} + + perfect-debounce@1.0.0: {} + + perfect-debounce@2.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pinia@3.0.4(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3)): + dependencies: + '@vue/devtools-api': 7.7.9 + vue: 3.5.26(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.8 + pathe: 2.0.3 + + pluralize@8.0.0: {} + + posix-character-classes@0.1.1: {} + + possible-typed-array-names@1.1.0: {} + + postcss-modules-extract-imports@3.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-modules-local-by-default@4.2.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 + + postcss-modules-values@4.0.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + + postcss-prefix-selector@1.16.1(postcss@5.2.18): + dependencies: + postcss: 5.2.18 + + postcss-scss@4.0.9(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-selector-parser@7.1.1: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@5.2.18: + dependencies: + chalk: 1.1.3 + js-base64: 2.6.4 + source-map: 0.5.7 + supports-color: 3.2.3 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + posthtml-parser@0.2.1: + dependencies: + htmlparser2: 3.10.1 + isobject: 2.1.0 + + posthtml-rename-id@1.0.12: + dependencies: + escape-string-regexp: 1.0.5 + + posthtml-render@1.4.0: {} + + posthtml-svg-mode@1.0.3: + dependencies: + merge-options: 1.0.1 + posthtml: 0.9.2 + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + + posthtml@0.9.2: + dependencies: + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier-plugin-json-sort@0.0.2(prettier@3.7.4): + dependencies: + prettier: 3.7.4 + + prettier@3.3.3: {} + + prettier@3.7.4: {} + + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + + progress@2.0.3: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + proxy-from-env@1.1.0: {} + + punycode@2.3.1: {} + + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + quansync@0.2.11: {} + + quansync@1.0.0: {} + + query-string@4.3.4: + dependencies: + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + + queue-microtask@1.2.3: {} + + rate-limiter-flexible@5.0.5: {} + + rc9@2.1.2: + dependencies: + defu: 6.1.4 + destr: 2.0.5 + + rd@2.0.1: + dependencies: + '@types/node': 10.17.60 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readdirp@4.1.2: {} + + readdirp@5.0.0: {} + + recast@0.23.9: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regex-not@1.0.2: + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + + regexp-tree@0.1.27: {} + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + regjsparser@0.13.0: + dependencies: + jsesc: 3.1.0 + + repeat-element@1.1.4: {} + + repeat-string@1.6.1: {} + + require-directory@2.1.1: {} + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve-url@0.2.1: {} + + ret@0.1.15: {} + + reusify@1.1.0: {} + + rfdc@1.4.1: {} + + rimraf@6.1.2: + dependencies: + glob: 13.0.0 + package-json-from-dist: 1.0.1 + + rollup@4.54.0: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.54.0 + '@rollup/rollup-android-arm64': 4.54.0 + '@rollup/rollup-darwin-arm64': 4.54.0 + '@rollup/rollup-darwin-x64': 4.54.0 + '@rollup/rollup-freebsd-arm64': 4.54.0 + '@rollup/rollup-freebsd-x64': 4.54.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.54.0 + '@rollup/rollup-linux-arm-musleabihf': 4.54.0 + '@rollup/rollup-linux-arm64-gnu': 4.54.0 + '@rollup/rollup-linux-arm64-musl': 4.54.0 + '@rollup/rollup-linux-loong64-gnu': 4.54.0 + '@rollup/rollup-linux-ppc64-gnu': 4.54.0 + '@rollup/rollup-linux-riscv64-gnu': 4.54.0 + '@rollup/rollup-linux-riscv64-musl': 4.54.0 + '@rollup/rollup-linux-s390x-gnu': 4.54.0 + '@rollup/rollup-linux-x64-gnu': 4.54.0 + '@rollup/rollup-linux-x64-musl': 4.54.0 + '@rollup/rollup-openharmony-arm64': 4.54.0 + '@rollup/rollup-win32-arm64-msvc': 4.54.0 + '@rollup/rollup-win32-ia32-msvc': 4.54.0 + '@rollup/rollup-win32-x64-gnu': 4.54.0 + '@rollup/rollup-win32-x64-msvc': 4.54.0 + fsevents: 2.3.3 + + run-applescript@7.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safe-regex@1.1.0: + dependencies: + ret: 0.1.15 + + sass@1.97.1: + dependencies: + chokidar: 4.0.3 + immutable: 5.1.4 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.1 + + seemly@0.3.10: {} + + select@1.1.2: {} + + semver@6.3.1: {} + + semver@7.7.2: {} + + semver@7.7.3: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + set-value@2.0.1: + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@4.1.0: {} + + simple-git-hooks@2.13.1: {} + + simplebar-core@1.3.2: + dependencies: + lodash: 4.17.21 + lodash-es: 4.17.22 + + simplebar-vue@2.4.2(vue@3.5.26(typescript@5.9.3)): + dependencies: + simplebar-core: 1.3.2 + vue: 3.5.26(typescript@5.9.3) + vue-demi: 0.13.11(vue@3.5.26(typescript@5.9.3)) + transitivePeerDependencies: + - '@vue/composition-api' + + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + + sisteransi@1.0.5: {} + + snapdragon-node@2.1.1: + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + + snapdragon-util@3.0.1: + dependencies: + kind-of: 3.2.2 + + snapdragon@0.8.2: + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + + source-map-js@1.2.1: {} + + source-map-resolve@0.5.3: + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + + source-map-url@0.4.1: {} + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + speakingurl@14.0.1: {} + + split-string@3.1.0: + dependencies: + extend-shallow: 3.0.2 + + stable-hash-x@0.2.0: {} + + stable@0.1.8: {} + + static-extend@0.1.2: + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + strict-uri-encode@1.1.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@3.0.1: + dependencies: + ansi-regex: 2.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strip-final-newline@4.0.0: {} + + strip-indent@4.1.1: {} + + strip-json-comments@3.1.1: {} + + superjson@2.2.6: + dependencies: + copy-anything: 4.0.5 + + supports-color@2.0.0: {} + + supports-color@3.2.3: + dependencies: + has-flag: 1.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + svelte-eslint-parser@1.4.1: + dependencies: + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + postcss: 8.5.6 + postcss-scss: 4.0.9(postcss@8.5.6) + postcss-selector-parser: 7.1.1 + + svg-baker@1.7.0: + dependencies: + bluebird: 3.7.2 + clone: 2.1.2 + he: 1.2.0 + image-size: 0.5.5 + loader-utils: 1.4.2 + merge-options: 1.0.1 + micromatch: 3.1.0 + postcss: 5.2.18 + postcss-prefix-selector: 1.16.1(postcss@5.2.18) + posthtml-rename-id: 1.0.12 + posthtml-svg-mode: 1.0.3 + query-string: 4.3.4 + traverse: 0.6.11 + transitivePeerDependencies: + - supports-color + + svgo@2.8.0: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.1.1 + stable: 0.1.8 + + synckit@0.11.11: + dependencies: + '@pkgr/core': 0.2.9 + + tailwind-merge@3.4.0: {} + + tapable@2.3.0: {} + + tiny-emitter@2.1.0: {} + + tiny-invariant@1.3.3: {} + + tinyexec@1.0.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + to-object-path@0.3.0: + dependencies: + kind-of: 3.2.2 + + to-regex-range@2.1.1: + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + to-regex@3.0.2: + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + + totalist@3.0.1: {} + + traverse@0.6.11: + dependencies: + gopd: 1.2.0 + typedarray.prototype.slice: 1.0.5 + which-typed-array: 1.1.19 + + treemate@0.3.11: {} + + ts-api-utils@2.1.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + ts-declaration-location@1.0.7(typescript@5.9.3): + dependencies: + picomatch: 4.0.3 + typescript: 5.9.3 + + tslib@2.3.0: {} + + tslib@2.8.1: {} + + tsx@4.21.0: + dependencies: + esbuild: 0.27.2 + get-tsconfig: 4.13.0 + optionalDependencies: + fsevents: 2.3.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typed-css-modules@0.9.1: + dependencies: + camelcase: 6.3.0 + chalk: 4.1.2 + chokidar: 3.6.0 + glob: 10.5.0 + icss-replace-symbols: 1.1.0 + is-there: 4.5.2 + mkdirp: 3.0.1 + postcss: 8.5.6 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) + postcss-modules-scope: 3.2.1(postcss@8.5.6) + postcss-modules-values: 4.0.0(postcss@8.5.6) + yargs: 17.7.2 + + typedarray.prototype.slice@1.0.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + math-intrinsics: 1.1.0 + typed-array-buffer: 1.0.3 + typed-array-byte-offset: 1.0.4 + + typescript@5.9.3: {} + + ufo@1.6.1: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + unconfig-core@7.4.2: + dependencies: + '@quansync/fs': 1.0.0 + quansync: 1.0.0 + + unconfig@7.4.2: + dependencies: + '@quansync/fs': 1.0.0 + defu: 6.1.4 + jiti: 2.6.1 + quansync: 1.0.0 + unconfig-core: 7.4.2 + + undici-types@7.16.0: {} + + unicorn-magic@0.3.0: {} + + union-value@1.0.1: + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + + universalify@2.0.1: {} + + unplugin-icons@22.5.0(@vue/compiler-sfc@3.5.26): + dependencies: + '@antfu/install-pkg': 1.1.0 + '@iconify/utils': 3.1.0 + debug: 4.4.3 + local-pkg: 1.1.2 + unplugin: 2.3.11 + optionalDependencies: + '@vue/compiler-sfc': 3.5.26 + transitivePeerDependencies: + - supports-color + + unplugin-utils@0.3.1: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.3 + + unplugin-vue-components@30.0.0(@babel/parser@7.28.5)(vue@3.5.26(typescript@5.9.3)): + dependencies: + chokidar: 4.0.3 + debug: 4.4.3 + local-pkg: 1.1.2 + magic-string: 0.30.21 + mlly: 1.8.0 + tinyglobby: 0.2.15 + unplugin: 2.3.11 + unplugin-utils: 0.3.1 + vue: 3.5.26(typescript@5.9.3) + optionalDependencies: + '@babel/parser': 7.28.5 + transitivePeerDependencies: + - supports-color + + unplugin@1.12.0: + dependencies: + acorn: 8.15.0 + chokidar: 3.6.0 + webpack-sources: 3.3.3 + webpack-virtual-modules: 0.6.2 + + unplugin@2.3.11: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.15.0 + picomatch: 4.0.3 + webpack-virtual-modules: 0.6.2 + + unrs-resolver@1.11.1: + dependencies: + napi-postinstall: 0.3.4 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 + '@unrs/resolver-binding-android-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-x64': 1.11.1 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 + + unset-value@1.0.0: + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + + update-browserslist-db@1.2.3(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + urix@0.1.0: {} + + use@3.1.1: {} + + util-deprecate@1.0.2: {} + + vary@1.1.2: {} + + vdirs@0.1.8(vue@3.5.26(typescript@5.9.3)): + dependencies: + evtd: 0.2.4 + vue: 3.5.26(typescript@5.9.3) + + vite-dev-rpc@1.1.0(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)): + dependencies: + birpc: 2.9.0 + vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite-hot-client: 2.1.0(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + + vite-hot-client@2.1.0(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)): + dependencies: + vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + + vite-plugin-inspect@11.3.3(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)): + dependencies: + ansis: 4.2.0 + debug: 4.4.3 + error-stack-parser-es: 1.0.5 + ohash: 2.0.11 + open: 10.2.0 + perfect-debounce: 2.0.0 + sirv: 3.0.2 + unplugin-utils: 0.3.1 + vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite-dev-rpc: 1.1.0(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + transitivePeerDependencies: + - supports-color + + vite-plugin-progress@0.0.7(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)): + dependencies: + picocolors: 1.1.1 + progress: 2.0.3 + rd: 2.0.1 + vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + + vite-plugin-svg-icons@2.0.1(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)): + dependencies: + '@types/svgo': 2.6.4 + cors: 2.8.5 + debug: 4.4.3 + etag: 1.8.1 + fs-extra: 10.1.0 + pathe: 0.2.0 + svg-baker: 1.7.0 + svgo: 2.8.0 + vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + transitivePeerDependencies: + - supports-color + + vite-plugin-vue-devtools@8.0.5(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)): + dependencies: + '@vue/devtools-core': 8.0.5(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)) + '@vue/devtools-kit': 8.0.5 + '@vue/devtools-shared': 8.0.5 + sirv: 3.0.2 + vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite-plugin-inspect: 11.3.3(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + vite-plugin-vue-inspector: 5.3.2(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + transitivePeerDependencies: + - '@nuxt/kit' + - supports-color + - vue + + vite-plugin-vue-inspector@5.3.2(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)): + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.5) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) + '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.5) + '@vue/compiler-dom': 3.5.26 + kolorist: 1.8.0 + magic-string: 0.30.21 + vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + transitivePeerDependencies: + - supports-color + + vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2): + dependencies: + esbuild: 0.27.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.54.0 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.0.3 + fsevents: 2.3.3 + jiti: 2.6.1 + sass: 1.97.1 + tsx: 4.21.0 + yaml: 2.8.2 + + vooks@0.2.12(vue@3.5.26(typescript@5.9.3)): + dependencies: + evtd: 0.2.4 + vue: 3.5.26(typescript@5.9.3) + + vscode-uri@3.1.0: {} + + vue-demi@0.13.11(vue@3.5.26(typescript@5.9.3)): + dependencies: + vue: 3.5.26(typescript@5.9.3) + + vue-draggable-plus@0.6.0(@types/sortablejs@1.15.9): + dependencies: + '@types/sortablejs': 1.15.9 + + vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1)): + dependencies: + debug: 4.4.3 + eslint: 9.39.2(jiti@2.6.1) + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + + vue-flow-layout@0.2.0: {} + + vue-i18n@11.2.7(vue@3.5.26(typescript@5.9.3)): + dependencies: + '@intlify/core-base': 11.2.7 + '@intlify/shared': 11.2.7 + '@vue/devtools-api': 6.6.4 + vue: 3.5.26(typescript@5.9.3) + + vue-router@4.6.4(vue@3.5.26(typescript@5.9.3)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.26(typescript@5.9.3) + + vue-tsc@3.2.1(typescript@5.9.3): + dependencies: + '@volar/typescript': 2.4.27 + '@vue/language-core': 3.2.1 + typescript: 5.9.3 + + vue@3.5.26(typescript@5.9.3): + dependencies: + '@vue/compiler-dom': 3.5.26 + '@vue/compiler-sfc': 3.5.26 + '@vue/runtime-dom': 3.5.26 + '@vue/server-renderer': 3.5.26(vue@3.5.26(typescript@5.9.3)) + '@vue/shared': 3.5.26 + optionalDependencies: + typescript: 5.9.3 + + vueuc@0.4.65(vue@3.5.26(typescript@5.9.3)): + dependencies: + '@css-render/vue3-ssr': 0.15.14(vue@3.5.26(typescript@5.9.3)) + '@juggle/resize-observer': 3.4.0 + css-render: 0.15.14 + evtd: 0.2.4 + seemly: 0.3.10 + vdirs: 0.1.8(vue@3.5.26(typescript@5.9.3)) + vooks: 0.2.12(vue@3.5.26(typescript@5.9.3)) + vue: 3.5.26(typescript@5.9.3) + + webpack-sources@3.3.3: {} + + webpack-virtual-modules@0.6.2: {} + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.0 + + xml-name-validator@4.0.0: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yaml@2.8.2: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + yoctocolors@2.1.2: {} + + zrender@6.0.0: + dependencies: + tslib: 2.3.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..dee51e9 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - "packages/*" diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..169b2ab --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1 @@ + diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..9758e4c --- /dev/null +++ b/src/App.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/src/assets/imgs/soybean.jpg b/src/assets/imgs/soybean.jpg new file mode 100644 index 0000000..75457d5 Binary files /dev/null and b/src/assets/imgs/soybean.jpg differ diff --git a/src/assets/svg-icon/activity.svg b/src/assets/svg-icon/activity.svg new file mode 100644 index 0000000..abe892f --- /dev/null +++ b/src/assets/svg-icon/activity.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/at-sign.svg b/src/assets/svg-icon/at-sign.svg new file mode 100644 index 0000000..625214d --- /dev/null +++ b/src/assets/svg-icon/at-sign.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/avatar.svg b/src/assets/svg-icon/avatar.svg new file mode 100644 index 0000000..66fe6f2 --- /dev/null +++ b/src/assets/svg-icon/avatar.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/banner.svg b/src/assets/svg-icon/banner.svg new file mode 100644 index 0000000..192b637 --- /dev/null +++ b/src/assets/svg-icon/banner.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/cast.svg b/src/assets/svg-icon/cast.svg new file mode 100644 index 0000000..4f008d3 --- /dev/null +++ b/src/assets/svg-icon/cast.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/chrome.svg b/src/assets/svg-icon/chrome.svg new file mode 100644 index 0000000..6314173 --- /dev/null +++ b/src/assets/svg-icon/chrome.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/copy.svg b/src/assets/svg-icon/copy.svg new file mode 100644 index 0000000..ab25601 --- /dev/null +++ b/src/assets/svg-icon/copy.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/custom-icon.svg b/src/assets/svg-icon/custom-icon.svg new file mode 100644 index 0000000..b33a43f --- /dev/null +++ b/src/assets/svg-icon/custom-icon.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/empty-data.svg b/src/assets/svg-icon/empty-data.svg new file mode 100644 index 0000000..293486c --- /dev/null +++ b/src/assets/svg-icon/empty-data.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/expectation.svg b/src/assets/svg-icon/expectation.svg new file mode 100644 index 0000000..1d87d5e --- /dev/null +++ b/src/assets/svg-icon/expectation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/heart.svg b/src/assets/svg-icon/heart.svg new file mode 100644 index 0000000..56e59b4 --- /dev/null +++ b/src/assets/svg-icon/heart.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/logo.svg b/src/assets/svg-icon/logo.svg new file mode 100644 index 0000000..341675d --- /dev/null +++ b/src/assets/svg-icon/logo.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/network-error.svg b/src/assets/svg-icon/network-error.svg new file mode 100644 index 0000000..52f97ab --- /dev/null +++ b/src/assets/svg-icon/network-error.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/no-icon.svg b/src/assets/svg-icon/no-icon.svg new file mode 100644 index 0000000..f6dcdd0 --- /dev/null +++ b/src/assets/svg-icon/no-icon.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/no-permission.svg b/src/assets/svg-icon/no-permission.svg new file mode 100644 index 0000000..4c408ca --- /dev/null +++ b/src/assets/svg-icon/no-permission.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/not-found.svg b/src/assets/svg-icon/not-found.svg new file mode 100644 index 0000000..a513656 --- /dev/null +++ b/src/assets/svg-icon/not-found.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/service-error.svg b/src/assets/svg-icon/service-error.svg new file mode 100644 index 0000000..0120f1e --- /dev/null +++ b/src/assets/svg-icon/service-error.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/wind.svg b/src/assets/svg-icon/wind.svg new file mode 100644 index 0000000..7c90590 --- /dev/null +++ b/src/assets/svg-icon/wind.svg @@ -0,0 +1 @@ + diff --git a/src/components/advanced/table-column-setting.vue b/src/components/advanced/table-column-setting.vue new file mode 100644 index 0000000..10bd35a --- /dev/null +++ b/src/components/advanced/table-column-setting.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/src/components/advanced/table-header-operation.vue b/src/components/advanced/table-header-operation.vue new file mode 100644 index 0000000..7ca287f --- /dev/null +++ b/src/components/advanced/table-header-operation.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/src/components/common/app-provider.vue b/src/components/common/app-provider.vue new file mode 100644 index 0000000..36a361a --- /dev/null +++ b/src/components/common/app-provider.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/src/components/common/dark-mode-container.vue b/src/components/common/dark-mode-container.vue new file mode 100644 index 0000000..71f2733 --- /dev/null +++ b/src/components/common/dark-mode-container.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/src/components/common/exception-base.vue b/src/components/common/exception-base.vue new file mode 100644 index 0000000..418e965 --- /dev/null +++ b/src/components/common/exception-base.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/src/components/common/full-screen.vue b/src/components/common/full-screen.vue new file mode 100644 index 0000000..41c1c56 --- /dev/null +++ b/src/components/common/full-screen.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/src/components/common/icon-tooltip.vue b/src/components/common/icon-tooltip.vue new file mode 100644 index 0000000..d98db32 --- /dev/null +++ b/src/components/common/icon-tooltip.vue @@ -0,0 +1,42 @@ + + + diff --git a/src/components/common/lang-switch.vue b/src/components/common/lang-switch.vue new file mode 100644 index 0000000..bd9d2ec --- /dev/null +++ b/src/components/common/lang-switch.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/src/components/common/menu-toggler.vue b/src/components/common/menu-toggler.vue new file mode 100644 index 0000000..31cb1b9 --- /dev/null +++ b/src/components/common/menu-toggler.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/src/components/common/pin-toggler.vue b/src/components/common/pin-toggler.vue new file mode 100644 index 0000000..aecc92d --- /dev/null +++ b/src/components/common/pin-toggler.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/components/common/reload-button.vue b/src/components/common/reload-button.vue new file mode 100644 index 0000000..2881d03 --- /dev/null +++ b/src/components/common/reload-button.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/src/components/common/system-logo.vue b/src/components/common/system-logo.vue new file mode 100644 index 0000000..7f23cc1 --- /dev/null +++ b/src/components/common/system-logo.vue @@ -0,0 +1,9 @@ + + + + + diff --git a/src/components/common/theme-schema-switch.vue b/src/components/common/theme-schema-switch.vue new file mode 100644 index 0000000..78050d4 --- /dev/null +++ b/src/components/common/theme-schema-switch.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/src/components/custom/better-scroll.vue b/src/components/custom/better-scroll.vue new file mode 100644 index 0000000..7d2559c --- /dev/null +++ b/src/components/custom/better-scroll.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/src/components/custom/button-icon.vue b/src/components/custom/button-icon.vue new file mode 100644 index 0000000..153953a --- /dev/null +++ b/src/components/custom/button-icon.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/src/components/custom/count-to.vue b/src/components/custom/count-to.vue new file mode 100644 index 0000000..910b4cc --- /dev/null +++ b/src/components/custom/count-to.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/src/components/custom/look-forward.vue b/src/components/custom/look-forward.vue new file mode 100644 index 0000000..d0494f9 --- /dev/null +++ b/src/components/custom/look-forward.vue @@ -0,0 +1,20 @@ + + + + + diff --git a/src/components/custom/soybean-avatar.vue b/src/components/custom/soybean-avatar.vue new file mode 100644 index 0000000..8d3278a --- /dev/null +++ b/src/components/custom/soybean-avatar.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/src/components/custom/svg-icon.vue b/src/components/custom/svg-icon.vue new file mode 100644 index 0000000..504763e --- /dev/null +++ b/src/components/custom/svg-icon.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/src/components/custom/wave-bg.vue b/src/components/custom/wave-bg.vue new file mode 100644 index 0000000..1d63f2e --- /dev/null +++ b/src/components/custom/wave-bg.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/src/constants/app.ts b/src/constants/app.ts new file mode 100644 index 0000000..b8aafc4 --- /dev/null +++ b/src/constants/app.ts @@ -0,0 +1,71 @@ +import { transformRecordToOption } from '@/utils/common'; + +export const GLOBAL_HEADER_MENU_ID = '__GLOBAL_HEADER_MENU__'; + +export const GLOBAL_SIDER_MENU_ID = '__GLOBAL_SIDER_MENU__'; + +export const themeSchemaRecord: Record = { + light: 'theme.appearance.themeSchema.light', + dark: 'theme.appearance.themeSchema.dark', + auto: 'theme.appearance.themeSchema.auto' +}; + +export const themeSchemaOptions = transformRecordToOption(themeSchemaRecord); + +export const loginModuleRecord: Record = { + 'pwd-login': 'page.login.pwdLogin.title', + 'code-login': 'page.login.codeLogin.title', + register: 'page.login.register.title', + 'reset-pwd': 'page.login.resetPwd.title', + 'bind-wechat': 'page.login.bindWeChat.title' +}; + +export const themeLayoutModeRecord: Record = { + vertical: 'theme.layout.layoutMode.vertical', + 'vertical-mix': 'theme.layout.layoutMode.vertical-mix', + 'vertical-hybrid-header-first': 'theme.layout.layoutMode.vertical-hybrid-header-first', + horizontal: 'theme.layout.layoutMode.horizontal', + 'top-hybrid-sidebar-first': 'theme.layout.layoutMode.top-hybrid-sidebar-first', + 'top-hybrid-header-first': 'theme.layout.layoutMode.top-hybrid-header-first' +}; + +export const themeLayoutModeOptions = transformRecordToOption(themeLayoutModeRecord); + +export const themeScrollModeRecord: Record = { + wrapper: 'theme.layout.content.scrollMode.wrapper', + content: 'theme.layout.content.scrollMode.content' +}; + +export const themeScrollModeOptions = transformRecordToOption(themeScrollModeRecord); + +export const themeTabModeRecord: Record = { + chrome: 'theme.layout.tab.mode.chrome', + button: 'theme.layout.tab.mode.button', + slider: 'theme.layout.tab.mode.slider' +}; + +export const themeTabModeOptions = transformRecordToOption(themeTabModeRecord); + +export const themePageAnimationModeRecord: Record = { + 'fade-slide': 'theme.layout.content.page.mode.fade-slide', + fade: 'theme.layout.content.page.mode.fade', + 'fade-bottom': 'theme.layout.content.page.mode.fade-bottom', + 'fade-scale': 'theme.layout.content.page.mode.fade-scale', + 'zoom-fade': 'theme.layout.content.page.mode.zoom-fade', + 'zoom-out': 'theme.layout.content.page.mode.zoom-out', + none: 'theme.layout.content.page.mode.none' +}; + +export const themePageAnimationModeOptions = transformRecordToOption(themePageAnimationModeRecord); + +export const DARK_CLASS = 'dark'; + +export const watermarkTimeFormatOptions = [ + { label: 'YYYY-MM-DD HH:mm', value: 'YYYY-MM-DD HH:mm' }, + { label: 'YYYY-MM-DD HH:mm:ss', value: 'YYYY-MM-DD HH:mm:ss' }, + { label: 'YYYY/MM/DD HH:mm', value: 'YYYY/MM/DD HH:mm' }, + { label: 'YYYY/MM/DD HH:mm:ss', value: 'YYYY/MM/DD HH:mm:ss' }, + { label: 'HH:mm', value: 'HH:mm' }, + { label: 'HH:mm:ss', value: 'HH:mm:ss' }, + { label: 'MM-DD HH:mm', value: 'MM-DD HH:mm' } +]; diff --git a/src/constants/common.ts b/src/constants/common.ts new file mode 100644 index 0000000..2d5e05e --- /dev/null +++ b/src/constants/common.ts @@ -0,0 +1,8 @@ +import { transformRecordToOption } from '@/utils/common'; + +export const yesOrNoRecord: Record = { + Y: 'common.yesOrNo.yes', + N: 'common.yesOrNo.no' +}; + +export const yesOrNoOptions = transformRecordToOption(yesOrNoRecord); diff --git a/src/constants/reg.ts b/src/constants/reg.ts new file mode 100644 index 0000000..8805ca8 --- /dev/null +++ b/src/constants/reg.ts @@ -0,0 +1,25 @@ +export const REG_USER_NAME = /^[\u4E00-\u9FA5a-zA-Z0-9_-]{4,16}$/; + +/** Phone reg */ +export const REG_PHONE = + /^[1](([3][0-9])|([4][01456789])|([5][012356789])|([6][2567])|([7][0-8])|([8][0-9])|([9][012356789]))[0-9]{8}$/; + +/** + * Password reg + * + * 6-18 characters, including letters, numbers, and underscores + */ +export const REG_PWD = /^\w{6,18}$/; + +/** Email reg */ +export const REG_EMAIL = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/; + +/** Six digit code reg */ +export const REG_CODE_SIX = /^\d{6}$/; + +/** Four digit code reg */ +export const REG_CODE_FOUR = /^\d{4}$/; + +/** Url reg */ +export const REG_URL = + /(((^https?:(?:\/\/)?)(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[+~%/.\w-_]*)?\??(?:[-+=&;%@.\w_]*)#?(?:[\w]*))?)$/; diff --git a/src/enum/index.ts b/src/enum/index.ts new file mode 100644 index 0000000..2739b3a --- /dev/null +++ b/src/enum/index.ts @@ -0,0 +1,7 @@ +export enum SetupStoreId { + App = 'app-store', + Theme = 'theme-store', + Auth = 'auth-store', + Route = 'route-store', + Tab = 'tab-store' +} diff --git a/src/hooks/business/auth.ts b/src/hooks/business/auth.ts new file mode 100644 index 0000000..f8fc749 --- /dev/null +++ b/src/hooks/business/auth.ts @@ -0,0 +1,21 @@ +import { useAuthStore } from '@/store/modules/auth'; + +export function useAuth() { + const authStore = useAuthStore(); + + function hasAuth(codes: string | string[]) { + if (!authStore.isLogin) { + return false; + } + + if (typeof codes === 'string') { + return authStore.userInfo.buttons.includes(codes); + } + + return codes.some(code => authStore.userInfo.buttons.includes(code)); + } + + return { + hasAuth + }; +} diff --git a/src/hooks/business/captcha.ts b/src/hooks/business/captcha.ts new file mode 100644 index 0000000..98124d9 --- /dev/null +++ b/src/hooks/business/captcha.ts @@ -0,0 +1,71 @@ +import { computed } from 'vue'; +import { useCountDown, useLoading } from '@sa/hooks'; +import { REG_PHONE } from '@/constants/reg'; +import { $t } from '@/locales'; + +export function useCaptcha() { + const { loading, startLoading, endLoading } = useLoading(); + const { count, start, stop, isCounting } = useCountDown(10); + + const label = computed(() => { + let text = $t('page.login.codeLogin.getCode'); + + const countingLabel = $t('page.login.codeLogin.reGetCode', { time: count.value }); + + if (loading.value) { + text = ''; + } + + if (isCounting.value) { + text = countingLabel; + } + + return text; + }); + + function isPhoneValid(phone: string) { + if (phone.trim() === '') { + window.$message?.error?.($t('form.phone.required')); + + return false; + } + + if (!REG_PHONE.test(phone)) { + window.$message?.error?.($t('form.phone.invalid')); + + return false; + } + + return true; + } + + async function getCaptcha(phone: string) { + const valid = isPhoneValid(phone); + + if (!valid || loading.value) { + return; + } + + startLoading(); + + // request + await new Promise(resolve => { + setTimeout(resolve, 500); + }); + + window.$message?.success?.($t('page.login.codeLogin.sendCodeSuccess')); + + start(); + + endLoading(); + } + + return { + label, + start, + stop, + isCounting, + loading, + getCaptcha + }; +} diff --git a/src/hooks/common/echarts.ts b/src/hooks/common/echarts.ts new file mode 100644 index 0000000..8e7c728 --- /dev/null +++ b/src/hooks/common/echarts.ts @@ -0,0 +1,230 @@ +import { computed, effectScope, nextTick, onScopeDispose, shallowRef, watch } from 'vue'; +import { useElementSize } from '@vueuse/core'; +import * as echarts from 'echarts/core'; +import { BarChart, GaugeChart, LineChart, PictorialBarChart, PieChart, RadarChart, ScatterChart } from 'echarts/charts'; +import type { + BarSeriesOption, + GaugeSeriesOption, + LineSeriesOption, + PictorialBarSeriesOption, + PieSeriesOption, + RadarSeriesOption, + ScatterSeriesOption +} from 'echarts/charts'; +import { + DatasetComponent, + GridComponent, + LegendComponent, + TitleComponent, + ToolboxComponent, + TooltipComponent, + TransformComponent +} from 'echarts/components'; +import type { + DatasetComponentOption, + GridComponentOption, + LegendComponentOption, + TitleComponentOption, + ToolboxComponentOption, + TooltipComponentOption +} from 'echarts/components'; +import { LabelLayout, UniversalTransition } from 'echarts/features'; +import { CanvasRenderer } from 'echarts/renderers'; +import { useThemeStore } from '@/store/modules/theme'; + +export type ECOption = echarts.ComposeOption< + | BarSeriesOption + | LineSeriesOption + | PieSeriesOption + | ScatterSeriesOption + | PictorialBarSeriesOption + | RadarSeriesOption + | GaugeSeriesOption + | TitleComponentOption + | LegendComponentOption + | TooltipComponentOption + | GridComponentOption + | ToolboxComponentOption + | DatasetComponentOption +>; + +echarts.use([ + TitleComponent, + LegendComponent, + TooltipComponent, + GridComponent, + DatasetComponent, + TransformComponent, + ToolboxComponent, + BarChart, + LineChart, + PieChart, + ScatterChart, + PictorialBarChart, + RadarChart, + GaugeChart, + LabelLayout, + UniversalTransition, + CanvasRenderer +]); + +interface ChartHooks { + onRender?: (chart: echarts.ECharts) => void | Promise; + onUpdated?: (chart: echarts.ECharts) => void | Promise; + onDestroy?: (chart: echarts.ECharts) => void | Promise; +} + +/** + * use echarts + * + * @param optionsFactory echarts options factory function + * @param darkMode dark mode + */ +export function useEcharts(optionsFactory: () => T, hooks: ChartHooks = {}) { + const scope = effectScope(); + + const themeStore = useThemeStore(); + const darkMode = computed(() => themeStore.darkMode); + + const domRef = shallowRef(null); + const initialSize = { width: 0, height: 0 }; + const { width, height } = useElementSize(domRef, initialSize); + + const chart = shallowRef(null); + const chartOptions: T = optionsFactory(); + + const { + onRender = instance => { + const textColor = darkMode.value ? 'rgb(224, 224, 224)' : 'rgb(31, 31, 31)'; + const maskColor = darkMode.value ? 'rgba(0, 0, 0, 0.4)' : 'rgba(255, 255, 255, 0.8)'; + + instance.showLoading({ + color: themeStore.themeColor, + textColor, + fontSize: 14, + maskColor + }); + }, + onUpdated = instance => { + instance.hideLoading(); + }, + onDestroy + } = hooks; + + /** is chart rendered */ + function isRendered() { + return Boolean(domRef.value && chart.value); + } + + /** + * update chart options + * + * @param callback callback function + */ + async function updateOptions(callback: (opts: T, optsFactory: () => T) => ECOption = () => chartOptions) { + const updatedOpts = callback(chartOptions, optionsFactory); + + Object.assign(chartOptions, updatedOpts); + + await nextTick(); + + if (!isRendered()) return; + + if (isRendered()) { + chart.value?.clear(); + } + + chart.value?.setOption({ ...updatedOpts, backgroundColor: 'transparent' }); + + await onUpdated?.(chart.value!); + } + + function setOptions(options: T) { + chart.value?.setOption(options); + } + + /** render chart */ + async function render() { + if (isRendered()) return; + + const chartTheme = darkMode.value ? 'dark' : 'light'; + + chart.value = echarts.init(domRef.value, chartTheme); + + chart.value?.setOption({ ...chartOptions, backgroundColor: 'transparent' }); + + await onRender?.(chart.value!); + } + + /** resize chart */ + function resize() { + chart.value?.resize(); + } + + /** destroy chart */ + async function destroy() { + if (!chart.value) return; + + await onDestroy?.(chart.value); + chart.value?.dispose(); + chart.value = null; + } + + /** change chart theme */ + async function changeTheme() { + await destroy(); + await render(); + await onUpdated?.(chart.value!); + } + + /** + * render chart by size + * + * @param w width + * @param h height + */ + async function renderChartBySize(w: number, h: number) { + initialSize.width = w; + initialSize.height = h; + + // resize chart + if (isRendered()) { + resize(); + + return; + } + + // render chart + await render(); + + if (chart.value) { + await onUpdated?.(chart.value); + } + } + + scope.run(() => { + watch( + [width, height], + ([newWidth, newHeight]) => { + renderChartBySize(newWidth, newHeight); + }, + { flush: 'post' } + ); + + watch(darkMode, () => { + changeTheme(); + }); + }); + + onScopeDispose(() => { + destroy(); + scope.stop(); + }); + + return { + domRef, + chart, + updateOptions, + setOptions + }; +} diff --git a/src/hooks/common/form.ts b/src/hooks/common/form.ts new file mode 100644 index 0000000..526a9a0 --- /dev/null +++ b/src/hooks/common/form.ts @@ -0,0 +1,97 @@ +import { ref, toValue } from 'vue'; +import type { ComputedRef, Ref } from 'vue'; +import type { FormInst } from 'naive-ui'; +import { REG_CODE_SIX, REG_EMAIL, REG_PHONE, REG_PWD, REG_USER_NAME } from '@/constants/reg'; +import { $t } from '@/locales'; + +export function useFormRules() { + const patternRules = { + userName: { + pattern: REG_USER_NAME, + message: $t('form.userName.invalid'), + trigger: 'change' + }, + phone: { + pattern: REG_PHONE, + message: $t('form.phone.invalid'), + trigger: 'change' + }, + pwd: { + pattern: REG_PWD, + message: $t('form.pwd.invalid'), + trigger: 'change' + }, + code: { + pattern: REG_CODE_SIX, + message: $t('form.code.invalid'), + trigger: 'change' + }, + email: { + pattern: REG_EMAIL, + message: $t('form.email.invalid'), + trigger: 'change' + } + } satisfies Record; + + const formRules = { + userName: [createRequiredRule($t('form.userName.required'))], + phone: [createRequiredRule($t('form.phone.required')), patternRules.phone], + pwd: [createRequiredRule($t('form.pwd.required')), patternRules.pwd], + code: [createRequiredRule($t('form.code.required')), patternRules.code], + email: [createRequiredRule($t('form.email.required')), patternRules.email] + } satisfies Record; + + /** the default required rule */ + const defaultRequiredRule = createRequiredRule($t('form.required')); + + function createRequiredRule(message: string): App.Global.FormRule { + return { + required: true, + message + }; + } + + /** create a rule for confirming the password */ + function createConfirmPwdRule(pwd: string | Ref | ComputedRef) { + const confirmPwdRule: App.Global.FormRule[] = [ + { required: true, message: $t('form.confirmPwd.required') }, + { + asyncValidator: (rule, value) => { + if (value.trim() !== '' && value !== toValue(pwd)) { + return Promise.reject(rule.message); + } + return Promise.resolve(); + }, + message: $t('form.confirmPwd.invalid'), + trigger: 'input' + } + ]; + return confirmPwdRule; + } + + return { + patternRules, + formRules, + defaultRequiredRule, + createRequiredRule, + createConfirmPwdRule + }; +} + +export function useNaiveForm() { + const formRef = ref(null); + + async function validate() { + await formRef.value?.validate(); + } + + async function restoreValidation() { + formRef.value?.restoreValidation(); + } + + return { + formRef, + validate, + restoreValidation + }; +} diff --git a/src/hooks/common/icon.ts b/src/hooks/common/icon.ts new file mode 100644 index 0000000..8998f60 --- /dev/null +++ b/src/hooks/common/icon.ts @@ -0,0 +1,10 @@ +import { useSvgIconRender } from '@sa/hooks'; +import SvgIcon from '@/components/custom/svg-icon.vue'; + +export function useSvgIcon() { + const { SvgIconVNode } = useSvgIconRender(SvgIcon); + + return { + SvgIconVNode + }; +} diff --git a/src/hooks/common/router.ts b/src/hooks/common/router.ts new file mode 100644 index 0000000..ac51dfc --- /dev/null +++ b/src/hooks/common/router.ts @@ -0,0 +1,115 @@ +import { useRouter } from 'vue-router'; +import type { RouteLocationRaw } from 'vue-router'; +import type { RouteKey } from '@elegant-router/types'; +import { router as globalRouter } from '@/router'; + +/** + * Router push + * + * Jump to the specified route, it can replace function router.push + * + * @param inSetup Whether is in vue script setup + */ +export function useRouterPush(inSetup = true) { + const router = inSetup ? useRouter() : globalRouter; + const route = globalRouter.currentRoute; + + const routerPush = router.push; + + const routerBack = router.back; + + async function routerPushByKey(key: RouteKey, options?: App.Global.RouterPushOptions) { + const { query, params } = options || {}; + + const routeLocation: RouteLocationRaw = { + name: key + }; + + if (Object.keys(query || {}).length) { + routeLocation.query = query; + } + + if (Object.keys(params || {}).length) { + routeLocation.params = params; + } + + return routerPush(routeLocation); + } + + function routerPushByKeyWithMetaQuery(key: RouteKey) { + const allRoutes = router.getRoutes(); + const meta = allRoutes.find(item => item.name === key)?.meta || null; + + const query: Record = {}; + + meta?.query?.forEach(item => { + query[item.key] = item.value; + }); + + return routerPushByKey(key, { query }); + } + + async function toHome() { + return routerPushByKey('root'); + } + + /** + * Navigate to login page + * + * @param loginModule The login module + * @param redirectUrl The redirect url, if not specified, it will be the current route fullPath + */ + async function toLogin(loginModule?: UnionKey.LoginModule, redirectUrl?: string) { + const module = loginModule || 'pwd-login'; + + const options: App.Global.RouterPushOptions = { + params: { + module + } + }; + + const redirect = redirectUrl || route.value.fullPath; + + options.query = { + redirect + }; + + return routerPushByKey('login', options); + } + + /** + * Toggle login module + * + * @param module + */ + async function toggleLoginModule(module: UnionKey.LoginModule) { + const query = route.value.query as Record; + + return routerPushByKey('login', { query, params: { module } }); + } + + /** + * Redirect from login + * + * @param [needRedirect=true] Whether to redirect after login. Default is `true` + */ + async function redirectFromLogin(needRedirect = true) { + const redirect = route.value.query?.redirect as string; + + if (needRedirect && redirect) { + await routerPush(redirect); + } else { + await toHome(); + } + } + + return { + routerPush, + routerBack, + routerPushByKey, + routerPushByKeyWithMetaQuery, + toLogin, + toggleLoginModule, + redirectFromLogin + }; +} diff --git a/src/hooks/common/table.ts b/src/hooks/common/table.ts new file mode 100644 index 0000000..9917413 --- /dev/null +++ b/src/hooks/common/table.ts @@ -0,0 +1,311 @@ +import { computed, effectScope, onScopeDispose, reactive, shallowRef, watch } from 'vue'; +import type { Ref } from 'vue'; +import type { PaginationProps } from 'naive-ui'; +import { useBoolean, useTable } from '@sa/hooks'; +import type { PaginationData, TableColumnCheck, UseTableOptions } from '@sa/hooks'; +import type { FlatResponseData } from '@sa/axios'; +import { jsonClone } from '@sa/utils'; +import { useAppStore } from '@/store/modules/app'; +import { $t } from '@/locales'; + +export type UseNaiveTableOptions = Omit< + UseTableOptions, Pagination>, + 'pagination' | 'getColumnChecks' | 'getColumns' +> & { + /** + * get column visible + * + * @param column + * + * @default true + * + * @returns true if the column is visible, false otherwise + */ + getColumnVisible?: (column: NaiveUI.TableColumn) => boolean; +}; + +const SELECTION_KEY = '__selection__'; + +const EXPAND_KEY = '__expand__'; + +export function useNaiveTable(options: UseNaiveTableOptions) { + const scope = effectScope(); + const appStore = useAppStore(); + + const result = useTable, false>({ + ...options, + getColumnChecks: cols => getColumnChecks(cols, options.getColumnVisible), + getColumns + }); + + // calculate the total width of the table this is used for horizontal scrolling + const scrollX = computed(() => { + return result.columns.value.reduce((acc, column) => { + return acc + Number(column.width ?? column.minWidth ?? 120); + }, 0); + }); + + scope.run(() => { + watch( + () => appStore.locale, + () => { + result.reloadColumns(); + } + ); + }); + + onScopeDispose(() => { + scope.stop(); + }); + + return { + ...result, + scrollX + }; +} + +type PaginationParams = Pick; + +type UseNaivePaginatedTableOptions = UseNaiveTableOptions & { + paginationProps?: Omit; + /** + * whether to show the total count of the table + * + * @default true + */ + showTotal?: boolean; + onPaginationParamsChange?: (params: PaginationParams) => void | Promise; +}; + +export function useNaivePaginatedTable( + options: UseNaivePaginatedTableOptions +) { + const scope = effectScope(); + const appStore = useAppStore(); + + const isMobile = computed(() => appStore.isMobile); + + const showTotal = computed(() => options.showTotal ?? true); + + const pagination = reactive({ + page: 1, + pageSize: 10, + itemCount: 0, + showSizePicker: true, + pageSizes: [10, 15, 20, 25, 30], + prefix: showTotal.value ? page => $t('datatable.itemCount', { total: page.itemCount }) : undefined, + onUpdatePage(page) { + pagination.page = page; + }, + onUpdatePageSize(pageSize) { + pagination.pageSize = pageSize; + pagination.page = 1; + }, + ...options.paginationProps + }) as PaginationProps; + + // this is for mobile, if the system does not support mobile, you can use `pagination` directly + const mobilePagination = computed(() => { + const p: PaginationProps = { + ...pagination, + pageSlot: isMobile.value ? 3 : 9, + prefix: !isMobile.value && showTotal.value ? pagination.prefix : undefined + }; + + return p; + }); + + const paginationParams = computed(() => { + const { page, pageSize } = pagination; + + return { + page, + pageSize + }; + }); + + const result = useTable, true>({ + ...options, + pagination: true, + getColumnChecks: cols => getColumnChecks(cols, options.getColumnVisible), + getColumns, + onFetched: data => { + pagination.itemCount = data.total; + pagination.pageSize = data.pageSize; + } + }); + + async function getDataByPage(page: number = 1) { + if (page !== pagination.page) { + pagination.page = page; + + return; + } + + await result.getData(); + } + + scope.run(() => { + watch( + () => appStore.locale, + () => { + result.reloadColumns(); + } + ); + + watch(paginationParams, async newVal => { + await options.onPaginationParamsChange?.(newVal); + + await result.getData(); + }); + }); + + onScopeDispose(() => { + scope.stop(); + }); + + return { + ...result, + getDataByPage, + pagination, + mobilePagination + }; +} + +export function useTableOperate( + data: Ref, + idKey: keyof TableData, + getData: () => Promise +) { + const { bool: drawerVisible, setTrue: openDrawer, setFalse: closeDrawer } = useBoolean(); + + const operateType = shallowRef('add'); + + function handleAdd() { + operateType.value = 'add'; + openDrawer(); + } + + /** the editing row data */ + const editingData = shallowRef(null); + + function handleEdit(id: TableData[keyof TableData]) { + operateType.value = 'edit'; + const findItem = data.value.find(item => item[idKey] === id) || null; + editingData.value = jsonClone(findItem); + + openDrawer(); + } + + /** the checked row keys of table */ + const checkedRowKeys = shallowRef([]); + + /** the hook after the batch delete operation is completed */ + async function onBatchDeleted() { + window.$message?.success($t('common.deleteSuccess')); + + checkedRowKeys.value = []; + + await getData(); + } + + /** the hook after the delete operation is completed */ + async function onDeleted() { + window.$message?.success($t('common.deleteSuccess')); + + await getData(); + } + + return { + drawerVisible, + openDrawer, + closeDrawer, + operateType, + handleAdd, + editingData, + handleEdit, + checkedRowKeys, + onBatchDeleted, + onDeleted + }; +} + +export function defaultTransform( + response: FlatResponseData> +): PaginationData { + const { data, error } = response; + + if (!error) { + const { records, current, size, total } = data; + + return { + data: records, + pageNum: current, + pageSize: size, + total + }; + } + + return { + data: [], + pageNum: 1, + pageSize: 10, + total: 0 + }; +} + +function getColumnChecks>( + cols: Column[], + getColumnVisible?: (column: Column) => boolean +) { + const checks: TableColumnCheck[] = []; + + cols.forEach(column => { + if (isTableColumnHasKey(column)) { + checks.push({ + key: column.key as string, + title: column.title!, + checked: true, + visible: getColumnVisible?.(column) ?? true + }); + } else if (column.type === 'selection') { + checks.push({ + key: SELECTION_KEY, + title: $t('common.check'), + checked: true, + visible: getColumnVisible?.(column) ?? false + }); + } else if (column.type === 'expand') { + checks.push({ + key: EXPAND_KEY, + title: $t('common.expandColumn'), + checked: true, + visible: getColumnVisible?.(column) ?? false + }); + } + }); + + return checks; +} + +function getColumns>(cols: Column[], checks: TableColumnCheck[]) { + const columnMap = new Map(); + + cols.forEach(column => { + if (isTableColumnHasKey(column)) { + columnMap.set(column.key as string, column); + } else if (column.type === 'selection') { + columnMap.set(SELECTION_KEY, column); + } else if (column.type === 'expand') { + columnMap.set(EXPAND_KEY, column); + } + }); + + const filteredColumns = checks.filter(item => item.checked).map(check => columnMap.get(check.key) as Column); + + return filteredColumns; +} + +export function isTableColumnHasKey(column: NaiveUI.TableColumn): column is NaiveUI.TableColumnWithKey { + return Boolean((column as NaiveUI.TableColumnWithKey).key); +} diff --git a/src/layouts/base-layout/index.vue b/src/layouts/base-layout/index.vue new file mode 100644 index 0000000..c552792 --- /dev/null +++ b/src/layouts/base-layout/index.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/src/layouts/blank-layout/index.vue b/src/layouts/blank-layout/index.vue new file mode 100644 index 0000000..2e393f0 --- /dev/null +++ b/src/layouts/blank-layout/index.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/src/layouts/modules/global-breadcrumb/index.vue b/src/layouts/modules/global-breadcrumb/index.vue new file mode 100644 index 0000000..0a17907 --- /dev/null +++ b/src/layouts/modules/global-breadcrumb/index.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/src/layouts/modules/global-content/index.vue b/src/layouts/modules/global-content/index.vue new file mode 100644 index 0000000..989b6d4 --- /dev/null +++ b/src/layouts/modules/global-content/index.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/src/layouts/modules/global-footer/index.vue b/src/layouts/modules/global-footer/index.vue new file mode 100644 index 0000000..603cbaf --- /dev/null +++ b/src/layouts/modules/global-footer/index.vue @@ -0,0 +1,15 @@ + + + + + diff --git a/src/layouts/modules/global-header/components/theme-button.vue b/src/layouts/modules/global-header/components/theme-button.vue new file mode 100644 index 0000000..06c40ec --- /dev/null +++ b/src/layouts/modules/global-header/components/theme-button.vue @@ -0,0 +1,20 @@ + + + + + diff --git a/src/layouts/modules/global-header/components/user-avatar.vue b/src/layouts/modules/global-header/components/user-avatar.vue new file mode 100644 index 0000000..78f5ade --- /dev/null +++ b/src/layouts/modules/global-header/components/user-avatar.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/src/layouts/modules/global-header/index.vue b/src/layouts/modules/global-header/index.vue new file mode 100644 index 0000000..d1e680a --- /dev/null +++ b/src/layouts/modules/global-header/index.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/src/layouts/modules/global-logo/index.vue b/src/layouts/modules/global-logo/index.vue new file mode 100644 index 0000000..40ec52b --- /dev/null +++ b/src/layouts/modules/global-logo/index.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/src/layouts/modules/global-menu/components/first-level-menu.vue b/src/layouts/modules/global-menu/components/first-level-menu.vue new file mode 100644 index 0000000..d0a6fdf --- /dev/null +++ b/src/layouts/modules/global-menu/components/first-level-menu.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/src/layouts/modules/global-menu/context/index.ts b/src/layouts/modules/global-menu/context/index.ts new file mode 100644 index 0000000..48313a3 --- /dev/null +++ b/src/layouts/modules/global-menu/context/index.ts @@ -0,0 +1,184 @@ +import { computed, ref, watch } from 'vue'; +import { useRoute } from 'vue-router'; +import { useContext } from '@sa/hooks'; +import type { RouteKey } from '@elegant-router/types'; +import { useRouteStore } from '@/store/modules/route'; +import { useThemeStore } from '@/store/modules/theme'; +import { useRouterPush } from '@/hooks/common/router'; + +export const [provideMixMenuContext, useMixMenuContext] = useContext('MixMenu', useMixMenu); + +function useMixMenu() { + const route = useRoute(); + const routeStore = useRouteStore(); + const themeStore = useThemeStore(); + const { selectedKey } = useMenu(); + const { routerPushByKeyWithMetaQuery } = useRouterPush(); + + const allMenus = computed(() => routeStore.menus); + + const firstLevelMenus = computed(() => + routeStore.menus.map(menu => { + const { children: _, ...rest } = menu; + + return rest; + }) + ); + + const activeFirstLevelMenuKey = ref(''); + + function setActiveFirstLevelMenuKey(key: string) { + activeFirstLevelMenuKey.value = key; + } + + function getActiveFirstLevelMenuKey() { + const [firstLevelRouteName] = selectedKey.value.split('_'); + + setActiveFirstLevelMenuKey(firstLevelRouteName); + } + + const isActiveFirstLevelMenuHasChildren = computed(() => { + if (!activeFirstLevelMenuKey.value) { + return false; + } + + const findItem = allMenus.value.find(item => item.key === activeFirstLevelMenuKey.value); + + return Boolean(findItem?.children?.length); + }); + + function handleSelectFirstLevelMenu(key: RouteKey) { + setActiveFirstLevelMenuKey(key); + + if (!isActiveFirstLevelMenuHasChildren.value) { + routerPushByKeyWithMetaQuery(key); + } + } + + const secondLevelMenus = computed( + () => allMenus.value.find(menu => menu.key === activeFirstLevelMenuKey.value)?.children || [] + ); + + const activeSecondLevelMenuKey = ref(''); + + function setActiveSecondLevelMenuKey(key: string) { + activeSecondLevelMenuKey.value = key; + } + + function getActiveSecondLevelMenuKey() { + const keys = selectedKey.value.split('_'); + + if (keys.length < 2) { + setActiveSecondLevelMenuKey(''); + return; + } + + const [firstLevelRouteName, level2SuffixName] = keys; + + const secondLevelRouteName = `${firstLevelRouteName}_${level2SuffixName}`; + + setActiveSecondLevelMenuKey(secondLevelRouteName); + } + + const isActiveSecondLevelMenuHasChildren = computed(() => { + if (!activeSecondLevelMenuKey.value) { + return false; + } + + const findItem = secondLevelMenus.value.find(item => item.key === activeSecondLevelMenuKey.value); + + return Boolean(findItem?.children?.length); + }); + + function handleSelectSecondLevelMenu(key: RouteKey) { + setActiveSecondLevelMenuKey(key); + + if (!isActiveSecondLevelMenuHasChildren.value) { + routerPushByKeyWithMetaQuery(key); + } + } + + const childLevelMenus = computed( + () => secondLevelMenus.value.find(menu => menu.key === activeSecondLevelMenuKey.value)?.children || [] + ); + + const hasChildLevelMenus = computed(() => childLevelMenus.value.length > 0); + + function getDeepestLevelMenuKey(): RouteKey | null { + if (!secondLevelMenus.value.length || !themeStore.sider.autoSelectFirstMenu) { + return null; + } + + const secondLevelFirstMenu = secondLevelMenus.value[0]; + + if (!secondLevelFirstMenu) { + return null; + } + + function findDeepest(menu: App.Global.Menu): RouteKey { + if (!menu.children?.length) { + return menu.routeKey; + } + + return findDeepest(menu.children[0]); + } + + return findDeepest(secondLevelFirstMenu); + } + + function activeDeepestLevelMenuKey() { + const deepestLevelMenuKey = getDeepestLevelMenuKey(); + if (!deepestLevelMenuKey) return; + + // select the deepest second level menu + handleSelectSecondLevelMenu(deepestLevelMenuKey); + } + + watch( + () => route.name, + () => { + getActiveFirstLevelMenuKey(); + // if there are child level menus, get the active second level menu key + if (hasChildLevelMenus.value) { + getActiveSecondLevelMenuKey(); + } + }, + { immediate: true } + ); + + return { + firstLevelMenus, + activeFirstLevelMenuKey, + setActiveFirstLevelMenuKey, + isActiveFirstLevelMenuHasChildren, + handleSelectFirstLevelMenu, + getActiveFirstLevelMenuKey, + secondLevelMenus, + activeSecondLevelMenuKey, + setActiveSecondLevelMenuKey, + isActiveSecondLevelMenuHasChildren, + handleSelectSecondLevelMenu, + getActiveSecondLevelMenuKey, + childLevelMenus, + hasChildLevelMenus, + getDeepestLevelMenuKey, + activeDeepestLevelMenuKey + }; +} + +export function useMenu() { + const route = useRoute(); + + const selectedKey = computed(() => { + const { hideInMenu, activeMenu } = route.meta; + const name = route.name as string; + + const routeName = (hideInMenu ? activeMenu : name) || name; + + return routeName; + }); + + return { + selectedKey + }; +} diff --git a/src/layouts/modules/global-menu/index.vue b/src/layouts/modules/global-menu/index.vue new file mode 100644 index 0000000..571e19f --- /dev/null +++ b/src/layouts/modules/global-menu/index.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/src/layouts/modules/global-menu/modules/horizontal-menu.vue b/src/layouts/modules/global-menu/modules/horizontal-menu.vue new file mode 100644 index 0000000..b696a30 --- /dev/null +++ b/src/layouts/modules/global-menu/modules/horizontal-menu.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/src/layouts/modules/global-menu/modules/top-hybrid-header-first.vue b/src/layouts/modules/global-menu/modules/top-hybrid-header-first.vue new file mode 100644 index 0000000..b312f42 --- /dev/null +++ b/src/layouts/modules/global-menu/modules/top-hybrid-header-first.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/src/layouts/modules/global-menu/modules/top-hybrid-sidebar-first.vue b/src/layouts/modules/global-menu/modules/top-hybrid-sidebar-first.vue new file mode 100644 index 0000000..d12189e --- /dev/null +++ b/src/layouts/modules/global-menu/modules/top-hybrid-sidebar-first.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/src/layouts/modules/global-menu/modules/vertical-hybrid-header-first.vue b/src/layouts/modules/global-menu/modules/vertical-hybrid-header-first.vue new file mode 100644 index 0000000..336d651 --- /dev/null +++ b/src/layouts/modules/global-menu/modules/vertical-hybrid-header-first.vue @@ -0,0 +1,172 @@ + + + + + diff --git a/src/layouts/modules/global-menu/modules/vertical-menu.vue b/src/layouts/modules/global-menu/modules/vertical-menu.vue new file mode 100644 index 0000000..d42275b --- /dev/null +++ b/src/layouts/modules/global-menu/modules/vertical-menu.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/src/layouts/modules/global-menu/modules/vertical-mix-menu.vue b/src/layouts/modules/global-menu/modules/vertical-mix-menu.vue new file mode 100644 index 0000000..9d60652 --- /dev/null +++ b/src/layouts/modules/global-menu/modules/vertical-mix-menu.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/src/layouts/modules/global-search/components/search-footer.vue b/src/layouts/modules/global-search/components/search-footer.vue new file mode 100644 index 0000000..0fa6c8f --- /dev/null +++ b/src/layouts/modules/global-search/components/search-footer.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/src/layouts/modules/global-search/components/search-modal.vue b/src/layouts/modules/global-search/components/search-modal.vue new file mode 100644 index 0000000..39f18a8 --- /dev/null +++ b/src/layouts/modules/global-search/components/search-modal.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/src/layouts/modules/global-search/components/search-result.vue b/src/layouts/modules/global-search/components/search-result.vue new file mode 100644 index 0000000..bb13952 --- /dev/null +++ b/src/layouts/modules/global-search/components/search-result.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/src/layouts/modules/global-search/index.vue b/src/layouts/modules/global-search/index.vue new file mode 100644 index 0000000..95c2a7b --- /dev/null +++ b/src/layouts/modules/global-search/index.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/src/layouts/modules/global-sider/index.vue b/src/layouts/modules/global-sider/index.vue new file mode 100644 index 0000000..0deece5 --- /dev/null +++ b/src/layouts/modules/global-sider/index.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/src/layouts/modules/global-tab/context-menu.vue b/src/layouts/modules/global-tab/context-menu.vue new file mode 100644 index 0000000..1145ee2 --- /dev/null +++ b/src/layouts/modules/global-tab/context-menu.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/src/layouts/modules/global-tab/index.vue b/src/layouts/modules/global-tab/index.vue new file mode 100644 index 0000000..5e3c92d --- /dev/null +++ b/src/layouts/modules/global-tab/index.vue @@ -0,0 +1,233 @@ + + + + + diff --git a/src/layouts/modules/theme-drawer/components/layout-mode-card.vue b/src/layouts/modules/theme-drawer/components/layout-mode-card.vue new file mode 100644 index 0000000..e056350 --- /dev/null +++ b/src/layouts/modules/theme-drawer/components/layout-mode-card.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/src/layouts/modules/theme-drawer/components/setting-item.vue b/src/layouts/modules/theme-drawer/components/setting-item.vue new file mode 100644 index 0000000..07316a6 --- /dev/null +++ b/src/layouts/modules/theme-drawer/components/setting-item.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/layouts/modules/theme-drawer/index.vue b/src/layouts/modules/theme-drawer/index.vue new file mode 100644 index 0000000..b874671 --- /dev/null +++ b/src/layouts/modules/theme-drawer/index.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/src/layouts/modules/theme-drawer/modules/appearance/index.vue b/src/layouts/modules/theme-drawer/modules/appearance/index.vue new file mode 100644 index 0000000..a7f65e4 --- /dev/null +++ b/src/layouts/modules/theme-drawer/modules/appearance/index.vue @@ -0,0 +1,19 @@ + + + + + diff --git a/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-color.vue b/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-color.vue new file mode 100644 index 0000000..6c38897 --- /dev/null +++ b/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-color.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-radius.vue b/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-radius.vue new file mode 100644 index 0000000..499403b --- /dev/null +++ b/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-radius.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-schema.vue b/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-schema.vue new file mode 100644 index 0000000..c8b689a --- /dev/null +++ b/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-schema.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/layouts/modules/theme-drawer/modules/config-operation.vue b/src/layouts/modules/theme-drawer/modules/config-operation.vue new file mode 100644 index 0000000..f2df602 --- /dev/null +++ b/src/layouts/modules/theme-drawer/modules/config-operation.vue @@ -0,0 +1,58 @@ + + +